2、开发环境搭建:高通SA8155 SDK获取、交叉编译工具链配置、ADB与fastboot调试

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着琐碎,但真要是哪个环节出了岔子,后面调试能把你折腾到怀疑人生。我自己就吃过这个亏,所以这一章我会把每个步骤掰开揉碎了讲清楚。

2.1 高通SA8155 SDK的获取与目录结构

先说说SDK怎么拿到。高通SA8155的SDK,一般是通过签署NDA后从高通官网的Qualcomm CreatePoint平台下载。如果你在公司做项目,通常由PM或者架构师去申请。我个人习惯是拿到SDK后,先不急着解压,而是核对一下MD5校验值。为什么?因为SDK包动辄几十个GB,网络传输过程中万一丢包,后面编译报错你根本不知道是代码问题还是包坏了。我曾经有一次就是没校验,结果编译到一半报了个莫名其妙的链接错误,查了两天才发现是SDK包损坏。

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

SA8155_LA.1.0/
├── android/          # Android系统源码
├── vendor/qcom/      # 高通私有库和驱动
├── kernel/           # Linux内核源码
├── bootloader/       # 启动引导代码
├── docs/             # 技术文档
├── tools/            # 编译和调试工具
└── Makefile          # 顶层编译入口

嗯,这里要注意,vendor/qcom 目录下藏着摄像头驱动的核心代码,包括 camxchioverride 这些关键模块。后面我们做摄像头调试,大部分时间都会跟这个目录打交道。

2.2 交叉编译工具链配置

交叉编译,说白了就是在你的x86电脑上编译出能在ARM架构的8155上跑的程序。这个环节最容易出问题的是工具链版本不匹配。

高通官方推荐使用 aarch64-linux-android- 开头的GCC工具链,通常放在SDK的 prebuilts/gcc/linux-x86/aarch64/ 目录下。但我个人更推荐用Clang,因为从Android 10开始,Google已经强制要求使用Clang编译内核和驱动模块。

配置环境变量的步骤,我建议你这样写:

# 设置工具链路径
export PATH=$PATH:~/SA8155_LA.1.0/prebuilts/clang/host/linux-x86/clang-r383902/bin
export PATH=$PATH:~/SA8155_LA.1.0/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin

# 设置交叉编译参数
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export CC=clang
export CLANG_TRIPLE=aarch64-linux-gnu-

这里有个坑,我提醒你一下。CROSS_COMPILECC 这两个变量必须同时设置,而且顺序不能乱。如果你只设了 CROSS_COMPILE 没设 CC,系统会默认用GCC编译。但高通8155的某些驱动模块(比如摄像头ISP驱动)对Clang有特殊优化,用GCC编译出来的驱动可能会在特定场景下触发bug。我去年在调试一个OV64B sensor时,就因为这个原因导致预览画面偶尔出现条纹,折腾了三天才发现是编译器的问题。

⚠️ 重要提醒: 每次打开新终端窗口,记得重新source环境变量。我建议你把这些配置写成一个 setup_env.sh 脚本,每次编译前 source setup_env.sh 即可。

2.3 ADB调试环境搭建

ADB,全称Android Debug Bridge,是我们和8155开发板沟通的桥梁。你想想看,没有ADB,你怎么往板子上push驱动?怎么看log?怎么抓取摄像头数据流?

安装ADB其实很简单,但版本有讲究。高通8155的Android系统版本通常是Android 10或11,对应的ADB版本建议用1.0.41以上。你可以用 adb version 检查当前版本:

$ adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133

如果版本太低,有些新特性不支持。比如高通的 camx 调试工具需要ADB支持 adb rootadb remount 命令,低版本ADB执行这些命令可能会失败。

连接开发板后,我习惯先执行这几步:

# 检查设备是否识别
adb devices

# 获取root权限(必须)
adb root

# 重新挂载系统分区为可读写
adb remount

# 查看摄像头设备节点
adb shell ls -l /dev/video*

如果 adb devices 显示设备状态是 unauthorized,别慌。这是因为开发板上的ADB认证没通过。你需要在开发板的屏幕上确认RSA指纹,或者直接关闭ADB认证(调试板子一般无所谓)。

💡 个人技巧: 我习惯在 ~/.bashrc 里加一个别名:alias adb8155='adb -s 192.168.1.100:5555'。这样如果板子通过网络连接,就不用每次都敲IP地址了。

2.4 fastboot模式与刷机

fastboot是比ADB更底层的调试模式。当你的板子系统崩溃、无法进入Android时,fastboot就是你最后的救命稻草。

进入fastboot模式的方法:按住开发板上的 VOL- 键,然后按 POWER 键开机。或者用ADB命令:

adb reboot bootloader

进入fastboot后,你可以执行以下常用操作:

命令 说明 我的经验
fastboot devices 查看是否识别到设备 如果没识别,检查USB线或驱动
fastboot flash boot boot.img 刷写内核镜像 摄像头驱动修改后,只刷boot即可
fastboot flash system system.img 刷写系统镜像 修改了camx HAL层代码时需要刷
fastboot erase userdata 清除用户数据 慎用!会清空所有数据
fastboot reboot 重启设备 刷完后记得重启

这里我要特别强调一点:千万不要在刷写过程中拔掉USB线。我曾经有一次刷boot镜像时手贱碰掉了线,结果板子变砖,最后只能拆机用EDL模式救砖。那叫一个折腾。

2.5 验证环境是否搭建成功

环境搭没搭好,跑一个简单的摄像头测试就知道了。我一般会写一个最小的驱动模块来验证:

// test_cam.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <media/v4l2-device.h>

static int __init test_init(void)
{
    printk(KERN_INFO "8155 Camera test module loaded\n");
    return 0;
}

static void __exit test_exit(void)
{
    printk(KERN_INFO "8155 Camera test module unloaded\n");
}

module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

编译命令:

make -C ~/SA8155_LA.1.0/kernel/ M=$(pwd) modules

如果编译通过,生成 test_cam.ko 文件,说明交叉编译工具链配置正确。然后通过ADB push到板子上:

adb push test_cam.ko /data/
adb shell insmod /data/test_cam.ko
adb shell dmesg | tail

看到 "8155 Camera test module loaded" 这条log,恭喜你,环境搭建成功了!

✅ 环境搭建检查清单:

  • SDK解压完整,MD5校验通过
  • 交叉编译工具链版本匹配(推荐Clang)
  • ADB版本 ≥ 1.0.41,能正常连接设备
  • fastboot模式可进入,能识别设备
  • 能编译并加载一个简单的内核模块

好了,环境搭建就到这里。下一章我们开始真正接触摄像头驱动框架,我会带你分析8155的Camera Subsystem架构。到时候你会发现,今天搭的环境,就是后面所有实战的基础。嗯,先把基础打牢,后面才能飞得起来。