diff --git a/model/sensor/driver/common/include/sensor_config_controller.h b/model/sensor/driver/common/include/sensor_config_controller.h index 9521f7dc5f53391f3da72752b108145ab546a2dd..4e4c2f05879dd601b6d721c9ce77bbe78fbbbd46 100644 --- a/model/sensor/driver/common/include/sensor_config_controller.h +++ b/model/sensor/driver/common/include/sensor_config_controller.h @@ -26,6 +26,8 @@ enum SensorOpsType { SENSOR_OPS_TYPE_WRITE = 2, SENSOR_OPS_TYPE_READ_CHECK = 3, SENSOR_OPS_TYPE_UPDATE_BITWISE = 4, + SENSOR_OPS_TYPE_EXTBUFF_READ = 5, + SENSOR_OPS_TYPE_EXTBUFF_WRITE = 6, }; struct SensorOpsCall { diff --git a/model/sensor/driver/common/include/sensor_config_parser.h b/model/sensor/driver/common/include/sensor_config_parser.h index 27ff0b1c4a06531e3cb7a2fb0b84fd5a8aebe84e..ebc20e4ecfcd9b4efec60a7a7adbdec22714eaff 100644 --- a/model/sensor/driver/common/include/sensor_config_parser.h +++ b/model/sensor/driver/common/include/sensor_config_parser.h @@ -46,6 +46,7 @@ enum SensorRegCfgIndex { }; struct SensorRegCfg { + uint8_t *dataBuff; uint16_t regAddr; uint16_t value; uint16_t mask; diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index e2f3689dd871d813aa7750acc340f5657001df8e..1be1e982585202478d9f40d0814a7e283f07a8c8 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -23,7 +23,7 @@ static int32_t SensorOpsNop(struct SensorBusCfg *busCfg, struct SensorRegCfg *cf static int32_t SensorOpsRead(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) { - uint16_t value = 0; + uint32_t value = 0; int32_t ret; ret = ReadSensor(busCfg, cfgItem->regAddr, (uint8_t *)&value, sizeof(value)); @@ -52,27 +52,56 @@ static uint32_t GetSensorRegRealValueMask(struct SensorRegCfg *cfgItem, uint32_t static int32_t SensorOpsWrite(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) { - uint8_t calType = cfgItem->calType; uint8_t value[SENSOR_VALUE_BUTT]; int32_t ret = HDF_FAILURE; value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; value[SENSOR_VALUE_INDEX] = cfgItem->value; - switch (calType) { + ret = WriteSensor(busCfg, value, sizeof(value)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "write i2c reg"); + + return ret; +} + +static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *value, uint32_t valueMask) +{ + uint32_t originValue; + uint32_t mask; + uint32_t tmp; + + mask = GetSensorRegRealValueMask(cfgItem, &originValue, valueMask); + switch ((enum SensorCalculateType)cfgItem->calType) { case SENSOR_CFG_CALC_TYPE_NONE: - ret = WriteSensor(busCfg, value, sizeof(value)); break; case SENSOR_CFG_CALC_TYPE_SET: + *value &= ~mask; + *value |= (originValue & mask); + break; case SENSOR_CFG_CALC_TYPE_REVERT: + tmp = *value & (~mask); + *value = ~(*value & mask); + *value = tmp | (*value); + break; case SENSOR_CFG_CALC_TYPE_XOR: + tmp = *value & (~mask); + originValue = originValue & mask; + *value = *value & mask; + *value ^= originValue; + *value = tmp | (*value); + break; case SENSOR_CFG_CALC_TYPE_LEFT_SHIFT: + *value = *value << cfgItem->shiftNum; + break; case SENSOR_CFG_CALC_TYPE_RIGHT_SHIFT: + *value = *value >> cfgItem->shiftNum; + break; default: + HDF_LOGE("%s: unsupported cal type", __func__); break; } - return ret; + return 0; } static int32_t SensorOpsReadCheck(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) @@ -99,30 +128,6 @@ static int32_t SensorOpsReadCheck(struct SensorBusCfg *busCfg, struct SensorRegC return HDF_SUCCESS; } -static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *value, uint32_t valueMask) -{ - uint32_t originValue; - uint32_t mask; - uint32_t tmp; - - mask = GetSensorRegRealValueMask(cfgItem, &originValue, valueMask); - switch ((enum SensorCalculateType)cfgItem->calType) { - case SENSOR_CFG_CALC_TYPE_SET: - *value &= ~mask; - *value |= (originValue & mask); - break; - case SENSOR_CFG_CALC_TYPE_REVERT: - tmp = *value & (~mask); - *value = ~(*value & mask); - *value = tmp | (*value & mask); - break; - default: - HDF_LOGE("%s: unsupported cal type", __func__); - break; - } - return 0; -} - static int32_t SensorOpsUpdateBitwise(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) { uint32_t value = 0; @@ -150,12 +155,46 @@ static int32_t SensorOpsUpdateBitwise(struct SensorBusCfg *busCfg, struct Sensor return HDF_SUCCESS; } +static int32_t SensorOpsExtBuffRead(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) +{ + int32_t ret = HDF_FAILURE; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + + if (busCfg->busType == SENSOR_BUS_I2C) { + ret = ReadSensor(busCfg, cfgItem->regAddr, cfgItem->dataBuff, cfgItem->len); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); + } + + return ret; +} + +static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) +{ + int32_t ret = HDF_FAILURE; + uint8_t value[SENSOR_VALUE_BUTT]; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + + value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; + value[SENSOR_VALUE_INDEX] = *(cfgItem->dataBuff); + + if (busCfg->busType == SENSOR_BUS_I2C) { + ret = WriteSensor(busCfg, value, cfgItem->len); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "write i2c reg"); + } + + return ret; +} + static struct SensorOpsCall g_doOpsCall[] = { { SENSOR_OPS_TYPE_NOP, SensorOpsNop }, { SENSOR_OPS_TYPE_READ, SensorOpsRead }, { SENSOR_OPS_TYPE_WRITE, SensorOpsWrite }, { SENSOR_OPS_TYPE_READ_CHECK, SensorOpsReadCheck }, { SENSOR_OPS_TYPE_UPDATE_BITWISE, SensorOpsUpdateBitwise }, + { SENSOR_OPS_TYPE_EXTBUFF_READ, SensorOpsExtBuffRead }, + { SENSOR_OPS_TYPE_EXTBUFF_WRITE, SensorOpsExtBuffWrite }, }; int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group)