|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 mytomorrow 于 2019-10-15 10:58 编辑 ! v8 u* {1 h7 e
- Y) A1 d* F- K! i: Z
编写二级Bootloader8 e1 {. @" D: @( y: e% h8 N
7 ~% X# f! i7 x0 T6 |" L
先宏定义一下EMIF相关的寄存器,因为我们要读Flash,所以在二级引导程序运行前要配置EMIF寄存器,
) A& Q6 Q9 H) F) {: o7 A- K5 ^' ^ t, z) J
- ;
- ; ======== c6713_emif.s62 ========
- ;
- .title "Flash bootup utility"
- " Q1 W* f" k. @/ L6 |, X1 f+ B
- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
a1 Y7 m/ I* t: F0 Y9 B. l- ;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
- 9 F! n, n% M1 v( }& G
- ; 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' d5 d. O5 \# [; ]0 V& f) B4 u
N/ A/ T$ e& k8 ]. } I9 v4 Y4 G1 g# d( A5 d6 l' I4 O0 t
宏定义的EMIF寄存器声明为全局符号,.global与C语言中的extern效果一致,声明为外部符号。
2 H, q/ ~1 f( I9 V) K1 d t6 }- X7 V) m, z" d+ Z
- ;
- ; ======== boot_c671x.h62 ========
- ;
- 2 m; A. F5 E. h0 B6 U0 B- i2 d2 T# i6 ]
- .if ($isdefed("BOOT_C671X_") = 0) ; prevent multiple includes of this file
- BOOT_C671X_ .set 1
/ W \ N0 ]% ?3 T, ]$ _- ; 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
5 q: n8 L6 I& Z9 M: e# n- ; 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
- # @' M9 r1 \6 g/ {8 B% m6 W
- .endif ; if BOOT_C671X_ is not defined
- . j% H9 o% Q2 ]# i7 @2 M
% z' r- q0 O$ ~" Q ' l2 r; s/ _7 y: s5 }6 W% N
7 J7 }) X6 f* M6 D4 l
( d6 P# i1 L z0 S; R
% `1 h( X5 o' s下面的代码段名.boot_load,你将在之后的cmd文件中看到它。5 k. ]3 W: W W4 j
6 K& n1 c) ^9 K% r代码首先对EMIF进行初始化,然后在copy_section_top中读取用户程序的段信息(段的Flash加载地址,段的RAM运行地址以及段的长度),在copy_loop中执行循环拷贝操作。- f# G+ C) M+ J7 j6 d2 A% R" C
4 R$ @3 r6 X l( Z0 Q7 x
- ;A;
- ; ======== File: boot_c671x.s62 ========
- ;
- .title "Flash bootup utility"
1 |$ J5 ^; F/ {- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
: X" f- O) X! k4 {- ; Address of the generated boot-table
- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400
( [2 o" A% p- X5 K9 P- .sect ".boot_load"
- .global _boot
! N% i2 D% V$ V* C+ b$ x( u8 N' D/ y- .ref _c_int00
- & c* a' H, ~, c
- _boot:
- ;************************************************************************
- ;* DEBUG LOOP - COMMENT OUT B FOR NORMAL OPERATION
- ;************************************************************************
- 1 k+ E3 P w+ g$ P
- zero B1
- _myloop: ; [!B1] B _myloop
- nop 5
- _myloopend: nop
- ) V7 s; C* D+ A: G/ v9 T
- ;************************************************************************
- ;* CONFIGURE EMIF
- ;************************************************************************
# t' K& q. L6 h* A/ b- ;****************************************************************
- ; *EMIF_GCTL = EMIF_GCTL_V;
- ;****************************************************************
- 5 q d: i$ c0 _& i
- mvkl EMIF_GCTL,A4
- || mvkl EMIF_GCTL_V,B4
- 6 S! k V/ ?8 f! N
- mvkh EMIF_GCTL,A4
- || mvkh EMIF_GCTL_V,B4
- ' z( @( M& x7 C
- stw B4,*A4
- # W `3 O5 s& |9 J( ^8 Z
- ;****************************************************************
- ; *EMIF_CE0 = EMIF_CE0_V
- ;****************************************************************
- & J) S7 W+ o& Y J+ m$ {. [8 `+ v
- mvkl EMIF_CE0,A4
- || mvkl EMIF_CE0_V,B4
$ ~. l) F2 Y0 a' N( f4 y+ G+ t- mvkh EMIF_CE0,A4
- || mvkh EMIF_CE0_V,B4
- 0 F; b( j/ t% N" I( M, g7 G
- stw B4,*A4
- ; B& T& H6 u# g, M8 m
- ;****************************************************************
- ; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async)
- ;****************************************************************
# s, Z" y, |* P! t- mvkl EMIF_CE1,A4
- || mvkl EMIF_CE1_V,B4
- n+ L- w# \+ t2 Z$ _+ U. a2 [- mvkh EMIF_CE1,A4
- || mvkh EMIF_CE1_V,B4
9 ^: y" V" w* O- stw B4,*A4
- ( f8 i$ B9 L' l1 w8 z% W$ N K
- ;****************************************************************
- ; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async)
- ;****************************************************************
- ( H- E- D) ^6 c
- mvkl EMIF_CE2,A4
- || mvkl EMIF_CE2_V,B4
- ; X) J" N A6 f/ M3 t
- mvkh EMIF_CE2,A4
- || mvkh EMIF_CE2_V,B4
/ g& r+ r1 _: z$ ~; i% f t# G$ |- stw B4,*A4
4 h+ q& Y O, @/ f- G+ ^" D3 o* `- ;****************************************************************
- ; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async)
- ;****************************************************************
- 4 V# c" z# X) R+ z4 c3 Q* H# D
- || mvkl EMIF_CE3,A4
- || mvkl EMIF_CE3_V,B4 ;
S* D7 ?/ \$ f% t* O- mvkh EMIF_CE3,A4
- || mvkh EMIF_CE3_V,B4
- & G1 Z, E8 G9 c7 y
- stw B4,*A4
/ h5 g% ]* ~" K- ;****************************************************************
- ; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V
- ;****************************************************************
- || mvkl EMIF_SDRAMCTL,A4
- || mvkl EMIF_SDRAMCTL_V,B4 ;
- D" q! Q5 s* S; m& V- P4 R- S( ]) m! c- mvkh EMIF_SDRAMCTL,A4
- || mvkh EMIF_SDRAMCTL_V,B4
# j8 [3 r7 O1 \) O) w0 x+ e. ]- stw B4,*A4
" ^. x0 p+ h7 J j& n9 I: F- ;****************************************************************
- ; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V
- ;****************************************************************
- || mvkl EMIF_SDRAMTIM,A4
- || mvkl EMIF_SDRAMTIM_V,B4 ;
- $ E. O+ R; z3 g* K/ H
- mvkh EMIF_SDRAMTIM,A4
- || mvkh EMIF_SDRAMTIM_V,B4
- ! I' r$ Z' `3 V5 H3 O
- stw B4,*A4
) v; o7 f1 }7 p1 c4 x2 V* \- ;****************************************************************
- ; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V
- ;****************************************************************
- || mvkl EMIF_SDRAMEXT,A4
- || mvkl EMIF_SDRAMEXT_V,B4 ;
- 5 ~5 B- w9 s& F" c; M* S, v
- mvkh EMIF_SDRAMEXT,A4
- || mvkh EMIF_SDRAMEXT_V,B4
- 9 N$ b+ l' e( q( U# S5 A) \' v( d- S
- stw B4,*A4
- ! K% P* D7 y6 w6 l, b$ {% ^
- ;****************************************************************************
- ; copy sections
- ;****************************************************************************
- mvkl copyTable, a3 ; load table pointer
- mvkh copyTable, a3
+ {+ b2 t5 y: F3 R2 }, X- ; ldw *a3++, b1 ; Load entry point
- + O$ Z2 |6 o# A1 I
- copy_section_top:
- ldw *a3++, b0 ; byte count
- ldw *a3++, b4 ; load flash start (load) address
- ldw *a3++, a4 ; ram start address
- nop 2
- 6 E$ h8 r0 L7 q1 F+ s# K1 k$ x
- [!b0] b copy_done ; have we copied all sections?
- nop 5
, x9 E0 L8 ^) {- k: y- 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
- / o, g; k6 \ ]1 c3 y$ g4 n/ \+ x
- ;****************************************************************************
- ; jump to entry point
- ;****************************************************************************
- copy_done:
- mvkl .S2 _c_int00,b0
- mvkh .S2 _c_int00,b0
- b .S2 b0
- nop 5
9 S0 N7 I% e& W$ S$ c% @- copyTable:
6 V d" n+ j; U+ C7 `- ; count
- ; flash start (load) address
- ; ram start (run) address
1 o; M4 z, ~5 c* {- ;; .text
- .word user_size
- .word user_ld_start
- .word user_rn_start
- - m3 l* | M4 }. X
- ;; end of table
- .word 0
- .word 0
- .word 0: R4 E7 l: X p$ C( a1 J8 b
7 l" B# S9 M4 i4 t) j$ R _
* g/ ^# C# i. K% t在使用时,我们要对上面程序中的
5 q2 D. g9 ~/ A4 `" E
4 A+ `7 f3 K- z0 O- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400
6 N4 A j- V. Q! k; E7 P
1 M* A5 i' V. ^2 Y- ], i进行修改,user_size表示用户程序段的字节大小,我们将在下一节看到可以通过查看*.map文件进行修改;user_ld_start表示用户代码的Flash起始地址(我默认使用0x90000400,一般不改),user_rn_start表示用户代码要存放到RAM的起始地址(从之前的图看,这个我也一般不改)。小程序我一般只修改用户程序段的字节大小。大程序可能要对copyTable(复制表)进行调整。* n) m, Z) D4 t0 {9 r0 k5 {8 U& a; v
/ y0 g& D5 w& c, u( \5 [
要满足上面的地址的分布,修改用户应用程序的cmd文件如下:
* j u+ O/ X# S f1 {( J0 d
6 n" T# \8 Y# r! l- D9 H, N- -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
4 o4 v6 E1 c' ^! b- /* Initialized User code section */
- .text :> IRAM
- .cinit :> IRAM
* [. G1 H$ |& ` l9 p& ]% ]% G- .vectors :> IRAM
- .bss :> IRAM
- .far :> IRAM
- .stack :> IRAM
- .const :> IRAM
- .switch :> IRAM
- .sysmem :> IRAM
- .cio :> IRAM
- }
- J: |( _. T6 A5 J0 L8 e. R& W& K 7 o$ v E! ?2 e0 C8 ]
/ ?% f* |8 o; i
注意其中的.boot_load段,与二级引导程序的.sect ".boot_load"对应。如果用户应用程序定义了其它的段,可对cmd文件做相应修改,但.boot_load:> BOOT_RAM不能改,且不要把其它段放在BOOT_RAM存储区中。- S6 X/ x7 T( j
4 B4 W# N9 b2 j( t/ l2 q2 b3 _
将以上3个汇编文件盒一个cmd文件加到用户程序的工程中重新编译工程。
5 \5 l" ?( \$ u& ]
& W, _0 I+ W( r6 k* X5 i$ t# d$ B3 v% S" D" H
- ?1 V7 y! D( s, j
1 j2 v4 R: P0 A% b& N3 I8 K, i
7 U# Z0 H: K/ B4 _2 M' y$ s* d9 l6 L& s- d# _: J
5 a$ v6 G# \0 ?* T4 J$ }6 D
% C3 H5 ^; t5 H
6 ]$ F. v; c& O3 Y' A, k8 |4 J |
|