瑞芯微Rockchip开发者社区
直播中

生龙活虎3

8年用户 778经验值
擅长:光电显示
私信 关注
[问答]

如何在RK3328上去安装liunx(ubuntu16.04)RK固件呢

如何在RK3328上去安装liunx(ubuntu16.04)RK固件呢?有哪些安装步骤?

回帖(1)

贾绰

2022-2-17 09:39:06
编译环境

系统:Ubuntu14.04(server版)
内核:4.4.0-142-generic
基本上与官方文档没什么特别大的出入,只有在编译Ubuntu根文件系统时有些许差异。
准备工作

硬件要求:

64 位系统,硬盘空间大于 40G。如果进行多个构建,将需要更大的硬盘空间。
软件要求:编译环境初始化




  • 预先安装所需环境依赖




$ sudo apt-get install git gnupg flex bison gperf build-essential
zip tar curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
libgl1-mesa-dev g++-multilib mingw32 cmake tofrodos
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 lzop lib32stdc++6


$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so



  • 安装 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:下载源码包(推荐国内用户使用)



下载repo工具:
解压文件:7z x linux-sdk-3328.7z,可通过以下命令安装7z
$ sudo apt install p7zip-full 把下载好的源码包上传到创建好的linux目录下
注意:解压完之后,用户可能会疑惑看不到文件。在linux/目录运行ls -a命令,有.repo/目录,这是我们的仓库。
同步源码:


# 这个命令在repo文件中有一个执行文件可使用
$ ./repo/repo sync -c


注意:从 Github 上同步 SDK 时,部分国内用户会有不稳定的现象,这就需要多次运行同步命令 repo sync -c 才可以

$ tree -L 1
.
├── app
├── buildroot buildroot根文件系统的编译目录
├── build.sh -> device/rockchip/common/build.sh 全自动编译脚本
├── device
├── distro
├── docs 开发文档
├── envsetup.sh -> buildroot/build/envsetup.sh
├── external
├── kernel 内核
├── Makefile -> buildroot/build/Makefile
├── mkfirmware.sh -> device/rockchip/common/mkfirmware.sh 打包脚本
├── prebuilts
├── rkbin
├── rkflash.sh -> device/rockchip/common/rkflash.sh 烧写脚本
├── rootfs
├── tools
└── u-boot
编译 Ubuntu 根文件系统(Ubuntu 16.04 amd64)




  • 安装依赖包:

$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap


  • 下载 Ubuntu core:


$ sudo mkdir ubuntu-rootfs && cd ubuntu-rootfs
$ wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.1-base-arm64.tar.gz



  • 创建一个大小为 1000M 的根文件系统映像文件,并使用 Ubuntu 的基础包去初始化:


# 快速创建一个大文件
$ fallocate -l 1000M rootfs.img
# 格式化此大文件
$ sudo mkfs.ext4 -F -L ROOTFS rootfs.img
$ mkdir mnt
# 把大文件挂载到mnt文件下
$ sudo mount rootfs.img mnt
# 把下载好的ubuntu解压到mnt文件下,此时因为mnt与rootfs.img有关联,放到mnt文件下,就是放到了rootfs.img文件中了
$ sudo tar -xzvf ubuntu-base-16.04.1-base-arm64.tar.gz -C mnt/
$ sudo cp -a /usr/bin/qemu-aarch64-static mnt/usr/bin/
# 把本机中的dns文件放到mnt中,否则在进入文件系统时无法连接网络, 官网中是手动设置的dns文件,此时不设置,后续配置会遇到/etc/network/interfaces.d/eth0: No Such file or directory
$ sudo cp /etc/resolv.conf mnt/etc/


qemu-aarch64-static是其中的关键,能在 x86_64 主机系统下 chroot 到 arm64 文件系统



  • Chroot 到新的文件系统中去并初始化:




$ sudo chroot mnt/


# 这里可以修改设置
$ USER=firefly
$ HOST=firefly


# 创建用户
$ useradd -G sudo -m -s /bin/bash $USER
$ passwd $USER
# 输入密码


# 设置主机名和以太网
$ echo $HOST > /etc/hostname
$ echo "127.0.0.1    localhost.localdomain localhost" > /etc/hosts
$ echo "127.0.0.1    $HOST" >> /etc/hosts
$ echo "auto eth0" > /etc/network/interfaces.d/eth0
$ echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0


# 使能串口
$ ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service


# 安装包,在安装之前可以进行更换镜像源,也可以不进行更换,如果遇到速度慢等问题,可以更换国内镜像源


$ apt-get update
$ apt-get upgrade
$ apt-get install ifupdown net-tools ping
$ apt-get install udev sudo ssh vim
# 退出文件系统
$ exit
# 取消挂载
$ sudo umount /mnt && cd ..
$ pwd
/opt/linux
如果还有什么想要安的软件可以在退出文件系统之前继续安装。
重要:上述命令中有一行使能串口的软连接命令,暂时可以按照这么写,因为我在后续启动的过程中,遇到了以下错误
Timed out waiting for device dev-ttyS0.device
在获取dev-ttyS0.device时超时了,默认等待5分钟才能进行下一步,这是因为在/dev目录下根本没有ttyS0这个文件,具体解决方法,我放到了后面的踩坑记录中,可参考。

配置Rootfs



  • 完成上述后,得到rootfs.img(1G),拷贝根文件系统到rootfs目录下;

$ cp mnt/rootfs.img /opt/liunx/rootfs/


  • 在device/rockchip/rk3328/roc-rk3328-cc.mk中, 将“# rootfs image path”修改为:


$ cd /opt/liunx
$ sudo vim device/rockchip/rk3328/roc-rk3328-cc.mk
export RK_ROOTFS_IMG=rootfs/rootfs.img



  • 编译配置文件:

$ ./build.sh roc-rk3328-cc.mk
运行完上述脚本后,在 device/rockchip/ 目录下,生成 .BoardConfig.mk 软链接 device/rockchip/rk3328/roc-rk3328-cc.mk
模块编译

以下编译如果有遇到错误,请看最后的踩坑,如果有一样的错误可参照修改。
build脚本参数如下:

./build.sh --help


====USAGE: build.sh modules====
uboot              -build uboot
kernel             -build kernel
rootfs             -build default rootfs, currently build buildroot as default
buildroot          -build buildroot rootfs
yocto              -build yocto rootfs, currently build ros as default
ros                -build ros rootfs
debian             -build debian rootfs
pcba               -build pcba
recovery           -build recovery
all                -build uboot, kernel, rootfs, recovery image
cleanall           -clean uboot, kernel, rootfs, recovery
firmware           -pack all the image we need to boot up system
updateimg          -pack update image
sdbootimg          -pack sdboot image
save               -save images, patches, commands used to debug
default            -build all modules
BoardConfig        -select the corresponding BoardConfig.mk file  
  

编译u-boot:

$ ./build.sh uboot
编译kernel:

$ ./build.sh kernel
编译rootfs:



  • recovery 分区在 Ubuntu 系统中不会用到,若有需要,可运行如下命令:

$ ./build.sh recovery




  • 打包,整理分区镜像到rockdev/目录下

$ ./mkfirmware.sh


  • 提示:在运行./mkfirmware时,可能会遇到如下报错:

error: /home/ljh/proj/linux-sdk/buildroot/output/rockchip_rk3328_recovery/images/recovery.img not found!
表示recovery分区没有找到,类似的如oem.img、userdata.img,上文提到,这些属于可省略分区镜像,可以不用理会。



  • 整合统一固件


#该命令打包为RK固件
$ ./build.sh updateimg
注意:每次打包固件前,需要运行mkfirmware.sh脚本更新rockdev/下的分区镜像

烧写固件到SD卡中


遇到的错误

Uboot




  • unable to execute ‘swig’: No such file or directory
  • error: command ‘swig’ failed with exit status 1

解决:



sudo apt-get install swig



  • command ‘x86_64-linux-gnu-gcc’ failed with exit status 1
  • Python.h: No such file or directory

解决:



$ sudo apt-get install python-dev


kernel




  • lz4c: not found

解决:
$ sudo apt-get install liblz4-tool  
打包




  • genext2fs: command not found

解决:
$ sudo apt-get install genext2fs
启动




  • Timed out waiting for device dev-ttyS0.device

首先这个错误是因为在/dev目录下根本没有ttyS0这个文件,**ls*命令后,只看到了ttyS1文件,好像也不一定是S1也有可能是别的数字,视情况而定。
解决:

$ ls /etc/systemd/system/getty.target.wants -al
lrwxrwxrwx 1 root root   34 Jul 19  2016 getty@tty1.service -> /lib/systemd/system/getty@.service
lrwxrwxrwx 1 root root   41 Aug  1 02:19 serial-getty@ttyS0.service -> /lib/systemd/system/serial-getty@.service
# 先把S0那条软连接删除
$ cd /etc/systemd/system/getty.target.wants
$ sudo rm -rf serial-getty@ttyS0.service
# 因为确定我/dev下存在的是ttyS1文件,所以再次运行使能串口的软连接,不同的是改成S1
$ ln -s /lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyS1.service



  • A job is running for… network interfaces

这个不能算是错误,这个原因是因为你没有插网线,网络原因造成的,因为前面设置的是dhcp动态获取IP地址,在没有插网线的情况下,这个信息会在5分钟之内一直获取IP,要想timeout时间短点修改以下设置。
解决:

$ sudo vim /etc/systemd/system/network-online.target.wants/networking.service
# 找到以下参数并修改,默认单位是秒,可自由修改时间,退出保存即可
imeoutStartSec=20
举报

更多回帖

发帖
×
20
完善资料,
赚取积分