MTK SensorHub 3.0 传感器驱动移植保姆级教程:以MT6789平台为例,从原理图到log调试
MTK SensorHub 3.0传感器驱动移植实战指南:从硬件原理到调试技巧
当拿到一块搭载MT6789平台的新开发板时,传感器驱动的移植往往是嵌入式工程师面临的第一个挑战。SensorHub 3.0作为MTK新一代传感器中枢架构,其驱动开发流程与传统Linux驱动有着显著差异。本文将手把手带你完成加速度计驱动的完整移植过程,涵盖从原理图分析到log调试的全链路实践。
1. 硬件接口确认与原理图解析
在开始编码前,必须彻底理解传感器与主控的物理连接方式。打开硬件原理图,我们需要重点关注三个核心要素:
供电电路:现代传感器通常采用PMIC供电,软件层面无需特殊处理。但需确认原理图中是否有上电时序要求或特殊使能信号。
通信接口:MT6789平台支持SCP侧I2C和SPI总线,关键是要确认使用的是哪一组接口。例如:
- I2C组号确认:在原理图中找到SCL/SDA信号线,如标注为SCP_I2C0_SCL/SCP_I2C0_SDA表示使用第0组I2C
- 对应GPIO编号:查阅《MT6789_GPIO_Application_Spec》文档,确认物理引脚号
中断配置:这是最易出错的环节。SCP侧可用中断范围有限,需特别注意:
| 中断号 | GPIO引脚 | 备注 | |--------|---------|--------------------| | 5 | R2 | 加速度计常用中断 | | 11 | T1 | 光感常用中断 | | 12 | P3 | 保留中断 |
注意:只有标有"SCP_"前缀的GPIO才能用于传感器中断,错误配置会导致无法唤醒AP侧。
2. 驱动代码移植与DTS配置
2.1 驱动文件放置
MTK平台采用分层驱动架构,物理传感器驱动需放置在特定目录:
tinysys/scp/middleware/sensorhub/drivers/physical/ └── accgyro/ # 加速度/陀螺仪类驱动 ├── kxtj3.c # 现有驱动示例 └── sh3001.c # 新增驱动文件驱动文件需实现标准的初始化、数据读取接口,特别注意device.support_list结构体:
static struct sensor_info_t g_sh3001_sensor_info = { .name = "sh3001", .vendor = "sensortek", .version = 1, .handle = SENSOR_TYPE_ACCELEROMETER, .type = SENSOR_TYPE_ACCELEROMETER, .maxRange = 16.0f, .resolution = 0.001f, .power = 0.5f };2.2 DTS设备树配置
SensorHub使用独特的dts.c配置方式而非标准设备树。关键配置项如下:
{ .key = "name", .string = "sh3001" // 必须与驱动中name一致 }, { .key = "bus_id", .u8 = 1 // 对应原理图中的I2C组号 }, { .key = "direction", .u8 = 3 // 传感器安装方向补偿 }, { .key = "eint_num", .u8 = 5 // 原理图确认的中断号 }, { .key = "slave_addr", .u8 = 0x4C // I2C七位地址右移一位 }常见问题排查:
- 数据无更新:检查
polling_mode是否误设为1 - 数据方向错误:调整
direction参数(0-7对应不同旋转角度) - I2C通信失败:确认
slave_addr是否包含R/W位
3. 系统级配置与编译
3.1 宏定义配置链
MTK平台采用多级宏控制编译,需要层层递进配置:
项目主配置(ProjectConfig.mk):
CUSTOM_KERNEL_ACCELEROMETER = sh3001 CUSTOM_KERNEL_SENSORHUB = MTK6789SensorHub特性配置(sensorhub.mk):
ifeq ($(CFG_ACCGYRO_SUPPORT),yes) ifeq ($(CFG_SH3001_SUPPORT),yes) INCLUDES += -I$(PHYSICAL_DRV_DIR)/accgyro/ C_FILES += $(PHYSICAL_DRV_DIR)/accgyro/sh3001.c endif endifOverlay配置(overlay_sensor.h):
#define OVERLAY_SECTION_ACCGYRO \ OVERLAY_ONE_OBJECT(kxtj3, kxtj3) \ OVERLAY_ONE_OBJECT(sh3001, sh3001)
3.2 HAL层注册
即使驱动工作正常,若未在HAL层注册,应用层仍无法检测到传感器。关键修改点:
// SensorListV2.cpp sensor.name = "sh3001"; // 必须与驱动完全一致 sensor.vendor = "sensortek"; // 厂商信息匹配 sensor.handle = SENSOR_TYPE_ACCELEROMETER; sensor.type = SENSOR_TYPE_ACCELEROMETER; sensor.maxRange = 16.0f; // 量程需与datasheet一致 sensor.resolution = 0.001f; // 分辨率影响数据精度 sensor.flags = SENSOR_FLAG_CONTINUOUS_MODE;4. 调试技巧与问题定位
4.1 实时Log获取方法
MTK平台提供多种调试手段:
ADB实时监控:
adb root adb shell "echo 1 > /sys/class/misc/scp/scp_mobile_log" adb shell "cat /dev/scp"MTKLog全面抓取:
- 在拨号界面输入
*#*#3646633#*#*进入工程模式 - 开启SensorHub调试日志
- 重启后获取
/sdcard/mtklog/下的scp_log文件
- 在拨号界面输入
4.2 常见问题速查表
| 现象 | 可能原因 | 排查步骤 |
|---|---|---|
| I2C通信失败 | 从地址错误/总线冲突 | 用i2c-tools验证总线通信 |
| 中断无响应 | GPIO配置错误/中断号冲突 | 检查/proc/interrupts状态 |
| 数据更新缓慢 | 轮询模式意外启用 | 确认dts中polling_mode=0 |
| HAL层检测不到传感器 | 未注册或名称不匹配 | 对比驱动与HAL层的name/vendor |
4.3 性能优化技巧
- 中断防抖:在dts中设置
debounce_time(单位ms)避免误触发 - FIFO配置:调整
fifoReservedEventCount平衡性能与功耗 - 采样率优化:通过
minDelay和maxDelay控制数据上报频率
在完成所有配置后,建议使用Sensor Test APP进行全功能验证。记得保存各阶段的修改记录,当遇到内核崩溃时,可通过adb shell dmesg获取最后的状态信息。
