編譯 Ubuntu16.04 固件(GPT)
前言
本 SDK 開(kāi)發(fā)環(huán)境是在 Ubuntu 上開(kāi)發(fā)測(cè)試的。我們推薦使用 Ubuntu 16.04 的系統(tǒng)進(jìn)行編譯。其他的 Linux 版本可能需要對(duì)軟件包做相應(yīng)調(diào)整。 除了系統(tǒng)要求外,還有其他軟硬件方面的要求。
準(zhǔn)備工作
硬件要求:
64 位系統(tǒng),硬盤(pán)空間大于 40G。如果您進(jìn)行多個(gè)構(gòu)建,將需要更大的硬盤(pán)空間。
軟件要求:編譯環(huán)境初始化
Ubuntu 14.04 軟件包安裝:
$ sudo apt-get install git gnupg flex bison gperf build-essential \ zip tar curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \ libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \ libgl1-mesa-dev g++-multilib mingw32 cmake tofrodos \ python-markdown libxml2-utils xsltproc zlib1g-dev:i386 lzop lib32stdc++6 $ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
Ubuntu 16.04 軟件包安裝
sudo apt-get install git gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler mtools \ parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools libssl-dev \ autotools-dev libsigsegv2 m4 libdrm-dev curl sed make binutils build-essential gcc g++ bash \ patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libglib2.0-dev openssh-client lib32stdc++6
安裝 ARM 交叉編譯工具鏈和編譯內(nèi)核相關(guān)軟件包
$ sudo apt-get install gcc-arm-linux-gnueabihf \ gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev \ libssl1.0.0 libssl-dev
同步源碼:
repo sync -c
注意:從Github上同步SDK時(shí),部分國(guó)內(nèi)用戶(hù)會(huì)有不穩(wěn)定的現(xiàn)象,這就需要多次運(yùn)行同步命令repo sync -c才可以
目錄
$ tree -L 1 . ├── app ├── buildroot buildroot根文件系統(tǒng)的編譯目錄 ├── build.sh -> device/rockchip/common/build.sh 全自動(dòng)編譯腳本 ├── device ├── distro ├── docs 開(kāi)發(fā)文檔 ├── envsetup.sh -> buildroot/build/envsetup.sh ├── external ├── kernel 內(nèi)核 ├── Makefile -> buildroot/build/Makefile ├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh 打包腳本 ├── prebuilts ├── rkbin ├── rkflash.sh -> device/rockchip/common/rkflash.sh 燒寫(xiě)腳本 ├── rootfs ├── tools └── u-boot
編譯SDK
編譯前配置:
在device/rockchip/rk3288/目錄下,選擇對(duì)應(yīng)的板型的配置文件
本文例子:確定選用rk3288/aio-3288j.mk
aio-3288j.mk相關(guān)配置介紹:
# Target arch export RK_ARCH=arm 32位ARM架構(gòu) # Uboot defconfig export RK_UBOOT_DEFCONFIG=firefly-rk3288 u-boot配置文件 # Kernel defconfig export RK_KERNEL_DEFCONFIG=firefly_linux_defconfig kernel配置文件 # Kernel dts export RK_KERNEL_DTS=rk3288-firefly-aio dts文件 # parameter for GPT table export RK_PARAMETER=parameter-ubuntu.txt 分區(qū)表(關(guān)鍵) # rootfs image path export RK_ROOTFS_IMG=buildroot/output/$RK_CFG_BUILDROOT/images/rootfs.$RK_ROOTFS_TYPE 根文件系統(tǒng)路徑
重點(diǎn):
配置Rootfs
源碼中默認(rèn)的Linux rootfs是buildroot,如果rootfs使用buildroot,跳過(guò)此步,如果用戶(hù)需要使用Ubuntu,需要通過(guò)以下步驟來(lái)配置:
下載根文件系統(tǒng):ubuntu16.04 根文件系統(tǒng)(32位),放到SDK路徑下;
該文件為7z壓縮包,解壓該文件;
7z x ubuntu1604armhf-rootfs.7z
完成上述后,得到ubuntu1604armhf-rootfs.img(2.6G),拷貝根文件系統(tǒng)到rootfs目錄下;
cp ubuntu1604armhf-rootfs.img rootfs/
在device/rockchip/rk3288/aio-3288j.mk中, 將“# rootfs image path”修改為:
export RK_ROOTFS_IMG=rootfs/ubuntu1604armhf-rootfs.img
配置板型
根據(jù)各個(gè)板型和配件的差別,內(nèi)核中使用的DTS也有差別,如果是標(biāo)配板型,跳過(guò)此步,如果板型有VGA或者LCD等支持,需要在.BoardConfig.mk中做對(duì)應(yīng)的修改。
Firefly-rk3288
# 標(biāo)配: export RK_KERNEL_DTS=rk3288-firefly # 帶VGA: export RK_KERNEL_DTS=rk3288-firefly-vga
AIO-3288C
# 標(biāo)配: export RK_KERNEL_DTS=rk3288-firefly-aioc # 帶VGA: export RK_KERNEL_DTS=rk3288-firefly-aioc-vga # LVDS(HSX101H40C): export RK_KERNEL_DTS=rk3288-firefly-aioc-lvds
AIO-3288J
# 標(biāo)配: export RK_KERNEL_DTS=rk3288-firefly-aio # LVDS(HSX101H40C): export RK_KERNEL_DTS=rk3288-firefly-aio-lvds
編譯配置文件:
./build.sh aio-3288j.mk
運(yùn)行完上述腳本后,在device/rockchip/目錄下,生成.BoardConfig.mk 軟鏈接 device/rockchip/rk3288/aio-3288j.mk
完全編譯:
完全編譯運(yùn)行如下腳本,包含 kernel 、uboot、buildroot、recovery。 如果用戶(hù)使用buildroot,可以使用完全編譯。如果用戶(hù)使用Ubuntu系統(tǒng),則不需要使用完全編譯。
./build.sh
注意:該腳本默認(rèn)編譯buildroot根文件系統(tǒng),若用戶(hù)需要用的根文件系統(tǒng)是Debian或者Ubuntu16.04時(shí),請(qǐng)!先!將!對(duì)應(yīng)的根文件系統(tǒng)準(zhǔn)備好,不然在執(zhí)行該build.sh腳本時(shí),會(huì)在整理分區(qū)鏡像、打包固件時(shí)出錯(cuò),這部分操作在以下的“部分編譯”中“編譯rootfs”有詳細(xì)說(shuō)明,按照操作執(zhí)行即可!
build.sh腳本運(yùn)行完成后,會(huì)將分區(qū)鏡像和統(tǒng)一固件update.img放在rockdev/目錄下,同時(shí)創(chuàng)建IMAGE/目錄備份。
模塊化編譯:
編譯u-boot:
./build.sh uboot
編譯kernel:
./build.sh kernel
編譯rootfs:
本SDK支持三種根文件系統(tǒng),分別是buildroot、Debian、Ubuntu
Buildroot
編譯 Buildroot 環(huán)境搭建所依賴(lài)的軟件包安裝命令如下:
sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler \ gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools \ autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash \ patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev \ libglade2-dev cvs git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz python-matplotlib \ libc6:i386 libssl-dev texinfo liblz4-tool genext2fs
搭建環(huán)境完成后,編譯buildroot,執(zhí)行如下命令:
./build.sh rootfs
Debian
編譯 Debian 環(huán)境搭建所依賴(lài)的軟件包安裝命令如下:
sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler \ gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools \ gcc-4.8-multilib-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libssl-dev gcc-aarch64-linux-gnu g+conf autotools-dev \ libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl \ tar cpio python unzip rsync file bc wget libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs \ git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 \ libssl-dev texinfo liblz4-tool genext2fs
搭建環(huán)境完成后,編譯Debian,按照自身需求,執(zhí)行如下命令:
cd rootfs/ ## Usage for 32bit Debian Building a base debian system by ubuntu-build-service from linaro. sudo apt-get install binfmt-support qemu-user-static sudo dpkg -i ubuntu-build-service/packages/* sudo apt-get install -f RELEASE=stretch TARGET=desktop ARCH=armhf ./mk-base-debian.sh Building the rk-debain rootfs with debug: VERSION=debug ARCH=armhf ./mk-rootfs-stretch.sh Creating the ext4 image(linaro-rootfs.img): ./mk-image.sh ------------------------------------------------------------------ ## Usage for 64bit Debian Building a base debian system by ubuntu-build-service from linaro. sudo apt-get install binfmt-support qemu-user-static sudo dpkg -i ubuntu-build-service/packages/* sudo apt-get install -f RELEASE=stretch TARGET=desktop ARCH=arm64 ./mk-base-debian.sh Building the rk-debain rootfs with debug: VERSION=debug ARCH=arm64 ./mk-rootfs-stretch-arm64.sh Creating the ext4 image(linaro-rootfs.img): ./mk-image.sh
Ubuntu16.04 1、 下載根文件系統(tǒng):ubuntu16.04 根文件系統(tǒng)(32位),放到SDK路徑下;
2、 該文件為7z壓縮包,解壓該文件;
7z x ubuntu1604armhf-rootfs.7z
3、 完成上述后,得到ubuntu1604armhf-rootfs.img(2.6G),拷貝根文件系統(tǒng)到rootfs目錄下;
cp ubuntu1604armhf-rootfs.img rootfs/
補(bǔ)充說(shuō)明:
./build.sh --help ====USAGE: build.sh modules==== uboot -build uboot kernel -build kernel rootfs -build default rootfs, currently build buildroot as default buildroot -build buildroot rootfs yocto -build yocto rootfs, currently build ros as default ros -build ros rootfs debian -build debian rootfs pcba -build pcba recovery -build recovery all -build uboot, kernel, rootfs, recovery image cleanall -clean uboot, kernel, rootfs, recovery firmware -pack all the image we need to boot up system updateimg -pack update image sdbootimg -pack sdboot image save -save images, patches, commands used to debug default -build all modules BoardConfig -select the corresponding BoardConfig.mk file
recovery分區(qū)在Ubuntu系統(tǒng)不會(huì)用到,可省略,若有需要,運(yùn)行如下命令:
./build.sh recovery
打包固件
parameter分區(qū)表
parameter.txt文件中包含了固件的重要信息,如以rk3288為例:
路徑:device/rockchip/rk3288/parameter-ubuntu.txt
FIRMWARE_VER: 8.1 固件版本 MACHINE_MODEL:rk3288 固件板型 MACHINE_ID:007 MANUFACTURER:RK3288 MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 3288 CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT 分區(qū)類(lèi)型 CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00010000@0x0000a000(boot),0x00010000@0x0002a000(backup),-@0x0005a000(rootfs:grow) uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
CMDLINE屬性是我們關(guān)注的地方,以u(píng)boot為例 0x00002000@0x00004000(uboot)中0x00004000為uboot分區(qū)的起始位置0x00002000為分區(qū)的大小,后面相同,用戶(hù)可以根據(jù)自己需要增減或者修改分區(qū)信息,但是請(qǐng)最少保留uboot,trust,boot,rootfs分區(qū),這是機(jī)器能正常啟動(dòng)的前提條件。
分區(qū)介紹:
uboot 分區(qū): uboot編譯出來(lái)的 uboot.img. trust 分區(qū): uboot編譯出來(lái)的 trust.img. misc 分區(qū): misc.img開(kāi)機(jī)檢測(cè)進(jìn)入recovery模式.(可省略) boot 分區(qū): 編譯出來(lái)的 boot.img包含kernel和設(shè)備樹(shù)信息. recovery 分區(qū): 燒寫(xiě) recovery.img.(可省略) backup 分區(qū): 預(yù)留,暫時(shí)沒(méi)有用。后續(xù)跟 android 一樣作為 recovery 的 backup 使用. oem 分區(qū): 給廠家使用,存放廠家的 app 或數(shù)據(jù),只讀,代替原來(lái)音箱的 data 分區(qū),掛載在/oem 目錄.(可省略) rootfs 分區(qū): 存放 buildroot 或者 debian 編出來(lái)的rootfs.img只讀. userdata 分區(qū): 存放app臨時(shí)生成的文件或者是給最終用戶(hù)使用??勺x寫(xiě),掛載在/userdata目錄下.(可省略)
在parameter.txt文件中,僅僅保留了5個(gè)不可缺少的分區(qū)。
注意:若發(fā)現(xiàn)根文件分區(qū)大小異常時(shí),執(zhí)行如下命令:
resize2fs /dev/mmcblk2p5
package-file
package-file文件用于打包統(tǒng)一固件時(shí)確定需要的分區(qū)鏡像和鏡像路徑,同時(shí)它需要與parameter.txt文件保持一致。
路徑:tools/linux/Linux_Pack_Firmware/rockdev,以package-file為例:
# NAME Relative path # #HWDEF HWDEF package-file package-file bootloader Image/MiniLoaderAll.bin parameter Image/parameter.txt trust Image/trust.img uboot Image/uboot.img boot Image/boot.img rootfs:grow Image/rootfs.img backup RESERVED
打包
整理分區(qū)鏡像到rockdev/目錄下
./mkfirmware.sh
提示:在運(yùn)行./mkfirmware時(shí),可能會(huì)遇到如下報(bào)錯(cuò):
error: /home/ljh/proj/linux-sdk/buildroot/output/rockchip_rk3288_recovery/images/recovery.img not found!
表示recovery分區(qū)沒(méi)有找到,類(lèi)似的如oem.img、userdata.img,上文提到,這些屬于可省略分區(qū)鏡像,可以不用理會(huì)。
整合統(tǒng)一固件
./build.sh updateimg
注意:每次打包固件前,需要運(yùn)行mkfirmware.sh腳本更新rockdev/下的分區(qū)鏡像
燒寫(xiě)固件
工具下載
Windows:AndroidTool_v2.58
Linux:Upgrade_Tool_1.34
Windows升級(jí)
下載 AndroidTool2.58后,解壓,運(yùn)行里面的 AndroidTool.exe(注意,如果是 Windows 7/8,需要按鼠標(biāo)右鍵,選擇以管 理員身份運(yùn)行),如下圖:
前提:設(shè)備燒寫(xiě)固件或分區(qū)鏡像時(shí),需處于Loader模式或Maskrom模式,參考設(shè)備模式
燒寫(xiě)統(tǒng)一固件 update.img
燒寫(xiě)統(tǒng)一固件 update.img 的步驟如下:
切換至”升級(jí)固件”頁(yè)。
按”固件”按鈕,打開(kāi)要升級(jí)的固件文件。升級(jí)工具會(huì)顯示詳細(xì)的固件信息
按”升級(jí)”按鈕開(kāi)始升級(jí)。
如果升級(jí)失敗,可以嘗試先按”擦除Flash”按鈕來(lái)擦除 Flash,然后再升級(jí)。
注意:如果你燒寫(xiě)的固件loader版本與原來(lái)的機(jī)器的不一致,請(qǐng)?jiān)谏?jí)固件前先執(zhí)行”擦除Flash”。
燒寫(xiě)分區(qū)映像
燒寫(xiě)分區(qū)映像時(shí),請(qǐng)使用對(duì)應(yīng)SDK下的FFTools/AndroidTool.rar燒寫(xiě)。步驟如下:
切換至”下載鏡像”頁(yè)。
勾選需要燒錄的分區(qū),可以多選。
確保映像文件的路徑正確,需要的話(huà),點(diǎn)路徑右邊的空白表格單元格來(lái)重新選擇。
點(diǎn)擊”執(zhí)行”按鈕開(kāi)始升級(jí),升級(jí)結(jié)束后設(shè)備會(huì)自動(dòng)重啟。
Linux升級(jí)
下載Upgrade_tool1.34.zip后,解壓,將upgrade_tool拷貝到/usr/local/bin/目錄下,操作如下:
unzip Linux_Upgrade_Tool_v1.34.zip cd Linux_Upgrade_Tool sudo mv upgrade_tool /usr/local/bin sudo chown root:root /usr/local/bin/upgrade_tool
統(tǒng)一固件燒寫(xiě)
使用upgrade_tool工具燒寫(xiě):
sudo upgrade_tool uf update.img
使用SDK腳本燒寫(xiě):
./rkflash.sh firmware
分區(qū)鏡像燒寫(xiě)
使用upgrade_tool工具燒寫(xiě):
sudo upgrade_tool ul $LOADER sudo upgrade_tool di -p $PARAMETER sudo upgrade_tool di -uboot $UBOOT sudo upgrade_tool di -trust $TRUST sudo upgrade_tool di -b $BOOT sudo upgrade_tool di -rootfs $ROOTFS
使用SDK腳本燒寫(xiě):
#全自動(dòng)燒寫(xiě) ./rkflash.sh #分區(qū)鏡像燒寫(xiě) ./rkflash.sh loader ./rkflash.sh parameter ./rkflash.sh uboot ./rkflash.sh trust ./rkflash.sh boot ./rkflash.sh rootfs
說(shuō)明:rkflash.sh該腳本文件的原理便是使用upgrade_tool工具燒寫(xiě)
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35336 -
安卓
+關(guān)注
關(guān)注
5文章
2130瀏覽量
57198 -
Firefly
+關(guān)注
關(guān)注
2文章
538瀏覽量
7045
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論