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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

3 y! z1 b5 s' V5 \在分析U-Boot第二阶段的C函数之前,我们有必要先分析二个重要的数据结构,因为它们在第二阶段中无处不在!知道它们的厉害了吧?究竟是谁那么厉害呢?
3 y! j4 c. ?$ j% C& X: a6 W
2 p; a1 F7 O) ?) T- P+ B8 `  ~% i7 Y     打开 lib_ARM/board.c  在第55行看到:
9 I8 R# a+ ^8 e5 P
$ o0 V# N3 L% {55    DECLARE_GLOBAL_DATA_PTR;. A7 \* V1 V: M$ g: R. e) \* i1 H+ j

5 ^  v$ h/ Q2 x% \0 Z5 \1 `. a     这是什么意思呢?找遍board.c也没找着它的第二次出现,因为它只出现一次,而且仅需一次就够了。从字义上翻译,“声明全局的数据结构型指针”。大概可以猜到,它起着声明的作用,在include/am-arm/global_data.h头文件的第64行:
% x* t9 J$ ^* L+ R2 Z2 x9 G0 e# l6 }7 j
64    #define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
9 ^4 q& @7 j# K" L- Q; _+ f& X$ i$ f/ y7 b% |! W" s+ W( c
     原来它的作用是,声明gd这么一个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器里面的。
: p7 Z: G% z; B0 v0 l
, G6 j5 s/ ~8 R. A& L) [! j+ d     gd_t : global data数据结构定义,位于文件 include/asm-arm/global_data.h。其成员主要是一些全局的系统初始化参数。需要用到时用宏定义: DECLARE_GLOBAL_DATA_PTR,指定占用寄存器r8。原型如下:
: u  W$ F  ?4 j9 k8 Z* \- ~+ [7 K- J, ?5 J
typedef struct global_data
: J; \+ i% _- s2 h4 N: l0 G1 u
5 g& i9 [4 ~' U  c: d2 M{
, [- J# m8 }+ o9 i0 {       bd_t    *bd;            // bd指针指向bd_info这个结构体,保存开发板的相关参数
! z/ T( `3 {+ w6 V& U; ]5 \7 f1 q) }4 R2 E  h3 a
       unsigned long flags;        //指示标志,如设备已经初始化标志等
: s' t% b* m" l" ^: @9 P; q       unsigned long baudrate;         // 串口的波特率5 @+ L6 C4 ?3 a% a( d
       unsigned long have_console;    // 串口初始化标志
* D9 Z2 w$ m% s, |7 {& T9 p* \1 I" \' r# I9 V6 D4 ?! C

! ?( K' N0 j6 b2 J3 m/* Relocation Offset 重定位偏移,就是实际定向的位置与编译连接时指定的位置之差,一般为0 */
; D4 }" W! p) M3 o( Y
# x7 h, g+ V% \; h' `( F       unsigned long reloc_off;     
" G( d* w/ |" f, _       unsigned long env_addr;       // Address of Environment struct ,环境参数地址, J. h% c* Y5 U; @" i
       unsigned long env_valid;      // 环境参数CRC检验有效标志
. n7 `7 h$ q) Y( x, }5 `+ Z, ^+ u       unsigned long fb_base;       //base address of frame buffer 帧缓冲区基地址
6 a0 z: a4 V) {4 v
0 S/ v$ I; J2 {4 a+ n, G8 t8 y# z! z9 @8 {
#ifdef CONFIG_VFD           //  include/configs/EmbedSky.h里面没有此宏定义,故忽略6 x0 w6 I! m7 t0 _" C" \
       unsigned char vfd_type; /* display type */
. Q8 \. \5 |" s5 R$ d#endif
- F( H. d) K: ^8 e% ]6 I5 u#if 0# N' u- {* k4 ?* C
       unsigned long cpu_clk;             /* CPU clock in Hz!  */
; k. [' V! B6 d  d( x. Y       unsigned long bus_clk;            /*  Bus  clock in Hz!  */! ^3 c+ t, Z8 a( K8 Y# g
       unsigned long ram_size;        /* RAM size */9 R! A9 H2 D; u$ E: j  ]' U
       unsigned long reset_status;   /* reset status register at boot */
( R# \! x: q; Q: z$ h+ E#endif
' E) X- Q& c8 N5 C5 T5 X       void  **jt;          /* jump table 跳转表,用来"函数调用地址登记" */) _- X7 O4 ~6 r, v1 |4 n7 p$ r
} gd_t
' _/ V0 E( j6 u- S! H- T6 D5 J
) d$ ~( V* F3 Y+ `1 W3 q- z______________________________________________________________________9 t  |6 Q! J/ E! t& a0 n
: J: f, x6 P( J2 J$ c8 D
      bd_t : board info数据结构定义,位于文件 include/asm-arm/u-boot.h定义,主要是保存开发板的相关参数。' u& u3 ]9 `0 Y$ \* X/ r. S
/ ]; ~4 Q- P$ T& {
typedef struct bd_info% ]- v1 v* H) X
% Y0 V4 o, B4 o# ~/ T1 T
{9 v0 p# o5 G1 c2 M3 c! ]
       int   bi_baudrate;                          / /串口波特率
: l, `" ?  ]- V3 T. h4 l3 {( |       unsigned long bi_ip_addr;           // IP地址  `, s) s' X, i) y/ T& Z
       unsigned char bi_enetaddr[6];    // MAC地址
# C" B: E( ]' H- f       struct environment_s        *bi_env;7 A( ]& z9 X' u% ?" ?
       ulong    bi_arch_number;          //板子ID号' {# K  S; u* K% ?6 w$ I" u
       ulong     bi_boot_params;         // 启动参数; r/ y& E  _. _3 m& _
       struct                                        //RAM 配置
0 x. c5 E5 H% B* V9 S; k  }5 ?6 i. J/ }       {+ \7 |1 R" H  \
              ulong start;* m3 M0 I4 C7 L) i
              ulong size;     //CONFIG_NR_DRAM_BANKS=1,即1 bank of DRAM
' m8 @8 ?5 ~" [& n3 h4 o       } bi_dram[CONFIG_NR_DRAM_BANKS];      4 k0 |3 @4 _2 y8 E# G
/ h, h+ i# G5 H" L) a1 o% S; c9 W
5 r" }6 u, J/ s
#ifdef CONFIG_HAS_ETH1          //  include/configs/EmbedSky.h里面没有此宏定义,故忽略
$ j* a* B9 a. A: _0 S: ~2 O    /*  如果有第二块网卡,指定MAC地址   */
' W& X8 o% G% @" w- [       unsigned char   bi_enet1addr[6];
4 w* A( {9 J* K% u% T& \#endif  L5 }. Z& }% p0 r8 O; P( `% |
} bd_t;
1 H& {) Z9 O/ i" U! T/ C7 M2 @1 b( d& r* t1 \
——————————————————————————————————————
' U% y' \7 d; s& [3 l% c& e  w7 i- b6 Q# L2 W+ H5 o  l
U-Boot启动内核时要给内核传递参数,这时就要使用gd_t,bd_t结构体中的信息来设置标记列表。
2 L4 f0 T5 }  U0 H$ ]$ q
0 a) W" a$ X! j# D2 \7 }这节就讲到这里,祝愿大家学习愉快。; L0 W6 M4 X7 _8 m

0 ~  m: t+ P( F, J6 N0 T, F
  • 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 04:46 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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