zoukankan      html  css  js  c++  java
  • TMS320DM642启动模式(Bootmode)(转)

    原文地址:http://www.cnblogs.com/xiangai10000/p/JamesYang.html

    在TI官方的文档《TMS320DM642 Video/Imaging Fixed-Point Digital Signal Processor Data Manual(SPRS200)》中“Bootmode”小节讲述了DM642的启动方式。DM642使用低有效RESET信号。当RESET信号为低 时,DM642就复位并被初始化为复位状态。当RESET信号被释放,即电平转换为高,处理器开始运行。DM642有三种启动模式:Host boot、EMIF boot、No boot。实际使用的DM642开发板采用第二种启动模式——EMIF boot。接下来我们仅介绍EMIFI boot。当RESET信号被释放,DM642完成自检后,按照设置的EMIF boot模式启动,通过EDMA自动将CE1空间起始1K-Bytes代码复制到起始地址0处。在这个过程中,CPU停止不运行,这个复制完成后,CPU 从停止状态释放,开始从0地址开始运行。需要注意的是,CE1空间起始1K-Bytes数据要与系统使用的端格式相同,我们使用小端格式。在文档 SPRS200中这样写道,After completion of the block transfer, the CPU is released from the “stalled” state and starts running from address 0.单 词stalled被加上双引号。我认为CPU不是真的停止,而是在运行一级bootloader进行装载二级bootloader,这样就跟我们从书本上 所学的知识联系起来。CPU被释放后,自动运行一级bootloader,配置EMIF和EDMA,使其能够将CE1地址空间起始1K Bytes数据复制到起始地址0处。但是这1k字节大小一般是不足以存储用户的应用程序。因此,CE1地址空间起始的1K字节存储二级 bootloader,由二级bootloader将用户的应用程序和数据加载到RAM中。综上所述,首先,DM642自检后运行一级 bootloader,完成加载二级bootloader的任务。接着,CPU跳转到地址0处运行二级bootloader,完成加载用户的程序和数据。 然后跳转到__c_init_出运行。至此,完成系统的引导与加载。

        上段讲述了DM642的启动方式,其中涉及到DM642的地址空间,接下来讲讲DM642地址空间映射。文档SPRS200中的“Memory Map Summary”小节对DM642的地址空间做了总结。这里着重介绍Internal memory(Internal RAM/L2,我习惯称为L2)、EMIFA地址空间。L2为DM642片上集成Cache/SRAM可配置的存储器,大小为256K-Bytes,映射 地址为0x0000 0000-0x0003 FFFF。L2是使用频繁,关乎程序优化的重要存储器。EMIFA空间分为4个,分别为CE0-3,每个空间大小为256MB,详见下图。

    QQ截图20140403171120

    实际项目中,CE0地址空间配置为SDRAM,大小为32M*64bit, 地址范围:0x8000 0000 – 0x81FF FFFF。项目中使用的FLASH为AM29LV320D异步静态存储器,大小为4M*8bit,但实际中FLASH工作在Byte模式下,只映射了 1MBytes,因为CE1地址线只有A[3-22]。在不使用FPGA/CPLD条件下,充分利用FLASH大小4M*8bit存储容量,可以使用 DM642丰富的GPIO来扩展地址空间,实现FLASH的分页访问,值得注意的是,被选用的GPIO必须满足DM642上电/复位时为低电平。下图使用 GPIO3实现对FLASH分页访问,大小为2M*8bit,配置在CE1D地址空间:0x0000 0000 – 0x900F FFFF。引脚图如下

    QQ截图20140403184432

    如果需要全部使用FLASH的4M*8bit空间,可以使用更多的GPIO来实现分页访问,只需要选用的GPIO在复位/上电时为低电平,另外要注意,软件访问是的分页控制。

        除了在硬件上的启动配置外,在软件上也需要做相关配置。

    1、向自己的工程中加入二级bootloader(*.asm)汇编代码,(我使用的是IDE:CCSv5)

    复制代码
    .title  "Flash bootup utility for DM642 EVM"
                .option D,T
                .length 102
                .width  140
    
    COPY_TABLE  .equ    0x90000400
    EMIF_BASE   .equ    0x01800000
    
                .sect ".boot_load"
                .global _boot
    
    _boot:      
    ;************************************************************************
    ;* Debug Loop -  Comment out B for Normal Operation
    ;************************************************************************
    
                zero B1
    _myloop:  ; [!B1] B _myloop  
                nop  5
    _myloopend: nop
    
    ;************************************************************************
    ;* Configure EMIF
    ;************************************************************************
    
            mvkl  emif_values, a3  ; load pointer to emif values
            mvkh  emif_values, a3
            
            mvkl  EMIF_BASE, a4    ; load EMIF base address
            mvkh  EMIF_BASE, a4
    
            mvkl  0x0009, b0       ; load number of registers to set
            mvkh  0x0000, b0
    
    emif_loop:
            ldw   *a3++, b5        ; load register value
            sub   b0,1,b0          ; decrement counter
            nop   2
     [ b0]  b     emif_loop
            stw   b5, *a4++        ; store register value
            nop   4  
    
    ;****************************************************************************
    ;* Copy code sections
    ;****************************************************************************
            mvkl  COPY_TABLE, a3   ; load table pointer
            mvkh  COPY_TABLE, a3
    
            ldw   *a3++, b1        ; Load entry point
    
    copy_section_top:
            ldw   *a3++, b0        ; byte count 
            ldw   *a3++, a4        ; ram start address
            nop   3
    
     [!b0]  b copy_done            ; have we copied all sections?
            nop   5
    
    copy_loop:
            ldb   *a3++,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
    
    ;****************************************************************************
    ;* Jump to entry point
    ;****************************************************************************
    copy_done:
            b    .S2 b1
            nop   5
    
    emif_values:
            .long 0x00052078      ; GBLCTL
            .long 0x73a28e01      ; CECTL1 (Flash/FPGA)
            .long 0xffffffd3      ; CECTL0 (SDRAM)
            .long 0x00000000      ; Reserved
            .long 0x22a28a22      ; CECTL2
            .long 0x22a28a22      ; CECTL3
            .long 0x57115000      ; SDCTL
            .long 0x0000081b      ; SDTIM (refresh period)
            .long 0x001faf4d      ; SDEXT
    复制代码

    2、DSP/BIOS的MEM配置。

    如前所说,二级bootloader加载完成后,CPU将从0地址开始运行,因此要将二级bootloader分配在0地址开始的1KB地址空间,即将L2的前1KB配置为boot区。

    QQ截图20140403191113

    并且要在cmd文件中将1中的代码段分配到BOOT存储器中。

    SECTIONS
    {
        .boot_load > BOOT/**/
    }

         本文就简单结合实际将DM642的EMIF启动模式做了介绍。如有纰漏,请多多指教。

  • 相关阅读:
    51nod 1565模糊搜索(FFT)
    51nod 1851俄罗斯方块(trick)
    可持久化线段树(主席树)模板
    BZOJ2191:Splite
    BZOJ4197:[NOI2015]寿司晚宴
    BZOJ3198:[SDOI2013]SPRING
    BZOJ1500:[NOI2005]维修数列
    BZOJ3527:[ZJOI]力
    BZOJ3160:万径人踪灭
    CODE[VS]1372:DNA
  • 原文地址:https://www.cnblogs.com/lanlingshan/p/3897181.html
Copyright © 2011-2022 走看看