RK3328安装liunx(ubuntu16.04)RK固件

  • RK3328官方文档

编译环境

系统: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工具:
$ cd /opt
$ mkdir linux
$ cd linux
$ git clone https://github.com/FireflyTeam/repo.git

  • 源码包

Linux-SDK GPT 源码包 (提取码:f4hg)

解压文件: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/[email protected]

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

$ 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卡中

  • 烧写 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 [email protected] -> /lib/systemd/system/[email protected]
lrwxrwxrwx 1 root root   41 Aug  1 02:19 [email protected] -> /lib/systemd/system/[email protected]
# 先把S0那条软连接删除
$ cd /etc/systemd/system/getty.target.wants
$ sudo rm -rf [email protected]
# 因为确定我/dev下存在的是ttyS1文件,所以再次运行使能串口的软连接,不同的是改成S1
$ ln -s /lib/systemd/system/serial-getty\@.service /etc/systemd/system/getty.target.wants/[email protected]
  • 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

你可能感兴趣的:(嵌入式)