微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 移植最新uboot的总结

移植最新uboot的总结

时间:11-21 来源:互联网 点击:

重新编译,只关心最后一条链接命令:
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的过程:
2.1 set the cpu to SVC32 mode
2.2 turn off the watchdog
2.3 mask all IRQs by setting all bits in the INTMR
2.4 设置时钟比例
2.5 设置内存控制器
2.6 设置栈,调用C函数board_init_f
2.7 调用函数数组init_sequence里的各个函数
2.7.1 board_early_init_f : 设置系统时钟、设置GPIO
......
2.8 重定位代码:
2.8.1 从NOR FLASH把代码复制到SDRAM
2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"
现在把程序复制到了SDRAM
需要修改代码,把"基于0地址编译得到的地址"改为新地址
2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs
2.9 clear_bss
2.10 调用C函数board_init_r:第2阶段的代码


book@book-desktop:/work/system/u-boot-2012.04.01$arm-linux-ld --help | grep pie
-pie, --pic-executable Create a position independent executable

可以修改配置定义CONFIG_S3C2440

3. 修改U-BOOT代码
3.1 建一个单板(修改3个文件)

book@book-desktop:/work/system/u-boot-2012.04.01$make distclean
book@book-desktop:/work/system/u-boot-2012.04.01$cd board/samsung/
book@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$cp smdk2410 smdk2440 -rf
book@book-desktop:/work/system/u-boot-2012.04.01/board/samsung$cd ../..
book@book-desktop:/work/system/u-boot-2012.04.01$cd include/configs/
book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$cp smdk2410.h smdk2440.h
看看是否能编译通过:
book@book-desktop:/work/system/u-boot-2012.04.01/include/configs$cd ../..
book@book-desktop:/work/system/u-boot-2012.04.01$make smdk2440_config
make: *** No rule to make target `smdk2440_config. Stop.
make: *** [smdk2440_config] Error 1
编译通不过.怀疑是makefile的问题,搜索一下:
book@book-desktop:/work/system/u-boot-2012.04.01$grep "smdk2410" * -nR
arch/arm/include/asm/mach-types.h:1644:# define machine_is_smdk2410() (machine_arch_type == MACH_TYPE_SMDK2410)
arch/arm/include/asm/mach-types.h:1646:# define machine_is_smdk2410() (0)
board/samsung/smdk2410/Makefile:28:COBJS := smdk2410.o
board/samsung/smdk2440/Makefile:28:COBJS := smdk2410.o
boards.cfg:65:smdk2410 arm arm920t - samsung s3c24x0
MAINTAINERS:750: smdk2410 ARM920T

book@book-desktop:/work/system/u-boot-2012.04.01$vi boards.cfg
在boards.cfg文件下复制65行,修改boards.cfg:
仿照
smdk2410 arm arm920t - samsung s3c24x0
添加:
smdk2440 arm arm920t - samsung s3c24x0
然后重新配置一下
book@book-desktop:/work/system/u-boot-2012.04.01$make smdk2440_config
然后重新编译一下
book@book-desktop:/work/system/u-boot-2012.04.01$make

3.2 烧写看结果无法执行,下面按照第2节里面的分析启动过程

3.3 调试:
a. 阅读代码发现不足:UBOOT里先以60MHZ的时钟计算参数来设置内存控制器,但是MPLL还未设置
①处理措施: 把MPLL的设置放到start.S里,取消board_early_init_f里对MPLL的设置,如下面注释掉下面两行
//writel(0xFFFFFF, &clk_power->locktime);


//writel((M_Mdiv < 12) + (M_Pdiv < 4) + M_Sdiv,
// &clk_power->mpllcon);

编译出来的uboot非常大,可以先烧写主光盘里的u-boot.bin到nor,然后用这个uboot来烧写新的uboot
先查看一下是不是刚下的烧写结果是不是有问题
等待usb下载完: OpenJTAG> usb 1 30000000 //1表示一直等待
把flash的写保护去掉: OpenJTAG> protect off all //解除norflash写保护
把flash擦除:开始和结束地址OpenJTAG> erase 0 7FFFF //擦除从0到0x7FFFF共0x80000个字节
下载进flash:OpenJTAG> cp.b 30000000 0 80000 //从内存0x30000000开始烧写程序到norflash的0地址去,烧写0X80000个字节
反汇编:book@book-desktop:/work/system/u-boot-2012.04.01$arm-linux-objdump -D u-boot > u-boot.dis
上面反汇编的目的是:查看call_board_init_f所在的汇编地址,开始执行这个函数的时候,说明cpu_init_crit已经执行完了,SDRAM已经初始化完了,我们现在就是想验证一下SDRAM是否初始化成功

②修改start.S里的代码
# endif

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top