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

编写二级Bootloader

[复制链接]

该用户从未签到

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

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* d
9 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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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