编译 ubuntu16.04 固件(gpt)
前言
本 sdk 开发环境是在 ubuntu 上开发测试的。我们推荐使用 ubuntu 16.04 的系统进行编译。其他的 linux 版本可能需要对软件包做相应调整。 除了系统要求外,还有其他软硬件方面的要求。
准备工作
硬件要求:
64 位系统,硬盘空间大于 40g。如果您进行多个构建,将需要更大的硬盘空间。
软件要求:编译环境初始化
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 交叉编译工具链和编译内核相关软件包
$ 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时,部分国内用户会有不稳定的现象,这就需要多次运行同步命令repo sync -c才可以
目录
$ tree -l 1 . ├── app ├── buildroot buildroot根文件系统的编译目录 ├── build.sh -> device/rockchip/common/build.sh 全自动编译脚本 ├── device ├── distro ├── docs 开发文档 ├── envsetup.sh -> buildroot/build/envsetup.sh ├── external ├── kernel 内核 ├── makefile -> buildroot/build/makefile ├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh 打包脚本 ├── prebuilts ├── rkbin ├── rkflash.sh -> device/rockchip/common/rkflash.sh 烧写脚本 ├── rootfs ├── tools └── u-boot
编译sdk
编译前配置:
在device/rockchip/rk3288/目录下,选择对应的板型的配置文件
本文例子:确定选用rk3288/aio-3288j.mk
aio-3288j.mk相关配置介绍:
# target arch export rk_arch=arm 32位arm架构 # 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 分区表(关键) # rootfs image path export rk_rootfs_img=buildroot/output/$rk_cfg_buildroot/images/rootfs.$rk_rootfs_type 根文件系统路径
重点:
配置rootfs
源码中默认的linux rootfs是buildroot,如果rootfs使用buildroot,跳过此步,如果用户需要使用ubuntu,需要通过以下步骤来配置:
下载根文件系统:ubuntu16.04 根文件系统(32位),放到sdk路径下;
该文件为7z压缩包,解压该文件;
7z x ubuntu1604armhf-rootfs.7z
完成上述后,得到ubuntu1604armhf-rootfs.img(2.6g),拷贝根文件系统到rootfs目录下;
cp ubuntu1604armhf-rootfs.img rootfs/
在device/rockchip/rk3288/aio-3288j.mk中, 将“# rootfs image path”修改为:
export rk_rootfs_img=rootfs/ubuntu1604armhf-rootfs.img
配置板型
根据各个板型和配件的差别,内核中使用的dts也有差别,如果是标配板型,跳过此步,如果板型有vga或者lcd等支持,需要在.boardconfig.mk中做对应的修改。
firefly-rk3288
# 标配: export rk_kernel_dts=rk3288-firefly # 带vga: export rk_kernel_dts=rk3288-firefly-vga
aio-3288c
# 标配: 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
# 标配: export rk_kernel_dts=rk3288-firefly-aio # lvds(hsx101h40c): export rk_kernel_dts=rk3288-firefly-aio-lvds
编译配置文件:
./build.sh aio-3288j.mk
运行完上述脚本后,在device/rockchip/目录下,生成.boardconfig.mk 软链接 device/rockchip/rk3288/aio-3288j.mk
完全编译:
完全编译运行如下脚本,包含 kernel 、uboot、buildroot、recovery。 如果用户使用buildroot,可以使用完全编译。如果用户使用ubuntu系统,则不需要使用完全编译。
./build.sh
注意:该脚本默认编译buildroot根文件系统,若用户需要用的根文件系统是debian或者ubuntu16.04时,请!先!将!对应的根文件系统准备好,不然在执行该build.sh脚本时,会在整理分区镜像、打包固件时出错,这部分操作在以下的“部分编译”中“编译rootfs”有详细说明,按照操作执行即可!
build.sh脚本运行完成后,会将分区镜像和统一固件update.img放在rockdev/目录下,同时创建image/目录备份。
模块化编译:
编译u-boot:
./build.sh uboot
编译kernel:
./build.sh kernel
编译rootfs:
本sdk支持三种根文件系统,分别是buildroot、debian、ubuntu
buildroot
编译 buildroot 环境搭建所依赖的软件包安装命令如下:
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
搭建环境完成后,编译buildroot,执行如下命令:
./build.sh rootfs
debian
编译 debian 环境搭建所依赖的软件包安装命令如下:
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
搭建环境完成后,编译debian,按照自身需求,执行如下命令:
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、 下载根文件系统:ubuntu16.04 根文件系统(32位),放到sdk路径下;
2、 该文件为7z压缩包,解压该文件;
7z x ubuntu1604armhf-rootfs.7z
3、 完成上述后,得到ubuntu1604armhf-rootfs.img(2.6g),拷贝根文件系统到rootfs目录下;
cp ubuntu1604armhf-rootfs.img rootfs/
补充说明:
./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分区在ubuntu系统不会用到,可省略,若有需要,运行如下命令:
./build.sh recovery
打包固件
parameter分区表
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 分区类型 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属性是我们关注的地方,以uboot为例 0x00002000@0x00004000(uboot)中0x00004000为uboot分区的起始位置0x00002000为分区的大小,后面相同,用户可以根据自己需要增减或者修改分区信息,但是请最少保留uboot,trust,boot,rootfs分区,这是机器能正常启动的前提条件。
分区介绍:
uboot 分区: uboot编译出来的 uboot.img. trust 分区: uboot编译出来的 trust.img. misc 分区: misc.img开机检测进入recovery模式.(可省略) boot 分区: 编译出来的 boot.img包含kernel和设备树信息. recovery 分区: 烧写 recovery.img.(可省略) backup 分区: 预留,暂时没有用。后续跟 android 一样作为 recovery 的 backup 使用. oem 分区: 给厂家使用,存放厂家的 app 或数据,只读,代替原来音箱的 data 分区,挂载在/oem 目录.(可省略) rootfs 分区: 存放 buildroot 或者 debian 编出来的rootfs.img只读. userdata 分区: 存放app临时生成的文件或者是给最终用户使用。可读写,挂载在/userdata目录下.(可省略)
在parameter.txt文件中,仅仅保留了5个不可缺少的分区。
注意:若发现根文件分区大小异常时,执行如下命令:
resize2fs /dev/mmcblk2p5
package-file
package-file文件用于打包统一固件时确定需要的分区镜像和镜像路径,同时它需要与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
打包
整理分区镜像到rockdev/目录下
./mkfirmware.sh
提示:在运行./mkfirmware时,可能会遇到如下报错:
error: /home/ljh/proj/linux-sdk/buildroot/output/rockchip_rk3288_recovery/images/recovery.img not found!
表示recovery分区没有找到,类似的如oem.img、userdata.img,上文提到,这些属于可省略分区镜像,可以不用理会。
整合统一固件
./build.sh updateimg
注意:每次打包固件前,需要运行mkfirmware.sh脚本更新rockdev/下的分区镜像
烧写固件
工具下载
windows:androidtool_v2.58
linux:upgrade_tool_1.34
windows升级
下载 androidtool2.58后,解压,运行里面的 androidtool.exe(注意,如果是 windows 7/8,需要按鼠标右键,选择以管 理员身份运行),如下图:
前提:设备烧写固件或分区镜像时,需处于loader模式或maskrom模式,参考设备模式
烧写统一固件 update.img
烧写统一固件 update.img 的步骤如下:
切换至”升级固件”页。
按”固件”按钮,打开要升级的固件文件。升级工具会显示详细的固件信息
按”升级”按钮开始升级。
如果升级失败,可以尝试先按”擦除flash”按钮来擦除 flash,然后再升级。
注意:如果你烧写的固件loader版本与原来的机器的不一致,请在升级固件前先执行”擦除flash”。
烧写分区映像
烧写分区映像时,请使用对应sdk下的fftools/androidtool.rar烧写。步骤如下:
切换至”下载镜像”页。
勾选需要烧录的分区,可以多选。
确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。
点击”执行”按钮开始升级,升级结束后设备会自动重启。
linux升级
下载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
统一固件烧写
使用upgrade_tool工具烧写:
sudo upgrade_tool uf update.img
使用sdk脚本烧写:
./rkflash.sh firmware
分区镜像烧写
使用upgrade_tool工具烧写:
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脚本烧写:
#全自动烧写 ./rkflash.sh #分区镜像烧写 ./rkflash.sh loader ./rkflash.sh parameter ./rkflash.sh uboot ./rkflash.sh trust ./rkflash.sh boot ./rkflash.sh rootfs
说明:rkflash.sh该脚本文件的原理便是使用upgrade_tool工具烧写
Calculating the Error Budget i
华为新系统鸿蒙升级方法 鸿蒙系统升级机型名单
量子计算机赛道上从不缺优秀竞争者,谁会是这场马拉松的最后赢家?
Linux内核观测技术eBPF中文入门指南
Allegro MicroSystems推出针对中/大型显示器的新型LED背光驱动器
fireflyAIO-3288J主板编译Ubuntu16.04固件简介
ta8659 8759的各引脚功能及电压
DBC陶瓷基板市场现状及未来发展趋势
海尔智家海外持续增长的“内生动力”是啥?
微雪电子转以太网模块RS232/485 TO ETH介绍
博世推出新款气压传感器BMP390,精确的室内定位可挽救数千人的生命
博世家电推出维他鲜动力多门冰箱,可避免设置不当引起的食物保存不良
双子猫智能音箱体验 孩子的良师益友
台式放大器电路解析
卷积神经网络 物体检测 YOLOv2
像素高就画质好吗?
变压器容量和功率
三星GearIconX2018评测 最近一年中推出的最好用的分体式耳机
柔性传感之水果冷害
高低温试验箱防爆装置有哪些?