本文介绍的是以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