EDA365电子论坛网

标题: TQ2440之U-Boot-1.1.6之初解二个重要的数据结构gd_t与bd_t [打印本页]

作者: baqiao    时间: 2020-5-13 10:00
标题: TQ2440之U-Boot-1.1.6之初解二个重要的数据结构gd_t与bd_t
( P: A) b+ q: _
在分析U-Boot第二阶段的C函数之前,我们有必要先分析二个重要的数据结构,因为它们在第二阶段中无处不在!知道它们的厉害了吧?究竟是谁那么厉害呢?' K: j6 {" ?9 @' Z& j
2 v4 |/ H& A/ f
     打开 lib_arm/board.c  在第55行看到:
) ?" I  {$ S" a% W8 ~
, d2 W8 x" H, }1 g$ Q: n7 u55    DECLARE_GLOBAL_DATA_PTR;
* [2 {. g/ r4 g  c* ]) ^0 ?6 n& E  J5 J$ ]% }
     这是什么意思呢?找遍board.c也没找着它的第二次出现,因为它只出现一次,而且仅需一次就够了。从字义上翻译,“声明全局的数据结构型指针”。大概可以猜到,它起着声明的作用,在include/am-arm/global_data.h头文件的第64行:
$ y0 Q) ^& ^. F$ O! _# R
) j- }' a/ c+ `64    #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
% X# ]- I6 h: L: Z7 g3 L
. N) `  ~0 E  S7 R1 k3 P3 s* Z, {1 e; i     原来它的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。3 H- O1 ?, F: B* b+ p1 a) ]

" T: `  {# Z' c8 n     gd_t : global data数据结构定义,位于文件 include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。需要用到时用宏定义: DECLARE_GLOBAL_DATA_PTR,指定占用寄存器r8。原型如下:
0 ~7 p# ^$ C0 M9 a3 Z3 N3 V/ u
typedef struct global_data
5 n9 O& @$ O6 O3 c) t0 q, I  m! s) P3 f4 E# D& g: m- ^' o
{
8 j) w0 e  h( U7 E       bd_t    *bd;            // bd指针指向bd_info这个结构体,保存开发板的相关参数: S' @  x! u+ M/ ^

" Y2 o1 n  y( r8 d6 I/ u. n       unsigned long flags;        //指示标志,如设备已经初始化标志等+ |1 k, ~1 g: f2 M" k
       unsigned long baudrate;         // 串口的波特率' G# U. a& _) F5 ^: L: ^
       unsigned long have_console;    // 串口初始化标志
4 c% ~: i* l. u7 `& x6 Z
, I1 c9 q# I/ P5 k: n2 N$ {0 e9 A! i) f0 L7 C
/* Relocation Offset 重定位偏移,就是实际定向的位置与编译连接时指定的位置之差,一般为0 */
& h& V; W8 \4 Z3 C1 L) G0 m) p0 T9 H; x) o. U
       unsigned long reloc_off;     % h. u5 u4 W  Y+ o
       unsigned long env_addr;       // Address of Environment struct ,环境参数地址- t% {! x% H& m/ ]/ l6 d
       unsigned long env_valid;      // 环境参数CRC检验有效标志
" O7 y% [+ I: e7 ?+ O       unsigned long fb_base;       //base address of frame buffer 帧缓冲区基地址
$ h7 [: I( T7 O* R( A: P4 f! y! u0 t( S1 E' l1 h

5 k* {( Z& |4 o# K#ifdef CONFIG_VFD           //  include/configs/EmbedSky.h里面没有此宏定义,故忽略& R8 _' Y* p0 K3 Z
       unsigned char vfd_type; /* display type */
5 b* ]) e) Z. Z" y: ^% b. p; C  d#endif
% ~; S8 ?' C6 o9 W* h7 P#if 0- z7 \1 T! k8 }: b  U7 K4 P
       unsigned long cpu_clk;             /* CPU clock in Hz!  */
* a- R5 |, c$ V3 y8 d       unsigned long bus_clk;            /*  Bus  clock in Hz!  */% q8 e0 ?% H1 Q+ t: W. R
       unsigned long ram_size;        /* RAM size *// c" g$ L; j4 j+ Z. Z
       unsigned long reset_status;   /* reset status register at boot */5 _' q, ]' G7 K4 B
#endif
" }) b# S$ O" x0 d       void  **jt;          /* jump table 跳转表,用来"函数调用地址登记" */
: |3 D" I) p& q* ?- V( M} gd_t" P$ v. F8 j6 Z3 ~9 `

* w; h" S2 t( h( E/ D$ ~9 t; y( N______________________________________________________________________; j4 t) K% [9 Z- v. q" }
- I5 F1 T& E8 \4 g6 `( H! m
      bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h定义,主要是保存开发板的相关参数。
6 }4 ]5 A$ }. ~8 ?
0 [% D' v7 [! e# P$ R* xtypedef struct bd_info+ d8 t+ M9 _* b

9 N  V% }! X) F. [, z# x/ b% P{( S- f2 X. p* K( d4 }
       int   bi_baudrate;                          / /串口波特率
8 F# F6 b( V3 S) f- |+ [) D       unsigned long bi_ip_addr;           // IP地址
6 W: g, D" u& F4 _  Z  F$ P) Q# [       unsigned char bi_enetaddr[6];    // MAC地址
  K' \% T# C  W0 W- q/ s4 y       struct environment_s        *bi_env;
3 Y0 M* I. S: H/ k       ulong    bi_arch_number;          //板子ID号" B7 B, \4 O6 _; j, m, h
       ulong     bi_boot_params;         // 启动参数( h5 r( `/ o% V' R  s2 }3 J8 l
       struct                                        //RAM 配置 ' x8 I  z! t5 X( A5 b: R
       {
, O5 e6 R% L* A2 k* F0 E              ulong start;
; V: _) r; H; u( A+ P              ulong size;     //CONFIG_NR_DRAM_BANKS=1,即1 bank of DRAM" q' o% }, H3 \6 ~! f& Q) f
       } bi_dram[CONFIG_NR_DRAM_BANKS];      6 i4 _1 w$ H% k; V

; o" M2 e5 N" U* {$ I4 |8 _. ?2 B5 I+ _
4 e& d! v) S; Q  `3 q$ k#ifdef CONFIG_HAS_ETH1          //  include/configs/EmbedSky.h里面没有此宏定义,故忽略0 }; b2 B" W; ~
    /*  如果有第二块网卡,指定MAC地址   */
- P0 G$ r, E. O+ t8 }       unsigned char   bi_enet1addr[6];' Z3 b& y& g" ~3 ]/ `! u
#endif3 u, J! X7 g2 W0 M, [
} bd_t;2 l3 X, n+ ?  ]- H6 h1 }5 R' G/ V
) h0 f, f# V; a% S0 j& ]
——————————————————————————————————————5 }& l! B$ a9 b" J" v& X

' e0 T- [  i/ |7 jU-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。! s7 ]# `( K* l

3 P/ m3 z* X& O0 f- f这节就讲到这里,祝愿大家学习愉快。
; T% p$ n  i- F% R$ T( ~3 G$ m8 r5 f. [4 x& H, o% L) q4 p

作者: yin123    时间: 2020-5-13 11:26
初解二个重要的数据结构gd_t与bd_t




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2