/**********************************
两个版本的U-BOOT启动对比:
************************************/
其实在总体上都差不多,只不过相对于经典版(2010.06版),新版之后都变恶心了
主要有这样的区别:
1、原版本第一阶段的第5步栈设置被放到第4步relorate前(这个没什么)
2、原版第二阶段的board_init_f被放到第一阶段第4步relorate前,就是说执行完
stack_setup栈设置后变进入了第二阶段的部分初始化,然后通过4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)又返回来第一阶段。。。感觉新版改后很乱,很没条理(开源的每年改,就是烦呀,哈哈)
//=================================================
以下列出两个阶段可能要用到的函数的路径,方便以后找:(按2011.06版本)
一阶段:
lowlevel_init函数,它是在board/samsung/smdk2410目录下的lowlevel_init.s文件中定义
二阶段:
gd是一个保存在ARM的r8寄存器中的gd_t结构体的指针,它是在/include/asm目录下的global_data.h文件内被定义的
bd结构体的数据原型为bd_t数据结构,它表示的是“板级信息”结构体,它是在/include/asm目录下的u-boot.h文件中定义的。
init_fnc_ptr函数指针数组中的各个初始化函数:
board_early_init_f函数在board/samsung/smdk2410目录下的smdk2410.c文件内timer_init函数在arch/arm/cpu/arm920t/s3c24x0目录下的timer.c文件内
env_init函数在common目录下的env_flash.c文件内
init_baudrate函数在arch/arm/lib目录下的board.c文件内
serial_init函数在drivers/serial目录下的serial_s3c24x0.c文件内,在include/configs/smdk2410.h中定义了CONFIG_S3C24X0_SERIAL
console_init_f函数在common目录下的console.c文件内
display_banner函数在arch/arm/lib目录下的board.c文件内
dram_init函数在board/samsung/smdk2410目录下的smdk2410.c文件内
各种外设的初始化:
flash_init函数是在drivers/mtd目录下的cfi_flash.c文件内(因为include/configs/smdk2410.h中定义了CONFIG_FLASH_CFI_DRIVER)
nand_init函数是在divers/mtd/nand目录下的nand.c文件内定义的
env_relocate函数是在common目录下的env_common.c文件中定义的
stdio_init ()在common目录下的stdio.c文件中定义的
jumptable_init ()在common目录下的exports.c文件中定义的
console_init_r ()是在common目录下的console.c文件中定义的
interrupt_init () enable_interrupts ()都是在arch/arm/lib目录下的interrupts.c文件中定义
eth_initialize()函数是在net目录下的eth.c文件的第209行至第298行定义的
main_loop()在common目录下的main.c文件内定义的
//===================================================================
天嵌与自己移植的U-BOOT的差别分析和领悟
先列出天嵌公司里研发人员写的 和 我们自己移植(小移植)的最大不同:
对比了一下,发现最大的不同在于common/main.c文件中,即在两阶段启动过程基本一样
不同点:(行数按天嵌版本的)
abortboot()函数(在main_loop()中被调用)
Ln239: printf ( “ Press Space key to Download Mode ! ” ) ;
Ln303 :在检测是否 a key press 时,加入了显示LOGO程序:embedsky_tq_logo();
main_loop()函数
Ln 381: LCD初始化程序
Ln481 :分支选择 下载 OR 加载模式:if ( BootFrmNORFLASH() )
run_command (“menu”,0 );
else
{
Printf (“ Booting Linux \n ”);
run_command (“boot_zImage”,0 );
}
解析一下:
前面几点都是关于LCD和LOGO显示的不多说(因为自己移植是没弄到LCD的移植)
说一下main_loop()函数中Ln481 :分支选择 下载 OR 加载模式
首先,run_command 这个是执行命令函数,一看名字就知道,也是在/common/main.c中定义的
说说最重要的“menu”和“boot_zImage”吧
1、 If从NORFLASH进行启动,则为下载模式,则执行menu()这个函数,在/common/cmd_menu.c中定义
打开cmd_menu.c文件会发现,里面都是一些串口选项列表,我们打开2440电源发现的下载列表都是从 main_menu_usage()函数中打印出来的,而选择的项又通过menu_shell()通过控制台执行各种我们的选项,每个选项的如何执行过程都列得很清楚,感觉就像跑裸机时,自己按照fzb的串口控制台弄出来一样
2、 Else 从NANDFLASH进行启动, 则为加载模式,进行LINUX系统的配置和启动。
在lib_arm /boot_zImage.c 文件:里的boot_zImage( )函数
函数执行的内容大概如下:
1、 copy kernel image
2、setup linux parameters
3、get machine type
4、GO -> call-linux
对比后的一些感悟:
虽说自己也跟着移植过U-BOOT,也能建立自己的板级支持包,能实现基本的串口控制台,NAND OR NOR FLASH,DM9000网络,JFFS2文件系统等基本功能,但比起天嵌这个,能下载 和 加载模式,还是有很多不足
所以说,自己移植只是感觉其中的方法,领悟之后还是在天嵌的基础上再加进一步移植吧,感觉没必要从头到尾都自己搞一遍,方法懂了,框架熟悉了就好
======================================================================
发表评论