嵌入式從入門到精通之移植uboot(1)--添加自己的板級包

#前言
多次寫一個完完全全移植一遍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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章