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

TQ2440之U-Boot-1.1.6之初解二个重要的数据结构gd_t与bd_t

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
8 y4 B* V9 f# ]- l! T) Q
在分析U-Boot第二阶段的C函数之前,我们有必要先分析二个重要的数据结构,因为它们在第二阶段中无处不在!知道它们的厉害了吧?究竟是谁那么厉害呢?
, i# }" O" ~/ i9 K) B2 A- D% y' o+ a1 D3 s/ W# F3 f; Y) h
     打开 lib_ARM/board.c  在第55行看到:
+ O  K, Y3 o. j
1 I) M2 t, H& a4 v5 I55    DECLARE_GLOBAL_DATA_PTR;* E4 {4 h0 k9 X0 h6 c
) z! s. V+ A# u; h7 H: f
     这是什么意思呢?找遍board.c也没找着它的第二次出现,因为它只出现一次,而且仅需一次就够了。从字义上翻译,“声明全局的数据结构型指针”。大概可以猜到,它起着声明的作用,在include/am-arm/global_data.h头文件的第64行:
& l* o' d, G8 w1 o6 U) _& U# r/ h6 V2 ^) {* z( n# y3 i) B* S# I2 {
64    #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
9 \% j7 C0 Q. J. d4 t+ V2 D- V/ T  y, u- c; W  P. o/ j, l
     原来它的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。. O3 `+ K9 {, b: l
  k8 `, o0 ?# Q8 x4 f5 {- \7 t
     gd_t : global data数据结构定义,位于文件 include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。需要用到时用宏定义: DECLARE_GLOBAL_DATA_PTR,指定占用寄存器r8。原型如下:1 R2 w6 ]7 n* Z7 T- ?. S3 h

+ e  Z. h1 W% ^0 ltypedef struct global_data( T. t- I; ?) k: L5 ~3 f0 [

, ~! h$ E) l& K' E* Y{
! f/ M; Z4 l  m       bd_t    *bd;            // bd指针指向bd_info这个结构体,保存开发板的相关参数7 g3 u' P7 v  |! K" F  ~' d

! u) G1 J: L' k$ j/ N       unsigned long flags;        //指示标志,如设备已经初始化标志等; j  P- D- T! l9 D' V% M% G5 u+ ~
       unsigned long baudrate;         // 串口的波特率" H3 \1 q# J7 t9 b1 x+ R# {
       unsigned long have_console;    // 串口初始化标志1 G" A( I3 v: M

1 w1 K- |. C) T/ s5 U/ t  W) c5 E7 |& g
/* Relocation Offset 重定位偏移,就是实际定向的位置与编译连接时指定的位置之差,一般为0 */
7 O# ^. Z3 ]& V; i) N/ g6 ?  X$ N: K& ]! _4 b1 O6 ?6 h
       unsigned long reloc_off;     
6 s. q9 O9 L1 i* p/ @4 z       unsigned long env_addr;       // Address of Environment struct ,环境参数地址6 s  w8 M1 [( X  D
       unsigned long env_valid;      // 环境参数CRC检验有效标志1 a- P! ]0 a9 L
       unsigned long fb_base;       //base address of frame buffer 帧缓冲区基地址
- |3 {4 m# b( i8 u3 C& r& ]' X# ~6 L

* C$ Y0 A: N( Y( m& x- I5 Y/ L#ifdef CONFIG_VFD           //  include/configs/EmbedSky.h里面没有此宏定义,故忽略
. k" ?* s* g4 ]  J1 }$ _( q       unsigned char vfd_type; /* display type */
+ a1 q( D( ~/ {/ Q( s( q#endif4 ~$ }- i- e8 U/ w
#if 0
* G) F7 u( E0 y  G       unsigned long cpu_clk;             /* CPU clock in Hz!  */
# y: p1 t* u  H# W2 Q6 m+ O: A; z       unsigned long bus_clk;            /*  Bus  clock in Hz!  */: o0 I7 O3 D$ D. X
       unsigned long ram_size;        /* RAM size */
( \) D  q- `7 x4 D: D( W5 A       unsigned long reset_status;   /* reset status register at boot */
1 L" P/ d/ Z( }#endif! e0 a4 \" f: G0 h% z+ u
       void  **jt;          /* jump table 跳转表,用来"函数调用地址登记" */# Z% j9 c0 V) s1 I: @
} gd_t: s! J7 j6 O! `, b) T
+ L! y5 [+ U9 F% B9 _  c& w
______________________________________________________________________/ N# q, s9 |. v1 M4 X
) D  F9 t. o6 l0 o' t* ~+ v
      bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h定义,主要是保存开发板的相关参数。% M- o* B. S! e. M1 _

& c3 H0 `$ L! r3 c; Otypedef struct bd_info1 |% e9 [/ \: o% c
/ x  L1 m/ X9 C
{; J% D9 q2 K: q: c9 B' I9 H
       int   bi_baudrate;                          / /串口波特率  N$ R  W) v% k
       unsigned long bi_ip_addr;           // IP地址
5 ?6 C7 i8 V. Z* |+ B7 t4 p       unsigned char bi_enetaddr[6];    // MAC地址  F8 P8 E% h% M2 L# y
       struct environment_s        *bi_env;
$ ]/ S* k- a1 `6 P: l  O4 `       ulong    bi_arch_number;          //板子ID号' c, l& ~4 y. Y% r. N1 f7 L7 ^
       ulong     bi_boot_params;         // 启动参数0 [- P" o# q, x* \
       struct                                        //RAM 配置 ; x# M3 n4 A, Q8 a$ M; T3 s) w
       {" [5 B% V* r6 ~/ G' l
              ulong start;  J0 O7 S; O7 `' R+ }- P
              ulong size;     //CONFIG_NR_DRAM_BANKS=1,即1 bank of DRAM) e, U: T  Y1 B8 [; b
       } bi_dram[CONFIG_NR_DRAM_BANKS];      
. z* E( z8 p% h, F( S" f9 b, Q8 z8 S: \

, a: z# b. ?  h; X+ ~( S7 w" [#ifdef CONFIG_HAS_ETH1          //  include/configs/EmbedSky.h里面没有此宏定义,故忽略
- W; y, e" m3 G    /*  如果有第二块网卡,指定MAC地址   */
) z6 [  G0 d. X: q) X       unsigned char   bi_enet1addr[6];
* G6 r- n6 C, `3 h#endif
# M8 w7 X- ]$ s0 P3 y' e9 M} bd_t;
1 m4 P3 N4 r4 S6 y3 W( j3 c2 I" G. {' r: n! o
——————————————————————————————————————
2 W; H# s8 x7 P
1 ]1 n) `  ~" B- S9 i7 M8 `U-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。9 R/ q1 @; M" Q1 u
) T* d- y& N0 O& E
这节就讲到这里,祝愿大家学习愉快。; H% T8 F# t  G$ J
; [" F/ r# c! ]# e: |  L
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-5-13 11:26 | 只看该作者
    初解二个重要的数据结构gd_t与bd_t
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-26 13:18 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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