DSP程序nandflash固化(二)——bootloader与AIS镜像
什么是AIS呢?AIS是Application Image Script的缩写,是TI的一种指令集,TI在其DSP中固化了bootloader,这个bootloader可以接受AIS格式指令,这种指令是由二进制数据组成,由命令头和数据组成,可由bootloader解释并执行,每个命令包含选项码、额外的选项数据。所有的命令和数据必须是32bit字宽。TI的using the TMS320C642X bootloader中有详细的介绍。
那么AIS是一种什么样的文件呢?AIS文件由一个魔术子(0x51504954)开始,后续为一些列命令,最后以JUMP_CLOSE命令(0x58535906)结束。下图给出其组成结构描述:
在AIS2.0版本中,支持下表所示的命令:
Opcode | Value |
Section Load | 0×58535901 |
Request CRC | 0×58535902 |
Enable CRC | 0×58535903 |
Disable CRC | 0×58535904 |
Jump | 0×58535905 |
Jump_Close | 0×58535906 |
Set | 0×58535907 |
Start Over | 0×58535908 |
Reserved | 0×58535909 |
Section Fill | 0×5853590A |
Get | 0×5853590C |
Function Execute | 0×5853590D |
如何使用这些指令字呢?本文只介绍常用的几种指令,剩下的读者可以自行研究。
- Jump_Close指令:结束boot程序,并且跳转到载入的程序起始地址并执行。
指令格式:
![DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客 DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客](http://img1.ph.126.net/MLTUzZjUy5F_Ce5mD4jhXA==/6631684591725236005.png)
该指令需要三个参数,第一个是程序的入口地址,在bootloader执行过程中加载的section数量, bootloader加载的字节数,注意三个参数都是32位int型。
- Function Execute指令:bootloader内置函数执行指令,内部共有三种函数可供用户程序调用。
指令格式:
![DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客 DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客](http://img2.ph.126.net/RIX-HP4ZrgfbT7cZZ6_8Xg==/6632128794419760929.png)
由于DSP需要在用户程序执行之前使用PLL,DDR等外设,所以AIS文件开头需要使用到这些内置函数进行外设的配置,在此对这个指令进行详细说明。
Pre-defined ROM Functions
函数名 | 序号 | 参数个数 | 描述 |
PLL Config | 0 | 3 | Programs PLL |
EMIFA config | 1 | 5 | Programs EMIF control registers |
DDRConfig | 2 | 9 | Programs DDR PLL and DDR memory controler sets the DDR control registers |
2.1. PLL config function:
PPL配置函数需要三个参数:
- PLL multiplier
- PLL divide 1(divide down for CPU/system clock)
- Oscillator source(0-internal, 1-external)
使用示例:
AIS Data | Description |
0x5853590D | 函数执行指令 |
0x00030000 | 3个形参, 第0个函数 |
0x00000019 | PLLM = 0X19 |
0x00000001 | PLLDIV1 =1 |
0x00000000 | internal oscillator |
2.2. EMIFA config function:
EMIFA配置函数需要五个参数:
- AB1CR control register value
- AB2CR control register value
- AB3CR control register value
- AB4CR control register value
- NANDFCR control register value
2.3. DDR config function:
DDR配置函数需要9个参数:
- DDR PLLM value (sets PLLM field of PLLM register of PLL2)
- DDR CLK divide down (sets RATIO field of PLLDIV1 register of PLL2)
- Reserved - set to 0x00000000
- DDR clock source (0-internal, 1-external) (sets CLKMODE field of PLLCTL register of PLL2)
- DDR control register value (sets DDRPHYCR of DDR2 Memory Controller)
- Synchronous dynamic random access memory (SDRAM) config register value (sets SDBCR register of
DDR2 Memory Controller) - SDRAM timer 0 register value (sets SDTIMR register of DDR2 Memory Controller)
- SDRAM timer 1 register value (sets SDTIMR2 register of DDR2 Memory Controller)
- SDRAM refresh control register value (sets SDRCR register of DDR2 Memory Controller)
以上三个函数就是必须用到的内置函数,调用方式类似,这里着重强调一点的是函数参数的设置,如果不知道具体参数是多少,可以在调试自己的应用程序时查看寄存器的值,将对应的值最为参数即可。
3. section load指令:将代码/数据加载到DSP内存,所有的初始化段都需要使用该指令加载到dsp的内存中。
每一个段加载包含section_load指令(0x58535901), 段起始地址, 大小和内容,这里需要说明的是,段加载指令加载的数据长度没有限制,有加载的大小指定,也就是说可以将很大的(大于64Kb)用户代码段加载到制定内存,换句话说不必编写二次引导程序!这一点很重要,早期的DSP不支持AIS的芯片需要用汇编编写二次bootloader。
在DSP工程中CMD文件指定了程序中的所有段,按是否可加载可分为已初始化段和未初始化段,其中只有已初始化段能被加载到FLASH中,初始化段由主要有:
- .text——代码段
- .cinit——变量初值表
- .const——常量和字符串
- .switch——用于大型switch语句的跳转表
- 用户定义的段
下面是TI数据手册中一个完整AIS文件的示例:
NAND Boot AIS Boot Image Example
Data | Explanation |
0x41504954 | AIS magic number |
0x00000000 | Place holder reserved for number of pages over which image spans |
0x00000000 | Place holder for block where image starts |
0x00000000 | Place holder for page where image starts |
0x58535903 | Enable CRC command |
0x58535901 | Section load command |
0x10800000 | Section load address |
0x00000040 | Section size in bytes |
0x01802028 | Start of section raw data |
0x02802428 0x02002228 0x01884069 0x0200032A 0x020C0277 0x02884068 0x028C1FDB 0x02084068 0x6C6E10CD 0x10442641 0x003C2C6E 0x45B06C6E 0x2C6E00B4 0x2C6E00B4 |
|
0xEFC08000 | End of section raw data |
0x58535902 | Request CRC command |
0x0E85A97B | Expected CRC value |
0xFFFFFFA8 | Negative pointer to last valid command |
0x58535901 | Section load command |
0x10800040 | Section load address |
0x0000000C | Section size in bytes |
0x0000000A | Section size in bytes |
0x0000000A | Start section raw data |
0x0000000B | |
0x0000000C | End section raw data |
0x58535902 | Request CRC command |
0x8434A250 | Expected CRC value |
0xFFFFFFDC | Negative pointer to last valid command |
0x58535906 | JUMP CLOSE command |
0x10800000 | Application entry point address |
0x00000002 | Total number of sections that should have been loaded |
0x0000004C | Total number of bytes that should have been loaded |
在AIS制作NANDFLASH启动文件过程中,需要注意很多细节,在本系列教程中都在文末有强调。
本节重点:
- 着重阅读稳重提到的三个指令;
- AIS可以自动搜索魔术字,从第0页开始搜索;AIS文件执行已JUMP_CLOSE指令结束,后面必须指定用户程序入口地址;
- 1.30版本的bootloader要求AIS存储在第1块以后!!!不能放在第0块开始,否则无法boot。