当前位置: 首页 > 工具软件 > firefly-iii > 使用案例 >

编译firefly-rk3288-ubuntu固件

轩辕啸
2023-12-01


环境:Ubuntu16.04
固件包:firefly-sdk-20200629.7z
根文件系统:Ubuntu

首先说明一下情况,当firefly-rk3288开发板到手之后很长一段时间都在使用韦东山老师的SDK进行学习和实验(具体可以去韦东山的wiki查看相关资料http://wiki.100ask.org/100ask_firefly-rk3288),魏老师的教程还是比较全面的,只是在挂载NFS的时候可能会出现一点问题,
之前我也写过一篇文章,可以参考:
文档:
firefly-rk3288 开发板挂载NFS.note链接:http://note.youdao.com/noteshare?id=2a553c79d9d9bc23801a2c10118be5e4&sub=EBF491B27E9D4793A782D13E89E20EA0
最近手里有一块树莓派的屏幕,mipi接口,但是在韦老师的SDK里始终编译不过,所以就想试试firefly的SDK尝试一下,不过在编译官方SDK的过程中遇到了很多问题,每天下班回家都会搞那么一点点,终于编译通过并启动成功,特此记录。

1、下载SDK包

首先去下载firefly官网的 firefly-sdk-20200629.7z 这个SDK包;

2、下载根文件系统镜像

当然也可以编译SDK里的buildroot根文件系统,要看电脑性能了,我试着编译了一次,三个多小时都过去了。
镜像名:rk3288_ubuntu_16.04_armhf_20200403142221.img.7z ,这是Ubuntu根文件系统镜像。

3、下载更新包

common-linux-bundle ,这些文件都在firefly官网可以下载。

4、解压SDK

我直接把SDK包放在了home目录下,
执行

7z x firefly-sdk-20200629.7z 
cd firefly-sdk
git reset --hard
//下边是更新远程仓库,有时候会出错,或者时间很久,多试几次
git clone https://github.com/FireflyTeam/bundle.git -b rk3288-linux-bundle

./bundle/update rk3288-linux-bundle
git rebase FETCH_HEAD

//再把之前下载的common-linux-bundle更新包放到 firefly-sdk主目录
mv common-linux-bundle/ .common-linux-bundle/
chmod 755 .common-linux-bundle/update && .common-linux-bundle/update
git rebase FETCH_HEAD

//以上命令都可以在firefly官网找到

5、编译环境

这是官网要求的编译环境,我之前编译过其他的板子,所以没有配置可以直接用,当然也可以出问题之后再按提示下载某些包。

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 gcc-aarch64-linux-gnu libncurses5-dev lzop libssl1.0.0 libssl-dev

6、配置板型文件device/rockchip/rk3288/

文件: firefly-rk3288-ubuntu.mk
文件内容:

#!/bin/bash

CMD=`realpath $BASH_SOURCE`
CUR_DIR=`dirname $CMD`

source $CUR_DIR/BoardConfig.mk
#下边这条是我自己加进去的
export RK_ARCH=arm


# Uboot defconfig
export RK_UBOOT_DEFCONFIG=firefly-rk3288
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=firefly_linux_defconfig
# Kernel dts
export RK_KERNEL_DTS=rk3288-firefly
# parameter for GPT table
export RK_PARAMETER=parameter-ubuntu.txt
# packagefile for pack image files
export RK_PACKAGE_FILE=rk3288-ubuntu-package-file

# Set rootfs type, including ext2 ext4 squashfs
export RK_ROOTFS_TYPE=ext4
# rootfs image path
#这里需要在sdk根目录下新建ubuntu_rootfs文件夹,并把之前下载的根文件系统镜像复制进去
export RK_ROOTFS_IMG=ubuntu_rootfs/rk3288_ubuntu_rootfs.img
# recovery ramdisk
export RK_RECOVERY_RAMDISK=recovery-arm.cpio.gz

# Buildroot config
export RK_CFG_BUILDROOT=
# Recovery config
export RK_CFG_RECOVERY=
#OEM config
export RK_OEM_DIR=
#userdata config
export RK_USERDATA_DIR=


#然后执行
./build.sh firefly-rk3288-ubuntu.mk

7、分步编译

# 编译u-boot
./build.sh uboot
# 编译内核
./build.sh kernel
# 编译recovery  ,这条我并没有执行
./build.sh recovery

8、打包固件

#前边已经下载了Ubuntu根文件系统镜像,所以不需要编译根文件系统了,
注意:每次打包固件前,需要运行mkfirmware.sh脚本更新rockdev/下的分区镜像。
./mkfirmware.sh

#如下
fan@ubuntu:~/firefly-sdk$ ./mkfirmware.sh 
/usr/bin/fakeroot
create rootfs.img...done.
create parameter...done.
create misc.img...done.
warning:   not found!
create uboot.img...done.
create trust.img...done.
create loader...done.
create boot.img...done.
/home/fan/firefly-sdk/device/rockchip/rk3288/parameter-ubuntu.txt
0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x00600000@0x0005a000(rootfs),-@0x0065a000(userdata:grow)
 Image: image in rockdev is ready 

9、整合固件

./build.sh updateimg

#如下
fan@ubuntu:~/firefly-sdk$ ./build.sh updateimg
processing option: updateimg
File name is  FIREFLY-RK3288-UBUNTUUBUNTU-GPT 
Rename the file? [N|y]n
Make update.img
start to make update.img...
dumpe2fs 1.42.13 (17-May-2015)
Android Firmware Package Tool v1.66
------ PACKAGE ------
Add file: ./package-file
Add file: ./package-file done,offset=0x800,size=0x136,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0x2c14e,userspace=0x59
Add file: ./Image/parameter.txt
Add file: ./Image/parameter.txt done,offset=0x2d800,size=0x1e9,userspace=0x1
Add file: ./Image/trust.img
Add file: ./Image/trust.img done,offset=0x2e000,size=0x400000,userspace=0x800
Add file: ./Image/uboot.img
Add file: ./Image/uboot.img done,offset=0x42e000,size=0x400000,userspace=0x800
Add file: ./Image/boot.img
Add file: ./Image/boot.img done,offset=0x82e000,size=0x10cb000,userspace=0x2196
Add file: ./Image/misc.img
Add file: ./Image/misc.img done,offset=0x18f9000,size=0xc000,userspace=0x18
Add file: ./Image/recovery.img
Add file: ./Image/recovery.img done,offset=0x1905000,size=0xead800,userspace=0x1d5b
Add file: ./Image/rootfs.img
Add file: ./Image/rootfs.img done,offset=0x27b2800,size=0x71ffcc00,userspace=0xe3ffa
Add CRC...
Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making ./Image/update.img OK.
/home/fan/firefly-sdk
/home/fan/firefly-sdk
Make update image ok!
 /home/fan/firefly-sdk/rockdev/pack/FIREFLY-RK3288-UBUNTUUBUNTU-GPT-20201122-1246.img 

然后就是烧写镜像,少些完之后系统并没有起来,最后清除flash,终于可以了。

在这里记录一些:
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),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x00600000@0x0005a000(rootfs),-@0x0065a000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

最后的CMDLINE是系统的分区信息,按照韦东山的教程,
以uboot为例 0x00002000@0x00004000(uboot)中 :
0x00004000为uboot分区的起始位置
0x00002000为分区的大小,
以此类推,
用户可以根据自己需要增减或者修改分区信息,但是请最少保留uboot,trust,boot,rootfs分区,这是机器能正常启动的前提条件。

下边是韦东山的教程中的文件内容,经测试没问题。

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

分区介绍:

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目录下.(可省略)

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
 类似资料: