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.

[FAQ] 关于boot的总结

Other Parts Discussed in Thread: CCSTUDIO, OMAP-L138, SYSBIOS

本人总结了关于TI DSP的boot原理,格式,以及参考代码供大家参考。不足之处,敬请指正。

2014.12.8: 更新:改成CCSV5.5工程,内容稍做修改与简化。

也可以参考Starterware里的bootloader example,说明如下:

C6748 StarterWare Booting And Flashing

Contents

The StarterWare Bootloader[edit]

The StarterWare bootloader is a platform-specific helper application that makes it easy to transition from running a StarterWare application in a debug context (i.e. in Code Composer Studio with a GEL file) to a production context (i.e. running the application automatically when the board is powered on). The bootloader acts as an intermediary between the ROM bootloader (RBL) and the application. During boot, the StarterWare bootloader takes the following actions:

  1. Applies common PLL and DDR/EMIF settings
  2. Copies application program and data sections from flash memory to DDR
  3. Jumps to application entrypoint

If the bootloader encounters an error during boot, it prints diagnostic messages to the UART console.

The StarterWare bootloader comes pre-built with the standard installation and typically does not need to be modified or rebuilt unless you want to port it to a custom hardware platform. The prebuilt binary can be found in the following location:

<StarterWare Installation Path>/binary/armv5/<toolchain>/c6748/evmC6748/bootloader/Release/boot.out

Booting a StarterWare Application[edit]

Binary Image Generation[edit]

Booting a StarterWare application requires two binary images:

  1. An AIS file containing the StarterWare bootloader
  2. A binary file containing the application

These images are generated using two separate tools, both of which are included in the tools folder of the standard StarterWare installation.

Using AISgen to Create the Bootloader AIS File[edit]

The AISgen GUI can be used to generate the StarterWare bootloader AIS file. All of the critical settings are located on the General tab of the AISgen GUI:

  • Boot Mode - Set to SPI0 Flash
  • Application File - Set to bootloader .out file
  • AIS Output File - Desired AIS file name/path

The AISgen tool has many options to configure the device at boot time, but these are generally not necessary since the StarterWare bootloader will boot very quickly and apply its own configuration immediately. The following screenshot shows the typical settings that should be specified to generate the bootloader AIS file. Simply click the Generate AIS button to create the AIS file.

NOTE
You will typically need to generate the bootloader AIS file only once. That same AIS file can be used with any number of different applications.

Using out2rprc to Create the Application Binary[edit]

The out2rprc command line utility is used to generate the application binary image. This tool strips out the initialized sections from the executable file (i.e. *.out) and places them in a compact format that the StarterWare bootloader can understand. Generating this binary file is very simple:

$> out2rprc.exe [application].out [application].bin

The output (bin) file is typically much smaller than the original executable (out) file.

Flashing the Application[edit]

Once you have generated both binary images (i.e. the AIS and bin files described above), you are ready to flash these images to the EVM's SPI flash memory. This can be done using the standard serial flasher utility that's included in the tools folder of the standard StarterWare installation:

  1. Set the boot switches for UART2 boot (5:8 = 0011 on EVM)
  2. Run SFH from the command line:
    • $> sfh_OMAP-L138.exe -flash -targetType C6748 [bootloader].ais [application].bin
  3. Power on or reset the EVM

The SFH tool may take several minutes to complete depending on the size of the application. When SFH completes successfully, your application is ready to boot.

NOTE
The SFH tool automatically adds simple header information to the application binary file. This header tells the bootloader basic information about the application contents, including its total size in bytes.

Booting the Application[edit]

After the binary images have been flashed to the EVM, the application is ready to boot. This is as simple as setting the boot switches for SPI0 flash boot (5:8 = 0000 on the EVM) and powering on or resetting the board.

During boot, control passes from the ROM bootloader to the StarterWare bootloader, which configures the system and loads the application. Finally, the bootloader jumps to the application entrypoint. The overall process is summarized in the following diagram.

Boot_DSP_on_SOC_V0.2.zip
  • 你好,这个可以用在ARM和DSP都是裸机的情况下吗?

  • 你好,这个本身就是在祼机下的例子。

  • 你好,有两个问题想请教

    1  。 对于nandflash的烧写,只需要修改AISgen内的选项就可以么?还是需要修改arm工程文件

    2  。 omapl138芯片的EMA_WAIT[0]引脚连接nandflash的R/B引脚,没有加上拉电阻,有什么影响

    谢谢

  • #1. AISGEN里选择目标文件的启动类型,与烧写这个动作本身没有必然关系?你用的是那个烧写工具呢?

    #2. 只要信号线上不会出现过多的噪声,或者信号质量不好,就关系不大。

  • 你好,我也是用的合众达138,你的问题现在解决了吗?不知道用合众达提供的NANDWRITER要作那些配置呢,谢谢

  • 使用的是nandwriter工程烧写,但发现,如果在arm里使一些端口,通过wiki上下载的debug的gel文件观察,发现bootmode会改变所以不清楚是不是需要修改arm工程文件?

  • 另外,单独引导dsp程序,我的板子上没有外加的led灯,需要烧写其他dsp程序,自己的工程烧写进去,怎么看有没有烧写成功?在自己的工程中加入了led工程中的led.asm文件,修改了工程属性--加入_my_boot,修改了cmd(没按你给的工程内的cmd文件修改,感觉完全 看不懂,是按wiki上的例程中的cmd文件修改的),不知道还需要其他操作不?

  • 你好,你弄好了吗?能不能加下好友,企鹅..九二四一一五九六八

  • 你好:

    Tony Tang,我按照WIKI上的办法用ARM引导DSP,ARM端用的是是共享内存的一部分,DSP段C_init00是从0x11801000开始,DSP里执行的是LED的闪烁程序和GPIO高低电平的轮流输出,ARM里执行的是DSP的唤醒程序和像未使用的共享空间写入两个数据的程序。

    1.现在是在仿真情况下可以正常运行,DSP端可以读到ARM端在共享内存里的数据。但是,按照在烧写裸机程序的时候,拨码开关(01,NADFLASH boot mode),在ARM端运行flashwriter.out(合众达自带的),然后再根据提示输入 armais->.bin(AISgen合成ARM和DSP产生的bin文件)->NAND boot preparation was successful!->断开仿真器连接->板子复位->但是GPIO口没有波形,说明板子并没有加载程序运行。

    2.还有就是,仿真的时候发现如果ARM端不加GEL文件,led灯不亮,GPIO口有波形输出,在主函数里已经对板子初始化了(合众达给的初始化模块)。不知是什么原因。是不是烧写的时候GEL文件也要考虑进来?

    3.ASIGEN里device版本和我的开发板保持一致,NANDFLASH的CS3选项是默认的?其它模块CPU时钟配置300M,PSC块全部都选了,由于没用到DDR2,所以这都没设置。ASIGEN设置的有问题吗?

    我把我的工程添加到附件(只是ARM端的),希望能得到您的点拨

    ARM.rar
  • #1. 确认ARM跑起来了吗?是否跑到while(1)了?

    while(1)
      {
       int i;
       *AWLED=0;
        for(i=0;i<0x000fffff;i++);
        *AWLED=3;
        for(i=0;i<0x000fffff;i++);
      }

    #2. DSP的程序加载起来了吗?

    #3. 脱机跑时,需要在程序中做初始化。

  • shuxiong jia 说:

    另外,单独引导dsp程序,我的板子上没有外加的led灯,需要烧写其他dsp程序,自己的工程烧写进去,怎么看有没有烧写成功?在自己的工程中加入了led工程中的led.asm文��,修改了工程属性--加入_my_boot,修改了cmd(没按你给的工程内的cmd文件修改,感觉完全 看不懂,是按wiki上的例程中的cmd文件修改的),不知道还需要其他操作不?

    我提供的例子仅仅是为了说明3点必要的过程:

    #1. 如何将ARM与DSP的程序合成一个AIS文件。

    #2. AISGEN里需要做的必要的配置:使能DSP(这里是Module Reset, 为的是让ROM code能把DSP代码搬到L2 RAM)。

    #3. ARM的代码里初始化DSP的入口地址,释放DSP的LRST,让DSP运行起来。

    自己的实现不需要拘泥于我的例子的代码,只要做了以上三点即可。

  • 脱机跑,只是通过看LED和GPIO的输出。仿真的时候都可以跑的。现在是当我把SYS_REGS->HOST1CFG = 0x800010000时,对应的DSP端的cinit也映射到0x800010000,DSP端的CMD全都映射到0x800010000后的shareram,arm端的cmd都配置成 0x800000000开始到0x800010000的范围里是可以的,下到板子里DSP端的程序可以跑起来了(通过看GPIO口和led灯闪烁)。但是,arm里SYS_REGS->HOST1CFG = 0x11801000,dsp端的CMD都配置到 0x11801000开始的范围,加载不起来,这是什么原因?

  • AISGEN里没有在PSC里使能DSP吧。

  • OK,问题解决,调着调着给漏了,谢谢您的指导!

  • 你好:

          Tony Tang,基本的ARM+DSP引导烧写已经可以脱机工作了,感谢您的指导。但是我想再请教下你,在网上看到好多帖子,说这种方式是通过ARM引导了DSP,把主动权交给了DSP,这是不是说这样一来ARM就不能同时工作了?但是我之前的确是在ARM端完成了共享空间的某个地址的周期性地写入数据,在DSP端去周期地读数据,控制LED的亮与灭,这样也实现了。所以就有疑惑,就是想确定在这种方式下,ARM端和DSP端能否可以同时工作,可以同时去控制不同外设吗?(我的想法是ARM端用串口中断和上位机进行指令传输,数据量很小,传完指令就放在指定的共享内存里,ARM端的数据交互不需要和DSP保持同步。DSP端负责EDMA数据采集,AD,算法实现等,每次处理数据前,都去读共享空间里ARM里放的数据。在这种情况下可行吗?)。谢谢~

  • 当然可以,本来就是在同时工作的。只是流程上ARM启动DSP,然后各干各的。可以通过CHIPSIG互发中断信号。

  • 谢谢您的指导。

  • hi, tony

    如果我不用linux,而是用自己写的操作系统,boot的时候还需不需要UBOOT?

  • 个人写的操作系统,我想多数相对简单,类比如TI提供的DSP BIOS,或SYSBIOS,并不需要UBOOT,UBOOT我的理解是提供了一系列的工具,以及搬运加载内核,配置传递参数,是一套大家约定俗成的工具而已,不是必须的。

    还有,对于芯片boot过程,只有加载用户代码的一个过程,如UBL,UBoot已经属于用户应用层面的了,与芯片boot无关。

  • tony,much thanks!

    我是初学者,现在老师给的任务是做138的bootloader,要实现通过按RESET键把整个系统启动起来,操作系统是自己写的,希望你能给点建议,我该怎样一步一步的做,感谢!      还有能不能告诉我你的QQ,有问题了请教你

  • awaken huang 说:

    tony,much thanks!

    我是初学者,现在老师给的任务是做138的bootloader,要实现通过按RESET键把整个系统启动起来,操作系统是自己写的,希望你能给点建议,我该怎样一步一步的做,感谢!      还有能不能告诉我你的QQ,有问题了请教你

    你就当Uboot是你的系统呗,可以用UBL来加载启动UBOOT,也可以直接把uboot的bin文件转换成AIS格式,直接启动。

  • TONY

    你好

    我想问下,nandwrite工程的.CMD文件设置的该程序所有变量都在DDR2内,CMD内的各段都改成ARM的ram或者共享ram里?我们的DDR2不能用

    这两段是什么意思

    .aemif_mem :
    {
    } > AEMIF
    .ddrram :
    {
    } > DRAM, RUN_START(DDRStart)

  • shuxiong jia 说:

    TONY

    你好

    我想问下,nandwrite工程的.CMD文件设置的该程序所有变量都在DDR2内,CMD内的各段都改成ARM的ram或者共享ram里?我们的DDR2不能用

    这两段是什么意思

    .aemif_mem :
    {
    } > AEMIF
    .ddrram :
    {
    } > DRAM, RUN_START(DDRStart)

    RUN_START(DDRStart)是为了定义全局变量DDRStarat,其初始化值为DRAM的首地址,在memory部分定义的,在程序中可以访问DDRStart。

    下面语句就是一个通用给段为配memory的语句,你是不是改动过?

    .aemif_mem :
    {
    } > AEMIF

    在serial flash tool里带的Nandwriter里的定义如下,都差不多,明白是这个作用就行了:

      .aemif_mem :
      {
      } > AEMIF_CS3, RUN_START(NANDStart)
      .ddr_mem :
      {
        . += 0x0E000000;
      } run = DRAM,type=DSECT, RUN_START(EXTERNAL_RAM_START), RUN_END(EXTERNAL_RAM_END)

     

  • 请问你是每次都有这个问题还是偶尔才会有DSP起不来的现象

  • OMAPL138_ARMbootDSPCoff 这个工程里的dsp工程我用ccs5.4打开不了,后来我自己新建了个工程再把文件添加进去就可以了。

    然后这个事armload dsp,然后中断dsp,dsp在中断里i2c口操作。

    请问改成不停的互相触发怎么改呢? 

  • ARM与DSP之间可以通过CHIPSIG寄存器互相发送中断信号。

  • 是的,我就是用这个寄存器的,但是现在问题是我只能相互触发一次,然后程序就在ARM里不执行了

  • 是代码的bug,DSP的ISR前没有加interrupt关键字。

  • 请问一下有关于.aemif_mem :   {   } > AEMIF_CS3, RUN_START(NANDStart)   .ddr_mem :   {     . += 0x0E000000;   } run = DRAM,type=DSECT, RUN_START(EXTERNAL_RAM_START), RUN_END(EXTERNAL_RAM_END)这段代码的资料解释吗?我还是不能理解这段代码的含义

  • 这里有一个人写的中文博客可以看看。

    http://my.oschina.net/alphajay/blog/98391

    另外在spru186这个文档里有详细说明:

    http://www.ti.com/lit/ug/spru186w/spru186w.pdf

  • Hi,Tony

    我试了一下你的\Boot_DSP_on_SOC_V0.2\OMAPL138_ARMbootDSPCoff\,未能获得如期效果,特向你请教一下:

    1、在连仿真器单独加载各自.out文件的情况下,ARM和DSP通过reset+F8可以按预期效果跑起来。

    2、仿真器仅连ARM,然后load ARM的.out文件,从main()入口处F8,DSP无半点反应(LED没闪,DSP初始化中加的printf打印信息也没有)。

          但我单步运行ARM程序的loadDSP()函数看过,share memory对应的空间应该都加载了DSP的.out文件——因为.out文件无法解析二进制数据出来,所以没法进一步比对shared ram里的内容是否与DSP的.out一致。

    说明:

    1、我用的瑞泰的ICETEK-OMAPL138-KB板子。

    2、板子上boot[1]~boot[4]全高——照理说ARM连仿真器运行然后加载DSP的.out文件应该跟我板子上的boot引脚没关系的吧?

    另外,程序我稍微改了一下:

    你V2程序中ARM通过CHIPINTx触发DSP的isr,然后DSP在isr中回应触发ARM的CHIPINTy isr——这个只能进一次,从而DSP的isr也只能进一次。

    我改成两者都可以重复进的了——这个应该没关系吧。

    还有,DSP的main()中DSP_enable_interrupts()第一句IER=0x3002;——该操作其实直接就把IER.bit4给清掉了,理论上说V0.2的DSP中断应该进不去才对……

    对了,为何DSP程序初始化时没有类似于把中断服务程序函数名赋给中断向量表的操作呢?这个跟C2000不一样,有点不习惯……

  • 有点小问题,稍稍改了一下。在使能DSP这部分的步骤还不太完善,有时间还补实一下,目前每次从断电起来是可以成功运行的。

    OMAPL138_ARMbootDSPCoff.zip
  • Tony, 你好,按照你新提供的例程我试了,还是没看到DSP跑起来,你觉得哪里会出问题呢?

    或者怎么通过只连接ARM的情况下观察哪些registers的信息可以判断DSP的状态呢?

  • Hi, Tony,有些新进展和新问题需要请教一下:

    经过调整,现在可以在第一次上电后,连接ARM并下载其.out文件运行,然后成功加载DSP .out文件并获得预期的LED闪烁功能(之前LED无法闪烁是PSC的缘故)。

    但还是有些细节问题:

    1、ARM程序的isr中的aintcRegs->SECR1赋值与SYS_REGS->CHIPSIG_CLR赋值语句先后需调换一下,否则DSP侧的一次CHIPINTx触发ARM会响应进入两次isr。

    2、我这边只能是上电第一次加载运行ARM程序可获得正常结果,如果在不断开仿真器不重新上电情况下,ARM核halt-->system reset-->restart -->run,从打印信息上看ARM的isr只能进去一次,而且DSP侧的LED闪烁也没有了。这个不知为何。

    3、因2猜测是不是非断电reset ARM重新运行时,其实DSP此前的程序运行并未正常停止并被reset?由此引申出一个问题:

          如果在不掉电情况下,ARM要warm reset或称为soft reset DSP从头开始,如何可以做到?是不是要先把DSP sleep再wake up然后加载?

  • 是的,要RESET DSP才能重新加载运行DSP,而且RESET DSP还有一步要实现,使能PDC中断,并在PDC中断里要进入Idle,不然RESET不了。这就是我说的准备要加上去的。你如果有兴趣与时间,自己先实现一下吧。

    The following sequence should be executed by the DSP within the PDC interrupt ISR:
    1. Check for completion of all DSP master requests (the DSP polls transfer completion statuses of all
    Master peripherals).
    2. Enable the interrupt to be used as “wake-up” interrupt (for example, one of the CHIPSIG interrupts
    controlled by the chip signal register (CHIPSIG) in the System Configuration (SYSCFG) Module
    chapter—CHIPSIG[2], CHIPSIG[3], or CHIPSIG[4]/NMI interrupt) that will be used to wake-up the DSP
    during the DSP clock-on sequence.
    NOTE: The power-down command register (PDCCMD) in the power-down controller (PDC) can only
    be written while the DSP is in Supervisor mode.
    3. Write a 0001 5555h to PDCCMD.
    4. Execute the IDLE instruction.

  • Jingang Yang 说:
    或者怎么通过只连接ARM的情况下观察哪些registers的信息可以判断DSP的状态呢?

    DSP状态看MDSTAT15

  • Tony,你贴出来的这写内容我也在TI的文档上看到了,因为你在新版的程序中添加了个PDC_interrupt_ISR(),当时不知道是干嘛用的,就检索了一下。

    但是其实现在我也还没搞懂这个PDC是具体怎么用的,它跟ARM的上电及启动时序是如何匹配的。

    你能否稍微介绍一下ARM侧应操作哪些步骤,从而可以使得DSP响应PDC isr,最终实现在线reset DSP?我可以按照你的思路先去实践一下。

    另外,nand bootloader的操作文档和例程有没有?我想,连仿真器情况下ARM可以加载硬盘上的DSP程序,那接下来可以实施ARM加载NAND中的DSP程序,最终都从NAND进行bootloader。这块我还没真正入门……

  •  我只是把PDC暂时加进去了,还没有测试。我理解的是在ARM执行复位并等待返回状态时会触发DSP PDC中断,当DSP进入PDC中断执行到idle时,ARM则可以等到复位状态。

    我目前发现的是在DSP没有加PDC中断的情况下,ARM重新RESET DSP是等不到状态的。

  • OK,我下午试试看,希望能有个结果,到时候有问题再来更新,或者如果你那边有skype可以上更好,可加我:ragenyoung@hotmail.com。公司邮箱最近在迁移,发不了邮件。

  • Tony,我这样理解对不对:

    DSP运行时要复位它,是不是要先把它Power Down,OK后再Wake-up?

  • 应该搞定了,试过几遍都没有什么问题,Tony。

    主要就是在Wake-up / Clock on DSP之前先把它Reset,直到load操作完成再release。

    接下来我要开始弄nand FLASH boot的问题了,\OMAP-L138_FlashAndBootUtils_2_40\OMAP-L138\CCS\NANDWriter这个工程直接CCS5.5打开编译没错,但是printf()会跑飞,不知为何?

  • Jingang Yang 说:

    应该搞定了,试过几遍都没有什么问题,Tony。

    主要就是在Wake-up / Clock on DSP之前先把它Reset,直到load操作完成再release。

    DSP端加了PDC中断了吗?是要RESET, 再load,再local dereset.

    Jingang Yang 说:
    \OMAP-L138_FlashAndBootUtils_2_40\OMAP-L138\CCS\NANDWriter这个工程直接CCS5.5打开编译没错,但是printf()会跑飞,不知为何?

    如果是你自己的板子,检查一下device.c里的DDR的时序配置是否有正确.

  • Tony Tang 说:

    DSP端加了PDC中断了吗?是要RESET, 再load,再local dereset.

    DSP侧的PDC基本沿用你的,但是=0x00015555我改成了|=1<<16也能过就没改回来。

    但有一点,ARM单步运行时DSP侧PDC_int_isr内的断点没法到达(都连仿真器的时候),但是如果屏蔽PDC_int_isr,的确无法re-load DSP,所以是必须的。

    Tony Tang 说:

    如果是你自己的板子,检查一下device.c里的DDR的时序配置是否有正确.

    这个我倒没注意,一般我都认为.gel已经把DDR配好了,直接用应该OK。我一会儿查查。
    我先把ARM load DSP的工程改成load至DDR而不是内部共享ram看看能否搞定。
  • 你好

    1.我在wiki上看到关于138 MCSDK里写到

    For a Windows host, run the mcsdk_<build-id>_windows_setup.exe executable.

    但是实际文件夹中只有C:\ti\mcsdk_1_01_00_02\setup.sh

    请问我该怎么处理?

    找不到别的地方问!见谅

  • 你好

    请问OMAP138是不是有像28M35一样有对外设的控制权的划分,就是哪些外设有ARM核管理,哪些是C核管理?

  • 这个好像没有,但是如果ARM用了的外设DSP当然就应该再用了,否则不就打架了么……

    GPIO貌似都公用的

  • MIKI JIANG 说:
    For a Windows host, run the mcsdk_<build-id>_windows_setup.exe executable.

    这里说的你下载的安装的执行文件,安装完才会有你后面提到的目录。比如:mcsdk_1_01_00_02_setupwin32.exe,所以你肯定已经做完这一步了。

    MIKI JIANG 说:
    C:\ti\mcsdk_1_01_00_02\setup.sh

    这样是安装完后目录下的环境设置脚本,但这个 .sh应该是给linux环境下用的。

  • MIKI JIANG 说:
    请问OMAP138是不是有像28M35一样有对外设的控制权的划分,就是哪些外设有ARM核管理,哪些是C核管理

    所有外设都是共用的,都可以访问,没有独用特性的。