int dram_init(void)//是关于ddr的初始化,在会汇编阶段已经初始化过ddr,否则也无法relocate到第二阶段
//这里再次初始化是因为这里是在给gd->bd里面关于ddr配置部分的全局变量赋值,让gd->bd数据记录下来
//当前的开发板的ddr的配置信息,以便在uboot中使用内存
//(3):从代码上看。其实就是初始化gd->bd->bi_dram这个结构体数组,
{DECLARE_GLOBAL_DATA_PTR;gd->bd->bi_dram[0].start = PHYS_SDRAM_1; //第一片内存的起始地址//没有宏定义判断,因为至少也要有一篇ddr内存存在gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; //第一片内存的大小#if defined(PHYS_SDRAM_2)gd->bd->bi_dram[1].start = PHYS_SDRAM_2;gd->bd->bi_dram[1].size = PHYS_SDRAM_2_SIZE;
#endif#if defined(PHYS_SDRAM_3)gd->bd->bi_dram[2].start = PHYS_SDRAM_3;gd->bd->bi_dram[2].size = PHYS_SDRAM_3_SIZE;
#endifreturn 0;
}static int display_dram_config (void)//打印显示dram的配置信息,
//启动信息中的(dram: 512MB)就是在这里打印的,其中在运行中要得知配置信息:使用bdinfo
//这个命令可以打印出gd->bd中记录的所有硬件相关的全局变量的值,
可得知ddr的配置信息:
dram bank = 0x00000000
->start = 0x30000000
->size = 0x10000000
dram bank = 0x00000001
->start = 0x40000000
->size = 0x10000000
//
{int i;#ifdef DEBUGputs ("RAM Configuration:\n");for(i=0; ibd->bi_dram[i].start);print_size (gd->bd->bi_dram[i].size, "\n");}
#elseulong size = 0;for (i=0; ibd->bi_dram[i].size;}puts("DRAM: ");print_size(size, "\n");
#endifreturn (0);
}//init_sequence 总结:
board_init 初始化:都是板级硬件的初始化以及gd->bd,gd中的数据结构的初始化,譬如:
网卡初始化,机器码(gd->bd->bi_arch_number),内核传参ddr地址(gd->bd->bi_boot_params),
interupt_init 是对定时器4初始化为10ms一次
波特率初始化
serial_init:串口初始化
console_ini_f:第一阶段初始化(gd->have_console设置为1)
打印uboot的启动信息:plar_banner函数(这个函数里面有打开lcd背光的函数)
打印cpu相关设置信息,检查并打印当前开发板名字,ddr配置信息的初始化(dram_init)
ddr总容量打印hang()挂起函数int console_init_r (void) //纯软件架构方面的初始化(说白了就是给console相关的数据结构中填充相应的值)
{//这个东西在uboot中是没多大作用的,因为是调用串口函数实现的。但在linux内核中就有缓冲作用device_t *inputdev = NULL, *outputdev = NULL;int i, items = ListNumItems (devlist);#ifdef CONFIG_SPLASH_SCREEN/* suppress all output if splash screen is enabled and we havea bmp to display */if (getenv("splashimage") != NULL)gd->flags |= GD_FLG_SILENT;
#endif/* Scan devices looking for input and output devices */for (i = 1;(i <= items) && ((inputdev == NULL) || (outputdev == NULL));i++) {device_t *dev = ListGetPtrToItem (devlist, i);if ((dev->flags & DEV_FLAGS_INPUT) && (inputdev == NULL)) {inputdev = dev;}if ((dev->flags & DEV_FLAGS_OUTPUT) && (outputdev == NULL)) {outputdev = dev;}}/* Initializes output console first */if (outputdev != NULL) {console_setfile (stdout, outputdev);console_setfile (stderr, outputdev);}/* Initializes input console */if (inputdev != NULL) {console_setfile (stdin, inputdev);}gd->flags |= GD_FLG_DEVINIT; /* device initialization completed */#ifndef CFG_CONSOLE_INFO_QUIET/* Print information */puts ("In: ");if (stdio_devices[stdin] == NULL) {puts ("No input devices available!\n");} else {printf ("%s\n", stdio_devices[stdin]->name);}puts ("Out: ");if (stdio_devices[stdout] == NULL) {puts ("No output devices available!\n");} else {printf ("%s\n", stdio_devices[stdout]->name);}puts ("Err: ");if (stdio_devices[stderr] == NULL) {puts ("No error devices available!\n");} else {printf ("%s\n", stdio_devices[stderr]->name);}
#endif /* CFG_CONSOLE_INFO_QUIET */#ifndef CONFIG_X210/* Setting environment variables */for (i = 0; i < 3; i++) {setenv (stdio_names[i], stdio_devices[i]->name);}
#endif#if 0/* If nothing usable installed, use only the initial console */if ((stdio_devices[stdin] == NULL) && (stdio_devices[stdout] == NULL))return (0);
#endifreturn (0);
}#endif /* CFG_CONSOLE_IS_IN_ENV *///uboot总结:第二阶段:主要是对开发板级别的硬件,软件的初始化
:init_sequence:cpu_init.空的board_init :网卡,机器码,内存传参地址:dm9000_pre_init:网卡初始化gd->bd->bi_arch_number:机器码gd->bd->bi_boot_params:内存传参地址interupt_init:定时器env_init:init_baudrate:gd数据结构中波特率的初始化serial_init:串口初始化console_ini_f:空的display_banner:打印启动信息display_cpuinfo:打印cpu的时钟设置信息checkboard:检验开发板名称dram_init:gd数据中的ddr信息display_dram_config:打印ddr配置信息表mem_malloc_init:初始化uboot自个维护的堆内存mmc_initiallier:inand/sd卡的soc的控制器和卡的初始化env_relocate:环境变量重定位gd->bd->bi_ip_addrgd->bd->bi_enetaddr:gd数据结构赋值devices_init:空的jumptable_init:跳转表,不用关注console_init_r:控制台的真正初始化loadaddr,bootfile::环境变量读出,初始化环境变量board_late_init:空的eth_initialize:空的x210_preboot_init:LCD初始化和显示logocheck_menu_update_from_sd:检查更新实现量产功能main_loop:主循环启动过程总结:(第一阶段的不需要我们调试,由开发板产商搞)
1:第一阶段是汇编代码。第二阶段是C语言
2:第一阶段在sram中。第二阶段在ddr(dram)中
3:第一阶段注重soc内部,第二阶段注重soc外部,board内部移植时注意点:
1:x210_sd.h头文件中的宏定义
2:特定硬件的初始化函数位置(如:网卡)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!