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;
#endif
return 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 DEBUG
puts ("RAM Configuration:\n");
for(i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
print_size (gd->bd->bi_dram[i].size, "\n");
}
#else
ulong size = 0;
for (i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
size += gd->bd->bi_dram[i].size;
}
puts("DRAM: ");
print_size(size, "\n");
#endif
return (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 have
a 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);
#endif
return (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_addr
gd->bd->bi_enetaddr:gd数据结构赋值
devices_init:空的
jumptable_init:跳转表,不用关注
console_init_r:控制台的真正初始化
loadaddr,bootfile::环境变量读出,初始化环境变量
board_late_init:空的
eth_initialize:空的
x210_preboot_init:LCD初始化和显示logo
check_menu_update_from_sd:检查更新实现量产功能
main_loop:主循环
启动过程总结:(第一阶段的不需要我们调试,由开发板产商搞)
1:第一阶段是汇编代码。第二阶段是C语言
2:第一阶段在sram中。第二阶段在ddr(dram)中
3:第一阶段注重soc内部,第二阶段注重soc外部,board内部
移植时注意点:
1:x210_sd.h头文件中的宏定义
2:特定硬件的初始化函数位置(如:网卡)
dram.init讲解
最新推荐文章于 2022-07-11 20:14:38 发布