rk3566平台支持android和linux系统,原本项目中使用android系统,现在需要在rk3566上跑ubuntu,记录按照官网文档进行操作的实际情况。
官网文档地址:2. 编译 Linux5.10 固件 — Firefly Wiki
目录
创建工作目录~/docker,在其中创建文件:dockerfile,官方给出的内容如下:
下载Linux SDK
下载时PC端可以同步安装:
sudo apt update
sudo apt install -y repo git python
下载完成后,提取SDK,此步无坑,按官网操作即可。
# 给脚本添加执行权限
cd /path/to/rk356x_linux5.10_release_20231027_v1.2.1b
chmod +x ./sdk_tools.sh
# 创建 SDK 目录
mkdir -p ~/proj/rk356x_sdk-linux5.10
# 校验并解压
./sdk_tools.sh --unpack -C ~/proj/rk356x_sdk-linux5.10
# 还原工作目录
./sdk_tools.sh --sync -C ~/proj/rk356x_sdk-linux5.10
同步库上代码
代码使用repo进行管理。执行命令如下:
# 进入 SDK 根目录
cd ~/proj/rk356x_sdk-linux5.10
# 同步
.repo/repo/repo sync -c --no-tags
.repo/repo/repo start firefly --all
需要注意.repo/repo/repo sync -c --no-tags这条命令
初次接触repo,简单了解了下,这里-c指清除本地的修改。
执行这步时遇到了第一个问题:
按照官网提供的方法反复执行是无法解决的。
解决办法:删除对应出问题的目录,重新执行。比如上图删除tools目录重新同步就可以成功。
后面回过头想了下,出现这个问题的原因可能是下载了sdk,但是恰好官方更新了sdk版本,而且本地对下载的sdk是过了两天才解压同步,导致的这个问题。
PC配置编译环境,使用Docker
这里我的电脑很早就装过docker,所以安装过程略过,firefly也提供了docker安装过程:
这里我简单试了一下,基本没有问题,在步骤2的docker info这步,开始几次执行不成功,加了sudo执行就可以了,后面全步骤做完不加sudo也能成功了。
创建工作目录~/docker,在其中创建文件:dockerfile,官方给出的内容如下:
FROM ubuntu:18.04
MAINTAINER firefly "service@t-firefly.com"
ENV DEBIAN_FRONTEND=noninteractive
RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
RUN sed -i 's@http://.*ubuntu.com@http://repo.huaweicloud.com@g' /etc/apt/sources.list
RUN apt update
RUN apt install -y build-essential crossbuild-essential-arm64 \
bash-completion vim sudo locales time rsync bc python
RUN apt install -y repo git ssh libssl-dev liblz4-tool lib32stdc++6 \
expect patchelf chrpath gawk texinfo diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake \
unzip device-tree-compiler python-pip ncurses-dev python-pyelftools \
subversion asciidoc w3m dblatex graphviz python-matplotlib cpio \
libparse-yapp-perl default-jre patchutils swig expect-dev u-boot-tools
RUN apt update && apt install -y -f
# language support
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
# switch to a no-root user
RUN useradd -c 'firefly user' -m -d /home/firefly -s /bin/bash firefly
RUN sed -i -e '/\%sudo/ c \%sudo ALL=(ALL) NOPASSWD: ALL' /etc/sudoers
RUN usermod -a -G sudo firefly
USER firefly
WORKDIR /home/firefly
注意此步的dockerfile的apt install部分,我这边实际使用下来发现少了两个:libmpc-dev、libgmp-dev,在docker里编译时报错了。需要自己加入。
官方的dockerfile将root权限禁掉了,可以修改dockerfile将这里改为root用户,或者直接不使用提供dockerfile,直接创建个18.04的docker再将需要下载的依赖都下载就可以了。
这里后面在编译完成打包时还有问题,打包的时候会失败:(这步可以遇到时回来看,或者直接把依赖加进去就解决了。)
这也是缺少依赖:bsdmainutils,也需要加入。
或者docker里编译,出来在host主机打包也可以规避这个问题。
创建镜像
cd ~/docker
docker build -t sdkcompiler .
# sdkcompiler 是镜像名称,可随意更改,注意命令最后有一个‘.’
创建容器
docker run --privileged --mount type=bind,source=/home/fierfly/proj,target=/home/firefly/proj --name="ubuntu18" -h firefly -it sdkcompiler
这里source后面是第一步下载的SDK的目录,target是容器内的一个目录,必须是空目录,这里没有太理解这的意思,有知道的可以帮忙解释下。
name是容器名字,firefly是容器的hostname
进到容器里后需要cd /home/fierfyl/proj,就可以使用sdk了。
docker使用
# 在容器内输入 exit 即可退出
# 查看所有容器(包括已退出的)
docker ps -a
# 重启一个退出的容器并连接
docker start ubuntu18 # 容器名
docker attach ubuntu18
编译Ubuntu固件
配置config,官方命令:
./build.sh firefly_rk3566_roc-rk3566-pc_ubuntu_defconfig
实际上需要执行:
./build.sh device/rockchip/rk3566_rk3568/firefly_rk3566_roc-rk3566-pc_ubuntu_defconfig
所有config都在device/rockchip/rk3566_rk3568/目录下。
下载Ubuntu根文件系统
官方压缩包为7z格式,Ubuntu安装7z软件包:
sudo apt-get update
sudo apt-get install p7zip-full
解压文件:
# 假设下载的压缩包叫 Ubuntu20.04-xxx_RK3568_KERNEL-5.10_xxx.7z
7z x Ubuntu20.04-xxx_RK3568_KERNEL-5.10_xxx.7z
将解压出的根文件系统放到 prebuilt_rootfs/
目录下:
mkdir prebuilt_rootfs
# 假设解压出的文件系统叫做 Ubuntu20.04-xxx_RK3568_KERNEL-5.10_xxx.img
mv Ubuntu20.04-xxx_RK3568_KERNEL-5.10_xxx.img prebuilt_rootfs/
cd prebuilt_rootfs
ln -sf Ubuntu20.04-xxx_RK3568_KERNEL-5.10_xxx.img rk356x_ubuntu_rootfs.img
编译
./build.sh all
到此,RK3566上跑ubuntu的固件的编译流程就好了,可以进行定制化修改。