mt6897 scp a+g sh5201 porting记录
1.修改代码位置
vendor/mediatek/proprietary/tinysys/scp
vendor/mediatek/proprietary/hardware/sensor/2.0/hal/SensorListV2.cpp
device/mediateksample/aiot8883p2_64_bsp/ProjectConfig.mk
2.确认sensor和AP间的硬件连接
供电
通常供电是由系统来控制,软件不需要做处理
通信方式
通信方式基本是I2C或SPI,确认I2C或SPI是使用的第几组SCP的I2C或SPI。
从原理图中找到I2C或SPI的pin号,在文件MT6789_GPIO_Application_Spec_V0.5(CONFIDENTIAL B).xlsx中查找,
例如下图:
使用的SCP_SPI0。
注:只有带SCP前缀的I2C或SPI才可以给挂载在SCP侧的sensor使用。
中断
从原理图中找到中断的pin号,在文件MT6789_GPIO_Application_Spec_V0.5(CONFIDENTIAL B).xlsx中查找,
如下是SCP侧sensor可用的中断GPIO范围。
红色框对应的就是中断号,比如加速度的中断连接的是GPIO2 (B12),则中断号为EINT29。
3.代码改动
驱动
驱动添加到vendor/mediatek/proprietary/tinysys/scp/middleware/sensorhub/drivers/physical/对应的目录下
accgyro ---------------- 加速度陀螺仪
alsps ---------------- 光距感
magnetometer --------- 地磁
barometer --------- 气压计
DTS配置
vendor/mediatek/proprietary/tinysys/scp/project/RV55_A/mt6897/aiot8883p2_64_bsp/sensor
diff --git a/project/RV55_A/mt6897/aiot8883p2_64_bsp/sensor/dts.c b/project/RV55_A/mt6897/aiot8883p2_64_bsp/sensor/dts.c
index 9df6ffe4..5592eea9 100644
--- a/project/RV55_A/mt6897/aiot8883p2_64_bsp/sensor/dts.c
+++ b/project/RV55_A/mt6897/aiot8883p2_64_bsp/sensor/dts.c
@@ -40,6 +40,13 @@#include <sensorhub/util.h>const struct key_pair dts[] = {
+#ifdef CFG_SH5201_SUPPORT
+ { .key = "name", .string = "sh5201"},
+ { .key = "bus_id", .u8 = 1},
+ { .key = "direction", .u8 = 0},
+ { .key = "eint_num", .u8 = 29},
+#endif
+#ifdef CFG_LSM6DSO_SUPPORT{ .key = "name", .string = "lsm6dso"},{ .key = "bus_id", .u8 = 1},
字段说明
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文件中,复制一份修改即可。
编译配置
vendor/mediatek/proprietary/tinysys/scp/project/RV55_A/mt6897/aiot8883p2_64_bsp\project.mk
在mk文件中添加对应sensor的宏定义(这个宏是自己定义),在sensor类型宏的后面要在,没用到的sensor也可去掉
diff --git a/project/RV55_A/mt6897/aiot8883p2_64_bsp/project.mk b/project/RV55_A/mt6897/aiot8883p2_64_bsp/project.mk
index 49332787..2942e721 100644
--- a/project/RV55_A/mt6897/aiot8883p2_64_bsp/project.mk
+++ b/project/RV55_A/mt6897/aiot8883p2_64_bsp/project.mk
@@ -32,9 +32,10 @@ CFG_SENSORS_INDRAM = yesCFG_SENSORHUB_SUPPORT = yesCFG_ACCGYRO_SUPPORT = yes
-CFG_LSM6DSO_SUPPORT = yes
-CFG_LSM6DSO_I3C_SUPPORT = yes
-CFG_LSM6DSOQ_I3C_SUPPORT = yes
+CFG_LSM6DSO_SUPPORT = no
+CFG_LSM6DSO_I3C_SUPPORT = no
+CFG_LSM6DSOQ_I3C_SUPPORT = no
+CFG_SH5201_SUPPORT = yesCFG_ALSPS_SUPPORT = yesCFG_VC36658_SUPPORT = yesCFG_STK37A60_SUPPORT = no
vendor/mediatek/proprietary/tinysys/scp/project/RV55_A/mt6897/platform/features\sensorhub.mk
在mk文件中添加驱动编译的路径,要在sensor类型宏的包括范围内添加,如
diff --git a/project/RV55_A/mt6897/platform/features/sensorhub.mk b/project/RV55_A/mt6897/platform/features/sensorhub.mk
index 32979dee..17e726be 100644
--- a/project/RV55_A/mt6897/platform/features/sensorhub.mk
+++ b/project/RV55_A/mt6897/platform/features/sensorhub.mk
@@ -85,6 +85,10 @@ ifeq ($(CFG_LSM6DSM_SUPPORT),yes)C_FILES += $(PHYSICAL_DRV_DIR)/accgyro/lsm6dsm.cendif+ifeq ($(CFG_SH5201_SUPPORT),yes)
+C_FILES += $(PHYSICAL_DRV_DIR)/accgyro/sh5201.c
+endif
+ifeq ($(CFG_LSM6DSO_SUPPORT),yes)ifneq ($(wildcard $(PRIVATE_DRV_DIR)),)C_FILES += $(PRIVATE_DRV_DIR)/accgyro/lsm6dsoxx.c
位置:vendor/mediatek/proprietary/tinysys/scp/project/RV55_A/mt6897/aiot8883p2_64_bsp/inc\overlay_sensor.h
在文件中对应sensor类型下添加要编译的sensor名称,如
diff --git a/project/RV55_A/mt6897/aiot8883p2_64_bsp/inc/overlay_sensor.h b/project/RV55_A/mt6897/aiot8883p2_64_bsp/inc/overlay_sensor.h
index 0ef714e4..7108108f 100644
--- a/project/RV55_A/mt6897/aiot8883p2_64_bsp/inc/overlay_sensor.h
+++ b/project/RV55_A/mt6897/aiot8883p2_64_bsp/inc/overlay_sensor.h
@@ -78,8 +78,7 @@* Overlay0: ACCGYRO*****************************************************************************/#define OVERLAY_SECTION_ACCGYRO \
- OVERLAY_ONE_OBJECT(lsm6dsoxx, lsm6dsoxx) \
- OVERLAY_ONE_OBJECT(lsm6dsoxx_i3c, lsm6dsoxx_i3c)
+ OVERLAY_ONE_OBJECT(sh5201, sh5201)#ifdef OVERLAY_SECTION_ACCGYRO#define OVERLAY0 OVERLAY_SECTION_ACCGYRO
HAl层声明添加
一定要在vendor/mediatek/proprietary/hardware/sensor/2.0/hal/SensorListV2.cpp文件中添加sensor声明,不然应用会找不到传感器。
diff --git a/2.0/hal/SensorListV2.cpp b/2.0/hal/SensorListV2.cpp
index 497e351..88f3aa2 100644
--- a/2.0/hal/SensorListV2.cpp
+++ b/2.0/hal/SensorListV2.cpp
@@ -60,6 +60,40 @@ SensorListV2 *SensorListV2::getInstance() {void SensorListV2::initSensorList(void) {struct sensor_t sensor;+ memset(&sensor, 0, sizeof(struct sensor_t));
+ sensor.name = "sh5201_acc";
+ sensor.vendor = "senodia";
+ sensor.version = 1;
+ sensor.handle = SENSOR_TYPE_ACCELEROMETER;
+ sensor.type = SENSOR_TYPE_ACCELEROMETER;
+ sensor.maxRange = 78.4532f;
+ sensor.resolution = 0.0012;
+ sensor.power = 0;
+ sensor.minDelay = 2500;
+ sensor.fifoReservedEventCount = 3000;
+ sensor.fifoMaxEventCount = 4500;
+ sensor.stringType = SENSOR_STRING_TYPE_ACCELEROMETER;
+ sensor.maxDelay = 200000;
+ sensor.flags = SENSOR_FLAG_CONTINUOUS_MODE;
+ mSensorList.push_back(sensor);
+
+ memset(&sensor, 0, sizeof(struct sensor_t));
+ sensor.name = "sh5201_gyro";
+ sensor.vendor = "senodia";
+ sensor.version = 1;
+ sensor.handle = SENSOR_TYPE_GYROSCOPE;
+ sensor.type = SENSOR_TYPE_GYROSCOPE;
+ sensor.maxRange = 34.9066f;
+ sensor.resolution = 0.0011f;
+ sensor.power = 0;
+ sensor.minDelay = 2500;
+ sensor.fifoReservedEventCount = 3000;
+ sensor.fifoMaxEventCount = 4500;
+ sensor.stringType = SENSOR_STRING_TYPE_GYROSCOPE;
+ sensor.maxDelay = 200000;
+ sensor.flags = SENSOR_FLAG_CONTINUOUS_MODE;
+ mSensorList.push_back(sensor);
+memset(&sensor, 0, sizeof(struct sensor_t));sensor.name = "lsm6dsm_acc";sensor.vendor = "st";
如上是距感的声明,复制一份相同类型sensor的代码修改sensor.name和sensor.vendor字段即可,需要注意的是:sensor.name和sensor.vendor字段要和驱动中定义的dev->device.support_list结构体的成员name和vendor对应。
sensor宏开关
位置:device/mediateksample/aiot8883p2_64_bsp/ProjectConfig.mk
系统要使用哪一类sensor就设置对应的宏为yes
diff --git a/ProjectConfig.mk b/ProjectConfig.mk
index 29e40bd..cf0831c 100644
--- a/ProjectConfig.mk
+++ b/ProjectConfig.mk
@@ -4,16 +4,16 @@ BUILD_LK = yesBUILD_PRELOADER = yesCUSTOM_CONFIG_MAX_DRAM_SIZE = 0x800000000
-CUSTOM_HIFI_SENSORS = yes
+CUSTOM_HIFI_SENSORS = noCUSTOM_KERNEL_ACCELEROMETER = yesCUSTOM_KERNEL_ALSPS = yes
-CUSTOM_KERNEL_BAROMETER = yes
+CUSTOM_KERNEL_BAROMETER = noCUSTOM_KERNEL_GYROSCOPE = yesCUSTOM_KERNEL_HEAD_TRACKER = yes
-CUSTOM_KERNEL_STEP_COUNTER = yes
-CUSTOM_KERNEL_STEP_DETECTOR = yes
+CUSTOM_KERNEL_STEP_COUNTER = no
+CUSTOM_KERNEL_STEP_DETECTOR = noCUSTOM_MODEM = mt6897_sp_nlwcg_mt6197_vmoly0472_prodCUSTOM_SUPPORT_DYNAMIC_SENSOR = yesKEYMASTER_VERSION = 7.0
4.确认修改是否生效
adb shell dumpsys sensorservice