|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 mytomorrow 于 2019-10-15 10:58 编辑
3 W) N; |: G: ?! m9 f3 ]' v
6 A$ \( y0 H0 [5 y6 Q3 H. T编写二级Bootloader$ }' a7 F) f3 g+ r, l6 j, Z1 o
4 @- G1 @5 L: r7 }
先宏定义一下EMIF相关的寄存器,因为我们要读Flash,所以在二级引导程序运行前要配置EMIF寄存器,) u/ m/ J' e* T$ h) h7 v
; ]) P, Y" t* \5 b0 i- O3 K- ;
- ; ======== c6713_emif.s62 ========
- ;
- .title "Flash bootup utility"
5 F( O+ Q" A# L' z5 L, z- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
9 O3 j) ?9 _, l- W% H. J B- ;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
- $ ]( M$ A/ g+ n. ?2 v+ M9 N
- ; 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
1 ^% X0 o. K; E# [: A; z- w2 ?+ U
+ [% x$ K! j/ G5 K4 C' ^% I$ [% ^1 P, E+ k( }$ A
宏定义的EMIF寄存器声明为全局符号,.global与C语言中的extern效果一致,声明为外部符号。0 V. l$ b6 F8 B3 f0 a
. f% ~4 J) _6 H! n
- ;
- ; ======== boot_c671x.h62 ========
- ;
2 z+ e0 b9 W& ]- .if ($isdefed("BOOT_C671X_") = 0) ; prevent multiple includes of this file
- BOOT_C671X_ .set 1
9 l. y- R. E" z9 [2 R z4 n- ; 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
* m8 X) j+ M' g! n1 l3 [- ; 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
i6 W6 e# @+ I' Q F: ]- .endif ; if BOOT_C671X_ is not defined
& ]0 N- u: d( r6 b/ |% L+ x Q8 n8 ?1 K" W
4 c, B+ V- J+ _3 c5 U$ q' U( i
8 P: ]" U- X0 c. K$ c
6 g; Q- g* r4 d
- b/ S9 u' p* a" n下面的代码段名.boot_load,你将在之后的cmd文件中看到它。- L5 Y9 B# y: t
7 ]6 g5 [" t1 u" I' o0 K9 g! `* h代码首先对EMIF进行初始化,然后在copy_section_top中读取用户程序的段信息(段的Flash加载地址,段的RAM运行地址以及段的长度),在copy_loop中执行循环拷贝操作。
& N0 y0 |& r, H
. m; `! k5 T5 v8 m/ J, [7 A F g- ;A;
- ; ======== File: boot_c671x.s62 ========
- ;
- .title "Flash bootup utility"
- v: u# \$ q9 j" D
- ; global EMIF symbols defined for the c671x family
- .include boot_c671x.h62
; N i( K4 x; Y4 p- ; Address of the generated boot-table
- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400
8 ~4 N3 P- @0 T' B: k) _& C% s- .sect ".boot_load"
- .global _boot
- . F0 P' u4 Z: `# a; N7 u
- .ref _c_int00
- . j" C/ i/ L, o( P9 {
- _boot:
- ;************************************************************************
- ;* DEBUG LOOP - COMMENT OUT B FOR NORMAL OPERATION
- ;************************************************************************
, {! _6 d2 v; c3 J) n- zero B1
- _myloop: ; [!B1] B _myloop
- nop 5
- _myloopend: nop
- 0 {; t9 `- N; G$ [: H+ N2 {' z
- ;************************************************************************
- ;* CONFIGURE EMIF
- ;************************************************************************
- + }0 G. o( H8 w! J! T$ R8 [% b# {6 O
- ;****************************************************************
- ; *EMIF_GCTL = EMIF_GCTL_V;
- ;****************************************************************
* Z0 ~$ a" o7 O6 d5 x- mvkl EMIF_GCTL,A4
- || mvkl EMIF_GCTL_V,B4
- 2 p' L0 `0 o) r& h! P% I) c' T! s& O
- mvkh EMIF_GCTL,A4
- || mvkh EMIF_GCTL_V,B4
- ) `2 s7 C3 K: q1 w! I# i
- stw B4,*A4
- 9 K% u" W1 I- x) l) X
- ;****************************************************************
- ; *EMIF_CE0 = EMIF_CE0_V
- ;****************************************************************
$ J, Q, [, ^# H0 U1 X( Y- mvkl EMIF_CE0,A4
- || mvkl EMIF_CE0_V,B4
% F. P# _- o( D) h" P8 b; n: @- mvkh EMIF_CE0,A4
- || mvkh EMIF_CE0_V,B4
- ) E4 N( @$ w9 K* V; E8 S
- stw B4,*A4
- % t8 F' b$ ~ }$ @7 l
- ;****************************************************************
- ; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async)
- ;****************************************************************
, v+ X; g7 G) A8 j! ~/ \3 l; T: T- mvkl EMIF_CE1,A4
- || mvkl EMIF_CE1_V,B4
* e: z( h) G8 S+ Q$ V; L! O. K( z- mvkh EMIF_CE1,A4
- || mvkh EMIF_CE1_V,B4
- " H& T, @2 D+ n7 U2 v
- stw B4,*A4
& Q2 ^5 `+ Q8 ^6 v- ;****************************************************************
- ; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async)
- ;****************************************************************
b1 U- z3 d G/ L) q0 |- mvkl EMIF_CE2,A4
- || mvkl EMIF_CE2_V,B4
* x" _! x+ V% h) n) b1 g | I- mvkh EMIF_CE2,A4
- || mvkh EMIF_CE2_V,B4
- ! P4 q8 ?( ~% [7 B
- stw B4,*A4
: P! ^) I$ k _* y& f- ;****************************************************************
- ; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async)
- ;****************************************************************
% y) n5 `( A4 W% v- || mvkl EMIF_CE3,A4
- || mvkl EMIF_CE3_V,B4 ;
+ K; k1 @8 b7 R$ t9 e- mvkh EMIF_CE3,A4
- || mvkh EMIF_CE3_V,B4
3 P, j9 M: a* I/ ]/ J- stw B4,*A4
: f& }: ~6 i6 f* \, B- _1 ~- ;****************************************************************
- ; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V
- ;****************************************************************
- || mvkl EMIF_SDRAMCTL,A4
- || mvkl EMIF_SDRAMCTL_V,B4 ;
, r& {: \3 M" h- d- mvkh EMIF_SDRAMCTL,A4
- || mvkh EMIF_SDRAMCTL_V,B4
4 b% {1 }5 O/ x. |0 R$ g- stw B4,*A4
- ( Q. g; \9 S2 O9 [
- ;****************************************************************
- ; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V
- ;****************************************************************
- || mvkl EMIF_SDRAMTIM,A4
- || mvkl EMIF_SDRAMTIM_V,B4 ;
- 7 h* B3 E' |9 [* q) D# w4 E
- mvkh EMIF_SDRAMTIM,A4
- || mvkh EMIF_SDRAMTIM_V,B4
- 9 r' G7 H9 ?# I. P# t
- stw B4,*A4
" i1 W3 K$ U# z- ;****************************************************************
- ; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V
- ;****************************************************************
- || mvkl EMIF_SDRAMEXT,A4
- || mvkl EMIF_SDRAMEXT_V,B4 ;
: E f/ \& R' H2 Y' \- mvkh EMIF_SDRAMEXT,A4
- || mvkh EMIF_SDRAMEXT_V,B4
- " W% ], j/ _. W# c" _. Z
- stw B4,*A4
+ q( b3 q& |% H! S* m. ^' r- ;****************************************************************************
- ; copy sections
- ;****************************************************************************
- mvkl copyTable, a3 ; load table pointer
- mvkh copyTable, a3
% m7 u& y2 d' U& a: y. j- ; ldw *a3++, b1 ; Load entry point
7 v9 [8 B( t5 Q$ e, _- copy_section_top:
- ldw *a3++, b0 ; byte count
- ldw *a3++, b4 ; load flash start (load) address
- ldw *a3++, a4 ; ram start address
- nop 2
8 U" ]5 q' Q, s( `1 a. s- [!b0] b copy_done ; have we copied all sections?
- nop 5
2 m) r/ G4 p* W% I( l% @5 E- 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
% H3 s; \- B9 [0 U6 d8 B1 d$ W- ;****************************************************************************
- ; jump to entry point
- ;****************************************************************************
- copy_done:
- mvkl .S2 _c_int00,b0
- mvkh .S2 _c_int00,b0
- b .S2 b0
- nop 5
. b/ w% o$ R/ G" x1 W8 O2 s* `- copyTable:
' M1 P U P/ n) a l- ; count
- ; flash start (load) address
- ; ram start (run) address
, ?% k- `8 ]5 O+ `- ;; .text
- .word user_size
- .word user_ld_start
- .word user_rn_start
- 6 P" C3 p, Z* y) P8 ~: q( Z* V
- ;; end of table
- .word 0
- .word 0
- .word 0
: W' y& H! [4 X2 _, ]$ p % ?. N: e. s1 Z( \% L
) G- U' N6 `) S1 W0 [
在使用时,我们要对上面程序中的/ Y8 R! G6 }* E9 T
0 T( m) q- X1 f/ t& |- } l+ U* Q- user_size .equ 0x00001798
- user_ld_start .equ 0x90000400
- user_rn_start .equ 0x00000400& Q. ?2 h3 y+ R( X% ?, K/ T
+ \, q S' i( O& w6 [% s进行修改,user_size表示用户程序段的字节大小,我们将在下一节看到可以通过查看*.map文件进行修改;user_ld_start表示用户代码的Flash起始地址(我默认使用0x90000400,一般不改),user_rn_start表示用户代码要存放到RAM的起始地址(从之前的图看,这个我也一般不改)。小程序我一般只修改用户程序段的字节大小。大程序可能要对copyTable(复制表)进行调整。) U5 k+ }% |0 L7 s
4 i, U! g, P& S1 L3 q8 d/ M要满足上面的地址的分布,修改用户应用程序的cmd文件如下:
" z4 k' t* e$ J* H3 o. A" e' g0 U; @3 `+ E' P
- -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
- * H* _4 J5 k8 P0 _3 d, x
- /* Initialized User code section */
- .text :> IRAM
- .cinit :> IRAM
- : A# U* [7 @# W' @2 p
- .vectors :> IRAM
- .bss :> IRAM
- .far :> IRAM
- .stack :> IRAM
- .const :> IRAM
- .switch :> IRAM
- .sysmem :> IRAM
- .cio :> IRAM
- }
5 H( O& O9 V/ f' F7 E2 O8 I
9 W7 }( ]4 @9 x+ ^! L* J' W$ I7 ^: ]6 |) q! X: Q; x5 R- `+ h
注意其中的.boot_load段,与二级引导程序的.sect ".boot_load"对应。如果用户应用程序定义了其它的段,可对cmd文件做相应修改,但.boot_load:> BOOT_RAM不能改,且不要把其它段放在BOOT_RAM存储区中。* I) v _7 M6 N. k
# v" D0 r |4 @0 |
将以上3个汇编文件盒一个cmd文件加到用户程序的工程中重新编译工程。
- i3 \6 j% ^* n# Q# @# t! k7 x. L+ G6 w
0 G# f2 Y5 x1 |0 C. _! P7 [7 J" p7 r& x
& o+ D. H _8 T) u1 ?1 [& _% V- N6 ^0 [; ]
4 T# R% `8 k7 r3 D! r7 B
B; n/ Q2 _5 g. v
. m) m) Y+ e6 v
- O5 L# ?8 o% k w) Y. e; x$ p/ O
4 t1 {1 ~; n k/ x7 s |
|