本文主要对工作中调试C6678的spi flash启动做一个归纳
细节方面可能不多,只关系到spi启动部分,启动的原理啥的参照我的另一篇文章。
DSP芯片TMS320C6678的emif挂载norflash启动
1.启动原理
spi启动是根据bootmode的配置方式和生成的镜像内包含的配置数据,把用户的代码拷贝到相应位置并运行的。
而emif启动是直接在flash中运行,默认不进行代码拷贝。
2.程序设计
为了代码设计方便,和另一篇文章相同,依然把代码分成两个部分,一个是BootLoader工程,一个是APP工程。由BootLoader工程将APP工程拷贝到相应的内存地址中。
3.BOOTMODE[12:0]
参考TMS320C6678.pdf 29-30页。
Bit12-11:这一项根据flash芯片手册配置,一般spi flash的驱动做好了这一项就知道选什么了。
Bit10:spi操作的模式,4-pin模式还是5-pin模式。
Bit9:SPI的地址宽度,决定了SPI FLASH地址能访问多大,一般把BootLoader放在FLASH开头,所以选16-bit、24-bit应该都没影响。
Bit8-7:SPI的片选信号,选好自己烧写程序的FLASH芯片所接的片选。这个要么看原理图,要么问硬件。
Bit6-3:选择从SPI FLASH中加载哪个参数表。支持0-15个。按我的理解可能是可以生成16个不同的不同的参数表,实现复位启动不同的功能。但是有同样的需求可以在BootLoader里实现,没必要调试这个参数。选择的是0。
Bit2-0:选择SPI,没什么好说的。
4.程序编码
同emif启动一样,我创建了3个工程:BootLoader工程,APP工程,还有一个FLASH烧写工程。
4.1 BootLoader工程
BootLoader工程需要烧写到FLASH偏移地址0处。cmd配置如下:
-c
-heap 0x1000
-stack 0x4000
MEMORY
{
/* Local L2, 0.5~1MB*/
VECTORS: o = 0x00840000 l = 0x00000200
LL2_RW_DATA: o = 0x00840200 l = 0x0003FA00
}
SECTIONS
{
.vecs > VECTORS
.bootentry > LL2_RW_DATA
.text > LL2_RW_DATA
.cinit > LL2_RW_DATA
.const > LL2_RW_DATA
.switch > LL2_RW_DATA
.uart_ws > LL2_RW_DATA
.stack > LL2_RW_DATA
GROUP
{
.neardata
.rodata
.bss
} > LL2_RW_DATA
.far > LL2_RW_DATA
.fardata > LL2_RW_DATA
.cio > LL2_RW_DATA
.sysmem > LL2_RW_DATA
}
.blversion段用来存放一些BootLoader的版本信息。
BootLoader工程还需要有一段汇编,用来保证当前运行地址为0x70000000,跳转_c_int00。
.global BOOTLOADER_entry
.ref _c_int00
.sect ".bootentry"
; begin of BOOT_start
BOOTLOADER_entry:
b _c_int00
nop
nop
nop
nop
nop
nop
nop
.byte "Bootloader"
之后需要设置程序入口函数为BOOTLOADER_entry,设置编译会有警告,属正常现象。如下图:
下面为BootLoader的搬运APP的部分代码:
#define APP_IMAGE_POSITION 0x70300000
int main(void)
{
// 装入从APP_IMAGE_POSITION开始的应用程序boot-table
unsigned int *p = (unsigned int*)APP_IMAGE_POSITION;
FLASH_BOOT_FX entryAddr;
unsigned int len;
unsigned int* pos;
//获取程序入口地址
entryAddr = (FLASH_BOOT_FX)(*p++);
//每次搬运4字节
while(1) {
len = *p++;
len = (len+3)>>2;
if(len == 0)
break;
pos = (unsigned int*)*p++;
for(i=0; i<len; i++)
*pos++ = *p++;
}
//跳转APP的程序入口函数
entryAddr();
}
当然BootLoader不可能只有上述代码,还需要先配置工作频率,初始化DDR,初始化要使用的一些功能。如果需要多核启动,还需要将其他核的启动地址填进去。如果有多个镜像的启动需求也需要自己实现。
4.2 APP工程
APP工程虽然烧写到FLASH基地址0x70300000,但是BootLoader会把APP搬运到DDR3中,因此需要配置cmd文件,将.text、.cinit等所有段放入DDR3中。cmd配置如下:
-heap 0x1000
-stack 0x2000
MEMORY
{
/* Local L2, 0.5~1MB*/
LL2_RW_DATA: o = 0x00800200 l = 0x0003FE00
/* Shared L2 2~4MB*/
VECTORS: o = 0x0C000000 l = 0x00000200
SL2: o = 0x0C000200 l = 0x001FFE00
/* External DDR3, upto 2GB per core */
DDR3_R_DATA: o = 0x81000000 l = 0x01000000 /*set memory protection attribitue as read only*/
DDR3_RW_DATA: o = 0x82000000 l = 0x06000000 /*set memory protection attribitue as read/write*/
DDR3_CODE: o = 0xF0000000 l = 0x09000000 /*set memory protection attribitue as execution only*/
DDR3_UART_DATA: o = 0xFF000000 l = 0x00FFFFFF
}
SECTIONS
{
.vecs > VECTORS
.text > SL2
.cinit > SL2
.const > SL2
.switch > SL2
// .uart_ws > DDR3_UART_DATA
.uart_ws > SL2
.coresync > SL2
.stack > DDR3_CODE
GROUP
{
.neardata
.rodata
.bss
} > DDR3_CODE
.far > DDR3_CODE
.fardata > DDR3_CODE
.cio > DDR3_CODE
.sysmem > DDR3_CODE
.btsect > SL2
.mysect > SL2
}
APP工程不需要配置程序入口函数。
4.3 FLASH烧写工程
FLASH烧写工程主要用于将生成的image文件烧录入SPI flash的相应地址。此工程需要把生成的两个image文件分别烧写到0和0x30000。烧录地址可以随意,只要两个工程地址不重叠就行。
如果想要开发在线更新的程序,可以将此工程整合进APP或者BootLoader工程中。
5. 生成image文件
工程编译生成的.out文件不能直接烧录到FLASH运行,需要转换成.bin文件烧写。当然,生成image文件不止一种方法,此处只是我使用的方法。
生成image文件需要工具如下:
一般来说双击.bat文件就会自动生成.bin的可烧录文件了。
生成BootLoader的方法和APP的方法很不同。因为APP只需要是.bin文件我们自己的BootLoader可以解析就行了,严格来说什么格式都行。BootLoader的格式还需要整合进一个参数表进去,用到的工具都不一样。
5.1 BootLoader工程
BootLoader工程需要以下工具:
其中需要自己填写的如下,顶多改几个路径,大部分不用变。
/* nysh.spi.map */
section {
boot_mode = 50
param_index = 0
options = 1
core_freq_mhz = 1000
exe_file = "bootloader.i2c.ccs"
next_dev_addr_ext = 0x0
sw_pll_prediv = 1
sw_pll_mult = 20
sw_pll_postdiv = 2
sw_pll_flags = 1
addr_width = 24
n_pins = 4
csel = 0
mode = 0
c2t_delay = 0
bus_freq_mhz = 0
bus_freq_khz = 500
}
上面就是参数表,根据实际情况填写。大多数参数我也忘了代表什么含义了。
/* core0.rmd */
../Debug/bootloader.out
-a
-boot
-e _c_int00
ROMS
{
ROM1: org = 0x0C000000, length = 0x100000, memwidth = 32, romwidth = 32
files = { bootloader.btbl }
}
/* spibootMulticore.bat */
hex6x core0.rmd
b2i2c bootloader.btbl bootloader.i2c
b2ccs bootloader.i2c bootloader.i2c.ccs
romparse nysh.spi.map
ccs2bin i2crom.ccs bootloader_spirom.bin 1 1
copy bootloader_spirom.bin ..\..\6678_spi_flash_write\firmware
生成.bin文件只需要双击spibootMulticore.bat文件就行了。
还有一个为了方便测试,自己建的清理文件clean.bat。用不用无所谓。
/* clean.bat */
del /a /f /s /q *.btbl *.i2c *.ccs *.hex *.bin
5.2 APP工程
APP工程只需要以下工具即可:
下面为elf2hexRelease.txt
..\Debug\APP_TEST_NO_OS.out
--outfile=APP_TEST_NO_OS.hex
--map=APP_TEST_NO_OS.map
--memwidth=32
--romwidth=32
--order=M
--intel
--fill=0xffffffff
--boot
--bootorg=0x00000000
下面为geneRelease.bat
hex6x elf2hexRelease.txt
hex2bin APP_TEST_NO_OS.hex
copy APP_TEST_NO_OS.bin ..\..\6678_spi_flash_write\firmware
双击geneRelease.bat文件即可生成.bin可烧录文件。
6.烧录工具
烧录工具已上传,使用当前时间最新版火绒安全杀过毒了,有病毒和我无关呦。
DSP6678_SPI_FLASH烧录文件转换工具.rar