概要:
本文主要介紹Uboot的結構,menuconfig里的常見配置選項,編譯步驟等
# 1.Uboot的基本結構
* 下面來看看該uboot中的目錄結構
~~~
├── api 存放uboot提供的API接口函數
├── arch 平臺相關的部分我們只需要關心這個目錄下的ARM文件夾
│ ├──arm
│ │ └──cpu
│ │ │ └──armv7
│ │ └──dts
│ │ │ └──*.dts 存放設備的dts,也就是設備配置相關的引腳信息
├── board 對于不同的平臺的開發板對應的代碼
├── cmd 顧名思義,大部分的命令的實現都在這個文件夾下面。
├── common 公共的代碼
├── configs 各個板子的對應的配置文件都在里面,我們的Lichee配置也在里面
├── disk 對磁盤的一些操作都在這個文件夾里面,例如分區等。
├── doc 參考文檔,這里面有很多跟平臺等相關的使用文檔。
├── drivers 各式各樣的驅動文件都在這里面
├── dts 一種樹形結構(device tree)這個應該是uboot新的語法
├── examples 官方給出的一些樣例程序
├── fs 文件系統,uboot會用到的一些文件系統
├── include 頭文件,所有的頭文件都在這個文件夾下面
├── lib 一些常用的庫文件在這個文件夾下面
├── Licenses 這個其實跟編譯無關了,就是一些license的聲明
├── net 網絡相關的,需要用的小型網絡協議棧
├── post 上電自檢程序
├── scripts 編譯腳本和Makefile文件
├── spl second program loader,即相當于二級uboot啟動。
├── test 小型的單元測試程序。
└── tools 里面有很多uboot常用的工具。
~~~
了解了uboot的基本結構,我們可以知道一些相關的配置在什么地方了。
* lichee的uboot配置文件放在confgs文件目錄下面,名稱為
~~~
LicheePi_Zero_480x272LCD_defconfig
LicheePi_Zero_800x480LCD_defconfig
LicheePi_Zero_defconfig
~~~
這3個配置是根據不同的Zero顯示設備進行的配置,使用其中之一即可,可以在uboot目錄下執行命令
`make LicheePi_Zero_defconfig`
這樣配置就生效了。
* 關于設備的配置引腳信息可以在arch/arm/dts的設備樹下面進行查找。
通過查看arch/arm/dts/Makefile我們看到下面這段關于v3s的代碼:
~~~
dtb-$(CONFIG_MACH_SUN8I_V3S) += \
sun8i-v3s-licheepi-zero.dtb
~~~
我們基本可以找到對應的dtb文件就是sun8i-v3s-licheepi-zero.dtb
打開sun8i-v3s-licheepi-zero.dts(dtb是object文件,相當于*.o, dts相當于*.c)文件
~~~
#include "sun8i-v3s.dtsi" //這個文件包含了sun8i-v3s系列的配置
#include "sunxi-common-regulators.dtsi"
/ {
model = "Lichee Pi Zero";
compatible = "licheepi,licheepi-zero", "allwinner,sun8i-v3s";
aliases {
serial0 = &uart0;
};
chosen {
stdout-path = "serial0:115200n8";
};
};
&mmc0 {
pinctrl-0 = <&mmc0_pins_a>;
pinctrl-names = "default";
broken-cd;
bus-width = <4>;
vmmc-supply = <®_vcc3v3>;
status = "okay";
};
&uart0 {
pinctrl-0 = <&uart0_pins_a>;
pinctrl-names = "default";
status = "okay";
};
&usb_otg {
dr_mode = "otg";
status = "okay";
};
&usbphy {
usb0_id_det-gpio = <&pio 5 6 GPIO_ACTIVE_HIGH>;
status = "okay";
};
~~~
從這個配置文件中可以看出,我們所用的stdout輸出是用的uart0
波特率115200,mmc的配置, uart0的引腳采用的是uart0_pins_a 等。
如若需要修改對應的輸出,可以在這個文件中修改。
# 2. menuconfig里的常見配置選項
編譯uboot的需要生成.config文件來將該配置生效。
配置的生效有兩步:
**第一步,先將Zero默認的配置加載進來:**
Zero已經將配置定制好了,執行相應的命令就可以生成了。下面是生成配置的命令
`make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig`
這個命令可以分為3個部分
1. 設置變量ARCH值為arm
2. 設置變量CROSS_COMPILE值為arm-linux-gnueabihf-
3. make LicheePi_Zero_800x480LCD_defconfig
最后一個make LicheePi_Zero_800x480LCD_defconfig才是重點,執行這條命令就可以對應生成一個編譯所需要的配置文件.config
**第二步,對于配置文件可以通過是圖形界面的方式修改某一個特定配置選項**
有了配置文件,需要的時候我們可以對其進行修改,linux提供了一種圖形界面的方式,這種方式一般在后期需要改某些編譯選項的時候,用戶交互比較方便,現在我們可以來看看有哪些配置。
`make ARCH=arm menuconfig`
執行這個命令就可以出現一個UI交互比較好的配置文件選項,可以看下面的截圖:

<ENTER> ---按回車,即選擇當前菜單
<Y> ------- 按Y 代表該config選項選中
<N> ------- 按N 代表不選中該選項
<M> -------- 按M 代表該驅動編譯成*.ko的方式,在系統起來之后,當驅動需要的時候加載
</>---------按/ 可以查找某個選項
<esc>---------退出
<\*> ----------按Y選中后的狀態
**這里面有幾個常見的配置選項我們可以看下:**
1. 第一個`Architecture select`架構選擇,不用質疑這個是ARM架構
2. 第二個`ARM architecture ` 這個選項比較重要,主要配置ARM框架下的常用的配置函數以及LCD等參數

~~~
...
Target select (Support sunxi (Allwinner) SoCs) 進去之后可以選擇sunxi Soc系列芯片
...
[*] Sunxi SoC Variant 這個就是對芯片Soc 的選擇,我們可以看到配置選擇了`sun8i (Allwinner V3s)
(360) sunxi dram clock speed 配置dram的時鐘速率
(14779) sunxi dram zq value 配置dram的ZQ值,是用來動態加強DDR3的
-*- Board uses DDR2 DRAM 使用DDR2 DRAM
~~~

~~~
[*] Enable graphical uboot console on HDMI, LCD or VGA 這個就是在顯示設備上使能串口控制
[ ] VGA via LCD controller support 使能支持VGA通過LCD的控制器,就是LCD和VAG轉換需要的控制器
(x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0) LCD pane
> 該選項就是配置LCD的分辨率的配置選項可以看到x是800 y是480 等等一些關于LCD的配置內容,點擊回車進去可以對其進行修改。
(1) LCD panel display clock phase 這個是LCD的顯示時鐘相位
() LCD panel power enable pin LCD的電源使能引腳
() LCD panel reset pin LCD的復位引腳
(PB4) LCD panel backlight pwm pin 背光PWN引腳 這個應該是調節亮度的引腳PB4
[*] LCD panel backlight pwm is inverted 反轉PWN背光引腳
[ ] LCD panel needs to be configured via i2c
LCD panel support (Generic parallel interface LCD panel) ---> 這個選擇支持的LCDpanel
(X) Generic parallel interface LCD panel 這里選擇支持通用的并行的LCD接口
( ) Generic lvds interface LCD panel 這個是LVDS接口
( ) MIPI 4-lane, 513Mbps LCD panel via SSD2828 bridge chip
( ) eDP 4-lane, 1.62G LCD panel via ANX9804 bridge chip
( ) Hitachi tx18d42vm LCD panel
( ) tl059wv5c0 LCD panel
(0) GMAC Transmit Clock Delay Chain
~~~
3.`General setup --->`
`(0x400) Size of malloc() pool before relocation` 這個我們就看下malloc的棧池分配了0x400大小
4.`Boot images ---> `
`(1008000000) CPU clock frequency` 這里設置了CPU的時鐘頻率
5.`delay in seconds before automatically booting`這個是uboot開機的時候的一個等待時間的秒數,可以改大一點,默認是2s
6.`Console --->` 這個就是串口打印的一些配置
7.`Display information about the CPU during start up` 開機的時候顯示CPU信息。
8.`Display information about the board during start up` 開機的時候顯示BOARD的信息
9.`SPL / TPL --->` 這個就是SPL相關的配置了
~~~
[*] MMC raw mode: by sector 按扇區
(0x50) Address on the MMC to load U-Boot from mmc加載uboot的地址
[*] Support GPIO 支持GPIO
[*] Support I2C 支持I2C
[*] Support common libraries 支持通用lib
[*] Support disk paritions 支持分區
[*] Support generic libraries 支持一般lib庫
[*] Support MMC 支持MMC
[*] Support power drivers 支持電源驅動
[*] Support serial 支持串口
~~~
10.`Command line interface --->`
這里存放的是u-boot啟動的時候支持的cmd
基本常用的就是上述配置,其他配置都可以采用官方配置就可以了。
# 3.編譯步驟
上面已經講述了如何把配置文件進行生成.config文件。做好這兩件事情之后就可以編譯了。
官方git上給的命令是:
`time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log`
第一個time命令完全可以去掉,time主要為了計算該編譯需要花費的時間
`make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-`
這個之前的config也說了,其實就是給變量ARCH賦值arm
給CROSS_COMPILE賦值arm-linux-gnueabihf-
也可以先省去,剩下的:
`make 2>&1 | tee build.log`
tee 這個命令是把make生成的log寫入到build.log文件中,這樣編譯之后的log文件可以保留存有備份,也可以省去。
`make 2>&1`
查了下資料 數字2對應`stderr` 數字1對應`stdout`
這里即將標準err輸出 &作為連接符表示‘與’的意思,即標準輸出和標準error輸出都進行輸出。
其實真正執行編譯的是下面的命令:
`make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-`
小伙伴可以試下,該命令是否可以編譯出u-boot-sunxi-with-spl.bin文件,其他的命令都是輔助編譯的命令,用于調試的時候開啟。親測直接make CROSS_COMPILE=arm-linux-gnueabihf- 也是可以的。
**FAQ:下面的內容可能其他章節會講到,所以下面就大致講下編譯環境的搭建**
本文所描述的uboot是基于[Lichee_Pi/uboot.git](https://github.com/Lichee-Pi/u-boot.git)的版本
先下載代碼,執行下面的命令。
~~~
+ git clone https://github.com/Lichee-Pi/u-boot.git
+ git checkout -b v3s-current origin/v3s-current
+ export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
+ make LicheePi_Zero_defconfig
~~~
1. 先要配置好編譯環境可以參照
[開發環境搭建.md](https://github.com/Zepan/ilichee/blob/master/%E8%BF%9E%E8%BD%BD%E5%B8%96/2.1.1%20%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA.md)
操作系統官方默認是在Ubuntu 14.04 64bit的環境下編譯的。
我試了下在Ubuntu16.04.1的ubuntu的版本下進行編譯。
裝好虛擬機操作系統之后,我們先安裝一些依賴包
~~~
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev gcc-multilib x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils
sudo apt-get install gcc-arm-linux-gnueabihf
~~~
執行完這兩條命令之后,如果安裝成功,應該是可以編譯的,當然我在嘗試的時候最后mingw32會出現一些問題。
可能對于ubuntu16.04版本還要根據
git上**[編譯坑_Ubuntu 16.04編譯過程踩坑記錄.md](https://github.com/Zepan/ilichee/blob/master/%E9%82%A3%E4%BA%9B%E5%B9%B4%E6%88%91%E4%BB%AC%E8%B8%A9%E7%9A%84%E5%9D%91/%E7%BC%96%E8%AF%91%E5%9D%91_Ubuntu%2016.04%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95.md)**來修改gcc的版本.然后呢根據
**[編譯坑_Ubuntu16.04編譯過程踩坑記錄二.md](https://github.com/Zepan/ilichee/blob/master/%E9%82%A3%E4%BA%9B%E5%B9%B4%E6%88%91%E4%BB%AC%E8%B8%A9%E7%9A%84%E5%9D%91/%E7%BC%96%E8%AF%91%E5%9D%91_Ubuntu16.04%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95%E4%BA%8C.md)**
來修改部分的mingw32相關的編譯選項,對了后面編譯uboot的時候還會遇到dtc編譯版本低的問題,所以在此還要執行sudo apt-get install device-tree-compiler的命令升級dtc。至此編譯環境基本搭建好了。
這些都是樓主踩過的坑,感謝樓主,我們應該不需要踩了。還是挺有用的。
接著就可以下載uboot的源代碼:
` https://github.com/Lichee-Pi/u-boot.git`
執行這段命令uboot的源代碼就下下來了。
- 前言
- 荔枝派TODO任務領取
- linux使用小貼士
- 入門篇
- 板卡介紹
- 開箱指南
- 燒錄啟動系統
- 聯網方法
- 鏡像使用
- 鏡像說明
- buildroot系統使用
- debian系統使用
- 外設操作
- 外設操作概覽
- 低速外設
- GPIO
- GPIO模擬低速接口
- UART
- PWM
- I2C
- SPI
- 高速接口
- SDIO
- USB
- EtherNet
- DVP CSI
- MIPI CSI
- 模擬外設
- CODEC
- LRADC
- 常見設備驅動
- USB攝像頭
- USB 3G/4G 網卡
- 舵機
- 開發篇
- UBOOT適配
- UBOOT編譯
- UBOOT配置
- UBOOT配置屏幕分辨率
- UBOOT配置SPI啟動
- Linux內核開發
- Linux內核編譯
- BSP Linux內核編譯.md
- Linux內核選項
- 外設驅動與設備樹
- RTL8723BS驅動
- 根文件系統定制
- buildroot定制系統
- buildroot添加軟件包
- openwrt定制系統
- emdebian定制系統
- camdriod開發
- camdriod編譯
- 主線Uboot引導Camdriod
- 系統鏡像打包
- XBOOT適配
- 荔枝運行XBOOT
- 應用篇
- 游戲機-基于EmulationStation
- 游戲機-gnuboy
- 語音識別-科大訊飛云
- GUI-QT5
- 語音識別-離線關鍵詞識別
- 路由器-Lichee Zero
- 投稿文章
- 荔枝派Zero開箱指南
- Zero i2c oled使用指南
- zero SPI LCD使用指南
- Zero u-boot編譯和使用指南
- TF WiFi使用方法
- Zero Ethernet使用指南
- Zero 移植Qt5.4.1
- ZeroSpiNorFlash啟動系統制作指南
- Visio-uboot-sunxi流程
- lichee 編譯踩坑記錄(ilichee ZERO)
- lichee_zero_外設GPIO接口
- TF WIFI 小白編
- 從零開始LicheePi Zero的開發
- 認識Zero的硬件
- 搭建Zero的開發環境
- 主線Uboot
- 主線kernel
- BSP kernel
- BSP內核啟動
- bsp內核的攝像頭使用
- BSP內核中的保留內存
- uboot啟動BSP內核常見錯誤
- BSP內核 FBTFT移植
- BSP內核啟動錯誤及警告解決
- buildroot 根文件系統
- emdebian 根文件系統
- SPI Flash 系統編譯
- sunxi-fel增加對16M 以上flash的支持
- overlayfs的使用
- jffs2系統掛載不上的常見原因
- JFFS2 文件系統簡介
- uboot對spi flash的識別
- bsp內核的SPI flash啟動
- Docker開發環境
- Docker 命令速查
- 基礎ubuntu系統配置
- docker離線鏡像
- Zero系統燒錄
- dd鏡像燒錄
- 分區鏡像燒錄
- SPI Flash系統燒錄
- 一鍵鏡像燒錄
- Zero外設把玩
- I2C操作
- PWM輸出
- CODEC的使用
- 以太網使用指南
- GPIO操作
- 文件IO方式
- C語言接口(mmap)
- Python操作GPIO
- pinctrl-sunxi介紹
- UART操作
- 點屏
- 點屏之RGB屏
- 點屏之SPI屏 ili9341
- 點屏之SPI OLED
- 點屏之I2C OLED
- 點屏之SPI屏 ili9488
- 點屏之MCU屏
- 點屏之觸摸屏驅動
- 點屏之simple-framebuffer
- 點屏之屏幕時序
- 時鐘控制器CCM
- 攝像頭
- BSP DVP攝像頭
- BSP MIPI 攝像頭
- 主線DVP攝像頭
- 主線 MIPI攝像頭
- SPI 操作
- 應用層開發
- 開機自啟動
- Segment Fault調試
- Zero通過OTG共享PC網絡
- USB攝像頭使用
- 基于QT的GUI開發
- 移植tslib
- 移植QT5.9.1
- 移植QT4.8.7
- QtCreator使用
- Qt5.x移植到Qt4.8
- Qt字體相關
- Qt移植總結
- Qt裁剪
- Qt去除鼠標指針顯示
- zero_imager使用
- 驅動開發
- 設備樹簡介
- GPU/DRM 顯示驅動
- sys下設備樹查看
- atmel觸摸屏驅動分析
- atmel觸摸屏中斷改輪詢
- uboot下gpio操作
- helloworld驅動編譯演示
- FBTFT分析
- 內核模塊靜態加載的順序
- SPI驅動分析
- SPI 驅動編寫
- Uboot開發
- 開機logo
- 看門狗的使用
- 關于系統reboot
- 內核printk等級設置