找回密码
 注册
关于网站域名变更的通知
查看: 313|回复: 1
打印 上一主题 下一主题

编写二级Bootloader

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-15 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

该用户从未签到

2#
发表于 2019-10-16 23:17 | 只看该作者
编写二级Bootloader。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 11:32 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表