MTK平台添加虚拟sensor

一、添加一个新的sensor类型


HUB部分

1、/vendor/mediatek/proprietary/tinysys/freertos/source/middleware/contexthub/contexthub_fw.c

在uint8_t chreTypeToMtkType(uint8_t sensortype)中添加:
        case SENS_TYPE_PICKUP_TEST:
            return SENSOR_TYPE_PICKUP_TEST;

在uint8_t mtkTypeToChreType(uint8_t sensortype)中添加:
        case SENSOR_TYPE_PICKUP_TEST:
            return SENS_TYPE_PICKUP_TEST;

2、contexthub_fw.h

在SAR类型后面添加:
#define SENSOR_TYPE_PICKUP_TEST                 73
并将SENSOR_TYPE_MAX的值加 1

3、/vendor/mediatek/proprietary/hardware/contexthub/firmware/inc/sensType.h

在OIS后添加:
#define SENS_TYPE_PICKUP_TEST     56
并将SENS_TYPE_END定义为 SENS_TYPE_PICKUP_TEST

 4、contexthub_fw.c

在static void initSensorReportingInfo(void)中添加:
    sensorReportingMode[SENSOR_TYPE_PICKUP_TEST] = onChange;
    sensorAccurancyMode[SENSOR_TYPE_PICKUP_TEST] = SENSOR_STATUS_ACCURACY_HIGH;

Kernel部分

5、/kernel-4.14/drivers/misc/mediatek/sensors-1.0/hwmon/include/hwmsensor.h

在SAR后面添加:
#define SENSOR_TYPE_PICKUP_TEST                        73
并将SENSOR_TYPE_MAX_NUM定义为 SENSOR_TYPE_PICKUP_TEST

在ID_SAR之后添加:
#define ID_PICKUP_TEST          (ID_BASE + SENSOR_TYPE_PICKUP_TEST - 1)
并将ID_SENSOR_MAX_HANDLE定义为  ID_PICKUP_TEST

6、/kernel-4.14/drivers/misc/mediatek/sensors-1.0/sensorHub/SCP_nanoHub/SCP_nanoHub.c

在static void SCP_sensorHub_init_sensor_state(void)中添加:
mSensorState[SENSOR_TYPE_PICKUP_TEST].sensorType = SENSOR_TYPE_PICKUP_TEST; 
mSensorState[SENSOR_TYPE_PICKUP_TEST].timestamp_filter = false;

在sensor_get_data_from_hub方法中添加:
    case ID_PICKUP_TEST:  
        data->time_stamp = data_t->time_stamp;  
        data->tilt_event.state = data_t->tilt_event.state;  
    break;

7、添加kernel对应的driver文件及配置资源链接

8、/kernel-4.14/drivers/misc/mediatek/sensors-1.0/situation/situation.c

在static int handle_to_index(int handle)中添加:
case ID_PICKUP_TEST:  
    index = pickup_test;  
    break;

9、/kernel-4.14/drivers/misc/mediatek/sensors-1.0/situation/situation.h

在enum situation_index_table {中添加:
     sar, 
+    pickup_test, 
     max_situation_support,

10、/device/mediatek/common/kernel-headers/linux/hwmsensor.h

添加对应的宏定义
 #define SENSOR_STRING_TYPE_SAR "android.sensor.sar"
 +#define SENSOR_TYPE_PICKUP_TEST 73
 +#define SENSOR_STRING_TYPE_PICKUP_TEST "android.sensor.pickup_test"
 
 #define ID_SAR (ID_BASE + SENSOR_TYPE_SAR - SENSOR_TYPE_DEVICE_PRIVATE_BASE - 1)
 +#define ID_PICKUP_TEST (ID_BASE + SENSOR_TYPE_PICKUP_TEST - 1)

HAL部分

11、/vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/SensorContext.cpp

在static int handleToDriver(int handle) {中添加:
        case ID_SAR:        
+       case ID_PICKUP_TEST:            
            return situation;

12、/vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/SensorList.cpp

添加如下定义:
#ifdef CUSTOM_KERNEL_PICKUP_TEST_SENSOR
    #ifndef PICKUP_TEST        
        #define PICKUP_TEST                           "PICKUP_TEST"    
    #endif    
    #ifndef PICKUP_TEST_VENDER        
        #define PICKUP_TEST_VENDER                    "MTK"    
    #endif    
    #ifndef PICKUP_TEST_VERSION        
        #define PICKUP_TEST_VERSION                   1    
    #endif    
    #ifndef PICKUP_TEST_RANGE        
        #define PICKUP_TEST_RANGE                     1.0f    
    #endif    
    #ifndef PICKUP_TEST_RESOLUTION        
        #define PICKUP_TEST_RESOLUTION                1.0f    
    #endif    
    #ifndef PICKUP_TEST_POWER        
        #define PICKUP_TEST_POWER                     0    
    #endif    
    #ifndef PICKUP_TEST_MINDELAY        
        #define PICKUP_TEST_MINDELAY                  -1    
    #endif   
    #ifndef PICKUP_TEST_FIFO_MAX_COUNT        
        #define PICKUP_TEST_FIFO_MAX_COUNT            0    
    #endif    
    #ifndef PICKUP_TEST_FIFO_RESERVE_COUNT        
        #define PICKUP_TEST_FIFO_RESERVE_COUNT        0    
    #endif    
    #ifndef PICKUP_TEST_MAXDELAY        
        #define PICKUP_TEST_MAXDELAY                  0    
    #endif    
    #ifndef PICKUP_TEST_FLAGS        
        #define PICKUP_TEST_FLAGS     SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP    
    #endif
#endif

然后在void SensorList::initSensorList(void) {中添加:
#ifdef CUSTOM_KERNEL_PICKUP_TEST_SENSOR    
    memset(&sensor, 0, sizeof(struct sensor_t));    
    sensor.name = PICKUP_TEST;    
    sensor.vendor = PICKUP_TEST_VENDER;    
    sensor.version = PICKUP_TEST_VERSION;    
    sensor.handle = ID_PICKUP_TEST + ID_OFFSET;    
    sensor.type = SENSOR_TYPE_PICKUP_TEST;    
    sensor.maxRange = PICKUP_TEST_RANGE;    
    sensor.resolution = PICKUP_TEST_RESOLUTION;    
    sensor.power = PICKUP_TEST_POWER;    
    sensor.minDelay = PICKUP_TEST_MINDELAY;    
    sensor.fifoReservedEventCount = PICKUP_TEST_FIFO_RESERVE_COUNT;    
    sensor.fifoMaxEventCount = PICKUP_TEST_FIFO_MAX_COUNT;    
    sensor.stringType = SENSOR_STRING_TYPE_PICKUP_TEST;    
    sensor.maxDelay = PICKUP_TEST_MAXDELAY;    
    sensor.flags = PICKUP_TEST_FLAGS;    
    mSensorList.push_back(sensor);
#endif

针对CUSTOM_KERNEL_PICKUP_TEST_SENSOR这个宏,需要在如下文件中添加:
mt6769/h3/base/device/mediateksample/k69v1_64/ProjectConfig.mk
mt6769/h3/h38fa_hda/device/mediateksample/k69v1_64/ProjectConfig.mk
.../device/mediateksample/k69v1_64/ProjectConfig.mk

13、/vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/Situation.cpp

在int SituationSensor::HandleToIndex(int handle) {中添加:
    case ID_PICKUP_TEST:        
        index = pickup_test;        
        break;

14、/vendor/mediatek/proprietary/hardware/sensor/sensors-1.0/Situation.h

在class SituationSensor : public SensorBase {中添加
    sar,        
+   pickup_test,        
    max_situation,

二、添加对应的实现文件

HUB部分

1、vendor/mediatek/proprietary/tinysys/freertos/source/middleware/contexthub/VIRT_Driver

        在如上目录中添加对应的虚拟sensor驱动文件:pickup_test.c

2、vendor/mediatek/proprietary/tinysys/freertos/source/project/CM4_A/XXX/platform/feature_config/chre.mk添加如下编译配置。

######## Lift and putdown #######
#ifeq ($(CFG_PICKUP_TEST_SUPPORT),yes)
INCLUDES += -I$(SOURCE_DIR)/middleware/contexthub/algo/wakeup_gesture
INCLUDES += -I$(SOURCE_DIR)/middleware/contexthub/VIRT_Driver
C_FILES  += $(SOURCE_DIR)/middleware/contexthub/VIRT_Driver/pickup_test.c
C_FILES  += $(SOURCE_DIR)/middleware/contexthub/VIRT_Driver/algoDataResample.c
LIBFLAGS += -L$(SOURCE_DIR)/middleware/contexthub/algo/wakeup_gesture -lwakeupgesture
endif

3、vendor/mediatek/proprietary/tinysys/freertos/source/project/CM4_A/XXX/k69v1_64/ProjectConfig.mk中添加宏定义:

CFG_PICKUP_TEST_SUPPORT = yes

kernel部分

4、kernel-4.14/drivers/misc/mediatek/sensors-1.0/situation/pickup_test/目录中添加对应的kernel文件:

Kconfig/Makefile/pickup_test.c/pickup_test.h

5、kernel-4.14/drivers/misc/mediatek/sensors-1.0/situation/目录下的Kconfig和Makefile中添加pickup_test的编译选项:

source "drivers/misc/mediatek/sensors-1.0/situation/pickup_test/Kconfig"

obj-$(CONFIG_MTK_PICKUP_TEST_HUB)    += pickup_test/

 6、kernel-4.14\arch\arm64\configs中的k69v1_64_debug_defconfig和k69v1_64_defconfig中添加CONFIG_MTK_PICKUP_TEST_HUB宏定义。

CONFIG_MTK_PICKUP_TEST_HUB=y

至此,安装SensorTest1-V0.3.apk后,在列表中就可以看到PICKUP_TEST对应的sensor。

但是发现两个问题:

1、通过log来看,数据是能正常上报的,但是apk中无数据刷新。

2、上报抬起或者放下的事件后,无法disable掉该sensor。

如上两点目前还未找到问题原因,有知道的小伙伴可以留言或者私信我。

转载请注明出处!

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值