Tina_Linux_系統軟件 開發指南
![image-20221123145359081](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT2mAXaJUAAgTVkkhR6k434.png)
![image-20221123145359081](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT2uACJnfABXUYg5dy40796.png)
![image-20221123145359081](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT2yAZOZXABUT7vzzsko532.png)
![image-20221123145359081](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT26ATRkzAAx3xQrf2rw878.png)
![image-20221123145359081](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3CAfaHoAA5O152ocNw643.png)
1 概述
編寫目的:本文檔作為Allwinner Tina Linux系統平臺開發指南,旨在幫助軟件開發工程師、技術支持工程師快速上手,熟悉Tina Linux系統的開發及調試流程。
適用范圍:Tina Linux v3.5及以上版本。
2 Tina系統資料
2.1 概述
Tina SDK發布的文檔旨在幫助開發者快速上手開發及調試,文檔中涉及的內容并不能涵蓋所有的開發知識和問題。文檔列表也正在不斷更新。
Tina SDK提供豐富的文檔資料,包括硬件參考設計文檔、Flash等基礎器件支持列表、量產工具使用說明、軟件開發與制定介紹文檔、芯片研發手冊等資料。
2.2 文檔列表
3 Tina系統概述
3.1 概述
Tina Linux系統是基于openwrt-14.07的版本的軟件開發包,包含了Linux系統開發用到的內核源碼、驅動、工具、系統中間件與應用程序包。openwrt是一個開源的嵌入式Linux系統自動構建框架,是由Makefile腳本和Kconfig配置文件構成的。使得用戶可以通過menuconfig配置,編譯出一個完整的可以直接燒寫到機器上運行的Linux系統軟件。
3.2 系統框圖
![圖3-1: Tina Linux系統框圖](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT3GAKzPOAAFjhGHpMJ4967.jpg)
Tina系統軟件框圖如圖所示,從下至上分為Kernel && Driver、Libraries、System Ser-vices、Applications四個層次。各層次內容如下:
Kernel&&Driver主要提供Linux Kernel的標準實現。Tina平臺的Linux Kernel 采用Linux3.4、linux3.10、linux4.4、linux4.9等內核(不同硬件平臺可能使用不同內核版本)。提供安全性,內存管理,進程管理,網絡協議棧等基礎支持;主要是通過Linux內核管理設備硬件資源,如CPU調度、緩存、內存、I/O等。
Libraries層對應一般嵌入式系統,相當于中間件層次。包含了各種系統基礎庫,及第三方開源程序庫支持,對應用層提供API接口,系統定制者和應用開發者可以基于Libraries層的API開發新的應用。
System Services層對應系統服務層,包含系統啟動管理、配置管理、熱插拔管理、存儲管理、多媒體中間件等。
Applications層主要是實現具體的產品功能及交互邏輯,需要一些系統基礎庫及第三方程序庫支持,開發者可以開發實現自己的應用程序,提供系統各種能力給到最終用戶。
3.3 開發流程
Tina Linux 系統是基于 Linux Kernel,針對多種不同產品形態開發的 SDK。可以基于本 SDK,有效地實現系統定制和應用移植開發。
![圖3-2: Tina Linux系統開發流程](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3GAF6aBAABt_kzk2ZU731.jpg)
如上圖所示,開發者可以遵循上述開發流程,在本地快速構建Tina Linux系統的開發環境和編譯 代碼。下面將簡單介紹下該流程:
檢查系統需求:在下載代碼和編譯前,需確保本地的開發設備能夠滿足需求,包括機器的硬件能力,軟件系統,工具鏈等。目前Tina Linux系統只支持Ubuntu操作系統環境下編譯,并僅提供Linux環境下的工具鏈支持,其他如MacOS,Windows等系統暫不支持。
搭建編譯環境:開發機器需要安裝的各種軟件包和工具,詳見開發環境章節,獲知TinaLinux已經驗證過的操作系統版本,編譯時依賴的庫文件等。
選擇設備:在編譯源碼前,開發者需要先導出預定義環境變量,然后根據開發者根據的需求,選擇對應的硬件板型,詳見編譯章節。
系統定制:開發者可以根據使用的硬件板子、產品定義,定制U-Boot、Kernel及Open-wrt,請參考后續章節中相關開發指南和配置的描述。
編譯與打包:完成設備選擇、系統定制之后執行編譯命令,包括整體或模塊編譯以及編譯清理等工作,進一步的,將生成的boot/內核二進制文件、根文件系統、按照一定格式打包成固件。詳見編譯打包章節。
燒錄并運行:繼生成鏡像文件后,將介紹如何燒錄鏡像并運行在硬件設備,進一步內容詳見系統燒寫章節。
4 Tina開發環境
4.1 概述
嵌入式產品開發流程中,通常有兩個關鍵的步驟,編譯源碼與燒寫固件。源碼編譯需要先準備好
編譯環境,而固件燒寫則需要廠家提供專用燒寫工具。本章主要講述這如何搭建環境來實現Tinasdk的編譯、燒寫。
4.2 編譯環境搭建.
一個典型的嵌入式開發環境包括本地開發主機和目標硬件板。
本地開發主機作為編譯服務器,需要提供Linux操作環境,建立交叉編譯環境,為軟件開發提供代碼更新下載,代碼交叉編譯服務。
本地開發主機通過串口或USB與目標硬件板連接,可將編譯后的鏡像文件燒寫到目標硬件板,并調試系統或應用程序。
4.2.1 開發主機配置.
Tina Linux SDK是在ubuntu14.04開發測試的,因此我們 推薦使用Ubuntu 14.04 主機環境進行源碼編譯,其他版本沒有具體測試,可能需要對軟件包做相應調整。
4.2.2 軟件包配置.
編譯Tina Linux SDK 之前,需要先確定編譯服務器安裝了gcc,binutils,bzip2,flex,python,perl,make,ia32-libs,find,grep,diff,unzip,gawk,getopt,subver-sion,libz-dev,libc headers。
ubuntu可直接執行以下命令安裝:
sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawkflex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip ia32-libslib32z1 lib32z1-dev lib32stdc++6 libstdc++6 -y
ubuntu 16.04及以上版本,執行下面命令安裝軟件包:
sudo apt-get install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lib32z1 lib32z1-dev lib32stdc++ libstdc++6 -y libc6:i386 libstdc++6:i386 lib32ncurses5 lib32z
5 Tina系統獲取
5.1 概述
5.2 SDK獲取
Allwinner Tina Linux SDK通過全志代碼服務器對外發布。客戶需要向業務/技術支持窗口申請SDK下載權限。申請需同步提供SSH公鑰進行服務器認證授權,獲得授權后即可同步代碼。
5.3 SDK結構
Tina Linux SDK主要由構建系統、配置工具、工具鏈、host工具包、目標設備應用程序、文檔、腳本、linux內核、bootloader部分組成,下文按照目錄順序介紹相關的組成組件。
Tina-SDK/
├── build
├── config
├── Config.in
├── device
├── dl
├── docs
├── lichee
├── Makefile
├── out
├── package
├── prebuilt
├── rules.mk
├── scripts
├── target
├── tmp
├── toolchain
└── tools
5.3.1 build目錄
build目錄存放Tina Linux的構建系統文件,此目錄結構下主要是一系列基于Makefile規格編 寫的mk文件。主要的功能是:
檢測當前的編譯環境是否滿足Tina Linux的構建需求。
生成host包編譯規則。
生成工具鏈的編譯規則。
生成target包的編譯規則。
生成linux kernel的編譯規則。
生成系統固件的生成規則。
build/
├── autotools.mk
├── aw-upgrade.mk
├── board.mk
├── cmake.mk
├── config.mk
├── debug.mk
├── depends.mk
├── device.mk
├── device_table.txt
├── download.mk
├── dumpvar.mk
├── envsetup.sh
5.3.2 config目錄
config目錄主要存放Tina Linux中配置菜單的界面以及一些固定的配置項,該配置菜單基于內 核的mconf規格書寫。
config/
├── Config-build.in
├── Config-devel.in
├── Config-images.in
├── Config-kernel.in
└── top_config.in
5.3.3 devices目錄
devices目錄用于存放方案的配置文件,包括內核配置,env配置,分區表配置,sys_config.fex, board.dts等。
這些配置在舊版本上是保存于target目錄下,新版本挪到device目錄。
注意defconfig仍保存在target目錄。
device/
└── config
├── chips
├── common
└── rootfs_tar
快捷跳轉命令:cconfigs
5.3.4 docs目錄
docs目錄主要存放用于開發的文檔,以markdown格式書寫。
本目錄不再更新,請以全志客戶服務平臺系統文檔為準。
docs/
├── build.md
├── config.md
├── init-scripts.md
├── Makefile
├── network.md
├── tina.md
├── wireless.md
└── working.md
5.3.5 lichee目錄
lichee目錄主要存放bootloader,內核,arisc,dsp等代碼。
lichee/
├── bootloader
│ ├── uboot_2011_sunxi_spl
│ └── uboot_2014_sunxi_spl
├── brandy
│ ├── u-boot-2011.09
│ └── u-boot-2014.07
├── brandy-2.0
│ ├── spl
│ ├── tools
│ └── u-boot-2018
├── linux-3.4
├── linux-3.10
├── linux-4.4
├── linux-4.9
├── arisc
快捷跳轉命令:ckernel,cboot,cboot0,carisc。
5.3.6 package目錄
package目錄存放target機器上的軟件包源碼和編譯規則,目錄按照目標軟件包的功能進行分 類。
package/ ├── allwinner ├── base-files ├── devel ├── dragonst ├── firmware ├── kernel ├── ...... └── utils
5.3.7 prebuilt目錄
prebuild目錄存放預編譯交叉編譯器,目錄結構如下。
prebuilt/ └── gcc └── linux-x86 ├── aarch64 │ ├── toolchain-sunxi-musl │ └── toolchain-sunxi-glibc ├── arm │ ├── toolchain-sunxi-arm9-glibc │ ├── toolchain-sunxi-arm9-musl │ ├── toolchain-sunxi-glibc │ ├── toolchain-sunxi-musl └── host └── host-toolchain.txt
5.3.8 scripts目錄
scripts目錄用于存放一些構建編譯相關的腳本。
scripts/ ├── arm-magic.sh ├── brcmImage.pl ├── bundle-libraries.sh ├── checkpatch.pl ├── clang-gcc-wrapper ├── cleanfile ├── clean-package.sh ├── cleanpatch ├── ......
5.3.9 target目錄
target目錄用于存放目標板相關的配置以及sdk和toolchain生成的規格。
target/ ├── allwinner ├── Config.in ├── imagebuilder ├── Makefile ├── sdk └── toolchain
快捷跳轉命令:cdevice。
5.3.10 toolchain目錄.
toolchain目錄包含交叉工具鏈構建配置、規則。
toolchain/ ├── binutils ├── Config.in ├── fortify-headers ├── gcc ├── gdb ├── glibc ├── info.mk ├── insight ├── kernel-headers ├── Makefile ├── musl └── wrapper
5.3.11 tools目錄.
tools目錄用于存放host端工具的編譯規則。
tools/ ├── autoconf ├── automake ├── aw_tools ├── b43-tools ├── ......
5.3.12 out目錄.
out目錄用于保存編譯相關的臨時文件和最終鏡像文件,編譯后自動生成此目錄,例如編譯方案 r328s2-perf1。
out/ ├── r328s2-perf └── host
其中host目錄用于存放host端的工具以及一些開發相關的文件。
r328s2-perf1目錄為方案對應的目錄。方案目錄下的結構如下:
out/r328s2-perf ├── boot.img ├── compile_dir ├── image ├── md5sums ├── packages ├── r328s2-perf1-boot.img ├── r328s2-perf1-uImage ├── r328s2-perf1-zImage ├── rootfs.img ├── sha256sums ├── staging_dir └── tina_r328s2-perf1_uart0.img
boot.img為最終燒寫到系統boot分區的數據,可能為boot.img格式也可能為uImage格式。
rootfs.img為最終燒寫到系統rootfs分區的數據,該分區默認為squashfs格式。
r328s2-perf1-zImage為內核的zImage格式鏡像,用于進一步生成uImage。
r328s2-perf1-uImage為內核的uImage格式鏡像,若配置為uImage格式,則會拷貝成boot.img。
r328s2-perf1-boot.img為內核的boot.img格式鏡像,若配置為boot.img格式,則會拷貝成boot.img
compile_dir為sdk編譯host,target和toolchain的臨時文件目錄,存有各個軟件包的源碼。
staging_dir為sdk編譯過程中保存各個目錄結果的目錄。
packages目錄保存的是最終生成的ipk軟件包。
tina_r328s2-perf1_uart0.img為最終固件包(系統鏡像),串口信息通過串口輸出
若使用pack -d,則生成的固件包為xxx_card0.img,串口信息轉遞到tf卡座輸出。
快捷跳轉命令:cout。
5.4 SDK更新
SDK更新分為兩類:一類是以補丁的形式發布到一號通,發布后系統以郵件形式通知開發者;另一類是定期(半年或季度)的小版本迭代升級,將過往的補丁合入到SDK中,發布后以系統郵件通知開發者,可基于干凈的SDK包通過repo sync命令更新。
5.5 問題反饋
Allwinner提供全志客戶服務平臺(https://open.allwinnertech.com),用來登記客戶遇到的 問題以及解決狀態。方便雙方追蹤,使問題處理更加高效。后續SDK問題、技術問題、技術咨詢 等都可以提交到此系統上,Allwinner技術服務會及時將問題進行分發、處理和跟蹤。
注:系統登錄帳號需要與Allwinner開通確認。
6 Tina編譯打包
6.1 概述
6.2 編譯系統
(1) source build/envsetup.sh (2) lunch (3) make [-jN] (4) pack [-d] 其中, 步驟(1)建立編譯環境,導出編譯變量。 步驟(2)提示需要選擇你想要編譯的方案。 步驟(3)參數N為并行編譯進程數量,依賴編譯服務器CPU核心數,如 4 核PC,可"make -j4" 步驟(4)打包固件,-d參數使生成固件包串口信息轉到tf卡座輸出。 編譯完成后系統鏡像會打包在out//目錄下
6.3 編譯boot
命令 | 命令有效目錄 | 作用 |
---|---|---|
mboot | tina下任意目錄 | 編譯boot0和uboot |
mboot0 | tina下任意目錄 | 編譯boot0 |
muboot | tina下任意目錄 | 編譯uboot |
6.4 編譯內核
命令 | 命令有效目錄 | 作用 |
---|---|---|
mkernel | tina下任意目錄 | 編譯內核 |
6.5 編譯arisc
arisc是AW平臺對cpus代碼環境的代稱,主要功能是負責休眠,關機等底層操作。它包含 cpus運行所需的驅動,庫及工具鏈等,編譯產生scp.bin,然后打包在Tina鏡像中,有boot- loader在啟動時加載到cpus域運行。
Tina中提供了如下與arisc相關的跳轉、編譯命令
命令 | 命令有效目錄 | 作用 |
---|---|---|
carisc | tina下任意目錄 | 跳轉到cpus代碼工程目錄 |
mkarisc | tina下任意目錄 | 編譯cpus代碼 |
在Tina中,編譯arisc代碼有兩種方式,如下:
第一種方式,跳轉到arisc代碼路徑下,使用make編譯
arisc代碼庫具有獨立的工具鏈和構建體系,因此對arisc代碼的編譯,也可以cd到對應的路徑 下,執行make命令。但需注意,此時需要手動將生成的scp.bin文件拷貝到SDK的bin文件 路徑下,覆蓋對應的文件(一般路徑是tina/device/config/chips/${平臺名}/bin)。
操作如下,
step1 使用carisc或cd命令跳轉到arisc代碼環境下,一般為tina/lichee/arisc/ar100s。 step2 生成必要的配置。在arch/configs/下,存在許多defconfig默認配置文件,可根據AXP型號選擇使用,例如make sun50iw10p1_axp803_defconfig。此操作將會在arisc根目錄生成.config。 step3 修改默認配置,可使用make menuconfig。此操作會生成配置菜單,按需選擇配置即可,該操作會修改.config。如需重新使用默認配置,重新執行step2即可。 step4 使用make命令編譯 step5 將scp.bin拷貝到Tina的bin目錄,即cbin可跳轉的目錄即可。如/tina/device/config/chips/r818/binstep6 若需清理工程,可使用make clean step7 如需提交defconfig配置修改,可使用make savedefconfig命令。此命令會根據.config在arisc根目錄生成 defconfig。將defconfig拷貝到arch/configs/下,覆蓋對應配置文件即可。
注意:
一般來說,arisc執行的功能較為底層,多與休眠,關機等操作相關,對穩定性要求較高。我們不 建議客戶自己修改任何相關配置和代碼,如必須,請與我司聯系或執行足夠的穩定性測試。
第二種方式,使用mkarisc命令
如上述方法所述,Tina為了解決arisc編譯后還需手動拷貝的問題,Tina提供了這個快捷命令 mkarisc。需要指出的是:目前只支持R818、MR813的arisc代碼編譯。
操作如下,較為簡單
step1 配置tina環境,如soure build/envsetup.sh, lunch等操作。 step2 使用mkarisc編譯即可或直接編譯Tina,在編譯Tina時,也會自動調用mkarisc命令。
注意:
使用mkarisc命令編譯時,會自動讀取board.dts獲取AXP型號,然后使用對應的默認配置文 件編譯。如board.dts中指定使用“x-powers,axp803”時,mkarsic命令會使用arisc工程環 境下的sun50iw10p1_axp803_defconfig配置文件編譯。此時,若您需要修改該arisc配置, 只能先修改該配置文件后編譯,除此外不接受其他配置修改的方式。
6.6 編譯E907固件(V85x平臺異構AMP核)
E907是V85x平臺AMP CPU的代稱,其主要功能是提供通用算力補充、輔助Linux實現快起 等。它包含E907運行所需的驅動、庫及工具鏈等,編譯產生riscv.fex,打包到Tina鏡像中, 由bootloader在啟動時加載到RISC-V核上運行。
在Tina SDK中,編譯E907 RISCV代碼如下:
E907 RISCV 代碼庫具有獨立的工具鏈和構建體系,因此對 E907 固件的編譯,也可以跳 轉到對應的路徑下,執行命令。但需注意,此時需要手動將生成的 melis30.elf 文件拷貝 到 SDK 的 bin 文件路徑下,覆蓋對應的文件(一般路徑是 device/config/chips/${平臺 名}/configs/default/riscv.fex)。
操作如下,
step1 使用cd命令跳轉到e907代碼環境下,一般為rtos-dev/lichee/melis-v3.0/source step2 source melis-env.sh step3 lunch v853-e907-ver1-board step4 make menuconfig step5 make -j step6 如需減少存儲空間,可裁剪調試信息,在melis source目錄執行:riscv64-unknown-elf-strip ekernel/melis30.elf step7 拷貝并重命名成riscv.fex替換掉tina/device/config/chips/v853/configs/default目錄下的riscv.fex cp ekernel/melis30.elf /home/xxx/tina/device/config/chips/v853/configs/default/riscv.fex step8 Tina系統目錄執行打包命令pack
6.7 重編應用
請確保進行過一次固件的編譯,確保SDK基礎已經編譯,才能單獨重編應用包。重編應用包應用場景一般為: 只修改了應用,不想重新燒寫固件,只需要安裝應用安裝包即可 。請確保在編譯前已加載tina環境:
$ source build/envsetup.sh $ lunch
6.7.1 方法一
當在應用包的目錄(包括其子目錄)中,可執行
$ mm [-B] => B參數則先clean此應用臨時文件再編譯
示例:假設軟件包路徑為:tina/package/utils/rwcheck,則:
$ cd tina/package/utils/rwcheck $ mm -B
編譯出應用安裝包保存路徑為:
tina/out/<方案>/packages/base
6.7.2 方法二
當在tina的根目錄,可執行:
$ make <應用包的路徑>/clean,==>清空應用包臨時文件 $ make <應用包的路徑>/install,==>編譯軟件包 或者 $ make <應用包的路徑>/{clean,install},==>先清空臨時文件再編譯
示例:假設軟件包的路徑為:tina/package/utils/rwcheck,則:
$ cd tina $ make package/utils/rwcheck/{clean,install}
6.8 其他命令
命令 | 命令有效目錄 | 作用 |
---|---|---|
make | tina根目錄 編譯整個sdk | |
make | menuconfig tina根目錄 啟動軟件包配置界面 | |
make | kernel_menuconfig tina根目錄 啟動內核配置界面 | |
mkarisc | tina下任意目錄 編譯cpus源碼,根據AXP型號選擇對應的默認配置 | |
printfconfig | tina下任意目錄 打印當前SDK的配置 | |
croot | tina下任意目錄 快速切換到tina根目錄 | |
cconfigs | tina下任意目錄 快速切換到方案的bsp配置目錄 | |
cdevice | tina下任意目錄 快速切換到方案配置目錄 | |
carisc | tina下任意目錄 快速切換到cpus代碼目錄 | |
cgeneric | tina下任意目錄 快速切換到方案generic目錄 | |
cout | tina下任意目錄 快速切換到方案的輸出目錄 | |
cboot | tina下任意目錄 快速切換到bootloader目錄 | |
cgrep | tina下任意目錄 在c/c++/h文件中查找字符串 | |
minstall | path/to/package/ tina根目錄 編譯并安裝軟件包 | |
mclean | path/to/package/ tina根目錄 clean軟件包 | |
mm [-B] | 軟件包目錄 編譯軟件包,-B指編譯前先clean | |
pack | tina根目錄 打包固件 | |
m | tina下任意目錄 make的快捷命令,編譯整個sdk | |
p | tina下任意目錄 pack的快捷命令,打包固件 |
7 Tina系統燒寫
7.1 概述
本章節主要介紹如何將構建完成的鏡像文件(image)燒寫并運行在硬件設備上的流程。
SDK中的燒錄工具不再更新,后續會刪除,請優先選擇從全志客戶服務平臺下載最新燒錄工具。
windows工具均集成在APST中,下載安裝APST即可,APST的工具均自帶文檔。
7.2 燒錄工具
Tina提供的幾種鏡像燒寫工具介紹如表所示,用戶可以選擇合適的燒寫方式進行燒寫。
工具 | 運行系統 | 描述 |
---|---|---|
PhoenixSuit | windows | 分分區升級及整個固件升級工具 |
PhoenixCard | windows | 卡固件制作工具 |
PhoenixUSBpro | windows | 量產升級工具,支持USB一拖 8 燒錄 |
LiveSuit | ubuntu | 固件升級工具 |
對于ubuntu:
64bit主機使用LiveSuitV306_For_Linux64.zip。
32bit主機使用LiveSuitV306_For_Linux32.zip。
具體燒錄工具和使用說明,請到全志客戶服務平臺下載。
7.3 進入燒錄模式.
設備需進入燒錄模式,以下幾種情況會進入燒錄模式:
BROM無法讀取到boot0,例如新換的flash不包含數據,或者上電時短路flash阻斷通信。
在串口中按 2 進入燒錄。即,在串口工具輸出框中,按住鍵盤的’2’,不停輸出字符’2’,上電啟動。boot0檢測到此字符,會跳到燒錄模式。
在uboot控制臺,執行efex。
在linux控制臺,執行reboot efex。
adb可用的情況下,可使用adb shell reboot efex,或點擊燒錄工具上的“立即燒錄”按鈕。
當完整配置[fel_key]下fel_key_max和fel_key_min時,按下鍵值在范圍內按鍵,之后上電。
當板子有FEL按鍵時,按住FEL按鍵上電。
制作特殊的啟動卡,從卡啟動再進入燒錄模式。
8 Tina uboot定制開發
8.1 概述
本章節簡單介紹uboot基本配置、功能裁剪、編譯打包、常用命令的使用,幫助客戶了解Tina 平臺uboot框架,為boot定制開發提供基礎。
目前Tina SDK共有三版uboot,分別是uboot-2011、uboot-2014、uboot-2018,分別在不 同硬件平臺上使用,客戶拿到SDK需要根據開發的硬件平臺核對版本信息。
8.2 代碼路徑
TinaSDK/ ├── brandy │ ├── ... │ ├── u-boot-2011 │ └── u-boot-2014 ├── brandy-2.0 │ ├── ... │ └── u-boot-2018
8.3 uboot功能
TinaSDK中,bootloader/uboot在內核運行之前運行,可以初始化硬件設備、建立內存空間映 射圖,從而將系統的軟硬件環境帶到一個合適狀態,為最終調用linux內核準備好正確的環境。 在Tina系統平臺中,除了必須的引導系統啟動功能外,uboot還提供燒寫、升級等其它功能。
引導內核能從存儲介質(nand/mmc/spinor)上加載內核鏡像到DRAM指定位置并運行。
量產&升級包括卡量產,USB量產,私有數據燒錄,固件升級。
電源管理包括進入充電模式時的控制邏輯和充電時的顯示畫面。
開機提示信息開機能顯示啟動logo圖片(BMP格式)。
Fastboot功能實現fastboot的標準命令,能使用fastboot刷機。
8.4 uboot配置
以uboot-2018為例,各項功能可以通過defconfig或配置菜單menuconfig進行開啟或關閉, 具體配置方法如下:
8.4.1 defconfig方式
8.4.1.1 defconfig配置步驟
vim /TinaSDK/lichee/brandy2.0/u-boot-2018/configs/sun8iw18p1_defconfig (若是spinor方案則打開sun8iw18p1_nor_defconfig)
打開sun8iw18p1_defconfig或sun8iw18p1_nor_defconfig后,在相應的宏定義前去掉或添加"#"即可將相應功能開啟或關閉。
![圖8-1: defconfig配置圖](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT3KAFghsAABBnBMLDYg955.jpg)
如上圖,只要將CONFIG_SUNXI_NAND前的#去掉即可支持NAND相關功能,其他宏定義的開啟關閉也類似。
8.4.1.2 defconfig配置宏介紹.
如下圖是sun8iw18p1_defconfig/sun8iw18p1_nor_defconfig中的基本宏定義的介紹:
![圖8-2: defconfig基本宏定義介紹圖](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3OAZ5DBAAH_v3eAGvw969.jpg)
8.4.2 menuconfig方式
通過menuconfig方式配置的方法步驟如下:
cd /TinaSDK/lichee/brandy2.0/u-boot-2018/ make ARCH=arm menuconfig或make ARCH=arm64 menuconfig 注意:arm針對 32 位平臺,arm64針對 64 位平臺。
執行上述命令會彈出menuconfig配置菜單,如下圖所示,此時即可對各模塊功能進行配置,配 置方法menuconfig配置菜單窗口中有說明。
![圖8-3: menuconfig配置菜單圖](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3OAUd4TAAIvbbLY3DI012.jpg)
8.5 uboot編譯
8.5.1 方法一
在tina目錄下即可編譯uboot。
source build/envsetup.sh(見詳注1) lunch (見詳注2) muboot(見詳注3) 詳注: 1 加載環境變量及tina提供的命令。 2 輸入編號,選擇方案。 3 編譯uboot,編譯完成后自動更新uboot binary到TinaSDK/target/allwinner/$(BOARD)-common/bin/。
8.5.2 方法二
source build/envsetup.sh(見詳注1) lunch (見詳注2) cboot(見詳注3) make XXX_config(見詳注4) make -j 詳注: 3 跳轉到Uboot源碼目錄。 4 選擇方案配置,如果是使用norflash,運行make XXX_nor_config。 5 執行編譯uboot的動作。
8.6 uboot的配置
8.6.1 sys_config配置.
sys_config.fex是對不同模塊參數進行配置的重要文件,對各模塊重要參數的更改及更新提供了 極大的方便。其文檔存放路徑:
TinaSDK/target/allwinner/$(BOARD)/configs/sys_config.fex TinaSDK/device/config/chips/$(CHIP)/configs/$(BOARD)/sys_config.fex
8.6.1.1 sys_config.fex結構介紹
sys_config.fes主要由主鍵和子鍵構成,主鍵是某項功能或模塊的主標識,由[]括起,子鍵是對 該功能或模塊中各個參數的配置項,如下圖所示,dram_para是主鍵,dram_clk、dram_type 和dram_zp是子鍵。
![圖8-4: sysconfig.fex基本結構圖](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT3SAcKttAABijwmpWOM002.jpg)
8.6.1.2 sys_config.fex配置實例
[platform]:平臺相關配置項。
![圖8-5: platform配置圖](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3WAdxuXAAAdlkVYxlE275.jpg)
例如,debug_mode =1表示開啟uboot的調試模式,開啟后會在log中打印出對應的調試信 息。next_work=2表示燒錄完成后系統的下一步執行動作(0x1表示正常啟動、0x2表示重啟、 0x3表示關),其他配置可以查看[platform]前的提示說明。
[target]:目標平臺相關功能配置項
![圖8-6: target配置圖](http://m.xsypw.cn/images/chaijie_default.png)
上圖中的可以通過配置boot_clock配置cpu的頻率大小。
[uart_para]:串口配置項,uart_para配置項是uboot串口打印調試時用到的重要配置
![圖8-7: uart_para配置圖](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT3aAKdqDAABKhjJPCHc112.jpg)
上圖中的uart_debug_port=0表示使用的是uart0,uart_debug_tx/uart_debug_rx配置的gpio口(PA04/PA05)需要根據對應的GPIO DATASHEET進行配置。
8.6.1.3 sys_config.fex解析流程
在uboot2014/2018中sys_config.fex最終會被轉化為dtb(device tree binary,linux內核配置方式),dtb最終會被打包燒錄至flash中,啟動過程中會將該文件加載至內存,之前在sys_config.fex中配置的參數已轉化為dtb節點,最終會調用fdt_getprop_32()函數對dtb中的節點進行解析。
8.6.2 環境變量配置.
uboot的環境變量就是一個個的鍵值對,操作接口為:getenv(),setenv(),saveenv()。環境變量的形式:
boot_normal=sunxi_flash read 40007800 boot;boota 4000780 boot_recovery=sunxi_flash read 40007800 recovery;boota 40007800 boot_fastboot= fastboot
8.6.2.1 環境變量作用.
可以把一些參數信息或者命令序列定義在該環境變量中。在環境變量中定義UBOOT命令序列,
可以把UBOOT各個功能模塊按順序組合在一起執行,從而完成某個重要功能。
例如,如果執行了上述提到的 boot_normal 環境變量對應的命令,Uboot 則會先調用 sunxi_flash命令從存儲介質的boot分區上加載內核到DRAM的0x40007800位置;然后調 用boota命令完成內核的引導。
uboot啟動時調用環境變量方式下如圖所示:
![圖8-8: uboot啟動調用環境變量方式圖](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3iAdetXAAB3TNrrmfM235.jpg)
8.6.2.2 環境變量配置示例介紹.
TinaSDK中,環境變量配置文件保存在TinaSDK/target/allwinner/$(BOARD)/configs/env.cfg 文件,用戶使用的時候,可能會看到env-4.4.cfg、env-4.9.cfg等文件,env-xxx后綴數字表示在不同內核版本上的配置。打開后其內容示例如下,
bootdelay=0,改環境變量bootdelay(即boot啟動時log中的倒計時延遲時間)值的大小,為便于調試,bootdelay的值一般不要等于 0 ,這樣在小機上電后按下任意鍵才能進入uboot shell命令狀態。
boot_normal=sunxi_flash read 40007800 boot;boota 4000780,設置啟動內核命令,即將boot分區讀到內存0x40007800地址處,然后從內存0x40007800地址處啟動內核。
Setargs_nand=setenv bootargs earlyprintk=${earlyprink}....... ,設置內核相關環境變量,該變量在啟動至內核的log中會打印處理,即cmdline如下圖:
![圖8-9: kernel cmdline圖](http://m.xsypw.cn/images/chaijie_default.png)
loglevel=8,設置內核log打印等級。
8.6.3 sys_partition.fex分區配置
分區配置文件是一個規劃磁盤分區的文件,燒錄過程會按照該分區配置文件將各分區數據燒錄至flash中。
TinaSDK中,分區配置文件路徑TinaSDK/target/allwinner/$(BOARD)/configs/sys_partition.fex。有些方案可以看到sys_partition.fex、sys_partition_nor.fex兩個分區配置文件,若是打包Tina非nor固件,則使用的是sys_partition_linux.fex配置文件,若是打包nor固件,則使用的是sys_partition_nor.fex。
8.6.3.1 sys_partition.fex分區配置介紹
一個分區的屬性,包含名稱、分區大小、下載文件與用戶屬性。以下是文件中所描述的一個分區的屬性:
name,分區名稱由用戶自定義。當用戶在定義一個分區的時候,可以把這里改成自己希望的字符串,但是長度不能超過 16 個字節。
size,定義該分區的大小,以扇區的單位(1扇區=512bytes,如上圖給env 分區分配了32768 個扇區,即32768*512/1024/1024 = 16M),注意,為了字節對齊,這里分配的扇區大小應當能整除 128 。
downloadfile,下載文件的路徑和名稱。可以使用相對路徑,相對是指相對于image.cfg文件所在分區。也可以使用絕對路徑。
user_type,提供給操作系統使用的屬性。目前,每個操作系統在讀取分區的時候,會根據用戶屬性來判斷當前分區是不是屬于自己的然后才進行操作。這樣設計的目的是為了避免在多系統同時存在的時候,A操作系統把B操作系統的系統分區進行了不應該的讀寫操作,導致B操作系統無法正常工作。
更具體的說明,可參考《TinaLinux存儲管理開發指南》。
9 Tina kernel定制開發
9.1 概述
本章節簡單介紹kernel基本配置、功能裁剪、常用命令的使用,幫助客戶了解Tina平臺linux 內核,為內核定制開發提供基礎。
目前Tina SDK共有 4 版linux kernel,分別是linux-3.4、linux-3.10、linux-4.4、linux- 4.9,分別在不同硬件平臺上使用,客戶拿到SDK需要根據開發的硬件平臺核對內核信息。
9.2 代碼路徑
TinaSDK/ ├── ... ├── linux-3.10 ├── linux-3.4 ├── linux-4.4 └── linux-4.9
9.3 模塊開發文檔.
詳閱BSP開發文檔,文檔目錄包括常用內核模塊使用與開發說明。
9.4 內核配置
客戶在定制化產品時,通常需要更改linux內核配置,在TinaSDK中,打開內核配置的方式如 下,
croot make kernel_menuconfig
執行完后,shell控制臺會跳出配置菜單。如下圖所示,
![圖9-1: TinaLinux內核配置菜單](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT3yALI0HAAEcizbiNQk068.jpg)
10 Tina系統定制開發
10.1 Tina procd-init與busybox-init切換.
tina默認為procd-init:
make menuconfig進行配置: 1.System init 選擇procd-init 2.以下一步步選中 Base system ---> <*>block-mount <*>busybox................................ Core utilities for embedded Linux ---> Init Utilities ---> [ ] init 此處不選 Coreutils ---> [*] head Miscellaneous Utilities ---> [*] strings <*> uci <*> logd 3.env.cfg修改 init=/sbin/init
busybox-init自啟動方式配置如下:
make menuconfig進行配置: 1.System init 選擇busy-init 2.以下一步步選中 Base system ---> <*>busybox................................ Core utilities for embedded Linux ---> Init Utilities ---> [* ] init 此處選上 3.env.cfg修改 init=/init rdinit=/rdinit
10.2應用移植
在Tina Linux SDK中一個軟件包目錄下通常包含如下兩個目錄和一個文件:
package/<分類>/<軟件包名>/Makefile package/<分類>/<軟件包名>/patches/ [可選] package/<分類>/<軟件包名>/files/ [可選] 其中, patches 保存補丁文件,在編譯前會自動給源碼打上所有補丁 files 保存軟件包的源碼,在編譯時會對應源碼覆蓋源碼中的源文件 Makefile 編譯規則文件,
10.2.1 Makefile范例
該Makefile的功能是軟件源碼的準備,編譯和安裝的過程,提供給Tina Linux識別和管理軟件包的接口,軟件的編譯邏輯是由軟件自身的Makefile決定,理論上和該Makefile(該Makefile只執行make命令和相關參數)無實質關系。
![圖10-2-1](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT3yAFybUAAF5iuqO6QQ020.jpg)
詳注:
1.如果是開源軟件,軟件包版本建議與下載軟件包的版本一致。 2.以PKG開頭的變量主要告訴編譯系統去哪里下載軟件包。 3.md5sum用于校驗下載下來的軟件包是否正確,如果正確,在編譯該軟件的時候,就會在PKG_BUILD_DIR下找到該軟件包的源碼。 4.Package/: 用來指定該Package的名字,該名字會在配置系統中顯示。 5.使用依賴包的名字來指定依賴關系,如果是擴展包,前面添加一個”+”號,如果是內核版本依賴使用@LINUX_2_。 6.如果該值為 1 ,該包將不會出現在配置菜單中,但會作為固定編譯,可選。 7.在開源軟件中一般用來生成Makefile,其中參數可以通過CONFIGURE_VARS來傳遞。 8.在開源軟件中一般相當于執行make,其中有兩個參數可以使用:MAKE_FLAGS和MAKE_VARS。 9.內置的幾個關鍵字如下: INSTALL_DIR相當于install -d m0755 INSTALL_BIN相當于install -m0755 INSTALL_DATA相當于install -m0644 INSTALL_CONF相當于install -m0600 10.該Makefile的所有define部分都是為該宏的參數做的定義.上層Makefile通過調用此宏進行編譯。
10.2.2 自啟動設置
在Tina Linux中支持兩種格式的初始化腳本,一種是busybox式或者sysV式的初始化腳本, 一種是procd式的初始化腳本。一般我們把由初始化腳本啟動的應用叫做服務。
初始化腳本以shell腳本的編程語言組織,shell腳本作為基礎知識在此不展開說明。一般情況 下,初始化腳本源碼保存在軟件的files目錄,且后綴為“.init”,例如:
tina/package/system/fstools/files/fstab.init
在Makefile的install中把初始化腳本安裝到小機端的/etc/init.d中,例如:
define Package/block-mount/install $(INSTALL_DIR) $(1)/etc/init.d/ $(INSTALL_BIN) ./files/fstab.init $(1)/etc/init.d/fstab endef
10.2.2.1調用自啟動腳本.
手動調用方式在啟動的時候會有太多的log,且log信息已被logd守護進程收集,不利于我們 調試初始化腳本,此時可通過小機端的命令行手動調用的形式來調試,例如:
root@TinaLinux: /# /etc/init.d/fstab start
10.2.2.2 sysV格式腳本
sysV式的初始化腳本保存在小機端的/etc/init.d/目錄下,實現開機自啟動。下例以最小內容的初 始化腳本作示例講解,核心是實現start/stop函數:
#!/bin/sh /etc/rc.common # Example script # Copyright (C) 2007 OpenWrt.org START=10 STOP=15 DEPEND=xxxx start() { #commands to launch application } stop() { #commands to kill application } 注意: START=10, 指明開機啟動優先級(序列) [數值越小, 越先啟動],取值范圍0-99。 STOP=15, 指明關機停止優先級(序列) [數值越小, 越先關閉],取值范圍0-99。 DEPEND=xxxx, 指明初始化腳本會并行執行,通過此項配置確保執行的依賴。
名稱 | 屬性 | 功能 |
---|---|---|
start | 必須實現 | 啟動一個服務 |
stop | 必須實現 | 停止一個服務 |
reload | 可選實現 | 重啟一個服務 |
enable | 可選實現 | 重新加載服務 |
disable | 可選實現 | 禁用服務 |
在shell里面可以使用如下的命令來操作相關的服務。
$ root@TinaLinux:/# /etc/init.d/exmple restart|start|stop|reload|enable|disable
10.2.2.3 procd格式腳本
以下例的初始化腳本作示例講解,主要是實現函數start_service:
#!/bin/sh /etc/rc.common USE_PROCD=1 PROG=xxxx START=10 STOP=15 DEPEND=xxxx start_service() { procd_open_instance procd_set_param command $PROG -f ...... procd_close_instance }
詳細的介紹可以參考:https://wiki.openwrt.org/inbox/procd-init-scripts。
10.3應用調試
新添加的軟件默認配置為不使能,此時需要手動配置使能軟件包。通過在tina的根目錄執行 make menuconfig進入軟件包的配置界面:
![圖10-1:應用配置主界面](https://file.elecfans.com//web2/M00/95/71/pYYBAGQAT32AMz3hAACgCrYkVdY864.jpg)
軟件包的所在路徑與軟件包的Makefile中的定義有關,以fstools為例,在Makefile中定義 為:
define Package/fstools SECTION:=base CATEGORY:=Base system DEPENDS:=+ubox +USE_GLIBC:librt +NAND_SUPPORT:ubi-utils TITLE:=OpenWrt filesystem tools MENU:=1 endef
此時,只需要在menuconfig界面中進入Basy system即可找到fstools的軟件包。
![圖10-2:軟件包所在界面](https://file.elecfans.com//web2/M00/94/EF/poYBAGQAT36AUKx7AACoNT_w0DM723.jpg)
前綴符號含義:
[*] 或<*> : 編譯進入SDK [ ] 或< > : 不包含
支持操作:
Y或y:選擇包含 N或n:取消選擇
10.4應用編譯
詳見重編應用章節。
10.5應用安裝
獲取安裝包
安裝包一般位于目錄:
tina/out/<方案>/packages/base
安裝包命名格式為:
<應用名>_<應用版本>-<應用釋放版本>_sunxi.ipk
安裝應用包
通過adb推送安裝包到小機:
$ adb push <安裝包路徑> <推送到小機路徑>
安裝應用包:
$ opkg install <安裝包路徑>
10.6分區與掛載
升級分區
分區 | 功能 |
---|---|
boot分區 | 存內核鏡像 |
rootfs分區 | 基礎系統鏡像分區,包含/lib,/bin,/etc等 |
recovery分區 | 存放恢復系統鏡像,僅大容量方案有,詳見OTA文檔 |
extend分區 | 存放恢復系統鏡像及rootfs的usr部分,僅小容量方案有,詳見OTA文檔 |
不升級分區
分區 | 功能 |
---|---|
private分區 | 存儲SN號分區 |
misc分區 | 系統狀態、刷機狀態分區 |
UDISK分區 | 用戶數據分區,一般掛載在/mnt/UDISK |
overlayfs分區 | 存儲overlayfs覆蓋數據 |
默認掛載點
分區 | 掛載點 | 備注 |
---|---|---|
/dev/by-name/boot | /boot | |
/dev/by-name/boot-res | /boot-res | |
/dev/by-name/UDISK | /mnt/UDISK | 用戶數據分區 |
/dev/mmcblk0或/dev/mmcblk0p1 | /mnt/SDCARD | Tf卡掛載點 |
/dev/by-name/rootfs_data | /overlay | 存儲overlayfs覆蓋數據 |
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11345瀏覽量
210398 -
系統軟件
+關注
關注
0文章
39瀏覽量
11005 -
Tina
+關注
關注
2文章
45瀏覽量
17027
發布評論請先 登錄
相關推薦
評論