06-S3C2440学习之移植2012u-boot到S3C2440(分析过程)

一、简单分析Uboot的过程

1.到官网下载u-boot-2012.04.01.tar.bz2

2.建立sourceinsight工程 
            a、解压并在E:\colin weidongshan\transplant_u-boot-2012.04.01\u-boot-2012.04.01建立SI 
            b、添加文件到SI工程 
           2.
1、点击"Add All",选中“Include top level sub-directories”和“Recursively add lower sub-directories”点击“OK” 

 2.2、选中“Board”目录,点击“Remove Tree”,去掉总个目录    进入“Board\Samsung\Smdk2410\”,点击"Add All"           

 2.3、选中“Arch”目录,点击“Remove Tree”,去掉总个目录 
   进入“Arch\Arm\Cpu\Arm920t\”,双击选中“Cpu.c”“Interrupts.c”“start.S”。    进入“Arch\Arm\Cpu\Arm920t\S3c24x0\”,点击"Add All"    进入“Arch\Arm\”,选中"Dts"目录,点击"Add Tree"    进入“Arch\Arm\Include\Asm\Arch_s3c24x0”,点击"Add All" 
   进入“Arch\Arm\Include\Asm\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件    进入“Arch\Arm\Include\Asm\”,单击选中"Proc-armv",点击"Add Tree"    进入“Arch\Arm\Lib\”,点击"Add All" 
           2.4、选中“Include”目录,点击“Remove Tree”,去掉总个目录 
进入“Include\”,点击"Add All",去掉“Include top level sub-directories”和“Recursively add lower sub-directories”前面的勾,表示只加顶层目录的文件    进入“Include\”,单击选中"Andestech",点击"Add Tree"    进入“Include\”,单击选中"Asm-generic",点击"Add Tree" 
 进入“Include\”,同上选中除"Configs"目录外的所有目录,点击"Add Tree"。"Configs"目录先不加,下面再议 
进入“Include\Configs\”,双击选中“Smdk2410.h”   

  2.5、同步文件,完成

3.tar xjf u-boot-2012.04.01.tar.bz2

   cd u-boot-2012.04.01
make smdk2410_config
编译 尝试编译 

解压: book@book-desktop:/work/system$ tar xjf u-boot-2012.04.01.tar.bz2      

book@book-desktop:/work/system$ cd u-boot-2012.04.01/  

配置: book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config    

编译: book@book-desktop:/work/system/u-boot-2012.04.01$ make

编译不成功,因为版本太老 
     查看版本: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-gcc -v    

拷贝解压: book@book-desktop:/work/system/u-boot-2012.04.01$ cd /work/tools/   

book@book-desktop:/work/tools$ mkdir tmp 
     book@book-desktop:/work/tools$ tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C tmp/   

book@book-desktop:/work/tools$ cd tmp/   

book@book-desktop:/work/tools/tmp$ ls   usr 
     book@book-desktop:/work/tools/tmp$ cd usr/local/arm/4.3.2/   

book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls   

arm-none-linux-gnueabi  bin  lib  libexec  share 
     book@book-desktop:/work/tools/tmp/usr/local/arm/4.3.2$ ls bin/    
  解压到根目录:book@book-desktop:/work/tools$ sudo tar xjf arm-linux-gcc-4.3.2.tar.bz2 -C / 
  查看环境变量: book@book-desktop:/work/tools$ echo $PATH 
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/other_board/gcc-3.4.5-glibc-2.3.6/bin 
  设置环境变量:book@book-desktop:/work/tools$ export 
   PATH=/usr/local/arm/4.3.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 
  查看环境变量:book@book-desktop:/work/tools$ arm-linux-gcc  -v  如果不想手动设置,你可以按如下方式修改: 
   book@book-desktop:/work/tools$ sudo vi /etc/environment     
  重新编译: book@book-desktop:/work/tools$ cd /work/system/u-boot-2012.04.01/   

book@book-desktop:/work/system/u-boot-2012.04.01$ make distclean 
     book@book-desktop:/work/system/u-boot-2012.04.01$ make smdk2410_config    

Configuring for smdk2410 board... 
  book@book-desktop:/work/system/u-boot-2012.04.01$ make 

4、下载刚编译成功的u-boot.bin,发现重新启动,串口没有任何信息

分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程

重新编译,只关心最后一条链接命令: 

book@book-desktop:/work/system/u-boot-2012.04.01$ rm u-boot  

book@book-desktop:/work/system/u-boot-2012.04.01$ make 

里面有这句arm-linux-ld  -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o 
 book@book-desktop:/work/system/u-boot-2012.04.01$ vi u-boot.lds 

通过链接脚本知道: . = 0x00000000;同时-Ttext 0x0,由此我们知道是从NOR flash开始运行,通过链接脚本还知道第一个运行的是arch/arm/cpu/arm920t/start.s 自己写bootload的总结的过程: 

a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH 

b. 如果bootloader比较大,要把它重定位到SDRAM 

c. 把内核从NAND FLASH读到SDRAM 

d. 设置"要传给内核的参数" 

e. 跳转执行内核 
反汇编: book@book-desktop:/work/system/u-boot-2012.04.01$ arm-linux-objdump -D u-boot > u-boot.dis   
新uboot的过程:   

二、通过uboot源码分析

分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程


查看最后链接命令



思考自己写bootloader的过程

a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH

b. 如果bootloader比较大,要把它重定位到SDRAM

c. 把内核从NAND FLASH读到SDRAM

d. 设置"要传给内核的参数"

e. 跳转执行内核

查看入口源码:


(1)设置安全模式


(2)关看门狗


(3)屏蔽中断


(10)设置时钟


(11)硬件相关初始化



执行完返回

(12) 调用单板初始化函数

设置栈

调用C函数

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
	bl	cpu_init_crit
#endif


/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:
	ldr	sp, =(CONFIG_SYS_INIT_SP_ADDR)
	bic	sp, sp, #7 /* 8-byte alignment for ABI compliance */
	ldr	r0,=0x00000000
	bl	board_init_f


找不到变量的值,那就反汇编一下


为汇编 ,比较复杂 放到某个内存中478的地方 去读


调用C函数



寄存器变量:


R8留给程序使用,gd就是R8

画一下内存使用图:


Gd清0

调用一系列函数

配置无关可执行程序。

调用函数数组init_sequence里的各个函数

board_early_init_f : 设置系统时钟、设置GPIO

......



(13)重定位代码

call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值