2. 开发环境搭建
嵌入式Linux开发是一个“宿主机编译、目标机运行”的交叉开发过程。本章将带领你从零搭建一套完整的全志T113开发环境,涵盖硬件平台确认、交叉编译工具链安装、Linux内核源码获取与配置,以及TFTP/NFS网络启动环境的搭建。这是后续所有设备树解析与驱动开发实验的基础。
2.1 硬件平台(T113开发板)
全志T113是一款双核Cortex-A7处理器,集成64MB DDR3内存,广泛应用于工业控制、智能家居和HMI领域。本课程以一款典型的T113开发板为例进行讲解。
2.1.1 核心硬件规格
| 组件 | 规格 | 备注 |
|---|---|---|
| SoC | 全志 T113 (双核 Cortex-A7) | 集成 64MB DDR3 |
| 存储 | SPI NAND Flash / SD Card | 默认从SD卡启动 |
| 网络 | 10/100M Ethernet (RMII) | PHY: RTL8201F |
| 调试接口 | UART0 (3.3V TTL) | 波特率 115200 |
| USB | 1x USB OTG, 1x USB HOST | 用于烧录与调试 |
2.1.2 开发板接口布局
下图展示了T113开发板的主要接口位置,方便你在后续操作中快速找到对应的连接点。
- 串口线必须使用3.3V TTL电平,禁止直接连接RS232电平转换器,否则可能烧毁SoC的UART引脚。
- 开发板供电推荐使用5V/2A以上的稳压电源,避免使用劣质USB线缆导致供电不足。
- 首次上电前,请确认板载跳线帽处于“SD卡启动”模式(通常为SPI Flash禁用状态)。
2.2 交叉编译工具链安装
由于T113的ARM Cortex-A7内核无法直接运行x86架构的编译程序,我们需要在Ubuntu宿主机上安装交叉编译工具链。
2.2.1 工具链选择
本课程使用ARM官方推荐的 gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf 版本,它支持硬浮点运算,能够充分发挥Cortex-A7的FPU性能。
| 属性 | 说明 |
|---|---|
| 架构 | armv7ve (Cortex-A7) |
| 浮点 | hard (hf) |
| 库 | glibc (GNU C Library) |
| 前缀 | arm-none-linux-gnueabihf- |
2.2.2 安装步骤
- 下载工具链(约200MB):
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
- 解压到系统目录:
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/
sudo mv /opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf /opt/gcc-arm-t113
- 配置环境变量(写入 ~/.bashrc):
echo 'export PATH=$PATH:/opt/gcc-arm-t113/bin' >> ~/.bashrc
source ~/.bashrc
- 验证安装:
arm-none-linux-gnueabihf-gcc --version
# 输出应包含 "gcc version 10.3.1 20210621 (Arm GNU Toolchain ...)"
file 命令查看生成的二进制文件,确认显示为 ELF 32-bit LSB executable, ARM, version 1 (SYSV),即表示交叉编译环境正常。
2.3 Linux内核源码获取与配置
全志T113的官方内核基于Linux 5.4.61版本,全志在主线内核基础上增加了对T113外设的驱动支持。我们使用全志官方发布的BSP内核源码。
2.3.1 获取源码
从全志官方Git仓库或第三方维护的镜像获取:
git clone -b t113-v5.4.61 https://github.com/allwinner-zh/linux-5.4.git t113-linux-5.4
cd t113-linux-5.4
2.3.2 内核配置
T113的默认配置文件位于 arch/arm/configs/sun8i_t113_defconfig。加载该配置并进入菜单配置界面:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- sun8i_t113_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig
在menuconfig界面中,需要重点确认以下选项:
| 配置路径 | 选项 | 状态 | 说明 |
|---|---|---|---|
| Device Drivers → Network device support | Ethernet driver for Allwinner EMAC | 启用 (*) | 板载网卡驱动 |
| Device Drivers → GPIO Support | GPIO_SYSFS / GPIO_CDEV | 启用 (*) | 用户空间GPIO控制接口 |
| File systems → Network File Systems | NFS client support | 启用 (*) | NFS根文件系统挂载 |
| Kernel Features | Use the ARM EABI to compile the kernel | 启用 (*) | 必须与工具链EABI匹配 |
2.3.3 编译内核
配置完成后,执行编译命令。使用 -jN 参数加速编译(N为CPU核心数):
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j4 zImage
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j4 dtbs
编译成功后,会在 arch/arm/boot/ 目录下生成 zImage(内核镜像)和 sun8i-t113-evk.dtb(设备树二进制文件)。
arch/arm/boot/dts/sun8i-t113-evk.dts。后续章节将详细解析该文件的结构与修改方法。
2.4 TFTP/NFS网络启动环境搭建
网络启动是嵌入式开发中最常用的调试方式。通过TFTP将内核和设备树加载到开发板内存,再通过NFS挂载根文件系统,可以避免反复烧写Flash,大幅提升开发效率。
2.4.1 网络启动流程
下图展示了从开发板上电到进入Shell的完整网络启动链路:
2.4.2 宿主机服务配置(Ubuntu)
步骤1:安装并配置TFTP服务
sudo apt-get install tftpd-hpa
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
# 编辑配置文件 /etc/default/tftpd-hpa
sudo vim /etc/default/tftpd-hpa
配置文件内容:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
重启服务:
sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa
步骤2:安装并配置NFS服务
sudo apt-get install nfs-kernel-server
sudo mkdir -p /srv/nfs/rootfs
# 编辑 /etc/exports
sudo vim /etc/exports
在 /etc/exports 中添加:
/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
重启服务:
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server
2.4.3 开发板U-Boot设置
将编译好的 zImage 和 sun8i-t113-evk.dtb 复制到 /srv/tftp/ 目录。在开发板串口终端进入U-Boot命令行,执行以下命令:
# 设置网络参数(根据实际环境修改IP)
setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.10
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
# 通过TFTP下载内核和设备树
tftp 0x42000000 zImage
tftp 0x43000000 sun8i-t113-evk.dtb
# 设置NFS根文件系统启动参数
setenv bootargs 'console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.10:/srv/nfs/rootfs,vers=3 rw ip=192.168.1.100:192.168.1.10:192.168.1.1:255.255.255.0::eth0:off'
# 启动内核
bootz 0x42000000 - 0x43000000
bootcmd 中,即可实现上电自动网络启动:setenv bootcmd 'tftp 0x42000000 zImage; tftp 0x43000000 sun8i-t113-evk.dtb; bootz 0x42000000 - 0x43000000'saveenv
2.4.4 常见问题排查
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| TFTP下载超时 | 防火墙阻挡UDP 69端口 | sudo ufw allow 69/udp |
| NFS挂载失败: “VFS: Unable to mount root fs” |
NFS版本不匹配或路径错误 | 确认 /etc/exports 路径与 nfsroot 参数一致;尝试添加 ,vers=3 |
| 开发板无法获取IP | 网线未连接或PHY驱动未初始化 | 检查网口指示灯;在U-Boot中执行 mdio list 确认PHY地址 |
| 内核启动后卡在 “Waiting for root device” |
设备树中网卡节点状态异常 | 检查 sun8i-t113-evk.dts 中 &emac 节点 status = "okay" |
no_root_squash 选项会赋予客户端root权限,存在安全风险。
2.5 本章小结
至此,你已经完成了全志T113开发环境的全部搭建工作:
- 认识了T113开发板的硬件接口与布局。
- 安装了ARM交叉编译工具链并验证了其可用性。
- 获取了Linux 5.4内核源码,完成了针对T113的配置与编译。
- 在宿主机上搭建了TFTP和NFS服务,并在U-Boot中配置了网络启动参数。