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
  如何使用这些指令字呢?本文只介绍常用的几种指令,剩下的读者可以自行研究。
  1. Jump_Close指令:结束boot程序,并且跳转到载入的程序起始地址并执行。
     指令格式:
     DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客
     该指令需要三个参数,第一个是程序的入口地址,在bootloader执行过程中加载的section数量, bootloader加载的字节数,注意三个参数都是32位int型。
  1. Function Execute指令:bootloader内置函数执行指令,内部共有三种函数可供用户程序调用。
     指令格式:
DSP程序nandflash固化(二)——bootloader与AIS镜像 - 亦梦云烟 - 亦梦云烟的博客
 
  由于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。
posted @ 2016-11-18 10:30  亦梦云烟  阅读(1762)  评论(0编辑  收藏  举报