论坛上之前已经有人玩过这块板子了:淘了一个a20行车记录仪主板,并编译lichee
我早在9月初左右就买了几块这个板子,不过开始的工作着重在导出fex和分析pin assignment上,断断续续折腾到今天才完全让主线uboot带起主线Linux进入文件系统。
本来准备先写一贴讲如何从源码构建u-boot的,不过写到一半发现稍微有点累人,所以先发一贴展示一下板子跑起主线Linux的效果:
其实为u-boot编写完板级配置并编译后,主要的移植工作就已经完成了。u-boot在这个板子上还有个小坑,或者坦白一点说对我而言是个大坑,之后会在u-boot那贴里详述。主线内核并没有什么移植工作要做,编译好之后和u-boot,设备树和rootfs一起烧进卡里就行了。放心,u-boot的坑并不用各位手动去填,我已经fork了主线u-boot的repo,晚些时候会连坑的patch带初步写好的板级配置一起上传,需要的坛友直接下载编译即可。
当然,目前的板级配置还比较粗糙,外设的功能还有待验证,板上的加速度传感器还没驱动起来。这些都还需要后续工作完善,坛友有精力的话也希望能contribute一下。
离线
适用于该板的u-boot分支仓库:u-boot-sun7i-std-dvr
构建方法:
make CROSS_COMPILE=arm-linux-gnueabihf- A20_std_dvr_defconfig
如果你想微调一些设置的话:
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
编译:
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
产生的bootloader是./u-boot-sunxi-with-spl.bin
产生的dtb是./arch/arm/dts/sun7i-a20-std-dvr.dtb
配合编译好的主线内核、boot.scr和rootfs就能boot了。以上简略过程是给老手看的,之后我u-boot那贴完成后会更详细步骤。
离线
今天上午没有更贴,去折腾另一个有意思的问题了:获取板子上引出IO的标号。我摸索出了一种不需要对板子下毒手就能获知IO连接的办法:
不拆SoC,不用X光机,利用已知IO探测未知的IO连接情况
这是初步探测出来的IO连接情况:
还有一些没测出来的,不知道什么原因,可能是引脚不在遍历范围内,可能是连接到部分引脚的电阻空焊了,也可能是因为我懒得焊线去探测,而是直接用杜邦线抵着焊盘探测,导致接触不良。
我为这个板子建了个交流群:1164615798
群里会分享这个板子和其他一些便宜的ARM Linux板子的资料。当然,教程还是会在本贴更新,群主要是供交流以及疑难解答之用。也欢迎大家进行其他Linux相关的讨论,或者开一些便宜板子的车。
离线
为这块板子建了个信息汇总的Github仓库
离线
另外,请问下A10的可以跑吗?我还买了一块A10主芯片的记录仪
肯定不行的。A10是sun4i,A20是sun7i,u-boot和dts基于的架构不一样几乎肯定不能兼容。不过你可以在导出fex后根据我发的教程自己适配u-boot试试,或者在群里求助
离线
开始缓更构建教程。提醒一下其实编译出u-boot以及编译u-boot产生的设备树就已经可以正常引导sunxi_defconfig的主线内核进入rootfs了,构建u-boot的过程在二楼,老手编译完就能直接用了。以下教程是相对详细的构建过程。
一、准备
0, 关于系统要求
是个软件包都还比较新的Linux就行,推荐进行下面步骤之前用包管理器进行一次软件更新(Debian系发行版是apt-get update; apt-get upgrade)。实际上我感觉自己的构建环境(Arch Linux文件系统的WSL)可能是最邪门的,因为严格来说它压根就不是Linux……因此如果你是WSL用户的话,你甚至可以全程在Windows下完成构建。
1, 获取工具链
建议直接下载Linaro预先编译好的工具链。如果你的电脑是x86或x64平台(一般都是这个平台,除非你准备在Arm平台上构建)的,下载链接里的gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz即可。
接下来解压工具链的压缩包到你想要的位置。貌似较新版的tar命令能直接
tar -xf 文件名
来解压xz的压缩包了。如果你的系统上不行,请自行搜索xz格式压缩包的解压方法。
解压完成后
export PATH=$PATH:/home/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
把工具链导入环境变量。/home/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/需要换成你解压出的工具链所在的路径。你也可以把该命令写入你使用的shell对应的rc文件(比如.bashrc)里,这样可以避免每次手动导入PATH。
2, 安装必要的依赖
需要的依赖和依赖对应的包名可能在不同发行版下略有不同。Debian系Linux下的依赖可通过如下命令安装:
apt-get install build-essential libncurses5-dev u-boot-tools qemu-user-static debootstrap git binfmt-support libusb-1.0-0-dev pkg-config
我用的Arch上貌似只要安装u-boot-tools flex bison就行了。
3, 获取u-boot源码
进入工作路径,
git clone https://github.com/SdtElectronics/u-boot-sun7i-std-dvr.git
至此构建的准备工作已经完成。下面可以正式开始编译了(待续)
离线
之前找到一份疑似是该板原理图的文件,已上传QQ群文件和Github信息仓库。注意,尽管这份原理图和板子的吻合程度较高,但在部分地方还是有不同的,仅供参考用途。
离线
二、构建u-boot和kernel
1, 编译u-boot(产生bootloader和设备树)
每次编译之前,别忘了确认工具链目录是否已被导入PATH(见10楼)。缺少工具链时make会产生找不到arm-linux-gnueabihf-gcc之类的报错。
进入clone完成的u-boot源码目录,
make CROSS_COMPILE=arm-linux-gnueabihf- A20_std_dvr_defconfig
如果你想微调一些设置的话:
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
不想调整可以跳过这一步,保留默认配置。
编译:
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
产生的bootloader是./u-boot-sunxi-with-spl.bin
产生的dtb是./arch/arm/dts/sun7i-a20-std-dvr.dtb
2, 编译kernel
获取kernel源码
git clone https://github.com/torvalds/linux.git --depth=1
进入clone完成的kernel源码目录,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如果你想微调一些设置的话:
make CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
不想调整可以跳过这一步,保留默认配置。
编译:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j$(nproc) zImage
如果一切顺利的话,到现在为止产生的二进制文件已经足够让板子boot进入内核了。如果你配置了别的内核模块或者希望在板子上运行编译器,可能还想要构建内核模块和头文件,请参考Linux-sunxi的Wiki
(待续)
离线
三、烧写u-boot和SD卡分区
1, 烧写u-boot
可以用Linux下的dd工具,也可以用Windows下git带的MinGW中的dd。以下${card}全部为sd卡的设备路径
清理SD卡:
dd if=/dev/zero of=${card} bs=1M count=1
烧写u-boot:
dd if=u-boot-sunxi-with-spl.bin of=${card} bs=1024 seek=8
2, 分区:
想用什么工具都行,这里以Windows下的DiskGenuis为例。
首先划分一个FAT32分区用于存放内核和其他boot需要的文件,大小为16MB,分区前部保留1MB的空间;
然后划分一个ext3或者ext4的分区,用于存放rootfs,大小足够即可,或者让他直接占满剩余空间。
离线
四、boot分区和文件系统
1, boot分区
刚刚划分好的第一个FAT32分区作为boot分区。boot分区中需存放以下文件:
(1)12楼中编译kernel产生的zImage(在arch/arm/boot/下)
(2)12楼中编译u-boot产生的sun7i-a20-std-dvr.dtb
(3)boot.scr。boot.scr是指引u-boot加载内核的文件,启动时向内核传递的参数也在此定义。下面介绍如何由boot.scr的源文件boot.cmd编译产生boot.scr。
新建一个名为boot.cmd的文件,编辑内容为:
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 0x43000000 sun7i-a20-std-dvr.dtb || load mmc 0:1 0x43000000 boot/sun7i-a20-std-dvr.dtb
load mmc 0:1 0x42000000 zImage || load mmc 0:1 0x42000000 boot/zImage
bootz 0x42000000 - 0x43000000
然后在当前目录下执行
mkimage -C none -A arm -T script -d boot.cmd boot.scr
然后将当前目录下生成的boot.scr拷入boot分区。
2, 文件系统
将你准备好的文件系统拷贝到刚刚划分好的ext4分区,就是后面那个分区。如何准备rootfs请参考Linux-sunxi的Wiki
一楼展示的终端使用的rootfs是LinuxContainers提供的arch Linux文件系统,下载后可以直接解压到ext4分区里。ext4分区下现在应该有这些目录:
bin dev home mnt proc run srv tmp var
boot etc lib opt root sbin sys usr
大功告成!你现在可以插上SD卡尝试boot了。出现问题欢迎在楼里提出,也可以进群讨论。
(全文完)
离线
编译提示spl部分爆内存了。。。头大
https://whycan.com/files/members/4503/none_20201104-1020.png
请使用我发的linaro预编译的工具链编译试试。或者加群有编译好的bootloader在群文件分享。
离线
楼主,请问这个主线的linux支持声卡吗?
A20的Audio CODEC有主线支持,但是这个板子上能用的输出应该只有一个喇叭。麦倒是有两个
离线