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

编写二级Bootloader

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 01:37 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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