root/ar5315_microredboot/microredboot/ecos/packages/redboot/current/src/net/fwupgrade_senao.c

Revision 12372, 2.9 kB (checked in by BrainSlayer, 5 months ago)

correct entrypoint for eap3660 and adjust size

Line 
1 /*
2 firmware upgrade code for senao webflash images
3 */
4
5 #include <redboot.h>
6 #include <cyg/io/flash.h>
7 #include <fis.h>
8 #include <flash_config.h>
9 #include "fwupgrade.h"
10
11 /* some variables from flash.c */
12 extern void *flash_start, *flash_end;
13 extern int flash_block_size, flash_num_blocks;
14 #ifdef CYGOPT_REDBOOT_FIS
15 extern void *fis_work_block;
16 extern void *fis_addr;
17 extern int fisdir_size;         // Size of FIS directory.
18 #endif
19 //extern void _show_invalid_flash_address(CYG_ADDRESS flash_addr, int stat);
20 extern void fis_update_directory(void);
21
22 //#define TRACE diag_printf("DBG: %s:%d\n", __FUNCTION__, __LINE__)
23
24 #define TRACE
25
26
27 extern void fis_init(int argc, char *argv[], int force);
28
29 int fw_check_image_senao(unsigned char *addr, unsigned long maxlen,
30                          int do_flash)
31 {
32         unsigned char *base = (unsigned char *)addr+10;
33         if (strncmp(addr,"AP51-3660",9)) {
34                 diag_printf("SENAO_FW: bad header\n");
35                 return -1;
36         }
37
38         if (do_flash) {
39                 maxlen-=10;
40                 char *arg[] = { "fis", "init" };
41                 fis_init(2, arg, 1);
42                 void *err_addr;
43                 flash_read(fis_addr, fis_work_block, fisdir_size,
44                            (void **)&err_addr);
45                 struct fis_image_desc *img = NULL;
46                 int i, stat;
47                 img = fis_lookup("RedBoot", &i);
48                 if (i != 0) {
49                         diag_printf
50                             ("SENAO_FW: RedBoot partition is not the first partition\n");
51                         return -1;
52                 }
53                 unsigned int flash_addr = img->flash_base + img->size;
54                 if ((stat =
55                      flash_erase((void *)flash_addr, maxlen,
56                                  (void **)&err_addr)) != 0) {
57                         diag_printf("SENAO_FW: Can't erase region at %p: %s\n",
58                                     err_addr, flash_errmsg(stat));
59                         return -1;
60                 }
61                 if ((stat =
62                      flash_program((void *)flash_addr,
63                                    (void *)(base),
64                                    maxlen, (void **)&err_addr)) != 0) {
65                         diag_printf
66                             ("SENAO_FW: Can't program region at %p: %s\n",
67                              err_addr, flash_errmsg(stat));
68                         return -1;
69                 }
70                 img = (struct fis_image_desc *)fis_work_block;
71                         for (i = 0; i < fisdir_size / sizeof(*img); i++, img++) {
72                                 if (img->name[0] == (unsigned char)0xFF) {
73                                         break;
74                                 }
75                         }
76                        
77                 unsigned int filesyssize = 0x3f0000;
78                 unsigned int linuxsize = 0xa0000;
79                 unsigned int cfgsize = 0x20000;
80                 unsigned int exec = 0x80041798;
81                 if (maxlen==(3670026-10)) // detect 4M images (EAP3660 etc.)
82                     {
83                     filesyssize = 0x2f0000;
84                     exec = 0x80170040; //weired entrypoint
85                     }
86                 strcpy(img->name, "rootfs");
87                 img->flash_base = flash_addr;
88                 img->mem_base = 0x80041000;
89                 img->entry_point = 0;
90                 img->size = filesyssize;
91                 img->data_length = filesyssize;
92                 img++;
93                 strcpy(img->name, "vmlinux.bin.l7");
94                 img->flash_base = flash_addr+filesyssize;
95                 img->mem_base = 0x80041000;
96                 img->entry_point = exec;
97                 img->size = linuxsize;
98                 img->data_length = linuxsize;
99                 img++;
100                 strcpy(img->name, "cfg");
101                 img->flash_base = flash_addr+filesyssize+linuxsize;
102                 img->mem_base = 0x80041000;
103                 img->entry_point = 0;
104                 img->size = cfgsize;
105                 img->data_length = cfgsize;
106                
107                 fis_update_directory();
108                 diag_printf("SENAO_FW: flashing done\n");
109         }
110         return 0;
111 }
Note: See TracBrowser for help on using the browser.