Byzx大侠很早就发现了小海尔的内存布局。
俺的是大海尔,大海尔的和小海尔的做法还是有些区别。
1. 000000~1FFFFF Flash
100~300为starter代码
2. 0FFA80~0FFFFF, 运行时被映射成IO端口地址,内存芯片控制,解码等都和这片区域相关。
3. 260000~26FFFF 升级代码(downloader)的工作数据区
4. 3B0000~3B1EFF 应用软件解压装载程序运行时代码区,从680140装载至此处。
5. 410000~50FFFF 应用软件数据加载此处,做解压装载准备。对应到Flash的60000~16FFFF
6. 510000~51FFFF 应用软件代码(application software)的工作数据区
7. 5CF400~5EFFFF, 海尔S30, 上广电,天地星等(均为2M flash)的downloader运行时代码区。 从flash 400,长度20000H,装载此处。
入口代码地址5CFCCA
初始化代码地址5CFA24.
8. 5D0000~5EFFFF,卓异红三黄五(1M flash和2M flash)的downloader运行时代码区。
入口代码地址5D0000
初始化代码地址5E37AE
9. 5F0000,flash中060000~1FFFFF应用软件数据临时加载此处,。含s30, 上广电,天地星, 卓异红三黄五(1M flash和2M flash)。
10. 680000~68FFFF 应用程序解压装载程序, 实际代码存放在flash的0F0000。因680000段在应用软件解压后被覆盖掉。downloader跳转到此处后,再次把自身装载到3B0000。
入口代码地址680000
11. 字库加载解压至760000
12. 应用程序主代码解压至630000,代码入口地址630000。
13. 卓异红三黄五(2M),天地星, 开机画面解压至720000
14. s30,上广电,卓异红三黄五1M,开机画面和应用软件一起打包,不单独解压。位置为(6B0000~6EFB3F)。
==============
另外总算彻底搞清楚Flash Header区的应用软件CRC的计算方式了。
020059~02005E, 应用软件crc32校验值。
02005D~020060, 应用软件crc32校验长度。
应用软件crc校验起始地址: 060000
那么,为什么有些Bin还需要在应用软件末尾加CRC呢? 可以发现,这种情况下,020059~02005E是00 00 00 00。虽然没有找到理论支持,但实践中发现,一段数据后附加了4个字节的CRC32,然后再整体作CRC32校验数据,这时的校验结果为00 00 00 00。所以,这种情况下,应用软件数据crc32校验长度是实际应用软件数据长度+4字节,多出的4字节就是前面数据的CRC校验数据。
====================
再附一个整理过的串口诊断数据,可通过读取串口,诊断鸡丁盒的工作状态。
3A: 开机
02: 部分重要device初始化完成。(可能是包含激活SDRA内存等重要元件)
03: 升级代码加载完成。
04: 初始化CPU完成。
0F: 应用程序加载完成。
10: begin check NVRAM crc16.
11: NVRAM crc16 ceck OK.
12: begin check flash header crc32. normally flow, skip the singal.
13: Flash Header crc32 check OK.
14: begin应用程序区crc校验, normally flow, 14之后跳转到应用程序区解压转载程序(680000)
16: write protected area(0000~01FFF7) crc check OK. 应用程序区crc校验失败,或强制升级进入这一步。
17: 升级应用程序,重试flash header和应用程序校验。看起来发送信号12是死代码。
18: 写保护区或应用程序区校验失败,系统停住。
80: 进入应用程序区,准备加载LZSS解码代码。
81: 准备解压数据完成,还未进行LZSS解码。
82: 字库解压开始
83: 字库解压装载完成。
84: 应用程序解压装载完成。跳转到630000
85: 开机画面解压装载完成。这一步在84前,只存在有单独开机画面压缩包的bin中。