全志f1c100s是个性价比很高的芯片,但是对一般人不太友好的是它的资料开放的太少了。
网上找不到完整版的用户手册,只能从有限的手册文档和参考代码旁敲侧击,反向猜测。
关于它的BROM网上的手册内容很少。
手册上只有短短3句话:
具体怎么个启动流程,完全没有描述。
但是从网上的代码和开发板资料来看,它启动是按照顺序自动选择。
我用的开发板只有SPI FLASH,它是先从SPI NOR FLASH启动,无法读到有效的SPL,则进入USB下载模式。
而进入USB模式的按键,其实就是把SPI的片选拉低,让它无法读FLASH内的数据,从而进入USB模式。
USB下载模式官方提供一个sunxi-fel.exe的工具,很方便,它支持下载image到RAM,同时也支持直接下载到SPI-FLASH,还能读回数据。
如何判断SPL的有效性?
文档没有描述,也是通过参考代码,代到线索。
启动文件是这样写的,生成的BIN头部必须包含下面的内容。
;/* Boot head information for BROM booting */
BROM_BHI B Reset_Handler
DCB "eGON.BT0"
DCD 0, 0x4000
DCB 'S', 'P', 'L', 2
DCD 0, 0
DCD 0, 0, 0, 0, 0, 0, 0, 0
DCD 0, 0, 0, 0, 0, 0, 0, 0
编译生成的SPL.bin内容如下格式:
除了编译生成的文件头信息外,还需要后期修改如下内容:
偏移000C:此SPL.bin的校验,用mksunxi.exe生成。
偏移0010:此SPL.bin的长度,必须256字节对齐。
SPL是在哪里运行的?
我们怎么确定SPL的运行环境?
文档也是没有任何描述。
下面文档的内存映射表:
BROM在0地址有32KB,内部SRAM在0x10000有40KB。
那事实真的如此吗?
只能通过写代码进行验证,我们的SPL是被加载到了0地址,在0地址运行。
而我们能使用的SRAM空间,也不在0x10000这个地址。
实际上芯片内部的SRAM空间是在0x0000 - 0x9000,一共有36KB。
后来还发现0xB000 - 0xB600还有一小段可以使用的SRAM。
在启动时,我们的SPL程序运行地0地址,可以使用内部SRAM用做栈空间,它负责初始化CPU时钟和SDRAM,并负责加载uboot或者其它程序。
另外此时,IRQ,FIQ,MMU都是关闭状态。