2. 开发环境搭建:Linux交叉编译环境、SDK获取与配置、ADB调试工具使用

好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在环境上,一卡就是两三天。说白了,嵌入式开发一半的时间都在跟工具链较劲。咱们把这一步走稳了,后面写代码、调视频输出才能顺风顺水。

2.1 Linux交叉编译环境搭建

MTK8676用的是ARM Cortex-A系列核心,你的PC是x86架构。所以你不能直接在PC上编译,得用交叉编译器。我个人的习惯是,先确认Ubuntu版本。我推荐Ubuntu 18.04或20.04 LTS,太新的版本有时反而会踩坑。

注意: 我曾经在Ubuntu 22.04上遇到过glibc版本冲突,折腾了一整天才发现是系统库太新,跟MTK的旧版工具链不兼容。所以,老老实实用20.04吧。

安装依赖库,这是第一步。打开终端,执行:

sudo apt-get update
sudo apt-get install -y build-essential git vim curl wget
sudo apt-get install -y libncurses5-dev libssl-dev
sudo apt-get install -y bison flex libelf-dev

然后获取交叉编译工具链。MTK官方一般提供的是基于gcc的arm-linux-gnueabihf系列。你拿到SDK后,里面通常有一个toolchain目录。解压后设置环境变量:

export PATH=$PATH:/your/path/to/toolchain/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

验证一下是否生效:

arm-linux-gnueabihf-gcc --version

看到版本号输出,就说明工具链活了。嗯,这里要注意,每次打开新终端都要重新export。我建议你直接写到~/.bashrc里,省得每次手敲。

2.2 SDK获取与配置

SDK是MTK提供的整套开发包。里面包含了内核源码、驱动框架、硬件抽象层、以及多媒体相关的库。你从MTK官方或者合作渠道拿到的是一个压缩包,通常是.tar.gz格式。

解压命令很简单:

tar -xzf MTK8676_SDK_V1.0.tar.gz -C ~/workspace/
cd ~/workspace/MTK8676_SDK

解压后,目录结构大概长这样:

目录/文件 说明
kernel/ Linux内核源码,包含MTK平台补丁
hardware/ 硬件抽象层,显示、音频、视频编解码相关
vendor/mediatek/ MTK私有库和中间件
out/ 编译输出目录
build/ 编译脚本和配置文件

配置SDK的第一步是选择目标板。MTK8676可能有多个参考设计,比如开发板、量产板。执行:

source build/envsetup.sh
lunch

你会看到一个菜单,选择对应的板子型号。我一般选mt8676_evk-userdebug,因为userdebug模式既保留了调试功能,又接近最终产品。

小技巧: 如果你不确定选哪个,可以查看device/mediatek/目录下的vendorsetup.sh文件,里面列出了所有支持的板型。

配置完成后,试着编译一下内核,验证环境是否通:

make kernel -j4

第一次编译会比较慢,大概10到20分钟。看到Imagedtb文件生成在out/目录下,就说明SDK配置成功了。

2.3 ADB调试工具使用

ADB,全称Android Debug Bridge。虽然MTK8676跑的是Linux,但MTK的调试体系沿用了Android的ADB框架。说白了,ADB就是你的「远程遥控器」。

安装ADB:

sudo apt-get install -y adb

连接开发板。用USB线把PC和板子连起来。板子上电后,执行:

adb devices

如果看到类似0123456789ABCDEF device的输出,说明连接成功。如果显示unauthorized,别慌,看看板子的屏幕上有没有弹出授权提示,点一下「允许」就行。

常用的ADB命令,我列几个你一定会用到的:

  • adb shell — 进入板子的终端,就像SSH一样
  • adb push local_file /remote_path — 把文件从PC传到板子
  • adb pull /remote_path local_file — 从板子拉文件到PC
  • adb logcat — 查看内核和应用的日志,调试视频播放时天天用
  • adb reboot — 远程重启板子

实战经验: 我在调试硬解码视频输出时,经常用adb logcat | grep -E "vdec|display|hdmi"来过滤关键日志。这样能快速定位是解码器的问题,还是显示驱动的问题。你想想看,如果日志全量输出,几千行里找一行错误信息,那得多痛苦。

还有一个我常用的技巧:用ADB转发网络端口。比如板子上跑了一个HTTP服务,端口是8080,你可以这样:

adb forward tcp:8080 tcp:8080

然后在PC浏览器里打开http://localhost:8080,就能访问板子上的服务了。调试视频流的时候,这个功能特别方便。

避坑指南: 我曾经遇到过ADB断连的问题,查了半天发现是USB线质量太差。换了一根带屏蔽的USB 3.0线,问题就解决了。另外,如果板子长时间没有操作,ADB可能会进入休眠状态。这时候先adb kill-server,再adb start-server,重新连接就好。

好,环境搭完了。你现在应该有了一个能编译内核、能通过ADB跟板子对话的开发环境。下一章,咱们开始真正接触MTK8676的显示子系统,看看视频数据是怎么从解码器一路跑到屏幕上的。