Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件

官方教程: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的路径如图所示

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第1张图片

 

 (2)本文例子:确定选用rk3288/firefly-rk3288.mk

firefly-rk3288.mk 相关配置介绍:

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第2张图片

其中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”.

经过上述方法编译仍然失败。

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第3张图片

方案二:

先清理之前失败的配置:

 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)拷贝到虚拟机下

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第4张图片

(3)解压,并将解压之后的ubuntu1604armhf-rootfs.img(2.6G),拷贝根文件系统到rootfs目录下 

sudo p7zip -d ubuntu1604armhf-rootfs.7z
sudo cp ubuntu1604armhf-rootfs.img linux-sdk/rootfs

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第5张图片

 (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

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第6张图片

 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

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第7张图片

 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

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第8张图片

(3)打包

(3.1)整理分区镜像到rockdev/目录下:

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第9张图片

 

./mkfirmware.sh

忽略出现的错误

注意:每次打包固件前,需要运行mkfirmware.sh脚本更新rockdev/下的分区镜像

(3.2)整合统一固件

./build.sh updateimg

出现错误

修改办法:

(1)打开package-file文件,

(2)由于现在用的ubuntu的核,将该文件中的rootfs.img修改为新的

ubuntu1604armhf-rootfs.img

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第10张图片

 Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第11张图片

 重新执行整理分区镜像到rockdev/目录下和整合统一固件后出现以下错误,缺少update.img文件。

 Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第12张图片

 rk3288有两种烧写固件方式,而现在我用的ubuntu核,所以只能用多分区镜像下载的方式。

  • 单个统一固件 update.img, 将启动加载器、参数和所有分区镜像都打包到一起,用于固件发布。
  • 多个分区镜像,如 kernel.img, boot.img, recovery.img 等,在开发阶段生成。

四、Linux升级

1、下载Linux工具 Upgrade_Tool 后, 按以下方法安装到系统中,方便调用:

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第13张图片

 执行以下命令:

 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对应两种不同的磁盘分区格式。

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第14张图片

 3、连接设备

有两种方法可以使设备进入升级模式

选择如下模式:

  • 一种方式是接上电源适配器
  1. 用 Micro USB OTG 线连接好设备和主机
  2. 按住设备上的 RECOVERY (恢复)键并保持。
  3. 短按一下 RESET(复位)键。
  4. 大约两秒钟后,松开 RECOVERY 键。

连接成功之后主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备”Rockusb Device” 出现,如下图。如果没有,则需要返回上一步重新安装驱动。

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第15张图片

 4、先测试用Linux 下烧写官方提供的统一固件

(1)固件下载地址:

固件下载

(2)准备固件

Firefly-RK3288学习笔记2-Ubuntu16.04下编译Ubuntu16.04固件_第16张图片

(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

 

你可能感兴趣的:(ARM)