第3章 开发环境搭建:交叉编译工具链安装、Linux驱动开发环境配置、ADB调试工具使用、串口终端工具(Minicom/Putty)配置

说实话,车载无线通信模块的开发,跟你在PC上写个Hello World完全是两码事。模块本身资源有限,跑不了完整的开发环境。所以,我们得在强大的PC上写好代码,然后通过交叉编译,生成模块能跑的二进制文件。这一章,我就带你把这个“桥”搭起来。

3.1 交叉编译工具链安装

交叉编译工具链,说白了就是一套能在X86架构的PC上,生成ARM架构可执行文件的工具集。我刚开始接触时也犯过嘀咕:直接在模块上编译不行吗?后来发现,模块那点算力,编译个Linux内核得等到天荒地老。

工具链的选择

不同的芯片厂商,提供的工具链也不同。高通平台一般用arm-linux-gnueabihf-,恩智浦(NXP)的i.MX系列常用arm-poky-linux-gnueabi-。我个人习惯是,拿到开发板的第一件事,就是去官网下载对应的工具链,千万别混用。

警告: 我曾经在一次项目中,因为图省事,用了隔壁项目的工具链。结果编译出来的驱动,一加载就内核崩溃。查了两天才发现是工具链版本不匹配。所以,一定要用官方指定的版本。

安装步骤(以arm-linux-gnueabihf-为例)

  1. 下载工具链压缩包,比如gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
  2. 解压到指定目录,我一般放在/opt/toolchains/下。
  3. 配置环境变量,将工具链的bin目录添加到PATH中。
# 解压
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/toolchains/

# 配置环境变量(添加到 ~/.bashrc 或 ~/.zshrc)
export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH

# 使生效
source ~/.bashrc

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

看到版本信息输出,就说明安装成功了。嗯,这里要注意,环境变量配置完一定要source一下,或者重新打开终端,否则系统找不到命令。

3.2 Linux驱动开发环境配置

驱动开发,核心就是内核源码和编译环境。你想想看,驱动是内核的一部分,编译时必须依赖内核的头文件和编译规则。

获取内核源码

芯片厂商通常会提供适配好的内核源码包。我建议你直接使用厂商提供的版本,不要自己去主线内核上瞎折腾。厂商的源码里,包含了大量的板级支持包(BSP)和驱动补丁。

配置内核编译环境

这里有个关键点:交叉编译内核时,必须指定架构和交叉编译工具链前缀

# 清理之前的编译产物
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean

# 加载默认配置(厂商提供的 defconfig)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- <厂商_defconfig>

# 编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

-j4表示用4个线程并行编译,能快不少。我自己的笔记本是8核的,经常用-j8

小技巧: 如果你只是编译一个外部驱动模块(比如你写的Wi-Fi驱动),不需要每次都编译整个内核。可以只编译内核模块:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
这样快得多。

3.3 ADB调试工具使用

ADB(Android Debug Bridge)是Android系统的调试利器。车载模块很多都跑Android或基于Android的定制系统,所以ADB是必备技能。

安装ADB

在Ubuntu上,一行命令搞定:

sudo apt-get install android-tools-adb

连接设备

  1. 用USB线连接模块和PC。
  2. 在模块上开启USB调试模式(通常在开发者选项中)。
  3. 在PC上执行adb devices,查看设备是否识别。
$ adb devices
List of devices attached
0123456789ABCDEF    device

如果显示unauthorized,说明模块上弹出了授权请求,需要在模块上点击“允许”。

常用ADB命令

命令 说明
adb shell 进入模块的Linux Shell
adb push <本地> <远程> 将文件从PC推送到模块
adb pull <远程> <本地> 从模块拉取文件到PC
adb logcat 查看模块的日志输出
adb reboot 重启模块
避坑指南: 我曾经在调试一个4G模块时,用adb push上传了一个几百兆的固件包。结果传了一半,USB线松了,前功尽弃。后来我改用adb push配合scp(如果模块支持网络),或者直接用adb install安装APK,稳定多了。

3.4 串口终端工具(Minicom/Putty)配置

串口是嵌入式开发最后的救命稻草。当网络不通、ADB连不上时,串口是你唯一能跟模块对话的通道。

Minicom(Linux环境)

Minicom是Linux下经典的串口工具。我个人比较喜欢用,因为它轻量、稳定。

  1. 安装:sudo apt-get install minicom
  2. 配置:sudo minicom -s

进入配置菜单后,选择“Serial port setup”,然后设置:

  • A - Serial Device:通常是/dev/ttyUSB0/dev/ttyACM0。你可以用ls /dev/tty*查看。
  • E - Bps/Par/Bits:车载模块常用115200 8N1(波特率115200,8位数据位,无校验,1位停止位)。
  • F - Hardware Flow Control:设置为No

配置好后,选择“Save setup as dfl”保存为默认配置,然后“Exit”退出。下次直接运行minicom即可。

注意: 如果打开串口时提示“Device /dev/ttyUSB0 is busy”,说明有其他程序占用了串口。用sudo fuser -k /dev/ttyUSB0可以强制释放。

Putty(Windows环境)

Putty是Windows下的万能终端。配置更直观:

  1. 打开Putty,选择“Serial”连接类型。
  2. 在“Serial line”里填上COM口(比如COM3),在“Speed”里填上115200。
  3. 在左侧导航栏选择“Connection -> Serial”,确认Flow control为“None”。
  4. 回到“Session”,给会话起个名字,点“Save”保存。
  5. 最后点“Open”打开连接。

连接成功后,给模块上电或复位,你应该能看到内核启动的打印信息。如果屏幕上啥也没有,先检查一下接线:TX接RX,RX接TX,GND接GND。这个低级错误,我见过不止一个新手犯过。

小技巧: 在Minicom中,按Ctrl+A然后按Z,可以调出帮助菜单。按Ctrl+A然后按X,可以退出Minicom。这些快捷键记牢了,能省不少事。

好了,到这步,你的开发环境就基本搭好了。交叉编译工具链能编译代码,内核环境能编译驱动,ADB和串口能跟模块通信。下一章,我们就开始真正写代码了。