3、开发环境搭建:搭建MTK SDK开发环境、配置交叉编译工具链、使用ADB与板子通信、搭建调试日志系统

好,咱们直接进入正题。这一章,说白了就是“磨刀”。刀磨得快不快,直接决定你后面砍柴顺不顺手。我见过太多新手,一上来就急着写代码,结果环境没配好,编译报错半天找不到原因,白白浪费一整天。所以,咱们先把这把刀磨利索。

3.1 搭建MTK SDK开发环境

MTK的SDK,说实话,第一次接触会觉得有点“重”。它不像Arduino那样开箱即用,但一旦你熟悉了它的结构,就会发现其实挺有条理的。

第一步:获取SDK

通常,MTK的SDK会以压缩包的形式提供。你从官方或者合作方拿到后,解压到一个路径里。我个人习惯放在 /home/你的用户名/mtk_sdk/ 下。注意,路径里不要有中文,也不要带空格,否则后面编译会出一些莫名其妙的错误。嗯,这个坑我踩过。

第二步:检查SDK结构

解压后,你会看到类似这样的目录结构:

mtk_sdk/
├── kernel/
├── vendor/
├── device/
├── out/
├── build/
├── prebuilts/
└── Makefile

这里我重点说一下 vendor 目录。你的传感器驱动代码,通常就放在 vendor/mediatek/proprietary/ 下面。比如加速度传感器,可能会在 vendor/mediatek/proprietary/sensors/accel/ 里。这个结构你心里要有数,后面找代码、加文件都靠它。

第三步:安装依赖库

MTK的SDK编译依赖很多系统库。比如 libncurses5-devflexbison 这些。你可以用以下命令一键安装:

sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  libgl1-mesa-dev libxml2-utils xsltproc unzip

我曾经遇到过编译到一半报错,提示缺少某个库,结果查了半天发现是系统版本太新,库名变了。所以,如果你用的是Ubuntu 20.04或22.04,记得确认一下库的版本兼容性。

3.2 配置交叉编译工具链

交叉编译,说白了就是“在电脑上编译,在板子上运行”。你的电脑是x86架构,而MTK板子通常是ARM架构,所以需要一个交叉编译器。

工具链位置

MTK SDK里通常已经自带了预编译好的工具链,就在 prebuilts/gcc/linux-x86/arm/ 目录下。你不需要自己下载,直接用SDK里的就行。

配置环境变量

为了让系统能找到这个编译器,你需要把它的路径加到 PATH 里。我个人习惯在 ~/.bashrc 文件末尾加上:

export PATH=$PATH:/home/你的用户名/mtk_sdk/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin
export CROSS_COMPILE=arm-eabi-
export ARCH=arm

然后执行 source ~/.bashrc 让它生效。

验证工具链

配置完后,运行以下命令检查是否成功:

arm-eabi-gcc --version

如果能看到版本信息,说明工具链配置好了。如果提示“command not found”,别慌,检查一下路径写对了没。我刚开始学的时候,就经常把路径里的斜杠写反,折腾半天。

小技巧: 你可以用 which arm-eabi-gcc 来查看编译器实际路径,确认环境变量是否生效。

3.3 使用ADB与板子通信

ADB(Android Debug Bridge)是咱们和板子沟通的桥梁。你写好的驱动,怎么知道它跑没跑对?全靠ADB。

连接板子

用USB线把开发板和电脑连起来。然后在终端输入:

adb devices

如果看到类似 0123456789ABCDEF device 的输出,说明连接成功。如果显示 unauthorized,看看板子屏幕,确认一下USB调试授权。

常用ADB命令

这里我列几个你一定会用到的:

命令 作用
adb shell 进入板子的Linux终端
adb push 本地文件 板子路径 把文件从电脑传到板子
adb pull 板子路径 本地文件 把文件从板子拉到电脑
adb logcat 查看板子的实时日志
adb reboot 重启板子

你想想看,调试传感器驱动时,最常用的就是 adb shell 进去,然后 cat /sys/class/sensor/xxx/value 看看数据对不对。或者用 adb logcat -s SensorService 过滤出传感器相关的日志。

注意: 如果 adb devices 找不到设备,先检查USB驱动有没有装好。Windows下尤其容易出这个问题。我曾经在Windows上折腾了一下午,最后发现是驱动没签名。

3.4 搭建调试日志系统

调试驱动,说白了就是“看日志”。没有日志,你就像瞎子摸象。MTK平台下,日志系统主要靠 printk(内核态)和 logcat(用户态)。

内核日志:printk

在驱动代码里,你经常要加一些打印信息。比如:

printk(KERN_INFO "sensor: accel value = %d\n", value);

然后通过 adb shell 进入板子,用 dmesg 命令查看内核日志:

dmesg | grep "sensor"

这样就能看到你打印的信息了。注意,printk 的级别很重要。调试时用 KERN_INFOKERN_DEBUG,正式发布前记得去掉或者改成 KERN_ERR,否则日志太多会影响性能。

用户态日志:logcat

如果你的传感器驱动涉及HAL层(硬件抽象层),那就要用 logcat 了。在代码里加上:

#include <log/log.h>
ALOGD("sensor: accel value = %d", value);

然后在电脑上运行:

adb logcat -s SensorService

这样就能过滤出传感器服务的日志,不会看到其他乱七八糟的信息。

我的经验: 调试传感器驱动时,我习惯同时开两个终端。一个跑 dmesg -w 看内核日志,一个跑 adb logcat -s SensorService 看用户态日志。两边对照着看,问题定位快得多。

日志级别控制

有时候日志太多,刷屏刷得你眼花。你可以通过 /proc/sys/kernel/printk 文件来控制内核日志的输出级别。比如:

echo "4 4 1 7" > /proc/sys/kernel/printk

这样只有级别高于4的日志才会打印出来。嗯,这个技巧在调试后期特别有用,可以帮你过滤掉那些无关紧要的调试信息。

好了,环境搭建这部分就到这里。你把这些步骤走一遍,后面写驱动、编译、调试就会顺畅很多。下一章,咱们开始真正动手写一个传感器驱动。