init_fnc_t *init_sequence[] = {
#if defined(CONFIG_ARCH_CPU_INIT)
arch_cpu_init, /* basic arch cpu dependent setup */
#endif
timer_init, /* initialize timer before usb init */
board_init, /* basic board dependent setup */
#if defined(CONFIG_USE_IRQ)
interrupt_init, /* set up exceptions */
#endif
// timer_init, /* initialize timer */
#ifdef CONFIG_FSL_ESDHC
get_clocks,
#endif
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner, /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
print_cpuinfo, /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
checkboard, /* display board info */
#endif
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
init_func_i2c,
#endif
dram_init, /* configure available RAM banks */
#if defined(CONFIG_CMD_PCI) || defined (CONFIG_PCI)
arm_pci_init,
#endif
/* display_dram_config */
NULL,
};
1 初始化函数解析
timer_init
SYS_CTRL_REG_BASE + REG_SC_CTRL
系统定时器的的设置
board_init
1 set uart clk form XTAL OSC 24M
2
2 一些关键的要点
2.1 DECLARE_GLOBAL_DATA_PTR
这个宏在include/global_data.h中,
#define DECLARE_GLOBAL_DATA_PTR registter volatile gd_t *gd asm("r8")
- 声明一个寄存器变量gd 占用r8,这个宏在所有需要引用全局数据指针gd_t *gd的源码中都有声明
- 这个声明也避免编辑器把r8分配给其他的变量,所以gd就是r8,这个指针变量不占用内存,
- register 表示变量对执行速度非常重要,因此应该放在cpu的寄存器中,寄存器独立于内存。
- volatile 用于指定变量的值可以由外部过程异步修改,例如中断例程
- 这个声明告诉编译器要使用寄存器r8来存储gd_t类型的指针gd,即这个定义声明了一个指针,并且指明了它的存储位置
2.2 gd_t里面有什么东西,即这个gd全局数据区要保存哪些所谓重要的数据?
arch/arm/include/asm/u-boot.h
typedef struct global_data {
bd_t *bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
#ifdef CONFIG_VFD
unsigned char vfd_type; /* display type */
#endif
#ifdef CONFIG_FSL_ESDHC
unsigned long sdhc_clk;
#endif
#if 0
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long bus_clk;
phys_size_t ram_size; /* RAM size */
unsigned long reset_status; /* reset status register at boot */
#endif
void **jt; /* jump table */
} gd_t;
2.2