官方教程:http://wiki.t-firefly.com/zh_CN/Firefly-RK3288/linux_compile.html
一、软件要求:编译环境初始化
1、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
2、安装 ARM 交叉编译工具链和编译内核相关软件包
sudo apt-get install gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev \
libssl1.0.0 libssl-dev
二、下载LINUX-SDK
下载源码包
1、下载repo工具
mkdir linux
cd linux
git clone https://github.com/FireflyTeam/repo.git
2、下载SDK
https://pan.baidu.com/s/1pETNQDurKDu_3TrTzDn9VA
下载之后在上面建立的linux目录下解压
解压方法
sudo apt-get install p7zip
sudo p7zip -d linux-sdk-3288.7z
3、同步源码
什么是repo?
Android是由Kernel、Dalvik、Bionic、Prebuilt、build等多个Git项目组成,如果我们分别使用Ubuntu Git命令来逐个获取显得非常麻烦,所以Android项目组编写了一个名为Repo的Python脚本来统一管理这些项目仓库,使得项目的获取更加简单。
首先安装repo,然后通过源码
在linux_sdk/目录运行ls -a
命令,有.repo
/目录,在这个repo目录下
sudo apt-get install repo
repo sync -c
注意:repo sync -c必须在root用户下执行,否则会报错。整个更新过程非常缓慢,中断失败后也要多次执行repo sync -c指令,直到更新成功为止。
三、编译SDK
1、编译前配置
device的路径如图所示
(2)本文例子:确定选用rk3288/firefly-rk3288.mk
firefly-rk3288.mk 相关配置介绍:
其中roof image path 默认配置如下所示:
2、配置板型
根据各个板型和配件的差别,内核中使用的DTS也有差别,如果是标配板型,跳过此步,如果板型有VGA或者LCD等支持,需要在.BoardConfig.mk中做对应的修改。
3、编译配置文件
./build.sh firefly-rk3288.mk
运行完上述脚本后,在device/rockchip/目录下,生成.BoardConfig.mk 软链接 device/rockchip/rk3288/firefly-rk3288.mk
注意:如果出现执行 ./build.sh 时,No such file or directory,出现报错的情况,系统可能缺少32位的支持库,安装以下方式安装32位支持库:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386
注意.build.sh的位置
运行完上述脚本后,在device/rockchip/目录下,生成.BoardConfig.mk 软链接 device/rockchip/rk3288/firefly-rk3288.mk
4、完全编译
完全编译运行如下命令,包含 kernel 、uboot、buildroot、recovery。 如果用户使用buildroot
,可以使用完全编译。如果用户使用Ubuntu
系统,则不需要使用完全编译。
./build.sh
该脚本默认编译buildroot
根文件系统。build.sh脚本运行完成后,会将分区镜像和统一固件update.img放在rockdev/目录下,同时创建IMAGE/目录备份。
完全编译失败尝试模块化编译。
5、模块化编译
(1)编译u-boot
./build.sh uboot
(2)编译kernel
./build.sh kernel
(3)编译rootfs
本SDK支持三种根文件系统,分别是buildroot、Debian、Ubuntu;编译 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,执行如下命令:
sudo ./build.sh rootfs
编译出现 g++: internal compiler error: Killed (program cc1plus)问题
是内存不足造成的,通过以下语句扩大内存后,重新编译buildroot
sudo dd if=/dev/zero of=/swapfile bs=64M count=16
sudo mkswap /swapfile
sudo swapon /swapfile
完成上述后,会在rootfs目录下,生成linaro-rootfs.img.修改device/rockchiwp/.BoardConfig.mk中的根文件系统路径即可,参考配置前编译中的“配置Rootfs”.
经过上述方法编译仍然失败。
方案二:
先清理之前失败的配置:
sudo ./build.sh cleanall
1、配置roofs
源码中默认的Linux rootfs是buildroot,如果rootfs使用buildroot,跳过此步,如果用户需要使用Ubuntu,需要通过以下步骤来配置:本次使用ubuntu配置
(1)下载根文件系统
https://pan.baidu.com/s/1KGT6DEnuQZo_z78YcqLksQ#list/path=%2F
(2)拷贝到虚拟机下
(3)解压,并将解压之后的ubuntu1604armhf-rootfs.img(2.6G),拷贝根文件系统到rootfs目录下
sudo p7zip -d ubuntu1604armhf-rootfs.7z
sudo cp ubuntu1604armhf-rootfs.img linux-sdk/rootfs
(4) 在device/rockchip/rk3288/firefly-rk3288.mk中, 将“# rootfs image path”修改为:
export RK_ROOTFS_IMG=rootfs/ubuntu1604armhf-rootfs.img
2、编译配置文件
sudo ./build.sh firefly-rk3288.mk
运行完上述脚本后,在device/rockchip/目录下,生成.BoardConfig.mk 软链接 device/rockchip/rk3288/firefly-rk3288.mk
3、模块化编译
(1)编译u-boot
sudo ./build.sh uboot
(2)编译kernel
sudo ./build.sh kernel
(3)编译rootfs 根文件系统Ubuntu
步骤1(3)中ubuntu1604armhf-rootfs.img镜像已经做好,不需要再编译
4、打包固件
(1)parameter分区表
parameter.txt文件中包含了固件的重要信息,如以rk3288为例: 路径:device/rockchip/rk3288/parameter-ubuntu.txt
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目录下.(可省略)
(2)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
(3)打包
(3.1)整理分区镜像到rockdev/目录下:
./mkfirmware.sh
忽略出现的错误
注意:每次打包固件前,需要运行mkfirmware.sh脚本更新rockdev/下的分区镜像
(3.2)整合统一固件
./build.sh updateimg
出现错误
修改办法:
(1)打开package-file文件,
(2)由于现在用的ubuntu的核,将该文件中的rootfs.img修改为新的
ubuntu1604armhf-rootfs.img
重新执行整理分区镜像到rockdev/目录下和整合统一固件后出现以下错误,缺少update.img文件。
rk3288有两种烧写固件方式,而现在我用的ubuntu核,所以只能用多分区镜像下载的方式。
四、Linux升级
1、下载Linux工具 Upgrade_Tool 后, 按以下方法安装到系统中,方便调用:
执行以下命令:
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
sudo chmod a+x /usr/local/bin/upgrade_tool
一定要给upgarde_tool增加可执行的权限,不然出现upgrade_tool: command not found的错误。
2、烧写分区镜像
烧写Ubuntu 16.04 GPT固件
GPT和MBR对应两种不同的磁盘分区格式。
3、连接设备
有两种方法可以使设备进入升级模式
选择如下模式:
连接成功之后主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备”Rockusb Device” 出现,如下图。如果没有,则需要返回上一步重新安装驱动。
4、先测试用Linux 下烧写官方提供的统一固件
(1)固件下载地址:
固件下载
(2)准备固件
(3) 解压文件:
tar -xzvf FIREFLY-RK3288-UBUNTU16.04-GPT-20190304-1215.img.tar.gz
(4)烧写统一固件
sudo upgrade_tool uf /path/firmware(固件路径)
如果烧写失败,先尝试擦出flash,然后再升级。
sudo upgrade_tool ef /path/firmware(固件路径)
sudo upgrade_tool uf /path/firmware(固件路径)
4、烧写分区镜像
烧写分区镜像时,GPT分区和MBR分区有不相同的命令参数,因此区分开:
GPT分区使用以下列表:
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 -r $RECOVERY
sudo upgrade_tool di -m $MISC
sudo upgrade_tool di -oem $OEM
sudo upgrade_tool di -userdata $USERDATA
sudo upgrade_tool di -rootfs $ROOTFS
本节参考地址:http://wiki.t-firefly.com/zh_CN/Firefly-RK3288/upgrade_firmware-linux.html