一、添加一个新的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。
如上两点目前还未找到问题原因,有知道的小伙伴可以留言或者私信我。
转载请注明出处!