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
436#define DFU_MAX_ENTITY_ARGS 5
437
438#if CONFIG_IS_ENABLED(DFU_MMC)
439extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
440 char **argv, int argc);
441#else
442static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
443 char **argv, int argc)
444{
445 puts("MMC support not available!\n");
446 return -1;
447}
448#endif
449
450#if CONFIG_IS_ENABLED(DFU_NAND)
451extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
452 char **argv, int argc);
453#else
454static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
455 char **argv, int argc)
456{
457 puts("NAND support not available!\n");
458 return -1;
459}
460#endif
461
462#if CONFIG_IS_ENABLED(DFU_RAM)
463extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
464 char **argv, int argc);
465#else
466static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
467 char **argv, int argc)
468{
469 puts("RAM support not available!\n");
470 return -1;
471}
472#endif
473
474#if CONFIG_IS_ENABLED(DFU_SF)
475extern int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
476 char **argv, int argc);
477#else
478static inline int dfu_fill_entity_sf(struct dfu_entity *dfu, char *devstr,
479 char **argv, int argc)
480{
481 puts("SF support not available!\n");
482 return -1;
483}
484#endif
485
486#if CONFIG_IS_ENABLED(DFU_MTD)
487extern int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr,
488 char **argv, int argc);
489#else
490static inline int dfu_fill_entity_mtd(struct dfu_entity *dfu, char *devstr,
491 char **argv, int argc)
492{
493 puts("MTD support not available!\n");
494 return -1;
495}
496#endif
497
498#ifdef CONFIG_DFU_VIRT
499int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr,
500 char **argv, int argc);
501int dfu_write_medium_virt(struct dfu_entity *dfu, u64 offset,
502 void *buf, long *len);
503int dfu_get_medium_size_virt(struct dfu_entity *dfu, u64 *size);
504int dfu_read_medium_virt(struct dfu_entity *dfu, u64 offset,
505 void *buf, long *len);
506#else
507static inline int dfu_fill_entity_virt(struct dfu_entity *dfu, char *devstr,
508 char **argv, int argc)
509{
510 puts("VIRT support not available!\n");
511 return -1;
512}
513#endif
514
515extern bool dfu_reinit_needed;
516
517#if CONFIG_IS_ENABLED(DFU_WRITE_ALT)
518
519
520
521
522
523
524
525
526
527
528
529
530
531int dfu_write_by_name(char *dfu_entity_name, void *addr,
532 unsigned int len, char *interface, char *devstring);
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547int dfu_write_by_alt(int dfu_alt_num, void *addr, unsigned int len,
548 char *interface, char *devstring);
549#else
550static inline int dfu_write_by_name(char *dfu_entity_name, void *addr,
551 unsigned int len, char *interface,
552 char *devstring)
553{
554 puts("write support for DFU not available!\n");
555 return -ENOSYS;
556}
557
558static inline int dfu_write_by_alt(int dfu_alt_num, void *addr,
559 unsigned int len, char *interface,
560 char *devstring)
561{
562 puts("write support for DFU not available!\n");
563 return -ENOSYS;
564}
565#endif
566
567int dfu_add(struct usb_configuration *c);
568#endif
569