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启动模式做了介绍。如有纰漏,请多多指教。

原文地址:https://www.cnblogs.com/lanlingshan/p/3897181.html