uboot源碼簡單分析

這裡只是對uboot源碼目錄下的內容做一個簡單的分析而已,具體的學習會在之後,先來一個整體的瞭解。

腳本文件分析

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

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位置的

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就是一種類似與一鍵編譯的東西,就把原先編譯時需要手動輸入的命令放到腳本里,直接執行腳本就可以編譯

make distclean
make x210_sd_config
make -j4

mkconfig

這個是uboot的主要配置腳本,它會為指定的開發板生成配置需要的頭文件和鏈接

#!/bin/sh -e

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

mkmovi

這個腳本和inand/SD卡啟動有關

#!/bin/bash

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

rules.mk

uboot的Makefile使用規則

_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

其他目錄分析

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

通用代碼,與處理器架構無關代碼

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

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

網路相關代碼的簡單實現

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等,這裡就是一個工具的集合

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


個人博客

公眾號:greedyhao
推薦閱讀:
相關文章