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.

关于C6745 NOR legacy boot 的问题

Other Parts Discussed in Thread: TMS320C6747, OMAP-L137

现在想用NOR legacy boot方式启动C6745,看了一下官方网站资料,但是有些不清楚:

1.在“Using the TMS320C6747/45/43 Bootloader.pdf”这篇文档中讲到:由于只有十五条地址线,所以bootloader只能读取NOR FLASH中的32KB空间,如果boot image(我理解成就是用户自己的程序)大于32KB的话,就需要二次bootloader。我知道,用AIS boot方式的话,是不需要写二次bootloader的,NOR legacy boot中要写的话,写什么内容?有没有介绍的文档或者网页供参考?如果我的程序不超过32KB,那么不需要写二次bootloader,那要应该怎么用NOR legacy boot方式启动DSP ?

2.processors.wiki.ti.com/.../Secondary_Bootloaders_on_OMAP-L1x

(1)这个网页上讲到二次bootloader,主要讲到NOR Configuration Word,和生成.bin文件。但是看的有点模糊的地方:这上面说控制字要插入到二次bootloader程序中去,给出了汇编代码:

 .global _c_int00

    .sect ".nor_config_word"

config_word:

    .word 0x00000F01

    B _c_int00

    NOP

    NOP

    NOP

    NOP

    NOP

    NOP

这个如何加到程序中,直接建立一个.asm文档可行吗?还是说要加入到一个已有的.哪个文档里面?

(2)在产生.bin文件时用到.out文件,这个.out文件是加入用户主程序后产生的.out文件?还是只用二次bootloader产生的。out文件,与用户程序无关?

3 关于NOR legacy boot 启动C6745,只找到这两篇文档,看完之后还是不大清楚。

希望得到您的帮助,谢谢!

  • 首先来说,在OMAPL1xx这一系列芯片上采用NOR legacy boot方式的很少,我个人目前没见过,也许C6000的忠实用户习惯于这种传统的方式吧。

    再来回答你的问题:

    #1. 15根地址线限制了NOR flash的容量最多32Kbyte,这个与是否采用second bootloader没有直接联系,这里限制的是NOR flash的大小,也就是说,采用与不采用second bootloader,NOR flash还是只能直接支持这么多。至于如何启动,是下面第二点的内容。

    #2. 下面这段代码及网页上给出的cmd文件,是用来产生legacy boot mode image的方法。NOR flash的第一个word为NOR config Word,你例出的这段代码就是将NOR config Word设为0xF01,意思是配成拷贝16Kbyte,接口是 16bit的。

    cmd文件里的相关配置如下,将这个配置字放到image的开始,烧到NOR flash后,NOR flash的第一个字就是0xF01。

    CFG_L2RAM:    o = 0x11800000  l = 0x00000020

    .nor_cfg_word > CFG_L2RAM

    单独建立一个asm文件即可。

    (2)顺着你的思路,这个文件是放到second bootloader的。这段代码只是为了在legacy boot mode的bin文件头加NOR flash的配置字。(这种方法只是一种建议方法,用户可以在烧写程序里自己在写bin文件前先往NOR flash的第一个word写上相应的配置字。这里这么做的好处是做成一个整本的bin文件,方便用烧录器等直接使用。)总之明白是什么作用就好了......

    3. 没有其它的文档,Legacy boot的bin文件是内存镜像,.out转换成bin的命令选项为-image,这种格式有一定的限制,(1)代码要连续放置,否则中间的空洞也会占用image的空间。(2)内存要连续,比如一部分代码放share RAM,一部分代码放L2,需要生成不同的文件,而且也没办法由ROM code进行加载,芯片的bootloader规定了Legacy boot的image只能在0x11800004开始的位置运行。

    -b
    -image
    -zero
    -memwidth 8
    -linkerfill
    -fill 0x00000000

    ROMS
    {
      FLASH: org = 0x11800000, len=0x4000, romwidth=8
    }

    如果没有什么特殊原因,我建议还是用其它的模式吧。

    基于直接支持的NOR flash容量问题,可以在用户second bootloader里通过配置IO脚来模拟地址线。不妨跟EVM板一样用SPI flash吧,方便又简单。

     

  • 我现在搞不明白的是:配置字是0xF01,意思是配成拷贝16Kbyte,接口是 16bit的,这里的16KB到底是bootloader程序还是用户自已要实现的主程序,如果是bootloader程序,主要写什么内容?如果是用户程序的话,用户程序大于16KB时要怎么办?

  • #1. 配置字是给芯片的ROM code(bootloader)来读的,所以配置字的信息是告诉ROM code从NOR flash搬多少字节到0x11800000。

    #2. 从芯片的角度,被启动的程序都是用户程序。用户根据功能将之称为second bootloalder和主程序,都是用户的程序。

    #3. 在C6745/7上这种模式最大支持就是16Kbyte,在以前老的C64x,C671x的芯片上,有的只有1Kbyte。

    #4. 在以前的芯片上,用户在这部分代码里实现芯片初始化,搬运主程序的功能。所以如果代码>16Kbyte时,你要在这16Kbyte的代码运行起来后,去搬运你程序,这是用户代码的任务。

    #5. 在C6745/7芯片上,用AIS即可初始化芯片,搬运大小没有限制。

    #6. 不知道你为什么对这种模式感兴趣?

  • 哦 ,我再多学习一下,我看了很多文档,讲的都是AISboot方式,但是现在我们做实验就要求用这种NOR BOOT方式,所以,但是我是初学者,有点一头雾水,谢谢您的指导哈,感谢TI的技术支持网站。我再多学习一下。

  • 您上面讲到:用户根据功能将之称为second bootloalder和主程序,都是用户的程序 那么其中的second bootloalder 要写那些内容,有没有可参考的资料?

  • 在C674x上,TI提供了一个二级bootloader,叫UBL(user bootloader),参考http://sourceforge.net/projects/dvflashutils/files/OMAP-L137/

    工程在目录:OMAP-L137_FlashAndBootUtils_2_40\OMAP-L137\CCS\UBL_DSP

    说明请参考网页:

    http://processors.wiki.ti.com/index.php/Serial_Boot_and_Flash_Loading_Utility_for_OMAP-L137

    二级boot的作用是初始化芯片,搬运用户代码,并跳转到用户代码运行。

     

  • (1)串行引导和并行有什么区别?

    (2)SPRA999A1 这篇文章中讲到的写bootloader的方法能不能用到C674X或者OMAP-L137上面?

  • 原理差不多,稍作修改应该可以移植

  • 1、那个二级boot的话我在cmd文件中看到

    /* MODULE TSK */
    _KNL_swi = 0;

    SECTIONS {
    .idl: {
    IDL_A_TABBEG = .;
    *(.idl)
    IDL_A_TABEND = .;
    IDL_A_TABLEN = (. - IDL_A_TABBEG) / 8;
    IDL_A_CALBEG = .;
    *(.idlcal)
    IDL_A_CALEND = .;
    IDL_A_CALLEN = (. - IDL_A_CALBEG) / 8;
    } > IRAM
    }是不是需要跑sys/BOIS呢?如果不需要跑SYS/BOIS那这些函数是怎么定义的呢?

  • ubl.cmd文件是这样的,没有看到你上面列的。二级boot跟cmd文件没有直接联系。先理清一下思路吧.

    -e start

    IRAMStart = 0x80000000;
    IRAMSize = 0x00008000;
    DRAMStart = 0x80000000;
    DRAMSize = 0x00008000;

    ASYNC_MEM_START = 0x62000000;

    _INTERNAL_RAM_START = 0x80000000;
    _INTERNAL_RAM_SIZE = 0x00008000;

    _STACK_START = _INTERNAL_RAM_START + _INTERNAL_RAM_SIZE;

    MEMORY
    {
    ARM_I_IVT (RX) : origin = 0xFFFFD000 length = 0x00000020

    UBL_TEXT (RWX) : origin = 0x80000000 length = 0x00006800
    UBL_DATA (RWX) : origin = 0x80006800 length = 0x00000800

    UBL_BSS (RW) : origin = 0x80007000 length = 0x00000800
    UBL_STACK (RW) : origin = 0x80007800 length = 0x00000800
    UBL_DRAM (RWX) : origin = 0xC0000000 length = 0x10000000
    }

    SECTIONS
    {

    .text :
    {
    *(.text:.start)
    . = align(4);
    *(.text)
    . = align(4);
    } > UBL_TEXT

    .data :
    {
    *(.const)
    } > UBL_DATA

    .bss :
    {
    *(.bss)
    . = align(4);
    } > UBL_BSS

    .ddr_mem :
    {
    . += 0x10000000;
    } run = UBL_DRAM, type=DSECT, RUN_START(_EXTERNAL_RAM_START), RUN_END(_EXTERNAL_RAM_END), SIZE(_EXTERNAL_RAM_SIZE)

    .stack :
    {
    .+=0x0400;
    } run = UBL_STACK, type=DSECT, SIZE(_STACK_SIZE)

    }