我的开发环境是 ubuntu20.04 ,请在具备以下文章的开发基础上,再继续往下会比较好。
Allwinner & Arm 中国 & Sipeed 开源硬件 R329 SDK 上手编译与烧录!
选用官方版型:MaixSense 简介
首先拿到原始镜像 r329-armbian-maixpy3-0.4.0.img ,用 dd 烧录到大于 4G 的卡里就行。
sipeed 用户镜像 root 账号没有 root 密码,输入 root 直接进入系统,自带 maixpy3 0.4.0 所需的基础环境,仅用于用户参考。
原始镜像为 Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.1.img.xz (700M) 自行下载站的 sipeed 企业盘中获取。
镜像编辑和导出的方法
在 ubuntu 上可以直接使用 disk 装载镜像编辑文件(disk)。
- 挂载到 loop 设备和加载到文件系统
sudo losetup -P /dev/loop404 ./r329-armbian-maixpy3-0.4.0-20220223.img && sudo mkdir -p ./r329 && sudo mount /dev/loop404p1 ./r329 && ls ./r329
- 卸载的文件系统,并删除目录。
sudo umount /dev/loop404p1 && sudo losetup -d /dev/loop404 && rm -rf ./r329
卸载后会自动同步,此时烧录即可使用。
扩容文件系统的方法
注意分区的损坏了就不能挂载,分区的大小改变不代表文件系统大小改变,所以需要以下代码检查和扩容文件系统。
e2fsck -f /dev/loop404p1 && sudo resize2fs -p /dev/loop404p1
在 armbian 里可以用这个进行扩容 /usr/lib/armbian/armbian-resize-filesystem start ,注意该操作会改变分区表,也会影响尾部的分区大小,慎用。
Linux 内核、驱动、设备树的相关用法方法
可以参考 Sipeed Lichee 进行学习,这部分为通用基础,而 armbian 不需要自己去手工编译。
准备环境 sudo apt install git wget make gcc flex bison libssl-dev bc kmod
前置知识:
修改设备树配置的方法
获取 git clone https://github.com/sipeed/linux.git
切到 r329-wip 分支
编译链工具可以用系统自带的 通用编译链 或 gcc-linaro,看自己喜好,我们用的是这个 gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz 版本
简单来说,设备树就是用户定义的需要选配的驱动功能,用户在设备树里定义并启用的树结点,就是要匹配使用的驱动。
R329 的设备树在 linux/arch/arm64/boot/dts/allwinner/
路径下,和 r329 相关的设备树有
- sun50i-r329-maix-iia.dtsi
- sun50i-r329-maixsense.dts
- sun50i-r329.dtsi
目前的主线配置 linux/arch/arm64/configs/defconfig 导入它。
make ARCH=arm64 defconfig
开始完整编译。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 INSTALL_MOD_PATH=out modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 INSTALL_MOD_PATH=out modules_install
啥都不清楚的情况下,一路确认键按下去,直到开始编译,导出 modules 是非必要操作,但对应一些外置 ko 模块需要导出拷入 /lib/modules/ 中,在 menuconfig 中设置为 M 就可以编译出 ko 模块从外部插入系统。
编译成功后,生成文件所在位置:
内核 Image 文件: ./arch/arm64/boot/Image 对应 armbian 目录下的 boot/Image
设备树 dtb 文件: ./arch/arm64/boot/dts/allwinner/sun50i-r329-maixsense.dtb 到 boot/dtb/allwinner/
modules 文件夹: ./out/lib/modules
将 Image 与 dtb 文件放入 boot 目录下重启即可完成内核的更新(armbian 特有)。
上述内容测试过后,你就可以开始自定义自己的主线内核了,但这个并不是主要目的,只是说一些基础用法。
单独编译 dtb 文件加入设备。
通常来说,在不了解如何编译整体的情况下,只需要通过简单的设备树替换就可以完成驱动适配。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs -j8
将编译得到的 dtb 文件 cp linux/arch/arm64/boot/dts/allwinner/sun50i-r329-maixsense.dtb /boot/dtb
最终提交 62b5919cfbff3a74bc100a05347800bd55ae7a9b 于此,感谢开源社区的 冰淇淋 和 灯鼠。
为主线加入外部模块并编译使用。
这里仅供学习参考,Sipeed 内部已经包含了 /usr/lib/modules/5.14.0-rc4-sun50iw11/kernel/drivers/net/wireless/rtl8723ds/8723ds.ko 模块。
上述方法出来的内核不是我们提供的,因为配置项的不同所以会缺少一些驱动,需要你自行加入,如 8723ds 非主线所使用的 wifi 模块。
获取 git clone https://github.com/Icenowy/rtl8723ds
切到 newest-kernel
放到 linux/drivers/net/wireless/realtek/ 下
编辑 drivers/net/wireless/Kconfig 添加 source "drivers/net/wireless/realtek/rtl8723ds/Kconfig",清理错误的语法,只留最简单的部分即可。
config RTL8723DS
tristate "Realtek 8723D SDIO or SPI WiFi"
编辑 linux/drivers/net/wireless/realtek/Makefile 添加 obj-$(CONFIG_RTL8723DS) += rtl8723ds/ 使得模块参与编译。
通过 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 menuconfig
按 / 搜索 8723ds 把它配上编译即可。
配好直接 make 编译就行,在 sipeed 的 armbian 这里不需要,仅告知如何加入非主线模块,如特殊的 TP 触摸屏、ADC 按键驱动、I2C 传感器驱动等。
编译 armbian 系统*
自行准备良好的网络环境,相关问题不做解答,默认懂得都懂,编不出来也很正常,不用太在意。
上述开发的内核模块在 sipeed 提供的 armbian 镜像中都是无用的,仅用于测试和确认开发环境,所以要进一步把 armbian 编译出来才是最终用户所用的环境。
可以看文档 https://docs.armbian.com/Developer-Guide_Build-Preparation/ 说明,虽然也没什么好看的。
安装 apt install dialog psmisc acl uuid-runtime curl gnupg gawk
准备环境
获取 https://github.com/sipeed/armbian-build.git 切到 r329-wip 分支,可以在 6ba70ed1f0acabb48c7072e044b62d3439374996 提交获取到配置,最后通过 compile.sh 完成编译。
将根据以下配置在 armbian-build 中进行编译。
- config/boards/maixsense.wip
- config/bootscripts/boot-sun50iw11.cmd
- config/kernel/linux-sun50iw11-edge.config
- config/sources/families/sun50iw11.conf
运行 ./compile.sh 选择 会自动拉取所有相关的东西,即可编译出来,接下来就是漫长的等待。
注意 maixsense 并非为最终 conf 版本,你需要在 底下的 show WIP 中选择 agree 后就可以看到 maixsense 了,配置可以是 bullseye 和 minimal 就好。。
编译期间会在 armbian-build/cache/sources 下 git clone 在 config/sources/families/sun50iw11.conf 指定的仓库和分支。
-
把 https://github.com/Icenowy/rtl8723ds 改到 https://github.com/lwfinger/rtl8723ds 。
-
把 armbian-build/config/sources/families/sun50iw11.conf 文件中 KERNELBRANCH (linux)的 r329-wip-integrated 改到 r329-wip 分支。
完成后输出如下:
[ o.k. ] Building kernel splash logo [ bullseye ]
[ .... ] Installing extras-buildpkgs [ hostapd htop mmc-utils sunxi-tools ]
[ o.k. ] Calling image customization script [ customize-image.sh ]
[ o.k. ] No longer needed packages [ purge ]
[ o.k. ] Unmounting [ /home/juwan/R329/armbian-build/.tmp/rootfs-c735dfca-9977-402a-a68b-b4529b5aac8f ]
[ o.k. ] Preparing image file for rootfs [ maixsense bullseye ]
[ o.k. ] Current rootfs size [ 780 MiB ]
[ o.k. ] Creating blank image for rootfs [ 984 MiB ]
[ .... ] dd: 984MiB [ 136MiB/s] [================================================================>] 100%
[ o.k. ] Creating partitions [ root: ext4 ]
[ .... ] Creating rootfs [ ext4 on /dev/loop40p1 ]
[ .... ] Copying files to [ / ]
[ .... ] Copying files to [ /boot ]
[ .... ] Updating initramfs... [ update-initramfs -uv -k 5.14.0-rc7-sun50iw11 ]
[ o.k. ] Updated initramfs. [ for details see: /home/juwan/R329/armbian-build/output/debug/install.log ]
[ .... ] Re-enabling [ initramfs-tools hook for kernel ]
[ o.k. ] Unmounting [ /home/juwan/R329/armbian-build/.tmp/mount-c735dfca-9977-402a-a68b-b4529b5aac8f/ ]
[ o.k. ] Free SD cache [ 8% ]
[ o.k. ] Mount point [ 91% ]
[ o.k. ] Writing U-boot bootloader [ /dev/loop40 ]
[ o.k. ] SHA256 calculating [ Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ warn ] GPG signing skipped - no GPG_PASS [ Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ o.k. ] Done building [ /home/juwan/R329/armbian-build/output/images/Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img ]
[ o.k. ] Runtime [ 350 min ]
[ o.k. ] Repeat Build Options [ ./compile.sh BOARD=maixsense BRANCH=edge RELEASE=bullseye BUILD_MINIMAL=yes BUILD_DESKTOP=no KERNEL_ONLY=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img ]
把 Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0_minimal.img 拿来烧录就行。
以下是我的配置:(如果你连这个都没编译出来就不要操作了)
# Allwinner R329 dual core 256M RAM WiFi USB-C
BOARD_NAME="MaixSense"
BOARDFAMILY="sun50iw11"
BOOTCONFIG="sipeed_maixsense_defconfig"
MODULES_BLACKLIST="lima"
DEFAULT_CONSOLE="serial"
BUILD_DESKTOP="no"
BOOT_LOGO="yes"
SERIALCON="ttyS0"
KERNEL_TARGET="edge"
OFFLINE_WORK="yes"
CLEAN_LEVEL=""
必须经过第一次完整编译才能用 OFFLINE_WORK 加快仓库的拉取检查。
常见问题后记
boot 就不提了,看 https://github.com/sipeed/u-boot 就行,实际上全部交给 armbian-build 仓库就行,这样就具备了基础环境,要编辑的部分自然就很少了。
如果你发现模块加载不成功,可能是 version magic '5.14.0-rc4-sun50iw11 SMP mod_unload aarch64' should be '5.14.0-rc7-01557-gd78f1b75fd69-dirty SMP preempt mod_unload aarch64'
错误。
这是模块加载不成功的常见 version magic 错误,简单的处理方法是修改 linux/include/linux/vermagic.h 直接怼到 #define VERMAGIC_STRING "5.14.0-rc7-01557-gd78f1b75fd69-dirty"
。
想要彻底解决上述这个问题,只能重新编译 armbian-build 导出镜像改变 kernel version 。
如果还有遗漏可以 @ 我补充。