热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

FireflyRK3288学习笔记2Ubuntu16.04下编译Ubuntu16.04固件

官方教程:http:wiki.t-firefly.comzh_CNFirefly-RK3288linux_compile.html一、软件要求:编译环

官方教程: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核,所以只能用多分区镜像下载的方式。

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

四、Linux升级

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

 执行以下命令:

unzip Linux_Upgrade_Tool_v1.34.zipcd Linux_Upgrade_Toolsudo mv upgrade_tool /usr/local/binsudo chown root:root /usr/local/bin/upgrade_toolsudo chmod a+x /usr/local/bin/upgrade_tool

一定要给upgarde_tool增加可执行的权限,不然出现upgrade_tool: command not found的错误。

 2、烧写分区镜像

烧写Ubuntu 16.04 GPT固件

GPT和MBR对应两种不同的磁盘分区格式。

 3、连接设备

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

选择如下模式:

  • 一种方式是接上电源适配器

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

连接成功之后主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备”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

 


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有