TMS320DM642启动模式(Bootmode)(转)

时间:2023-03-08 16:36:46

原文地址: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,详见下图。

TMS320DM642启动模式(Bootmode)(转)

实际项目中,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。引脚图如下

TMS320DM642启动模式(Bootmode)(转)

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

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

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

TMS320DM642启动模式(Bootmode)(转)
.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
TMS320DM642启动模式(Bootmode)(转)

2、DSP/BIOS的MEM配置。

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

TMS320DM642启动模式(Bootmode)(转)

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

SECTIONS
{
.boot_load > BOOT/**/
}

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