2. 开发环境搭建:Linux交叉编译环境、SDK获取与配置、ADB调试工具使用
好,咱们正式开始动手了。这一章我带你搭环境。别小看这一步,我见过太多人卡在环境上,一卡就是两三天。说白了,嵌入式开发一半的时间都在跟工具链较劲。咱们把这一步走稳了,后面写代码、调视频输出才能顺风顺水。
2.1 Linux交叉编译环境搭建
MTK8676用的是ARM Cortex-A系列核心,你的PC是x86架构。所以你不能直接在PC上编译,得用交叉编译器。我个人的习惯是,先确认Ubuntu版本。我推荐Ubuntu 18.04或20.04 LTS,太新的版本有时反而会踩坑。
安装依赖库,这是第一步。打开终端,执行:
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分钟。看到Image和dtb文件生成在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— 从板子拉文件到PCadb logcat— 查看内核和应用的日志,调试视频播放时天天用adb reboot— 远程重启板子
实战经验: 我在调试硬解码视频输出时,经常用adb logcat | grep -E "vdec|display|hdmi"来过滤关键日志。这样能快速定位是解码器的问题,还是显示驱动的问题。你想想看,如果日志全量输出,几千行里找一行错误信息,那得多痛苦。
还有一个我常用的技巧:用ADB转发网络端口。比如板子上跑了一个HTTP服务,端口是8080,你可以这样:
adb forward tcp:8080 tcp:8080
然后在PC浏览器里打开http://localhost:8080,就能访问板子上的服务了。调试视频流的时候,这个功能特别方便。
adb kill-server,再adb start-server,重新连接就好。
好,环境搭完了。你现在应该有了一个能编译内核、能通过ADB跟板子对话的开发环境。下一章,咱们开始真正接触MTK8676的显示子系统,看看视频数据是怎么从解码器一路跑到屏幕上的。