|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 mytomorrow 于 2019-10-15 10:58 编辑
4 p' @+ Y/ y J7 x% y5 F; U' b! P/ _% H# \9 Q# R6 s4 k1 \8 k
编写二级Bootloader
/ ]' n& k* e: \1 T5 j! d5 a; q& h; \# G( `
先宏定义一下EMIF相关的寄存器,因为我们要读Flash,所以在二级引导程序运行前要配置EMIF寄存器,
8 I4 v$ Y# T% n2 D5 F7 X7 j5 o
* e7 V+ O6 F- E6 G- ;
- ; ======== c6713_emif.s62 ========
- ;
- .title "Flash bootup utility"
+ D3 C$ h0 y6 s; V, g5 D6 Y6 A- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
- : j- q7 A& O+ c
- ;EMIF Register Addresses for c671x family
- EMIF_GCTL .equ 0x01800000 ;EMIF global control
- EMIF_CE1 .equ 0x01800004 ;address of EMIF CE1 control reg.
- EMIF_CE0 .equ 0x01800008 ;EMIF CE0control
- EMIF_CE2 .equ 0x01800010 ;EMIF CE2control
- EMIF_CE3 .equ 0x01800014 ;EMIF CE3control
- EMIF_SDRAMCTL .equ 0x01800018 ;EMIF SDRAM control
- EMIF_SDRAMTIM .equ 0x0180001c ;EMIF SDRAM timer
- EMIF_SDRAMEXT .equ 0x01800020 ;EMIF SDRAM extension
- 5 t. A& L2 M- G2 \1 k% V
- ; EMIF Register Values specifically for 6713 DSK
- EMIF_GCTL_V .equ 0x00000078 ;
- EMIF_CE0_V .equ 0xffffff23 ;EMIF CE0 SDRAM
- EMIF_CE1_V .equ 0xffffff13 ;EMIF CE1 Flash 8-bit
- EMIF_CE2_V .equ 0xffffbf93 ;EMIF CE2 Daughtercard 32-bit async
- EMIF_CE3_V .equ 0xffffff13 ;EMIF CE3 Daughtercard 32-bit async
- EMIF_SDRAMCTL_V .equ 0x53115000 ;EMIF SDRAM control
- EMIF_SDRAMTIM_V .equ 0x00000578 ;SDRAM timing (refresh)
- EMIF_SDRAMEXT_V .equ 0x000a8529 ;SDRAM extended control
: N) y0 v, m% G' [, { ( t# ]) b7 w6 X7 l
* _2 {' `( u$ C3 h1 j% ?8 S
宏定义的EMIF寄存器声明为全局符号,.global与C语言中的extern效果一致,声明为外部符号。
, m$ a* ^* z9 s0 q/ j% G. @1 ?! m2 Y
- ;
- ; ======== boot_c671x.h62 ========
- ;
$ i: N5 o# v4 O u; c/ R( v* u( N- .if ($isdefed("BOOT_C671X_") = 0) ; prevent multiple includes of this file
- BOOT_C671X_ .set 1
- $ |5 |: w l4 A
- ; EMIF Register Addresses for c671x family
- .global EMIF_GCTL ;EMIF global control
- .global EMIF_CE1 ;address of EMIF CE1 control reg.
- .global EMIF_CE0 ;EMIF CE0control
- .global EMIF_CE2 ;EMIF CE2control
- .global EMIF_CE3 ;EMIF CE3control
- .global EMIF_SDRAMCTL ;EMIF SDRAM control
- .global EMIF_SDRAMTIM ;EMIF SDRAM timer
- .global EMIF_SDRAMEXT ;EMIF SDRAM extension
- C u3 ]! s4 Y1 C
- ; EMIF Register Values for c671x family
- .global EMIF_GCTL_V ;
- .global EMIF_CE0_V ;EMIF CE0 SDRAM
- .global EMIF_CE1_V ;EMIF CE1 Flash 8-bit
- .global EMIF_CE2_V ;EMIF CE2 Daughtercard 32-bit async
- .global EMIF_CE3_V ;EMIF CE3 Daughtercard 32-bit async
- .global EMIF_SDRAMCTL_V ;EMIF SDRAM control
- .global EMIF_SDRAMTIM_V ;SDRAM timing (refresh)
- .global EMIF_SDRAMEXT_V ;SDRAM extended control
9 X1 u" C% N7 v. G- I/ n- .endif ; if BOOT_C671X_ is not defined
0 ?5 k+ X x3 }. Z' ~- u9 Y
) K% |8 d: m& I1 q
' L1 T0 L( O" B$ Y; p+ ^8 L) X, I: w! w8 ^& m4 A5 i
3 F' ^/ f+ }+ w6 |; _: a, k4 b, y. P* F
4 E( @' ?2 j) H9 e/ X) ^下面的代码段名.boot_load,你将在之后的cmd文件中看到它。" V4 u+ e' n' Z
7 l7 [: T( O/ x+ |0 z2 b
代码首先对EMIF进行初始化,然后在copy_section_top中读取用户程序的段信息(段的Flash加载地址,段的RAM运行地址以及段的长度),在copy_loop中执行循环拷贝操作。
& ?3 p' @8 x* W3 E8 T
6 P: m6 p$ N ~2 e9 r- E! c6 V$ ]- ;A;
- ; ======== File: boot_c671x.s62 ========
- ;
- .title "Flash bootup utility"
- j+ n" m+ g# Y- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
- + a5 Y" B" [5 `2 A
- ; Address of the generated boot-table
- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400
- % S5 n9 a, J; b4 r
- .sect ".boot_load"
- .global _boot
6 E. W/ f1 M5 O. F( k- G- .ref _c_int00
+ O. f: `2 Q* n |! {% Y4 L- _boot:
- ;************************************************************************
- ;* DEBUG LOOP - COMMENT OUT B FOR NORMAL OPERATION
- ;************************************************************************
- 7 \; w+ S+ R' V: [- O
- zero B1
- _myloop: ; [!B1] B _myloop
- nop 5
- _myloopend: nop
- ) _% X6 o( r H3 v
- ;************************************************************************
- ;* CONFIGURE EMIF
- ;************************************************************************
- 0 D9 N. B7 A1 j6 Q! e8 ~ K
- ;****************************************************************
- ; *EMIF_GCTL = EMIF_GCTL_V;
- ;****************************************************************
0 d: I% n7 M1 x7 _, R6 I: O# x) x- mvkl EMIF_GCTL,A4
- || mvkl EMIF_GCTL_V,B4
* N4 J+ G9 S1 U! @! o- mvkh EMIF_GCTL,A4
- || mvkh EMIF_GCTL_V,B4
- * ?: X+ N: [ a/ d% p9 _; _6 x
- stw B4,*A4
* J+ W" g1 m. e' _9 c- ;****************************************************************
- ; *EMIF_CE0 = EMIF_CE0_V
- ;****************************************************************
- Y R7 k$ d" I( R7 A0 a2 j, X9 r
- mvkl EMIF_CE0,A4
- || mvkl EMIF_CE0_V,B4
; |3 f4 F" U3 J& T6 D3 E- mvkh EMIF_CE0,A4
- || mvkh EMIF_CE0_V,B4
3 V5 N/ v& W% y) K. f$ E# O5 }! `- stw B4,*A4
3 t# L- Q! ^0 @( j" T9 ?% F- ;****************************************************************
- ; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async)
- ;****************************************************************
9 V: t( x: J/ x7 x; S% }- mvkl EMIF_CE1,A4
- || mvkl EMIF_CE1_V,B4
- : }' I" B7 G" J
- mvkh EMIF_CE1,A4
- || mvkh EMIF_CE1_V,B4
, }0 ]8 {4 _ R. q, w5 f' u- stw B4,*A4
- 2 }% X1 ~; N0 z8 T1 m) ^: C
- ;****************************************************************
- ; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async)
- ;****************************************************************
0 `, o- i9 K1 A. ~; {: ^" b- mvkl EMIF_CE2,A4
- || mvkl EMIF_CE2_V,B4
' B! G3 D8 A# O9 W6 r* g/ @# ? R4 W# B- mvkh EMIF_CE2,A4
- || mvkh EMIF_CE2_V,B4
5 N) F/ r/ i T9 u' h- stw B4,*A4
1 D9 A* _% R0 O3 v) }8 d. m- ;****************************************************************
- ; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async)
- ;****************************************************************
- ( p) m; J* z' m7 |/ t
- || mvkl EMIF_CE3,A4
- || mvkl EMIF_CE3_V,B4 ;
- . E( m- @8 j3 P" h
- mvkh EMIF_CE3,A4
- || mvkh EMIF_CE3_V,B4
- $ o- H9 O0 F2 ?% F% `+ ^$ h
- stw B4,*A4
0 r6 o$ k% B ^- ;****************************************************************
- ; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V
- ;****************************************************************
- || mvkl EMIF_SDRAMCTL,A4
- || mvkl EMIF_SDRAMCTL_V,B4 ;
- / @: |: q; ], U% _
- mvkh EMIF_SDRAMCTL,A4
- || mvkh EMIF_SDRAMCTL_V,B4
- 2 k7 k' l8 _5 X+ P- j& J# f
- stw B4,*A4
- ( M' c& w5 j9 |
- ;****************************************************************
- ; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V
- ;****************************************************************
- || mvkl EMIF_SDRAMTIM,A4
- || mvkl EMIF_SDRAMTIM_V,B4 ;
% P# z3 p( R H: P/ U- mvkh EMIF_SDRAMTIM,A4
- || mvkh EMIF_SDRAMTIM_V,B4
2 _1 [. Y7 ^. s2 D. O- stw B4,*A4
; C$ i0 ~/ y7 O$ r; U j- ;****************************************************************
- ; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V
- ;****************************************************************
- || mvkl EMIF_SDRAMEXT,A4
- || mvkl EMIF_SDRAMEXT_V,B4 ;
- s; X# P- n- H& ~! C; l- mvkh EMIF_SDRAMEXT,A4
- || mvkh EMIF_SDRAMEXT_V,B4
/ X: y7 U$ P% M1 ~( C$ V* I- stw B4,*A4
: Y" x. T$ J$ m/ _' k! X$ o/ O$ ]- ;****************************************************************************
- ; copy sections
- ;****************************************************************************
- mvkl copyTable, a3 ; load table pointer
- mvkh copyTable, a3
- ; n5 u$ g' e! C# \& h
- ; ldw *a3++, b1 ; Load entry point
- V6 N4 l0 \+ x% w0 j
- copy_section_top:
- ldw *a3++, b0 ; byte count
- ldw *a3++, b4 ; load flash start (load) address
- ldw *a3++, a4 ; ram start address
- nop 2
3 T/ x4 p! }1 k- [!b0] b copy_done ; have we copied all sections?
- nop 5
- / t( j' h8 T; {
- copy_loop:
- ldb *b4++,b5 ; fetch from flash
- 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++ ; store to ram
- [!b0] and -4,a3,a5
- [a1] and 4, a5,a3
- - n+ ]; Y: _9 P$ V' r0 Z7 R
- ;****************************************************************************
- ; jump to entry point
- ;****************************************************************************
- copy_done:
- mvkl .S2 _c_int00,b0
- mvkh .S2 _c_int00,b0
- b .S2 b0
- nop 5
$ L4 y( V; J+ b! N- copyTable:
; [! G2 L# n% R" `0 `# T- ; count
- ; flash start (load) address
- ; ram start (run) address
- 8 a$ X- h) a) J: l" @9 D
- ;; .text
- .word user_size
- .word user_ld_start
- .word user_rn_start
7 Q; F- |( d- t. P- ;; end of table
- .word 0
- .word 0
- .word 0. m' l2 K: U0 W0 F J
$ q" o7 E" `7 s8 @3 R$ B) Z* |/ l: Z
在使用时,我们要对上面程序中的. B4 _4 k9 m5 m: S
, H3 U9 Y. S6 y; i; p0 Q% f- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400$ R, |8 }3 Q6 ~, b5 k& R
* k, ]; W1 d) p* {5 F进行修改,user_size表示用户程序段的字节大小,我们将在下一节看到可以通过查看*.map文件进行修改;user_ld_start表示用户代码的Flash起始地址(我默认使用0x90000400,一般不改),user_rn_start表示用户代码要存放到RAM的起始地址(从之前的图看,这个我也一般不改)。小程序我一般只修改用户程序段的字节大小。大程序可能要对copyTable(复制表)进行调整。
' N" [2 J- z& ^8 \7 A6 ^
% Z# K1 Q/ n5 d$ r- K' G要满足上面的地址的分布,修改用户应用程序的cmd文件如下:
: t# e1 X# M& p' ?# z% w& w; Q# V) ?) ]
- -c
- -x
- -l rts6700.lib
- -heap 100h
- -stack 200h
- MEMORY
- {
- BOOT_RAM : o=00000000h,l=00000400h
- IRAM : o=00000400h,l=00040000h
- FLASH_BOOT : o=90000000h,l=00000400h
- FLASH_REST : o=90000400h,l=000FFB00h
- }
- SECTIONS
- {
- .boot_load:> BOOT_RAM
- 0 }* E; ]3 \+ b5 J q8 s
- /* Initialized User code section */
- .text :> IRAM
- .cinit :> IRAM
- 3 W1 `. v! u/ H7 p0 f1 x
- .vectors :> IRAM
- .bss :> IRAM
- .far :> IRAM
- .stack :> IRAM
- .const :> IRAM
- .switch :> IRAM
- .sysmem :> IRAM
- .cio :> IRAM
- }; d$ Q1 n7 B# V! I
1 z/ G) R4 V. ?6 }& Z9 O
+ Z/ N& M8 a6 ~) E注意其中的.boot_load段,与二级引导程序的.sect ".boot_load"对应。如果用户应用程序定义了其它的段,可对cmd文件做相应修改,但.boot_load:> BOOT_RAM不能改,且不要把其它段放在BOOT_RAM存储区中。 o9 g. o$ k2 F- I: K! m
% ?( j' z, }' k- s将以上3个汇编文件盒一个cmd文件加到用户程序的工程中重新编译工程。
/ [8 g: u4 M; n* |# j6 Q5 {# S4 {& A& R! T/ w- L0 V: N6 P$ Q
3 N0 h7 h8 q% j) x3 W7 N$ a8 j( b9 \ R* i
: _' n# I( k- `; W* F) o
" g; V# e6 p, B7 R' z
" a$ @: C) Y9 h: }% q, H* g6 Q
+ z% u4 d3 k. w0 z- q* V
% X5 ~3 @ X, z
% N6 T) T% }6 T |
|