要让a20芯片在Linux下成功加载驱动,核心在于正确配置设备树(dts)和编译内核模块,这是驱动被系统识别的基础。
a20 linux驱动加载步骤详解
驱动加载不是简单复制文件,而是一套从内核源码到模块挂载的完整流程,下面按实操顺序拆解。
准备工作:获取内核源码与交叉编译工具链
a20基于ARM Cortex-A7架构,开发环境通常用x86_64主机,需要准备:
- 内核源码:全志官方BSP分支或主线内核,推荐主线linux-stable,社区支持更好。
- 交叉编译工具链:arm-linux-gnueabihf或aarch64-linux-gnu(取决于32/64位系统),从Linaro或发行版源安装。
- 设备树源文件(dts):a20的dts文件存放在
arch/arm/boot/dts/目录,常见如sun7i-a20-cubieboard2.dts。
操作命令示例:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git cd linux export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf-
配置内核:开启需要的驱动选项
驱动加载前提是内核包含对应模块。不是所有驱动都默认开启,需要手动选中。
步骤:
- 运行
make menuconfig,进入图形配置界面。 - Device Drivers下找到对应硬件类别,如I2C、SPI、USB、LCD、音频等。
- 对需要加载的驱动,选
<M>(模块化编译)或<>(编译进内核),模块化更灵活,便于独立加载和卸载。 - 配置完成后保存
.config文件。
行业共识认为,a20的常见驱动如GMAC以太网、CTS红外、NAND闪存、音频Codec,在menuconfig中路径明确,但需注意依赖关系,例如USB Host驱动依赖于EHCI和OHCI。
编译驱动模块与设备树文件
配置完成后,编译内核和模块,以及生成dtb设备树二进制文件。

命令:
make zImage # 编译内核镜像 make modules # 编译所有模块 make dtbs # 编译设备树
编译好的模块在drivers/下对应子目录中,以.ko文件存在,dtb文件在arch/arm/boot/dts/目录。
加载模块并验证
将编译产物部署到开发板:
- 复制dtb:替换
/boot/下的dtb文件,或通过u-boot引导。 - 复制模块:到
/lib/modules/$(uname -r)/,执行depmod -a更新依赖。 - 加载驱动:
modprobe <驱动名>,或insmod <.ko路径>。
验证方法:
lsmod | grep <驱动名>查看是否加载。dmesg | tail -20看内核打印信息,确认有无错误或设备注册成功。- 对于设备节点,检查
/dev/下是否出现对应文件。
a20 linux驱动加载失败如何排查
驱动加载失败是常见问题,多数情况下不是驱动本身有问题,而是配置、版本或硬件冲突导致。
检查设备树配置是否正确
设备树告诉内核外设的地址、中断、时钟等信息。错误或遗漏的dts节点是驱动加载失败的首要原因。
排查方法:
- 用
dtc工具反编译当前使用的dtb,查看节点是否完整,例如A20的I2C控制器节点应包含compatible = "allwinner,sun7i-a20-i2c"。 - 对比官方dts文件,确保引脚复用(pinctrl)设置正确。
- 确认
status = "okay",不少节点默认disabled,需要手动开启。
确认驱动与内核版本匹配
主线内核和全志BSP内核的驱动API差异较大。BSP驱动通常依赖特定内核版本,直接移植到主线会因函数接口变化导致编译失败或加载时符号未知。

业内专家指出,a20的驱动在BSP 3.4内核上最稳定,但主线内核从4.x开始逐步完善,部分驱动(如GPU)仍需要外部补丁。
如果加载时提示Unknown symbol或version magic不匹配,说明模块与内核版本不一致,必须用目标板运行的内核源码编译驱动。
使用dmesg日志定位错误
dmesg是驱动加载的第一手诊断工具,常见错误关键字:
| 错误信息 | 可能原因 |
|---|---|
No driver found | 设备树compatible不匹配,或驱动未注册 |
Resource busy | 内存区域或中断被其他设备占用 |
Failed to probe | 硬件初始化失败,如时钟未使能、GPIO冲突 |
Unknown symbol | 模块依赖的符号不在内核中,缺少其他模块 |
日志分析步骤:
- 清空
dmesg -c,然后加载驱动。 - 查看最后几条输出,找到第一个错误。
- 根据错误提示,检查设备树资源或内核配置。
a20 linux驱动加载在常见开发板上的区别
a20被用于多款开发板,驱动加载流程相同,但细节差异会影响成功率。
Cubieboard vs Banana Pi
Cubieboard2和Banana Pi都使用a20芯片,但板级外设不同:
- Cubieboard2:官方的sun7i-a20-cubieboard2.dts已包含大部分外设,驱动加载基本无痛,但NAND闪存驱动需要手动开启。
- Banana Pi:使用sun7i-a20-bananapi.dts,额外增加了SATA、千兆以太网(RTL8211E)等外设。SATA驱动依赖于AHCI,需在menuconfig中开启
ATA相关选项,否则加载失败。
对比下来,Banana Pi的驱动加载步骤更复杂,因为需要配置更多外设模块,许多用户反映,在Banana Pi上加载音频驱动(sun4i-codec)时,需要额外调节GPIO复用,否则无声音输出。

价格影响?不同开发板的驱动加载体验
a20开发板价格从几十元到几百元不等,主要差异在硬件用料和扩展接口,但驱动加载体验与价格并无直接关系。
- 低价板(如杂牌核心板)的硬件设计可能不符全志参考设计,导致设备树需要大量修改,驱动加载失败率较高。
- 主流板(Cubieboard、Banana Pi)有社区维护的设备树,驱动加载相对顺畅。多数情况下,多花几十元购买成熟板型,能省去大量调试时间。
如果你只是学习驱动开发,低价板搭配BSP内核也能跑;如果是产品量产,建议选择有稳定驱动支持的板型,减少后期维护成本。
常见问题与解答
a20 linux驱动加载后设备不识别怎么办?
先确认驱动是否已加载(lsmod),然后检查dmesg是否有probe错误,如果驱动已加载但设备节点未出现,大概率是设备树中reg地址或interrupts属性错误,对照芯片手册修正dts,重新编译dtb并重启。
a20 linux驱动加载是否需要重新编译整个内核?
不需要,如果驱动以模块编译(<M>),只需单独编译该模块并复制到/lib/modules,然后depmod和modprobe即可,但如果驱动依赖的某些功能被编译进内核(<>),且当前内核未包含,则需要重新编译整个内核并替换zImage。
a20 linux驱动加载在主线内核与legacy内核的区别?
Legacy内核(全志BSP 3.4)对a20驱动支持最完整,但内核版本老旧,安全漏洞多,主线内核(4.x及以上)驱动支持逐步完善,但部分专有外设(如GPU Mali400)需要额外补丁才能加载,选择主线内核时,建议使用linux-sunxi社区的维护分支,驱动加载成功率更高。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复