mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
update: tftp: dfu: Extend update_tftp() function to support DFU
This code allows using DFU defined mediums for storing data received via TFTP protocol. It reuses and preserves functionality of legacy code at common/update.c. The update_tftp() function now accepts parameters - namely medium device name and its number (e.g. mmc 1). Without this information passed old behavior is preserved. Signed-off-by: Lukasz Majewski <l.majewski@majess.pl> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
2092e46104
commit
c7ff552843
5 changed files with 52 additions and 14 deletions
|
@ -210,6 +210,7 @@ obj-$(CONFIG_LYNXKDI) += lynxkdi.o
|
|||
obj-$(CONFIG_MENU) += menu.o
|
||||
obj-$(CONFIG_MODEM_SUPPORT) += modem.o
|
||||
obj-$(CONFIG_UPDATE_TFTP) += update.o
|
||||
obj-$(CONFIG_DFU_TFTP) += update.o
|
||||
obj-$(CONFIG_USB_KEYBOARD) += usb_kbd.o
|
||||
obj-$(CONFIG_CMD_DFU) += cmd_dfu.o
|
||||
obj-$(CONFIG_CMD_GPT) += cmd_gpt.o
|
||||
|
|
|
@ -23,7 +23,7 @@ static int do_fitupd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||
if (argc == 2)
|
||||
addr = simple_strtoul(argv[1], NULL, 16);
|
||||
|
||||
return update_tftp(addr);
|
||||
return update_tftp(addr, NULL, NULL);
|
||||
}
|
||||
|
||||
U_BOOT_CMD(fitupd, 2, 0, do_fitupd,
|
||||
|
|
|
@ -75,7 +75,7 @@ void main_loop(void)
|
|||
run_preboot_environment_command();
|
||||
|
||||
#if defined(CONFIG_UPDATE_TFTP)
|
||||
update_tftp(0UL);
|
||||
update_tftp(0UL, NULL, NULL);
|
||||
#endif /* CONFIG_UPDATE_TFTP */
|
||||
|
||||
s = bootdelay_process();
|
||||
|
|
|
@ -13,11 +13,17 @@
|
|||
#error "CONFIG_FIT and CONFIG_OF_LIBFDT are required for auto-update feature"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_UPDATE_TFTP) && defined(CONFIG_SYS_NO_FLASH)
|
||||
#error "CONFIG_UPDATE_TFTP and CONFIG_SYS_NO_FLASH needed for legacy behaviour"
|
||||
#endif
|
||||
|
||||
#include <command.h>
|
||||
#include <flash.h>
|
||||
#include <net.h>
|
||||
#include <net/tftp.h>
|
||||
#include <malloc.h>
|
||||
#include <dfu.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* env variable holding the location of the update file */
|
||||
#define UPDATE_FILE_ENV "updatefile"
|
||||
|
@ -222,13 +228,24 @@ static int update_fit_getparams(const void *fit, int noffset, ulong *addr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int update_tftp(ulong addr)
|
||||
int update_tftp(ulong addr, char *interface, char *devstring)
|
||||
{
|
||||
char *filename, *env_addr;
|
||||
int images_noffset, ndepth, noffset;
|
||||
char *filename, *env_addr, *fit_image_name;
|
||||
ulong update_addr, update_fladdr, update_size;
|
||||
void *fit;
|
||||
int images_noffset, ndepth, noffset;
|
||||
bool update_tftp_dfu;
|
||||
int ret = 0;
|
||||
void *fit;
|
||||
|
||||
if (interface == NULL && devstring == NULL) {
|
||||
update_tftp_dfu = false;
|
||||
} else if (interface && devstring) {
|
||||
update_tftp_dfu = true;
|
||||
} else {
|
||||
error("Interface: %s and devstring: %s not supported!\n",
|
||||
interface, devstring);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* use already present image */
|
||||
if (addr)
|
||||
|
@ -277,8 +294,8 @@ got_update_file:
|
|||
if (ndepth != 1)
|
||||
goto next_node;
|
||||
|
||||
printf("Processing update '%s' :",
|
||||
fit_get_name(fit, noffset, NULL));
|
||||
fit_image_name = (char *)fit_get_name(fit, noffset, NULL);
|
||||
printf("Processing update '%s' :", fit_image_name);
|
||||
|
||||
if (!fit_image_verify(fit, noffset)) {
|
||||
printf("Error: invalid update hash, aborting\n");
|
||||
|
@ -294,10 +311,20 @@ got_update_file:
|
|||
ret = 1;
|
||||
goto next_node;
|
||||
}
|
||||
if (update_flash(update_addr, update_fladdr, update_size)) {
|
||||
printf("Error: can't flash update, aborting\n");
|
||||
ret = 1;
|
||||
goto next_node;
|
||||
|
||||
if (!update_tftp_dfu) {
|
||||
if (update_flash(update_addr, update_fladdr,
|
||||
update_size)) {
|
||||
printf("Error: can't flash update, aborting\n");
|
||||
ret = 1;
|
||||
goto next_node;
|
||||
}
|
||||
} else if (fit_image_check_type(fit, noffset,
|
||||
IH_TYPE_FIRMWARE)) {
|
||||
ret = dfu_tftp_write(fit_image_name, update_addr,
|
||||
update_size, interface, devstring);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
next_node:
|
||||
noffset = fdt_next_node(fit, noffset, &ndepth);
|
||||
|
|
|
@ -813,8 +813,18 @@ void copy_filename(char *dst, const char *src, int size);
|
|||
/* get a random source port */
|
||||
unsigned int random_port(void);
|
||||
|
||||
/* Update U-Boot over TFTP */
|
||||
int update_tftp(ulong addr);
|
||||
/**
|
||||
* update_tftp - Update firmware over TFTP (via DFU)
|
||||
*
|
||||
* This function updates board's firmware via TFTP
|
||||
*
|
||||
* @param addr - memory address where data is stored
|
||||
* @param interface - the DFU medium name - e.g. "mmc"
|
||||
* @param devstring - the DFU medium number - e.g. "1"
|
||||
*
|
||||
* @return - 0 on success, other value on failure
|
||||
*/
|
||||
int update_tftp(ulong addr, char *interface, char *devstring);
|
||||
|
||||
/**********************************************************************/
|
||||
|
||||
|
|
Loading…
Reference in a new issue