TI DSP c6000的二次boot.docx
- 文档编号:8217904
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:13
- 大小:19.92KB
TI DSP c6000的二次boot.docx
《TI DSP c6000的二次boot.docx》由会员分享,可在线阅读,更多相关《TI DSP c6000的二次boot.docx(13页珍藏版)》请在冰豆网上搜索。
TIDSPc6000的二次boot
C6000EMIF接口EEPROM启动的二次bootloader
140labofuestc
一,二次boot概述
C6000有3种启动方式
✓直接执行方式。
这种方式中,DSP采用map0储器映射方式,即地址0x00000000指向片外的存储器。
上电后DSP直接从地址0x00000000开始执行。
注意这种模式并不适用于TMS320C621x/C671x系列的芯片。
✓主机启动模式。
主机通过DSP的HPI口搬移代码和启动DSP。
✓EMIF接口的并行ROM启动模式.上电后DSP通过EMIF接口装载代码,
在上述各种启动模式中,ROM启动模式实现简单,速度较快,在实际系统应用中也最为广泛,本文会主要介绍这种启动模式,
当采用EMIF接口的并行ROM启动模式时,大多数6000系列的DSP芯片只能从CE1向地址0处搬移1Kbytes的代码,那么当应用程序代码超过1Kbytes时就需要两次的代码搬移,这就是所说的二级启动过程。
简单过程如下。
1,DSP上电或硬复位时通过EDMA自动地从EMIF接口的BE1空间搬移的1kbytes的二次boot代码到片内ram的0x00000000到0x00000400空间
2,搬移完成后自动跳转到地址0x00000000处执行搬移进来的二次boot代码。
3,二级boot代码将应用程序从外部存储器搬移到内部RAM中,并且在代码搬移完后跳转到程序入口地址c_int00。
当需要访问外部存储器时,二级启动代码应包括对EMIF寄存器的配置,这些寄存器包括EMIF_GCR,EMIF_CE0,EMIF_SDCTRL及EMIF_SDRP,对这些寄存器的配置可根据原理图的设计及程序的要求用户自己进行编写。
对于有内部PLL控制时钟的DSP6000芯片,TI推荐在二级启动代码中配置PLL以提高启动的速度。
二次boot代码长度必须小于1k个bytes,这使得我们很难用c语言来编写二次boot代码。
因为初始化c运行环境需要空间不小。
二,二次boot的关键。
✓二次boot代码的编写和boottable的设置。
boottable的作用是告诉二次boot代码所搬的各个程序段的大小,在片外rom中的源地址和在片内ram中的目的地址。
✓存储器的安排。
包括片内ram和片外eeprom。
1,二次boot代码可以直接使用TI的6713dsk的boot代码。
我简单的修改了一下,主要是将代码合成了一个文件,代码在后面的附录中。
可见Boottable放在改boot代码的最后一块。
2,对于boottable,TI的技术文档(参考1)中提出了3中配置方法,最简单的一种是用hex6x的-boot选项生成boot表。
但需要要注意的是这种方法要求hex6x的version至少是4.33版本,低版本中这boot选项时无效的。
现在我们教研室的版本都还不够。
以后要用这种方法具体可以参考文献1。
还由一种采用link来作的,也需要的ccs版本至少2.2。
我使用的是三种方法,这种方法通过检查.map文件来手工写boot表。
Boot表的格式如下:
copyTable:
.word第一个段的大小
.word第一个段在片外eeprom中的起始地址
.word第一个段在片内ram中的起始地址
.word第二个段的大小
.word第二个段在片外eeprom中的起始地址
.word第二个段在片内ram中的起始地址
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
.word0
.word0
.word0
依次写入各个段的参数。
最后是以三个0的word表示表的结束。
这种boot表的格式时TI推荐的,方便和以后的boot软件兼容
3存储器的安排。
通过cmd文件来设置,如下一个例子(适用于6713)
MEMORY
{
BOOT:
origin=0x00000000,len=0x00000400/*L2.forcustombootcode*/
IRAM:
origin=0x00000400,len=0x0003fc00/*L2.fornon.custombootcode*/
SDRAM:
origin=0x80000000,len=0x10000000/*EMIF.CE1.SDRAM*/
FLASH_BOOT:
origin=0x90000000,len=0x00000400/*Flash.forcustombootcode*/
FLASH_REST:
origin=0x90000400,len=0x0001FC00/*Flash.forapplicationcode*/
}
SECTIONS
{
.boot_load:
LOAD=FLASH_BOOT,RUN=BOOT
.vectors:
LOAD=FLASH_REST,RUN=IRAM
.text:
LOAD=FLASH_REST,RUN=IRAM
.const>FLASH_REST
.cinit>FLASH_REST
.bss>IRAM
.far>IRAM
.stack>IRAM
.sysmem>IRAM
}
一般来所凡是已初始化的代码段,比如text,.vector段都需要烧到片外eeprom中,上电时通过2次boot装入到片内ram中运行。
不过像.const和cinit等的段虽然也是已初始化段,但因为这些代码段只在程序刚开始的时候运行一次,所以可以只放在片外的eeprom中就行了。
从上可见,在片内的ram和片外的eeprom的开始都专门给出了1kbytes的空间给.boot.load程序段。
以保证正常的boot过程。
需要说明的是当采用如上的cmd文件来biuld工程时,是无法用仿真器加载代码的。
所以在进行应用程序功能测试时不能使用这个cmd文件。
可以用一个对应的段定义。
Memory定义不用修改。
SECTIONS
{
.boot_load>BOOT
.vectors>IRAM
.text>IRAM
.const>IRAM
.cinit>IRAM
.bss>IRAM
.far>IRAM
.stack>IRAM
.sysmem>IRAM
}
等完成功能测试后,将sections改为如前的定义方式再biuld一次。
三,具体的超作步骤。
这种方法适合于非BIOS的应用,对于BIOS的应用参考文献一。
1,编写和测试DSP应用程序。
2,在工程中加入boot.asm。
根据不同的平台修改对EMIF接口和
PLL的配置。
根据前面所诉的方法修改cmd文件的MEMORY和SECTION定义。
3,选择生成map文件,build工程。
检查map文件。
在map文件中可找到各个段的大小,在eeprom中的位置和在ram中的位置。
根据map文件的信息,填写boot.asm中的boottable。
4,填完boottable后,重新build代码。
生成.out文件.
5,用hex6x将coff格式的.out文件转化为16进制文件.hex.
hex6x的cmd文件如下(适用于6713)
input_file_name.out/*nameofinputfile*/
-maphex.map/*createahexmapfile*/
-a/*createASCIIimage*/
-image/*Createamemoryimage(nodiscontinuities)*/
-zero/*resetaddressoriginto0foroutputfile(s)*/
-memwidth8/*WidthofROM/Flashmemory*/
ROMS
{
FLASH:
org=0x90000000,len=0x20000,romwidth=8,files={out_file_name.hex}
}
6,对应ccsbuld的map文件检查hex6x的map文件。
如过没错误,用烧写器
将生成的*.hex文件烧入eeprom.。
四,一些补充说明。
如果不考虑效率的话,可以直接在片内ram中化分为boot,code和data区,将除了boot_load的所有的代码都放到code区去,那么boottable中可以简单到如下只有一项。
的形式
copyTable:
.wordcode的大小
.wordcode在片外eeprom中的起始地址
.wordcode在片内ram中的起始地址
.word0
.word0
.word0
而且table里的参数不用通过查看ccs生成的。
map文件来设定,直接由cmd文件的MEMORY定义决定。
比如
MEMORY
{
BOOT:
origin=0x00000000,len=0x00000400/*L2.forcustombootcode*/
CODE:
origin=0x00000400,len=0x0001fc00/*L2.fornon.custombootcode*/
DATA:
origin=0x00020000,len=0x00020000/*EMIF.CE1.SDRAM*/
FLASH_BOOT:
origin=0x90000000,len=0x00000400/*Flash.forcustombootcode*/
FLASH_REST:
origin=0x90000400,len=0x0001FC00/*Flash.forapplicationcode*/
}
SECTIONS
{
.boot_load:
LOAD=FLASH_BOOT,RUN=BOOT
.vectors:
LOAD=FLASH_REST,RUN=CODE
.text:
LOAD=FLASH_REST,RUN=CODE
.const>FLASH_REST
.cinit>FLASH_REST
.bss>IRAM
.far>IRAM
.stack>IRAM
.sysmem>IRAM
}
那么
copyTable:
.word0x1fc00/*code的大小*/
.word0x90000400/*code在片外eeprom中的起始地址*/
.word0x00000400code/*在片内ram中的起始地址*/
.word0
.word0
.word0
参考文献
1CreatingaSecond-LevelBootloaderforFLASHBootloadingonTMS320C6000PlatformWithCodeComposerStudio2.2
TexasInstrumentsIncorporated
附录aboot代码,在6713和6416的板上作的测试。
;========boot_c671x.s62========
;
.title"Flashbootuputility"
.optionD,T
.length102
.width140
;EMIFRegisterAddressesforc671xfamily
EMIF_GCTL.equ0x01800000;EMIFglobalcontrol
EMIF_CE1.equ0x01800004;addressofEMIFCE1controlreg.
EMIF_CE0.equ0x01800008;EMIFCE0control
EMIF_CE2.equ0x01800010;EMIFCE2control
EMIF_CE3.equ0x01800014;EMIFCE3control
EMIF_SDRAMCTL.equ0x01800018;EMIFSDRAMcontrol
EMIF_SDRAMTIM.equ0x0180001c;EMIFSDRAMtimer
EMIF_SDRAMEXT.equ0x01800020;EMIFSDRAMextension
;EMIFRegisterValuesspecificallyfor6713DSK
EMIF_GCTL_V.equ0x00000078;
EMIF_CE0_V.equ0xffffbf33;EMIFCE0SDRAM
EMIF_CE1_V.equ0x02208802;EMIFCE1Flash8-bit
EMIF_CE2_V.equ0x22a28a22;EMIFCE2Daughtercard32-bitasync
EMIF_CE3_V.equ0x22a28a22;EMIFCE3Daughtercard32-bitasync
EMIF_SDRAMCTL_V.equ0x47115000;EMIFSDRAMcontrol
EMIF_SDRAMTIM_V.equ0x00000578;SDRAMtiming(refresh)
EMIF_SDRAMEXT_V.equ0x000a8529;SDRAMextendedcontrol
;===========.textsection=============
_text_size.equ0x00000ac0
_text_ld_start.equ0x90000600
_text_rn_start.equ0x00000600
;===========.vectorssection==========
_vectors_size.equ0x00000200
_vectors_ld_start.equ0x90000400
_vectors_rn_start.equ0x00000400
;===========.cinitsection============
;_cinit_szie.equ0x00000000
;_cinit_ld_start.equ0x00000000
;_cinit_rn_start.equ0x00000000
;===========.constsection============
;_const_szie.equ0x00000000
;_const_ld_start.equ0x00000000
;_const_rn_start.equ0x00000000
.sect".boot_load"
.global_boot
.ref_c_int00
_boot:
;************************************************************************
;*DEBUGLOOP-COMMENTOUTBFORNORMALOPERATION
;************************************************************************
zeroB1
_myloop:
;[!
B1]B_myloop
nop5
_myloopend:
nop
;************************************************************************
;*CONFIGUREEMIF
;************************************************************************
;****************************************************************
;*EMIF_GCTL=EMIF_GCTL_V;
;****************************************************************
mvklEMIF_GCTL,A4
||mvklEMIF_GCTL_V,B4
mvkhEMIF_GCTL,A4
||mvkhEMIF_GCTL_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_CE0=EMIF_CE0_V
;****************************************************************
mvklEMIF_CE0,A4
||mvklEMIF_CE0_V,B4
mvkhEMIF_CE0,A4
||mvkhEMIF_CE0_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_CE1=EMIF_CE1_V(setupfor8-bitasync)
;****************************************************************
mvklEMIF_CE1,A4
||mvklEMIF_CE1_V,B4
mvkhEMIF_CE1,A4
||mvkhEMIF_CE1_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_CE2=EMIF_CE2_V(setupfor32-bitasync)
;****************************************************************
mvklEMIF_CE2,A4
||mvklEMIF_CE2_V,B4
mvkhEMIF_CE2,A4
||mvkhEMIF_CE2_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_CE3=EMIF_CE3_V(setupfor32-bitasync)
;****************************************************************
||mvklEMIF_CE3,A4
||mvklEMIF_CE3_V,B4;
mvkhEMIF_CE3,A4
||mvkhEMIF_CE3_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_SDRAMCTL=EMIF_SDRAMCTL_V
;****************************************************************
||mvklEMIF_SDRAMCTL,A4
||mvklEMIF_SDRAMCTL_V,B4;
mvkhEMIF_SDRAMCTL,A4
||mvkhEMIF_SDRAMCTL_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_SDRAMTIM=EMIF_SDRAMTIM_V
;****************************************************************
||mvklEMIF_SDRAMTIM,A4
||mvklEMIF_SDRAMTIM_V,B4;
mvkhEMIF_SDRAMTIM,A4
||mvkhEMIF_SDRAMTIM_V,B4
stwB4,*A4
;****************************************************************
;*EMIF_SDRAMEXT=EMIF_SDRAMEXT_V
;****************************************************************
||mvklEMIF_SDRAMEXT,A4
||mvklEMIF_SDRAMEXT_V,B4;
mvkhEMIF_SDRAMEXT,A4
||mvkhEMIF_SDRAMEXT_V,B4
stwB4,*A4
;****************************************************************************
;copysections
;****************************************************************************
mvklcopyTable,a3;loadtablepointer
mvkhcopyTable,a3
copy_section_top:
ldw*a3++,b0;bytecount
ldw*a3++,b4;loadflashstart(load)address
ldw*a3++,a4;ramstartaddress
nop2
[!
b0]bcopy_done;havewecopiedallsections?
nop5
copy_loop:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TI DSP c6000的二次boot c6000 二次 boot