2. 开发环境搭建

嵌入式Linux开发是一个“宿主机编译、目标机运行”的交叉开发过程。本章将带领你从零搭建一套完整的全志T113开发环境,涵盖硬件平台确认、交叉编译工具链安装、Linux内核源码获取与配置,以及TFTP/NFS网络启动环境的搭建。这是后续所有设备树解析与驱动开发实验的基础。

💡 学习目标: 完成本章后,你将能够从串口终端看到T113开发板的启动信息,并能够通过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开发板的主要接口位置,方便你在后续操作中快速找到对应的连接点。

T113 开发板接口布局示意图 全志 T113 SoC (双核 Cortex-A7 + 64MB DDR) DC 5V 输入 UART0 调试 Ethernet USB OTG SD Card ⚠️ 串口连接:GND/TX/RX 交叉连接,波特率115200
⚠️ 硬件连接注意事项:
  • 串口线必须使用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 安装步骤

  1. 下载工具链(约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
  1. 解压到系统目录:
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
  1. 配置环境变量(写入 ~/.bashrc):
echo 'export PATH=$PATH:/opt/gcc-arm-t113/bin' >> ~/.bashrc
source ~/.bashrc
  1. 验证安装:
arm-none-linux-gnueabihf-gcc --version
# 输出应包含 "gcc version 10.3.1 20210621 (Arm GNU Toolchain ...)"
✅ 验证小技巧: 编译一个简单的hello.c文件,使用 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(设备树二进制文件)。

💡 设备树编译: 全志T113的设备树源文件位于 arch/arm/boot/dts/sun8i-t113-evk.dts。后续章节将详细解析该文件的结构与修改方法。

2.4 TFTP/NFS网络启动环境搭建

网络启动是嵌入式开发中最常用的调试方式。通过TFTP将内核和设备树加载到开发板内存,再通过NFS挂载根文件系统,可以避免反复烧写Flash,大幅提升开发效率。

2.4.1 网络启动流程

下图展示了从开发板上电到进入Shell的完整网络启动链路:

T113 网络启动流程图 ① 开发板上电 ② BootROM ③ U-Boot ④ TFTP 下载 zImage + dtb ⑤ NFS 挂载 根文件系统 ⑥ Shell 宿主机需同时运行 TFTP 服务端和 NFS 服务端 开发板与宿主机必须在同一网段

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
✅ 自动化启动: 将上述命令保存到U-Boot环境变量 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"
⚠️ 网络启动安全提示: 在公共网络环境中使用TFTP和NFS时,建议仅在隔离的局域网内使用,或配置防火墙规则限制访问来源。TFTP无认证机制,NFS的 no_root_squash 选项会赋予客户端root权限,存在安全风险。

2.5 本章小结

至此,你已经完成了全志T113开发环境的全部搭建工作:

  • 认识了T113开发板的硬件接口与布局。
  • 安装了ARM交叉编译工具链并验证了其可用性。
  • 获取了Linux 5.4内核源码,完成了针对T113的配置与编译。
  • 在宿主机上搭建了TFTP和NFS服务,并在U-Boot中配置了网络启动参数。