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-dev、flex、bison 这些。你可以用以下命令一键安装:
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_INFO 或 KERN_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的日志才会打印出来。嗯,这个技巧在调试后期特别有用,可以帮你过滤掉那些无关紧要的调试信息。
好了,环境搭建这部分就到这里。你把这些步骤走一遍,后面写驱动、编译、调试就会顺畅很多。下一章,咱们开始真正动手写一个传感器驱动。