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官网 |
安装步骤其实很简单:
- 下载工具链压缩包
- 解压到/opt目录
- 配置环境变量
# 解压
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 环境验证——确保一切就绪
搭完环境,咱们得验证一下。我一般按这个顺序检查:
- 编译测试:写个hello world,用交叉编译器编译,看看能不能生成ARM架构的可执行文件
- TFTP测试:在uboot里用tftp命令下载一个文件,看看速度正不正常
- NFS测试:板子上挂载NFS目录,看看能不能读写文件
- 串口测试:板子上电,看看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是怎么把内核拉起来的。