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.

C6678 EMIF16 NOR FLASH BOOT测试实验

本人对C6678 EMIF16 NOR FLASH BOOT进行测试实验,实验过程与问题描述如下,希望有经验的大虾给予帮助:

编译环境CCS5.0.3,在C6678 EMIF16地址0x70000000上外挂一个P30系列的NOR FLASH,规格为16M x 16bit。

  • 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}

    }

  • 3 由第二步的.hex文件转换为.dat文件,转换工具b2ccs.exe(C:\

     Program Files\Texas Instruments\mcsdk_2_00_05_17\tools\

     boot_loader\ibl\src\util\btoccs)输入参数为:

     mwg519a_test.hex mwg519a_test.dat。

  • 4 由第三步的.dat文件转换为.bin文件,转换工具ccs2bin.exe(C:\

     Program Files\Texas Instruments\mcsdk_2_00_05_17\tools\

     boot_loader\ibl\src\util\btoccs)输入参数为:

     mwg519a_test.dat mwg519a_test.bin。

     这里一个问题是是否需要使用“-swap”参数?

  • 5 NOR FLASH烧写:

     NOR FLASH烧写程序是自己写的,已经通过读写测试验证。具体流程

     是使用fopen以“RB”模式打开输入文件“mwg519a_test.bin”,每

     次读出两个byte,然后写入NOR FLASH(从0x70000000开始)。

     这里一个问题是在读取输入文件“mwg519a_test.bin”到写入NOR

     FLASH的过程中是否会引起烧写文件的乱序问题?

  • 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文件生成的过程以及所使用的转换工具是否正确?

    在线等。

  • 按上述流程可以正常引导启动,已经通过实验验证。

    另外需要注意的是,在进行引导测试之前要保证DSP对FLASH的读写正常,本人之前实验一致不成功就是因为DSP与FLASH两者的复位信号没有处理好导致DSP对FLASH读出错。

  • 您好~请问您用这种方式通过SPI加载,按照您的流程下来后,boot pin的设置是怎样的??我按照您的流程,但是我用的是mcsdk中的nor writer将转换好的.bin文件烧到flash后,设置BOOTMODE[12:0]=0b0000000100110后,并没有加载成功。希望能指点下,谢谢~~

  • 能否将你的.cmd文件和用汇编编写的程序翻译一下,解释一下功能,谢谢。

    本来我的理解是工程只要用c语言对DSP进行初始化即可,实现gel文件的部分功能,可惜在网上一直没有找到这样的例子。

  • 请问:“第二步中的.cmd文件的变量“memwidth”和“romwidth”设置为16“和“第五步中将.bin文件写入NorFlash时使用2个byte操作”两者之间没有必然的联系吧?

    我在第五步中读取.bin文件和对Nor的烧写是使用int型操作的,即每次读取和写入4个byte。

    这样是可以的吧?谢谢。

  • 你好,请问你使用的Nor-Flash具体是什么型号呢

  • 您好!

             我也最近研究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都无法启动 

  • 楼主你好,请问在sys/bios系统上如何像.cmd文件这样控制分段信息