系统: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
$ sudo apt-get install gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu device-tree-compiler lzop libncurses5-dev \
libssl1.0.0 libssl-dev
$ 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
$ sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
$ 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
# 快速创建一个大文件
$ 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 文件系统
$ 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这个文件,具体解决方法,我放到了后面的踩坑记录中,可参考。
$ cp mnt/rootfs.img /opt/liunx/rootfs/
$ 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
$ ./build.sh uboot
$ ./build.sh kernel
$ ./build.sh recovery
官方文档打包固件
打包,整理分区镜像到rockdev/目录下
$ ./mkfirmware.sh
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/下的分区镜像
解决:
sudo apt-get install swig
解决:
$ sudo apt-get install python-dev
解决:
$ sudo apt-get install liblz4-tool
解决:
$ sudo apt-get install genext2fs
首先这个错误是因为在/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]
这个不能算是错误,这个原因是因为你没有插网线,网络原因造成的,因为前面设置的是dhcp动态获取IP地址,在没有插网线的情况下,这个信息会在5分钟之内一直获取IP,要想timeout时间短点修改以下设置。
解决:
$ sudo vim /etc/systemd/system/network-online.target.wants/networking.service
# 找到以下参数并修改,默认单位是秒,可自由修改时间,退出保存即可
imeoutStartSec=20