Author | shaniadolphin |
---|---|
[email protected] |
目录
- 编译固件
- 安装环境
- 创建目录
- 下载SDK
- 编译UBOOT
- 编译kernel
- 制作根文件系统
- 安装依赖
- 下载ubuntu core
- 创建根文件映像
- 复制qemu
- 复制DNS
- 增加源
- chroot
- 打包固件
- 检查映像
- 打包固件
- 烧录固件
编译LINUX固件
1. 在Ubuntu 16.04 amd64系统中安装以下包
sudo apt-get install bc bison build-essential curl \
device-tree-compiler dosfstools flex gcc-aarch64-linux-gnu \
gcc-arm-linux-gnueabihf gdisk git gnupg gperf libc6-dev \
libncurses5-dev libpython-dev libssl-dev libssl1.0.0 \
lzop mtools parted repo swig tar zip
2. 创建工作目录
mkdir ~/proj/roc-rk3328-cc
cd ~/proj/roc-rk3328-cc
3. 下载 Linux SDK
# U-Boot
git clone -b roc-rk3328-cc https://github.com/FireflyTeam/u-boot
# Kernel
git clone -b roc-rk3328-cc https://github.com/FireflyTeam/kernel --depth=1
# Build
git clone -b debian https://github.com/FireflyTeam/build
# Rkbin
git clone -b master https://github.com/FireflyTeam/rkbin
cd ~/proj/roc-rk3328-cc
4. 编译UBOOT
通过运行 build 目录下的 mk-uboot.sh 脚本,设定选项为 roc-rk3328-cc
./build/mk-uboot.sh roc-rk3328-cc
编译完后输出:
out/u-boot/
├── idbloader.img
├── rk3328_loader_ddr786_v1.06.243.bin
├── trust.img
└── uboot.img
各个镜像文件的说明如下:
- idbloader.img: DDR 初始化与 miniloader 结合的文件。
- rk3328_loader_ddr786_v1.06.243.bin: DDR 初始化文件。
- trust.img: ARM trusted 固件。
- uboot.img: U-Boot映像文件。
也可以通过以下文件配置 UBOOT :
- configs/roc-rk3328-cc_defconfig
5. 编译编译kernel
kernel中需要配置,并定义设备树,会涉及到以下文件:
- arch/arm64/configs/fireflyrk3328_linux_defconfig: 默认内核配置。
- arch/arm64/boot/dts/rockchip/rk3328-roc-cc.dts: 开发板设备树描述。
- arch/arm64/boot/dts/rockchip/rk3328.dtsi: CPU 设备树描述。
通过以下命令,完成内核配置,并更新默认配置:
# 这非常重要!
export ARCH=arm64
cd kernel
# 首先使用默认配置
make fireflyrk3328_linux_defconfig
# 自定义你的 kernel 配置
make menuconfig
# 保存为默认配置
make savedefconfig
cp defconfig arch/arm64/configs/fireflyrk3328_linux_defconfig
需要注意,在 make menuconfig 时应进行如下配置:
Device Drivers > Network device support > Wireless LAN > Rockchip Wireless LAN support
> Rockchip Wireless LAN support 下的除“*”之外的"M"选项都去掉
Device Drivers > Network device support > Wireless LAN > Realtek rtlwifi family of devices
> Realtek rtlwifi family of devices 下的选项都去掉
配置好后即可编译整个 kernel (脚本文件内部设置了使用 -j4 来编译):
./build/mk-kernel.sh roc-rk3328-cc
编译完后输出:
out/
├── boot.img
└── kernel
├── Image
└── rk3328-roc-cc.dtb
- boot.img: 包含 Image and rk3328-roc-cc.dtb 的映像文件, 为 fat32 文件系统格式。
- Image: 内核映像。
- rk3328-roc-cc.dtb: 设备树。
制作根文件系统
1. 安装依赖包
sudo apt-get install qemu qemu-user-static binfmt-support debootstrap
2. 下载ubuntu core
wget -c http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.1-base-arm64.tar.gz
3. 创建根文件映像
创建一个大小为 20G 的根文件系统映像文件,将 ubuntu core 解压到该映像中,如果不需要安装过多的软件,可以先设置成 2G ,后期再调整。
cd /mnt/h/proj
dd if=/dev/zero of=rootfs.img bs=1M count=0 seek=10000
sudo mkfs.ext4 -F -L ROOTFS rootfs.img
sudo mkdir mnt
sudo mount rootfs.img mnt/
sudo tar -xzvf ubuntu-base-18.04-base-arm64.tar.gz -C mnt/
4. 复制qemu
将 qemu-aarch64-static 放到挂载的 rootfs 的 /usr/bin 中,能在 x86_64 主机系统下 chroot 到该 arm64 文件系统中运行:
sudo cp -a /usr/bin/qemu-aarch64-static mnt/usr/bin/
5. 增加有效的更新源
用 vim 编辑器打开 sources.list :
vim mnt/etc/apt/sources.list
6. chroot 到新的文件系统中
chroot 命令用来在指定的根目录下运行指令,在使用 chroot 之后,系统的目录结构将以指定的位置作为 “/” 位置。
sudo chroot mnt/
在 rootfs 的 root 用户下设置:
# 这里可以修改设置
USER=dolphin
HOST=dolphin-ubuntu
# 创建用户
useradd -G sudo -m -s /bin/bash $USER
passwd $USER
# 输入密码
# 设置主机名和以太网
echo $HOST /etc/hostname
echo "127.0.0.1 $HOST" >> /etc/hosts
echo "127.0.0.1 localhost.localdomain localhost" > /etc/hosts
mkdir /etc/network
mkdir /etc/network/interfaces.d
echo "auto eth0" > /etc/network/interfaces.d/eth0
echo "iface eth0 inet dhcp" >> /etc/network/interfaces.d/eth0
echo "nameserver 127.0.1.1" > /etc/resolv.conf
echo "nameserver 8.8.8.8 " >> /etc/resolv.conf
# 安装包
apt-get update
apt-get upgrade
apt-get install -y udev sudo ssh
apt-get install -y ifupdown net-tools network-manager
# 必须安装以安装对应的依赖systemd,否则系统无法挂载
apt-get install -y vim
# 增加 armhf支持
dpkg --add-architecture armhf
apt-get update
apt-get install -y libc6:armhf
# 使能串口
# ROC-RK3328-CC的UART默认使用1 500 000波特率和TTL电平。
ln -s /lib/systemd/system/serial-getty\@.service /etc/systemd/system/getty.target.wants/[email protected]
退出,并卸载文件系统:
exit
sudo sync
#
sudo umount mnt/
如果想要在创建的根文件系统中安装软件,也可以继续chroot
到该文件系统中,安装一些常用的软件,比如 "pip" , "numpy" 等,避免复杂的交叉编译环境设置和加快文件系统的成型。
这样rootfs.img
里就已经有刚才制作的根目录内容了,但这个img
文件大小却是定义的镜像的大小,不是文件系统的实际大小,所以还要经过一些处理才能发布。
检查并查看rootfs.img镜像的大小:
dolphin@dolphin-ubuntu:~/proj/rootfs$ e2fsck -p -f rootfs.img
ROOTFS:17032/640848 文件(0.2% 为非连续的), 234632/2560000 块
dolphin@dolphin-ubuntu:~/proj/rootfs$ ls -l rootfs.img
-rw-rw-r-- 1 dolphin dolphin 10485760000 10月 24 22:18 rootfs.img
减小ubuntu.img镜像文件的大小:
dolphin@dolphin-ubuntu:~/proj/rootfs$ resize2fs -M rootfs.img
resize2fs 1.44.1 (24-Mar-2018)
将 rootfs.img 上的文件系统调整为 305886 个块(每块 4k)。
rootfs.img 上的文件系统现在为 305886 个块(每块 4k)。
dolphin@dolphin-ubuntu:~/proj/rootfs$ ls -l rootfs.img
-rw-rw-r-- 1 dolphin dolphin 1252909056 10月 24 22:19 rootfs.img
打包固件
1. 准备并检查映像
把 Linux根文件系统映像文件 rootfs 放在 out/ 下,这时 out 目录应包含以下文件:
$ tree out
out
├── boot.img
├── kernel
│ ├── Image
│ └── rk3328-roc-cc.dtb
├── rootfs.img
└── u-boot
├── idbloader.img
├── rk3328_loader_ddr786_v1.06.243.bin
├── trust.img
└── uboot.img
2 directories, 8 files
2. 打包固件
./build/mk-image.sh -c rk3328 -t system -r out/rootfs.img
该脚本将根据《存储映射》所描述的布局,将分区映像文件写到指定位置,并最终打包成 out/system.img 。
如下所示的"parameter.txt"就是按照存储映射布局制作的,只添加了几个必不可少的分区。
FIRMWARE_VER:8.1
MACHINE_MODEL:RK3308
MACHINE_ID:007
MANUFACTURER: RK3308
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3308
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE:mtdparts=rk29xxnand:0x1000@0x2000(uboot),0x1000@0x6000(trust),0x6000@0x8000(boot),-@0x40000(rootfs:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
烧录固件
插入 SD 卡,如果 SD 被自动挂载,则先将其卸载。
安装pv :
sudo apt-get install pv
通过检查内核的日志查找 SD 卡的设备文件:
dmesg | tail
如果设备文件为 /dev/sdb ,使用 dd 命令进行烧录:
pv -tpreb /path/to/your/raw/firmware | sudo dd of=/dev/sdb conv=notrunc
如果需要将分区镜像写入到 SD 卡,可以运行以下命令:
sudo dd if=./out/u-boot/idbloader.img of=/dev/sdb seek=64 conv=sync,fsync
sudo dd if=./out/u-boot/uboot.img of=/dev/sdb seek=16384 conv=sync,fsync
sudo dd if=./out/u-boot/trust.img of=/dev/sdb seek=24576 conv=sync,fsync
sudo dd if=./out/boot.img of=/dev/sdb seek=32768 conv=sync,fsync
sudo dd if=./out/rootfs.img of=/dev/sdb seek=262144 conv=sync,fsync
也可以运行下面指令,将生成的统一固件 system.img 写入到 SD 卡中:
build/flash_tool.sh -c rk3328 -d /dev/sdb -p system -i out/system.img
参考文档
# | 链接地址 | 文档名称 |
---|---|---|
1 | dev.t-firefly.com/forum.php?mod=viewthread&tid=52810&highlight=3288 |
构建ROC-RK3328-CC 固件 |
2 | wiki.t-firefly.com/zh_CN/ROC-RK3328-CC/linux_compile_firmware.html |
ROC-RK3328-CC 开发者指南 |
3 | wiki.t-firefly.com/zh_CN/ROC-RK3328-CC/flash_sd.html |
ROC-RK3328-CC烧写SD 卡 |
4 | opensource.rock-chips.com/wiki_Distribution |
[制作根文件系统](http://opensource.rock-chips.com/wiki_Distribution |