u-boot/drivers/dfu/dfu_ram.c

78 lines
1.6 KiB
C
Raw Normal View History

dfu: ram support DFU spec mentions it as a method to upgrade firmware (software stored in writable non-volatile memory). It also says other potential uses of DFU is beyond scope of the spec. Here such a beyond the scope use is being attempted - directly pumping binary images from host via USB to RAM. This facility is a developer centric one in that it gives advantage over upgrading non-volatile memory for testing new images every time during development and/or testing. Directly putting image onto RAM would speed up upgrade process. This and convenience was the initial thoughts that led to doing this, speed improvement over MMC was only 1 second though - 6 sec on RAM as opposed to 7 sec on MMC in beagle bone, perhaps enabling cache and/or optimizing DFU framework to avoid multiple copy for ram (if worth) may help, and on other platforms and other boot media like NAND maybe improvement would be higher. And for a platform that doesn't yet have proper DFU suppport for non-volatile media's, DFU to RAM can be used. Another minor advantage would be to increase life of mmc/nand as it would be less used during development/testing. usage: <image name> ram <start address> <size> eg. kernel ram 0x81000000 0x1000000 Downloading images to RAM using DFU is not something new, this is acheived in openmoko also. DFU on RAM can be used for extracting RAM contents to host using dfu upload. Perhaps this can be extended to io for squeezing out register dump through usb, if it is worth. Signed-off-by: Afzal Mohammed <afzal.mohd.ma@gmail.com> Cc: Heiko Schocher <hs@denx.de> Cc: Marek Vasut <marex@denx.de> Cc: Lukasz Majewski <l.majewski@samsung.com> Cc: Pantelis Antoniou <panto@antoniou-consulting.com> Cc: Gerhard Sittig <gsi@denx.de> Acked-by: Marek Vasut <marex@denx.de> Acked-by: Lukasz Majewski <l.majewski@samsung.com> Acked-by: Heiko Schocher <hs@denx.de>
2013-09-17 19:45:24 +00:00
/*
* (C) Copyright 2013
* Afzal Mohammed <afzal.mohd.ma@gmail.com>
*
* Reference: dfu_mmc.c
* Copyright (C) 2012 Samsung Electronics
* author: Lukasz Majewski <l.majewski@samsung.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <malloc.h>
#include <errno.h>
#include <dfu.h>
static int dfu_transfer_medium_ram(enum dfu_op op, struct dfu_entity *dfu,
u64 offset, void *buf, long *len)
{
if (dfu->layout != DFU_RAM_ADDR) {
error("unsupported layout: %s\n", dfu_get_layout(dfu->layout));
return -EINVAL;
}
if (offset > dfu->data.ram.size) {
error("request exceeds allowed area\n");
return -EINVAL;
}
if (op == DFU_OP_WRITE)
memcpy(dfu->data.ram.start + offset, buf, *len);
else
memcpy(buf, dfu->data.ram.start + offset, *len);
return 0;
}
static int dfu_write_medium_ram(struct dfu_entity *dfu, u64 offset,
void *buf, long *len)
{
return dfu_transfer_medium_ram(DFU_OP_WRITE, dfu, offset, buf, len);
}
static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
void *buf, long *len)
{
if (!*len) {
*len = dfu->data.ram.size;
return 0;
}
return dfu_transfer_medium_ram(DFU_OP_READ, dfu, offset, buf, len);
}
int dfu_fill_entity_ram(struct dfu_entity *dfu, char *s)
{
char *st;
dfu->dev_type = DFU_DEV_RAM;
st = strsep(&s, " ");
if (strcmp(st, "ram")) {
error("unsupported device: %s\n", st);
return -ENODEV;
}
dfu->layout = DFU_RAM_ADDR;
dfu->data.ram.start = (void *)simple_strtoul(s, &s, 16);
s++;
dfu->data.ram.size = simple_strtoul(s, &s, 16);
dfu->write_medium = dfu_write_medium_ram;
dfu->read_medium = dfu_read_medium_ram;
dfu->inited = 0;
return 0;
}