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,详见下图。
实际项目中,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。引脚图如下
如果需要全部使用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区。
并且要在cmd文件中将1中的代码段分配到BOOT存储器中。
SECTIONS { .boot_load > BOOT/**/ }
本文就简单结合实际将DM642的EMIF启动模式做了介绍。如有纰漏,请多多指教。
posted on 2014-08-07 14:56 lanlingshan 阅读(400) 评论(0) 编辑 收藏 举报