MTK sensorhub3.0 sensor bringup

本文介绍的是以mt6789平台sensorhub3.0为例的Sensor bringup,让sensor正常工作起来。

1.代码位置

需要做修改的代码位置:

vendor/mediatek/proprietary/tinysys/scp
vendor/mediatek/proprietary/hardware/sensor/2.0/hal/SensorListV2.cpp
device/mediateksample/k6789v1_64/ProjectConfig.mk(k6789v1_64对应的项目文件)

2.确认传感器和主控的连接关系

供电

通常供电是由系统来控制,软件不需要做处理

通信方式

通信方式基本是I2C或SPI,确认I2C或SPI是使用的第几组SCP的I2C或SPI。

从原理图中找到I2C或SPI的pin号,在文件MT6789_GPIO_Application_Spec_V0.5(CONFIDENTIAL B).xlsx中查找,

例如下图:
在这里插入图片描述

AK32和AJ30就是使用的第1组SCP的I2C。

注:只有带SCP前缀的I2C或SPI才可以给挂载在SCP侧的sensor使用。

中断

从原理图中找到中断的pin号,在文件MT6789_GPIO_Application_Spec_V0.5(CONFIDENTIAL B).xlsx中查找,

如下是SCP侧sensor可用的中断GPIO范围。
在这里插入图片描述

红色框对应的就是中断号,比如加速度的中断连接的是R2 pin,则中断号为5。

3.代码改动

驱动

驱动添加到scp\middleware\sensorhub\drivers\physical\对应的目录下

目录传感器类型
accgyro加速度陀螺仪
alsps光距感
magnetometer地磁
barometer气压计
DTS配置

位置:scp\project\RV55_A\mt6789\k6789v1_64\sensor\dts.c

如下是一段示例代码:

#ifdef CFG_SH3001_SUPPORT
    {    .key = "name",                 .string = "sh3001"},
    {    .key = "bus_id",               .u8 = 1},
    {    .key = "direction",            .u8 = 3},
    {    .key = "eint_num",             .u8 = 12},
#endif
#ifdef CFG_VC36658_SUPPORT
    {    .key = "name",                 .string = "vc36658"},
    {    .key = "bus_id",               .u8 = 2},
    {    .key = "slave_addr",           .u8 = 0x60},
    {    .key = "debounce_time",        .u8 = 200},
    {    .key = "polling_mode_als",     .u8 = 1},
    {    .key = "polling_mode_ps",      .u8 = 1},
    {    .key = "ps_threshold_high",    .u32 = 26},
    {    .key = "ps_threshold_low",     .u32 = 21},
    {    .key = "eint_num",             .u8 = 11},
#endif
字段说明

name:最好和驱动文件名相同,和驱动内部dev->device.name变量相同,实际可能没有去解析改字段

bus_id:通信方式的组号,比如是i2c0(SCP_SCL0,SCP_SDA0)或者

spi0(SCP_SPI0_CK,SCP_SPI0_CS,SCP_SPI0_MO,SCP_SPI0_MI),bus_id都填0,和i2c还是spi无关,只和组号有关

slave_addr:i2c的7位地址,spi不需要此项

eint_num:中断号

direction:传感器方向,当加速度方向不对时,在这里调整

polling_mode_als/polling_mode_ps:是否开启轮询模式,开启后不使用中断,使用定时器上报数据。

每个类型的sensor都有在dts文件中,复制一份修改即可。

编译配置

位置:project\RV55_A\mt6789\k6789v1_64\project.mk

在mk文件中添加对应sensor的宏定义(这个宏是自己定义),在sensor类型宏的后面要在,如

CFG_ACCGYRO_SUPPORT = yes
CFG_SH3001_SUPPORT = yes

位置:project\RV55_A\mt6789\platform\features\sensorhub.mk

在mk文件中添加驱动编译的路径,要在sensor类型宏的包括范围内添加,如

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
...
endif

位置:project\RV55_A\mt6789\k6789v1_64\inc\overlay_sensor.h

在文件中对应sensor类型下添加要编译的sensor名称,如

//以sh3001为例
#define OVERLAY_SECTION_ACCGYRO                     \
    OVERLAY_ONE_OBJECT(kxtj3, kxtj3)    \
    OVERLAY_ONE_OBJECT(sh3001, sh3001)
HAl层声明添加

一定要在vendor/mediatek/proprietary/hardware/sensor/2.0/hal/SensorListV2.cpp文件中添加sensor声明,不然应用会找不到传感器。

void SensorListV2::initSensorList(void) {
    struct sensor_t sensor;
    ...
        memset(&sensor, 0, sizeof(struct sensor_t));
        sensor.name = "stk3x1x_ps";
        sensor.vendor = "sensortek";
        sensor.version = 1;
        sensor.handle = SENSOR_TYPE_PROXIMITY;
        sensor.type = SENSOR_TYPE_PROXIMITY;
        sensor.maxRange = 1.0f;
        sensor.resolution = 1.0f;
        sensor.power = 0;
        sensor.minDelay = 0;
        sensor.fifoReservedEventCount = 100;
        sensor.fifoMaxEventCount = 4500;
        sensor.stringType = SENSOR_STRING_TYPE_PROXIMITY;
        sensor.maxDelay = 1000000;
        sensor.flags = SENSOR_FLAG_ON_CHANGE_MODE | SENSOR_FLAG_WAKE_UP;
        mSensorList.push_back(sensor);
    ...
    }

如上是距感的声明,复制一份相同类型sensor的代码修改sensor.name和sensor.vendor字段即可,需要注意的是:sensor.name和sensor.vendor字段要和驱动中定义的dev->device.support_list结构体的成员name和vendor对应。

sensor宏开关

位置:device/mediateksample/k6789v1_64/ProjectConfig.mk

系统要使用哪一类sensor就设置对应的宏为yes

....
CUSTOM_HIFI_SENSORS = no
CUSTOM_KERNEL_ACCELEROMETER = yes
CUSTOM_KERNEL_ALSPS = yes
CUSTOM_KERNEL_BAROMETER = no           
CUSTOM_KERNEL_GYROSCOPE = yes
CUSTOM_KERNEL_MAGNETOMETER = yes
CUSTOM_KERNEL_STEP_COUNTER = yes
CUSTOM_KERNEL_STEP_DETECTOR = yes
...
算法库添加

通常是地磁要加算法库及文件

算法库及文件放在middleware\sensorhub\algos\RV55_A\calibration\magnetometer\目录下,如
在这里插入图片描述

同时要把库的路径添加到project\RV55_A\mt6789\platform\features\sensorhub.mk文件中,如

ifeq ($(CFG_MAGNETOMETER_SUPPORT),yes)
...
ifeq ($(CFG_ST480MS_SUPPORT),yes)
CFG_ST480_VENDOR_SUPPORT=yes
C_FILES  += $(PHYSICAL_DRV_DIR)/magnetometer/st480ms.c
endif
ifeq ($(CFG_ST480_VENDOR_SUPPORT),yes)
LIBFLAGS += -L$(ALGO_DIR)/calibration/magnetometer/senodia -lst480    //库路径
INCLUDES += $(ALGO_DIR)/calibration/magnetometer
endif
...
endif

且在文件project\RV55_A\mt6789\k6789v1_64\inc\overlay_sensor.h中的示例如下

//libst480为库的名字
#define OVERLAY_SECTION_MAG                         \
    OVERLAY_ONE_LIB_ONE_OBJECT(st480ms, libst480, st480ms)

到此bringup完成!!!

4.调试方法

mtklog

打开mtklog后重启机器,查看scp_log开头的文件

adb shell

获取root权限后,输入如下命令,便可看到scp log

echo 1 > sys/class/misc/scp/scp_mobile_log
while true;do cat /dev/scp;done
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值