第二章 开发环境搭建:SDK获取与解压、交叉编译工具链安装、ADB与串口调试环境配置

好,咱们直接进入正题。开发环境搭建这事儿,说难不难,说简单吧,我第一次搞MTK平台时也踩过不少坑。今天我把这些经验掰开揉碎了讲给你听,保证你少走弯路。

2.1 SDK获取与解压

先说说SDK。MTK8676的SDK,一般是通过官方渠道获取的。你拿到的是一个压缩包,名字大概长这样:MTK8676_Android_12_SDK_V1.0.tar.gz

我个人习惯,把SDK放在/home/你的用户名/workspace/目录下。别放桌面,也别放中文路径,否则后面编译时各种奇葩报错,你哭都来不及。

解压命令很简单:

tar -xzvf MTK8676_Android_12_SDK_V1.0.tar.gz -C /home/你的用户名/workspace/

解压完你会看到一个庞大的目录结构。别慌,核心目录就这几个:

目录名 作用
kernel/ Linux内核源码,定位驱动在这里改
hardware/ 硬件抽象层,GNSS HAL就在这
vendor/ 厂商定制部分,导航引擎集成的主战场
prebuilts/ 预编译工具链,后面会用到
注意:解压后务必检查磁盘空间。整个SDK解压完大概需要80GB左右。我曾经在项目赶工时,因为磁盘满了导致编译到一半报错,那叫一个酸爽。

2.2 交叉编译工具链安装

交叉编译工具链,说白了就是让你的电脑能编译出给ARM芯片跑的代码。MTK8676用的是ARM Cortex-A系列内核,所以我们需要aarch64的交叉编译器。

SDK里其实已经自带了预编译好的工具链,在prebuilts/gcc/linux-x86/aarch64/目录下。但我建议你手动装一个官方版本,更稳定。

安装步骤:

  1. 下载Linaro GCC工具链(推荐7.5版本以上)
  2. 解压到/opt/toolchains/目录
  3. 配置环境变量

具体命令:

# 解压
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/toolchains/

# 配置环境变量(加到 ~/.bashrc 里)
export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64

# 使生效
source ~/.bashrc

验证是否安装成功:

aarch64-linux-gnu-gcc --version

如果看到版本信息,恭喜你,工具链搞定了。

小技巧:我习惯在项目根目录下创建一个setenv.sh脚本,把环境变量都写进去。每次打开新终端,直接source setenv.sh就行,省得每次都要手动敲。

2.3 ADB调试环境配置

ADB是Android调试桥,咱们做座舱开发离不开它。MTK8676的ADB调试,和普通Android手机有点不一样——它默认是关闭的,需要手动打开。

配置步骤:

  1. 安装ADB工具:sudo apt install adb
  2. 添加USB设备规则
  3. 重启ADB服务

USB规则配置:

# 创建规则文件
sudo vim /etc/udev/rules.d/51-android.rules

# 添加以下内容(MTK的VID是0E8D)
SUBSYSTEM=="usb", ATTR{idVendor}=="0e8d", MODE="0666", GROUP="plugdev"

# 重启udev
sudo service udev restart

连接开发板后,用adb devices检查。如果看到设备号,说明连接成功。

踩坑提醒:我曾经遇到过ADB连不上,折腾了半天,最后发现是USB线的问题。MTK8676对USB线比较敏感,建议用原装线或者带屏蔽的优质线。别问我怎么知道的,说多了都是泪。

2.4 串口调试环境配置

串口调试是座舱开发的保底手段。当ADB连不上、网络不通时,串口就是你最后的救命稻草。

MTK8676开发板通常提供UART0作为调试串口,波特率一般是115200。你需要准备:

  • USB转串口模块(推荐FT232或CP2102)
  • 串口调试工具(minicom或putty)

Linux下用minicom配置:

# 安装minicom
sudo apt install minicom

# 配置串口参数
sudo minicom -s

# 进入配置菜单后设置:
# 串口设备:/dev/ttyUSB0(根据实际情况调整)
# 波特率:115200
# 数据位:8
# 停止位:1
# 校验:无
# 硬件流控:关闭

保存配置后退出,重新打开minicom。如果开发板已经上电,你应该能看到内核启动日志刷刷地往外蹦。

我的习惯:我会同时开两个终端——一个跑ADB logcat看Android日志,一个跑串口看内核日志。这样定位问题时,上层应用和底层驱动的信息都能实时看到,效率翻倍。

2.5 环境验证

所有环境搭好后,咱们做个快速验证。写个简单的Hello World,交叉编译后扔到开发板上跑:

// hello_gnss.c
#include <stdio.h>

int main() {
    printf("Hello from MTK8676 GNSS!\n");
    return 0;
}

编译:

aarch64-linux-gnu-gcc -o hello_gnss hello_gnss.c

通过ADB推到开发板:

adb push hello_gnss /data/local/tmp/
adb shell chmod +x /data/local/tmp/hello_gnss
adb shell /data/local/tmp/hello_gnss

如果看到输出,说明你的整个开发环境已经打通了。嗯,到这一步,你可以给自己泡杯咖啡,庆祝一下。

下一章,咱们开始真正接触GNSS HAL层的代码。那才是重头戏。