*/
__weak bool dfu_usb_get_reset(void)
{
+#ifdef CONFIG_SPL_DFU_NO_RESET
+ return false;
+#else
return true;
+#endif
}
static int dfu_find_alt_num(const char *s)
}
static unsigned char *dfu_buf;
-static unsigned long dfu_buf_size = CONFIG_SYS_DFU_DATA_BUF_SIZE;
+static unsigned long dfu_buf_size;
unsigned char *dfu_free_buf(void)
{
void dfu_write_transaction_cleanup(struct dfu_entity *dfu)
{
/* clear everything */
- dfu_free_buf();
dfu->crc = 0;
dfu->offset = 0;
dfu->i_blk_seq_num = 0;
if (dfu->i_buf_start == NULL)
return -ENOMEM;
- dfu->r_left = dfu->get_medium_size(dfu);
- if (dfu->r_left < 0)
- return dfu->r_left;
- switch (dfu->layout) {
- case DFU_RAW_ADDR:
- case DFU_RAM_ADDR:
- break;
- default:
- if (dfu->r_left > dfu_buf_size) {
- printf("%s: File too big for buffer\n",
- __func__);
- return -EOVERFLOW;
- }
- }
+ ret = dfu->get_medium_size(dfu, &dfu->r_left);
+ if (ret < 0)
+ return ret;
debug("%s: %s %ld [B]\n", __func__, dfu->name, dfu->r_left);
dfu_hash_algo->name, dfu->crc);
puts("\nUPLOAD ... done\nCtrl+C to exit ...\n");
- dfu_free_buf();
dfu->i_blk_seq_num = 0;
dfu->crc = 0;
dfu->offset = 0;
__func__, interface);
return -1;
}
+ dfu_get_buf(dfu);
return 0;
}
{
struct dfu_entity *dfu, *p, *t = NULL;
+ dfu_free_buf();
list_for_each_entry_safe_reverse(dfu, p, &dfu_list, list) {
list_del(&dfu->list);
if (dfu->free_entity)
s = strsep(&env, ";");
ret = dfu_fill_entity(&dfu[i], s, alt_num_cnt, interface,
devstr);
- if (ret)
+ if (ret) {
+ free(dfu);
return -1;
+ }
list_add_tail(&dfu[i].list, &dfu_list);
alt_num_cnt++;
const char *dfu_get_dev_type(enum dfu_device_type t)
{
- const char *dev_t[] = {NULL, "eMMC", "OneNAND", "NAND", "RAM" };
+ const char *dev_t[] = {NULL, "eMMC", "OneNAND", "NAND", "RAM", "SF" };
return dev_t[t];
}
return -ENODEV;
}
+
+int dfu_write_from_mem_addr(struct dfu_entity *dfu, void *buf, int size)
+{
+ unsigned long dfu_buf_size, write, left = size;
+ int i, ret = 0;
+ void *dp = buf;
+
+ /*
+ * Here we must call dfu_get_buf(dfu) first to be sure that dfu_buf_size
+ * has been properly initialized - e.g. if "dfu_bufsiz" has been taken
+ * into account.
+ */
+ dfu_get_buf(dfu);
+ dfu_buf_size = dfu_get_buf_size();
+ debug("%s: dfu buf size: %lu\n", __func__, dfu_buf_size);
+
+ for (i = 0; left > 0; i++) {
+ write = min(dfu_buf_size, left);
+
+ debug("%s: dp: 0x%p left: %lu write: %lu\n", __func__,
+ dp, left, write);
+ ret = dfu_write(dfu, dp, write, i);
+ if (ret) {
+ error("DFU write failed\n");
+ return ret;
+ }
+
+ dp += write;
+ left -= write;
+ }
+
+ ret = dfu_flush(dfu, NULL, 0, i);
+ if (ret)
+ error("DFU flush failed!");
+
+ return ret;
+}