This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
1 首先生成.out文件,linker的CMD文件和boot loader汇编文件如下:
/*******************************************************/
linker的CMD:
/*******************************************************/
-c
-heap 0x41000
-stack 0xa000
MEMORY
{
L1PSRAM (RWX) : org = 0x0E00000, len = 0x7FFF
L1DSRAM (RWX) : org = 0x0F00000, len = 0x7FFF
L2SRAM (RWX) : org = 0x0800000, len = 0x080000
MSMCSRAM (RWX) : org = 0xc000000, len = 0x200000
DDR3 (RWX) : org = 0x80000000, len = 0x10000000
boot : o = 0x70000000 l = 0x00000200
FLASH : o = 0x70000200 l = 0x3FFE00
}
SECTIONS
{
"bootload" : {} > boot
.text : {} > FLASH run = MSMCSRAM, LOAD_START(FLASH_TEXT_START), RUN_START(RAM_TEXT_START), SIZE(TEXT_SIZE)
.cinit : {} > FLASH run = MSMCSRAM, LOAD_START(FLASH_CINIT_START), RUN_START(RAM_CINIT_START), SIZE(CINIT_SIZE)
.const : {} > FLASH run = MSMCSRAM, LOAD_START(FLASH_CONST_START), RUN_START(RAM_CONST_START), SIZE(CONST_SIZE)
.switch : {} > FLASH run = MSMCSRAM, LOAD_START(FLASH_SWITCH_START), RUN_START(RAM_SWITCH_START), SIZE(SWITCH_SIZE)
.csl_vect : {} > FLASH run = MSMCSRAM, LOAD_START(FLASH_VECT_START), RUN_START(RAM_VECT_START), SIZE(VECT_SIZE)
GROUP (NEAR_DP)
{
.neardata
.rodata
.bss
} load > MSMCSRAM
.stack > MSMCSRAM
.cio > MSMCSRAM
.data > MSMCSRAM
.sysmem > MSMCSRAM
.far > MSMCSRAM
.testMem > MSMCSRAM
.fardata > MSMCSRAM
}
/*******************************************************/
boot loader汇编: 这里的bootloader没有对EMIFA,PLL进行设置
bootloader所用的boot table实际是在linker
CMD文件中声明的。
/*******************************************************/
.ref _c_int00
.ref FLASH_TEXT_START
.ref RAM_TEXT_START
.ref TEXT_SIZE
.ref FLASH_CINIT_START
.ref RAM_CINIT_START
.ref CINIT_SIZE
.ref FLASH_CONST_START
.ref RAM_CONST_START
.ref CONST_SIZE
.ref FLASH_SWITCH_START
.ref RAM_SWITCH_START
.ref SWITCH_SIZE
.ref FLASH_VECT_START
.ref RAM_VECT_START
.ref VECT_SIZE
.sect "bootload"
_boot_start:
nop 5
mvkl copyTable, a3 ; load table pointer
mvkh copyTable, a3
copy_section_top:
ldw *a3++, b0 ; byte count
ldw *a3++, b4 ; load flash start (load) address
ldw *a3++, a4 ; ram start address
nop 2
[!b0] b copy_done
nop 5
copy_loop:
ldb *b4++,b5
sub b0,1,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1
[!b0] and 3,a3,a1
stb b5,*a4++
[!b0] and -4,a3,a5 ; round address up to next multiple of 4
[ a1] add 4,a5,a3 ; round address up to next multiple of 4
copy_done:
mvkl .S2 _c_int00, B0
mvkh .S2 _c_int00, B0
b .S2 B0
nop 5
copyTable:
; count
; flash start (load) address
; ram start (run) address
;; .text
.word TEXT_SIZE
.word FLASH_TEXT_START
.word RAM_TEXT_START
;; .cinit
.word CINIT_SIZE
.word FLASH_CINIT_START
.word RAM_CINIT_START
;; .const
.word CONST_SIZE
.word FLASH_CONST_START
.word RAM_CONST_START
;; .switch
.word SWITCH_SIZE
.word FLASH_SWITCH_START
.word RAM_SWITCH_START
;; .vect
.word VECT_SIZE
.word FLASH_VECT_START
.word RAM_VECT_START
;; end of table
.word 0
.word 0
.word 0
2 由第一步的.out文件转换为.hex文件,其中HEX6X.exe所使用的CMD文件如下:
/*******************************************************/
HEX6X.exe的CMD: 这里有一个需要特别指出的问题就是因为所使
用的NOR FLASH是16bit位宽,因此在下面的CMD
文件中变量“memwidth”和“romwidth”都设置
为16,这个不知道是否正确?实际上对于“memw
idth”,“romwidth”以及“len”三个设置项
一直没有理解清楚,麻烦知道的大虾指点下。
“len”和输入的.out文件有什么关系?
/*******************************************************/
Debug/mwg519a_test.out
-a
-memwidth 16
-image
ROMS
{
FLASH: org = 0x70000000, len = 0x10000, romwidth = 16, files = {mwg519a_test.hex}
}
6 问题小结:
A 步骤1中linker CMD文件声明boot table的方法是否正确,即FLASH_TEXT_START,
RAM_TEXT_START,TEXT_SIZE等类似变量的使用?
B 步骤2中的boot loader没有对EMIF16和PLL进行初始化,是否可以进行正常搬运,
另外C6678是否兼容C6455的汇编指令?
C 步骤2中hex CMD文件是否正确,特别是“memwidth”,“romwidth”以及“len”
三个设置项的设置(考虑待NOR FLASH为16bit位宽)?
D 步骤4中是否需要“-swap”参数?
E 步骤5中读取文件与烧写流程是否合理?
F 整个.out文件生成到.bin文件生成的过程以及所使用的转换工具是否正确?
在线等。
能否将你的.cmd文件和用汇编编写的程序翻译一下,解释一下功能,谢谢。
本来我的理解是工程只要用c语言对DSP进行初始化即可,实现gel文件的部分功能,可惜在网上一直没有找到这样的例子。
请问:“第二步中的.cmd文件的变量“memwidth”和“romwidth”设置为16“和“第五步中将.bin文件写入NorFlash时使用2个byte操作”两者之间没有必然的联系吧?
我在第五步中读取.bin文件和对Nor的烧写是使用int型操作的,即每次读取和写入4个byte。
这样是可以的吧?谢谢。
您好!
我也最近研究emif-nor-boot引导, 我的nor:S29GL01GS11DHIV1芯号,不知道您是否引导成功,能否交流下。QQ:2195636160,
谢谢您的分享:
我是按您说的一步一步做下来的。但未成功,有几个问题,请教您一下。
1.我想知道它是否搬移完成,我如何调试这段汇编?
2.PC指正到底是调到那个地址处,我如何知道???
3.当我用norwrite工具写完后,emif-boot-nor引导,上电连连接仿真器,在ox70000000处,没看到有数据啊,这是怎么回事??
楼主您好,我最近刚刚接触6678,自己做的板子,没有用I2C和SPI,直接通过EMIF16总线挂接的一片Nor Flash, 型号S29GL01GS11TFIV10(16-bit位宽),参考了您这个帖子的bootloader和link.cmd,最后生成的dat烧写进去之后自启动不成功,挂仿真器连接DSP发现PC指针在0x70000004 (flash起始地址),并未完成搬移和跳转,您遇到过类似的问题吗? hex6x转换的cmd文件里面 memwidth 和 romwidth 两个参数 16 32 都设置过,转出来的文件分别烧写进Flash都无法启动