Boot中gd的定义和使用

最近在做uboot中nand启动相关的工作,遇到一个问题一直纠结着。现在终于明白了这个问题,想想还有好多兄弟在某个黑暗的角落里或者某台电脑前纠结着呢,所以赶紧写下来以供查阅。

U-Boot源代码下载地址
 
uboot version 2014.4
 
/* Architecture-specific global data */
 struct arch_global_data {
 #if defined(CONFIG_FSL_ESDHC)
 u32 sdhc_clk;
 #endif
 #ifdef CONFIG_AT91FAMILY
 /* "static data" needed by at91's clock.c */
 unsigned long  cpu_clk_rate_hz;
 unsigned long  main_clk_rate_hz;
 unsigned long  mck_rate_hz;
 unsigned long  plla_rate_hz;
 unsigned long  pllb_rate_hz;
 unsigned long  at91_pllb_usb_init;
 #endif
 /* "static data" needed by most of timer.c on ARM platforms */
 unsigned long timer_rate_hz;
 unsigned long tbu;
 unsigned long tbl;
 unsigned long lastinc;
 unsigned long long timer_reset_value;
 #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF))
 unsigned long tlb_addr;
 unsigned long tlb_size;
 #endif
 

#ifdef CONFIG_OMAP
 struct omap_boot_parameters omap_boot_params;
 #endif
 };
 

#include <asm-generic/global_data.h>
 

#ifdef CONFIG_ARM64
 #define DECLARE_GLOBAL_DATA_PTR  register volatile gd_t *gd asm ("x18")
 #else
 #define DECLARE_GLOBAL_DATA_PTR
 register volatile gd_t *gd asm ("r9")
 #endif
 

从这里看到了gd的定义,并且可以知道气质这个结构体的定义是在:#include <asm-generic/global_data.h>这个目录下。
 
那么就去这个目录下添加一个私有变量使得在后续的使用过程中更加方便吧!!!!!!!!!!!
 
typedef struct global_data {
 bd_t *bd;
 unsigned long flags;
 unsigned int baudrate;
 unsigned long cpu_clk;
 /* CPU clock in Hz!  */
 unsigned long bus_clk;
 /* We cannot bracket this with CONFIG_PCI due to mpc5xxx */
 unsigned long pci_clk;
 unsigned long mem_clk;
 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
 unsigned long fb_base;
 /* Base address of framebuffer mem */
 #endif
 #if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
 unsigned long post_log_word;  /* Record POST activities */
 unsigned long post_log_res; /* success of POST test */
 unsigned long post_init_f_time;  /* When post_init_f started */
 #endif
 #ifdef CONFIG_BOARD_TYPES
 unsigned long board_type;
 #endif
 unsigned long have_console;
 /* serial_init() was called */
 #ifdef CONFIG_PRE_CONSOLE_BUFFER
 unsigned long precon_buf_idx;
 /* Pre-Console buffer index */
 #endif
 #ifdef CONFIG_MODEM_SUPPORT
 unsigned long do_mdm_init;
 unsigned long be_quiet;
 #endif
 unsigned long env_addr;
 /* Address  of Environment struct */
 unsigned long env_valid;
 /* Checksum of Environment valid? */
 

unsigned long ram_top;
 /* Top address of RAM used by U-Boot */
 

unsigned long relocaddr;
 /* Start address of U-Boot in RAM */
 phys_size_t ram_size;
 /* RAM size */
 unsigned long mon_len;
 /* monitor len */
 unsigned long irq_sp;
 /* irq stack pointer */
 unsigned long start_addr_sp;
 /* start_addr_stackpointer */
 unsigned long reloc_off;
 struct global_data *new_gd;
 /* relocated global data */
 

#ifdef CONFIG_DM
 struct device  *dm_root;  /* Root instance for Driver Model */
 struct list_head uclass_root;
 /* Head of core tree */
 #endif
 

const void *fdt_blob;
 /* Our device tree, NULL if none */
 void *new_fdt;
 /* Relocated FDT */
 unsigned long fdt_size;
 /* Space reserved for relocated FDT */
 void **jt;  /* jump table */
 char env_buf[32];
 /* buffer for getenv() before reloc. */
 #ifdef CONFIG_TRACE
 void  *trace_buff;
 /* The trace buffer */
 #endif
 #if defined(CONFIG_SYS_I2C)
 int  cur_i2c_bus;
 /* current used i2c bus */
 #endif
 unsigned long timebase_h;
 unsigned long timebase_l;
 struct arch_global_data arch;
 /* architecture-specific data */
 

#ifdef CONFIG_xxxxx  //此处随便x
 void  *priv;
 /* point to the private data */
 #endif
 } gd_t;
 

在使用的过程中包含头文件,就可以使用了。

u-boot Makefile完全解读

U-Boot中的date命令

U-Boot源代码下载地址

U-Boot下的两个重要数据:bd_t和gd_t

U-Boot中的version命令

U-Boot中的usb命令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/41a8c53d58934c632f2401e1b356a460.html