作者话adsp-21489 evb开发板说明.pdf
作者的话
这部分的内容,ADI没有给相关的资料,OP也没具体做过,不过OP有一个客户做完了,
写了一个小总结,我认为比较有价值,收集起来一下给大家,希望对你的开发有帮助。
正文
之前因项目需要做了一下2148x的bootloader,于是在参考几份资料后对
bootloader有所了解。这些资料包括:ADSP-214xx_hwr_rev1.1、EE345、
50_ldr_mn_rev_2.5和cces_1-0-2_loader_man_rev.1-2,其中50_ldr_mn_rev_2.5和
时纠正更改,此外,由于笔者只做过spiflash的启动,所以文档中也只会对spiflash
的启动作详细描述。
首先说说程序是如何boot起来的,主要有两部分:首先启动后,根据选定为spi
flash模式,先发送读指令从flash的0x000000地址中将一个256instructionwords
(48-bit)的小程序load进,这个小程序就是bootkernel。这个小程序在中
跑起来,然后根据一些必要信息,将真正应用程序load入,但不包括IVT
(interruptvectortable)。注意,bootkernel本身就是在sharc所对应的IVT的
位置中跑起来的,也即0x0008c000~0x0008c0ff这段地址中。load完application后,
bootkernel会用SPI的DMA将自身改写为application对应的IVT(听起来似乎很神
奇),至此,bootkernel的工作完成,加载过程结束,开始跑application。
接下来,是时候说一下在上面反复提及的bootkernel。这是一个用asm写的小程
序,由给出,用户基本上不需要进行过多修改,只是在做secondbootloader的时
候需要进行一定修改,但例程都在EE345对应的参考程序中可查看。bootkernel里面
的label主要分为3类:首先,第一部份也是最为重要,或者说用户可修改用到的是
“user_init:”这是bootkernel为用户自定义代码所预留的,我们所做的不默认地
从spiflash的0x00000地址而从其余的诸如0x010000、0x020000等地址将程序读进
来的bootloader功能就是在这里面完成的,所以,一般用户只需要修改删减该label
下对应的汇编代码,其余地方的代码不建议进行修改。更具体地说,在user_init中主
要是配置一个SPIDMA发送spiflah的读指令,并且在读指令中还指定了app在flash
中特定的存放地址。注意,此处并不关心读进来的数据是什么,甚至并不保存,只是为
了发送读指令以及flash的偏移地址,为接下来的load入flash中偏移后APP并进行
保存做准备。还需注意的是,因为bootkernel最大只能支持256instructionwords,
所以修改user_init仍需保证bootkernel的大小不超过256instructionwords。
如果用户用的不是笔者给出的参考程序,而是自己新建工程的话,对于asm编译器的编
译选项必须选择为“GenerateNormalWordcode”,选择为GenerateShortWordcode
会产生不可思议的错误,具体用户可自行尝试。
接下来的两类label不建议,或者说新手用户进行修改或者删减,所以对于这
两类label笔者只说明其功能。接上述第一类label,第二类label中主要包括了诸如:
ZERO_LDATA、ZERO_L48、INIT_L16、INIT_L32、INIT_L48、INIT_L64、ZERO_EXT8、
ZERO_EXT16、INIT_EXT8、INIT_EXT16等。这些label的存在主要是为了真正地实现load
用户的app,并放到用户app指定的相对应的地方。这是由于app的每个section都包
括了header,header中包括了:datatag(也即对应了上面所说的label)、dataaddress、
datacount,bootkernel根据sectionheader的信息循环运行以上的label,完成app
程序的加载。具体用户可详见bootkernel源码,这里不做累述。
运行完第二类label,bootkernel也行将就木来到最后的label也即第三类label:
f