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.

DSP6748 NAND启动问题



有人能提供一下6748单核的nand启动说明和程序例程吗,还有AIS数据格式说明,nand启动不需要编写二次boot吧,关于nand启动能详细介绍一下逻辑吗,谢谢

  • 你好,

    1. 如果你的nand flash device 不在下面文档第30页上的Table 12. List of Supported NAND Devices列表里, 说明ROM bootloader支持, 不需要二次boot, 否则, 需要先从别的boot mode把二次boot加载运行, 再去boot nand flash中的应用程序.
    http://www.ti.com/lit/an/spraat2e/spraat2e.pdf

    2. ais数据格式说明, 可以参考上面的文档第4 Application Image Script (AIS) Boot章

    3. nand flash boot的详细介绍, 可以参考下面的wiki网站.
    http://processors.wiki.ti.com/index.php/Davinci/Sitara/Integra_Nand_Boot_FAQ

    4. 我们有提供nand flash烧写工具, 通过串口或者通过ccs.
    https://sourceforge.net/projects/dvflashutils/files/OMAP-L138/v2.40/
    http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility_for_OMAP-L138

  • 谢谢的你的回答,现在还有有点疑惑,

    1. 如果你的nand flash device 不在下面文档第30页上的Table 12. List of Supported NAND Devices列表里, 说明ROM bootloader支持, 不需要二次boot, 否则, 需要先从别的boot mode把二次boot加载运行, 再去boot nand flash中的应用程序. http://www.ti.com/lit/an/spraat2e/spraat2e.pdf

    现在我用的nandflash型号:K9F4G08U0A,具有4096个block,每个page为2048+64,共有4Gbit,不在列表中,也就是这个nandflash不能利用dsp固有的bootloader来加载启动应用程序是吗,必须通过其他的bootloader来加载二次bootloade,然后在加载应用程序啊吗

       还有文档中提到的fourth ID byte是什么意思,在哪里体现出来,这个字节应该放在那里。

     

     


     

  • 我看了一下K9F4G08U0A数据手册, 它的4th ID符合c6748 bootloader文档上Table 13. Expected Contents of Fourth ID Byte for NAND Devices Listed in Table 12 With Sizes Greater Than 128 MB, 所以C6748 RBL支持这款NAND flash.

    Nand flash有个READ ID (0x90 at Address 0x00, 当RBL往nand flash地址0写0x90后, 会返回5个bytes, 其中第四个byte包含了NAND flash的page size, block size等信息, RBL通过4th ID判断是否支持该款NAND flash. 我之前发的wiki网站上关于如何判断RBL是否支持NAND flash有详细的介绍, 请仔细看一下.
    http://processors.wiki.ti.com/index.php/Determining_compatibility_between_ROM_Bootloader_(RBL)_and_Raw_NAND_devices

  • 很感谢你的回答,我按着方法把我的应用程序烧到nandflash中,可是不能运行。不知道什么原因,我把烧写的方法说一下,看看有什么问题没有。

    1,应用程序在仿真器下运行是没问题的,其实程序很简单, 就是点亮一个指示灯。通过io口。放着运行没问题,并且应用程序配额制psc和pll还有io口。

    2、通过aisgen把生成的。out文件转换为ais文件,其中aisgn中选择nandflash,地址为0x62000000,没有配置其他的,只是配置了pinmux,按着nandflash的引脚进行配置,其中配置pinmux和没有pinmux配置,都做过实验,烧到nandflash中都不能运行。

    3、通过仿真的形式,把。ais文件烧写到block1中,并且读出来跟ais文件一样,没有错误。

    4、把bootpin的引脚配置为00001110,然后重新上电,不能启动。    我不知道这样还有什么问题没有,其中nandflash用的是三星的K9F4G08U0B,读出里面的ID为dev_id[0]: 0xEC dev_id[1]: 0xDC dev_id[2]: 0x10 dev_id[3]: 0x95 dev_id[4]: 0x54 。第四个为0x95不知道是不是满足RBL。

  • 4th ID 0x95dRBL, 所以支持的.

    确认一下你程序的入口地址在0x62000000?

  • 关于AISGEN的设置如上图,然后就是这样把生成的ais烧进到nandflash中的block1中。
    程序是仿真能够运行的,.text          >  DSPL2RAM  
    现在烧进去不能启动,不知道那里设置问题?
  • 电路板是SEED_DEC138的开发板,把之前的L138更换为DSP6748,硬件NAND的CS为CS3,0x62000000是没错了,因为我在写nand和读nand的时候都是操作的0x62000000.

     

  • CS3 Setup这个选项表示CE3CFG寄存器的设置, 不是入口地址设置.

  • 还是没有搞定啊,烧进去不能启动,程序很简单,就是一个IO口输出一个高低电平。程序

    主程序:

    void main(void)
    {
    u16 i;

    EVMOMAPL138_init(); //初始化psc与pll
    interrupt_init();  //禁止所有中断
    GPIO_Init();   //初始化io口
    i=0;
    while(1)
    {
    i=0;
    i++;
    GPIO_BANK67->OUT_DATA &= 0xFFFFDFFF; //0
    GPIO_BANK67->OUT_DATA |= 0x00002000; //1
    i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
    i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;
    i++;i++;i++;i++;i++;i++;i++;i++;i++;i++;

    GPIO_BANK67->OUT_DATA &= 0xFFFFDFFF; //0
    if(i>20) i=0;
    for(i=0;i<10000;i++);
    }
    }

    intvecs.asm程序如下:
    ; Global symbols defined here and exported out of this file
    .global _intcVectorTable
    .global _c_int00
    .global _vector1 ;nmi
    .global _vector2 ;
    .global _vector3
    .global _vector4
    .global _vector5
    .global _vector6
    .global _vector7
    .global _vector8
    .global _vector9
    .global _vector10
    .global _vector11
    .global _vector12
    .global _vector13


    ; This is a macro that instantiates one entry in the interrupt service table.
    VEC_ENTRY .macro addr
    STW B0,*--B15
    MVKL addr,B0
    MVKH addr,B0
    B B0
    LDW *B15++,B0
    NOP 2
    NOP
    NOP
    .endm

    ; This is a dummy interrupt service routine used to initialize the IST.
    _vec_dummy:
    B B3
    NOP 5

    ; This is the actual interrupt service table (IST).
    .sect ".vecs"
    .align 1024

    _intcVectorTable:
    _vector0: VEC_ENTRY _c_int00 ;RESET
    _vector1: VEC_ENTRY _vec_dummy ;NMI
    _vector2: VEC_ENTRY _vec_dummy ;RSVD
    _vector3: VEC_ENTRY _vec_dummy ;RSVD
    _vector4: VEC_ENTRY _vec_dummy ;isr0
    _vector5: VEC_ENTRY _vec_dummy ;isr1
    _vector6: VEC_ENTRY _vec_dummy ;isr2
    _vector7: VEC_ENTRY _vec_dummy ;isr3
    _vector8: VEC_ENTRY _vec_dummy
    _vector9: VEC_ENTRY _vec_dummy
    _vector10: VEC_ENTRY _vec_dummy
    _vector11: VEC_ENTRY _vec_dummy

    cmd文件


    -l rts67plus.lib
    -stack 0x00000800 /* Stack Size */
    -heap 0x00000800 /* Heap Size */
    MEMORY
    {
    DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 Internal ROM */
    DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 Internal RAM */
    DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 Internal Program RAM */
    DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 Internal Data RAM */
    SHDSPL2ROM o = 0x11700000 l = 0x00100000 /* 1MB L2 Shared Internal ROM */
    SHDSPL2RAM o = 0x11800000 l = 0x00040000 /* 256kB L2 Shared Internal RAM */
    SHDSPL1PRAM o = 0x11E00000 l = 0x00008000 /* 32kB L1 Shared Internal Program RAM */
    SHDSPL1DRAM o = 0x11F00000 l = 0x00008000 /* 32kB L1 Shared Internal Data RAM */
    EMIFACS0 o = 0x40000000 l = 0x20000000 /* 512MB SDRAM Data (CS0) */
    EMIFACS2 o = 0x60000000 l = 0x02000000 /* 32MB Async Data (CS2) */
    EMIFACS3 o = 0x62000000 l = 0x02000000 /* 32MB Async Data (CS3) */
    EMIFACS4 o = 0x64000000 l = 0x02000000 /* 32MB Async Data (CS4) */
    EMIFACS5 o = 0x66000000 l = 0x02000000 /* 32MB Async Data (CS5) */
    SHRAM o = 0x80000000 l = 0x00020000 /* 128kB Shared RAM */
    DDR2 o = 0xC0000000 l = 0x20000000 /* 512MB DDR2 Data */
    }

    SECTIONS
    {
    .text > SHRAM
    .stack > SHRAM
    .bss > SHRAM
    .cio > SHRAM
    .const > SHRAM
    .data > SHRAM
    .switch > SHRAM
    .sysmem > SHRAM
    .far > SHRAM
    .args > SHRAM
    .ppinfo > SHRAM
    .ppdata > SHRAM
    .vecs > SHRAM
    /* COFF sections */
    .pinit > SHRAM
    .cinit > SHRAM

    /* EABI sections */
    .binit > SHRAM
    .init_array > SHRAM
    .neardata > SHRAM
    .fardata > SHRAM
    .rodata > SHRAM
    .c6xabi.exidx > SHRAM
    .c6xabi.extab > SHRAM
    }

    关于生成bin文件时,用不用配置pll0, psc与pinmux等啊, 我程序里都配置了这些, 具体配置这些在什么时候用到,那一步用到了,能简单说明一下吗?

    现在cs3 setup 为0x3FFFFFFC。烧到第一块nandflash中,不能启动。

    还有关于6748单核的例程,最好简单一点的,给我一个例程最好。谢谢。因为ti官网很多,里面很多文件那些有用那些没用,都能不好。

    谢谢

  • aisgen工具对外设的这些配置是在bootloader加载程序前, 先根据aisgen生成的bin件中对外设寄存器的配置值去初始化外设后再加载程序, 如配置pll0可以加速加载速度, 配置DDR, 可以把程序加载到片外DDR, 这些你都可以仔细看一下bootloader文档找到答案.

    "烧到第一块nandflash中"是block1还是block0?

    你用仿真器跟过bootloader吗? 跟一下看程序是没搬进来还是搬进来后没正确执行? 

  • 我现在是按着aisgen配置完成了,生成bin文件后,然后断开仿真器后,设置nand启动模式,dsp确实去读nand的数据了,并且有读的信号,用示波器观察,可是没有搬到内部ram中,没有把应用程序搬到指定的ram位置中。 

    但是写到nandflash的数据读出来是正确的,现在怀疑写到nandflash中的数据,是不是也要把块与页的信息加进去啊,ecc信息什么,这个需要加进去吗。感觉dsp去读nandflash数据了,可是发现不正确,或者什么原因,没有读取成功的样子

  • 你参考的SEED_DEC138, 这块板子上用的flash也是K9F4G08U0A, 你找合众达看看有没有例程.

  • 请问这个NANDFLASH加载问题是怎么解决的呢?我也遇到NANDFLASH不能成功加载的问题了