#前言
多次寫一個完完全全移植一遍uboot的過程,用於熟悉與鞏固自己的知識,手頭正好有一個fileflyrk3288,那廢話不多說開始野生移植。
下一個對的uboot。
開始我下載了uboot2019版,結果需要支持gcc6,果斷放棄,後續又去下載uboot201709版,發現直接用make menuconfig都執行不了,下了一個uboot201711版,正常可以編譯的。說明這個是正常的
熟悉一下源碼結構
tree -L 1
源碼目錄構成
|-- Documentation
|-- Kbuild
|-- Kconfig
|-- Licenses
|-- MAINTAINERS
|-- Makefile
|-- README
|-- api
|-- arch
|-- board
|-- cmd
|-- common
|-- config.mk
|-- configs
|-- disk
|-- doc
|-- drivers
|-- dts
|-- env
|-- examples
|-- fs
|-- include
|-- lib
|-- net
|-- post
|-- scripts
|-- snapshot.commit
|-- test
`-- tools
在readme上的目錄介紹如下:
Directory Hierarchy:
====================
/arch Architecture specific files
/arc Files generic to ARC architecture
/arm Files generic to ARM architecture
/m68k Files generic to m68k architecture
/microblaze Files generic to microblaze architecture
/mips Files generic to MIPS architecture
/nds32 Files generic to NDS32 architecture
/nios2 Files generic to Altera NIOS2 architecture
/openrisc Files generic to OpenRISC architecture
/powerpc Files generic to PowerPC architecture
/sandbox Files generic to HW-independent "sandbox"
/sh Files generic to SH architecture
/x86 Files generic to x86 architecture
/api Machine/arch independent API for external apps
/board Board dependent files
/cmd U-Boot commands functions
/common Misc architecture independent functions
/configs Board default configuration files
/disk Code for disk drive partition handling
/doc Documentation (don't expect too much)
/drivers Commonly used device drivers
/dts Contains Makefile for building internal U-Boot fdt.
/examples Example code for standalone applications, etc.
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
/include Header Files
/lib Library routines generic to all architectures
/Licenses Various license files
/net Networking code
/post Power On Self Test
/scripts Various build scripts and Makefiles
/test Various unit test files
/tools Tools to build S-Record or U-Boot images, etc.
用其他產品編譯一下,檢查uboot的可編譯性與整個makefile的完整性
make rock2_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 4
確保編譯能夠正常完成。ok,那麼就能保證代碼是可編譯的。
下面就是重頭戲戲了,啓動移植之旅
選擇相關的config
上面已經使用rock2_defonfig做了kconfig的選項,然後使用make menuconfig進去看看具體的config是咋麼樣的。
大該是這個樣子的,然後到裏面的ARM architecture,看見了直接是支持rk3328,甚至裏面直接支持了firefly-rk3328了。
good。
再看一下根目錄下的.config
# CONFIG_ARCH_STI is not set
CONFIG_ARCH_ROCKCHIP=y
# CONFIG_TARGET_THUNDERX_88XX is not set
# CONFIG_ARCH_ASPEED is not set
# CONFIG_SPL_GPIO_SUPPORT is not set
CONFIG_SPL_LIBCOMMON_SUPPORT=y
CONFIG_SPL_LIBGENERIC_SUPPORT=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
# CONFIG_ROCKCHIP_RK3036 is not set
# CONFIG_ROCKCHIP_RK3188 is not set
# CONFIG_ROCKCHIP_RK322X is not set
CONFIG_ROCKCHIP_RK3288=y
可以,裏面的config均已經配好,暫且作爲開發板的config。
執行以下命令
cp .config ./configs/fireflyrk3328_defconfig
make fireflyrk3328_defconfig
就可以執行了
但是我發現一個更讓我省心的事情,那就是在源碼中已經支持fileflyrk3328,在configs目錄中直接有firefly-rk3288_defconfig,這意味着我直接可以用這個配置進行直接編譯。但本着寫博客的目的,捨近求遠先。
添加自己的config頭文件
cd include/configs
cp rock2.h ./fireflyrk3288.h
添加自己的單板配置文件
cd boad/rockchip/
cp evb_rk3288/ ./fireflyrk3288 -af
打開kconfig文件來看自己的選項
if TARGET_EVB_RK3288 #控制宏
config SYS_BOARD #板子支持目錄(board/rockchip/evb_rk3288)
default "evb_rk3288"
config SYS_VENDOR #廠商支持(board/rockchip/),注意你可以在這邊改路徑的
default "rockchip"
config SYS_CONFIG_NAME #代表的是板子的控制頭文件(include/configs/evb_rk3288.hconfigs/evb_rk3288.h)
default "evb_rk3288"
config BOARD_SPECIFIC_OPTIONS # dummy
def_bool y
endif
很明顯是隻有TARGET_EVB_RK3288纔會其效果,那麼其他的我先不管,先改成我自己的開發板的模式,具體如下
if TARGET_FIREFLYRK3288
config SYS_BOARD
default "fireflyrk3288"
config SYS_VENDOR
default "rockchip"
config SYS_CONFIG_NAME
default "fireflyrk3288"
config BOARD_SPECIFIC_OPTIONS # dummy
def_bool y
endif
source "board/rockchip/fireflyrk3288/Kconfig"
find ./ -name “*” |xargs grep -rn “TARGET_EVB_RK3288”
通過以上命令其實可以看到一些相關的Kconfig的邏輯,以下爲我所調出來的內容。等下分析。
./board/rockchip/fireflyrk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/evb_rk3288/Kconfig:1:if TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./configs/evb-rk3288_defconfig:6:CONFIG_TARGET_EVB_RK3288=y
./configs/fireflyrk3328_defconfig:167:# CONFIG_TARGET_EVB_RK3288 is not set
./board/rockchip/fireflyrk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/evb_rk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/fireflyrk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/evb_rk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/fireflyrk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/fireflyrk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/evb_rk3288/Kconfig:1:if TARGET_EVB_RK3288
./board/rockchip/evb_rk3288/Kconfig:1:if TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./arch/arm/mach-rockchip/rk3288/Kconfig:33:config TARGET_EVB_RK3288
./configs/evb-rk3288_defconfig:6:CONFIG_TARGET_EVB_RK3288=y
./configs/fireflyrk3328_defconfig:167:# CONFIG_TARGET_EVB_RK3288 is not set
./configs/evb-rk3288_defconfig:6:CONFIG_TARGET_EVB_RK3288=y
./configs/fireflyrk3328_defconfig:167:# CONFIG_TARGET_EVB_RK3288 is not set
fireflyrk3328_defconfig:167:# CONFIG_TARGET_EVB_RK3288 is not set 這話已經表明了我們是不可能選到TARGET_EVB_RK3288的。
修正kconfig
cd arch/arm/mach-rockchip/rk3288/
修改kconfig,在config TARGET_FIREFLY_RK3288後面添加
config TARGET_FIREFLYRK3288
bool "FireflyRK3288"
select BOARD_LATE_INIT
help
Firefly is a RK3288based development board with 2 USB ports,
HDMI, VGA, micro-SD card, audio, WiFi and Gigabit Ethernet, It
also includes on-board eMMC and 1GB of SDRAM. Expansion connectors
provide access to display pins, I2C, SPI, UART and GPIOs.
當然你還可以自己建立mach的soc系列,這裏需要你瞭解kconfig的一些用途。這裏埋個坑,後續一定會講到我自己寫的輕量級buildroot,一定會細細說道。
修改defconfig
make fireflyrk3328_defconfig
make menuconfig
這裏會多一個FireflyRK3288選項,去掉前面選的Firefly-RK3288
保存,看.config可以查到
CONFIG_TARGET_FIREFLYRK3288=y
CONFIG_SYS_SOC="rockchip"
CONFIG_SYS_VENDOR="rockchip"
CONFIG_SYS_BOARD="fireflyrk3288"
CONFIG_SYS_CONFIG_NAME="fireflyrk3288"
make savedefconfig
這樣就能保存有價值的選項
cp defconfig ./configs/fireflyrk3328_defconfig
正常編譯
make fireflyrk3328_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 4