1
2
3
4
5
6
7
8
9
10#ifndef __DFU_ENTITY_H_
11#define __DFU_ENTITY_H_
12
13#include <common.h>
14#include <linux/list.h>
15#include <mmc.h>
16#include <spi_flash.h>
17#include <linux/usb/composite.h>
18
19enum dfu_device_type {
20 DFU_DEV_MMC = 1,
21 DFU_DEV_ONENAND,
22 DFU_DEV_NAND,
23 DFU_DEV_RAM,
24 DFU_DEV_SF,
25 DFU_DEV_MTD,
26 DFU_DEV_VIRT,
27};
28
29enum dfu_layout {
30 DFU_RAW_ADDR = 1,
31 DFU_FS_FAT,
32 DFU_FS_EXT2,
33 DFU_FS_EXT3,
34 DFU_FS_EXT4,
35 DFU_RAM_ADDR,
36 DFU_SKIP,
37 DFU_SCRIPT,
38};
39
40enum dfu_op {
41 DFU_OP_READ = 1,
42 DFU_OP_WRITE,
43 DFU_OP_SIZE,
44};
45
46struct mmc_internal_data {
47 int dev_num;
48
49
50 unsigned int lba_start;
51 unsigned int lba_size;
52 unsigned int lba_blk_size;
53
54
55 int hw_partition;
56
57
58 unsigned int dev;
59 unsigned int part;
60};
61
62struct mtd_internal_data {
63 struct mtd_info *info;
64
65
66 u64 start;
67 u64 size;
68
69 unsigned int ubi;
70};
71
72struct nand_internal_data {
73
74 u64 start;
75 u64 size;
76
77 unsigned int dev;
78 unsigned int part;
79
80 unsigned int ubi;
81};
82
83struct ram_internal_data {
84 unsigned long start;
85 unsigned int size;
86};
87
88struct sf_internal_data {
89 struct spi_flash *dev;
90
91
92 u64 start;
93 u64 size;
94
95 unsigned int ubi;
96};
97
98struct virt_internal_data {
99 int dev_num;
100};
101
102#define DFU_NAME_SIZE 32
103#ifndef DFU_DEFAULT_POLL_TIMEOUT
104#define DFU_DEFAULT_POLL_TIMEOUT 0
105#endif
106#ifndef DFU_MANIFEST_POLL_TIMEOUT
107#define DFU_MANIFEST_POLL_TIMEOUT DFU_DEFAULT_POLL_TIMEOUT
108#endif
109
110struct dfu_entity {
111 char name[DFU_NAME_SIZE];
112 int alt;
113 void *dev_private;
114 enum dfu_device_type dev_type;
115 enum dfu_layout layout;
116 unsigned long max_buf_size;
117
118 union {
119 struct mmc_internal_data mmc;
120 struct mtd_internal_data mtd;
121 struct nand_internal_data nand;
122 struct ram_internal_data ram;
123 struct sf_internal_data sf;
124 struct virt_internal_data virt;
125 } data;
126
127 int (*get_medium_size)(struct dfu_entity *dfu, u64 *size);
128
129 int (*read_medium)(struct dfu_entity *dfu,
130 u64 offset, void *buf, long *len);
131
132 int (*write_medium)(struct dfu_entity *dfu,
133 u64 offset, void *buf, long *len);
134
135 int (*flush_medium)(struct dfu_entity *dfu);
136 unsigned int (*poll_timeout)(struct dfu_entity *dfu);
137
138 void (*free_entity)(struct dfu_entity *dfu);
139
140 struct list_head list;
141
142
143 u32 crc;
144 u64 offset;
145 int i_blk_seq_num;
146 u8 *i_buf;
147 u8 *i_buf_start;
148 u8 *i_buf_end;
149 u64 r_left;
150 long b_left;
151
152 u32 bad_skip;
153
154 unsigned int inited:1;
155};
156
157struct list_head;
158extern struct list_head dfu_list;
159
160#ifdef CONFIG_SET_DFU_ALT_INFO
161
162
163
164
165
166
167
168
169
170void set_dfu_alt_info(char *interface, char *devstr);
171#endif
172
173
174
175
176
177
178
179
180int dfu_alt_init(int num, struct dfu_entity **dfu);
181
182
183
184
185
186
187
188
189
190
191int dfu_alt_add(struct dfu_entity *dfu, char *interface, char *devstr, char *s);
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209int dfu_config_entities(char *s, char *interface, char *devstr);
210
211
212
213
214
215
216
217
218void dfu_free_entities(void);
219
220
221
222
223void dfu_show_entities(void);
224
225
226
227
228
229
230int dfu_get_alt_number(void);
231
232
233
234
235
236
237
238const char *dfu_get_dev_type(enum dfu_device_type type);
239
240
241
242
243
244
245
246
247
248
249
250const char *dfu_get_layout(enum dfu_layout layout);
251
252
253
254
255
256
257
258struct dfu_entity *dfu_get_entity(int alt);
259
260char *dfu_extract_token(char** e, int *n);
261
262
263
264
265
266
267
268
269
270
271
272
273int dfu_get_alt(char *name);
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292int dfu_init_env_entities(char *interface, char *devstr);
293
294unsigned char *dfu_get_buf(struct dfu_entity *dfu);
295unsigned char *dfu_free_buf(void);
296unsigned long dfu_get_buf_size(void);
297bool dfu_usb_get_reset(void);
298
299#ifdef CONFIG_DFU_TIMEOUT
300unsigned long dfu_get_timeout(void);
301void dfu_set_timeout(unsigned long);
302#endif
303
304
305
306
307
308
309
310
311
312
313
314
315
316int dfu_read(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
358
359
360
361
362
363
364
365
366
367
368void dfu_initiated_callback(struct dfu_entity *dfu);
369
370
371
372
373
374
375
376
377
378void dfu_flush_callback(struct dfu_entity *dfu);
379
380
381
382
383
384
385
386
387
388
389void dfu_error_callback(struct dfu_entity *dfu, const char *msg);
390
391int dfu_transaction_initiate(struct dfu_entity *dfu, bool read);
392void dfu_transaction_cleanup(struct dfu_entity *dfu);
393
394
395
396
397
398extern struct dfu_entity *dfu_defer_flush;
399
400
401
402
403
404
405static inline struct dfu_entity *dfu_get_defer_flush(void)
406{
407 return dfu_defer_flush;
408}
409
410
411
412
413
414
415static inline void dfu_set_defer_flush(struct dfu_entity *dfu)
416{
417 dfu_defer_flush = dfu;
418}
419
420
421
422
423
424
425
426
427
428
429
430
431
432int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size);
433
434
435#if CONFIG_IS_ENABLED(DFU_MMC)
436extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s);
437#else
438static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
439 char *s)
440{
441 puts("MMC support not available!\n");
442 return -1;
443}
444#endif
445
446#if CONFIG_IS_ENABLED(DFU_NAND)
447extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s);
448#else
449static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
450 char *s)
451{
452 puts("NAND support not available!\n");
453 return -1;
454}
455#endif
456
457#if CONFIG_IS_ENABLED(DFU_RAM)
458extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s);
459#else
460static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
461 char *s)
462{
463 puts("RAM support not available!\n");
464 return -1;
465}
466#endif
467
468#if CONFIG_IS_ENABLED(DFU_SF)
469extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr, char *s);
470#else
471static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
472 char *s)
473{
474 puts("SF support not available!\n");
475 return -1;
476}
477#endif
478
479#if CONFIG_IS_ENABLED(DFU_MTD)
480int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr, char *s);
481#else
482static inline int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr,
483 char *s)
484{
485 puts("MTD support not available!\n");
486 return -1;
487}
488#endif
489
490#ifdef CONFIG_DFU_VIRT
491int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr, char *s);
492int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset,
493 void *buf, long *len);
494int dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size);
495int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset,
496 void *buf, long *len);
497#else
498static inline int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr,
499 char *s)
500{
501 puts("VIRT support not available!\n");
502 return -1;
503}
504#endif
505
506extern bool dfu_reinit_needed;
507
508#if CONFIG_IS_ENABLED(DFU_WRITE_ALT)
509
510
511
512
513
514
515
516
517
518
519
520
521
522int dfu_write_by_name(char *dfu_entity_name, void *addr,
523 unsigned int len, char *interface, char *devstring);
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538int dfu_write_by_alt(int dfu_alt_num, void *addr, unsigned int len,
539 char *interface, char *devstring);
540#else
541static inline int dfu_write_by_name(char *dfu_entity_name, void *addr,
542 unsigned int len, char *interface,
543 char *devstring)
544{
545 puts("write support for DFU not available!\n");
546 return -ENOSYS;
547}
548
549static inline int dfu_write_by_alt(int dfu_alt_num, void *addr,
550 unsigned int len, char *interface,
551 char *devstring)
552{
553 puts("write support for DFU not available!\n");
554 return -ENOSYS;
555}
556#endif
557
558int dfu_add(struct usb_configuration *c);
559#endif
560