韦东山 jz2440 学习笔记 —— uboot(二)——功能简述,解压,patch,配置,编译过程

0. uboot 的功能

uboot类似于windows的BIOS,终极目的就是启动内核(将内核读入SDRAM,并执行第一个函数(应该是init()))。具体如下图:
在这里插入图片描述
可以看到主线任务包括:

  1. 硬件相关初始化,包括关看门狗,初始化时钟(jz2440上电时钟为12M,最高为400M),初始化SDRAM
  2. 将内核从nand flash 读入到SDRAM
  3. 启动内核。

支线任务主要为了方便开发,可以包括:

  1. 烧写flash
  2. 网卡相关
  3. usb相关
  4. 串口相关

1. uboot 解压缩

压缩命令详细方法点这里
tar -jxv -f u-boot-1.1.6.tar.bz2 u-boot-1.1.6/

关于tar命令可以直接记住以下三个常用

压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

2. uboot 打补丁

patch -p1 < ../u-boot-1.1.6_jz2440.patch

-p1 忽略补丁的一级目录
打补丁时所在的目录如下:

zqxl@ubuntu:/work/uboot/u-boot-1.1.6$ ls ../
u-boot-1.1.6  u-boot-1.1.6_jz2440.patch  u-boot-1.1.6.tar.bz2
zqxl@ubuntu:/work/uboot/u-boot-1.1.6$ patch -p1 <  ../u-boot-1.1.6_jz2440.patch

3. 配置

make 100ask24x0_config
这个make目标可以在Makefile中找到:
在这里插入图片描述
会发现make 100ask24x0_config 这个目标会调用源码目录下的mkconfig 脚本
在这里插入图片描述

该脚本会创建一个config.mk 文件,如下
在这里插入图片描述
config.mk 文件会在Makefile 中被包含
在这里插入图片描述
由此可见make 100ask24x0_的作用。

4. 编译及Makefile 分析

make 就完了
zqxl@ubuntu:/work/uboot/u-boot-1.1.6$ make

4.1 Makefile 顺序分析举例

在Makefile 中可以看到,交叉编译工具链是在下图位置指定的:
在这里插入图片描述

4.2 分析编译打印

直接看编译的最后打印信息可以掌握全局的信息,如下
在这里插入图片描述
整理上述打印信息:

make[1]: Leaving directory '/work/system/uboot/u-boot-1.1.6/common'
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
        cd /work/system/uboot/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /work/system/uboot/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000  $UNDEF_SYM cpu/arm920t/start.o \
                --start-group lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a --end-group  \
                -Map u-boot.map -o u-boot
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
root@book-virtual-machine:/work/system/uboot/u-boot-1.1.6#
root@book-virtual-machine:/work/system/uboot/u-boot-1.1.6#

从第三行可以看到使用的链接脚本为:
/work/system/uboot/u-boot-1.1.6/board/100ask24x0/u-boot.lds

笔者好奇这链接脚本哪来的,为嘛会有100ask的内容,就去光盘也就是100ask提供的补丁文件里搜了下,果然打补丁打进去的:在这里插入图片描述

继续看一下链接脚本:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
	. = 0x00000000; // 从 该地址+0x33F80000 开始   参照[这里](https://blog.csdn.net/caihaitao2000/article/details/79851064)

	. = ALIGN(4);
	.text      :
	{
	  cpu/arm920t/start.o	(.text)				// 先存放start.S 的代码段
          board/100ask24x0/boot_init.o (.text)	// boot_init.S 的代码段
	  *(.text)									// 所有其他文件的代码段
	}

	. = ALIGN(4);
	.rodata : { *(.rodata) }					// 只读数据段

	. = ALIGN(4);
	.data : { *(.data) }

	. = ALIGN(4);
	.got : { *(.got) }

	. = .;
	__u_boot_cmd_start = .;
	.u_boot_cmd : { *(.u_boot_cmd) }			// uboot 特有的段
	__u_boot_cmd_end = .;

	. = ALIGN(4);
	__bss_start = .;							// __bss_start 设为当前地址
	.bss : { *(.bss) }
	_end = .;
}
ubuntu18 编译uboot1.1.6 报错

不过笔者编译时报错了,报错如下图。
在这里插入图片描述
看起来是少了个动态链接库。笔者用的是自己安装的ubuntu 18,搜了下应该是18里没有libmpfr.so.4,只有libmpfr.so.6,如下命令建立软链接即可。
sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4

编译完成后可以在目录下看到编译好的二进制文件:
在这里插入图片描述

5. 烧写

在u-boot.bin文件所在目录下直接执行oflash u-boot.bin让后选择对应的JTAG接口类型和芯片型号即可。
在这里插入图片描述
笔者再次遇到麻烦,自己编译出来u-boot.bin烧进去之后启动不起来,没有任何串口打印。。。暂时先用光盘里提供的吧。(换成光盘里的ubuntu16.04编译就很顺利。。。)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值