- 论坛徽章:
- 0
|
- //--- include/config.h, 生成的内容如下
- #define CONFIG_AR7240 1
- #define CONFIG_MACH_HORNET 1
- #define CONFIG_HORNET_1_1_WAR 1
- #define NEW_DDR_TAP_CAL 1
- #define FLASH_SIZE 4
- /* Automatically generated - do not edit */
- #include <configs/ap121.h>
- #define CONFIG_PID_WR70301 1
- #define GPIO_SYS_LED_BIT 27
- #define GPIO_SYS_LED_ON 0
- #define GPIO_RST_BUTTON_BIT 11
- ---- include/configs/ap121.h, 相关的配置数据都在此文件!!!!
- //#define FLASH_SIZE 4
- #if (FLASH_SIZE == 8)
- #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
- #define CFG_MAX_FLASH_SECT 128 /* max number of sectors on one chip */
- #define CFG_FLASH_SECTOR_SIZE (64*1024)
- #define CFG_FLASH_SIZE 0x00800000 /* Total flash size */
- #elif (FLASH_SIZE == 4)
- #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
- #define CFG_MAX_FLASH_SECT 64 /* max number of sectors on one chip */
- #define CFG_FLASH_SECTOR_SIZE (64*1024)
- #define CFG_FLASH_SIZE 0x00400000 /* Total flash size */
- #else
- /* For 2 MB flash */
- # error "not support 2MB flash now"
- #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
- #define CFG_MAX_FLASH_SECT 32 /* max number of sectors on one chip */
- #define CFG_FLASH_SECTOR_SIZE (64*1024)
- #define CFG_FLASH_SIZE 0x00200000 /* Total flash size */
- #endif
- #define CONFIG_IPADDR 192.168.1.1
- #define CONFIG_SERVERIP 192.168.1.2
- ----- net/uip-0.9/fsdata.c, httpd.c, fsdata.c,
- #升级时的提示
- Flashing...
- The system is now trying to flash. If there is a problem, the LEDs will start to blink.
- After a successful update the box will reboot
- static const char data_index_html[] =
- "HTTP/1.0 200 OK\n"
- "Server: uIP/0.9 (http://dunkels.com/adam/uip/)\n"
- "Content-type: text/html\n"
- "\n"
- "<html>\n"
- "\t<head>\n"
- "\t\t<title>\n"
- "\t\t\tFailsafe UI\n"
- "\t\t</title>\n"
- "\t</head>\n"
- "\t<body>\n"
- "\t\t<h1>Failsafe UI</h1>\n"
- "\t\t<form method=\"post\" enctype=\"multipart/form-data\">\n"
- "\t\t\t<input type=file name=firmware>\n"
- "\t\t\t<input type=submit>\n"
- "\t\t</form>\n"
- "\t</body>\n"
- "</html>\n";
- const struct fsdata_file file_index_html[] =
- {{file_404_html, "/index.html", data_index_html, sizeof(data_index_html)}};
- -- httpd.c
- void httpd_init(void)
- {
- fs_init();
- uip_listen(HTONS(80));
- }
- upload_data = httpd_upload_data = (unsigned char *)do_http_tmp_address();
- printf("received data will be stored at %p\n", upload_data);
- next = (unsigned char *)strstr((char *)boundary_start, "name=\"firmware\";");
- void httpd_appcall(void)
- {
- //第一包
- if(hs->state == HTTP_FIRMWARE) {
- next = (unsigned char *)strstr((char *)boundary_start, "name=\"firmware\";");
- if(!next)
- {
- uip_close();
- return;
- }
- next = (unsigned char *)strstr((char *)next, eol2); //\r\n\r\n
- if(!next)
- {
- printf("could not find start of data\n");
- uip_close();
- return;
- }
- next += 4; //此为首包的有效数据
- hs->script = 0;
- hs->state = HTTP_FIRMWARE;
- hs->upload = uip_len - (next - start); //有效数据的长度
- hs->upload_total = len - (int)(next - boundary_start);
- hs->upload_total -= (strlen(boundary) + 6);
- //printf("storing %d bytes at %p\n", (int)hs->upload, upload_data);
- for(i = 0; i < hs->upload; i++)
- upload_data[i] = next[i]; //有效数据赋值
- upload_data += (int)hs->upload;
- printf("%d / %d\n", (int)hs->upload, hs->upload_total);
- uip_slen = 0;
- return;
- }
- //后续包
- if(hs->state == HTTP_FIRMWARE) {
- if(uip_newdata()) {
- int i;
- hs->count = 0;
- uip_appdata[uip_len] = '\0';
- hs->upload += uip_len;
- //printf("storing %d bytes at %p\n", uip_len, upload_data);
- printf("%d / %d\n", (int)hs->upload, hs->upload_total);
- for(i = 0; i < uip_len; i++)
- upload_data[i] = uip_appdata[i];
- upload_data += uip_len;
- uip_slen = 0;
- if(hs->upload >= hs->upload_total)
- {
- upload_running = 1;
- NetBootFileXferSize = hs->upload_total;
- fs_open(file_flash_html.name, &fsfile);
- hs->script = 0;
- hs->state = HTTP_FILE;
- hs->dataptr = fsfile.data;
- hs->count = fsfile.len;
- }
- }
- }
- }
- ---- net目录下
- -- httpd.c
- void HttpdStart (void)
- {
- uip_init();
- httpd_init();
- }
- unsigned long do_http_tmp_address(void)
- {
- char *s = getenv ("ram_addr");
- if (s) {
- ulong tmp = simple_strtoul (s, NULL, 16);
- return tmp;
- }
- return 0 /*0x80a00000*/;
- }
- int do_http_progress(const int state)
- {
- /* toggle LED's here */
- switch(state) {
- case HTTP_PROGRESS_START: ar7240_all_led_on(); break;
- case HTTP_PROGRESS_UPLOAD_READY:
- ar7240_all_led_off();
- udelay(1000 * 500);
- ar7240_all_led_on();
- break;
- case HTTP_PROGRESS_UGRADE_FAILED:
- puts("http ugrade failed\n");
- break;
- }
- return 0;
- }
- 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;
- /* write the image to the flash, 执行命令 刷FW
- erase 0x9f020000 +0x7c0000
- cp.b 0x80000000 0x9f020000 0x7c0000
- */
- sprintf(buf, "era ${kernel_addr} +0x%lx; cp.b ${ram_addr} ${kernel_addr} 0x%lx", size, size); //
- return run_command(buf, 0); //代码中调用cmd
- }
- -- net.c
- int NetLoopHttpd(void)
- {
- HttpdStart();
- do_http_progress(HTTP_PROGRESS_START);
- https_running = 1;
- for (;;) {
- unsigned long long t1;
- WATCHDOG_RESET();
- if(eth_rx() > 0) {
- HttpdHandler();
- } else {
- t1 = get_ticks();
- if(t1 - tout > 1000) {
- do_http_progress(HTTP_PROGRESS_TIMEOUT);
- tout = t1;
- }
- }
- do_http_progress(HTTP_PROGRESS_UPLOAD_READY);
- //http升级
- if(do_http_upgrade(&httpd_upload_data[0], NetBootFileXferSize) >= 0) {
- do_http_progress(HTTP_PROGRESS_UGRADE_READY);
- udelay(1000 * 10);
- ar7240_all_led_off();
- do_reset (0,0,0,0);
- return 0;
- }
- break;
- }
- }
- ---- board/ar7240/ap121 目录下, ap121.c, flash.c
- #define MY_WRITE(y, z) ((*((volatile u32*)(y))) = z)
- #define MY_READ(y) (*((volatile u32*)(y)))
- #define SETBITVAL(val, pos, bit) \
- do { \
- ulong bitval = (bit) ? 0x1 : 0x0; \
- (val) = ((val) & ~(0x1 << (pos))) | ( (bitval) << (pos)); \
- } while (0)
- void ar7240_all_led_on(void)
- {
- ulong gpio;
- int index;
- gpio = MY_READ(0xb8040008);
- #ifdef CONFIG_PID_WR70301
- SETBITVAL(gpio, GPIO_SYS_LED_BIT, GPIO_SYS_LED_ON); //LED ON
- SETBITVAL(gpio, GPIO_SYS_LED_BIT, !GPIO_SYS_LED_ON); //LED OFF
- #endif
- MY_WRITE(0xb8040008, gpio);
- }
- int ar7240_is_rst_button_pushed(void)
- {
- if(ar7240_reg_rd(AR7240_GPIO_IN) & (1 << GPIO_RST_BUTTON_BIT)) return 1;
- else return 0;
- }
- //sets up flash_info and returns size of FLASH (bytes)
- unsigned long flash_get_geom (flash_info_t *flash_info)
- {
- int i;
- //#define FLASH_M25P64 0x00F2, \include\flash.h
- flash_info->flash_id = FLASH_M25P64;
- //#define CFG_FLASH_SIZE ((uint)(8 * 1024 * 1024)) /* max 8Mbyte */, \board\fads\fads.h,
- flash_info->size = CFG_FLASH_SIZE; /* bytes */
- flash_info->sector_count = flash_info->size/CFG_FLASH_SECTOR_SIZE;
- for (i = 0; i < flash_info->sector_count; i++) {
- flash_info->start[i] = CFG_FLASH_BASE + (i * CFG_FLASH_SECTOR_SIZE);
- flash_info->protect[i] = 0;
- }
- printf ("flash size %d, sector count = %d\n", flash_info->size, flash_info->sector_count);
- return (flash_info->size);
- }
- ---- board/ar7240/common目录下,
- -- ar7240_flash.c: 通过SPI 读写Flash
- unsigned long flash_init(void)
- {
- read_id();
- return (flash_get_geom(&flash_info[0]));
- }
- int flash_erase(flash_info_t *info, int s_first, int s_last)
- {
- int i, sector_size = info->size / info->sector_count;
- for (i = s_first; i <= s_last; i++) {
- ar7240_spi_sector_erase(i * sector_size);
- }
- ar7240_spi_done();
- return 0;
- }
- -- main.c
- void main_loop (void)
- {
- # ifdef CONFIG_CMD_HTTPD
- if (ar7240_is_rst_button_pushed()) {
- printf("You push the button,starting httpd to update firmware ...\n");
- NetLoopHttpd();
- }
- # endif
- }
- int run_command (const char *cmd, int flag)
- {
- }
复制代码 |
|