2. 开发环境搭建:高通LE/LA内核源码下载、交叉编译工具链配置、ADB与fastboot调试环境准备
做Camera驱动开发,环境搭建是第一道坎。很多新手上来就急着看代码,结果编译都过不了,白白浪费时间。我刚开始带项目的时候也犯过这个错——花了两天时间折腾编译环境,最后发现是内核版本和工具链不匹配。
说白了,开发环境就是你的武器库。武器不趁手,上了战场也是白搭。这一章咱们就把高通平台的开发环境彻底捋一遍。
2.1 高通LE/LA内核源码获取
高通的内核分两个分支:LE(Linux Embedded)和LA(Linux Android)。怎么选?看你的产品形态。
| 分支 | 适用场景 | 特点 |
|---|---|---|
| LE | IoT、车载、非Android嵌入式设备 | 轻量、无Android HAL层依赖 |
| LA | 手机、平板等Android设备 | 包含Android驱动框架、Camera HAL |
我个人习惯用LA分支做Camera开发,因为大部分客户项目都是Android平台。源码获取通常有两种方式:
- 高通Codeaurora仓库(公开):
https://source.codeaurora.org - 高通芯片厂商提供的BSP包(签NDA后获取)
举个例子,拉取SM8450(骁龙8 Gen1)的LA内核:
git clone https://source.codeaurora.org/quic/la/kernel/msm-5.10 -b LA.UM.9.14.r1-08000-KAMORTA.QSSI12.0
LA.UM.9.14代表Android版本和芯片平台代号。选错分支会导致编译失败。我曾经因为看错一个数字,折腾了整整一个下午。
2.2 交叉编译工具链配置
高通平台用aarch64-linux-android-或aarch64-linux-gnu-工具链。别搞混了——Android和纯Linux的工具链不通用。
我推荐两种配置方式:
方式一:使用高通预编译工具链(推荐)
高通在Codeaurora上提供了预编译的gcc工具链:
git clone https://source.codeaurora.org/quic/la/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
配置环境变量:
export CROSS_COMPILE=$(pwd)/aarch64-linux-android-4.9/bin/aarch64-linux-android-
export ARCH=arm64
方式二:使用Linaro工具链
如果你做的是LE分支(非Android),用Linaro的更合适:
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xf gcc-linaro-*.tar.xz
export CROSS_COMPILE=$(pwd)/gcc-linaro-*/bin/aarch64-linux-gnu-
~/.bashrc里,每次开终端就不用重新export了。我习惯在.bashrc里加一行别名:alias setarm='export CROSS_COMPILE=...'。
2.3 编译内核与Camera驱动模块
环境配好了,咱们编译一下试试。以LA分支为例:
cd msm-5.10
make defconfig vendor/xxxx_defconfig # 加载厂商默认配置
make menuconfig # 可选:手动配置Camera驱动
make -j$(nproc) # 编译内核
make modules # 编译模块
编译完成后,内核镜像在arch/arm64/boot/Image,驱动模块在drivers/media/platform/msm/camera/下。
嗯,这里要注意:Camera驱动通常编译为模块(.ko),方便调试时单独加载卸载。我一般会在menuconfig里把CONFIG_MSM_CAMERA设为m。
2.4 ADB与fastboot调试环境准备
驱动写好了,怎么跑起来?靠ADB和fastboot。这两个工具是Android调试的左右手。
ADB(Android Debug Bridge)
ADB用于设备运行时调试。常用场景:
- push/pull驱动模块到设备
- 查看dmesg日志
- 执行shell命令
安装ADB:
sudo apt install adb
adb devices # 检查设备是否连接
加载Camera驱动模块的典型流程:
adb root
adb remount
adb push camera_sensor.ko /vendor/lib/modules/
adb shell insmod /vendor/lib/modules/camera_sensor.ko
adb shell dmesg | grep "camera" # 查看驱动加载日志
fastboot(刷机模式)
fastboot用于烧写内核、bootloader等底层镜像。当你把设备搞死机了(相信我,这很常见),fastboot是你的救命稻草。
安装fastboot:
sudo apt install fastboot
常用命令:
fastboot flash boot boot.img # 烧写boot分区
fastboot flash vendor vendor.img # 烧写vendor分区(含驱动模块)
fastboot reboot # 重启设备
adb root,结果push文件一直报Permission denied。折腾了半小时才发现是权限问题。记住:每次adb连接后,先执行adb root提权。
2.5 环境验证:一个完整的调试闭环
环境搭好了,怎么确认一切正常?我建议走一遍完整的流程:
- 编译内核和Camera驱动模块
- 通过fastboot烧写新内核
- 设备重启后,adb连接
- insmod加载驱动模块
- dmesg查看驱动初始化日志
- 检查
/dev/video*节点是否生成
如果每一步都走通了,恭喜你——开发环境已经就绪。
- LA分支用于Android,LE分支用于非Android
- 工具链必须与内核版本匹配
- Camera驱动建议编译为模块(.ko)
- adb root是调试的第一步
- fastboot是救砖的最后防线
环境搭建这件事,说白了就是一次性的投入。花半天时间把工具链、ADB、fastboot都配好,后面调试的时候就能省下大把时间。我见过太多工程师在环境上反复踩坑,其实只要按这个流程走一遍,后面就顺了。