2、开发环境搭建:Ubuntu系统安装、交叉编译工具链配置、TFTP/NFS服务搭建、串口终端工具使用

说实话,做三星平台BSP开发这么多年,我见过太多新手在环境搭建这一步就栽了跟头。环境没配好,后面全是坑。今天我就把这几年的经验捋一捋,带你把这套环境搭得明明白白。

2.1 Ubuntu系统安装——选对版本很重要

我个人习惯用Ubuntu 18.04 LTS或20.04 LTS。为什么?因为三星官方SDK对这两个版本支持最好。你想想看,用个太新的版本,编译工具链可能不兼容;用太老的,软件源都停了。

推荐配置:

  • 系统:Ubuntu 18.04.6 LTS 或 20.04.4 LTS
  • 磁盘:至少100GB(我建议200GB,后面编译内核和文件系统很占空间)
  • 内存:8GB起步,16GB更舒服
  • CPU:4核以上

安装时注意几点:

  • 分区时把/home单独分出来,方便以后重装系统不丢数据
  • 安装OpenSSH Server,方便远程操作
  • 记得勾选「安装第三方软件」,不然无线网卡驱动可能没有

我的小技巧:装完系统第一件事就是换国内源。我用的是清华源,速度飞快。命令很简单:

sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y

2.2 交叉编译工具链配置——别在这卡住

交叉编译工具链,说白了就是让你的PC能编译出ARM架构上跑的程序。三星平台一般用gcc-arm-none-eabi或者linaro的gcc-arm-linux-gnueabihf。

我记得有一次,一个同事折腾了两天,编译总是报错。最后发现是工具链版本和内核版本不匹配。嗯,这里要注意:

三星平台 推荐工具链 下载地址
S5PV210 arm-linux-gnueabi-4.5.1 ARM官方存档
Exynos 4412 arm-linux-gnueabihf-4.9.3 Linaro官网
Exynos 5422 aarch64-linux-gnu-6.3.1 Linaro官网

安装步骤其实很简单:

  1. 下载工具链压缩包
  2. 解压到/opt目录
  3. 配置环境变量
# 解压
sudo tar -xvf gcc-linaro-arm-linux-gnueabihf-4.9-2016.02.tar.xz -C /opt/

# 配置环境变量(加到~/.bashrc里)
export PATH=$PATH:/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2016.02/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

# 验证
arm-linux-gnueabihf-gcc --version

避坑指南:我曾经遇到过一个问题——工具链路径里有空格,结果编译脚本死活找不到编译器。所以路径里千万别有空格,也别用中文目录名。

2.3 TFTP/NFS服务搭建——调试必备

做BSP开发,你肯定要频繁烧写内核和文件系统。每次都插拔SD卡?太慢了。TFTP和NFS就是你的救星。

2.3.1 TFTP服务

TFTP用来通过网络下载内核镜像。板子上电后,uboot通过TFTP从PC上拉取zImage。

# 安装TFTP服务
sudo apt install tftpd-hpa tftp-hpa

# 配置
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 mkdir /tftpboot
sudo chmod 777 /tftpboot

# 重启服务
sudo systemctl restart tftpd-hpa

把编译好的zImage和dtb文件丢到/tftpboot里,uboot那边就能直接下载了。

2.3.2 NFS服务

NFS用来挂载根文件系统。这样你修改了文件系统内容,板子重启就能看到效果,不用重新烧写。

# 安装NFS服务
sudo apt install nfs-kernel-server

# 配置导出目录
sudo vim /etc/exports

# 添加一行(假设你的文件系统在/nfs/rootfs)
/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)

# 重启服务
sudo systemctl restart nfs-kernel-server

我的经验:no_root_squash这个选项一定要加。不加的话,板子上root用户对文件系统没有写权限,很多程序跑不起来。我刚开始就因为这个折腾了半天。

2.4 串口终端工具使用——调试的窗口

串口是嵌入式开发最重要的调试手段。没有串口输出,你就像瞎子摸象。我个人最常用的是minicom和putty。

2.4.1 minicom配置

# 安装
sudo apt install minicom

# 配置(第一次需要设置)
sudo minicom -s

# 进入配置菜单后:
# 1. 选择 Serial port setup
# 2. 设置 A - Serial Device: /dev/ttyUSB0(根据你的实际设备)
# 3. 设置 E - Bps/Par/Bits: 115200 8N1
# 4. 设置 F - Hardware Flow Control: No
# 5. 设置 G - Software Flow Control: No
# 6. 保存为默认配置

2.4.2 常见问题

  • 找不到串口设备:检查是否安装了USB转串口驱动,或者试试/dev/ttyUSB1
  • 乱码:波特率不对,三星平台默认115200
  • 只能收不能发:检查硬件流控是否关闭

避坑指南:我曾经遇到过串口输出一半就卡住的情况。后来发现是USB转串口线质量太差,丢数据。建议买FT232芯片的线,稳定很多。另外,串口线不要超过2米,信号衰减很严重。

2.5 环境验证——确保一切就绪

搭完环境,咱们得验证一下。我一般按这个顺序检查:

  1. 编译测试:写个hello world,用交叉编译器编译,看看能不能生成ARM架构的可执行文件
  2. TFTP测试:在uboot里用tftp命令下载一个文件,看看速度正不正常
  3. NFS测试:板子上挂载NFS目录,看看能不能读写文件
  4. 串口测试:板子上电,看看uboot启动信息能不能完整输出
# 编译测试示例
echo 'int main(){printf("Hello BSP!\n");return 0;}' > test.c
arm-linux-gnueabihf-gcc -o test test.c
file test
# 输出应该包含 ARM 字样

好了,环境搭好了,后面就可以正式开始搞BSP移植了。记住,环境搭建别着急,一步一个脚印。我见过太多人图快,结果后面花更多时间排查环境问题。

下一章,咱们开始分析三星平台的启动流程,看看uboot是怎么把内核拉起来的。