uboot源码简单分析

这里只是对uboot源码目录下的内容做一个简单的分析而已,具体的学习会在之后,先来一个整体的了解。

脚本文件分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot$ tree -FL 1 | grep -v /$
.
├── arm_config.mk
├── CHANGELOG
├── CHANGELOG-before-U-Boot-1.1.5
├── Changelog_Samsung
├── config.mk
├── COPYING
├── CREDITS
├── image_split*
├── MAINTAINERS
├── MAKEALL*
├── Makefile
├── mk*
├── mkconfig*
├── mkmovi*
├── README
├── rules.mk
├── System.map
├── u-boot*
├── u-boot.bin*
├── u-boot.dis
├── u-boot.map
└── u-boot.srec*

常见的类似git、changelog、copyright就略过吧

image_split

用于分割uboot到BL1

1
2
3
4
5
6
7
8
9
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot$ cat image_split 
#!/bin/bash

#
# This script split u-boot binary for secure boot

# spiliting u-boot for BL1 (8KB -128 Byte)
rm bl2*
split -b 8064 u-boot.bin bl2.bin

MAKEALL Makefile mk

这三个是用来编译uboot的脚本

MAKEALL大概是用来设置如何编译的,因为看了脚本的前面一部分,是判断如何MAKE、LOG位置、BUILD位置的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if [ "${CROSS_COMPILE}" ] ; then
MAKE="make CROSS_COMPILE=${CROSS_COMPILE}"
else
MAKE=make
fi

if [ "${MAKEALL_LOGDIR}" ] ; then
LOG_DIR=${MAKEALL_LOGDIR}
else
LOG_DIR="LOG"
fi

if [ ! "${BUILD_DIR}" ] ; then
BUILD_DIR="."
fi

[ -d ${LOG_DIR} ] || mkdir ${LOG_DIR} || exit 1

LIST=""

Makefile就是主编译脚本了,用来管理整个uboot的编译,脚本有3千多行,暂时先放一边

至于mk就是一种类似与一键编译的东西,就把原先编译时需要手动输入的命令放到脚本里,直接执行脚本就可以编译

1
2
3
make distclean
make x210_sd_config
make -j4

mkconfig

这个是uboot的主要配置脚本,它会为指定的开发板生成配置需要的头文件和链接

1
2
3
4
#!/bin/sh -e

# Script to create header files and links to configure
# U-Boot for a specific board.

mkmovi

这个脚本和inand/SD卡启动有关

1
2
3
4
#!/bin/bash

#
# This script will create a u-boot binary for movinand/mmc boot

rules.mk

uboot的Makefile使用规则

1
2
3
4
5
6
7
8
_depend:	$(obj).depend

$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS)
@rm -f $@
@for f in $(SRCS); do \
g=`basename $$f | sed -e 's/\(.*\)\.\w/\1.o/'`; \
$(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \
done

其他目录分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot$ tree -d -L 1
.
├── api
├── api_examples
├── board
├── common
├── cpu
├── disk
├── doc
├── drivers
├── examples
├── fs
├── include
├── lib_arm
├── libfdt
├── lib_generic
├── nand_spl
├── net
├── onenand_bl1
├── onenand_ipl
├── post
├── sd_fusing
└── tools

api api_examples

api提供了一系列的系统调用

api_examples则提供了api的使用例程

board

为特定开发板提供移植的文件放在这个文件夹中

common

通用代码,与处理器架构无关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot/common$ ls
ace_sha1.c cmd_dcr.c cmd_immap.c cmd_onenand.c cmd_vfd.c env_nowhere.c miiphybb.c
ACEX1K.c cmd_df.c cmd_itest.c cmd_otp.c cmd_ximg.c env_nvram.c miiphyutil.c
altera.c cmd_diag.c cmd_jffs2.c cmd_pci.c command.c env_onenand.c secure_boot.c
bedbug.c cmd_display.c cmd_load.c cmd_pcmcia.c console.c env_sf.c serial.c
circbuf.c cmd_doc.c cmd_log.c cmd_portio.c crc16.c exports.c soft_i2c.c
cmd_ambapp.c cmd_dtt.c cmd_mac.c cmd_reginfo.c cyclon2.c fdt_support.c soft_spi.c
cmd_android.c cmd_eeprom.c cmd_mem.c cmd_reiser.c devices.c flash.c spartan2.c
cmd_autoscript.c cmd_elf.c cmd_mfsl.c cmd_sata.c dlmalloc.c fpga.c spartan3.c
cmd_bdinfo.c cmd_ext2.c cmd_mii.c cmd_scsi.c dlmalloc.src gunzip.c s_record.c
cmd_bedbug.c cmd_fastboot.c cmd_misc.c cmd_setexpr.c docecc.c hush.c stratixII.c
cmd_bmp.c cmd_fat.c cmd_mmc.c cmd_sf.c env_auto.c image.c usb.c
cmd_boot.c cmd_fdc.c cmd_mmc_fdisk.c cmd_spi.c env_common.c kgdb.c usb_kbd.c
cmd_bootldr.c cmd_fdos.c cmd_movi.c cmd_strings.c env_dataflash.c lcd.c usb_storage.c
cmd_bootm.c cmd_fdt.c cmd_mp.c cmd_terminal.c env_eeprom.c lists.c virtex2.c
cmd_cache.c cmd_flash.c cmd_mtdparts.c cmd_ubi.c env_flash.c lynxkdi.c xilinx.c
cmd_console.c cmd_fpga.c cmd_nand.c cmd_universe.c environment.c main.c xyzModem.c
cmd_cplbinfo.c cmd_i2c.c cmd_net.c cmd_usb.c env_movi.c Makefile
cmd_date.c cmd_ide.c cmd_nvedit.c cmd_usbd.c env_nand.c memsize.c

从上面的输出可以看出有三大类的文件 + cmd开头的文件是实现uboot命令的 + env开头的文件是实现环境变量的 + 其他文件是实现一些其他功能如加密算法、驱动框架等等

cpu

处理器相关的初始化和控制代码

基本不需要修改

disk

1
2
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot/disk$ ls
Makefile part_amiga.c part_amiga.h part.c part_dos.c part_dos.h part_iso.c part_iso.h part_mac.c part_mac.h

这个目录下放的是各种系统的分区表,感觉像是用来在不同系统下获取分区信息的

doc

uboot相关文档,不过感觉很乱,架构、算法、存储器、命令等等都混在一起,看起来不怎么方便

drivers

从linux中移植来的驱动

examples

示例代码

fs

文件系统

include

头文件目录

lib_arm lib_generic

架构相关的库文件

libfdt

设备树相关

net

网络相关代码的简单实现

1
2
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot/net$ ls
bootp.c bootp.h eth.c Makefile net.c nfs.c nfs.h rarp.c rarp.h sntp.c sntp.h tftp.c tftp.h

onenand* onenan相关代码

sd_fusing

SD卡烧写代码

tools

在这个目录下可以看到一些熟悉的名词像crc gdb md5等,这里就是一个工具的集合

1
2
3
4
5
6
greedyhao@greedyhao-PC:.../qt_x210v3s_160307/uboot/tools$ lsbddb        
envcrc.c fdt_rw.c image.c logos mkimage.h sha1.c
bmp_logo.c environment.c fdt_strerror.c img2brec.sh Makefile mpc86x_clk.c ubsha1.c
crc32.c fdt.c fdt_wip.c img2srec.c Makefile.win32 ncb.c updater
easylogo fdt_host.h gdb inca-swap-bytes.c md5.c scripts zlib.h
env fdt_ro.c gen_eth_addr.c libfdt_internal.h mkimage.c setlocalversion