在全志(Allwinner) V3s上部署U-BOOT, Linux Kernel 5.3 和ArchLinuxARM rootfs
工具链配置
使用arm-linux-gnueabihf交叉工具链进行编译, 可以在archlinuxcn源中找到对应工具链.
sunxi-fel下载工具. 对应仓库community
编译主线U-Boot
从Github拉取U-Boot编译, 从LicheePi的u-boot仓库获取LicheePi_Zero_800x480LCD_defconfig, 放入config文件夹, 执行编译
1 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig |
编译完成获得 u-boot-sunxi-with-spl.bin
使用MicroUSB线连接板子, 执行sunxi-fel version
测试连接有效性, 执行sunxi-fel uboot u-boot-sunxi-with-spl.bin
, 若成功在串口看到u-boot的消息则可以进行下一步操作
编译主线Linux
从Github拉取Linux源代码, 最新版本 5.4.0 RC7 启动会卡在Kernel Starting, 这里暂时使用git reset 089cf7
切回 5.3.0 RC7 版本
主线Linux设备树有一点点小问题, 修改 arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts
, 添加tft屏幕节点, 内容如下
1 | chosen{ |
在soc节点的i2c@01c2ac00子节点下添加触摸屏节点
1 | ns2009@48 { |
在soc节点添加音频Codec节点
1 | dma: dma-controller@1c02000 { |
准备好后从LicheePi的Linux仓库获取 licheepi_zero_defconfig
放入arch/arm/configs/licheepi_zero_defconfig
, 执行make ARCH=arm licheepi_zero_defconfig
生成配置.
执行make ARCH=arm menuconfig
, 在Device Drivers->Staging drivers
里找到RTL8723BS, 启用后保存退出.
执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j3
开始编译Linux, 泡一杯咖啡, 等待主线Linux编译完成
执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 INSTALL_MOD_PATH=out modules
编译驱动, 执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 INSTALL_MOD_PATH=out modules_install
安装驱动, 到这里主线Linux编译完成
配置TF卡实现自启动
找一张至少4GB的TF卡, 用fdisk
删除全部分区, 保存更改, 使用命令dd if=sunxi-u-boot-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8
将u-boot写入TF卡8byte偏移处. 使用fdisk
在2MB位置创建大小为16MB的分区, 创建大小至少4GB的分区, 剩余空间再创建一个分区, 保存分区表. 我使用的分区大小配置为 16MB, 22GB, 8GB.
对三个分区分别进行格式化操作
1 | mkfs.vfat /dev/mmcblk0p1 |
创建文件夹sd
, 挂载第一个分区mount /dev/mmcblk0p1 sd
, 复制linux/arch/arm/boot/zImage
到sd
, 复制linux/arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dtb
到sd
, 在sd
创建boot.cmd
文件, 写入以下内容
1 | setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw |
执行命令mkimage -C none -A arm -T script -d boot.cmd boot.scr
, 取消挂载sd
, 挂载第二分区mount /dev/mmcblk0p2 sd
.
从Arch Linux ARM获取rootfs. 执行d
解压到sd
, 复制linux/out/lib
到sd/lib
, 编辑sd/etc/fstab
, 添加/dev/mmcblk0p3 none swap sw 0 0
, 取消挂载sd
, 使用udisksctl power-off -b /dev/mmcblk0
弹出TF卡
将TF卡插入板子, 插好Wifi模块和TFT屏幕, 连接串口, 打开监视器, 给板子上电
ArchLinux ARM 基本配置
配置网络
Arch Linux ARM 默认不带wpa_supplicant, 使用MicroUSB连接后可以通过USB虚拟网卡上网. 在宿主机配置网卡接口
1 | target="enp0s20f0u2" |
配置DHCP服务器, 编辑/etc/dhcpd.conf
1 | option domain-name-servers 223.5.5.5, 114.114.114.114; |
使用命令dhcpd $target
启动DHCP服务器, 在串口终端上使用dhcpcd usb0
连接.
pacman源设定
使用账户root, 密码root登入Arch Linux ARM, 配置/etc/pacman.d/mirrorlist
, 添加USTC ArchLinuxARM源, 在最上面添加Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
配置/etc/pacman.conf
, 添加archlinuxcn源, 在最底部添加
1 | [archlinuxcn] |
执行下面的命令初始化pacman
1 | pacman-key --init |
安装必要的包. pacman -S vim gdb
wifi配置
使用pacman安装wpa_supplicant. 编辑/etc/wpa_supplicant/wpa_supplicant.conf
, 添加以下内容:
1 | network={ |
执行wpa_supplicant -B -iwlan0 -c/etc/wpa_supplicant/wpa_supplicant.conf
测试WIFI可用性, 成功连接后使用dhcpcd wlan0
获取IP地址.
配置Wlan开机自动连接
复制/etc/wpa_supplicant/wpa_supplicant.conf
到/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
, 执行ln -s /usr/share/dhcpcd/hooks/10-wpa_supplicant /usr/lib/dhcpcd/dhcpcd-hooks/
使能dhcpcd的wpa_supplicant hook脚本, 执行systemctl enable dhcpcd
, systemctl enable wpa_supplicant@wlan0.service
, 重新启动即可看到效果.