第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-为例)
- 下载工具链压缩包,比如
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz。 - 解压到指定目录,我一般放在
/opt/toolchains/下。 - 配置环境变量,将工具链的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。
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
连接设备
- 用USB线连接模块和PC。
- 在模块上开启USB调试模式(通常在开发者选项中)。
- 在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 |
重启模块 |
adb push上传了一个几百兆的固件包。结果传了一半,USB线松了,前功尽弃。后来我改用adb push配合scp(如果模块支持网络),或者直接用adb install安装APK,稳定多了。
3.4 串口终端工具(Minicom/Putty)配置
串口是嵌入式开发最后的救命稻草。当网络不通、ADB连不上时,串口是你唯一能跟模块对话的通道。
Minicom(Linux环境)
Minicom是Linux下经典的串口工具。我个人比较喜欢用,因为它轻量、稳定。
- 安装:
sudo apt-get install minicom - 配置:
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即可。
sudo fuser -k /dev/ttyUSB0可以强制释放。
Putty(Windows环境)
Putty是Windows下的万能终端。配置更直观:
- 打开Putty,选择“Serial”连接类型。
- 在“Serial line”里填上COM口(比如COM3),在“Speed”里填上115200。
- 在左侧导航栏选择“Connection -> Serial”,确认Flow control为“None”。
- 回到“Session”,给会话起个名字,点“Save”保存。
- 最后点“Open”打开连接。
连接成功后,给模块上电或复位,你应该能看到内核启动的打印信息。如果屏幕上啥也没有,先检查一下接线:TX接RX,RX接TX,GND接GND。这个低级错误,我见过不止一个新手犯过。
Ctrl+A然后按Z,可以调出帮助菜单。按Ctrl+A然后按X,可以退出Minicom。这些快捷键记牢了,能省不少事。
好了,到这步,你的开发环境就基本搭好了。交叉编译工具链能编译代码,内核环境能编译驱动,ADB和串口能跟模块通信。下一章,我们就开始真正写代码了。