httpd failsafe - add image check and flash access

SVN-Revision: 20610
lede-17.01
Ralph Hempel 2010-03-30 16:17:38 +00:00
parent 046d73d3c2
commit e7b83bc22a
4 changed files with 27 additions and 119 deletions

View File

@ -84,7 +84,7 @@ define Package/uboot-lantiq/install
of=$(1)/$(UBOOT_CONFIG)/u-boot.bin \ of=$(1)/$(UBOOT_CONFIG)/u-boot.bin \
bs=64k conv=sync bs=64k conv=sync
ifeq ($(CONFIG_UBOOT_RAMBOOT),y) ifeq ($(CONFIG_UBOOT_RAMBOOT),y)
if [ -e $(UBOOT_CONFIG).conf ]; then \ if [ -e $(UBOOT_DDR_CONFIG) ]; then \
perl ./gct \ perl ./gct \
$(UBOOT_DDR_CONFIG) \ $(UBOOT_DDR_CONFIG) \
$(PKG_BUILD_DIR)/$(UBOOT_CONFIG)_ramboot/u-boot.srec \ $(PKG_BUILD_DIR)/$(UBOOT_CONFIG)_ramboot/u-boot.srec \

View File

@ -340,69 +340,22 @@ int board_eth_init(bd_t *bis)
} }
#if defined(CONFIG_CMD_HTTPD) #if defined(CONFIG_CMD_HTTPD)
static int image_info (ulong addr)
{
void *hdr = (void *)addr;
printf ("\n## Checking Image at %08lx ...\n", addr);
switch (genimg_get_format (hdr)) {
case IMAGE_FORMAT_LEGACY:
puts (" Legacy image found\n");
if (!image_check_magic (hdr)) {
puts (" Bad Magic Number\n");
return 1;
}
if (!image_check_hcrc (hdr)) {
puts (" Bad Header Checksum\n");
return 1;
}
image_print_contents (hdr);
puts (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) {
puts (" Bad Data CRC\n");
return 1;
}
puts ("OK\n");
return 0;
#if defined(CONFIG_FIT)
case IMAGE_FORMAT_FIT:
puts (" FIT image found\n");
if (!fit_check_format (hdr)) {
puts ("Bad FIT image format!\n");
return 1;
}
fit_print_contents (hdr);
if (!fit_all_image_check_hashes (hdr)) {
puts ("Bad hash in FIT image!\n");
return 1;
}
return 0;
#endif
default:
puts ("Unknown image format!\n");
break;
}
return 1;
}
int do_http_upgrade(const unsigned char *data, const ulong size) int do_http_upgrade(const unsigned char *data, const ulong size)
{ {
char buf[128];
if(getenv ("ram_addr") == NULL)
return -1;
if(getenv ("kernel_addr") == NULL)
return -1;
/* check the image */ /* check the image */
if(image_info(data)) { if(run_command("imi ${ram_addr}", 0) < 0) {
return -1; return -1;
} }
/* write the image to the flash */ /* write the image to the flash */
puts("http ugrade ...\n"); puts("http ugrade ...\n");
return 0; sprintf(buf, "era ${kernel_addr} +0x%x; cp.b ${ram_addr} ${kernel_addr} 0x%x", size, size);
return run_command(buf, 0);
} }
int do_http_progress(const int state) int do_http_progress(const int state)
@ -413,6 +366,7 @@ int do_http_progress(const int state)
puts("http start\n"); puts("http start\n");
break; break;
case HTTP_PROGRESS_TIMEOUT: case HTTP_PROGRESS_TIMEOUT:
puts(".");
break; break;
case HTTP_PROGRESS_UPLOAD_READY: case HTTP_PROGRESS_UPLOAD_READY:
puts("http upload ready\n"); puts("http upload ready\n");

View File

@ -48,10 +48,10 @@ extern ulong ifx_get_cpuclk(void);
#define ID_SAMURAI_1 0x0007 #define ID_SAMURAI_1 0x0007
#define SAMURAI_ID_REG0 0xA0 #define SAMURAI_ID_REG0 0xA0
#define SAMURAI_ID_REG1 0xA1 #define SAMURAI_ID_REG1 0xA1
#define ID_TANTOS 0x2599 #define ID_TANTOS 0x2599
#define RGMII_MODE 0 #define RGMII_MODE 0
#define MII_MODE 1 #define MII_MODE 1
#define REV_MII_MODE 2 #define REV_MII_MODE 2
#define RED_MII_MODE_IC 3 /*Input clock */ #define RED_MII_MODE_IC 3 /*Input clock */
#define RGMII_MODE_100MB 4 #define RGMII_MODE_100MB 4
@ -565,70 +565,22 @@ static int external_switch_init(void)
#endif /* CONFIG_EXTRA_SWITCH */ #endif /* CONFIG_EXTRA_SWITCH */
#if defined(CONFIG_CMD_HTTPD) #if defined(CONFIG_CMD_HTTPD)
static int image_info (ulong addr)
{
void *hdr = (void *)addr;
printf ("\n## Checking Image at %08lx ...\n", addr);
switch (genimg_get_format (hdr)) {
case IMAGE_FORMAT_LEGACY:
puts (" Legacy image found\n");
if (!image_check_magic (hdr)) {
puts (" Bad Magic Number\n");
return 1;
}
if (!image_check_hcrc (hdr)) {
puts (" Bad Header Checksum\n");
return 1;
}
image_print_contents (hdr);
puts (" Verifying Checksum ... ");
if (!image_check_dcrc (hdr)) {
puts (" Bad Data CRC\n");
return 1;
}
puts ("OK\n");
return 0;
#if defined(CONFIG_FIT)
case IMAGE_FORMAT_FIT:
puts (" FIT image found\n");
if (!fit_check_format (hdr)) {
puts ("Bad FIT image format!\n");
return 1;
}
fit_print_contents (hdr);
if (!fit_all_image_check_hashes (hdr)) {
puts ("Bad hash in FIT image!\n");
return 1;
}
return 0;
#endif
default:
puts ("Unknown image format!\n");
break;
}
return 1;
}
int do_http_upgrade(const unsigned char *data, const ulong size) int do_http_upgrade(const unsigned char *data, const ulong size)
{ {
char buf[128];
if(getenv ("ram_addr") == NULL)
return -1;
if(getenv ("kernel_addr") == NULL)
return -1;
/* check the image */ /* check the image */
if(image_info(data)) { if(run_command("imi ${ram_addr}", 0) < 0) {
return -1; return -1;
} }
/* write the image to the flash */ /* write the image to the flash */
puts("http ugrade ...\n"); puts("http ugrade ...\n");
return 0; sprintf(buf, "era ${kernel_addr} +0x%x; cp.b ${ram_addr} ${kernel_addr} 0x%x", size, size);
return run_command(buf, 0);
} }
int do_http_progress(const int state) int do_http_progress(const int state)
@ -639,6 +591,7 @@ int do_http_progress(const int state)
puts("http start\n"); puts("http start\n");
break; break;
case HTTP_PROGRESS_TIMEOUT: case HTTP_PROGRESS_TIMEOUT:
puts(".");
break; break;
case HTTP_PROGRESS_UPLOAD_READY: case HTTP_PROGRESS_UPLOAD_READY:
puts("http upload ready\n"); puts("http upload ready\n");

View File

@ -165,7 +165,7 @@
NetRxPacket = inpkt; NetRxPacket = inpkt;
NetRxPacketLen = len; NetRxPacketLen = len;
et = (Ethernet_t *)inpkt; et = (Ethernet_t *)inpkt;
@@ -1952,3 +1972,161 @@ ushort getenv_VLAN(char *var) @@ -1952,3 +1972,162 @@ ushort getenv_VLAN(char *var)
{ {
return (string_to_VLAN(getenv(var))); return (string_to_VLAN(getenv(var)));
} }
@ -249,6 +249,8 @@
+ NetArpWaitTxPacketSize = 0; + NetArpWaitTxPacketSize = 0;
+ } + }
+ +
+restart:
+
+ eth_halt(); + eth_halt();
+#ifdef CONFIG_NET_MULTI +#ifdef CONFIG_NET_MULTI
+ eth_set_current(); + eth_set_current();
@ -258,7 +260,6 @@
+ return(-1); + return(-1);
+ } + }
+ +
+restart:
+#ifdef CONFIG_NET_MULTI +#ifdef CONFIG_NET_MULTI
+ memcpy (NetOurEther, eth_get_dev()->enetaddr, 6); + memcpy (NetOurEther, eth_get_dev()->enetaddr, 6);
+#else +#else