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