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 这个工具——你后面做内核镜像打包时一定会用到。
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都能稳定运行。
安装步骤很简单:
- 下载工具链压缩包
- 解压到
/opt目录 - 配置环境变量
# 下载(如果网速慢,可以找我要百度网盘链接)
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
如果看到版本号输出,恭喜你,工具链就位了。
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。我第一次用的时候不知道,直接关终端窗口,结果下次打开发现串口还被占着...
如果你更喜欢图形界面,也可以用 MobaXterm 或者 SecureCRT。但说实话,在Linux主机上,picocom或者minicom就够用了,没必要搞那么复杂。
2.5 环境验证
所有服务都配好了,咱们来个快速验证:
- 把编译好的
zImage和sun8i-t113-mq-r.dtb放到/tftpboot目录 - 把根文件系统解压到
/srv/nfs/rootfs - 用串口线连接开发板,启动picocom
- 给开发板上电,在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
如果一切顺利,你会看到内核启动信息从串口终端刷刷地滚出来。那一刻,你会觉得前面所有的配置工作都值了。
下一章,咱们开始真正接触T113的uboot移植。嗯,那才是重头戏。