Lines Matching defs:dfu

3  * dfu.c -- DFU back-end routines
16 #include <dfu.h>
34 * provide callback for dfu user
36 __weak void dfu_flush_callback(struct dfu_entity *dfu)
42 * provide callback for dfu user
44 __weak void dfu_initiated_callback(struct dfu_entity *dfu)
50 * provide callback for dfu user
52 __weak void dfu_error_callback(struct dfu_entity *dfu, const char *msg)
59 * being sent the dfu-util performed reset of USB
64 * dfu-util command.
108 struct dfu_entity *dfu;
120 ret = dfu_alt_init(n, &dfu);
140 ret = dfu_alt_add(dfu, i, d, part);
199 unsigned char *dfu_get_buf(struct dfu_entity *dfu)
204 if (dfu_buf && dfu->dev_type != dfu_buf_device_type)
217 if (dfu->max_buf_size && dfu_buf_size > dfu->max_buf_size)
218 dfu_buf_size = dfu->max_buf_size;
225 dfu_buf_device_type = dfu->dev_type;
246 static int dfu_write_buffer_drain(struct dfu_entity *dfu)
252 w_size = dfu->i_buf - dfu->i_buf_start;
257 dfu_hash_algo->hash_update(dfu_hash_algo, &dfu->crc,
258 dfu->i_buf_start, w_size, 0);
260 ret = dfu->write_medium(dfu, dfu->offset, dfu->i_buf_start, &w_size);
265 dfu->i_buf = dfu->i_buf_start;
268 dfu->offset += w_size;
275 void dfu_transaction_cleanup(struct dfu_entity *dfu)
278 dfu->crc = 0;
279 dfu->offset = 0;
280 dfu->i_blk_seq_num = 0;
281 dfu->i_buf_start = dfu_get_buf(dfu);
282 dfu->i_buf_end = dfu->i_buf_start;
283 dfu->i_buf = dfu->i_buf_start;
284 dfu->r_left = 0;
285 dfu->b_left = 0;
286 dfu->bad_skip = 0;
288 dfu->inited = 0;
291 int dfu_transaction_initiate(struct dfu_entity *dfu, bool read)
295 if (dfu->inited)
298 dfu_transaction_cleanup(dfu);
300 if (dfu->i_buf_start == NULL)
303 dfu->i_buf_end = dfu->i_buf_start + dfu_get_buf_size();
306 ret = dfu->get_medium_size(dfu, &dfu->r_left);
309 debug("%s: %s %lld [B]\n", __func__, dfu->name, dfu->r_left);
312 dfu->inited = 1;
313 dfu_initiated_callback(dfu);
318 int dfu_flush(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
322 ret = dfu_write_buffer_drain(dfu);
326 if (dfu->flush_medium)
327 ret = dfu->flush_medium(dfu);
331 dfu->crc);
333 dfu_flush_callback(dfu);
335 dfu_transaction_cleanup(dfu);
340 int dfu_write(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
345 __func__, dfu->name, buf, size, blk_seq_num, dfu->offset,
346 (unsigned long)(dfu->i_buf - dfu->i_buf_start));
348 ret = dfu_transaction_initiate(dfu, false);
352 if (dfu->i_blk_seq_num != blk_seq_num) {
354 __func__, dfu->i_blk_seq_num, blk_seq_num);
355 dfu_transaction_cleanup(dfu);
356 dfu_error_callback(dfu, "Wrong sequence number");
374 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff;
377 if ((dfu->i_buf + size) > dfu->i_buf_end) {
378 ret = dfu_write_buffer_drain(dfu);
380 dfu_transaction_cleanup(dfu);
381 dfu_error_callback(dfu, "DFU write error");
387 if ((dfu->i_buf + size) > dfu->i_buf_end) {
388 pr_err("Buffer overflow! (0x%p + 0x%x > 0x%p)\n", dfu->i_buf,
389 size, dfu->i_buf_end);
390 dfu_transaction_cleanup(dfu);
391 dfu_error_callback(dfu, "Buffer overflow");
395 memcpy(dfu->i_buf, buf, size);
396 dfu->i_buf += size;
399 if (size == 0 || (dfu->i_buf + size) > dfu->i_buf_end) {
400 ret = dfu_write_buffer_drain(dfu);
402 dfu_transaction_cleanup(dfu);
403 dfu_error_callback(dfu, "DFU write error");
411 static int dfu_read_buffer_fill(struct dfu_entity *dfu, void *buf, int size)
419 chunk = min((long)size, dfu->b_left);
422 memcpy(buf, dfu->i_buf, chunk);
425 &dfu->crc, buf,
428 dfu->i_buf += chunk;
429 dfu->b_left -= chunk;
438 if (dfu->r_left == 0)
441 dfu->i_buf = dfu->i_buf_start;
442 dfu->b_left = dfu->i_buf_end - dfu->i_buf_start;
445 if (dfu->b_left > dfu->r_left)
446 dfu->b_left = dfu->r_left;
447 ret = dfu->read_medium(dfu, dfu->offset, dfu->i_buf,
448 &dfu->b_left);
453 if (dfu->b_left == 0)
455 dfu->offset += dfu->b_left;
456 dfu->r_left -= dfu->b_left;
465 int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
470 __func__, dfu->name, buf, size, blk_seq_num, dfu->i_buf);
472 ret = dfu_transaction_initiate(dfu, true);
476 if (dfu->i_blk_seq_num != blk_seq_num) {
478 __func__, dfu->i_blk_seq_num, blk_seq_num);
482 dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff;
484 ret = dfu_read_buffer_fill(dfu, buf, size);
492 debug("%s: %s %s: 0x%x\n", __func__, dfu->name,
493 dfu_hash_algo->name, dfu->crc);
496 dfu_transaction_cleanup(dfu);
502 static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
511 strlcpy(dfu->name, st, DFU_NAME_SIZE);
524 log_err("Too many arguments for %s\n", dfu->name);
529 dfu->alt = alt;
530 dfu->max_buf_size = 0;
531 dfu->free_entity = NULL;
535 if (dfu_fill_entity_mmc(dfu, devstr, argv, argc))
538 if (dfu_fill_entity_mtd(dfu, devstr, argv, argc))
541 if (dfu_fill_entity_nand(dfu, devstr, argv, argc))
544 if (dfu_fill_entity_ram(dfu, devstr, argv, argc))
547 if (dfu_fill_entity_sf(dfu, devstr, argv, argc))
550 if (dfu_fill_entity_virt(dfu, devstr, argv, argc))
557 dfu_get_buf(dfu);
564 struct dfu_entity *dfu, *p, *t = NULL;
567 list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) {
568 list_del(&dfu->list);
569 if (dfu->free_entity)
570 dfu->free_entity(dfu);
571 t = dfu;
580 int dfu_alt_init(int num, struct dfu_entity **dfu)
596 *dfu = calloc(sizeof(struct dfu_entity), dfu_alt_num);
597 if (!*dfu)
603 int dfu_alt_add(struct dfu_entity *dfu, char *interface, char *devstr, char *s)
611 p_dfu = &dfu[alt_num_cnt];
624 struct dfu_entity *dfu;
628 ret = dfu_alt_init(dfu_find_alt_num(env), &dfu);
635 ret = dfu_alt_add(dfu, interface, devstr, s);
637 /* We will free "dfu" in dfu_free_entities() */
662 struct dfu_entity *dfu;
666 list_for_each_entry(dfu, &dfu_list, list) {
668 dfu_get_dev_type(dfu->dev_type), dfu->alt,
669 dfu->name, dfu_get_layout(dfu->layout));
680 struct dfu_entity *dfu;
682 list_for_each_entry(dfu, &dfu_list, list) {
683 if (dfu->alt == alt)
684 return dfu;
692 struct dfu_entity *dfu;
695 list_for_each_entry(dfu, &dfu_list, list) {
696 if (dfu->name[0] != '/') {
697 if (!strncmp(dfu->name, name, strlen(dfu->name)))
698 return dfu->alt;
702 * (/boot/bin/uImage) available at dfu->name when
710 str = strstr(dfu->name, name);
716 * dfu->name (uImage)
718 if (strlen(dfu->name) ==
719 ((str - dfu->name) + strlen(name)))
720 return dfu->alt;
727 int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size)
734 * Here we must call dfu_get_buf(dfu) first to be sure that dfu_buf_size
738 dfu_get_buf(dfu);
740 debug("%s: dfu buf size: %lu\n", __func__, dfu_buf_size);
747 ret = dfu_write(dfu, dp, write, i);
757 ret = dfu_flush(dfu, NULL, 0, i);