文章目录
- 计算起始地址
- 遍历函数指针数组
-
- 定义函数指针数组
- int cpu_init(void) 函数
- int board_init(void) 函数
- int interrupt_init(void) 函数
- int env_init(void) 函数
- int init_baudrate(void) 函数
- int serial_init(void) 函数
- int console_init_f(void) 函数
- int display_banner(void) 函数
- int print_cpuinfo(void) 函数
- int checkboard(void) 函数
- int init_func_i2c(void) 函数
- int dram_init(void) 函数
- int display_dram_config(void) 函数
- 打印信息
- nand
- 初始化堆管理器
- SD/MMC控制器的初始化
- 环境变量的重定位
- 获取IP地址
- 控制台的初始化
- 中断函数的初始化(空)
- 环境变量读出初始化全局变量
- LCD初始化和显示logo
- 检查自动更新
- 主循环
- 总结
计算起始地址
这个文件的位置在uboot_jiuding\lib_arm
在start.S 的413行跳转到这
ldr pc, _start_armboot
_start_armboot:
.word start_armboot
void start_armboot (void)
{
**init_fnc_ptr; ##init_fnc_t 这是一个函数类型 ,在412行定义;这个定义看着像是函数指针,但是不是。 init_fnc_ptr 是一个二重函数指针,指向一个函数指针数组
char *s;
int mmc_exist = 0;
#if !defined(CFG_NO_FLASH) || defined (CONFIG_VFD) || defined(CONFIG_LCD)
ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif
#if defined(CONFIG_BOOT_MOVINAND)
uint *magic = (uint *) (PHYS_SDRAM_1);
#endif
/* Pointer is writable since we allocated a register for it */
#ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */
ulong gd_base; //gd_base在DDR中内存分配的起始地址
//gd_base = uboot区()+ 为栈分配的内存2M - 堆区(912KB)- 栈区(512KB)- 几十字节
gd_base = CFG_UBOOT_BASE + CFG_UBOOT_SIZE - CFG_MALLOC_LEN - CFG_STACK_SIZE - sizeof(gd_t); @@计算起始地址,确保分配的内存紧凑且安全
#ifdef CONFIG_USE_IRQ
gd_base -= (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ);
#endif
gd = (gd_t*)gd_base; //强制类型转换,给结构体指针赋值,使他指向结构体
#else
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
#endif
/* compiler optimization barrier needed for GCC >= 3.4 */
__asm__ __volatile__("": : :"memory"); //gcc的内嵌汇编,防止高版本的GCC过度优化
memset ((void*)gd, 0, sizeof (gd_t)); //清除gd指向的内存里的内容
gd->bd = (bd_t*)((char*)gd - sizeof(bd_t)); //在gd_t结构体下边留出bd_t结构体的内存(堆栈的内存是是向上走的);
memset (gd->bd, 0, sizeof (bd_t));
monitor_flash_len = _bss_start - _armboot_start;
global_data类型的结构体 别名gd_t
位置在uboot_jiuding\include\asm-arm/global_data.h
typedef struct global_data {
bd_t *bd; //bd_t 结构体 ,用于存放开发板的硬件信息
unsigned long flags; //存放标志位
unsigned long baudrate; //波特率
unsigned long have_console; //布尔类型存放0、1 /* serial_init() was called */
unsigned long reloc_off; //重定位的偏移量 /* Relocation Offset */
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
#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;
bd_info类型的结构体 别名bd_t
主要存放板级信息(全局变量 )
位置在uboot_jiuding\include\asm-arm/u-boot.h
typedef struct bd_info {
int bi_baudrate; //波特率 /* serial console baudrate */
unsigned long bi_ip_addr; //板子的IP地址 /* IP Address */
unsigned char bi_enetaddr[6]; /* Ethernet adress */
struct environment_s *bi_env;
ulong bi_arch_number; //板子的机器码 /* unique id for this board */
ulong bi_boot_params; //启动参数的地址 /* where this board expects params */
struct /* RAM configuration */
{
ulong start;
ulong size;
} bi_dram[CONFIG_NR_DRAM_BANKS]; @@DDR的信息
#ifdef CONFIG_HAS_ETH1
/* second onboard ethernet port */
unsigned char bi_enet1addr[6]; //第二个网卡
#endif
} bd_t;
遍历函数指针数组
//init_sequence 是一个函数指针数组 ; 判断*init_fnc_ptr != NULL ;//函数成功返回0
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
//函数不成功
hang (); //挂起,启动失败
}//初始化板级硬件时不能出现任何错误
}
定义函数指针数组
412行到442行
typedef int (init_fnc_t) (void); ##函数类型 返回值是int类型 参数为void
##函数指针是这样 typedef int (*init_fnc_t) (void)
int print_cpuinfo (void); /* test-only */
init_fnc_t *init_sequence[] = {
cpu_init, /* basic cpu dependent setup */
#if defined(CONFIG_SKIP_RELOCATE_UBOOT) //没有定义
reloc_init, /* Set the relocation done flag, must
do this AFTER cpu_init(), but as soon
as possible */
#endif
board_init, /* basic board dependent setup */
interrupt_init, /* set up exceptions */
env_init, /* initialize environment */
init_baudrate, /* initialze baudrate settings */
serial_init, /* serial communications setup */
console_init_f, /* stage 1 init of console */
display_banner,