2、开发环境搭建:Linux主机环境配置、交叉编译工具链安装、TFTP/NFS服务配置、串口终端工具配置

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事看着琐碎,但真要是哪个环节出了岔子,后面调试能把你折腾到怀疑人生。我自己带项目时,经常遇到新人卡在工具链装不上、TFTP传不了文件这种基础问题上。所以这一章,咱们一步一个脚印,把地基打牢。

2.1 Linux主机环境配置

做嵌入式Linux开发,首选Ubuntu。我个人习惯用Ubuntu 20.04 LTS,稳定,社区支持也好。你问我为什么不用最新版?嗯,有些老一点的交叉编译工具链在新版Ubuntu上会有库依赖问题,犯不着给自己找麻烦。

装好系统后,第一件事是更新软件源,然后安装必备的开发工具包。你直接复制下面这条命令就行:

sudo apt update
sudo apt upgrade -y
sudo apt install -y build-essential git vim curl wget \
    libncurses5-dev libncursesw5-dev \
    u-boot-tools device-tree-compiler \
    tftp-hpa tftpd-hpa nfs-kernel-server \
    minicom picocom

这里面有几个包我要特别提一下:libncurses5-dev 是编译内核时配置菜单用的,device-tree-compiler 用来编译设备树,u-boot-tools 里包含了 mkimage 这个工具——你后面做内核镜像打包时一定会用到。

我的小建议: 如果你用的是虚拟机,记得给Ubuntu分配至少4GB内存和60GB硬盘。我刚开始做T113项目时,硬盘只给了40GB,结果编译到一半空间不够,那个尴尬啊...

2.2 交叉编译工具链安装

全志T113是ARM Cortex-A7内核,咱们的PC是x86架构。你想想看,在x86上编译出ARM能跑的程序,靠的就是交叉编译工具链。

全志官方提供了基于GCC的工具链,我推荐用 gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf 这个版本。为什么选这个?因为我在多个T113项目里验证过,兼容性最好,编译出来的内核和uboot都能稳定运行。

安装步骤很简单:

  1. 下载工具链压缩包
  2. 解压到 /opt 目录
  3. 配置环境变量
# 下载(如果网速慢,可以找我要百度网盘链接)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz

# 解压
sudo tar -xvf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量(写入 ~/.bashrc)
echo 'export PATH=$PATH:/opt/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc

验证是否安装成功:

arm-none-linux-gnueabihf-gcc --version

如果看到版本号输出,恭喜你,工具链就位了。

注意: 我曾经遇到过一位学员,明明装好了工具链,但编译时总报"command not found"。排查了半天,发现是他把工具链解压到了带中文路径的文件夹里。记住,路径里不要有空格和中文!

2.3 TFTP/NFS服务配置

这两个服务是嵌入式开发中的"黄金搭档"。TFTP用来从主机下载内核和设备树到开发板,NFS用来挂载根文件系统。说白了,就是让开发板能从你的电脑上"拿"东西。

2.3.1 TFTP服务配置

TFTP配置其实很简单,但有个坑——它的默认目录权限容易搞错。我直接给你标准配置:

# 创建TFTP根目录
sudo mkdir -p /tftpboot
sudo chmod 777 /tftpboot

# 修改配置文件
sudo vim /etc/default/tftpd-hpa

把文件内容改成这样:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"

然后重启服务:

sudo systemctl restart tftpd-hpa
sudo systemctl enable tftpd-hpa

测试一下:在 /tftpboot 里放个测试文件,然后在另一个终端用 tftp localhost 试试能不能下载。能下载就说明OK了。

2.3.2 NFS服务配置

NFS用来共享根文件系统。我个人习惯把根文件系统放在 /srv/nfs/rootfs 下:

sudo mkdir -p /srv/nfs/rootfs
sudo chmod 777 /srv/nfs/rootfs

# 编辑导出配置文件
sudo vim /etc/exports

添加一行:

/srv/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
关键参数说明:
  • rw:读写权限
  • no_root_squash:允许开发板以root权限访问——这个很重要,不然你挂载后连创建设备节点都会报错
  • *:允许所有IP访问。如果你担心安全,可以改成具体的网段,比如 192.168.1.0/24

重启NFS服务:

sudo systemctl restart nfs-kernel-server
sudo exportfs -av

验证一下:

showmount -e localhost

如果看到 /srv/nfs/rootfs 被列出来,说明NFS配置成功了。

2.4 串口终端工具配置

嵌入式开发离不开串口。你想想看,开发板没有显示器没有键盘,你怎么跟它交互?全靠串口。我个人最常用的是 picocom,轻量、稳定、配置简单。

先看看你的USB转串口设备被识别成什么:

ls /dev/ttyUSB*

一般会显示 /dev/ttyUSB0。如果没显示,检查一下驱动和硬件连接。

然后启动picocom:

sudo picocom -b 115200 /dev/ttyUSB0

参数说明:-b 115200 是波特率,T113的uboot和内核默认都用这个速率。

退出picocom的方法:按 Ctrl+A 然后按 Ctrl+X。我第一次用的时候不知道,直接关终端窗口,结果下次打开发现串口还被占着...

避坑指南: 我曾经遇到过串口乱码的问题,折腾了半天发现是USB转串口模块的TX和RX接反了。记住:开发板的TX接模块的RX,开发板的RX接模块的TX,GND接GND。这个顺序千万别搞错。

如果你更喜欢图形界面,也可以用 MobaXterm 或者 SecureCRT。但说实话,在Linux主机上,picocom或者minicom就够用了,没必要搞那么复杂。

2.5 环境验证

所有服务都配好了,咱们来个快速验证:

  1. 把编译好的 zImagesun8i-t113-mq-r.dtb 放到 /tftpboot 目录
  2. 把根文件系统解压到 /srv/nfs/rootfs
  3. 用串口线连接开发板,启动picocom
  4. 给开发板上电,在uboot命令行里输入:
setenv serverip 192.168.1.100   # 你的主机IP
setenv ipaddr 192.168.1.10      # 开发板IP
tftp 0x42000000 zImage
tftp 0x43000000 sun8i-t113-mq-r.dtb
setenv bootargs console=ttyS0,115200 root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs rw ip=192.168.1.10
bootz 0x42000000 - 0x43000000

如果一切顺利,你会看到内核启动信息从串口终端刷刷地滚出来。那一刻,你会觉得前面所有的配置工作都值了。

总结一下: 这一章我们搞定了四件事——Linux主机环境、交叉编译工具链、TFTP/NFS服务、串口终端。这些都是嵌入式Linux开发的"基础设施"。别嫌麻烦,把这些配好了,后面编译uboot、内核、文件系统的时候,你会感谢现在认真配置的自己。

下一章,咱们开始真正接触T113的uboot移植。嗯,那才是重头戏。