![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| TMS320C6416 second level bootloader的代码例子 | |||||
作者:Free 文章来源:本站原创 点击数: 更新时间:2007-11-19 ![]() |
|||||
|
c6416如果需要从flash加载,必须写一个二级bootloader程序。这个程序由系统上电复位时直接由qdma载入到内部ram
它负责一些初始化配置工作以及1k后程序的搬移,下面是一个second level bootloader的代码例子,我修改自dm642的fpgaloader. 序不能太大,必须小于1k. ;********************************************************************* ; ; second_level bootloader ; flashload.s62 ; written by wang 2006-7-12 ; ;******************************************************************** .title "Flash bootup utility for c6416" .option D,T .length 102 .width 140 COPY_TABLE .equ 0x64000400 EMIFA_GCTL .equ 0x01800000 EMIFA_CE1 .equ 0x01800004 EMIFA_CE0 .equ 0x01800008 EMIFA_CE2 .equ 0x01800010 EMIFA_CE3 .equ 0x01800014 EMIFA_SDRAMCTL .equ 0x01800018 EMIFA_SDRAMTIM .equ 0x0180001c EMIFA_SDRAMEXT .equ 0x01800020 EMIFA_CE1SECCTL .equ 0x01800044 EMIFA_CE0SECCTL .equ 0x01800048 EMIFA_CE2SECCTL .equ 0x01800050 EMIFA_CE3SECCTL .equ 0x01800054 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EMIFA_GCTL_V .equ 0x000100BC EMIFA_CE1_V .equ 0xF7FFDFD3 EMIFA_CE0_V .equ 0xffffffd3 EMIFA_CE2_V .equ 0x1071C123 EMIFA_CE3_V .equ 0xFFFFFF23 EMIFA_SDRAMCTL_V .equ 0x63228000 EMIFA_SDRAMTIM_V .equ 0x0000081b EMIFA_SDRAMEXT_V .equ 0x0005342b EMIFA_CE1SECCTL_V .equ 0x00000003 EMIFA_CE0SECCTL_V .equ 0x00000002 EMIFA_CE2SECCTL_V .equ 0x00000002 EMIFA_CE3SECCTL_V .equ 0x00000002 .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 ;************************************************************************ ;EMIFA_GCTL mvkl EMIFA_GCTL,a3 mvkl EMIFA_GCTL_V,b3 mvkh EMIFA_GCTL,a3 mvkh EMIFA_GCTL_V,b3 stw b3,*a3 ;EMIFA_CE1 mvkl EMIFA_CE1,a3 mvkl EMIFA_CE1_V,b3 mvkh EMIFA_CE1,a3 mvkh EMIFA_CE1_V,b3 stw b3,*a3 ;EMIFA_CE0 mvkl EMIFA_CE0,a3 mvkl EMIFA_CE0_V,b3 mvkh EMIFA_CE0,a3 mvkh EMIFA_CE0_V,b3 stw b3,*a3 ;EMIFA_CE2 mvkl EMIFA_CE2,a3 mvkl EMIFA_CE2_V,b3 mvkh EMIFA_CE2,a3 mvkh EMIFA_CE2_V,b3 stw b3,*a3 ;EMIFA_CE3 mvkl EMIFA_CE3,a3 mvkl EMIFA_CE3_V,b3 mvkh EMIFA_CE3,a3 mvkh EMIFA_CE3_V,b3 stw b3,*a3 ;EMIFA_SDRAMCTL mvkl EMIFA_SDRAMCTL,a3 mvkl EMIFA_SDRAMCTL_V,b3 mvkh EMIFA_SDRAMCTL,a3 mvkh EMIFA_SDRAMCTL_V,b3 stw b3,*a3 ;EMIFA_SDRAMTIM mvkl EMIFA_SDRAMTIM,a3 mvkl EMIFA_SDRAMTIM_V,b3 mvkh EMIFA_SDRAMTIM,a3 mvkh EMIFA_SDRAMTIM_V,b3 stw b3,*a3 ;EMIFA_SDRAMEXT mvkl EMIFA_SDRAMEXT,a3 mvkl EMIFA_SDRAMEXT_V,b3 mvkh EMIFA_SDRAMEXT,a3 mvkh EMIFA_SDRAMEXT_V,b3 stw b3,*a3 ;EMIFA_CE1SECCTL mvkl EMIFA_CE1SECCTL,a3 mvkl EMIFA_CE1SECCTL_V,b3 mvkh EMIFA_CE1SECCTL,a3 mvkh EMIFA_CE1SECCTL_V,b3 stw b3,*a3 ;EMIFA_CE0SECCTL mvkl EMIFA_CE0SECCTL,a3 mvkl EMIFA_CE0SECCTL_V,b3 mvkh EMIFA_CE0SECCTL,a3 mvkh EMIFA_CE0SECCTL_V,b3 stw b3,*a3 ;EMIFA_CE2SECCTL mvkl EMIFA_CE2SECCTL,a3 mvkl EMIFA_CE2SECCTL_V,b3 mvkh EMIFA_CE2SECCTL,a3 mvkh EMIFA_CE2SECCTL_V,b3 stw b3,*a3 ;EMIFA_CE3SECCTL mvkl EMIFA_CE3SECCTL,a3 mvkl EMIFA_CE3SECCTL_V,b3 mvkh EMIFA_CE3SECCTL,a3 mvkh EMIFA_CE3SECCTL_V,b3 stw b3,*a3 ;**************************************************************************** ;* 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 64的boot方式是从默认的地址上电后搬移1k的数据,再执行,一般我们在这1k里做一个搬移程序,把真实的程序搬过来,在把pc指向程序执行点,也就是两级boot |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|