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 u
55 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 M
9 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 e
9 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* x
typedef 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
#endif
3 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 j
U-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 r
5 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