3、开发环境搭建:SDK获取、交叉编译工具链配置、ADB与串口调试环境
好,咱们进入第三章。说实话,很多做语音产品的朋友,最后卡住的不是算法,反而是环境搭建。我见过太多人拿着SDK不知道从哪下手,或者编译出来跑不起来。今天咱们就把这块彻底捋清楚。
3.1 SDK获取与版本选择
MTK8678的SDK,官方叫法其实是「Genio SDK」。你找MTK的FAE要就行,或者从联发科官方的开发者门户下载。我个人习惯是直接找FAE要,因为能顺便拿到一些内部的技术支持文档。
这里有个坑——SDK版本。MTK8678的SDK迭代挺快的,我去年做项目时就遇到过:用V1.2的SDK编译出来的固件,在V2.0的硬件板上死活起不来。后来查了半天,发现是电源管理部分的寄存器地址变了。
- SDK版本必须与硬件版本对应(看板子丝印上的REV编号)
- 语音唤醒算法库通常单独发布,注意与SDK主版本对齐
- 建议保留至少两个版本的SDK,方便回退
拿到SDK后,解压出来大概长这样:
mtk8678_sdk/
├── kernel/ # Linux内核源码
├── bootloader/ # 引导加载程序
├── vendor/ # 厂商定制层
├── device/ # 设备配置文件
├── external/ # 第三方库
├── prebuilts/ # 预编译工具链
└── build/ # 编译脚本
嗯,这里要注意,prebuilts/目录里其实已经带了一套交叉编译工具链。但说实话,我建议你别直接用。为什么?因为MTK官方提供的工具链版本往往比较老,有些新特性不支持。我习惯自己配一套。
3.2 交叉编译工具链配置
交叉编译,说白了就是在你的电脑上编译出能在ARM芯片上跑的程序。MTK8678用的是Cortex-A系列内核,所以我们需要ARM架构的交叉编译器。
我个人推荐用gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf这个版本。为什么选这个?我在项目中测试过,它对NEON指令集的支持最好,而语音算法里大量用到SIMD加速。
安装步骤其实很简单:
# 1. 下载工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz
# 2. 解压到指定目录
tar -xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt/
# 3. 配置环境变量
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export ARCH=arm
~/.bashrc 里加了个函数,切换项目时一键切换工具链:
function mtk_env() {
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabihf-
echo "MTK8678 环境已就绪"
}
配置好之后,验证一下:
$ arm-none-linux-gnueabihf-gcc --version
arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07) 10.3.1 20210621
Copyright (C) 2020 Free Software Foundation, Inc.
看到版本号就说明配好了。你想想看,如果这里报错说找不到命令,八成是PATH没加对,或者下载的版本架构不对(比如下了个aarch64的用在32位系统上)。
3.3 ADB调试环境搭建
ADB,全称Android Debug Bridge。虽然MTK8678跑的是Linux,但联发科保留了ADB的支持。为什么?因为调试语音设备时,ADB的logcat功能太好用了。
我刚开始做语音助手时,一直用串口打log。后来发现ADB能直接抓取音频数据流,还能push/pull文件,比串口方便太多了。
搭建步骤:
- 安装ADB工具:
sudo apt install adb或者去Android官网下载platform-tools - 添加USB规则:MTK8678的USB VID是0x0e8d,需要写个udev规则
- 连接设备:用USB线连接开发板,执行
adb devices
udev规则文件长这样:
# /etc/udev/rules.d/51-mtk.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"
写完后执行 sudo udevadm control --reload-rules 让它生效。
| 命令 | 用途 | 我的经验 |
|---|---|---|
adb logcat -s VoiceWakeup | 过滤语音唤醒日志 | 调试唤醒率时必用 |
adb push local remote | 推送文件到设备 | 更新唤醒词模型文件 |
adb shell cat /proc/asound/cards | 查看音频设备 | 确认麦克风阵列是否识别 |
adb shell dumpsys media.audio_policy | 查看音频策略 | 排查音频路由问题 |
3.4 串口调试环境配置
ADB虽然好用,但有个致命问题——如果系统还没完全启动,或者内核挂了,ADB就用不了。这时候就得靠串口了。说白了,串口是最后的救命稻草。
MTK8678的串口默认是UART0,波特率921600。我记得第一次用的时候,按默认的115200去连,结果全是乱码。查了半天规格书才发现波特率不一样。
串口连接参数:
波特率: 921600
数据位: 8
停止位: 1
校验位: 无
流控制: 无
Linux下我用 screen 或者 minicom。个人更推荐 screen,因为轻量:
# 安装screen
sudo apt install screen
# 连接串口(假设设备是 /dev/ttyUSB0)
screen /dev/ttyUSB0 921600
# 退出:Ctrl+A 然后按 K
- 我曾经因为USB转串口线质量差,导致数据丢包,换了根FTDI芯片的线就好了
- 如果板子没反应,先量一下TX/RX电压,3.3V才正常
- 串口线不要超过1.5米,否则信号衰减严重
- 记得把串口工具的流控制关掉,不然会卡死
3.5 环境验证:跑一个Hello World
环境搭好了,总得验证一下能不能用。我习惯写个简单的测试程序,交叉编译后推到板子上跑。
// hello_wakeup.c
#include <stdio.h>
#include <unistd.h>
int main() {
printf("MTK8678 Voice Assistant Ready!\n");
printf("Wakeup Engine Version: 1.0\n");
// 模拟唤醒检测循环
for (int i = 0; i < 5; i++) {
printf("Waiting for wake word... [%d]\n", i);
sleep(1);
}
printf("Wake word detected!\n");
return 0;
}
编译和运行:
# 交叉编译
arm-none-linux-gnueabihf-gcc -o hello_wakeup hello_wakeup.c
# 推送到板子
adb push hello_wakeup /data/
# 添加执行权限
adb shell chmod +x /data/hello_wakeup
# 运行
adb shell /data/hello_wakeup
如果看到打印信息,说明你的开发环境就彻底通了。这时候你可以长舒一口气——最难的部分已经过去了。