From 978642ef01190b045f7a8388f6b85472dc66b0b4 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 3 Sep 2021 18:08:46 +0800 Subject: [PATCH 001/272] magnetic_driver Signed-off-by: YOUR_NAME --- .../driver/chipset/magnetic/magnetic_lsm303.c | 233 +++++++++++ .../driver/chipset/magnetic/magnetic_lsm303.h | 82 ++++ .../driver/magnetic/sensor_magnetic_driver.c | 377 ++++++++++++++++++ .../driver/magnetic/sensor_magnetic_driver.h | 66 +++ 4 files changed, 758 insertions(+) create mode 100755 model/sensor/driver/chipset/magnetic/magnetic_lsm303.c create mode 100755 model/sensor/driver/chipset/magnetic/magnetic_lsm303.h create mode 100755 model/sensor/driver/magnetic/sensor_magnetic_driver.c create mode 100755 model/sensor/driver/magnetic/sensor_magnetic_driver.h diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c new file mode 100755 index 000000000..14bddf671 --- /dev/null +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "magnetic_lsm303.h" +#include "osal_mem.h" +#include "osal_time.h" +#include +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_magnetic_driver.h" + +static struct Lsm303DrvData *g_lsm303DrvData = NULL; + +struct Lsm303DrvData *Lsm303GetDrvData(void) +{ + return g_lsm303DrvData; +} + +/* IO config for int-pin and I2C-pin */ +#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c +#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 +#define SENSOR_I2C_REG_CFG 0x403 + +static int32_t ReadLsm303RawData(struct SensorCfgData *data, struct MagneticData *rawData, int64_t *timestamp) +{ + uint8_t status = 0; + uint8_t reg[MAGNETIC_AXIS_BUTT]; + OsalTimespec time; + + (void)memset_s(&time, sizeof(time), 0, sizeof(time)); + (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return HDF_FAILURE; + } + *timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; /* unit nanosecond */ + + int32_t ret = ReadSensor(&data->busCfg, LSM303_STATUS_ADDR, &status, sizeof(uint8_t)); + if (!(status & LSM303_DATA_READY_MASK) || (ret != HDF_SUCCESS)) { + HDF_LOGE("%s: data status [%u] ret [%d]", __func__, status, ret); + + return HDF_FAILURE; + } + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_X_MSB_ADDR, ®[MAGNETIC_X_AXIS_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_X_LSB_ADDR, ®[MAGNETIC_X_AXIS_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_Y_MSB_ADDR, ®[MAGNETIC_Y_AXIS_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_Y_LSB_ADDR, ®[MAGNETIC_Y_AXIS_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_Z_MSB_ADDR, ®[MAGNETIC_Z_AXIS_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, LSM303_MAGNETIC_Z_LSB_ADDR, ®[MAGNETIC_Z_AXIS_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + rawData->x = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[MAGNETIC_X_AXIS_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[MAGNETIC_X_AXIS_LSB]); + rawData->y = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[MAGNETIC_Y_AXIS_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[MAGNETIC_Y_AXIS_LSB]); + rawData->z = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[MAGNETIC_Z_AXIS_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[MAGNETIC_Z_AXIS_LSB]); + + return HDF_SUCCESS; +} + +int32_t ReadLsm303Data(struct SensorCfgData *data) +{ + struct MagneticData rawData = { 0, 0, 0 }; + int32_t tmp[MAGNETIC_AXIS_NUM]; + struct SensorReportEvent event; + + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + (void)memset_s(tmp, sizeof(tmp), 0, sizeof(tmp)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + int32_t ret = ReadLsm303RawData(data, &rawData, &event.timestamp); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: LSM303 read raw data failed", __func__); + + return HDF_FAILURE; + } + + event.sensorId = SENSOR_TAG_MAGNETIC_FIELD; + event.option = 0; + event.mode = SENSOR_WORK_MODE_REALTIME; + + tmp[MAGNETIC_X_AXIS] = rawData.x * 1000 / LSM303DLHC_M_SENSITIVITY_XY_4_7Ga; + tmp[MAGNETIC_Y_AXIS] = rawData.y * 1000 / LSM303DLHC_M_SENSITIVITY_XY_4_7Ga; + tmp[MAGNETIC_Z_AXIS] = rawData.z * 1000 / LSM303DLHC_M_SENSITIVITY_Z_4_7Ga; + + event.dataLen = sizeof(tmp); + event.data = (uint8_t *)&tmp; + ret = ReportSensorEvent(&event); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: LSM303 report data failed", __func__); + } + + return ret; +} + +static int32_t InitLsm303(struct SensorCfgData *data) +{ + int32_t ret; + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); + + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Lsm303 sensor init config failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitMagneticPreConfig(void) +{ + if (SetSensorPinMux(SENSOR_I2C6_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Data write mux pin failed", __func__); + return HDF_FAILURE; + } + if (SetSensorPinMux(SENSOR_I2C6_CLK_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Clk write mux pin failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t DispatchLsm303(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t Lsm303BindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct Lsm303DrvData *drvData = (struct Lsm303DrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc Lsm303 drv data fail", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchLsm303; + drvData->device = device; + device->service = &drvData->ioService; + g_lsm303DrvData = drvData; + + return HDF_SUCCESS; +} + +int32_t Lsm303InitDriver(struct HdfDeviceObject *device) +{ + int32_t ret; + struct MagneticOpsCall ops; + + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Lsm303DrvData *drvData = (struct Lsm303DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + ret = InitMagneticPreConfig(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init Lsm303 bus mux config", __func__); + return HDF_FAILURE; + } + + drvData->sensorCfg = MagneticCreateCfgData(device->property); + if (drvData->sensorCfg == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + ops.Init = NULL; + ops.ReadData = ReadLsm303Data; + ret = MagneticRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register lsm303 magnetic failed", __func__); + return HDF_FAILURE; + } + + ret = InitLsm303(drvData->sensorCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init lsm303 magnetic failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +void Lsm303ReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct Lsm303DrvData *drvData = (struct Lsm303DrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + MagneticReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_magneticLsm303DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_MAGNETIC_LSM303", + .Bind = Lsm303BindDriver, + .Init = Lsm303InitDriver, + .Release = Lsm303ReleaseDriver, +}; + +HDF_INIT(g_magneticLsm303DevEntry); \ No newline at end of file diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h new file mode 100755 index 000000000..f884b45fd --- /dev/null +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MAGNETIC_LSM303_H +#define MAGNETIC_LSM303_H + +#include "sensor_config_parser.h" +#include "sensor_magnetic_driver.h" + +/* MAGNETIC SET RATE AND MODE ADDR */ +#define LSM303_CRA_REG_ADDR 0X00 +#define LSM303_CRB_REG_ADDR 0X01 +#define LSM303_MR_REG_ADDR 0X02 + +/* MAGNETIC DATA REGISTERS ADDR */ +#define LSM303_MAGNETIC_X_MSB_ADDR 0X03 +#define LSM303_MAGNETIC_X_LSB_ADDR 0X04 +#define LSM303_MAGNETIC_Y_MSB_ADDR 0X05 +#define LSM303_MAGNETIC_Y_LSB_ADDR 0X06 +#define LSM303_MAGNETIC_Z_MSB_ADDR 0X07 +#define LSM303_MAGNETIC_Z_LSB_ADDR 0X08 +#define LSM303_STATUS_ADDR 0X09 + +/* MAGNETIC DATA RATE CONFIG HZ */ +#define LSM303_DATA_RATE_0 0X00 +#define LSM303_DATA_RATE_1 0X04 +#define LSM303_DATA_RATE_2 0X08 +#define LSM303_DATA_RATE_3 0X0C +#define LSM303_DATA_RATE_4 0X10 +#define LSM303_DATA_RATE_5 0X14 +#define LSM303_DATA_RATE_6 0X18 +#define LSM303_DATA_RATE_7 0X1C + +/* MAGNETIC GAIN CONFIG GAUSS */ +#define LSM303_GAIN_RATE_0 0X20 +#define LSM303_GAIN_RATE_1 0X40 +#define LSM303_GAIN_RATE_2 0X60 +#define LSM303_GAIN_RATE_3 0X80 +#define LSM303_GAIN_RATE_4 0XA0 +#define LSM303_GAIN_RATE_5 0XC0 +#define LSM303_GAIN_RATE_6 0XE0 + +/* MAGNETIC GAIN SENSITIVITY RANGE */ +#define LSM303DLHC_M_SENSITIVITY_XY_1_3Ga 1100 +#define LSM303DLHC_M_SENSITIVITY_XY_1_9Ga 855 +#define LSM303DLHC_M_SENSITIVITY_XY_2_5Ga 670 +#define LSM303DLHC_M_SENSITIVITY_XY_4Ga 450 +#define LSM303DLHC_M_SENSITIVITY_XY_4_7Ga 400 +#define LSM303DLHC_M_SENSITIVITY_XY_5_6Ga 330 +#define LSM303DLHC_M_SENSITIVITY_XY_8_1Ga 230 +#define LSM303DLHC_M_SENSITIVITY_Z_1_3Ga 980 +#define LSM303DLHC_M_SENSITIVITY_Z_1_9Ga 760 +#define LSM303DLHC_M_SENSITIVITY_Z_2_5Ga 600 +#define LSM303DLHC_M_SENSITIVITY_Z_4Ga 400 +#define LSM303DLHC_M_SENSITIVITY_Z_4_7Ga 355 +#define LSM303DLHC_M_SENSITIVITY_Z_5_6Ga 295 +#define LSM303DLHC_M_SENSITIVITY_Z_8_1Ga 205 + +/* MAGNETIC MODE CONFIG */ +#define LSM303_OPERATING_MODE_1 0X00 +#define LSM303_OPERATING_MODE_2 0X01 +#define LSM303_OPERATING_MODE_3 0X02 +#define LSM303_OPERATING_MODE_4 0X03 + +/* MAGNETIC DATA READY */ +#define LSM303_DATA_READY_MASK 0x01 + +int32_t DetectMagneticLsm303Chip(struct SensorCfgData *data); +int32_t ReadLsm303Data(struct SensorCfgData *data); + +struct Lsm303DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + +#endif /* MAGNETIC_LSM303_H */ \ No newline at end of file diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c new file mode 100755 index 000000000..14e4f80e8 --- /dev/null +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -0,0 +1,377 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_magnetic_driver.h" +#include "magnetic_lsm303.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "securec.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_magnetic_driver_c + +#define HDF_MAGNETIC_WORK_QUEUE_NAME "hdf_magnetic_work_queue" + +static struct MagneticDrvData *g_magneticDrvData = NULL; + +static struct MagneticDrvData *MagneticGetDrvData(void) +{ + return g_magneticDrvData; +} + +static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; + +int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops) +{ + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); + + drvData->ops.Init = ops->Init; + drvData->ops.ReadData = ops->ReadData; + return HDF_SUCCESS; +} + +static void MagneticDataWorkEntry(void *arg) +{ + struct MagneticDrvData *drvData = NULL; + + drvData = (struct MagneticDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->ops.ReadData == NULL) { + HDF_LOGE("%s: Magnetic readdata function NULL", __func__); + return; + } + if (drvData->ops.ReadData(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic read data failed", __func__); + } +} + +static void MagneticTimerEntry(uintptr_t arg) +{ + int64_t interval; + int32_t ret; + struct MagneticDrvData *drvData = (struct MagneticDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->magneticWorkQueue, &drvData->magneticWork)) { + HDF_LOGE("%s: Magnetic add work queue failed", __func__); + } + + interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; + ret = OsalTimerSetTimeout(&drvData->magneticTimer, interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic modify time failed", __func__); + } +} + +static int32_t InitMagneticData(struct MagneticDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->magneticWorkQueue, HDF_MAGNETIC_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->magneticWork, MagneticDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = SENSOR_TIMER_MIN_TIME; + drvData->enable = false; + drvData->detectFlag = false; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticEnable(void) +{ + int32_t ret; + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: Magnetic sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic sensor enable config failed", __func__); + return ret; + } + + ret = OsalTimerCreate(&drvData->magneticTimer, SENSOR_TIMER_MIN_TIME, MagneticTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->magneticTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticDisable(void) +{ + int32_t ret; + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: Magnetic sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic sensor disable config failed", __func__); + return ret; + } + + ret = OsalTimerDelete(&drvData->magneticTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic delete timer failed", __func__); + return ret; + } + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + struct MagneticDrvData *drvData = NULL; + + drvData = MagneticGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->interval = samplingInterval; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetMagneticOption(uint32_t option) +{ + (void)option; + + return HDF_SUCCESS; +} + +static int32_t DispatchMagnetic(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t MagneticBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct MagneticDrvData *drvData = (struct MagneticDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc magnetic drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchMagnetic; + drvData->device = device; + device->service = &drvData->ioService; + g_magneticDrvData = drvData; + + return HDF_SUCCESS; +} + +static int32_t InitMagneticOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetMagneticEnable; + deviceInfo->ops.Disable = SetMagneticDisable; + deviceInfo->ops.SetBatch = SetMagneticBatch; + deviceInfo->ops.SetMode = SetMagneticMode; + deviceInfo->ops.SetOption = SetMagneticOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitMagneticOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init magnetic ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add magnetic device failed", __func__); + return HDF_FAILURE; + } + + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node) +{ + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Magnetic node pointer NULL", __func__); + + return NULL; + } + + if (drvData->detectFlag) { + HDF_LOGE("%s: Magnetic sensor have detected", __func__); + + return NULL; + } + + if (drvData->magneticCfg == NULL) { + HDF_LOGE("%s: Magnetic magneticCfg pointer NULL", __func__); + + return NULL; + } + + if (GetSensorBaseConfigData(node, drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + + if (DetectSensorDevice(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + + drvData->detectFlag = true; + if (InitMagneticAfterDetected(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); + + goto INIT_EXIT; + } + return drvData->magneticCfg; + +INIT_EXIT: + (void)ReleaseSensorBusHandle(&drvData->magneticCfg->busCfg); +BASE_CONFIG_EXIT: + drvData->magneticCfg->root = NULL; + (void)memset_s(&drvData->magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + + return NULL; +} + +void MagneticReleaseCfgData(struct SensorCfgData *MagneticCfg) +{ + CHECK_NULL_PTR_RETURN(MagneticCfg); + + (void)DeleteSensorDevice(&MagneticCfg->sensorInfo); + ReleaseSensorAllRegConfig(MagneticCfg); + (void)ReleaseSensorBusHandle(&MagneticCfg->busCfg); + + MagneticCfg->root = NULL; + (void)memset_s(&MagneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&MagneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&MagneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t MagneticInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitMagneticData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init magnetic config failed", __func__); + return HDF_FAILURE; + } + + drvData->magneticCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->magneticCfg)); + if (drvData->magneticCfg == NULL) { + HDF_LOGE("%s: Malloc magnetic config data failed", __func__); + return HDF_FAILURE; + } + + drvData->magneticCfg->regCfgGroup = &g_regCfgGroup[0]; + + HDF_LOGI("%s: Init magnetic driver success", __func__); + return HDF_SUCCESS; +} + +void MagneticReleaseDriver(struct HdfDeviceObject *device) { + CHECK_NULL_PTR_RETURN(device); + + struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->detectFlag) { + MagneticReleaseCfgData(drvData->magneticCfg); + } + + OsalMemFree(drvData->magneticCfg); + drvData->magneticCfg = NULL; + + HdfWorkDestroy(&drvData->magneticWork); + HdfWorkQueueDestroy(&drvData->magneticWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorMagneticDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_MAGNETIC", + .Bind = MagneticBindDriver, + .Init = MagneticInitDriver, + .Release = MagneticReleaseDriver, +}; + +HDF_INIT(g_sensorMagneticDevEntry); \ No newline at end of file diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.h b/model/sensor/driver/magnetic/sensor_magnetic_driver.h new file mode 100755 index 000000000..77e4a3963 --- /dev/null +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_MAGNETIC_DRIVER_H +#define SENSOR_MAGNETIC_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_mutex.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define MAGNETIC_DEFAULT_SAMPLING_200_MS 200000000 +#define MAGNETIC_CHIP_NAME_LSM303 "lsm303" + +enum MagneticAxisNum { + MAGNETIC_X_AXIS = 0, + MAGNETIC_Y_AXIS = 1, + MAGNETIC_Z_AXIS = 2, + MAGNETIC_AXIS_NUM = 3, +}; + +enum MagneticAxisPart { + MAGNETIC_X_AXIS_MSB = 0, + MAGNETIC_X_AXIS_LSB = 1, + MAGNETIC_Y_AXIS_MSB = 2, + MAGNETIC_Y_AXIS_LSB = 3, + MAGNETIC_Z_AXIS_MSB = 4, + MAGNETIC_Z_AXIS_LSB = 5, + MAGNETIC_AXIS_BUTT, +}; + +struct MagneticData { + int32_t x; + int32_t y; + int32_t z; +}; + +struct MagneticOpsCall { + int32_t (*Init)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data); +}; + +struct MagneticDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue magneticWorkQueue; + HdfWork magneticWork; + OsalTimer magneticTimer; + bool detectFlag; + bool enable; + int64_t interval; + struct SensorCfgData *magneticCfg; + struct MagneticOpsCall ops; +}; + +int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops); +struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node); +void MagneticReleaseCfgData(struct SensorCfgData *sensorCfgData); + +#endif /* SENSOR_MAGNETIC_DRIVER_H */ \ No newline at end of file -- Gitee From 0aaba3d4f9db60a3ed02a59ec05a709c852301bd Mon Sep 17 00:00:00 2001 From: bigA2021 Date: Mon, 6 Sep 2021 10:39:39 +0800 Subject: [PATCH 002/272] usb 0906 commit Signed-off-by: bigA2021 Change-Id: I393aa106f759263417d1ba093ef97dee98b73cc0 --- core/shared/include/hdf_usb_pnp_manage.h | 2 +- test/unittest/model/usb/host/src/usb_test.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) mode change 100644 => 100755 core/shared/include/hdf_usb_pnp_manage.h diff --git a/core/shared/include/hdf_usb_pnp_manage.h b/core/shared/include/hdf_usb_pnp_manage.h old mode 100644 new mode 100755 index e22f7cb1d..62ba214aa --- a/core/shared/include/hdf_usb_pnp_manage.h +++ b/core/shared/include/hdf_usb_pnp_manage.h @@ -78,7 +78,7 @@ struct UsbPnpNotifyDeviceInfo { }; struct UsbPnpNotifyMatchInfoTable { - uint32_t usbDevAddr; + uintptr_t usbDevAddr; int32_t devNum; int32_t busNum; diff --git a/test/unittest/model/usb/host/src/usb_test.c b/test/unittest/model/usb/host/src/usb_test.c index 0cbf02c59..68eb621f5 100755 --- a/test/unittest/model/usb/host/src/usb_test.c +++ b/test/unittest/model/usb/host/src/usb_test.c @@ -1107,6 +1107,10 @@ static int32_t CheckHostSdkIfFreeRequest006(void) { int ret; + if (g_acm->isoReq == NULL) { + HDF_LOGE("%s: isoReq is NULL", __func__); + return HDF_FAILURE; + } ret = UsbFreeRequest(g_acm->isoReq); if (ret) { HDF_LOGE("%s: error", __func__); @@ -1132,6 +1136,7 @@ static int32_t CheckHostSdkIfFillIsoRequest001(void) parmas.pipeAddress = g_acm->isoPipe->pipeAddress; parmas.pipeId = g_acm->isoPipe->pipeId; parmas.callback = AcmWriteIsoCallback; + parmas.userData = NULL; parmas.requestType = USB_REQUEST_PARAMS_DATA_TYPE; parmas.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; parmas.dataReq.numIsoPackets = USB_ISO_PACKAT_CNT; @@ -1438,6 +1443,7 @@ static int32_t CheckHostSdkIfFillRequest003(void) intParmas.dataReq.directon = (UsbRequestDirection)(((uint32_t)g_acm->intPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & DIRECTION_MASK); intParmas.dataReq.length = g_acm->intSize; + intParmas.dataReq.buffer = NULL; ret = UsbFillRequest(g_acm->notifyReq, g_acm->int_devHandle, &intParmas); if (ret) { HDF_LOGE("%s: error", __func__); @@ -1471,6 +1477,7 @@ static int32_t CheckHostSdkIfFillRequest004(void) msgData.data = &g_acm->lineCoding; msgData.size = sizeof(struct UsbCdcLineCoding); parmas.ctrlReq = UsbControlMsg(msgData); + parmas.userData = NULL; ret = UsbFillRequest(g_acm->ctrlReq, g_acm->ctrl_devHandle, &parmas); if (ret) { HDF_LOGE("%s: error", __func__); @@ -1610,6 +1617,7 @@ static int32_t CheckHostSdkIfFillRequest007(void) intParmas.callback = AcmCtrlIrq; intParmas.requestType = USB_REQUEST_PARAMS_DATA_TYPE; intParmas.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; + intParmas.dataReq.buffer = NULL; intParmas.dataReq.numIsoPackets = 0; intParmas.dataReq.directon = (UsbRequestDirection)(((uint32_t)g_acm->intPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & DIRECTION_MASK); @@ -1648,6 +1656,7 @@ static int32_t CheckHostSdkIfFillRequest008(void) msgData.data = &g_acm->lineCoding; msgData.size = sizeof(struct UsbCdcLineCoding); parmas.ctrlReq = UsbControlMsg(msgData); + parmas.userData = NULL; ret = UsbFillRequest(g_acm->ctrlReq, g_acm->ctrl_devHandle, &parmas); if (ret) { HDF_LOGE("%s: error", __func__); -- Gitee From dde94cef8a02a63f809f889816a2444beeb730ec Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 6 Sep 2021 17:50:56 +0800 Subject: [PATCH 003/272] modify code Signed-off-by: YOUR_NAME --- .../driver/chipset/magnetic/magnetic_lsm303.c | 10 +- .../driver/chipset/magnetic/magnetic_lsm303.h | 164 ++-- .../driver/magnetic/sensor_magnetic_driver.c | 752 +++++++++--------- .../driver/magnetic/sensor_magnetic_driver.h | 130 +-- 4 files changed, 529 insertions(+), 527 deletions(-) diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c index 14bddf671..93ad331c9 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -7,9 +7,9 @@ */ #include "magnetic_lsm303.h" +#include #include "osal_mem.h" #include "osal_time.h" -#include #include "sensor_config_controller.h" #include "sensor_device_manager.h" #include "sensor_magnetic_driver.h" @@ -100,9 +100,9 @@ int32_t ReadLsm303Data(struct SensorCfgData *data) event.option = 0; event.mode = SENSOR_WORK_MODE_REALTIME; - tmp[MAGNETIC_X_AXIS] = rawData.x * 1000 / LSM303DLHC_M_SENSITIVITY_XY_4_7Ga; - tmp[MAGNETIC_Y_AXIS] = rawData.y * 1000 / LSM303DLHC_M_SENSITIVITY_XY_4_7Ga; - tmp[MAGNETIC_Z_AXIS] = rawData.z * 1000 / LSM303DLHC_M_SENSITIVITY_Z_4_7Ga; + tmp[MAGNETIC_X_AXIS] = rawData.x * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47Ga; + tmp[MAGNETIC_Y_AXIS] = rawData.y * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47Ga; + tmp[MAGNETIC_Z_AXIS] = rawData.z * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_Z47Ga; event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h index f884b45fd..d9e1380b4 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h @@ -1,82 +1,84 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef MAGNETIC_LSM303_H -#define MAGNETIC_LSM303_H - -#include "sensor_config_parser.h" -#include "sensor_magnetic_driver.h" - -/* MAGNETIC SET RATE AND MODE ADDR */ -#define LSM303_CRA_REG_ADDR 0X00 -#define LSM303_CRB_REG_ADDR 0X01 -#define LSM303_MR_REG_ADDR 0X02 - -/* MAGNETIC DATA REGISTERS ADDR */ -#define LSM303_MAGNETIC_X_MSB_ADDR 0X03 -#define LSM303_MAGNETIC_X_LSB_ADDR 0X04 -#define LSM303_MAGNETIC_Y_MSB_ADDR 0X05 -#define LSM303_MAGNETIC_Y_LSB_ADDR 0X06 -#define LSM303_MAGNETIC_Z_MSB_ADDR 0X07 -#define LSM303_MAGNETIC_Z_LSB_ADDR 0X08 -#define LSM303_STATUS_ADDR 0X09 - -/* MAGNETIC DATA RATE CONFIG HZ */ -#define LSM303_DATA_RATE_0 0X00 -#define LSM303_DATA_RATE_1 0X04 -#define LSM303_DATA_RATE_2 0X08 -#define LSM303_DATA_RATE_3 0X0C -#define LSM303_DATA_RATE_4 0X10 -#define LSM303_DATA_RATE_5 0X14 -#define LSM303_DATA_RATE_6 0X18 -#define LSM303_DATA_RATE_7 0X1C - -/* MAGNETIC GAIN CONFIG GAUSS */ -#define LSM303_GAIN_RATE_0 0X20 -#define LSM303_GAIN_RATE_1 0X40 -#define LSM303_GAIN_RATE_2 0X60 -#define LSM303_GAIN_RATE_3 0X80 -#define LSM303_GAIN_RATE_4 0XA0 -#define LSM303_GAIN_RATE_5 0XC0 -#define LSM303_GAIN_RATE_6 0XE0 - -/* MAGNETIC GAIN SENSITIVITY RANGE */ -#define LSM303DLHC_M_SENSITIVITY_XY_1_3Ga 1100 -#define LSM303DLHC_M_SENSITIVITY_XY_1_9Ga 855 -#define LSM303DLHC_M_SENSITIVITY_XY_2_5Ga 670 -#define LSM303DLHC_M_SENSITIVITY_XY_4Ga 450 -#define LSM303DLHC_M_SENSITIVITY_XY_4_7Ga 400 -#define LSM303DLHC_M_SENSITIVITY_XY_5_6Ga 330 -#define LSM303DLHC_M_SENSITIVITY_XY_8_1Ga 230 -#define LSM303DLHC_M_SENSITIVITY_Z_1_3Ga 980 -#define LSM303DLHC_M_SENSITIVITY_Z_1_9Ga 760 -#define LSM303DLHC_M_SENSITIVITY_Z_2_5Ga 600 -#define LSM303DLHC_M_SENSITIVITY_Z_4Ga 400 -#define LSM303DLHC_M_SENSITIVITY_Z_4_7Ga 355 -#define LSM303DLHC_M_SENSITIVITY_Z_5_6Ga 295 -#define LSM303DLHC_M_SENSITIVITY_Z_8_1Ga 205 - -/* MAGNETIC MODE CONFIG */ -#define LSM303_OPERATING_MODE_1 0X00 -#define LSM303_OPERATING_MODE_2 0X01 -#define LSM303_OPERATING_MODE_3 0X02 -#define LSM303_OPERATING_MODE_4 0X03 - -/* MAGNETIC DATA READY */ -#define LSM303_DATA_READY_MASK 0x01 - -int32_t DetectMagneticLsm303Chip(struct SensorCfgData *data); -int32_t ReadLsm303Data(struct SensorCfgData *data); - -struct Lsm303DrvData { - struct IDeviceIoService ioService; - struct HdfDeviceObject *device; - struct SensorCfgData *sensorCfg; -}; - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MAGNETIC_LSM303_H +#define MAGNETIC_LSM303_H + +#include "sensor_config_parser.h" +#include "sensor_magnetic_driver.h" + +#define LSM303_MAGNETIC_GIN 1000 + +/* MAGNETIC SET RATE AND MODE ADDR */ +#define LSM303_CRA_REG_ADDR 0X00 +#define LSM303_CRB_REG_ADDR 0X01 +#define LSM303_MR_REG_ADDR 0X02 + +/* MAGNETIC DATA REGISTERS ADDR */ +#define LSM303_MAGNETIC_X_MSB_ADDR 0X03 +#define LSM303_MAGNETIC_X_LSB_ADDR 0X04 +#define LSM303_MAGNETIC_Y_MSB_ADDR 0X05 +#define LSM303_MAGNETIC_Y_LSB_ADDR 0X06 +#define LSM303_MAGNETIC_Z_MSB_ADDR 0X07 +#define LSM303_MAGNETIC_Z_LSB_ADDR 0X08 +#define LSM303_STATUS_ADDR 0X09 + +/* MAGNETIC DATA RATE CONFIG HZ */ +#define LSM303_DATA_RATE_0 0X00 +#define LSM303_DATA_RATE_1 0X04 +#define LSM303_DATA_RATE_2 0X08 +#define LSM303_DATA_RATE_3 0X0C +#define LSM303_DATA_RATE_4 0X10 +#define LSM303_DATA_RATE_5 0X14 +#define LSM303_DATA_RATE_6 0X18 +#define LSM303_DATA_RATE_7 0X1C + +/* MAGNETIC GAIN CONFIG GAUSS */ +#define LSM303_GAIN_RATE_0 0X20 +#define LSM303_GAIN_RATE_1 0X40 +#define LSM303_GAIN_RATE_2 0X60 +#define LSM303_GAIN_RATE_3 0X80 +#define LSM303_GAIN_RATE_4 0XA0 +#define LSM303_GAIN_RATE_5 0XC0 +#define LSM303_GAIN_RATE_6 0XE0 + +/* MAGNETIC GAIN SENSITIVITY RANGE */ +#define LSM303DLHC_SENSITIVITY_XY13Ga 1100 +#define LSM303DLHC_SENSITIVITY_XY19Ga 855 +#define LSM303DLHC_SENSITIVITY_XY25Ga 670 +#define LSM303DLHC_SENSITIVITY_XY40Ga 450 +#define LSM303DLHC_SENSITIVITY_XY47Ga 400 +#define LSM303DLHC_SENSITIVITY_XY56Ga 330 +#define LSM303DLHC_SENSITIVITY_XY81Ga 230 +#define LSM303DLHC_SENSITIVITY_Z13Ga 980 +#define LSM303DLHC_SENSITIVITY_Z19Ga 760 +#define LSM303DLHC_SENSITIVITY_Z25Ga 600 +#define LSM303DLHC_SENSITIVITY_Z40Ga 400 +#define LSM303DLHC_SENSITIVITY_Z47Ga 355 +#define LSM303DLHC_SENSITIVITY_Z56Ga 295 +#define LSM303DLHC_SENSITIVITY_Z81Ga 205 + +/* MAGNETIC MODE CONFIG */ +#define LSM303_OPERATING_MODE_1 0X00 +#define LSM303_OPERATING_MODE_2 0X01 +#define LSM303_OPERATING_MODE_3 0X02 +#define LSM303_OPERATING_MODE_4 0X03 + +/* MAGNETIC DATA READY */ +#define LSM303_DATA_READY_MASK 0x01 + +int32_t DetectMagneticLsm303Chip(struct SensorCfgData *data); +int32_t ReadLsm303Data(struct SensorCfgData *data); + +struct Lsm303DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + #endif /* MAGNETIC_LSM303_H */ \ No newline at end of file diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index 14e4f80e8..f8f1cd938 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -1,377 +1,377 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "sensor_magnetic_driver.h" -#include "magnetic_lsm303.h" -#include "hdf_base.h" -#include "hdf_device_desc.h" -#include "osal_math.h" -#include "osal_mem.h" -#include "securec.h" -#include "sensor_config_controller.h" -#include "sensor_device_manager.h" -#include "sensor_platform_if.h" - -#define HDF_LOG_TAG sensor_magnetic_driver_c - -#define HDF_MAGNETIC_WORK_QUEUE_NAME "hdf_magnetic_work_queue" - -static struct MagneticDrvData *g_magneticDrvData = NULL; - -static struct MagneticDrvData *MagneticGetDrvData(void) -{ - return g_magneticDrvData; -} - -static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; - -int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops) -{ - struct MagneticDrvData *drvData = MagneticGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); - - drvData->ops.Init = ops->Init; - drvData->ops.ReadData = ops->ReadData; - return HDF_SUCCESS; -} - -static void MagneticDataWorkEntry(void *arg) -{ - struct MagneticDrvData *drvData = NULL; - - drvData = (struct MagneticDrvData *)arg; - CHECK_NULL_PTR_RETURN(drvData); - - if (drvData->ops.ReadData == NULL) { - HDF_LOGE("%s: Magnetic readdata function NULL", __func__); - return; - } - if (drvData->ops.ReadData(drvData->magneticCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic read data failed", __func__); - } -} - -static void MagneticTimerEntry(uintptr_t arg) -{ - int64_t interval; - int32_t ret; - struct MagneticDrvData *drvData = (struct MagneticDrvData *)arg; - CHECK_NULL_PTR_RETURN(drvData); - - if (!HdfAddWork(&drvData->magneticWorkQueue, &drvData->magneticWork)) { - HDF_LOGE("%s: Magnetic add work queue failed", __func__); - } - - interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); - interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; - ret = OsalTimerSetTimeout(&drvData->magneticTimer, interval); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic modify time failed", __func__); - } -} - -static int32_t InitMagneticData(struct MagneticDrvData *drvData) -{ - if (HdfWorkQueueInit(&drvData->magneticWorkQueue, HDF_MAGNETIC_WORK_QUEUE_NAME) != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic init work queue failed", __func__); - return HDF_FAILURE; - } - - if (HdfWorkInit(&drvData->magneticWork, MagneticDataWorkEntry, drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic create thread failed", __func__); - return HDF_FAILURE; - } - - drvData->interval = SENSOR_TIMER_MIN_TIME; - drvData->enable = false; - drvData->detectFlag = false; - - return HDF_SUCCESS; -} - -static int32_t SetMagneticEnable(void) -{ - int32_t ret; - struct MagneticDrvData *drvData = MagneticGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); - - if (drvData->enable) { - HDF_LOGE("%s: Magnetic sensor is enabled", __func__); - return HDF_SUCCESS; - } - - ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic sensor enable config failed", __func__); - return ret; - } - - ret = OsalTimerCreate(&drvData->magneticTimer, SENSOR_TIMER_MIN_TIME, MagneticTimerEntry, (uintptr_t)drvData); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic create timer failed[%d]", __func__, ret); - return ret; - } - - ret = OsalTimerStartLoop(&drvData->magneticTimer); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic start timer failed[%d]", __func__, ret); - return ret; - } - drvData->enable = true; - - return HDF_SUCCESS; -} - -static int32_t SetMagneticDisable(void) -{ - int32_t ret; - struct MagneticDrvData *drvData = MagneticGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); - - if (!drvData->enable) { - HDF_LOGE("%s: Magnetic sensor had disable", __func__); - return HDF_SUCCESS; - } - - ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic sensor disable config failed", __func__); - return ret; - } - - ret = OsalTimerDelete(&drvData->magneticTimer); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Magnetic delete timer failed", __func__); - return ret; - } - drvData->enable = false; - - return HDF_SUCCESS; -} - -static int32_t SetMagneticBatch(int64_t samplingInterval, int64_t interval) -{ - (void)interval; - - struct MagneticDrvData *drvData = NULL; - - drvData = MagneticGetDrvData(); - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - drvData->interval = samplingInterval; - - return HDF_SUCCESS; -} - -static int32_t SetMagneticMode(int32_t mode) -{ - return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; -} - -static int32_t SetMagneticOption(uint32_t option) -{ - (void)option; - - return HDF_SUCCESS; -} - -static int32_t DispatchMagnetic(struct HdfDeviceIoClient *client, - int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - (void)client; - (void)cmd; - (void)data; - (void)reply; - - return HDF_SUCCESS; -} - -int32_t MagneticBindDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - - struct MagneticDrvData *drvData = (struct MagneticDrvData *)OsalMemCalloc(sizeof(*drvData)); - if (drvData == NULL) { - HDF_LOGE("%s: Malloc magnetic drv data fail!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - - drvData->ioService.Dispatch = DispatchMagnetic; - drvData->device = device; - device->service = &drvData->ioService; - g_magneticDrvData = drvData; - - return HDF_SUCCESS; -} - -static int32_t InitMagneticOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) -{ - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - - deviceInfo->ops.Enable = SetMagneticEnable; - deviceInfo->ops.Disable = SetMagneticDisable; - deviceInfo->ops.SetBatch = SetMagneticBatch; - deviceInfo->ops.SetMode = SetMagneticMode; - deviceInfo->ops.SetOption = SetMagneticOption; - - if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), - &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { - HDF_LOGE("%s: Copy sensor info failed", __func__); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) -{ - struct SensorDeviceInfo deviceInfo; - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - - if (InitMagneticOps(config, &deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Init magnetic ops failed", __func__); - return HDF_FAILURE; - } - - if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Add magnetic device failed", __func__); - return HDF_FAILURE; - } - - if (ParseSensorRegConfig(config) != HDF_SUCCESS) { - HDF_LOGE("%s: Parse sensor register failed", __func__); - (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorAllRegConfig(config); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node) -{ - struct MagneticDrvData *drvData = MagneticGetDrvData(); - - if (drvData == NULL || node == NULL) { - HDF_LOGE("%s: Magnetic node pointer NULL", __func__); - - return NULL; - } - - if (drvData->detectFlag) { - HDF_LOGE("%s: Magnetic sensor have detected", __func__); - - return NULL; - } - - if (drvData->magneticCfg == NULL) { - HDF_LOGE("%s: Magnetic magneticCfg pointer NULL", __func__); - - return NULL; - } - - if (GetSensorBaseConfigData(node, drvData->magneticCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Get sensor base config failed", __func__); - goto BASE_CONFIG_EXIT; - } - - if (DetectSensorDevice(drvData->magneticCfg) != HDF_SUCCESS) { - HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); - drvData->detectFlag = false; - goto BASE_CONFIG_EXIT; - } - - drvData->detectFlag = true; - if (InitMagneticAfterDetected(drvData->magneticCfg) != HDF_SUCCESS) { - HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); - - goto INIT_EXIT; - } - return drvData->magneticCfg; - -INIT_EXIT: - (void)ReleaseSensorBusHandle(&drvData->magneticCfg->busCfg); -BASE_CONFIG_EXIT: - drvData->magneticCfg->root = NULL; - (void)memset_s(&drvData->magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); - (void)memset_s(&drvData->magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&drvData->magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - - return NULL; -} - -void MagneticReleaseCfgData(struct SensorCfgData *MagneticCfg) -{ - CHECK_NULL_PTR_RETURN(MagneticCfg); - - (void)DeleteSensorDevice(&MagneticCfg->sensorInfo); - ReleaseSensorAllRegConfig(MagneticCfg); - (void)ReleaseSensorBusHandle(&MagneticCfg->busCfg); - - MagneticCfg->root = NULL; - (void)memset_s(&MagneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); - (void)memset_s(&MagneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&MagneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); -} - -int32_t MagneticInitDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - if (InitMagneticData(drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: Init magnetic config failed", __func__); - return HDF_FAILURE; - } - - drvData->magneticCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->magneticCfg)); - if (drvData->magneticCfg == NULL) { - HDF_LOGE("%s: Malloc magnetic config data failed", __func__); - return HDF_FAILURE; - } - - drvData->magneticCfg->regCfgGroup = &g_regCfgGroup[0]; - - HDF_LOGI("%s: Init magnetic driver success", __func__); - return HDF_SUCCESS; -} - -void MagneticReleaseDriver(struct HdfDeviceObject *device) { - CHECK_NULL_PTR_RETURN(device); - - struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; - CHECK_NULL_PTR_RETURN(drvData); - - if (drvData->detectFlag) { - MagneticReleaseCfgData(drvData->magneticCfg); - } - - OsalMemFree(drvData->magneticCfg); - drvData->magneticCfg = NULL; - - HdfWorkDestroy(&drvData->magneticWork); - HdfWorkQueueDestroy(&drvData->magneticWorkQueue); - OsalMemFree(drvData); -} - -struct HdfDriverEntry g_sensorMagneticDevEntry = { - .moduleVersion = 1, - .moduleName = "HDF_SENSOR_MAGNETIC", - .Bind = MagneticBindDriver, - .Init = MagneticInitDriver, - .Release = MagneticReleaseDriver, -}; - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_magnetic_driver.h" +#include +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_magnetic_driver_c + +#define HDF_MAGNETIC_WORK_QUEUE_NAME "hdf_magnetic_work_queue" + +static struct MagneticDrvData *g_magneticDrvData = NULL; + +static struct MagneticDrvData *MagneticGetDrvData(void) +{ + return g_magneticDrvData; +} + +static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; + +int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops) +{ + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); + + drvData->ops.Init = ops->Init; + drvData->ops.ReadData = ops->ReadData; + return HDF_SUCCESS; +} + +static void MagneticDataWorkEntry(void *arg) +{ + struct MagneticDrvData *drvData = NULL; + + drvData = (struct MagneticDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->ops.ReadData == NULL) { + HDF_LOGE("%s: Magnetic readdata function NULL", __func__); + return; + } + if (drvData->ops.ReadData(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic read data failed", __func__); + } +} + +static void MagneticTimerEntry(uintptr_t arg) +{ + int64_t interval; + int32_t ret; + struct MagneticDrvData *drvData = (struct MagneticDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->magneticWorkQueue, &drvData->magneticWork)) { + HDF_LOGE("%s: Magnetic add work queue failed", __func__); + } + + interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; + ret = OsalTimerSetTimeout(&drvData->magneticTimer, interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic modify time failed", __func__); + } +} + +static int32_t InitMagneticData(struct MagneticDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->magneticWorkQueue, HDF_MAGNETIC_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->magneticWork, MagneticDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = SENSOR_TIMER_MIN_TIME; + drvData->enable = false; + drvData->detectFlag = false; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticEnable(void) +{ + int32_t ret; + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: Magnetic sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic sensor enable config failed", __func__); + return ret; + } + + ret = OsalTimerCreate(&drvData->magneticTimer, SENSOR_TIMER_MIN_TIME, MagneticTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->magneticTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticDisable(void) +{ + int32_t ret; + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->magneticCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: Magnetic sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->magneticCfg->busCfg, drvData->magneticCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic sensor disable config failed", __func__); + return ret; + } + + ret = OsalTimerDelete(&drvData->magneticTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Magnetic delete timer failed", __func__); + return ret; + } + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + struct MagneticDrvData *drvData = NULL; + + drvData = MagneticGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->interval = samplingInterval; + + return HDF_SUCCESS; +} + +static int32_t SetMagneticMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetMagneticOption(uint32_t option) +{ + (void)option; + + return HDF_SUCCESS; +} + +static int32_t DispatchMagnetic(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t MagneticBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct MagneticDrvData *drvData = (struct MagneticDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc magnetic drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchMagnetic; + drvData->device = device; + device->service = &drvData->ioService; + g_magneticDrvData = drvData; + + return HDF_SUCCESS; +} + +static int32_t InitMagneticOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetMagneticEnable; + deviceInfo->ops.Disable = SetMagneticDisable; + deviceInfo->ops.SetBatch = SetMagneticBatch; + deviceInfo->ops.SetMode = SetMagneticMode; + deviceInfo->ops.SetOption = SetMagneticOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitMagneticOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init magnetic ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add magnetic device failed", __func__); + return HDF_FAILURE; + } + + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node) +{ + struct MagneticDrvData *drvData = MagneticGetDrvData(); + + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Magnetic node pointer NULL", __func__); + + return NULL; + } + + if (drvData->detectFlag) { + HDF_LOGE("%s: Magnetic sensor have detected", __func__); + + return NULL; + } + + if (drvData->magneticCfg == NULL) { + HDF_LOGE("%s: Magnetic magneticCfg pointer NULL", __func__); + + return NULL; + } + + if (GetSensorBaseConfigData(node, drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + + if (DetectSensorDevice(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + + drvData->detectFlag = true; + if (InitMagneticAfterDetected(drvData->magneticCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Magnetic sensor detect device no exist", __func__); + + goto INIT_EXIT; + } + return drvData->magneticCfg; + +INIT_EXIT: + (void)ReleaseSensorBusHandle(&drvData->magneticCfg->busCfg); +BASE_CONFIG_EXIT: + drvData->magneticCfg->root = NULL; + (void)memset_s(&drvData->magneticCfg->sensorInfo, + sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + + return NULL; +} + +void MagneticReleaseCfgData(struct SensorCfgData *MagneticCfg) +{ + CHECK_NULL_PTR_RETURN(MagneticCfg); + + (void)DeleteSensorDevice(&MagneticCfg->sensorInfo); + ReleaseSensorAllRegConfig(MagneticCfg); + (void)ReleaseSensorBusHandle(&MagneticCfg->busCfg); + + MagneticCfg->root = NULL; + (void)memset_s(&MagneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&MagneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&MagneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t MagneticInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitMagneticData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init magnetic config failed", __func__); + return HDF_FAILURE; + } + + drvData->magneticCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->magneticCfg)); + if (drvData->magneticCfg == NULL) { + HDF_LOGE("%s: Malloc magnetic config data failed", __func__); + return HDF_FAILURE; + } + + drvData->magneticCfg->regCfgGroup = &g_regCfgGroup[0]; + + HDF_LOGI("%s: Init magnetic driver success", __func__); + return HDF_SUCCESS; +} + +void MagneticReleaseDriver(struct HdfDeviceObject *device) { + CHECK_NULL_PTR_RETURN(device); + + struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->detectFlag) { + MagneticReleaseCfgData(drvData->magneticCfg); + } + + OsalMemFree(drvData->magneticCfg); + drvData->magneticCfg = NULL; + + HdfWorkDestroy(&drvData->magneticWork); + HdfWorkQueueDestroy(&drvData->magneticWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorMagneticDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_MAGNETIC", + .Bind = MagneticBindDriver, + .Init = MagneticInitDriver, + .Release = MagneticReleaseDriver, +}; + HDF_INIT(g_sensorMagneticDevEntry); \ No newline at end of file diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.h b/model/sensor/driver/magnetic/sensor_magnetic_driver.h index 77e4a3963..7b51d1914 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.h +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.h @@ -1,66 +1,66 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SENSOR_MAGNETIC_DRIVER_H -#define SENSOR_MAGNETIC_DRIVER_H - -#include "hdf_workqueue.h" -#include "osal_mutex.h" -#include "osal_timer.h" -#include "sensor_config_parser.h" -#include "sensor_platform_if.h" - -#define MAGNETIC_DEFAULT_SAMPLING_200_MS 200000000 -#define MAGNETIC_CHIP_NAME_LSM303 "lsm303" - -enum MagneticAxisNum { - MAGNETIC_X_AXIS = 0, - MAGNETIC_Y_AXIS = 1, - MAGNETIC_Z_AXIS = 2, - MAGNETIC_AXIS_NUM = 3, -}; - -enum MagneticAxisPart { - MAGNETIC_X_AXIS_MSB = 0, - MAGNETIC_X_AXIS_LSB = 1, - MAGNETIC_Y_AXIS_MSB = 2, - MAGNETIC_Y_AXIS_LSB = 3, - MAGNETIC_Z_AXIS_MSB = 4, - MAGNETIC_Z_AXIS_LSB = 5, - MAGNETIC_AXIS_BUTT, -}; - -struct MagneticData { - int32_t x; - int32_t y; - int32_t z; -}; - -struct MagneticOpsCall { - int32_t (*Init)(struct SensorCfgData *data); - int32_t (*ReadData)(struct SensorCfgData *data); -}; - -struct MagneticDrvData { - struct IDeviceIoService ioService; - struct HdfDeviceObject *device; - HdfWorkQueue magneticWorkQueue; - HdfWork magneticWork; - OsalTimer magneticTimer; - bool detectFlag; - bool enable; - int64_t interval; - struct SensorCfgData *magneticCfg; - struct MagneticOpsCall ops; -}; - -int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops); -struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node); -void MagneticReleaseCfgData(struct SensorCfgData *sensorCfgData); - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_MAGNETIC_DRIVER_H +#define SENSOR_MAGNETIC_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_mutex.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define MAGNETIC_DEFAULT_SAMPLING_200_MS 200000000 +#define MAGNETIC_CHIP_NAME_LSM303 "lsm303" + +enum MagneticAxisNum { + MAGNETIC_X_AXIS = 0, + MAGNETIC_Y_AXIS = 1, + MAGNETIC_Z_AXIS = 2, + MAGNETIC_AXIS_NUM = 3, +}; + +enum MagneticAxisPart { + MAGNETIC_X_AXIS_MSB = 0, + MAGNETIC_X_AXIS_LSB = 1, + MAGNETIC_Y_AXIS_MSB = 2, + MAGNETIC_Y_AXIS_LSB = 3, + MAGNETIC_Z_AXIS_MSB = 4, + MAGNETIC_Z_AXIS_LSB = 5, + MAGNETIC_AXIS_BUTT, +}; + +struct MagneticData { + int32_t x; + int32_t y; + int32_t z; +}; + +struct MagneticOpsCall { + int32_t (*Init)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data); +}; + +struct MagneticDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue magneticWorkQueue; + HdfWork magneticWork; + OsalTimer magneticTimer; + bool detectFlag; + bool enable; + int64_t interval; + struct SensorCfgData *magneticCfg; + struct MagneticOpsCall ops; +}; + +int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops); +struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node); +void MagneticReleaseCfgData(struct SensorCfgData *sensorCfgData); + #endif /* SENSOR_MAGNETIC_DRIVER_H */ \ No newline at end of file -- Gitee From 6df451a98750a0197a7594c916667b28dceb26cc Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 08:54:34 +0800 Subject: [PATCH 004/272] modify_code Signed-off-by: YOUR_NAME --- .../driver/chipset/magnetic/magnetic_lsm303.c | 7 ++--- .../driver/chipset/magnetic/magnetic_lsm303.h | 28 +++++++++---------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c index 93ad331c9..4726b7671 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c @@ -100,9 +100,9 @@ int32_t ReadLsm303Data(struct SensorCfgData *data) event.option = 0; event.mode = SENSOR_WORK_MODE_REALTIME; - tmp[MAGNETIC_X_AXIS] = rawData.x * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47Ga; - tmp[MAGNETIC_Y_AXIS] = rawData.y * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47Ga; - tmp[MAGNETIC_Z_AXIS] = rawData.z * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_Z47Ga; + tmp[MAGNETIC_X_AXIS] = rawData.x * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47GA; + tmp[MAGNETIC_Y_AXIS] = rawData.y * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47GA; + tmp[MAGNETIC_Z_AXIS] = rawData.z * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_Z47GA; event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; @@ -121,7 +121,6 @@ static int32_t InitLsm303(struct SensorCfgData *data) CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); - if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Lsm303 sensor init config failed", __func__); return HDF_FAILURE; diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h index d9e1380b4..6d20e1968 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.h @@ -48,20 +48,20 @@ #define LSM303_GAIN_RATE_6 0XE0 /* MAGNETIC GAIN SENSITIVITY RANGE */ -#define LSM303DLHC_SENSITIVITY_XY13Ga 1100 -#define LSM303DLHC_SENSITIVITY_XY19Ga 855 -#define LSM303DLHC_SENSITIVITY_XY25Ga 670 -#define LSM303DLHC_SENSITIVITY_XY40Ga 450 -#define LSM303DLHC_SENSITIVITY_XY47Ga 400 -#define LSM303DLHC_SENSITIVITY_XY56Ga 330 -#define LSM303DLHC_SENSITIVITY_XY81Ga 230 -#define LSM303DLHC_SENSITIVITY_Z13Ga 980 -#define LSM303DLHC_SENSITIVITY_Z19Ga 760 -#define LSM303DLHC_SENSITIVITY_Z25Ga 600 -#define LSM303DLHC_SENSITIVITY_Z40Ga 400 -#define LSM303DLHC_SENSITIVITY_Z47Ga 355 -#define LSM303DLHC_SENSITIVITY_Z56Ga 295 -#define LSM303DLHC_SENSITIVITY_Z81Ga 205 +#define LSM303DLHC_SENSITIVITY_XY13GA 1100 +#define LSM303DLHC_SENSITIVITY_XY19GA 855 +#define LSM303DLHC_SENSITIVITY_XY25GA 670 +#define LSM303DLHC_SENSITIVITY_XY40GA 450 +#define LSM303DLHC_SENSITIVITY_XY47GA 400 +#define LSM303DLHC_SENSITIVITY_XY56GA 330 +#define LSM303DLHC_SENSITIVITY_XY81GA 230 +#define LSM303DLHC_SENSITIVITY_Z13GA 980 +#define LSM303DLHC_SENSITIVITY_Z19GA 760 +#define LSM303DLHC_SENSITIVITY_Z25GA 600 +#define LSM303DLHC_SENSITIVITY_Z40GA 400 +#define LSM303DLHC_SENSITIVITY_Z47GA 355 +#define LSM303DLHC_SENSITIVITY_Z56GA 295 +#define LSM303DLHC_SENSITIVITY_Z81GA 205 /* MAGNETIC MODE CONFIG */ #define LSM303_OPERATING_MODE_1 0X00 -- Gitee From 09e576385bd16aea8e77231c28a93ef45d2a3c13 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 10:22:05 +0800 Subject: [PATCH 005/272] modify2_code2 Signed-off-by: YOUR_NAME --- .../driver/magnetic/sensor_magnetic_driver.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index f8f1cd938..5b0eb96c9 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -311,18 +311,18 @@ BASE_CONFIG_EXIT: return NULL; } -void MagneticReleaseCfgData(struct SensorCfgData *MagneticCfg) +void MagneticReleaseCfgData(struct SensorCfgData *magneticCfg) { - CHECK_NULL_PTR_RETURN(MagneticCfg); + CHECK_NULL_PTR_RETURN(magneticCfg); - (void)DeleteSensorDevice(&MagneticCfg->sensorInfo); - ReleaseSensorAllRegConfig(MagneticCfg); - (void)ReleaseSensorBusHandle(&MagneticCfg->busCfg); + (void)DeleteSensorDevice(&magneticCfg->sensorInfo); + ReleaseSensorAllRegConfig(magneticCfg); + (void)ReleaseSensorBusHandle(&magneticCfg->busCfg); MagneticCfg->root = NULL; - (void)memset_s(&MagneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); - (void)memset_s(&MagneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&MagneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + (void)memset_s(&magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } int32_t MagneticInitDriver(struct HdfDeviceObject *device) @@ -348,7 +348,8 @@ int32_t MagneticInitDriver(struct HdfDeviceObject *device) return HDF_SUCCESS; } -void MagneticReleaseDriver(struct HdfDeviceObject *device) { +void MagneticReleaseDriver(struct HdfDeviceObject *device) +{ CHECK_NULL_PTR_RETURN(device); struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; -- Gitee From 1bd22a09fd6d1b6d6168e65df5287287de5fd4da Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 10:43:15 +0800 Subject: [PATCH 006/272] modify3_code3 Signed-off-by: YOUR_NAME --- model/sensor/driver/magnetic/sensor_magnetic_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index 5b0eb96c9..c614ba33b 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -319,7 +319,7 @@ void MagneticReleaseCfgData(struct SensorCfgData *magneticCfg) ReleaseSensorAllRegConfig(magneticCfg); (void)ReleaseSensorBusHandle(&magneticCfg->busCfg); - MagneticCfg->root = NULL; + magneticCfg->root = NULL; (void)memset_s(&magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); -- Gitee From 093501371b86e022f6993197d1fa4c52ae578305 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 20:45:44 +0800 Subject: [PATCH 007/272] =?UTF-8?q?=E5=85=B3=E4=BA=8EMIPI=20DSI=E7=9A=84DR?= =?UTF-8?q?M=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- include/platform/mipi_dsi_if.h | 12 ++++++++++ support/platform/include/mipi_dsi_core.h | 13 +++++++++++ support/platform/src/mipi_dsi_core.c | 29 +++++++++++++++++++++++- support/platform/src/mipi_dsi_if.c | 5 ++++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/include/platform/mipi_dsi_if.h b/include/platform/mipi_dsi_if.h index ca6b5d6cb..f3c3e6467 100644 --- a/include/platform/mipi_dsi_if.h +++ b/include/platform/mipi_dsi_if.h @@ -291,6 +291,18 @@ int32_t MipiDsiRx(DevHandle handle, struct DsiCmdDesc *cmd, int32_t readLen, uin */ int32_t MipiDsiAttach(DevHandle handle, uint8_t *name); +/** + * @brief Sets additional parameters for a MIPI DSI device. + * + * @param handle Indicates the MIPI DSI device handle obtained via {@link MipiDsiOpen}. + * @param panelData Indicates the pointer to the additional parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiDsiSetDrvData(DevHandle handle, DevHandle *panelData); + #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/include/mipi_dsi_core.h b/support/platform/include/mipi_dsi_core.h index 58fa709c0..a5ec09412 100644 --- a/support/platform/include/mipi_dsi_core.h +++ b/support/platform/include/mipi_dsi_core.h @@ -45,6 +45,7 @@ struct MipiDsiCntlrMethod { void (*exitUlps)(struct MipiDsiCntlr *cntlr); int32_t (*powerControl)(struct MipiDsiCntlr *cntlr, uint8_t enable); int32_t (*attach)(struct MipiDsiCntlr *cntlr, uint8_t *name); + int32_t (*setDrvData)(struct MipiDsiCntlr *cntlr, DevHandle *panelData); }; int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject *device); @@ -160,6 +161,18 @@ int32_t MipiDsiCntlrRx(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd, int32 */ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name); +/** + * @brief Sets additional parameters for a MIPI DSI device. + * + * @param cntlr Indicates the MIPI DSI device obtained via {@link MipiDsiOpen}. + * @param panelData Indicates the pointer to the additional parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, DevHandle *panelData); + #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/src/mipi_dsi_core.c b/support/platform/src/mipi_dsi_core.c index 8d75f5b13..51ec6d352 100644 --- a/support/platform/src/mipi_dsi_core.c +++ b/support/platform/src/mipi_dsi_core.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -352,3 +352,30 @@ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name) return ret; } + +int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, DevHandle *panelData) +{ + int32_t ret; + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + + if (cntlr->ops->setDrvData == NULL) { + HDF_LOGE("%s: setDrvData is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setDrvData(cntlr, panelData); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} diff --git a/support/platform/src/mipi_dsi_if.c b/support/platform/src/mipi_dsi_if.c index a1c482749..afd5d260a 100755 --- a/support/platform/src/mipi_dsi_if.c +++ b/support/platform/src/mipi_dsi_if.c @@ -55,3 +55,8 @@ int32_t MipiDsiAttach(DevHandle handle, uint8_t *name) { return MipiDsiCntlrAttach((struct MipiDsiCntlr *)handle, name); } + +int32_t MipiDsiSetDrvData(DevHandle handle, DevHandle *panelData) +{ + return MipiDsiCntlrSetDrvData((struct MipiDsiCntlr *)handle, panelData); +} -- Gitee From 8445ac455ec3cfab0a733a7824833f89c31bb9bf Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 12:54:10 +0000 Subject: [PATCH 008/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 248 +++++++++++++++++++++++ model/input/driver/hdf_encoder.h | 30 +++ model/input/driver/input_config.h | 9 + model/input/driver/input_config_parser.c | 29 ++- 4 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 model/input/driver/hdf_encoder.c create mode 100644 model/input/driver/hdf_encoder.h diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c new file mode 100644 index 000000000..180c7d749 --- /dev/null +++ b/model/input/driver/hdf_encoder.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_encoder.h" +#include "hdf_device_desc.h" +#include "osal_mem.h" +#include "osal_timer.h" +#include "gpio_if.h" +#include "hdf_log.h" +#include "event_hub.h" + + +static void EncoderTimerFunc(uintptr_t arg) +{ + EncoderDriver *encoderDrv = (EncoderDriver *)arg; + uint16_t gpioClk = encoderDrv->encoderCfg->gpioClk; + uint16_t gpioData = encoderDrv->encoderCfg->gpioData; + uint16_t gpioSW = encoderDrv->encoderCfg->gpioSW; + + int32_t ret = GpioRead(gpioClk, &encoderDrv->encoderClkNowSta); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return; + } + ret = GpioRead(gpioData, &encoderDrv->encoderDataNowSta); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return; + } + + if (encoderDrv->encoderClkNowSta != encoderDrv->encoderClkPreSta) { + if (encoderDrv->encoderClkNowSta == 0) { + if (encoderDrv->encoderDataNowSta == 1) { + input_report_rel(encoderDrv->inputDev,REL_WHEEL, 1); + } else { + input_report_rel(encoderDrv->inputDev,REL_WHEEL, -1); + } + input_sync(encoderDrv->inputDev); + } + encoderDrv->encoderClkPreSta = encoderDrv->encoderClkNowSta; + encoderDrv->encoderDataPreSta = encoderDrv->encoderDataNowSta; + } +} + +static EncoderCfg *EncoderConfigInstance(struct HdfDeviceObject *device) +{ + EncoderCfg *encoderCfg = (EncoderCfg *)OsalMemAlloc(sizeof(EncoderCfg)); + if (encoderCfg == NULL) { + HDF_LOGE("%s: malloc encoder config failed", __func__); + return NULL; + } + int32_t ret = memset_s(encoderCfg, sizeof(EncoderCfg), 0, sizeof(EncoderCfg)); + if (ret != 0) { + HDF_LOGE("%s: memset_s encoder config failed", __func__); + OsalMemFree(encoderCfg); + return NULL; + } + encoderCfg->hdfEncoderDev = device; + + if (ParseEncoderConfig(device->property, encoderCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: parse encoder config failed", __func__); + OsalMemFree(encoderCfg); + return NULL; + } + return encoderCfg; +} + +static EncoderDriver *EncoderDriverInstance(EncoderCfg *encoderCfg) +{ + EncoderDriver *encoderDrv = (EncoderDriver *)OsalMemAlloc(sizeof(EncoderDriver)); + if (encoderDrv == NULL) { + HDF_LOGE("%s: malloc key driver failed", __func__); + return NULL; + } + int32_t ret = memset_s(encoderDrv, sizeof(EncoderDriver), 0, sizeof(EncoderDriver)); + if (ret != 0) { + HDF_LOGE("%s: memset encoder driver failed", __func__); + OsalMemFree(encoderDrv); + return NULL; + } + + encoderDrv->devType = encoderCfg->devType; + encoderDrv->encoderCfg = encoderCfg; + + return encoderDrv; +} + +static int32_t EncoderInit(EncoderDriver *EncoderDrv) +{ + uint16_t gpioClk = EncoderDrv->encoderCfg->gpioClk; + uint16_t gpioData = EncoderDrv->encoderCfg->gpioData; + uint16_t gpioSW = EncoderDrv->encoderCfg->gpioSW; + GpioSetDir(gpioClk, GPIO_DIR_IN); + GpioSetDir(gpioData, GPIO_DIR_IN); + GpioSetDir(gpioSW, GPIO_DIR_IN); + + int32_t ret = OsalTimerCreate(&EncoderDrv->timer, 10, EncoderTimerFunc, EncoderDrv); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: create timer failed, ret = %d\n", __func__, ret); + return HDF_FAILURE; + } + ret = OsalTimerStartLoop(&EncoderDrv->timer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: start timer failed, ret = %d\n", __func__, ret); + return HDF_FAILURE; + } + + ret = GpioRead(gpioClk, &EncoderDrv->encoderClkNowSta); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return HDF_FAILURE; + } + ret = GpioRead(gpioData, &EncoderDrv->encoderDataNowSta); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return HDF_FAILURE; + } + + EncoderDrv->encoderClkPreSta = EncoderDrv->encoderClkNowSta; + EncoderDrv->encoderDataPreSta = EncoderDrv->encoderDataNowSta; + + return HDF_SUCCESS; +} + +static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) +{ + InputDevice *inputDev = (InputDevice *)OsalMemAlloc(sizeof(InputDevice)); + if (inputDev == NULL) { + HDF_LOGE("%s: malloc input device failed", __func__); + return NULL; + } + int32_t ret = memset_s(inputDev, sizeof(InputDevice), 0, sizeof(InputDevice)); + if (ret != 0) { + HDF_LOGE("%s: memset encoder driver failed", __func__); + OsalMemFree(inputDev); + return NULL; + } + + inputDev->pvtData = (void *)encoderDrv; + inputDev->devType = encoderDrv->devType; + inputDev->hdfDevObj = encoderDrv->encoderCfg->hdfEncoderDev; + encoderDrv->inputdev = inputDev; + + return inputDev; +} + +static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg) +{ + EncoderDriver *EncoderDrv = EncoderDriverInstance(encoderCfg); + if (EncoderDrv == NULL) { + HDF_LOGE("%s: instance encoder driver failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + int32_t ret = EncoderInit(EncoderDrv); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: key driver init failed, ret %d", __func__, ret); + goto EXIT; + } + + InputDevice *inputDev = InputDeviceInstance(EncoderDrv); + if (inputDev == NULL) { + HDF_LOGE("%s: instance input device failed", __func__); + goto EXIT; + } + + ret = RegisterInputDevice(inputDev); + if (ret != HDF_SUCCESS) { + goto EXIT1; + } + return HDF_SUCCESS; + +EXIT1: + OsalMemFree(inputDev->pkgBuf); + OsalMemFree(inputDev); +EXIT: + OsalMemFree(EncoderDrv); + return HDF_FAILURE; +} + +static int32_t HdfEnCoderDriverInit(struct HdfDeviceObject *device) +{ + if (device == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_ERR_INVALID_PARAM; + } + + EncoderCfg *encoderCfg = EncoderConfigInstance(device); + if (encoderCfg == NULL) { + HDF_LOGE("%s: instance encoder config failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + int32_t ret = RegisterEncoderDevice(encoderCfg); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + HDF_LOGI("%s: exit succ!", __func__); + return HDF_SUCCESS; + +EXIT: + OsalMemFree(encoderCfg); + return HDF_FAILURE; +} + +static int32_t HdfEnCoderDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)cmd; + if (client == NULL || data == NULL || reply == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static void HdfEncoderDriverRelease(struct HdfDeviceObject *device) +{ + (void)device; +} + +static int32_t HdfEnCoderDriverBind(struct HdfDeviceObject *device) +{ + if (device == NULL) { + return HDF_ERR_INVALID_PARAM; + } + static struct IDeviceIoService enCoderService = { + .object.objectId = 1, + .Dispatch = HdfEnCoderDispatch, + }; + device->service = &enCoderService; + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_hdfEnCoderEntry = { + .moduleVersion = 1, + .moduleName = "HDF_ENCODER", + .Bind = HdfEnCoderDriverBind, + .Init = HdfEnCoderDriverInit, + .Release = HdfEncoderDriverRelease, +}; + +HDF_INIT(g_hdfEnCoderEntry); diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h new file mode 100644 index 000000000..3233f8dea --- /dev/null +++ b/model/input/driver/hdf_encoder.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#ifndef HDF_ENCODER_H +#define HDF_ENCODER_H + +#include +#include "osal_time.h" +#include "osal_timer.h" +#include "input_config.h" +#include "hdf_input_device_manager.h" + + +typedef struct EncoderDriverInfo { + struct HdfDeviceObject *hdfEncoderDev; + uint8_t devType; + EncoderCfg *encoderCfg; + InputDevice *inputdev; + OsalTimer timer; + uint16_t encoderClkPreSta; + uint16_t encoderClkNowSta; + uint16_t encoderDataPreSta; + uint16_t encoderDataNowSta; +} EncoderDriver; + +#endif \ No newline at end of file diff --git a/model/input/driver/input_config.h b/model/input/driver/input_config.h index e44d400cc..ee25b9f2c 100644 --- a/model/input/driver/input_config.h +++ b/model/input/driver/input_config.h @@ -140,8 +140,17 @@ typedef struct { uint32_t debounceTime; } KeyChipCfg; +typedef struct { + struct HdfDeviceObject *hdfEncoderDev; + uint8_t devType; + uint16_t gpioClk; + uint16_t gpioData; + uint16_t gpioSW; +} EncoderCfg; + int32_t ParseTouchBoardConfig(const struct DeviceResourceNode *node, TouchBoardCfg *config); int32_t ParseTouchChipConfig(const struct DeviceResourceNode *node, TouchChipCfg *config); int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config); +int32_t ParseEncoderConfig(const struct DeviceResourceNode *node, EncoderCfg *config); #endif \ No newline at end of file diff --git a/model/input/driver/input_config_parser.c b/model/input/driver/input_config_parser.c index f6c49ebab..01bc6524e 100644 --- a/model/input/driver/input_config_parser.c +++ b/model/input/driver/input_config_parser.c @@ -43,7 +43,7 @@ int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config ret = parser->GetUint8(keyNode, "inputType", &config->devType, 0); CHECK_PARSER_RET(ret, "GetUint8"); ret = parser->GetUint16(keyNode, "gpioNum", &config->gpioNum, 0); - CHECK_PARSER_RET(ret, "GetUint32"); + CHECK_PARSER_RET(ret, "GetUint16"); ret = parser->GetUint16(keyNode, "irqFlag", &config->irqFlag, 0); CHECK_PARSER_RET(ret, "GetUint8"); ret = parser->GetUint32(keyNode, "debounceTime", &config->debounceTime, 0); @@ -52,6 +52,33 @@ int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config return HDF_SUCCESS; } +int32_t ParseEncoderConfig(const struct DeviceResourceNode *node, EncoderCfg *config) +{ + if (node == NULL || config == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_FAILURE; + } + + struct DeviceResourceIface *parser = NULL; + parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (parser == NULL) { + HDF_LOGE("%s: instance parser failed", __func__); + return HDF_FAILURE; + } + + const struct DeviceResourceNode *encoderNode = node; + int32_t ret = parser->GetUint8(encoderNode, "inputType", &config->devType, 0); + CHECK_PARSER_RET(ret, "GetUint8"); + ret = parser->GetUint16(encoderNode, "gpioClk", &config->gpioClk, 0); + CHECK_PARSER_RET(ret, "GetUint16"); + ret = parser->GetUint16(encoderNode, "gpioDT", &config->gpioData, 0); + CHECK_PARSER_RET(ret, "GetUint16"); + ret = parser->GetUint16(encoderNode, "gpioSW", &config->gpioSW, 0); + CHECK_PARSER_RET(ret, "GetUint16"); + + return HDF_SUCCESS; +} + static int32_t ParseAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, BoardAttrCfg *attr) { -- Gitee From e4e005aa12999037ef903a1b486cea3f25a56bfc Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:02:52 +0000 Subject: [PATCH 009/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 180c7d749..e2e8cc8e9 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -14,6 +14,8 @@ #include "hdf_log.h" #include "event_hub.h" +#define TIMER_INTERVAL_ENCODER 10 + static void EncoderTimerFunc(uintptr_t arg) { @@ -99,7 +101,7 @@ static int32_t EncoderInit(EncoderDriver *EncoderDrv) GpioSetDir(gpioData, GPIO_DIR_IN); GpioSetDir(gpioSW, GPIO_DIR_IN); - int32_t ret = OsalTimerCreate(&EncoderDrv->timer, 10, EncoderTimerFunc, EncoderDrv); + int32_t ret = OsalTimerCreate(&EncoderDrv->timer, TIMER_INTERVAL_ENCODER, EncoderTimerFunc, EncoderDrv); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: create timer failed, ret = %d\n", __func__, ret); return HDF_FAILURE; -- Gitee From 5ce5568ebcdcf1a50fd3b653be3b3b7e5b8771ac Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:13:50 +0000 Subject: [PATCH 010/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index e2e8cc8e9..df6c8cb9d 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -16,7 +16,6 @@ #define TIMER_INTERVAL_ENCODER 10 - static void EncoderTimerFunc(uintptr_t arg) { EncoderDriver *encoderDrv = (EncoderDriver *)arg; @@ -26,21 +25,21 @@ static void EncoderTimerFunc(uintptr_t arg) int32_t ret = GpioRead(gpioClk, &encoderDrv->encoderClkNowSta); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); - return; + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return; } ret = GpioRead(gpioData, &encoderDrv->encoderDataNowSta); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); - return; + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return; } if (encoderDrv->encoderClkNowSta != encoderDrv->encoderClkPreSta) { if (encoderDrv->encoderClkNowSta == 0) { if (encoderDrv->encoderDataNowSta == 1) { - input_report_rel(encoderDrv->inputDev,REL_WHEEL, 1); + input_report_rel(encoderDrv->inputDev, REL_WHEEL, 1); } else { - input_report_rel(encoderDrv->inputDev,REL_WHEEL, -1); + input_report_rel(encoderDrv->inputDev, REL_WHEEL, -1); } input_sync(encoderDrv->inputDev); } @@ -108,19 +107,19 @@ static int32_t EncoderInit(EncoderDriver *EncoderDrv) } ret = OsalTimerStartLoop(&EncoderDrv->timer); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: start timer failed, ret = %d\n", __func__, ret); - return HDF_FAILURE; + HDF_LOGE("%s: start timer failed, ret = %d\n", __func__, ret); + return HDF_FAILURE; } ret = GpioRead(gpioClk, &EncoderDrv->encoderClkNowSta); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); - return HDF_FAILURE; + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return HDF_FAILURE; } ret = GpioRead(gpioData, &EncoderDrv->encoderDataNowSta); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); - return HDF_FAILURE; + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return HDF_FAILURE; } EncoderDrv->encoderClkPreSta = EncoderDrv->encoderClkNowSta; @@ -211,7 +210,8 @@ EXIT: return HDF_FAILURE; } -static int32_t HdfEnCoderDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t HdfEnCoderDispatch(struct HdfDeviceIoClient *client, int cmd, + struct HdfSBuf *data, struct HdfSBuf *reply) { (void)cmd; if (client == NULL || data == NULL || reply == NULL) { -- Gitee From f9d167e55156ff357a486b1fe0d511496d83e84d Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:16:16 +0000 Subject: [PATCH 011/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index 3233f8dea..b7ce9272a 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -19,7 +19,7 @@ typedef struct EncoderDriverInfo { struct HdfDeviceObject *hdfEncoderDev; uint8_t devType; EncoderCfg *encoderCfg; - InputDevice *inputdev; + InputDevice *inputDev; OsalTimer timer; uint16_t encoderClkPreSta; uint16_t encoderClkNowSta; -- Gitee From caec0358858be96f452662bfc1459fb5aad4baef Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:18:54 +0000 Subject: [PATCH 012/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 7 ++++--- model/input/driver/hdf_encoder.h | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index df6c8cb9d..5c09d646b 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -7,12 +7,13 @@ */ #include "hdf_encoder.h" -#include "hdf_device_desc.h" +#include "event_hub.h" +#include "gpio_if.h" #include "osal_mem.h" #include "osal_timer.h" -#include "gpio_if.h" #include "hdf_log.h" -#include "event_hub.h" +#include "hdf_device_desc.h" + #define TIMER_INTERVAL_ENCODER 10 diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index b7ce9272a..158cc73c6 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -8,11 +8,11 @@ #ifndef HDF_ENCODER_H #define HDF_ENCODER_H -#include -#include "osal_time.h" -#include "osal_timer.h" #include "input_config.h" #include "hdf_input_device_manager.h" +#include "osal_time.h" +#include "osal_timer.h" +#include typedef struct EncoderDriverInfo { -- Gitee From 651e9956c802b7a6f3aa4b16f60916edc5f8b3d1 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:30:43 +0000 Subject: [PATCH 013/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 5c09d646b..dd117544f 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -146,7 +146,7 @@ static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) inputDev->pvtData = (void *)encoderDrv; inputDev->devType = encoderDrv->devType; inputDev->hdfDevObj = encoderDrv->encoderCfg->hdfEncoderDev; - encoderDrv->inputdev = inputDev; + encoderDrv->inputDev = inputDev; return inputDev; } -- Gitee From 6b6de0db53191c7406accca2741afb3abdbd37f9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 7 Sep 2021 13:49:54 +0000 Subject: [PATCH 014/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index dd117544f..46b79053c 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -143,6 +143,13 @@ static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) return NULL; } + ret = OsalMutexInit(&inputDev->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init mutex error", __func__); + OsalMemFree(inputDev); + return NULL; + } + inputDev->pvtData = (void *)encoderDrv; inputDev->devType = encoderDrv->devType; inputDev->hdfDevObj = encoderDrv->encoderCfg->hdfEncoderDev; -- Gitee From 765dc7abe0f894e8912d0278183aaa86a177bc5c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 8 Sep 2021 01:31:38 +0000 Subject: [PATCH 015/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 20 +++++++++++++++++--- model/input/driver/hdf_encoder.h | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 46b79053c..445d62c92 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -158,13 +158,14 @@ static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) return inputDev; } -static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg) +static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg, struct HdfDeviceObject *device) { EncoderDriver *EncoderDrv = EncoderDriverInstance(encoderCfg); if (EncoderDrv == NULL) { HDF_LOGE("%s: instance encoder driver failed", __func__); return HDF_ERR_MALLOC_FAIL; } + device->priv = (void *)EncoderDrv; int32_t ret = EncoderInit(EncoderDrv); if (ret != HDF_SUCCESS) { @@ -205,7 +206,7 @@ static int32_t HdfEnCoderDriverInit(struct HdfDeviceObject *device) return HDF_ERR_MALLOC_FAIL; } - int32_t ret = RegisterEncoderDevice(encoderCfg); + int32_t ret = RegisterEncoderDevice(encoderCfg, device); if (ret != HDF_SUCCESS) { goto EXIT; } @@ -231,7 +232,20 @@ static int32_t HdfEnCoderDispatch(struct HdfDeviceIoClient *client, int cmd, static void HdfEncoderDriverRelease(struct HdfDeviceObject *device) { - (void)device; + EncoderDriver *driver = NULL; + InputDevice *inputDev = NULL; + + if (device == NULL || device->priv == NULL) { + HDF_LOGE("%s: param is null", __func__); + return; + } + driver = (EncoderDriver *)device->priv; + inputDev = driver->inputDev; + if (inputDev != NULL) { + UnregisterInputDevice(inputDev); + driver->inputDev = NULL; + } + OsalMemFree(driver); } static int32_t HdfEnCoderDriverBind(struct HdfDeviceObject *device) diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index 158cc73c6..37e92db21 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -8,8 +8,8 @@ #ifndef HDF_ENCODER_H #define HDF_ENCODER_H -#include "input_config.h" #include "hdf_input_device_manager.h" +#include "input_config.h" #include "osal_time.h" #include "osal_timer.h" #include -- Gitee From 8cd7187e831d6ee7750092e3ccfa292718fb61be Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 8 Sep 2021 02:54:38 +0000 Subject: [PATCH 016/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 11 ++++++++++- model/input/driver/hdf_encoder.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 445d62c92..eaab0f338 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -15,7 +15,7 @@ #include "hdf_device_desc.h" -#define TIMER_INTERVAL_ENCODER 10 +#define TIMER_INTERVAL_ENCODER 5 static void EncoderTimerFunc(uintptr_t arg) { @@ -34,6 +34,11 @@ static void EncoderTimerFunc(uintptr_t arg) HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); return; } + ret = GpioRead(gpioSW, &encoderDrv->encoderSW); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return; + } if (encoderDrv->encoderClkNowSta != encoderDrv->encoderClkPreSta) { if (encoderDrv->encoderClkNowSta == 0) { @@ -47,6 +52,10 @@ static void EncoderTimerFunc(uintptr_t arg) encoderDrv->encoderClkPreSta = encoderDrv->encoderClkNowSta; encoderDrv->encoderDataPreSta = encoderDrv->encoderDataNowSta; } + if (encoderDrv->encoderSW == 0) { + input_report_key(encoderDrv->inputDev, KEY_OK, 0); + input_sync(encoderDrv->inputDev); + } } static EncoderCfg *EncoderConfigInstance(struct HdfDeviceObject *device) diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index 37e92db21..c9574d3f7 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -25,6 +25,7 @@ typedef struct EncoderDriverInfo { uint16_t encoderClkNowSta; uint16_t encoderDataPreSta; uint16_t encoderDataNowSta; + uint16_t encoderSW; } EncoderDriver; #endif \ No newline at end of file -- Gitee From a6d2b3abac4e3a6d0c92f15aa620bd0001a53c46 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 8 Sep 2021 03:04:54 +0000 Subject: [PATCH 017/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 3 +-- model/input/driver/hdf_encoder.h | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index eaab0f338..56b513bff 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -14,7 +14,6 @@ #include "hdf_log.h" #include "hdf_device_desc.h" - #define TIMER_INTERVAL_ENCODER 5 static void EncoderTimerFunc(uintptr_t arg) diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index c9574d3f7..d5d431615 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -8,12 +8,11 @@ #ifndef HDF_ENCODER_H #define HDF_ENCODER_H +#include #include "hdf_input_device_manager.h" #include "input_config.h" #include "osal_time.h" #include "osal_timer.h" -#include - typedef struct EncoderDriverInfo { struct HdfDeviceObject *hdfEncoderDev; -- Gitee From b818a571b63b9a9b10ac6ff00ed0872f188dde6f Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 8 Sep 2021 04:04:43 +0000 Subject: [PATCH 018/272] add ec11 Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 16 +++++++++++++--- model/input/driver/hdf_encoder.h | 3 ++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 56b513bff..134b8f610 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -33,7 +33,7 @@ static void EncoderTimerFunc(uintptr_t arg) HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); return; } - ret = GpioRead(gpioSW, &encoderDrv->encoderSW); + ret = GpioRead(gpioSW, &encoderDrv->encoderSWNowSta); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); return; @@ -51,8 +51,13 @@ static void EncoderTimerFunc(uintptr_t arg) encoderDrv->encoderClkPreSta = encoderDrv->encoderClkNowSta; encoderDrv->encoderDataPreSta = encoderDrv->encoderDataNowSta; } - if (encoderDrv->encoderSW == 0) { - input_report_key(encoderDrv->inputDev, KEY_OK, 0); + if (encoderDrv->encoderSWPreSta != encoderDrv->encoderSWNowSta) { + if (encoderDrv->encoderSWNowSta == 0) { + input_report_key(encoderDrv->inputDev, KEY_OK, 0); + } else { + input_report_key(encoderDrv->inputDev, KEY_OK, 1); + } + encoderDrv->encoderSWPreSta = encoderDrv->encoderSWNowSta; input_sync(encoderDrv->inputDev); } } @@ -130,6 +135,11 @@ static int32_t EncoderInit(EncoderDriver *EncoderDrv) HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); return HDF_FAILURE; } + ret = GpioRead(gpioSW, &EncoderDrv->encoderSWNowSta); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); + return HDF_FAILURE; + } EncoderDrv->encoderClkPreSta = EncoderDrv->encoderClkNowSta; EncoderDrv->encoderDataPreSta = EncoderDrv->encoderDataNowSta; diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index d5d431615..0456fcfc4 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -24,7 +24,8 @@ typedef struct EncoderDriverInfo { uint16_t encoderClkNowSta; uint16_t encoderDataPreSta; uint16_t encoderDataNowSta; - uint16_t encoderSW; + uint16_t encoderSWPreSta; + uint16_t encoderSWNowSta } EncoderDriver; #endif \ No newline at end of file -- Gitee From e871a956127eaea50a7767229756652a8f4f7835 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Wed, 8 Sep 2021 19:24:46 +0800 Subject: [PATCH 019/272] add the macro definition to avoid linux test error Signed-off-by: jiaziyang --- test/unittest/platform/common/uart_test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/unittest/platform/common/uart_test.c b/test/unittest/platform/common/uart_test.c index 7700323b3..d926be92d 100644 --- a/test/unittest/platform/common/uart_test.c +++ b/test/unittest/platform/common/uart_test.c @@ -35,10 +35,12 @@ static int32_t UartWriteTest(struct UartTest *test) static int32_t UartReadTest(struct UartTest *test) { +#ifdef __LITEOS__ if (UartSetTransMode(test->handle, UART_MODE_RD_NONBLOCK) != HDF_SUCCESS) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; - } + } +#endif if (UartRead(test->handle, test->rbuf, test->len) != 0) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; -- Gitee From 777c03a4e322e533ca4082f889493d68523d902d Mon Sep 17 00:00:00 2001 From: laokz Date: Wed, 8 Sep 2021 22:36:57 +0800 Subject: [PATCH 020/272] =?UTF-8?q?fix(hid=5Fadapter):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8DGetInfoFromCache=E7=9A=84HidInfo=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 该参数用于获取缓存的数据地址,因此应将HidInfo*类型调整 为HidInfo**类型 Signed-off-by: laokz Change-Id: I421ac135e62ecbe468547896d892ea6099fba5e6 --- model/input/driver/hdf_hid_adapter.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/model/input/driver/hdf_hid_adapter.c b/model/input/driver/hdf_hid_adapter.c index 1ab568243..3ebda661b 100644 --- a/model/input/driver/hdf_hid_adapter.c +++ b/model/input/driver/hdf_hid_adapter.c @@ -114,12 +114,12 @@ static int32_t SetInputDevAbsAttr(InputDevice *inputDev, HidInfo *info) return HDF_SUCCESS; } -static int32_t GetInfoFromCache(InputDevice *inputDev, HidInfo *info) +static int32_t GetInfoFromCache(InputDevice *inputDev, HidInfo **info) { int32_t id = 0; while (id < MAX_INPUT_DEV_NUM) { if (g_cachedInfo[id] != NULL && !strcmp(inputDev->devName, g_cachedInfo[id]->devName)) { - info = g_cachedInfo[id]; + *info = g_cachedInfo[id]; break; } id++; @@ -137,7 +137,7 @@ static void SetInputDevAbility(InputDevice *inputDev) uint32_t len; int32_t ret; - ret = GetInfoFromCache(inputDev, info); + ret = GetInfoFromCache(inputDev, &info); MEMCPY_CHECK_RETURN(ret); len = sizeof(unsigned long); ret = memcpy_s(inputDev->abilitySet.devProp, len * BITS_TO_LONG(INPUT_PROP_CNT), -- Gitee From bc5e49f3ff8f8cf85a330704dd7e0a8b8a1243e1 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 9 Sep 2021 14:18:44 +0800 Subject: [PATCH 021/272] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Sensor=20=E6=8E=A5?= =?UTF-8?q?=E8=BF=91=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- .../proximity/sensor_proximity_driver.c | 374 ++++++++++++++++++ .../proximity/sensor_proximity_driver.h | 48 +++ 2 files changed, 422 insertions(+) create mode 100644 model/sensor/driver/proximity/sensor_proximity_driver.c create mode 100644 model/sensor/driver/proximity/sensor_proximity_driver.h diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.c b/model/sensor/driver/proximity/sensor_proximity_driver.c new file mode 100644 index 000000000..9b2c6f574 --- /dev/null +++ b/model/sensor/driver/proximity/sensor_proximity_driver.c @@ -0,0 +1,374 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_proximity_driver.h" +#include +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_proximity_driver_c + +#define HDF_PROXIMITY_WORK_QUEUE_NAME "hdf_proximity_work_queue" + +static struct ProximityDrvData *g_proximityDrvData = NULL; + +static struct ProximityDrvData *ProximityGetDrvData(void) +{ + return g_proximityDrvData; +} + +static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; + +int32_t ProximityRegisterChipOps(const struct ProximityOpsCall *ops) +{ + struct ProximityDrvData *drvData = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); + + drvData = ProximityGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + drvData->ops.Init = ops->Init; + drvData->ops.ReadData = ops->ReadData; + return HDF_SUCCESS; +} + +static void ProximityDataWorkEntry(void *arg) +{ + int32_t ret; + struct ProximityDrvData *drvData = (struct ProximityDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + CHECK_NULL_PTR_RETURN(drvData->ops.ReadData); + + ret = drvData->ops.ReadData(drvData->proximityCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity read data failed", __func__); + return; + } +} + +static void ProximityTimerEntry(uintptr_t arg) +{ + int64_t interval; + int32_t ret; + struct ProximityDrvData *drvData = (struct ProximityDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->proximityWorkQueue, &drvData->proximityWork)) { + HDF_LOGE("%s: proximity add work queue failed", __func__); + } + + interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; + ret = OsalTimerSetTimeout(&drvData->proximityTimer, interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity modify time failed", __func__); + } +} + +static int32_t InitProximityData(struct ProximityDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->proximityWorkQueue, HDF_PROXIMITY_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: proximity init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->proximityWork, ProximityDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: proximity create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = SENSOR_TIMER_MIN_TIME; + drvData->initStatus = true; + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetProximityEnable(void) +{ + int32_t ret; + struct ProximityDrvData *drvData = ProximityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->proximityCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: proximity sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->proximityCfg->busCfg, drvData->proximityCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity sensor enable config failed", __func__); + return ret; + } + + ret = OsalTimerCreate(&drvData->proximityTimer, SENSOR_TIMER_MIN_TIME, ProximityTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->proximityTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetProximityDisable(void) +{ + int32_t ret; + struct ProximityDrvData *drvData = ProximityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->proximityCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: proximity sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->proximityCfg->busCfg, + drvData->proximityCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity sensor disable config failed", __func__); + return ret; + } + + ret = OsalTimerDelete(&drvData->proximityTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: proximity delete timer failed", __func__); + return ret; + } + drvData->enable = false; + return HDF_SUCCESS; +} + +static int32_t SetProximityBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + struct ProximityDrvData *drvData = NULL; + + drvData = ProximityGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->interval = samplingInterval; + + return HDF_SUCCESS; +} + +static int32_t SetProximityMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetProximityOption(uint32_t option) +{ + (void)option; + return HDF_SUCCESS; +} + +static int32_t DispatchProximity(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t ProximityBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + HDF_LOGI("%s: enter", __func__); + struct ProximityDrvData *drvData = (struct ProximityDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGI("%s: malloc proximity drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchProximity; + drvData->device = device; + device->service = &drvData->ioService; + g_proximityDrvData = drvData; + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +static int32_t InitProximityOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + struct ProximityDrvData *drvData = ProximityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetProximityEnable; + deviceInfo->ops.Disable = SetProximityDisable; + deviceInfo->ops.SetBatch = SetProximityBatch; + deviceInfo->ops.SetMode = SetProximityMode; + deviceInfo->ops.SetOption = SetProximityOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitProximityAfterDetected(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitProximityOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init proximity ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add proximity device failed", __func__); + return HDF_FAILURE; + } + + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct SensorCfgData *ProximityCreateCfgData(const struct DeviceResourceNode *node) +{ + struct ProximityDrvData *drvData = ProximityGetDrvData(); + + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Proximity node pointer NULL", __func__); + return NULL; + } + + if (drvData->detectFlag) { + HDF_LOGE("%s: Proximity sensor have detected", __func__); + return NULL; + } + + if (drvData->proximityCfg == NULL) { + HDF_LOGE("%s: Proximity proximityCfg pointer NULL", __func__); + return NULL; + } + + if (GetSensorBaseConfigData(node, drvData->proximityCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + + if (DetectSensorDevice(drvData->proximityCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Proximity sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + + drvData->detectFlag = true; + if (InitProximityAfterDetected(drvData->proximityCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Proximity sensor detect device no exist", __func__); + goto INIT_EXIT; + } + return drvData->proximityCfg; + +INIT_EXIT: + (void)ReleaseSensorBusHandle(&drvData->proximityCfg->busCfg); +BASE_CONFIG_EXIT: + drvData->proximityCfg->root = NULL; + (void)memset_s(&drvData->proximityCfg->sensorInfo, sizeof(struct SensorBasicInfo), + 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->proximityCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->proximityCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + return NULL; +} + +void ProximityReleaseCfgData(struct SensorCfgData *proximityCfg) +{ + CHECK_NULL_PTR_RETURN(proximityCfg); + + (void)DeleteSensorDevice(&proximityCfg->sensorInfo); + ReleaseSensorAllRegConfig(proximityCfg); + (void)ReleaseSensorBusHandle(&proximityCfg->busCfg); + + proximityCfg->root = NULL; + (void)memset_s(&proximityCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&proximityCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&proximityCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t ProximityInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct ProximityDrvData *drvData = (struct ProximityDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitProximityData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init accel config failed", __func__); + return HDF_FAILURE; + } + + drvData->proximityCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->proximityCfg)); + if (drvData->proximityCfg == NULL) { + HDF_LOGE("%s: Malloc proximity config data failed", __func__); + return HDF_FAILURE; + } + + drvData->proximityCfg->regCfgGroup = &g_regCfgGroup[0]; + + HDF_LOGI("%s: Init proximity driver success", __func__); + return HDF_SUCCESS; +} + +void ProximityReleaseDriver(struct HdfDeviceObject *device) +{ + HDF_LOGI("%s: enter", __func__); + CHECK_NULL_PTR_RETURN(device); + + struct ProximityDrvData *drvData = (struct ProximityDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->detectFlag) { + ProximityReleaseCfgData(drvData->proximityCfg); + } + + OsalMemFree(drvData->proximityCfg); + drvData->proximityCfg = NULL; + + HdfWorkDestroy(&drvData->proximityWork); + HdfWorkQueueDestroy(&drvData->proximityWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorProximityDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_PROXIMITY", + .Bind = ProximityBindDriver, + .Init = ProximityInitDriver, + .Release = ProximityReleaseDriver, +}; + +HDF_INIT(g_sensorProximityDevEntry); \ No newline at end of file diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.h b/model/sensor/driver/proximity/sensor_proximity_driver.h new file mode 100644 index 000000000..50d83d42c --- /dev/null +++ b/model/sensor/driver/proximity/sensor_proximity_driver.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_PROXIMITY_DRIVER_H +#define SENSOR_PROXIMITY_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_mutex.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define PROXIMITY_DEFAULT_SAMPLING_200_MS 200000000 +#define PROXIMITY_CHIP_NAME_STK3338 "stk3338" + +struct ProximityData { + int16_t data; + uint8_t stateFlag; +}; + +struct ProximityOpsCall { + int32_t (*Init)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data); +}; + +struct ProximityDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue proximityWorkQueue; + HdfWork proximityWork; + OsalTimer proximityTimer; + bool detectFlag; + bool enable; + int64_t interval; + struct SensorCfgData *proximityCfg; + struct ProximityOpsCall ops; +}; + +struct SensorCfgData *ProximityCreateCfgData(const struct DeviceResourceNode *node); +int32_t ProximityRegisterChipOps(const struct ProximityOpsCall *ops); +void ProximityReleaseCfgData(struct SensorCfgData *proximityCfg); + +#endif /* SENSOR_PROXIMITY_DRIVER_H */ -- Gitee From 691cca7d17bd48e000a8277b2050083b72ea857f Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 9 Sep 2021 16:37:35 +0800 Subject: [PATCH 022/272] modify reviewbot warning Signed-off-by: zhang --- support/posix/test/unittest/common/hdf_osal_test.cpp | 9 +++++---- .../posix/test/unittest/common/hdf_osal_test_posix.cpp | 8 ++++---- test/unittest/osal/osal_all_test.c | 2 +- test/unittest/osal/osal_get_case_test.c | 1 - 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/support/posix/test/unittest/common/hdf_osal_test.cpp b/support/posix/test/unittest/common/hdf_osal_test.cpp index 889f3b965..409e3484f 100644 --- a/support/posix/test/unittest/common/hdf_osal_test.cpp +++ b/support/posix/test/unittest/common/hdf_osal_test.cpp @@ -13,14 +13,12 @@ #include #include #include -#include "osal_test_case_def.h" -#include "hdf_uhdf_test.h" #include "hdf_io_service_if.h" +#include "hdf_uhdf_test.h" +#include "osal_test_case_def.h" using namespace testing::ext; -static const int OSAL_TEST_TIME = 30; -static const int OSAL_WAIT_END_TIME = 5; static const char *OSAL_FW_PATH = "/lib/firmware"; static const int OSAL_FW_PATH_MODE = 0x777; #define OSAL_TEST_FUNC_DEFINE(subCmd) do { \ @@ -35,6 +33,9 @@ public: static void TearDownTestCase(); void SetUp(); void TearDown(); +private: + const int OSAL_TEST_TIME = 30; + const int OSAL_WAIT_END_TIME = 5; }; static void OsalCreateDir(bool flag) diff --git a/support/posix/test/unittest/common/hdf_osal_test_posix.cpp b/support/posix/test/unittest/common/hdf_osal_test_posix.cpp index ae22b4fdc..d847cacc7 100755 --- a/support/posix/test/unittest/common/hdf_osal_test_posix.cpp +++ b/support/posix/test/unittest/common/hdf_osal_test_posix.cpp @@ -13,9 +13,9 @@ #include #include #include -#include "osal_test_case_def.h" #include "hdf_uhdf_test.h" #include "osal_get_case_test.h" +#include "osal_test_case_def.h" int32_t HdfOsalUserEntry(enum HdfOsalTestCaseCmd cmd) { @@ -41,9 +41,6 @@ int32_t HdfOsalUserEntry(enum HdfOsalTestCaseCmd cmd) using namespace testing::ext; -static const int OSAL_TEST_TIME = 30; -static const int OSAL_WAIT_END_TIME = 5; - #define OSAL_TEST_FUNC_DEFINE(subCmd) do { \ printf("OSAL test enter cmd:%d\n\r", subCmd); \ EXPECT_EQ(0, HdfOsalUserEntry(subCmd)); \ @@ -55,6 +52,9 @@ public: static void TearDownTestCase(); void SetUp(); void TearDown(); +private: + const int OSAL_TEST_TIME = 30; + const int OSAL_WAIT_END_TIME = 5; }; void OsalTest::SetUpTestCase() diff --git a/test/unittest/osal/osal_all_test.c b/test/unittest/osal/osal_all_test.c index d07f050c5..65a1c05d9 100644 --- a/test/unittest/osal/osal_all_test.c +++ b/test/unittest/osal/osal_all_test.c @@ -806,7 +806,7 @@ int OsaTestBegin(void) #ifndef __USER__ ret = OsalTestFileInit(); #else - ret = 0; + ret = 0; #endif OsalTestOther(ret); OsaTimeTest(); diff --git a/test/unittest/osal/osal_get_case_test.c b/test/unittest/osal/osal_get_case_test.c index 63729bbd8..fccdc5a68 100644 --- a/test/unittest/osal/osal_get_case_test.c +++ b/test/unittest/osal/osal_get_case_test.c @@ -6,7 +6,6 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_log.h" #include "osal_case_cmd_test.h" int OsalGetTestResult(uint32_t cmd) -- Gitee From e5988b496673a63b9f4d1b3939c5b21d12e58230 Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 9 Sep 2021 17:16:07 +0800 Subject: [PATCH 023/272] modify reviewbot warning Signed-off-by: zhang --- support/posix/test/unittest/common/hdf_osal_test.cpp | 4 ++-- support/posix/test/unittest/common/hdf_osal_test_posix.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/support/posix/test/unittest/common/hdf_osal_test.cpp b/support/posix/test/unittest/common/hdf_osal_test.cpp index 409e3484f..0f904f284 100644 --- a/support/posix/test/unittest/common/hdf_osal_test.cpp +++ b/support/posix/test/unittest/common/hdf_osal_test.cpp @@ -34,8 +34,8 @@ public: void SetUp(); void TearDown(); private: - const int OSAL_TEST_TIME = 30; - const int OSAL_WAIT_END_TIME = 5; + static const int OSAL_TEST_TIME = 30; + static const int OSAL_WAIT_END_TIME = 5; }; static void OsalCreateDir(bool flag) diff --git a/support/posix/test/unittest/common/hdf_osal_test_posix.cpp b/support/posix/test/unittest/common/hdf_osal_test_posix.cpp index d847cacc7..5b1101a9f 100755 --- a/support/posix/test/unittest/common/hdf_osal_test_posix.cpp +++ b/support/posix/test/unittest/common/hdf_osal_test_posix.cpp @@ -53,8 +53,8 @@ public: void SetUp(); void TearDown(); private: - const int OSAL_TEST_TIME = 30; - const int OSAL_WAIT_END_TIME = 5; + static const int OSAL_TEST_TIME = 30; + static const int OSAL_WAIT_END_TIME = 5; }; void OsalTest::SetUpTestCase() -- Gitee From d3b11aa635608d64994966fb6667276fe20e8063 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 9 Sep 2021 11:33:57 +0000 Subject: [PATCH 024/272] resolve error of panel off Signed-off-by: YOUR_NAME --- model/display/driver/hdf_disp.c | 1 + model/display/driver/panel/mipi_icn9700.c | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/model/display/driver/hdf_disp.c b/model/display/driver/hdf_disp.c index 8d7d2603a..4cf12379c 100644 --- a/model/display/driver/hdf_disp.c +++ b/model/display/driver/hdf_disp.c @@ -289,6 +289,7 @@ static int32_t GetBacklight(struct HdfDeviceObject *device, struct HdfSBuf *reqD HDF_LOGE("%s: get panel failed", __func__); return HDF_FAILURE; } + panel = disp->panelManager->panel[devId]; if (GetCurrBrightness(panel->blDev, &currLevel) != HDF_SUCCESS) { HDF_LOGE("%s: GetCurrBrightness failed", __func__); return HDF_FAILURE; diff --git a/model/display/driver/panel/mipi_icn9700.c b/model/display/driver/panel/mipi_icn9700.c index 59654c6bf..f26994b8f 100644 --- a/model/display/driver/panel/mipi_icn9700.c +++ b/model/display/driver/panel/mipi_icn9700.c @@ -192,6 +192,8 @@ static int32_t Icn9700On(struct PanelData *panel) /* send mipi init code */ int32_t count = sizeof(g_OnCmd) / sizeof(g_OnCmd[0]); int32_t i; + /* set mipi to lp mode */ + MipiDsiSetLpMode(icn9700->mipiHandle); for (i = 0; i < count; i++) { ret = MipiDsiTx(icn9700->mipiHandle, &(g_OnCmd[i])); if (ret != HDF_SUCCESS) { @@ -221,6 +223,8 @@ static int32_t Icn9700Off(struct PanelData *panel) /* send mipi init code */ int32_t count = sizeof(g_offCmd) / sizeof(g_offCmd[0]); int32_t i; + /* set mipi to lp mode */ + MipiDsiSetLpMode(icn9700->mipiHandle); for (i = 0; i < count; i++) { ret = MipiDsiTx(icn9700->mipiHandle, &(g_offCmd[i])); if (ret != HDF_SUCCESS) { @@ -228,8 +232,6 @@ static int32_t Icn9700Off(struct PanelData *panel) return HDF_FAILURE; } } - /* set mipi to lp mode */ - MipiDsiSetLpMode(icn9700->mipiHandle); /* lcd reset power off */ ret = LcdResetOff(icn9700); if (ret != HDF_SUCCESS) { -- Gitee From f556d5ad92585ab16d81696d7e78c01d61ddc936 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Sep 2021 15:32:10 +0800 Subject: [PATCH 025/272] als_driver Signed-off-by: YOUR_NAME --- model/sensor/driver/als/sensor_als_driver.c | 369 +++++++++++++++++++ model/sensor/driver/als/sensor_als_driver.h | 70 ++++ model/sensor/driver/chipset/als/als_bh1745.c | 235 ++++++++++++ model/sensor/driver/chipset/als/als_bh1745.h | 38 ++ 4 files changed, 712 insertions(+) create mode 100755 model/sensor/driver/als/sensor_als_driver.c create mode 100755 model/sensor/driver/als/sensor_als_driver.h create mode 100755 model/sensor/driver/chipset/als/als_bh1745.c create mode 100755 model/sensor/driver/chipset/als/als_bh1745.h diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c new file mode 100755 index 000000000..76518b875 --- /dev/null +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -0,0 +1,369 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_als_driver.h" +#include +#include "als_bh1745.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_als_driver_c + +#define HDF_ALS_WORK_QUEUE_NAME "hdf_als_work_queue" + +static struct AlsDrvData *g_alsDrvData = NULL; + +static struct AlsDrvData *AlsGetDrvData(void) +{ + return g_alsDrvData; +} + +static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; + +int32_t AlsRegisterChipOps(const struct AlsOpsCall *ops) +{ + struct AlsDrvData *drvData = AlsGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); + + drvData->ops.Init = ops->Init; + drvData->ops.ReadData = ops->ReadData; + return HDF_SUCCESS; +} + +static void AlsDataWorkEntry(void *arg) +{ + struct AlsDrvData *drvData = NULL; + + drvData = (struct AlsDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->ops.ReadData == NULL) { + HDF_LOGI("%s: Als ReadData function NULl", __func__); + return; + } + if (drvData->ops.ReadData(drvData->alsCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Als read data failed", __func__); + } +} + +static void AlsTimerEntry(uintptr_t arg) +{ + int64_t interval; + int32_t ret; + struct AlsDrvData *drvData = (struct AlsDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->alsWorkQueue, &drvData->alsWork)) { + HDF_LOGE("%s: Als add work queue failed", __func__); + } + + interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; + ret = OsalTimerSetTimeout(&drvData->alsTimer, interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als modify time failed", __func__); + } +} + +static int32_t InitAlsData(struct AlsDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->alsWorkQueue, HDF_ALS_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: Als init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->alsWork, AlsDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Als create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = SENSOR_TIMER_MIN_TIME; + drvData->enable = false; + drvData->detectFlag = false; + + return HDF_SUCCESS; +} + +static int32_t SetAlsEnable(void) +{ + int32_t ret; + struct AlsDrvData *drvData = AlsGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->alsCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: Als sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->alsCfg->busCfg, drvData->alsCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als sensor enable config failed", __func__); + return ret; + } + + ret = OsalTimerCreate(&drvData->alsTimer, SENSOR_TIMER_MIN_TIME, AlsTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->alsTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetAlsDisable(void) +{ + int32_t ret; + struct AlsDrvData *drvData = AlsGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->alsCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: Als sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->alsCfg->busCfg, drvData->alsCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als sensor disable config failed", __func__); + return ret; + } + + ret = OsalTimerDelete(&drvData->alsTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Als delete timer failed", __func__); + return ret; + } + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetAlsBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + struct AlsDrvData *drvData = NULL; + + drvData = AlsGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->interval = samplingInterval; + + return HDF_SUCCESS; +} + +static int32_t SetAlsMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetAlsOption(uint32_t option) +{ + (void)option; + return HDF_SUCCESS; +} + +static int32_t DispatchAls(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t AlsBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct AlsDrvData *drvData = (struct AlsDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc als drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchAls; + drvData->device = device; + device->service = &drvData->ioService; + g_alsDrvData = drvData; + return HDF_SUCCESS; +} + +static int32_t InitAlsOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetAlsEnable; + deviceInfo->ops.Disable = SetAlsDisable; + deviceInfo->ops.SetBatch = SetAlsBatch; + deviceInfo->ops.SetMode = SetAlsMode; + deviceInfo->ops.SetOption = SetAlsOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitAlsAfterDetected(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitAlsOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init als ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add als device failed", __func__); + return HDF_FAILURE; + } + + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +struct SensorCfgData *AlsCreateCfgData(const struct DeviceResourceNode *node) +{ + struct AlsDrvData *drvData = AlsGetDrvData(); + + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Als node pointer NULL", __func__); + return NULL; + } + + if (drvData->detectFlag) { + HDF_LOGE("%s: Als sensor have detected", __func__); + return NULL; + } + + if (drvData->alsCfg == NULL) { + HDF_LOGE("%s: Als alsCfg pointer NULL", __func__); + return NULL; + } + + if (GetSensorBaseConfigData(node, drvData->alsCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + + if (DetectSensorDevice(drvData->alsCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Als sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + + drvData->detectFlag = true; + if (InitAlsAfterDetected(drvData->alsCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Als sensor detect device no exist", __func__); + goto INIT_EXIT; + } + + return drvData->alsCfg; + +INIT_EXIT: + (void)ReleaseSensorBusHandle(&drvData->alsCfg->busCfg); +BASE_CONFIG_EXIT: + drvData->alsCfg->root = NULL; + (void)memset_s(&drvData->alsCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->alsCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->alsCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + return NULL; +} + +void AlsReleaseCfgData(struct SensorCfgData *alsCfg) +{ + CHECK_NULL_PTR_RETURN(alsCfg); + + (void)DeleteSensorDevice(&alsCfg->sensorInfo); + ReleaseSensorAllRegConfig(alsCfg); + (void)ReleaseSensorBusHandle(&alsCfg->busCfg); + + alsCfg->root = NULL; + (void)memset_s(&alsCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&alsCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&alsCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t AlsInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct AlsDrvData *drvData = (struct AlsDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitAlsData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init als config failed", __func__); + return HDF_FAILURE; + } + + drvData->alsCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->alsCfg)); + if (drvData->alsCfg == NULL) { + HDF_LOGE("%s: Malloc als config data failed", __func__); + return HDF_FAILURE; + } + + drvData->alsCfg->regCfgGroup = &g_regCfgGroup[0]; + + return HDF_SUCCESS; +} + +void AlsReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct AlsDrvData *drvData = (struct AlsDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->detectFlag) { + AlsReleaseCfgData(drvData->alsCfg); + } + + OsalMemFree(drvData->alsCfg); + drvData->alsCfg = NULL; + + HdfWorkDestroy(&drvData->alsWork); + HdfWorkQueueDestroy(&drvData->alsWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorAlsDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_ALS", + .Bind = AlsBindDriver, + .Init = AlsInitDriver, + .Release = AlsReleaseDriver, +}; + +HDF_INIT(g_sensorAlsDevEntry); diff --git a/model/sensor/driver/als/sensor_als_driver.h b/model/sensor/driver/als/sensor_als_driver.h new file mode 100755 index 000000000..d26879f0b --- /dev/null +++ b/model/sensor/driver/als/sensor_als_driver.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_ALS_DRIVER_H +#define SENSOR_ALS_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_mutex.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define ALS_DEFAULT_SAMPLING_200_MS 200000000 +#define ALS_CHIP_NAME_BH1745 "bh1745" + +enum AlsLightNum { + ALS_R = 0, + ALS_G = 1, + ALS_B = 2, + ALS_C = 3, + ALS_LIGHT_NUM = 4, +}; + +enum AlsLightPart { + ALS_R_LSB = 0, + ALS_R_MSB = 1, + ALS_G_LSB = 2, + ALS_G_MSB = 3, + ALS_B_LSB = 4, + ALS_B_MSB = 5, + ALS_C_LSB = 6, + ALS_C_MSB = 7, + ALS_LIGHT_BUTT = 8, +}; + +struct AlsData { + int32_t red; + int32_t green; + int32_t blue; + int32_t clear; +}; + +struct AlsOpsCall { + int32_t (*Init)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data); +}; + +struct AlsDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue alsWorkQueue; + HdfWork alsWork; + OsalTimer alsTimer; + bool detectFlag; + bool enable; + int64_t interval; + struct SensorCfgData *alsCfg; + struct AlsOpsCall ops; +}; + +int32_t AlsRegisterChipOps(const struct AlsOpsCall *ops); +struct SensorCfgData *AlsCreateCfgData(const struct DeviceResourceNode *node); +void AlsReleaseCfgData(struct SensorCfgData *sensorCfgData); + +#endif /* SENSOR_ALS_DRIVER_H */ diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c new file mode 100755 index 000000000..769a89552 --- /dev/null +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -0,0 +1,235 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "als_bh1745.h" +#include +#include "osal_mem.h" +#include "osal_time.h" +#include "sensor_als_driver.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" + +static struct Bh1745DrvData *g_bh1745DrvData = NULL; + +struct Bh1745DrvData *Bh1745GetDrvData(void) +{ + return g_bh1745DrvData; +} + +/* IO config for int-pin and I2C-pin */ +#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c +#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 +#define SENSOR_I2C_REG_CFG 0x403 + +static int32_t ReadBh1745RawData(struct SensorCfgData *data, struct AlsData *rawData, int64_t *timestamp) +{ + uint8_t status = 0; + uint8_t reg[ALS_LIGHT_BUTT]; + OsalTimespec time; + + (void)memset_s(&time, sizeof(time), 0, sizeof(time)); + (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return HDF_FAILURE; + } + *timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; /* unit nanosecond */ + + int32_t ret = ReadSensor(&data->busCfg, BH1745_MODECONTROL3_ADDR, &status, sizeof(uint8_t)); + if (!(status & BH1745_ALS_DATA_READY_MASK) || (ret != HDF_SUCCESS)) { + HDF_LOGE("%s: data status [%u] ret [%d]", __func__, status, ret); + return HDF_FAILURE; + } + + ret = ReadSensor(&data->busCfg, BH1745_ALS_R_LSB_ADDR, ®[ALS_R_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_R_MSB_ADDR, ®[ALS_R_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_G_LSB_ADDR, ®[ALS_G_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_G_MSB_ADDR, ®[ALS_G_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_B_LSB_ADDR, ®[ALS_B_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_B_MSB_ADDR, ®[ALS_B_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_C_LSB_ADDR, ®[ALS_C_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BH1745_ALS_C_MSB_ADDR, ®[ALS_C_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + rawData->red = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_R_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[ALS_R_LSB]); + rawData->green = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_G_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[ALS_G_LSB]); + rawData->blue = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_B_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[ALS_B_LSB]); + rawData->clear = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_C_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[ALS_C_LSB]); + + return HDF_SUCCESS; +} + +int32_t ReadBh1745Data(struct SensorCfgData *data) +{ + + int32_t ret; + struct AlsData rawData = { 0, 0, 0, 0 }; + int32_t tmp[ALS_LIGHT_NUM]; + struct SensorReportEvent event; + + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + ret = ReadBh1745RawData(data, &rawData, &event.timestamp); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BH1745 read raw data failed", __func__); + return HDF_FAILURE; + } + + event.sensorId = SENSOR_TAG_AMBIENT_LIGHT; + event.option = 0; + event.mode = SENSOR_WORK_MODE_REALTIME; + + tmp[ALS_R] = rawData.red; + tmp[ALS_G] = rawData.green; + tmp[ALS_B] = rawData.blue ; + tmp[ALS_C] = rawData.clear; + + event.dataLen = sizeof(tmp); + event.data = (uint8_t *)&tmp; + ret = ReportSensorEvent(&event); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BH1745 report data failed", __func__); + } + return ret; +} + +static int32_t InitBh1745(struct SensorCfgData *data) +{ + int32_t ret; + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BH1745 sensor init config failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitAlsPreConfig(void) +{ + if (SetSensorPinMux(SENSOR_I2C6_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Data write mux pin failed", __func__); + return HDF_FAILURE; + } + if (SetSensorPinMux(SENSOR_I2C6_CLK_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Clk write mux pin failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t DispatchBH1745(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t Bh1745BindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct Bh1745DrvData *drvData = (struct Bh1745DrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc Bh1745 drv data fail", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchBH1745; + drvData->device = device; + device->service = &drvData->ioService; + g_bh1745DrvData = drvData; + + return HDF_SUCCESS; +} + +int32_t Bh1745InitDriver(struct HdfDeviceObject *device) +{ + int32_t ret; + struct AlsOpsCall ops; + + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Bh1745DrvData *drvData = (struct Bh1745DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + ret = InitAlsPreConfig(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BH1745 bus mux config", __func__); + return HDF_FAILURE; + } + + drvData->sensorCfg = AlsCreateCfgData(device->property); + if (drvData->sensorCfg == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + ops.Init = NULL; + ops.ReadData = ReadBh1745Data; + ret = AlsRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register BH1745 als failed", __func__); + return HDF_FAILURE; + } + + ret = InitBh1745(drvData->sensorCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BH1745 als failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +void Bh1745ReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct Bh1745DrvData *drvData = (struct Bh1745DrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + AlsReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_alsBh1745DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_ALS_BH1745", + .Bind = Bh1745BindDriver, + .Init = Bh1745InitDriver, + .Release = Bh1745ReleaseDriver, +}; + +HDF_INIT(g_alsBh1745DevEntry); diff --git a/model/sensor/driver/chipset/als/als_bh1745.h b/model/sensor/driver/chipset/als/als_bh1745.h new file mode 100755 index 000000000..a65b4a7ef --- /dev/null +++ b/model/sensor/driver/chipset/als/als_bh1745.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef ALS_BH1745_H +#define ALS_BH1745_H + +#include "sensor_als_driver.h" +#include "sensor_config_parser.h" + +/* ALS DATA REGISTERS ADDR */ +#define BH1745_ALS_R_LSB_ADDR 0X50 +#define BH1745_ALS_R_MSB_ADDR 0X51 +#define BH1745_ALS_G_LSB_ADDR 0X52 +#define BH1745_ALS_G_MSB_ADDR 0X53 +#define BH1745_ALS_B_LSB_ADDR 0X54 +#define BH1745_ALS_B_MSB_ADDR 0X55 +#define BH1745_ALS_C_LSB_ADDR 0X56 +#define BH1745_ALS_C_MSB_ADDR 0X57 +#define BH1745_MODECONTROL3_ADDR 0X44 + +/* ALS DATA READY */ +#define BH1745_ALS_DATA_READY_MASK 0X02 + +int32_t DetectAlsBim160Chip(struct SensorCfgData *data); +int32_t ReadBh1745Data(struct SensorCfgData *data); + +struct Bh1745DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + +#endif /* ALS_BH1745_H */ -- Gitee From 57e1e64499a62122882188d6beeedf89c28f48b3 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Sep 2021 16:28:56 +0800 Subject: [PATCH 026/272] als_driver Signed-off-by: YOUR_NAME --- model/sensor/driver/als/sensor_als_driver.c | 2 +- model/sensor/driver/als/sensor_als_driver.h | 2 +- model/sensor/driver/chipset/als/als_bh1745.c | 5 ++--- model/sensor/driver/chipset/als/als_bh1745.h | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c index 76518b875..5208a28e4 100755 --- a/model/sensor/driver/als/sensor_als_driver.c +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/model/sensor/driver/als/sensor_als_driver.h b/model/sensor/driver/als/sensor_als_driver.h index d26879f0b..dcf40d75c 100755 --- a/model/sensor/driver/als/sensor_als_driver.h +++ b/model/sensor/driver/als/sensor_als_driver.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index 769a89552..b1fc82fc6 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -87,7 +87,6 @@ static int32_t ReadBh1745RawData(struct SensorCfgData *data, struct AlsData *raw int32_t ReadBh1745Data(struct SensorCfgData *data) { - int32_t ret; struct AlsData rawData = { 0, 0, 0, 0 }; int32_t tmp[ALS_LIGHT_NUM]; @@ -106,7 +105,7 @@ int32_t ReadBh1745Data(struct SensorCfgData *data) tmp[ALS_R] = rawData.red; tmp[ALS_G] = rawData.green; - tmp[ALS_B] = rawData.blue ; + tmp[ALS_B] = rawData.blue; tmp[ALS_C] = rawData.clear; event.dataLen = sizeof(tmp); diff --git a/model/sensor/driver/chipset/als/als_bh1745.h b/model/sensor/driver/chipset/als/als_bh1745.h index a65b4a7ef..41ac6de46 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.h +++ b/model/sensor/driver/chipset/als/als_bh1745.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. -- Gitee From 56dbec6b0e9d2e93b5b9277e2262dea091348c1f Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Sep 2021 11:22:43 +0000 Subject: [PATCH 027/272] update audio Signed-off-by: YOUR_NAME --- include/audio/audio_dsp_if.h | 4 +- include/audio/audio_platform_if.h | 4 +- model/audio/common/src/audio_platform_base.c | 39 +++++++++------- model/audio/core/include/audio_control.h | 1 - model/audio/core/include/audio_core.h | 15 ++++--- model/audio/core/include/audio_host.h | 45 ++++++++++--------- model/audio/core/src/audio_core.c | 2 +- model/audio/core/src/audio_host.c | 2 +- .../dispatch/src/audio_stream_dispatch.c | 40 ++++++++--------- model/audio/sapm/src/audio_sapm.c | 18 +++++--- 10 files changed, 94 insertions(+), 76 deletions(-) diff --git a/include/audio/audio_dsp_if.h b/include/audio/audio_dsp_if.h index ae72f096b..31d42a88e 100755 --- a/include/audio/audio_dsp_if.h +++ b/include/audio/audio_dsp_if.h @@ -39,8 +39,8 @@ struct DspData { const char *drvDspName; /* dsp driver callbacks */ int32_t (*DspInit)(const struct DspDevice *device); - int32_t (*Read)(struct DspDevice *, uint8_t *, uint32_t); - int32_t (*Write)(struct DspDevice *, uint8_t *, uint32_t); + int32_t (*Read)(const struct DspDevice *, uint8_t *, uint32_t); + int32_t (*Write)(const struct DspDevice *, uint8_t *, uint32_t); int32_t (*decode)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); int32_t (*encode)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); int32_t (*Equalizer)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); diff --git a/include/audio/audio_platform_if.h b/include/audio/audio_platform_if.h index 6ac044d68..c2cc766b8 100755 --- a/include/audio/audio_platform_if.h +++ b/include/audio/audio_platform_if.h @@ -84,8 +84,8 @@ struct AudioPlatformOps { uint32_t (*Pointer)(struct AudioCard *); int32_t (*Write)(const struct AudioCard *, struct AudioTxData *); int32_t (*Read)(const struct AudioCard *, struct AudioRxData *); - int32_t (*MmapWrite)(const struct AudioCard *, struct AudioTxMmapData *); - int32_t (*MmapRead)(const struct AudioCard *, struct AudioRxMmapData *); + int32_t (*MmapWrite)(const struct AudioCard *, const struct AudioTxMmapData *); + int32_t (*MmapRead)(const struct AudioCard *, const struct AudioRxMmapData *); int32_t (*RenderPrepare)(const struct AudioCard *); int32_t (*CapturePrepare)(const struct AudioCard *); int32_t (*RenderStart)(struct AudioCard *); diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 29337f0e4..3f6747519 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -10,7 +10,6 @@ #include "audio_core.h" #define HDF_LOG_TAG audio_platform_base - struct PlatformData *PlatformDataFromDevice(const struct AudioCard *card) { if (card == NULL || card->rtd == NULL || card->rtd->platform == NULL) { @@ -41,34 +40,40 @@ int32_t PlatformCreatePlatformHost(const struct AudioCard *card, struct Platform int32_t AudioDataBigEndianChange(char *srcData, uint32_t audioLen, enum DataBitWidth bitWidth) { - uint64_t i; - uint16_t framesize; - char temp; if (srcData == NULL) { AUDIO_DRIVER_LOG_ERR("srcData is NULL."); return HDF_FAILURE; } + uint64_t i; + uint16_t framesize; + char *changeData = srcData; + uint32_t *pData = (uint32_t *)changeData; switch (bitWidth) { case DATA_BIT_WIDTH8: - framesize = 1; /* 1 byte */ - break; - case DATA_BIT_WIDTH16: - framesize = 2; /* 2 bytes */ - break; + return HDF_SUCCESS; case DATA_BIT_WIDTH24: - framesize = 3; /* 3 bytes */ + framesize = 3; /* 3 byte , convert step is 3 byte */ + for (i = 0; i < audioLen; i += framesize) { + // swap the first and the third byte, second and fourth unchanged + *pData = ((((*pData) >> 0x10) & 0x000000FF) | + ((*pData) & 0xFF00FF00) | + (((*pData) << 0x10) & 0x00FF0000)); + changeData += framesize; + pData = (uint32_t *)changeData; + } break; + case DATA_BIT_WIDTH16: default: - framesize = 2; /* default 2 bytes */ + framesize = 4; /* 2 byte, convert step is 4 byte */ + for (i = 0; i < audioLen; i += framesize) { + // swap the first and second byte, swap the third and fourth byte + *pData = ((((*pData) << 0x08) & 0xFF00FF00) | + (((*pData) >> 0x08) & 0x00FF00FF)); + pData++; + } break; } - - for (i = 0; i < audioLen; i += framesize) { - temp = srcData[i]; - srcData[i] = srcData[i + framesize - 1]; - srcData[i + framesize - 1] = temp; - } AUDIO_DRIVER_LOG_DEBUG("audioLen = %d\n", audioLen); return HDF_SUCCESS; } diff --git a/model/audio/core/include/audio_control.h b/model/audio/core/include/audio_control.h index cc674f739..76ec94c6a 100755 --- a/model/audio/core/include/audio_control.h +++ b/model/audio/core/include/audio_control.h @@ -11,7 +11,6 @@ #include "hdf_dlist.h" - #ifdef __cplusplus #if __cplusplus extern "C" { diff --git a/model/audio/core/include/audio_core.h b/model/audio/core/include/audio_core.h index 6235bbb7a..32a2f860c 100755 --- a/model/audio/core/include/audio_core.h +++ b/model/audio/core/include/audio_core.h @@ -29,6 +29,15 @@ extern "C" { #define AUDIO_DAI_LINK_COMPLETE 1 #define AUDIO_DAI_LINK_UNCOMPLETE 0 +#ifdef __LITEOS__ +#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#else +#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ + HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) +#endif + #define AUDIO_DRIVER_LOG_ERR(fmt, arg...) do { \ HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ } while (0) @@ -41,10 +50,6 @@ extern "C" { HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ } while (0) -#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ - HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - enum AudioDeviceType { AUDIO_DAI_DEVICE, AUDIO_DSP_DEVICE, @@ -88,7 +93,7 @@ int32_t AudioCodecWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32 int32_t AudioAccessoryReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val); int32_t AudioAccessoryWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val); int32_t AudioCodecAiaoReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val); -int32_t AudioCodecAiaoWriteReg(struct CodecDevice *codec, uint32_t reg, uint32_t val); +int32_t AudioCodecAiaoWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val); int32_t AudioAccessoryAiaoReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val); int32_t AudioAccessoryAiaoWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val); diff --git a/model/audio/core/include/audio_host.h b/model/audio/core/include/audio_host.h index afc51ac34..e49c6b0e5 100755 --- a/model/audio/core/include/audio_host.h +++ b/model/audio/core/include/audio_host.h @@ -24,6 +24,15 @@ extern "C" { #endif #endif /* __cplusplus */ +#ifdef __LITEOS__ +#define ADM_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#else +#define ADM_LOG_DEBUG(fmt, arg...) do { \ + HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) +#endif + #define ADM_LOG_ERR(fmt, arg...) do { \ HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ } while (0) @@ -36,10 +45,6 @@ extern "C" { HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ } while (0) -#define ADM_LOG_DEBUG(fmt, arg...) do { \ - HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - #define BUFF_SIZE_MAX 64 #define AUDIO_LIST_HEAD_INIT(name) { &(name), &(name) } @@ -47,6 +52,22 @@ extern "C" { #define AUDIO_LIST_HEAD(name) \ struct DListHead name = AUDIO_LIST_HEAD_INIT(name) +enum AudioFormat { + AUDIO_FORMAT_PCM_8_BIT = 0x1u, /**< audio 8-bit PCM */ + AUDIO_FORMAT_PCM_16_BIT = 0x2u, /**< audio16-bit PCM */ + AUDIO_FORMAT_PCM_24_BIT = 0x3u, /**< audio 24-bit PCM */ + AUDIO_FORMAT_PCM_32_BIT = 0x4u, /**< audio 32-bit PCM */ + AUDIO_FORMAT_AAC_MAIN = 0x1000001u, /**< audio AAC main */ + AUDIO_FORMAT_AAC_LC = 0x1000002u, /**< audio AAC LC */ + AUDIO_FORMAT_AAC_LD = 0x1000003u, /**< audio AAC LD */ + AUDIO_FORMAT_AAC_ELD = 0x1000004u, /**< audio AAC ELD */ + AUDIO_FORMAT_AAC_HE_V1 = 0x1000005u, /**< audio AAC HE_V1 */ + AUDIO_FORMAT_AAC_HE_V2 = 0x1000006u, /**< audio AAC HE_V2 */ + AUDIO_FORMAT_G711A = 0x2000001u, /**< audio G711A */ + AUDIO_FORMAT_G711U = 0x2000002u, /**< audio G711u */ + AUDIO_FORMAT_G726 = 0x2000003u, /**< audio G726 */ +}; + struct AudioConfigData { const char *cardServiceName; const char *codecName; @@ -59,22 +80,6 @@ struct AudioConfigData { const char *dspDaiName; }; -enum AudioFormat { - AUDIO_FORMAT_PCM_8_BIT = 0x1u, /**< 8-bit PCM */ - AUDIO_FORMAT_PCM_16_BIT = 0x2u, /**< 16-bit PCM */ - AUDIO_FORMAT_PCM_24_BIT = 0x3u, /**< 24-bit PCM */ - AUDIO_FORMAT_PCM_32_BIT = 0x4u, /**< 32-bit PCM */ - AUDIO_FORMAT_AAC_MAIN = 0x1000001u, /**< AAC main */ - AUDIO_FORMAT_AAC_LC = 0x1000002u, /**< AAC LC */ - AUDIO_FORMAT_AAC_LD = 0x1000003u, /**< AAC LD */ - AUDIO_FORMAT_AAC_ELD = 0x1000004u, /**< AAC ELD */ - AUDIO_FORMAT_AAC_HE_V1 = 0x1000005u, /**< AAC HE_V1 */ - AUDIO_FORMAT_AAC_HE_V2 = 0x1000006u, /**< AAC HE_V2 */ - AUDIO_FORMAT_G711A = 0x2000001u, /**< G711A */ - AUDIO_FORMAT_G711U = 0x2000002u, /**< G711u */ - AUDIO_FORMAT_G726 = 0x2000003u, /**< G726 */ -}; - struct AudioCard { struct AudioRuntimeDeivces *rtd; struct AudioConfigData configData; diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index fb3581ed4..a3a546d9b 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -698,7 +698,7 @@ int32_t AudioAccessoryWriteReg(const struct AccessoryDevice *accessory, uint32_t return HDF_SUCCESS; } -int32_t AudioCodecAiaoWriteReg(struct CodecDevice *codec, uint32_t reg, uint32_t val) +int32_t AudioCodecAiaoWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val) { int32_t ret; if (codec == NULL || codec->devData == NULL || codec->devData->AiaoWrite == NULL) { diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index 61c2434c3..e5a74f2a5 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -256,7 +256,7 @@ static int32_t AudioDspDaiDevInit(const struct AudioCard *audioCard) { struct AudioRuntimeDeivces *rtd = NULL; struct DaiDevice *dspDai = NULL; - int ret; + int ret = HDF_SUCCESS; if (audioCard == NULL) { ADM_LOG_ERR("audioCard is NULL."); diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index 70e26609a..0bb697ed6 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -208,7 +208,7 @@ int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBu struct StreamHost *streamHost = NULL; struct AudioCard *audioCard = NULL; char *cardName = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if ((client == NULL || client->device == NULL) || (data == NULL)) { @@ -295,7 +295,7 @@ int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -336,7 +336,7 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -374,7 +374,7 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct AudioTxData *transfer) { struct PlatformDevice *platform = NULL; - int32_t ret; + int32_t ret = HDF_SUCCESS; if (audioCard == NULL || audioCard->rtd == NULL || transfer == NULL) { ADM_LOG_ERR("input param is NULL."); @@ -400,7 +400,7 @@ static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct Aud static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, struct AudioTxMmapData *txMmapData) { struct PlatformDevice *platform = NULL; - int32_t ret; + int32_t ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (audioCard == NULL || audioCard->rtd == NULL || txMmapData == NULL) { @@ -428,7 +428,7 @@ static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, struct static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, struct AudioRxMmapData *rxMmapData) { struct PlatformDevice *platform = NULL; - int32_t ret; + int32_t ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (audioCard == NULL || audioCard->rtd == NULL || rxMmapData == NULL) { @@ -457,7 +457,7 @@ int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf * { struct AudioTxData transfer; struct AudioCard *audioCard = NULL; - int32_t ret; + int32_t ret = HDF_SUCCESS; uint32_t dataSize = 0; ADM_LOG_DEBUG("entry."); @@ -501,7 +501,7 @@ int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *d struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; struct AudioRxData rxData; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL || reply == NULL) { @@ -696,7 +696,7 @@ int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct Hdf struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -736,7 +736,7 @@ int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct Hd struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -777,7 +777,7 @@ int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfS struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -817,7 +817,7 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -857,7 +857,7 @@ int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct Hdf struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -898,7 +898,7 @@ int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct Hd struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -939,7 +939,7 @@ int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct Hd struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -980,7 +980,7 @@ int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct H struct AudioRuntimeDeivces *rtd = NULL; struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -1021,7 +1021,7 @@ int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSB struct AudioRuntimeDeivces *rtd = NULL; struct DspDevice *dspDev = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("Dsp Decode Entry."); if (client == NULL) { @@ -1060,7 +1060,7 @@ int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSB struct AudioRuntimeDeivces *rtd = NULL; struct DspDevice *dspDev = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("Dsp Encode Entry."); if (client == NULL) { @@ -1099,7 +1099,7 @@ int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct Hd struct AudioRuntimeDeivces *rtd = NULL; struct DspDevice *dspDev = NULL; struct AudioCard *audioCard = NULL; - int ret; + int ret = HDF_SUCCESS; ADM_LOG_DEBUG("Dsp Equalizer Entry."); if (client == NULL) { @@ -1158,7 +1158,7 @@ static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) { - unsigned int i; + unsigned int i = 0; if ((client == NULL) || (data == NULL) || (reply == NULL)) { return HDF_ERR_INVALID_PARAM; diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index b3d60c017..e5791e71d 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -383,8 +383,9 @@ static void MuxValueSetPathStatus(const struct AudioSapmComponent *sapmComponent val = val >> shift; for (item = 0; item < enumKtl->max; item++) { - if (val == enumKtl->values[item]) + if (val == enumKtl->values[item]) { break; + } } path->connect = UNCONNECT_SINK_AND_SOURCE; @@ -475,7 +476,7 @@ static int32_t AudioSapmConnectMixer(struct AudioCard *audioCard, struct AudioSapmComponent *source, struct AudioSapmComponent *sink, struct AudioSapmpath *path, const char *controlName) { - int i; + int i = 0; if ((audioCard == NULL) || (source == NULL) || (sink == NULL) || (path == NULL) || (controlName == NULL)) { @@ -579,13 +580,15 @@ static void AudioSampExtComponentsCheck(struct AudioSapmComponent *cptSource, st /* check for external components */ if (cptSink->sapmType == AUDIO_SAPM_INPUT) { if (cptSource->sapmType == AUDIO_SAPM_MICBIAS || cptSource->sapmType == AUDIO_SAPM_MIC || - cptSource->sapmType == AUDIO_SAPM_LINE || cptSource->sapmType == AUDIO_SAPM_OUTPUT) + cptSource->sapmType == AUDIO_SAPM_LINE || cptSource->sapmType == AUDIO_SAPM_OUTPUT) { cptSink->external = EXIST_EXTERNAL_WIDGET; + } } if (cptSource->sapmType == AUDIO_SAPM_OUTPUT) { if (cptSink->sapmType == AUDIO_SAPM_SPK || cptSink->sapmType == AUDIO_SAPM_HP || - cptSink->sapmType == AUDIO_SAPM_LINE || cptSink->sapmType == AUDIO_SAPM_INPUT) + cptSink->sapmType == AUDIO_SAPM_LINE || cptSink->sapmType == AUDIO_SAPM_INPUT) { cptSource->external = EXIST_EXTERNAL_WIDGET; + } } return; @@ -953,7 +956,7 @@ int32_t AudioSapmSleep(const struct AudioCard *audioCard) int32_t AudioSapmNewControls(struct AudioCard *audioCard) { struct AudioSapmComponent *sapmComponent = NULL; - int ret; + int ret = HDF_SUCCESS; if (audioCard == NULL) { ADM_LOG_ERR("input param audioCard is NULL."); @@ -983,7 +986,7 @@ int32_t AudioSapmNewControls(struct AudioCard *audioCard) case AUDIO_SAPM_MUX: case AUDIO_SAPM_VIRT_MUX: case AUDIO_SAPM_VALUE_MUX: - ret =AudioSapmNewMuxControls(sapmComponent, audioCard); + ret = AudioSapmNewMuxControls(sapmComponent, audioCard); break; default: ret = HDF_SUCCESS; @@ -1013,7 +1016,7 @@ static int32_t MixerUpdatePowerStatus(const struct AudioKcontrol *kcontrol, uint { struct AudioCard *audioCard = NULL; struct AudioSapmpath *path = NULL; - int ret; + int ret = HDF_SUCCESS; if (kcontrol == NULL || kcontrol->pri == NULL) { ADM_LOG_ERR("input param kcontrol is NULL."); @@ -1127,6 +1130,7 @@ int32_t AudioCodecSapmSetCtrlOps(const struct AudioKcontrol *kcontrol, const str ADM_LOG_ERR("update power status is failure!"); return HDF_FAILURE; } + curValue &= mixerCtrl->mask << mixerCtrl->shift; value = (value & mixerCtrl->mask) << mixerCtrl->shift; if (curValue != value) { -- Gitee From d037ab3261ff77267483d641d063d991e6c167dd Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 11 Sep 2021 15:53:10 +0800 Subject: [PATCH 028/272] add public property with log Signed-off-by: zhang --- test/unittest/osal/osal_all_test.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/unittest/osal/osal_all_test.c b/test/unittest/osal/osal_all_test.c index 65a1c05d9..25460914d 100644 --- a/test/unittest/osal/osal_all_test.c +++ b/test/unittest/osal/osal_all_test.c @@ -701,12 +701,14 @@ static void OsaMemoryTest(void) static void OsaLogTest(void) { HDF_LOGI("[OSAL_UT_TEST]%s start", __func__); - HDF_LOGE("%s", __func__); - HDF_LOGW("%s", __func__); - HDF_LOGI("%s", __func__); + HDF_LOGE("{private}%{private}s %{private}d{private}", __func__, __LINE__); + HDF_LOGW("%{public}s %{public}d", __func__, __LINE__); + HDF_LOGI("%{public}s %{private}d", __func__, __LINE__); + HDF_LOGI("%{private}s %{public}d", __func__, __LINE__); HDF_LOGD("%s", __func__); HDF_LOGV("%s", __func__); - HDF_LOGI("[OSAL_UT_TEST]%s end", __func__); + HDF_LOGI("[OSAL_UT_TEST]%{private}s end", __func__); + HDF_LOGI("[OSAL_UT_TEST]%s end", __func__); } static void OsaMutexTest(void) -- Gitee From 4495e0fbc5b0649a68f641ea6338b45b3b08e732 Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 11 Sep 2021 16:01:44 +0800 Subject: [PATCH 029/272] add public property with log Signed-off-by: zhang --- test/unittest/osal/osal_all_test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/osal/osal_all_test.c b/test/unittest/osal/osal_all_test.c index 25460914d..80931d726 100644 --- a/test/unittest/osal/osal_all_test.c +++ b/test/unittest/osal/osal_all_test.c @@ -704,11 +704,11 @@ static void OsaLogTest(void) HDF_LOGE("{private}%{private}s %{private}d{private}", __func__, __LINE__); HDF_LOGW("%{public}s %{public}d", __func__, __LINE__); HDF_LOGI("%{public}s %{private}d", __func__, __LINE__); - HDF_LOGI("%{private}s %{public}d", __func__, __LINE__); + HDF_LOGI("%{private}s %{public}d", __func__, __LINE__); HDF_LOGD("%s", __func__); HDF_LOGV("%s", __func__); HDF_LOGI("[OSAL_UT_TEST]%{private}s end", __func__); - HDF_LOGI("[OSAL_UT_TEST]%s end", __func__); + HDF_LOGI("[OSAL_UT_TEST]%s end", __func__); } static void OsaMutexTest(void) -- Gitee From 994b91f73597150c33e5e43c3cdd1c2aa12d3dd3 Mon Sep 17 00:00:00 2001 From: yue Date: Sat, 11 Sep 2021 19:19:00 +0800 Subject: [PATCH 030/272] modify hdi-gen code warning Signed-off-by: yue --- tools/hdi-gen/ast/ast_array_type.cpp | 185 ++++------ tools/hdi-gen/ast/ast_array_type.h | 5 +- tools/hdi-gen/ast/ast_boolean_type.cpp | 50 +-- tools/hdi-gen/ast/ast_boolean_type.h | 5 +- tools/hdi-gen/ast/ast_byte_type.cpp | 50 +-- tools/hdi-gen/ast/ast_byte_type.h | 5 +- tools/hdi-gen/ast/ast_double_type.cpp | 50 +-- tools/hdi-gen/ast/ast_double_type.h | 5 +- tools/hdi-gen/ast/ast_enum_type.cpp | 48 +-- tools/hdi-gen/ast/ast_enum_type.h | 5 +- tools/hdi-gen/ast/ast_fd_type.cpp | 48 +-- tools/hdi-gen/ast/ast_fd_type.h | 5 +- tools/hdi-gen/ast/ast_float_type.cpp | 50 +-- tools/hdi-gen/ast/ast_float_type.h | 5 +- tools/hdi-gen/ast/ast_integer_type.cpp | 50 +-- tools/hdi-gen/ast/ast_integer_type.h | 5 +- tools/hdi-gen/ast/ast_interface_type.cpp | 18 +- tools/hdi-gen/ast/ast_interface_type.h | 2 +- tools/hdi-gen/ast/ast_list_type.cpp | 184 ++++------ tools/hdi-gen/ast/ast_list_type.h | 5 +- tools/hdi-gen/ast/ast_long_type.cpp | 50 +-- tools/hdi-gen/ast/ast_long_type.h | 5 +- tools/hdi-gen/ast/ast_map_type.cpp | 28 +- tools/hdi-gen/ast/ast_parameter.cpp | 11 + tools/hdi-gen/ast/ast_parameter.h | 2 + tools/hdi-gen/ast/ast_sequenceable_type.cpp | 8 +- tools/hdi-gen/ast/ast_short_type.cpp | 50 +-- tools/hdi-gen/ast/ast_short_type.h | 5 +- tools/hdi-gen/ast/ast_string_type.cpp | 50 +-- tools/hdi-gen/ast/ast_string_type.h | 5 +- tools/hdi-gen/ast/ast_struct_type.cpp | 56 ++- tools/hdi-gen/ast/ast_struct_type.h | 5 +- tools/hdi-gen/ast/ast_type.cpp | 10 +- tools/hdi-gen/ast/ast_type.h | 8 +- tools/hdi-gen/ast/ast_uchar_type.cpp | 50 +-- tools/hdi-gen/ast/ast_uchar_type.h | 5 +- tools/hdi-gen/ast/ast_uint_type.cpp | 50 +-- tools/hdi-gen/ast/ast_uint_type.h | 5 +- tools/hdi-gen/ast/ast_ulong_type.cpp | 50 +-- tools/hdi-gen/ast/ast_ulong_type.h | 5 +- tools/hdi-gen/ast/ast_union_type.cpp | 56 ++- tools/hdi-gen/ast/ast_union_type.h | 5 +- tools/hdi-gen/ast/ast_ushort_type.cpp | 50 +-- tools/hdi-gen/ast/ast_ushort_type.h | 5 +- .../c_client_interface_code_emitter.cpp | 6 +- .../codegen/c_client_proxy_code_emitter.cpp | 197 +++++----- .../codegen/c_client_proxy_code_emitter.h | 3 - tools/hdi-gen/codegen/c_code_emitter.cpp | 4 +- tools/hdi-gen/codegen/c_code_emitter.h | 2 - .../codegen/c_custom_types_code_emitter.cpp | 128 +++---- .../codegen/c_service_driver_code_emitter.cpp | 68 ++-- .../codegen/c_service_impl_code_emitter.cpp | 28 +- .../c_service_interface_code_emitter.cpp | 6 +- .../codegen/c_service_stub_code_emitter.cpp | 134 ++++--- .../codegen/c_service_stub_code_emitter.h | 9 - tools/hdi-gen/codegen/code_generator.h | 3 - .../cpp_client_interface_code_emitter.cpp | 12 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 64 ++-- tools/hdi-gen/codegen/cpp_code_emitter.cpp | 4 +- tools/hdi-gen/codegen/cpp_code_emitter.h | 2 - .../codegen/cpp_custom_types_code_emitter.cpp | 12 +- .../cpp_service_driver_code_emitter.cpp | 54 +-- .../codegen/cpp_service_impl_code_emitter.cpp | 12 +- .../cpp_service_interface_code_emitter.cpp | 8 +- .../codegen/cpp_service_stub_code_emitter.cpp | 98 ++--- .../java_client_interface_code_emitter.cpp | 4 +- .../java_client_proxy_code_emitter.cpp | 82 ++--- tools/hdi-gen/codegen/java_code_emitter.cpp | 2 - tools/hdi-gen/codegen/java_code_emitter.h | 2 - tools/hdi-gen/parser/file_detail.cpp | 1 + tools/hdi-gen/parser/file_detail.h | 3 +- tools/hdi-gen/parser/module_parser.cpp | 2 + tools/hdi-gen/parser/module_parser.h | 5 +- .../c_test/array_test/v1_0/c_array_test.cpp | 54 +-- .../test/c_test/cb_test/v1_0/c_cb_test.cpp | 22 +- .../c_test/data_test/v1_0/c_data_test.cpp | 55 ++- .../c_test/list_test/v1_0/c_list_test.cpp | 54 +-- .../c_test/struct_test/v1_0/c_struct_test.cpp | 335 +----------------- .../array_test/v1_0/cpp_array_test.cpp | 58 +-- .../cpp_test/cb_test/v1_0/cpp_cb_test.cpp | 18 +- .../cpp_test/data_test/v1_0/cpp_data_test.cpp | 54 +-- .../cpp_test/list_test/v1_0/cpp_list_test.cpp | 58 +-- .../cpp_test/map_test/v1_0/cpp_map_test.cpp | 77 ++-- .../struct_test/v1_0/cpp_struct_test.cpp | 309 +--------------- tools/hdi-gen/util/file.cpp | 4 +- tools/hdi-gen/util/file.h | 5 +- tools/hdi-gen/util/options.cpp | 6 +- tools/hdi-gen/util/options.h | 4 +- 88 files changed, 1251 insertions(+), 2171 deletions(-) diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index 62e239d39..2f1404a34 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -82,57 +82,28 @@ String ASTArrayType::EmitJavaType(TypeMode mode, bool isInnerType) const return String::Format("%s[]", elementType_->EmitJavaType(TypeMode::NO_MODE, false).string()); } -void ASTArrayType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName; - String elementReadName; - + String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - elementName = String::Format("%s[i]", name.string()); - elementReadName = "&" + elementName; + elementName = String::Format("&%s[i]", name.string()); } else { elementName = String::Format("%s[i]", name.string()); - elementReadName = elementName; - } - - elementType_->EmitCProxyWriteVar(parcelName, elementReadName, gotoLabel, sb, prefix + TAB); - sb.Append(prefix).Append("}\n"); -} - -void ASTArrayType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %sLen)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string(), name.string()); - - String element; - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - element = String::Format("&%s[i]", name.string()); - } else { - element = String::Format("%s[i]", name.string()); } - elementType_->EmitCStubWriteVar(parcelName, element, sb, prefix + TAB); + elementType_->EmitCWriteVar(parcelName, elementName, gotoLabel, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); } @@ -142,51 +113,51 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemAlloc(sizeof(%s) * (*%s));\n", + sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n\n"); } else { sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n\n"); } sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + TAB); - sb.Append(prefix).Append(TAB).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", name.string(), name.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("&(*%s)[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } else { String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } sb.Append(prefix).Append("}\n"); } @@ -197,54 +168,54 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s) * (%s));\n", name.string(), + sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("goto errors;\n"); - sb.Append(prefix + TAB).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("}\n\n"); } else { - sb.Append(prefix + TAB).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", + sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("goto errors;\n"); - sb.Append(prefix + TAB).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("}\n\n"); } - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); - sb.Append(prefix + TAB + TAB).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + TAB + TAB); - sb.Append(prefix + TAB + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } else { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append(prefix).Append("}\n"); } @@ -252,14 +223,14 @@ void ASTArrayType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s.size() failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); - elementType_->EmitCppWriteVar(parcelName, elementName, sb, prefix + TAB, innerLevel); + elementType_->EmitCppWriteVar(parcelName, elementName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -274,22 +245,22 @@ void ASTArrayType::EmitCppReadVar(const String& parcelName, const String& name, innerLevel, innerLevel, name.string(), innerLevel); String valueName = String::Format("value%d", innerLevel++); - elementType_->EmitCppReadVar(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppReadVar(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } void ASTArrayType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(data, %sLen)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); String elementName = String::Format("(%s)[i]", name.string()); - elementType_->EmitCMarshalling(elementName, sb, prefix + TAB); + elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); } @@ -298,38 +269,38 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", lenName.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - String newPrefix = prefix + TAB; + String newPrefix = prefix + g_tab; sb.Append(newPrefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * %s);\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(newPrefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(newPrefix + TAB).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); - sb.Append(newPrefix).Append(TAB).AppendFormat("%s[i] = strdup(%s);\n", + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", name.string(), element.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + TAB, freeObjStatements); - sb.Append(newPrefix + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + g_tab, freeObjStatements); + sb.Append(newPrefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); } sb.Append(newPrefix).Append("}\n"); sb.Append(prefix).Append("}\n"); @@ -340,14 +311,14 @@ void ASTArrayType::EmitCppMarshalling(const String& parcelName, const String& na const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s.size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); - elementType_->EmitCppMarshalling(parcelName, elementName, sb, prefix + TAB, innerLevel); + elementType_->EmitCppMarshalling(parcelName, elementName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -366,22 +337,22 @@ void ASTArrayType::EmitCppUnMarshalling(const String& parcelName, const String& String valueName = String::Format("value%d", innerLevel++); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("%s %s;\n", + sb.Append(prefix + g_tab).AppendFormat("%s %s;\n", elementType_->EmitCppType().string(), valueName.string()); - elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append(prefix + TAB).AppendFormat("%s %s;\n", + sb.Append(prefix + g_tab).AppendFormat("%s %s;\n", elementType_->EmitCppType().string(), valueName.string()); String cpName = String::Format("%sCp", valueName.string()); - elementType_->EmitCppUnMarshalling(parcelName, cpName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCppUnMarshalling(parcelName, cpName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", valueName.string(), elementType_->EmitCppType().string(), cpName.string(), elementType_->EmitCppType().string()); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } else { - elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index bd1c50f1d..9518cc660 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -37,12 +37,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_boolean_type.cpp b/tools/hdi-gen/ast/ast_boolean_type.cpp index 924944852..36cd2ff63 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.cpp +++ b/tools/hdi-gen/ast/ast_boolean_type.cpp @@ -62,27 +62,15 @@ String ASTBooleanType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Boolean" : "boolean"; } -void ASTBooleanType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTBooleanType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s ? 1 : 0)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTBooleanType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s ? 1 : 0)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -91,10 +79,10 @@ void ASTBooleanType::EmitCProxyReadVar(const String& parcelName, const String& n { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, (int8_t *)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -103,10 +91,10 @@ void ASTBooleanType::EmitCStubReadVar(const String& parcelName, const String& na { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, (int8_t *)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -114,9 +102,9 @@ void ASTBooleanType::EmitCppWriteVar(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteBool(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -135,9 +123,9 @@ void ASTBooleanType::EmitCppReadVar(const String& parcelName, const String& name void ASTBooleanType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(data, %s ? 1 : 0)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -145,10 +133,10 @@ void ASTBooleanType::EmitCUnMarshalling(const String& name, StringBuilder& sb, c std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(data, (int8_t *)&%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -156,9 +144,9 @@ void ASTBooleanType::EmitCppMarshalling(const String& parcelName, const String& const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteBool(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_boolean_type.h b/tools/hdi-gen/ast/ast_boolean_type.h index 1b42378fb..f88890d22 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.h +++ b/tools/hdi-gen/ast/ast_boolean_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_byte_type.cpp b/tools/hdi-gen/ast/ast_byte_type.cpp index a5e59a65a..81f827ea4 100755 --- a/tools/hdi-gen/ast/ast_byte_type.cpp +++ b/tools/hdi-gen/ast/ast_byte_type.cpp @@ -62,27 +62,15 @@ String ASTByteType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Byte" : "byte"; } -void ASTByteType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTByteType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTByteType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTByteType::EmitCProxyReadVar(const String& parcelName, const String& name const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTByteType::EmitCStubReadVar(const String& parcelName, const String& name, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTByteType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt8(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTByteType::EmitCppReadVar(const String& parcelName, const String& name, S void ASTByteType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt8(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTByteType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt8(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTByteType::EmitCppMarshalling(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt8(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_byte_type.h b/tools/hdi-gen/ast/ast_byte_type.h index 7b93a6b46..8170cfeec 100755 --- a/tools/hdi-gen/ast/ast_byte_type.h +++ b/tools/hdi-gen/ast/ast_byte_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_double_type.cpp b/tools/hdi-gen/ast/ast_double_type.cpp index 2812b655a..35c63e8dc 100755 --- a/tools/hdi-gen/ast/ast_double_type.cpp +++ b/tools/hdi-gen/ast/ast_double_type.cpp @@ -62,27 +62,15 @@ String ASTDoubleType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Double" : "double"; } -void ASTDoubleType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTDoubleType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteDouble(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTDoubleType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteDouble(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTDoubleType::EmitCProxyReadVar(const String& parcelName, const String& na const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTDoubleType::EmitCStubReadVar(const String& parcelName, const String& nam const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTDoubleType::EmitCppWriteVar(const String& parcelName, const String& name const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteDouble(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -132,9 +120,9 @@ void ASTDoubleType::EmitCppReadVar(const String& parcelName, const String& name, void ASTDoubleType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteDouble(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -142,10 +130,10 @@ void ASTDoubleType::EmitCUnMarshalling(const String& name, StringBuilder& sb, co std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadDouble(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -153,9 +141,9 @@ void ASTDoubleType::EmitCppMarshalling(const String& parcelName, const String& n const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteDouble(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_double_type.h b/tools/hdi-gen/ast/ast_double_type.h index 266082c17..33e9f9390 100755 --- a/tools/hdi-gen/ast/ast_double_type.h +++ b/tools/hdi-gen/ast/ast_double_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - virtual void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_enum_type.cpp b/tools/hdi-gen/ast/ast_enum_type.cpp index 829437078..bca78d255 100755 --- a/tools/hdi-gen/ast/ast_enum_type.cpp +++ b/tools/hdi-gen/ast/ast_enum_type.cpp @@ -161,27 +161,15 @@ String ASTEnumType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTEnumType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTEnumType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, (uint32_t)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTEnumType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, (uint32_t)%s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -190,10 +178,10 @@ void ASTEnumType::EmitCProxyReadVar(const String& parcelName, const String& name { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, (uint32_t*)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -202,10 +190,10 @@ void ASTEnumType::EmitCStubReadVar(const String& parcelName, const String& name, { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, (uint32_t*)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -214,9 +202,9 @@ void ASTEnumType::EmitCppWriteVar(const String& parcelName, const String& name, { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32((uint32_t)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -235,9 +223,9 @@ void ASTEnumType::EmitCppReadVar(const String& parcelName, const String& name, S void ASTEnumType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt32(data, (int32_t)%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -245,9 +233,9 @@ void ASTEnumType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(data, (int32_t*)&%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -256,9 +244,9 @@ void ASTEnumType::EmitCppMarshalling(const String& parcelName, const String& nam { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32((uint32_t)%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_enum_type.h b/tools/hdi-gen/ast/ast_enum_type.h index 9d1c3dd75..6f5ebc6da 100755 --- a/tools/hdi-gen/ast/ast_enum_type.h +++ b/tools/hdi-gen/ast/ast_enum_type.h @@ -146,12 +146,9 @@ public: String EmitJavaTypeDecl() const; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_fd_type.cpp b/tools/hdi-gen/ast/ast_fd_type.cpp index 7e36c9d11..3f0d70f8b 100755 --- a/tools/hdi-gen/ast/ast_fd_type.cpp +++ b/tools/hdi-gen/ast/ast_fd_type.cpp @@ -62,27 +62,15 @@ String ASTFdType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Integer" : "int"; } -void ASTFdType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTFdType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFileDescriptor(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTFdType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFileDescriptor(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -98,10 +86,10 @@ void ASTFdType::EmitCProxyReadVar(const String& parcelName, const String& name, name.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (*%s < 0) {\n", name.string()); } - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -111,10 +99,10 @@ void ASTFdType::EmitCStubReadVar(const String& parcelName, const String& name, S sb.Append(prefix).AppendFormat("%s = HdfSbufReadFileDescriptor(%s);\n", name.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s < 0) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -122,9 +110,9 @@ void ASTFdType::EmitCppWriteVar(const String& parcelName, const String& name, St const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteFileDescriptor(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -142,9 +130,9 @@ void ASTFdType::EmitCppReadVar(const String& parcelName, const String& name, Str void ASTFdType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFileDescriptor(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -153,9 +141,9 @@ void ASTFdType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const { sb.Append(prefix).AppendFormat("%s = HdfSbufReadFileDescriptor(data);\n", name.string()); sb.Append(prefix).AppendFormat("if (%s < 0) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -163,9 +151,9 @@ void ASTFdType::EmitCppMarshalling(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteFileDescriptor(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_fd_type.h b/tools/hdi-gen/ast/ast_fd_type.h index c73d8911a..ed775c804 100755 --- a/tools/hdi-gen/ast/ast_fd_type.h +++ b/tools/hdi-gen/ast/ast_fd_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_float_type.cpp b/tools/hdi-gen/ast/ast_float_type.cpp index 701c794a9..1d75ed457 100755 --- a/tools/hdi-gen/ast/ast_float_type.cpp +++ b/tools/hdi-gen/ast/ast_float_type.cpp @@ -62,27 +62,15 @@ String ASTFloatType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Float" : "float"; } -void ASTFloatType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTFloatType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFloat(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTFloatType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFloat(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTFloatType::EmitCProxyReadVar(const String& parcelName, const String& nam const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTFloatType::EmitCStubReadVar(const String& parcelName, const String& name const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTFloatType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteFloat(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -132,9 +120,9 @@ void ASTFloatType::EmitCppReadVar(const String& parcelName, const String& name, void ASTFloatType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteFloat(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -142,10 +130,10 @@ void ASTFloatType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadFloat(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -153,9 +141,9 @@ void ASTFloatType::EmitCppMarshalling(const String& parcelName, const String& na const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteFloat(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_float_type.h b/tools/hdi-gen/ast/ast_float_type.h index f48e5a92e..dee305533 100755 --- a/tools/hdi-gen/ast/ast_float_type.h +++ b/tools/hdi-gen/ast/ast_float_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_integer_type.cpp b/tools/hdi-gen/ast/ast_integer_type.cpp index 6bf7e14a5..00f73158b 100755 --- a/tools/hdi-gen/ast/ast_integer_type.cpp +++ b/tools/hdi-gen/ast/ast_integer_type.cpp @@ -62,27 +62,15 @@ String ASTIntegerType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Integer" : "int"; } -void ASTIntegerType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTIntegerType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTIntegerType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt32(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTIntegerType::EmitCProxyReadVar(const String& parcelName, const String& n const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTIntegerType::EmitCStubReadVar(const String& parcelName, const String& na const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTIntegerType::EmitCppWriteVar(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt32(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -132,9 +120,9 @@ void ASTIntegerType::EmitCppReadVar(const String& parcelName, const String& name void ASTIntegerType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt32(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -142,10 +130,10 @@ void ASTIntegerType::EmitCUnMarshalling(const String& name, StringBuilder& sb, c std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt32(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -153,9 +141,9 @@ void ASTIntegerType::EmitCppMarshalling(const String& parcelName, const String& const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt32(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_integer_type.h b/tools/hdi-gen/ast/ast_integer_type.h index fb7724a0d..aced58964 100755 --- a/tools/hdi-gen/ast/ast_integer_type.h +++ b/tools/hdi-gen/ast/ast_integer_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index 1a7c64f6e..ddd56c9a1 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -129,14 +129,14 @@ String ASTInterfaceType::EmitJavaType(TypeMode mode, bool isInnerType) const return name_; } -void ASTInterfaceType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (HdfSBufWriteRemoteService(data, %s->remote) != 0) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -149,10 +149,10 @@ void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSBufReadRemoteService(data);\n", remoteName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("%s = %sProxyObtain(%s);\n", name.string(), miName.string(), remoteName.string()); @@ -163,9 +163,9 @@ void ASTInterfaceType::EmitCppWriteVar(const String& parcelName, const String& n { sb.Append(prefix).AppendFormat("if (!%s.WriteRemoteObject(%s->AsObject())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_interface_type.h b/tools/hdi-gen/ast/ast_interface_type.h index 9c38d69a6..52673d20c 100755 --- a/tools/hdi-gen/ast/ast_interface_type.h +++ b/tools/hdi-gen/ast/ast_interface_type.h @@ -95,7 +95,7 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; void EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index 8b62d1509..4c8392ed8 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -82,56 +82,28 @@ String ASTListType::EmitJavaType(TypeMode mode, bool isInnerType) const return String::Format("List<%s>", elementType_->EmitJavaType(mode, true).string()); } -void ASTListType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName; - String elementReadName; - + String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - elementName = String::Format("%s[i]", name.string()); - elementReadName = "&" + elementName; + elementName = String::Format("&%s[i]", name.string()); } else { elementName = String::Format("%s[i]", name.string()); - elementReadName = elementName; } - elementType_->EmitCProxyWriteVar(parcelName, elementReadName, gotoLabel, sb, prefix + TAB); - sb.Append(prefix).Append("}\n"); -} - -void ASTListType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %sLen)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string(), name.string()); - - String element; - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT - || elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - element = String::Format("&%s[i]", name.string()); - } else { - element = String::Format("%s[i]", name.string()); - } - elementType_->EmitCStubWriteVar(parcelName, element, sb, prefix + TAB); + elementType_->EmitCWriteVar(parcelName, elementName, gotoLabel, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); } @@ -141,51 +113,51 @@ void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemAlloc(sizeof(%s) * (*%s));\n", + sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n\n"); } else { sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n\n"); } sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + TAB); - sb.Append(prefix).Append(TAB).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", name.string(), name.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("&(*%s)[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCProxyReadVar(parcelName, elementCp, true, gotoLabel, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } else { String element = String::Format("&(*%s)[i]", name.string()); - elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + TAB); + elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); } sb.Append(prefix).Append("}\n"); } @@ -196,54 +168,54 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", parcelName.string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s) * (%s));\n", name.string(), + sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("goto errors;\n"); - sb.Append(prefix + TAB).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("}\n\n"); } else { - sb.Append(prefix + TAB).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", + sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + TAB).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("goto errors;\n"); - sb.Append(prefix + TAB).AppendFormat("}\n"); + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); + sb.Append(prefix + g_tab).AppendFormat("}\n\n"); } - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); - sb.Append(prefix + TAB + TAB).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + TAB + TAB); - sb.Append(prefix + TAB + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCStubReadVar(parcelName, elementCp, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_FILEDESCRIPTOR) { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } else { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + TAB + TAB); + elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append(prefix).Append("}\n"); } @@ -251,14 +223,14 @@ void ASTListType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s.size() failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); - elementType_->EmitCppWriteVar(parcelName, elementName, sb, prefix + TAB, innerLevel); + elementType_->EmitCppWriteVar(parcelName, elementName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -273,22 +245,22 @@ void ASTListType::EmitCppReadVar(const String& parcelName, const String& name, S innerLevel, innerLevel, name.string(), innerLevel); String valueName = String::Format("value%d", innerLevel++); - elementType_->EmitCppReadVar(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppReadVar(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } void ASTListType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(data, %sLen)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); String elementName = String::Format("(%s)[i]", name.string()); - elementType_->EmitCMarshalling(elementName, sb, prefix + TAB); + elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); } @@ -297,40 +269,40 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons { String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", lenName.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", lenName.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - String newPrefix = prefix + TAB; + String newPrefix = prefix + g_tab; sb.Append(newPrefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * %s);\n", name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); sb.Append(newPrefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(newPrefix + TAB).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); - sb.Append(newPrefix).Append(TAB).AppendFormat("%s[i] = strdup(%s);\n", + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", name.string(), element.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { String element = String::Format("%s[i]", name.string()); String elementCp = String::Format("%sElementCp", name.string()); - elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + TAB, freeObjStatements); - sb.Append(newPrefix + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCUnMarshalling(elementCp, sb, newPrefix + g_tab, freeObjStatements); + sb.Append(newPrefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", element.string(), elementType_->EmitCType().string(), elementCp.string(), elementType_->EmitCType().string()); } else { String element = String::Format("%s[i]", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + TAB, freeObjStatements); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); } sb.Append(newPrefix).Append("}\n"); sb.Append(prefix).Append("}\n"); @@ -341,14 +313,14 @@ void ASTListType::EmitCppMarshalling(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s.size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); - elementType_->EmitCppMarshalling(parcelName, elementName, sb, prefix + TAB, innerLevel); + elementType_->EmitCppMarshalling(parcelName, elementName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -367,22 +339,22 @@ void ASTListType::EmitCppUnMarshalling(const String& parcelName, const String& n String valueName = String::Format("value%d", innerLevel++); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("%s %s;\n", + sb.Append(prefix + g_tab).AppendFormat("%s %s;\n", elementType_->EmitCppType().string(), valueName.string()); - elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append(prefix + TAB).AppendFormat("%s %s;\n", + sb.Append(prefix + g_tab).AppendFormat("%s %s;\n", elementType_->EmitCppType().string(), valueName.string()); String cpName = String::Format("%sCp", valueName.string()); - elementType_->EmitCppUnMarshalling(parcelName, cpName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + elementType_->EmitCppUnMarshalling(parcelName, cpName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", valueName.string(), elementType_->EmitCppType().string(), cpName.string(), elementType_->EmitCppType().string()); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } else { - elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); + elementType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s.push_back(%s);\n", name.string(), valueName.string()); } sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index c58233d51..02d5e3c05 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -38,12 +38,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_long_type.cpp b/tools/hdi-gen/ast/ast_long_type.cpp index 55264732b..7cf51b79a 100755 --- a/tools/hdi-gen/ast/ast_long_type.cpp +++ b/tools/hdi-gen/ast/ast_long_type.cpp @@ -62,27 +62,15 @@ String ASTLongType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Long" : "long"; } -void ASTLongType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTLongType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTLongType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt64(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTLongType::EmitCProxyReadVar(const String& parcelName, const String& name const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTLongType::EmitCStubReadVar(const String& parcelName, const String& name, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTLongType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt64(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -132,9 +120,9 @@ void ASTLongType::EmitCppReadVar(const String& parcelName, const String& name, S void ASTLongType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt64(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -142,10 +130,10 @@ void ASTLongType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt64(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -153,9 +141,9 @@ void ASTLongType::EmitCppMarshalling(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt64(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_long_type.h b/tools/hdi-gen/ast/ast_long_type.h index dde4c8d01..355302f76 100755 --- a/tools/hdi-gen/ast/ast_long_type.h +++ b/tools/hdi-gen/ast/ast_long_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_map_type.cpp b/tools/hdi-gen/ast/ast_map_type.cpp index f51f0eba4..999ae8417 100755 --- a/tools/hdi-gen/ast/ast_map_type.cpp +++ b/tools/hdi-gen/ast/ast_map_type.cpp @@ -61,17 +61,17 @@ void ASTMapType::EmitCppWriteVar(const String& parcelName, const String& name, S const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); String keyName = String::Format("(%s.first)", elementName.string()); String valueName = String::Format("(%s.second)", elementName.string()); - keyType_->EmitCppWriteVar(parcelName, keyName, sb, prefix + TAB, innerLevel); - valueType_->EmitCppWriteVar(parcelName, valueName, sb, prefix + TAB, innerLevel); + keyType_->EmitCppWriteVar(parcelName, keyName, sb, prefix + g_tab, innerLevel); + valueType_->EmitCppWriteVar(parcelName, valueName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -87,9 +87,9 @@ void ASTMapType::EmitCppReadVar(const String& parcelName, const String& name, St String KeyName = String::Format("key%d", innerLevel); String valueName = String::Format("value%d", innerLevel); innerLevel++; - keyType_->EmitCppReadVar(parcelName, KeyName, sb, prefix + TAB, true, innerLevel); - valueType_->EmitCppReadVar(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s[%s] = %s;\n", name.string(), KeyName.string(), valueName.string()); + keyType_->EmitCppReadVar(parcelName, KeyName, sb, prefix + g_tab, true, innerLevel); + valueType_->EmitCppReadVar(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s[%s] = %s;\n", name.string(), KeyName.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } @@ -97,17 +97,17 @@ void ASTMapType::EmitCppMarshalling(const String& parcelName, const String& name const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s.size())) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s.size failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); String elementName = String::Format("it%d", innerLevel++); sb.Append(prefix).AppendFormat("for (auto %s : %s) {\n", elementName.string(), name.string()); String keyName = String::Format("(%s.first)", elementName.string()); String valName = String::Format("(%s.second)", elementName.string()); - keyType_->EmitCppMarshalling(parcelName, keyName, sb, prefix + TAB, innerLevel); - valueType_->EmitCppMarshalling(parcelName, valName, sb, prefix + TAB, innerLevel); + keyType_->EmitCppMarshalling(parcelName, keyName, sb, prefix + g_tab, innerLevel); + valueType_->EmitCppMarshalling(parcelName, valName, sb, prefix + g_tab, innerLevel); sb.Append(prefix).Append("}\n"); } @@ -123,9 +123,9 @@ void ASTMapType::EmitCppUnMarshalling(const String& parcelName, const String& na String KeyName = String::Format("key%d", innerLevel); String valueName = String::Format("value%d", innerLevel); innerLevel++; - keyType_->EmitCppUnMarshalling(parcelName, KeyName, sb, prefix + TAB, true, innerLevel); - valueType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + TAB, true, innerLevel); - sb.Append(prefix + TAB).AppendFormat("%s[%s] = %s;\n", + keyType_->EmitCppUnMarshalling(parcelName, KeyName, sb, prefix + g_tab, true, innerLevel); + valueType_->EmitCppUnMarshalling(parcelName, valueName, sb, prefix + g_tab, true, innerLevel); + sb.Append(prefix + g_tab).AppendFormat("%s[%s] = %s;\n", name.string(), KeyName.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_parameter.cpp b/tools/hdi-gen/ast/ast_parameter.cpp index 6247f981d..de7c00227 100755 --- a/tools/hdi-gen/ast/ast_parameter.cpp +++ b/tools/hdi-gen/ast/ast_parameter.cpp @@ -205,5 +205,16 @@ String ASTParameter::EmitJavaLocalVar() { return ""; } + +void ASTParameter::EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, + const String& prefix) const +{ + if (type_ == nullptr) { + return; + } + + type_->EmitCWriteVar(parcelName, name_, gotoLabel, sb, prefix); +} + } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.h b/tools/hdi-gen/ast/ast_parameter.h index d2c905198..033f06886 100755 --- a/tools/hdi-gen/ast/ast_parameter.h +++ b/tools/hdi-gen/ast/ast_parameter.h @@ -67,6 +67,8 @@ public: String EmitCppLocalVar(); String EmitJavaLocalVar(); + + void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; private: String name_; AutoPtr type_ = nullptr; diff --git a/tools/hdi-gen/ast/ast_sequenceable_type.cpp b/tools/hdi-gen/ast/ast_sequenceable_type.cpp index da20f21ab..fd44c9063 100755 --- a/tools/hdi-gen/ast/ast_sequenceable_type.cpp +++ b/tools/hdi-gen/ast/ast_sequenceable_type.cpp @@ -85,9 +85,9 @@ void ASTSequenceableType::EmitCppWriteVar(const String& parcelName, const String { sb.Append(prefix).AppendFormat("if (!%s.WriteStrongParcelable(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -108,9 +108,9 @@ void ASTSequenceableType::EmitCppMarshalling(const String& parcelName, const Str { sb.Append(prefix).AppendFormat("if (!%s.WriteStrongParcelable(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_short_type.cpp b/tools/hdi-gen/ast/ast_short_type.cpp index a30e7a101..0b1c5e999 100755 --- a/tools/hdi-gen/ast/ast_short_type.cpp +++ b/tools/hdi-gen/ast/ast_short_type.cpp @@ -62,27 +62,15 @@ String ASTShortType::EmitJavaType(TypeMode mode, bool isInnerType) const return isInnerType ? "Short" : "short"; } -void ASTShortType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTShortType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTShortType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt16(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -90,10 +78,10 @@ void ASTShortType::EmitCProxyReadVar(const String& parcelName, const String& nam const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -101,10 +89,10 @@ void ASTShortType::EmitCStubReadVar(const String& parcelName, const String& name const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -112,9 +100,9 @@ void ASTShortType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt16(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTShortType::EmitCppReadVar(const String& parcelName, const String& name, void ASTShortType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteInt16(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTShortType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadInt16(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTShortType::EmitCppMarshalling(const String& parcelName, const String& na const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteInt16(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_short_type.h b/tools/hdi-gen/ast/ast_short_type.h index b85ff3715..51e5e2f59 100755 --- a/tools/hdi-gen/ast/ast_short_type.h +++ b/tools/hdi-gen/ast/ast_short_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_string_type.cpp b/tools/hdi-gen/ast/ast_string_type.cpp index d658766fd..2e6cf5dfd 100755 --- a/tools/hdi-gen/ast/ast_string_type.cpp +++ b/tools/hdi-gen/ast/ast_string_type.cpp @@ -62,27 +62,15 @@ String ASTStringType::EmitJavaType(TypeMode mode, bool isInnerType) const return "String"; } -void ASTStringType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTStringType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteString(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTStringType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteString(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -92,10 +80,10 @@ void ASTStringType::EmitCProxyReadVar(const String& parcelName, const String& na sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(%s);\n", name.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -105,10 +93,10 @@ void ASTStringType::EmitCStubReadVar(const String& parcelName, const String& nam sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(%s);\n", name.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -116,9 +104,9 @@ void ASTStringType::EmitCppWriteVar(const String& parcelName, const String& name const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteString(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -136,9 +124,9 @@ void ASTStringType::EmitCppReadVar(const String& parcelName, const String& name, void ASTStringType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteString(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -147,10 +135,10 @@ void ASTStringType::EmitCUnMarshalling(const String& name, StringBuilder& sb, co { sb.Append(prefix).AppendFormat("const char *%s = HdfSbufReadString(data);\n", name.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -158,9 +146,9 @@ void ASTStringType::EmitCppMarshalling(const String& parcelName, const String& n const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteString(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_string_type.h b/tools/hdi-gen/ast/ast_string_type.h index 84f4ff7b0..828bfe6f8 100755 --- a/tools/hdi-gen/ast/ast_string_type.h +++ b/tools/hdi-gen/ast/ast_string_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_struct_type.cpp b/tools/hdi-gen/ast/ast_struct_type.cpp index 9ce8920aa..c56ce8d41 100755 --- a/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/tools/hdi-gen/ast/ast_struct_type.cpp @@ -147,27 +147,15 @@ String ASTStructType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTStructType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTStructType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTStructType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(%s, %s)) {\n", - name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -176,10 +164,10 @@ void ASTStructType::EmitCProxyReadVar(const String& parcelName, const String& na { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -188,10 +176,10 @@ void ASTStructType::EmitCStubReadVar(const String& parcelName, const String& nam { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).AppendFormat("}\n"); } @@ -200,9 +188,9 @@ void ASTStructType::EmitCppWriteVar(const String& parcelName, const String& name { sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(%s, %s)) {\n", EmitCppType().string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -214,8 +202,8 @@ void ASTStructType::EmitCppReadVar(const String& parcelName, const String& name, } sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat("HDF_LOGE(\"%%s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -223,9 +211,9 @@ void ASTStructType::EmitCMarshalling(const String& name, StringBuilder& sb, cons { sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(data, &%s)) {\n", name_.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -234,9 +222,9 @@ void ASTStructType::EmitCUnMarshalling(const String& name, StringBuilder& sb, co { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(data, %s)) {\n", name_.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -245,9 +233,9 @@ void ASTStructType::EmitCppMarshalling(const String& parcelName, const String& n { sb.Append(prefix).AppendFormat("if (!%sBlockMarshalling(%s, %s)) {\n", name_.string(), parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -256,9 +244,9 @@ void ASTStructType::EmitCppUnMarshalling(const String& parcelName, const String& { sb.Append(prefix).AppendFormat("if (!%sBlockUnmarshalling(data, %s)) {\n", EmitCppType().string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_struct_type.h b/tools/hdi-gen/ast/ast_struct_type.h index fb69c3207..7da3850f4 100755 --- a/tools/hdi-gen/ast/ast_struct_type.h +++ b/tools/hdi-gen/ast/ast_struct_type.h @@ -92,12 +92,9 @@ public: String EmitJavaTypeDecl() const; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_type.cpp b/tools/hdi-gen/ast/ast_type.cpp index 6e18d8e08..b6b158b46 100755 --- a/tools/hdi-gen/ast/ast_type.cpp +++ b/tools/hdi-gen/ast/ast_type.cpp @@ -10,7 +10,7 @@ namespace OHOS { namespace HDI { -const char* ASTType::TAB = " "; +const char* g_tab = " "; void ASTType::SetName(const String& name) { @@ -172,18 +172,12 @@ String ASTType::EmitJavaType(TypeMode mode, bool isInnerType) const return "unknow"; } -void ASTType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("//Writeing \"%s\" type of data is not supported\n", name_.string()); } -void ASTType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("//Writing \"%s\" type of data is not supported\n", name_.string()); -} - void ASTType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { diff --git a/tools/hdi-gen/ast/ast_type.h b/tools/hdi-gen/ast/ast_type.h index d2fee8085..f96725df8 100755 --- a/tools/hdi-gen/ast/ast_type.h +++ b/tools/hdi-gen/ast/ast_type.h @@ -16,6 +16,8 @@ namespace OHOS { namespace HDI { +extern const char* g_tab; + enum class TypeKind { TYPE_UNKNOWN = 0, TYPE_BOOLEAN, @@ -121,12 +123,9 @@ public: virtual String EmitJavaType(TypeMode mode, bool isInnerType = false) const; - virtual void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + virtual void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; - virtual void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const; - virtual void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; @@ -153,7 +152,6 @@ public: virtual void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const; protected: - static const char* TAB; String name_; AutoPtr namespace_; TypeKind typeKind_; diff --git a/tools/hdi-gen/ast/ast_uchar_type.cpp b/tools/hdi-gen/ast/ast_uchar_type.cpp index 50e70e516..94e177824 100755 --- a/tools/hdi-gen/ast/ast_uchar_type.cpp +++ b/tools/hdi-gen/ast/ast_uchar_type.cpp @@ -63,27 +63,15 @@ String ASTUcharType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUcharType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTUcharType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTUcharType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint8(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -91,10 +79,10 @@ void ASTUcharType::EmitCProxyReadVar(const String& parcelName, const String& nam const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -102,10 +90,10 @@ void ASTUcharType::EmitCStubReadVar(const String& parcelName, const String& name const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -113,9 +101,9 @@ void ASTUcharType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint8(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTUcharType::EmitCppReadVar(const String& parcelName, const String& name, void ASTUcharType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint8(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTUcharType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint8(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTUcharType::EmitCppMarshalling(const String& parcelName, const String& na const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint8(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_uchar_type.h b/tools/hdi-gen/ast/ast_uchar_type.h index 825b503c6..87cd06151 100755 --- a/tools/hdi-gen/ast/ast_uchar_type.h +++ b/tools/hdi-gen/ast/ast_uchar_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_uint_type.cpp b/tools/hdi-gen/ast/ast_uint_type.cpp index 6d27b5499..964d61ea5 100755 --- a/tools/hdi-gen/ast/ast_uint_type.cpp +++ b/tools/hdi-gen/ast/ast_uint_type.cpp @@ -63,27 +63,15 @@ String ASTUintType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUintType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTUintType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTUintType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -91,10 +79,10 @@ void ASTUintType::EmitCProxyReadVar(const String& parcelName, const String& name const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -102,10 +90,10 @@ void ASTUintType::EmitCStubReadVar(const String& parcelName, const String& name, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -113,9 +101,9 @@ void ASTUintType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTUintType::EmitCppReadVar(const String& parcelName, const String& name, S void ASTUintType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint32(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTUintType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTUintType::EmitCppMarshalling(const String& parcelName, const String& nam const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint32(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_uint_type.h b/tools/hdi-gen/ast/ast_uint_type.h index 97458c444..80ae8f2e1 100755 --- a/tools/hdi-gen/ast/ast_uint_type.h +++ b/tools/hdi-gen/ast/ast_uint_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_ulong_type.cpp b/tools/hdi-gen/ast/ast_ulong_type.cpp index d42fe90b8..dd09f23f2 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.cpp +++ b/tools/hdi-gen/ast/ast_ulong_type.cpp @@ -63,27 +63,15 @@ String ASTUlongType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUlongType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTUlongType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTUlongType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint64(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -91,10 +79,10 @@ void ASTUlongType::EmitCProxyReadVar(const String& parcelName, const String& nam const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -102,10 +90,10 @@ void ASTUlongType::EmitCStubReadVar(const String& parcelName, const String& name const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -113,9 +101,9 @@ void ASTUlongType::EmitCppWriteVar(const String& parcelName, const String& name, const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint64(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTUlongType::EmitCppReadVar(const String& parcelName, const String& name, void ASTUlongType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint64(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTUlongType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint64(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTUlongType::EmitCppMarshalling(const String& parcelName, const String& na const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint64(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_ulong_type.h b/tools/hdi-gen/ast/ast_ulong_type.h index 599ccd294..a53dbbf04 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.h +++ b/tools/hdi-gen/ast/ast_ulong_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index dfdf7bd9e..ee49a1c0f 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -147,27 +147,15 @@ String ASTUnionType::EmitJavaTypeDecl() const return sb.ToString(); } -void ASTUnionType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", parcelName.string(), name.string(), EmitCType().string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTUnionType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", - parcelName.string(), name.string(), EmitCType().string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -178,8 +166,10 @@ void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& nam EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -190,10 +180,10 @@ void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -202,9 +192,9 @@ void ASTUnionType::EmitCppWriteVar(const String& parcelName, const String& name, { sb.Append(prefix).AppendFormat("if (!%s.WriteUnpadBuffer((const uint8_t *)&%s, sizeof(%s))) {\n", parcelName.string(), name.string(), EmitCppType().string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -219,8 +209,8 @@ void ASTUnionType::EmitCppReadVar(const String& parcelName, const String& name, EmitCppType().string(), name.string(), EmitCppType().string(), parcelName.string(), EmitCppType().string()); sb.Append(prefix).AppendFormat("if (%sCp == nullptr) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("HDF_LOGE(\"%%s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %sCp, sizeof(%s));\n", name.string(), EmitCppType().string(), name.string(), EmitCppType().string()); @@ -230,9 +220,9 @@ void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(data, (const uint8_t *)&%s, sizeof(%s))) {\n", name.string(), EmitCType().string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -242,9 +232,9 @@ void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(prefix).AppendFormat("const %s *%s = (const %s *)HdfSbufReadUnpadBuffer(data, sizeof(%s));\n", EmitCType().string(), name.string(), EmitCType().string(), EmitCType().string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -253,9 +243,9 @@ void ASTUnionType::EmitCppMarshalling(const String& parcelName, const String& na { sb.Append(prefix).AppendFormat("if (!%s.WriteUnpadBuffer((const void*)&%s, sizeof(%s))) {\n", parcelName.string(), name.string(), EmitCppType().string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -267,9 +257,9 @@ void ASTUnionType::EmitCppUnMarshalling(const String& parcelName, const String& EmitCppType().string(), name.string(), EmitCppType().string(), parcelName.string(), EmitCppType().string()); sb.Append(prefix).AppendFormat("if (%s == nullptr) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_union_type.h b/tools/hdi-gen/ast/ast_union_type.h index 4d494896a..bcd9acceb 100755 --- a/tools/hdi-gen/ast/ast_union_type.h +++ b/tools/hdi-gen/ast/ast_union_type.h @@ -92,12 +92,9 @@ public: String EmitJavaTypeDecl() const; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/ast/ast_ushort_type.cpp b/tools/hdi-gen/ast/ast_ushort_type.cpp index 5e81653c6..57e2c76ec 100755 --- a/tools/hdi-gen/ast/ast_ushort_type.cpp +++ b/tools/hdi-gen/ast/ast_ushort_type.cpp @@ -63,27 +63,15 @@ String ASTUshortType::EmitJavaType(TypeMode mode, bool isInnerType) const return "/"; } -void ASTUshortType::EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, +void ASTUshortType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).Append("}\n"); -} - -void ASTUshortType::EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const -{ - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint16(%s, %s)) {\n", - parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( - "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -91,10 +79,10 @@ void ASTUshortType::EmitCProxyReadVar(const String& parcelName, const String& na const String& gotoLabel, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); } @@ -102,10 +90,10 @@ void ASTUshortType::EmitCStubReadVar(const String& parcelName, const String& nam const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(%s, %s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -113,9 +101,9 @@ void ASTUshortType::EmitCppWriteVar(const String& parcelName, const String& name const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint16(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix).Append("}\n"); } @@ -133,9 +121,9 @@ void ASTUshortType::EmitCppReadVar(const String& parcelName, const String& name, void ASTUshortType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUint16(data, %s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } @@ -143,10 +131,10 @@ void ASTUshortType::EmitCUnMarshalling(const String& name, StringBuilder& sb, co std::vector& freeObjStatements) const { sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint16(data, &%s)) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); - EmitFreeStatements(freeObjStatements, sb, prefix + TAB); - sb.Append(prefix + TAB).Append("goto errors;\n"); + EmitFreeStatements(freeObjStatements, sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); } @@ -154,9 +142,9 @@ void ASTUshortType::EmitCppMarshalling(const String& parcelName, const String& n const String& prefix, unsigned int innerLevel) const { sb.Append(prefix).AppendFormat("if (!%s.WriteUint16(%s)) {\n", parcelName.string(), name.string()); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); - sb.Append(prefix + TAB).Append("return false;\n"); + sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/ast/ast_ushort_type.h b/tools/hdi-gen/ast/ast_ushort_type.h index 08489189f..3ba7204a5 100755 --- a/tools/hdi-gen/ast/ast_ushort_type.h +++ b/tools/hdi-gen/ast/ast_ushort_type.h @@ -27,12 +27,9 @@ public: String EmitJavaType(TypeMode mode, bool isInnerType = false) const override; - void EmitCProxyWriteVar(const String& parcelName, const String& name, const String& gotoLabel, + void EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; - void EmitCStubWriteVar(const String& parcelName, const String& name, StringBuilder& sb, - const String& prefix) const override; - void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp index 75aec71e4..909d345d6 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp @@ -85,9 +85,9 @@ void CClientInterfaceCodeEmitter::EmitForwardDecls(StringBuilder& sb) void CClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) { sb.AppendFormat("struct %s {\n", interfaceName_.string()); - sb.Append(TAB).Append("struct HdfRemoteService *remote;\n"); + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); sb.Append("\n"); - EmitInterfaceMethodsDecl(sb, TAB); + EmitInterfaceMethodsDecl(sb, g_tab); sb.Append("};\n"); if (!isCallbackInterface()) { sb.Append("\n"); @@ -126,7 +126,7 @@ void CClientInterfaceCodeEmitter::EmitInterfaceMethodDecl(const AutoPtrremote == NULL\n"); - sb.Append(TAB).Append(TAB).Append("|| self->remote->dispatcher == NULL\n"); - sb.Append(TAB).Append(TAB).Append("|| self->remote->dispatcher->Dispatch == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: obj is null\", __func__);\n"); - sb.Append(TAB).Append(TAB).Append("return HDF_ERR_INVALID_OBJECT;\n"); - sb.Append(TAB).Append("}\n"); - sb.Append(TAB).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + sb.Append(g_tab).Append("if (self->remote == NULL\n"); + sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher == NULL\n"); + sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher->Dispatch == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: obj is null\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_OBJECT;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); sb.Append("}\n"); } @@ -190,7 +190,7 @@ void CClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& meth } paramStr.Append(")"); - sb.Append(SpecificationParam(paramStr, TAB)); + sb.Append(SpecificationParam(paramStr, g_tab)); sb.Append("\n"); } EmitProxyMethodBody(method, sb, ""); @@ -200,18 +200,18 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth const String& prefix) { sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("int32_t ec = HDF_FAILURE;\n"); + sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); sb.Append("\n"); - sb.Append(prefix + TAB).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix + TAB).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix + g_tab).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix + g_tab).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); sb.Append("\n"); - sb.Append(prefix + TAB).Append("if (data == NULL || reply == NULL) {\n"); - sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); - sb.Append(prefix + TAB + TAB).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB + TAB).Append("goto finished;\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("if (data == NULL || reply == NULL) {\n"); + sb.Append(prefix + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); + sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).Append("goto finished;\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("\n"); String gotoName = GetGotLabel(method); @@ -219,24 +219,24 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteProxyMethodParameter(param, "data", gotoName, sb, prefix + TAB); + param->EmitCWriteVar("data", gotoName, sb, prefix + g_tab); sb.Append("\n"); } } - sb.Append(prefix + TAB).AppendFormat("ec = %sCall(self, CMD_%s, data, reply);\n", + sb.Append(prefix + g_tab).AppendFormat("ec = %sCall(self, CMD_%s, data, reply);\n", proxyName_.string(), ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + TAB + TAB).Append( + sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s: call failed! error code is %{public}d\", __func__, ec);\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("goto %s;\n", gotoName.string()); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoName.string()); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadProxyMethodParameter(param, "reply", gotoName, sb, prefix + TAB); + EmitReadProxyMethodParameter(param, "reply", gotoName, sb, prefix + g_tab); sb.Append("\n"); } } @@ -244,23 +244,16 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth EmitErrorHandle(method, sb, prefix); sb.Append(prefix).Append("finished:\n"); - sb.Append(prefix + TAB).Append("if (data != NULL) {\n"); - sb.Append(prefix + TAB + TAB).Append("HdfSBufRecycle(data);\n"); - sb.Append(prefix + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("if (reply != NULL) {\n"); - sb.Append(prefix + TAB + TAB).Append("HdfSBufRecycle(reply);\n"); - sb.Append(prefix + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("return ec;\n"); + sb.Append(prefix + g_tab).Append("if (data != NULL) {\n"); + sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(data);\n"); + sb.Append(prefix + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("if (reply != NULL) {\n"); + sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(reply);\n"); + sb.Append(prefix + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitWriteProxyMethodParameter(const AutoPtr& param, - const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - type->EmitCProxyWriteVar(parcelName, param->GetName(), gotoLabel, sb, prefix); -} - void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) { @@ -275,8 +268,8 @@ void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtrEmitCType().string(), type->EmitCType().string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); type->EmitCProxyReadVar(parcelName, name, false, gotoLabel, sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_UNION) { @@ -285,8 +278,8 @@ void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtrGetName().string(), type->EmitCType().string(), type->EmitCType().string()); sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("(void)memcpy_s(*%s, sizeof(%s), %s, sizeof(%s));\n", param->GetName().string(), type->EmitCType().string(), cpName.string(), type->EmitCType().string()); @@ -329,13 +322,13 @@ void CClientProxyCodeEmitter::EmitErrorHandle(const AutoPtr& method, || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { if (!errorLabel) { - sb.Append(prefix + TAB).Append("goto finished;\n"); + sb.Append(prefix + g_tab).Append("goto finished;\n"); sb.Append("\n"); sb.Append(prefix).Append("errors:\n"); errorLabel = true; } - EmitError(paramType, param->GetName(), sb, prefix + TAB); + EmitError(paramType, param->GetName(), sb, prefix + g_tab); sb.Append("\n"); } } @@ -348,8 +341,8 @@ void CClientProxyCodeEmitter::EmitError(const AutoPtr& type, const Stri case TypeKind::TYPE_STRING: case TypeKind::TYPE_UNION: { sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("*%s = NULL;\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -362,21 +355,21 @@ void CClientProxyCodeEmitter::EmitError(const AutoPtr& type, const Stri if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); String elementName = String::Format("(*%s)[i]", name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else { - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(&%s, false);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("*%s = NULL;\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -389,28 +382,28 @@ void CClientProxyCodeEmitter::EmitError(const AutoPtr& type, const Stri if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); String elementName = String::Format("(*%s)[i]", name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else { - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(&%s, false);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("*%s = NULL;\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); sb.Append(prefix).Append("}\n"); break; } case TypeKind::TYPE_STRUCT: { sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("%sFree(*%s, true);\n", type->GetName().string(), name.string()); - sb.Append(prefix + TAB).AppendFormat("*%s = NULL;\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("%sFree(*%s, true);\n", type->GetName().string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -435,7 +428,7 @@ void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(TAB).AppendFormat("%s->%s = %sProxy%s;\n", + sb.Append(g_tab).AppendFormat("%s->%s = %sProxy%s;\n", objName.string(), method->GetName().string(), infName_.string(), method->GetName().string()); } @@ -446,36 +439,36 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) { sb.AppendFormat("struct %s *Hdi%sGet()\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); - sb.Append(TAB).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n"); - sb.Append(TAB).Append("if (serviceMgr == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: HDIServiceManager not found!\", __func__);\n"); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n"); + sb.Append(g_tab).Append("if (serviceMgr == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: HDIServiceManager not found!\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).Append("struct HdfRemoteService *remote = "); + sb.Append(g_tab).Append("struct HdfRemoteService *remote = "); sb.AppendFormat("serviceMgr->GetService(serviceMgr, \"%sService\");\n", infName_.string()); - sb.Append(TAB).Append("HDIServiceManagerRelease(serviceMgr);\n"); - sb.Append(TAB).Append("if (remote == NULL) {\n"); - sb.Append(TAB).Append(TAB).AppendFormat( + sb.Append(g_tab).Append("HDIServiceManagerRelease(serviceMgr);\n"); + sb.Append(g_tab).Append("if (remote == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", infName_.string()); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", + sb.Append(g_tab).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", interfaceName_.string(), infName_.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(TAB).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat( + sb.Append(g_tab).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: malloc %s instance failed!\", __func__);\n", interfaceName_.string()); - sb.Append(TAB).Append(TAB).Append("HdfRemoteServiceRecycle(remote);\n"); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append(g_tab).Append("HdfRemoteServiceRecycle(remote);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).AppendFormat("%sClient->remote = remote;\n", infName_.string()); - sb.Append(TAB).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); - sb.Append(TAB).AppendFormat("return %sClient;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sClient->remote = remote;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("return %sClient;\n", infName_.string()); sb.Append("}\n"); } @@ -483,12 +476,12 @@ void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) { sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(TAB).Append("if (instance == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("return;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); - sb.Append(TAB).Append("HdfRemoteServiceRecycle(instance->remote);\n"); - sb.Append(TAB).Append("OsalMemFree(instance);\n"); + sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + sb.Append(g_tab).Append("OsalMemFree(instance);\n"); sb.Append("}\n"); } @@ -497,15 +490,15 @@ void CClientProxyCodeEmitter::EmitCbProxyObtainMethodImpl(StringBuilder& sb) sb.AppendFormat("struct %s *%sProxyObtain(struct HdfRemoteService *remote)\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct %s *callback = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + sb.Append(g_tab).AppendFormat("struct %s *callback = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", interfaceName_.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(TAB).Append("if (callback == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("HDF_LOGE(\"%{public}s: OsalMemAlloc failed!\", __func__);\n"); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n\n"); - sb.Append(TAB).Append("callback->remote = remote;\n"); - sb.Append(TAB).AppendFormat("%sProxyConstruct(callback);\n", infName_.string()); - sb.Append(TAB).Append("return callback;\n"); + sb.Append(g_tab).Append("if (callback == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: OsalMemAlloc failed!\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).Append("callback->remote = remote;\n"); + sb.Append(g_tab).AppendFormat("%sProxyConstruct(callback);\n", infName_.string()); + sb.Append(g_tab).Append("return callback;\n"); sb.Append("}\n"); } @@ -513,10 +506,10 @@ void CClientProxyCodeEmitter::EmitCbProxyReleaseMethodImpl(StringBuilder& sb) { sb.AppendFormat("void %sProxyRelease(struct %s *callback)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(TAB).Append("if (callback == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("return;\n"); - sb.Append(TAB).Append("}\n"); - sb.Append(TAB).Append("OsalMemFree(callback);\n"); + sb.Append(g_tab).Append("if (callback == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).Append("OsalMemFree(callback);\n"); sb.Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 8594cfc20..59b1ccaff 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -39,9 +39,6 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); - void EmitWriteProxyMethodParameter(const AutoPtr& param, const String& parcelName, - const String& gotoLabel, StringBuilder& sb, const String& prefix); - void EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index 03c5edcd3..b98e50c12 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -15,8 +15,6 @@ namespace OHOS { namespace HDI { -const char* CCodeEmitter::TAB = " "; - CCodeEmitter::CCodeEmitter(const AutoPtr& ast, const String& targetDirectory) :LightRefCountBase(), ast_(ast), directory_(targetDirectory) { @@ -70,7 +68,7 @@ void CCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb) sb.Append("enum {\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(TAB).AppendFormat("CMD_%s,\n", ConstantName(method->GetName()).string()); + sb.Append(g_tab).AppendFormat("CMD_%s,\n", ConstantName(method->GetName()).string()); } sb.Append("};\n"); } diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index a067ff799..d2a617575 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -69,8 +69,6 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - static const char* TAB; - AutoPtr ast_; AutoPtr interface_; diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 4cecdd681..aba22f4ff 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -200,11 +200,11 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMarshallingImpl(StringBuilder& sb, c String memberName = type->GetMemberName(i); AutoPtr memberType = type->GetMemberType(i); String name = String::Format("%s->%s", objName.string(), memberName.string()); - memberType->EmitCMarshalling(name, sb, TAB); + memberType->EmitCMarshalling(name, sb, g_tab); sb.Append("\n"); } - sb.Append(TAB).Append("return true;\n"); + sb.Append(g_tab).Append("return true;\n"); sb.Append("}\n"); } @@ -217,9 +217,9 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(TAB).Append(TAB).Append("return false;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return false;\n"); + sb.Append(g_tab).Append("}\n"); for (size_t i = 0; i < type->GetMemberNumber(); i++) { AutoPtr memberType = type->GetMemberType(i); @@ -228,20 +228,20 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, if (memberType->GetTypeKind() == TypeKind::TYPE_STRING) { String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, TAB, freeObjStatements_); - sb.Append(TAB).AppendFormat("%s = strdup(%s);\n", name.string(), tmpName.string()); - sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(TAB).Append(TAB).Append("goto errors;\n"); - sb.Append(TAB).Append("}\n"); + memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", name.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); + sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); } else if (memberType->GetTypeKind() == TypeKind::TYPE_STRUCT) { String paramName = String::Format("&%s", name.string()); - memberType->EmitCUnMarshalling(paramName, sb, TAB, freeObjStatements_); + memberType->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); sb.Append("\n"); } else if (memberType->GetTypeKind() == TypeKind::TYPE_UNION) { String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, TAB, freeObjStatements_); - sb.Append(TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", name.string(), memberType->EmitCType().string(), tmpName.string(), memberType->EmitCType().string()); sb.Append("\n"); @@ -249,38 +249,38 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, String tmpName = String::Format("%sCp", memberName.string()); AutoPtr arrayType = dynamic_cast(memberType.Get()); AutoPtr elementType = arrayType->GetElementType(); - sb.Append(TAB).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(TAB).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, TAB, freeObjStatements_); - sb.Append(TAB).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(TAB).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); + memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); sb.Append("\n"); } else if (memberType->GetTypeKind() == TypeKind::TYPE_LIST) { String tmpName = String::Format("%sCp", memberName.string()); AutoPtr listType = dynamic_cast(memberType.Get()); AutoPtr elementType = listType->GetElementType(); - sb.Append(TAB).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(TAB).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, TAB, freeObjStatements_); - sb.Append(TAB).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(TAB).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); + memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); sb.Append("\n"); } else { - memberType->EmitCUnMarshalling(name, sb, TAB, freeObjStatements_); + memberType->EmitCUnMarshalling(name, sb, g_tab, freeObjStatements_); sb.Append("\n"); } } - sb.Append(TAB).AppendFormat("return true;\n"); + sb.Append(g_tab).AppendFormat("return true;\n"); sb.Append("errors:\n"); for (size_t i = 0; i < type->GetMemberNumber(); i++) { AutoPtr memberType = type->GetMemberType(i); String memberName = type->GetMemberName(i); String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitError(name, memberType, sb, TAB); + EmitError(name, memberType, sb, g_tab); } - sb.Append(TAB).Append("return false;\n"); + sb.Append(g_tab).Append("return false;\n"); sb.Append("}\n"); } @@ -291,7 +291,7 @@ void CCustomTypesCodeEmitter::EmitError(const String& name, const AutoPtrGetTypeKind()) { case TypeKind::TYPE_STRING: { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n\n"); break; } @@ -303,22 +303,22 @@ void CCustomTypesCodeEmitter::EmitError(const String& name, const AutoPtr 0 && %s != NULL) {\n", lenName.string(), name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); String elementName = String::Format("(%s)[i]", name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(&(%s), false);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n"); sb.Append("\n"); break; @@ -331,22 +331,22 @@ void CCustomTypesCodeEmitter::EmitError(const String& name, const AutoPtr 0 && %s != NULL) {\n", lenName.string(), name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); String elementName = String::Format("(%s)[i]", name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(&(%s), false);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n"); sb.Append("\n"); break; @@ -367,21 +367,21 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.AppendFormat("void %sFree(%s *%s, bool freeSelf)\n", type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(TAB).Append(TAB).Append("return;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); for (size_t i = 0; i < type->GetMemberNumber(); i++) { AutoPtr memberType = type->GetMemberType(i); String memberName = type->GetMemberName(i); String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitCustomTypeMemberFree(sb, name, memberType, TAB); + EmitCustomTypeMemberFree(sb, name, memberType, g_tab); } - sb.Append(TAB).Append("if (freeSelf) {\n"); - sb.Append(TAB).Append(TAB).Append("OsalMemFree(dataBlock);\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append("if (freeSelf) {\n"); + sb.Append(g_tab).Append(g_tab).Append("OsalMemFree(dataBlock);\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("}\n"); } @@ -392,7 +392,7 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMemberFree(StringBuilder& sb, const switch (type->GetTypeKind()) { case TypeKind::TYPE_STRING: { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n\n"); break; } @@ -402,16 +402,16 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMemberFree(StringBuilder& sb, const sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); + sb.Append(prefix + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(%s, false);\n", + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", elementType->GetName().string(), name.string()); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n\n"); break; } @@ -421,16 +421,16 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMemberFree(StringBuilder& sb, const sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); + sb.Append(prefix + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + TAB + TAB).AppendFormat("%sFree(%s, false);\n", + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", elementType->GetName().string(), name.string()); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); sb.Append(prefix).Append("}\n\n"); break; } diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index d67c84584..7aa2954d3 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -79,8 +79,8 @@ void CServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb) void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) { sb.AppendFormat("struct Hdf%sService {\n", infName_.string()); - sb.Append(TAB).AppendFormat("struct IDeviceIoService ioservice;\n"); - sb.Append(TAB).Append("void *instance;\n"); + sb.Append(g_tab).AppendFormat("struct IDeviceIoService ioservice;\n"); + sb.Append(g_tab).Append("void *instance;\n"); sb.Append("};\n"); } @@ -88,13 +88,13 @@ void CServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb) { sb.AppendFormat("static int32_t %sServiceDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", infName_.string()); - sb.Append(TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); + sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", infName_.string()); - sb.Append(TAB).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", + sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", infName_.string(), infName_.string()); sb.Append("}\n"); } @@ -103,8 +103,8 @@ void CServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); - sb.Append(TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); + sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -112,29 +112,29 @@ void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); sb.Append("\n"); - sb.Append(TAB).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", infName_.string(), infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); - sb.Append(TAB).AppendFormat("if (hdf%sService == NULL) {\n", infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat( + sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); + sb.Append(g_tab).AppendFormat("if (hdf%sService == NULL) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sService failed!\");\n", infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", infName_.string(), infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->instance = Hdi%sInstance();\n", infName_.string(), infName_.string()); - sb.Append(TAB).AppendFormat("if (hdf%sService->instance == NULL) {\n", infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); - sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sService->instance = Hdi%sInstance();\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("if (hdf%sService->instance == NULL) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); - sb.Append(TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(g_tab).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); + sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -142,23 +142,23 @@ void CServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", infName_.string()); - sb.Append(TAB).AppendFormat("Hdi%sRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); - sb.Append(TAB).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); + sb.Append(g_tab).AppendFormat("Hdi%sRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); sb.Append("}\n"); } void CServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) { sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); - sb.Append(TAB).Append(".moduleVersion = 1,\n"); - sb.Append(TAB).Append(".moduleName = \"sample\", /* please change the moduleName */\n"); - sb.Append(TAB).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); - sb.Append(TAB).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); - sb.Append(TAB).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); + sb.Append(g_tab).Append(".moduleVersion = 1,\n"); + sb.Append(g_tab).Append(".moduleName = \"sample\", /* please change the moduleName */\n"); + sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); + sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); + sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); sb.Append("};\n\n"); sb.AppendFormat("HDF_INIT(g_%sDriverEntry);", infName_.ToLowerCase().string()); } diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index ae876957a..d7f9a8b89 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -140,12 +140,12 @@ void CServiceImplCodeEmitter::EmitServiceImplMethodImpl(const AutoPtr } paramStr.Append(")"); - sb.Append(SpecificationParam(paramStr, prefix + TAB)); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); sb.Append("\n"); } sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(prefix + g_tab).Append("return HDF_SUCCESS;\n"); sb.Append(prefix).Append("}\n"); } @@ -157,7 +157,7 @@ void CServiceImplCodeEmitter::EmitServiceImplConstruct(StringBuilder& sb) sb.Append("{\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(TAB).AppendFormat("%s->%s = %s%s;\n", + sb.Append(g_tab).AppendFormat("%s->%s = %s%s;\n", objName.string(), method->GetName().string(), infName_.string(), method->GetName().string()); } sb.Append("}\n"); @@ -168,15 +168,15 @@ void CServiceImplCodeEmitter::EmitServiceImplInstance(StringBuilder& sb) String objName("instance"); sb.AppendFormat("struct %s *Hdi%sInstance()\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", interfaceName_.string(), objName.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(TAB).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(TAB).Append(TAB).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", interfaceName_.string(), objName.string()); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n"); - sb.Append(TAB).AppendFormat("%sServiceConstruct(%s);\n", infName_.string(), objName.string()); - sb.Append(TAB).AppendFormat("return %s;\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).AppendFormat("%sServiceConstruct(%s);\n", infName_.string(), objName.string()); + sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); sb.Append("}\n"); } @@ -184,10 +184,10 @@ void CServiceImplCodeEmitter::EmitServiceImplRelease(StringBuilder& sb) { sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(TAB).Append("if (instance == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("return;\n"); - sb.Append(TAB).Append("}\n"); - sb.Append(TAB).Append("OsalMemFree(instance);\n"); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).Append("OsalMemFree(instance);\n"); sb.Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp index a38821b7d..522e81d7f 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp @@ -85,7 +85,7 @@ void CServiceInterfaceCodeEmitter::EmitInterfaceDataDecls(StringBuilder& sb) void CServiceInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) { sb.AppendFormat("struct %s {\n", interfaceName_.string()); - EmitInterfaceMethods(sb, TAB); + EmitInterfaceMethods(sb, g_tab); sb.Append("};\n\n"); EmitInterfaceInstanceMethodDecl(sb); sb.Append("\n"); @@ -124,7 +124,7 @@ void CServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& } paramStr.Append(");"); - sb.Append(SpecificationParam(paramStr, prefix + TAB)); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); sb.Append("\n"); } } @@ -143,7 +143,7 @@ void CServiceInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& void CServiceInterfaceCodeEmitter::EmitInterfaceRequestMethodDecl(StringBuilder& sb) { sb.AppendFormat("int32_t %sServiceOnRemoteRequest(void *service, int cmdId,\n", infName_.string()); - sb.Append(TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply);\n"); + sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply);\n"); } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index e4d7794aa..0613842fb 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -156,29 +156,29 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *data, struct HdfSBuf *reply)\n", method->GetName().string(), interfaceName_.string()); sb.Append(prefix).Append("{\n"); + sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); - sb.Append(prefix + TAB).Append("int32_t ec = HDF_FAILURE;\n"); - + String gotoName = "errors"; if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - EmitStubLocalVariable(param, sb, prefix + TAB); + EmitStubLocalVariable(param, sb, prefix + g_tab); } sb.Append("\n"); for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadStubMethodParameter(param, "data", sb, prefix + TAB); + EmitReadStubMethodParameter(param, "data", sb, prefix + g_tab); sb.Append("\n"); } } } if (method->GetParameterNumber() == 0) { - sb.Append(prefix + TAB).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); } else { - sb.Append(prefix + TAB).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); @@ -189,28 +189,28 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr sb.AppendFormat(");\n", method->GetName().string()); } - sb.Append(prefix + TAB).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + TAB + TAB).AppendFormat( + sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); - sb.Append(prefix + TAB + TAB).Append("goto errors;\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoName.string()); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("\n"); for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitWriteStubMethodParameter(param, "reply", sb, prefix + TAB); + param->EmitCWriteVar("reply", gotoName, sb, prefix + g_tab); sb.Append("\n"); } } - sb.Append(prefix).Append("errors:\n"); + sb.Append(prefix).AppendFormat("%s:\n", gotoName.string()); for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - EmitError(param, sb, prefix + TAB); + EmitError(param, sb, prefix + g_tab); } - sb.Append(prefix + TAB).Append("return ec;\n"); + sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append(prefix).Append("}\n"); } @@ -239,8 +239,8 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtrGetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), type->EmitCType(TypeMode::NO_MODE).string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_UNION) { @@ -249,8 +249,8 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtrGetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), type->EmitCType(TypeMode::NO_MODE).string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + TAB).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + TAB).Append("goto errors;\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); sb.Append(prefix).AppendFormat("(void)memcpy_s(%s, sizeof(%s), %s, sizeof(%s));\n", param->GetName().string(), type->EmitCType(TypeMode::NO_MODE).string(), cpName.string(), type->EmitCType(TypeMode::NO_MODE).string()); @@ -264,13 +264,6 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr& param, - const String& parcelName, StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - type->EmitCStubWriteVar(parcelName, param->GetName(), sb, prefix); -} - void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name) { @@ -287,7 +280,6 @@ void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr } } - void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix) { AutoPtr type = param->GetType(); @@ -295,7 +287,7 @@ void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, Stri case TypeKind::TYPE_STRING: case TypeKind::TYPE_UNION: { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); sb.Append(prefix).Append("}\n\n"); break; } @@ -309,19 +301,19 @@ void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, Stri if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); String elementName = String::Format("%s[i]", param->GetName().string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("%sFree(&%s, false);\n", + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); sb.Append(prefix).Append("}\n"); sb.Append("\n"); break; @@ -336,26 +328,26 @@ void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, Stri if (elementType->GetTypeKind() == TypeKind::TYPE_STRING || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); String elementName = String::Format("%s[i]", param->GetName().string()); if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + TAB + TAB).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("%sFree(&%s, false);\n", + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", elementType->GetName().string(), elementName.string()); } - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); } - sb.Append(prefix + TAB).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); sb.Append(prefix).Append("}\n"); sb.Append("\n"); break; } case TypeKind::TYPE_STRUCT: { sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + TAB).AppendFormat("%sFree(%s, true);\n", + sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", type->GetName().string(), param->GetName().string()); sb.Append(prefix).Append("}\n\n"); break; @@ -377,33 +369,33 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(struct HdfRemoteService *service, int %s,\n", infName_.string(), codeName.string()); } - sb.Append(prefix + TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); + sb.Append(prefix + g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).AppendFormat("struct %s *serviceImpl = (struct %s*)service;\n", + sb.Append(prefix + g_tab).AppendFormat("struct %s *serviceImpl = (struct %s*)service;\n", interfaceName_.string(), interfaceName_.string()); - sb.Append(prefix + TAB).AppendFormat("switch (%s) {\n", codeName.string()); + sb.Append(prefix + g_tab).AppendFormat("switch (%s) {\n", codeName.string()); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(prefix + TAB + TAB).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", method->GetName().string()); } - sb.Append(prefix + TAB + TAB).Append("default: {\n"); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat( + sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: not support cmd %%{public}d\", __func__, %s);\n", codeName.string()); - sb.Append(prefix + TAB + TAB + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("}\n"); } void CServiceStubCodeEmitter::EmitCbStubDefinitions(StringBuilder& sb) { sb.AppendFormat("struct %sStub {\n", infName_.string()); - sb.Append(TAB).AppendFormat("struct %s service;\n", interfaceName_.string()); - sb.Append(TAB).Append("struct HdfRemoteDispatcher dispatcher;\n"); + sb.Append(g_tab).AppendFormat("struct %s service;\n", interfaceName_.string()); + sb.Append(g_tab).Append("struct HdfRemoteDispatcher dispatcher;\n"); sb.Append("};\n"); } @@ -413,25 +405,25 @@ void CServiceStubCodeEmitter::EmitCbStubObtainImpl(StringBuilder& sb) String objName = "stub"; sb.AppendFormat("struct %s* %sStubObtain()\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct %s* %s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + sb.Append(g_tab).AppendFormat("struct %s* %s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", stubTypeName.string(), objName.string(), stubTypeName.string(), stubTypeName.string()); - sb.Append(TAB).AppendFormat("if (stub == NULL) {\n", objName.string()); - sb.Append(TAB).Append(TAB).AppendFormat( + sb.Append(g_tab).AppendFormat("if (stub == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: OsalMemAlloc %s obj failed!\", __func__);\n", stubTypeName.string()); - sb.Append(TAB).Append(TAB).AppendFormat("return NULL;\n"); - sb.Append(TAB).Append("}\n\n"); - sb.Append(TAB).AppendFormat("%s->dispatcher.Dispatch = %sServiceOnRemoteRequest;\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%s->dispatcher.Dispatch = %sServiceOnRemoteRequest;\n", objName.string(), infName_.string()); - sb.Append(TAB).AppendFormat( + sb.Append(g_tab).AppendFormat( "%s->service.remote = HdfRemoteServiceObtain((struct HdfObject*)%s, &(%s->dispatcher));\n", objName.string(), objName.string(), objName.string()); - sb.Append(TAB).AppendFormat("if (%s->service.remote == NULL) {\n", objName.string()); - sb.Append(TAB).Append(TAB).AppendFormat( + sb.Append(g_tab).AppendFormat("if (%s->service.remote == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: %s->service.remote is null\", __func__);\n", objName.string()); - sb.Append(TAB).Append(TAB).Append("return NULL;\n"); - sb.Append(TAB).Append("}\n\n"); - sb.Append(TAB).AppendFormat("%sServiceConstruct(&%s->service);\n", infName_.string(), objName.string()); - sb.Append(TAB).AppendFormat("return &%s->service;\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%sServiceConstruct(&%s->service);\n", infName_.string(), objName.string()); + sb.Append(g_tab).AppendFormat("return &%s->service;\n", objName.string()); sb.Append("}\n"); } @@ -439,10 +431,10 @@ void CServiceStubCodeEmitter::EmitCbStubReleaseImpl(StringBuilder& sb) { sb.AppendFormat("void %sStubRelease(struct %s *stub)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(TAB).Append("if (stub == NULL) {\n"); - sb.Append(TAB).Append(TAB).Append("return;\n"); - sb.Append(TAB).Append("}\n"); - sb.Append(TAB).Append("OsalMemFree(stub);\n"); + sb.Append(g_tab).Append("if (stub == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).Append("OsalMemFree(stub);\n"); sb.Append("}"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 38bad234a..46068709b 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -41,15 +41,6 @@ private: void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); - void EmitReadStubVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - - void EmitWriteStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, - const String& prefix); - - void EmitWriteStubVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - void EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name); void EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index da57088f2..93ba77600 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -10,9 +10,6 @@ #define OHOS_HDI_CODEGENERATOR_H #include "ast/ast.h" -#include "util/autoptr.h" -#include "util/light_refcount_base.h" -#include "util/string.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp index 82f75824b..0d2a37694 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp @@ -150,21 +150,21 @@ void CppClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) { sb.AppendFormat("class %s : public IRemoteBroker {\n", interface_->GetName().string()); sb.Append("public:\n"); - EmitInterfaceBody(sb, TAB); + EmitInterfaceBody(sb, g_tab); sb.Append("};\n\n"); } void CppClientInterfaceCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix) { - sb.Append(TAB).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", interfaceFullName_.string()); + sb.Append(g_tab).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", interfaceFullName_.string()); sb.Append("\n"); - EmitInterfaceDestruction(sb, TAB); + EmitInterfaceDestruction(sb, g_tab); sb.Append("\n"); if (!isCallbackInterface()) { - EmitInterfaceGetMethodDecl(sb, TAB); + EmitInterfaceGetMethodDecl(sb, g_tab); sb.Append("\n"); } - EmitInterfaceMethodsDecl(sb, TAB); + EmitInterfaceMethodsDecl(sb, g_tab); } void CppClientInterfaceCodeEmitter::EmitInterfaceDestruction(StringBuilder& sb, const String& prefix) @@ -205,7 +205,7 @@ void CppClientInterfaceCodeEmitter::EmitInterfaceMethodDecl(const AutoPtr {\n", proxyName_.string(), interfaceName_.string()); sb.Append("public:\n"); - EmitProxyConstructor(sb, TAB); + EmitProxyConstructor(sb, g_tab); sb.Append("\n"); - EmitProxyMethodDecls(sb, TAB); + EmitProxyMethodDecls(sb, g_tab); sb.Append("\n"); sb.Append("private:\n"); - EmitProxyConstants(sb, TAB); + EmitProxyConstants(sb, g_tab); sb.Append("};\n"); } void CppClientProxyCodeEmitter::EmitProxyConstructor(StringBuilder& sb, const String& prefix) { sb.Append(prefix).AppendFormat("explicit %s(\n", proxyName_.string()); - sb.Append(prefix + TAB).Append("const sptr& remote)\n"); - sb.Append(prefix + TAB).AppendFormat(": IRemoteProxy<%s>(remote)\n", interfaceName_.string()); + sb.Append(prefix + g_tab).Append("const sptr& remote)\n"); + sb.Append(prefix + g_tab).AppendFormat(": IRemoteProxy<%s>(remote)\n", interfaceName_.string()); sb.Append(prefix).Append("{}\n"); sb.Append("\n"); sb.Append(prefix).AppendFormat("virtual ~%s() {}\n", proxyName_.string()); @@ -124,7 +124,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodDecl(const AutoPtr& me paramStr.Append(") override;"); - sb.Append(SpecificationParam(paramStr, prefix + TAB)); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); sb.Append("\n"); } } @@ -204,23 +204,23 @@ void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder& sb, const Strin sb.Append(prefix).AppendFormat("sptr<%s> %s::Get()\n", interface_->GetName().string(), interface_->GetName().string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("do {\n"); - sb.Append(prefix + TAB + TAB).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n"); - sb.Append(prefix + TAB + TAB).Append("auto servMgr = IServiceManager::Get();\n"); - sb.Append(prefix + TAB + TAB).Append("if (servMgr == nullptr) {\n"); - sb.Append(prefix + TAB + TAB + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); - sb.Append(prefix + TAB + TAB + TAB).Append("break;\n"); - sb.Append(prefix + TAB + TAB).Append("}\n\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("sptr remote = servMgr->GetService(\"%sService\");\n", + sb.Append(prefix + g_tab).Append("do {\n"); + sb.Append(prefix + g_tab + g_tab).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n"); + sb.Append(prefix + g_tab + g_tab).Append("auto servMgr = IServiceManager::Get();\n"); + sb.Append(prefix + g_tab + g_tab).Append("if (servMgr == nullptr) {\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("break;\n"); + sb.Append(prefix + g_tab + g_tab).Append("}\n\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("sptr remote = servMgr->GetService(\"%sService\");\n", infName_.string()); - sb.Append(prefix + TAB + TAB).Append("if (remote != nullptr) {\n"); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("return iface_cast<%s>(remote);\n", + sb.Append(prefix + g_tab + g_tab).Append("if (remote != nullptr) {\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return iface_cast<%s>(remote);\n", interface_->GetName().string()); - sb.Append(prefix + TAB + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("} while(false);\n"); - sb.Append(prefix + TAB).AppendFormat( + sb.Append(prefix + g_tab + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("} while(false);\n"); + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: get %sService failed!\", __func__);\n", infName_.string()); - sb.Append(prefix + TAB).Append("return nullptr;\n"); + sb.Append(prefix + g_tab).Append("return nullptr;\n"); sb.Append(prefix).Append("}\n"); } @@ -254,7 +254,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& me paramStr.Append(")"); - sb.Append(SpecificationParam(paramStr, prefix + TAB)); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); sb.Append("\n"); } EmitProxyMethodBody(method, sb, prefix); @@ -264,41 +264,41 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& me const String& prefix) { sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("MessageParcel data;\n"); - sb.Append(prefix + TAB).Append("MessageParcel reply;\n"); - sb.Append(prefix + TAB).Append("MessageOption option(MessageOption::TF_SYNC);\n"); + sb.Append(prefix + g_tab).Append("MessageParcel data;\n"); + sb.Append(prefix + g_tab).Append("MessageParcel reply;\n"); + sb.Append(prefix + g_tab).Append("MessageOption option(MessageOption::TF_SYNC);\n"); sb.Append("\n"); if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, "data", sb, prefix + TAB); + EmitWriteMethodParameter(param, "data", sb, prefix + g_tab); } } sb.Append("\n"); } - sb.Append(prefix + TAB).AppendFormat("int32_t ec = Remote()->SendRequest(CMD_%s, data, reply, option);\n", + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = Remote()->SendRequest(CMD_%s, data, reply, option);\n", ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + TAB + TAB).AppendFormat( + sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); - sb.Append(prefix + TAB + TAB).Append("return ec;\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); + sb.Append(prefix + g_tab).Append("}\n"); if (!method->IsOneWay()) { sb.Append("\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, "reply", false, sb, prefix + TAB); + EmitReadMethodParameter(param, "reply", false, sb, prefix + g_tab); sb.Append("\n"); } } } - sb.Append(prefix + TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(prefix + g_tab).Append("return HDF_SUCCESS;\n"); sb.Append(prefix).Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index 9b79a26ca..c788b7ad1 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -14,8 +14,6 @@ namespace OHOS { namespace HDI { -const char* CppCodeEmitter::TAB = " "; - CppCodeEmitter::CppCodeEmitter(const AutoPtr& ast, const String& targetDirectory) : LightRefCountBase(), ast_(ast), directory_(targetDirectory) { @@ -69,7 +67,7 @@ void CppCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String sb.Append(prefix).Append("enum {\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(TAB).AppendFormat("CMD_%s,\n", ConstantName(method->GetName()).string()); + sb.Append(g_tab).AppendFormat("CMD_%s,\n", ConstantName(method->GetName()).string()); } sb.Append(prefix).Append("};\n"); } diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index a519a6def..1a730c62c 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -83,8 +83,6 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - static const char* TAB; - AutoPtr ast_; AutoPtr interface_; diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index 0ed77382b..9a56dec8d 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -236,13 +236,13 @@ void CppCustomTypesCodeEmitter::EmitCustomTypeMarshallingImpl(StringBuilder& sb, String memberName = type->GetMemberName(i); String name = String::Format("%s.%s", objName.string(), memberName.string()); - memberType->EmitCppMarshalling("data", name, sb, TAB); + memberType->EmitCppMarshalling("data", name, sb, g_tab); if (i + 1 < type->GetMemberNumber()) { sb.Append("\n"); } } - sb.Append(TAB).Append("return true;\n"); + sb.Append(g_tab).Append("return true;\n"); sb.Append("}\n"); } @@ -269,15 +269,15 @@ void CppCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& s if (memberType->GetTypeKind() == TypeKind::TYPE_UNION) { String cpName = String::Format("%sCp", memberName.string()); - memberType->EmitCppUnMarshalling("data", cpName, sb, TAB, false); - sb.Append(TAB).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", name.string(), + memberType->EmitCppUnMarshalling("data", cpName, sb, g_tab, false); + sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", name.string(), memberType->EmitCppType().string(), cpName.string(), memberType->EmitCppType().string()); } else { - memberType->EmitCppUnMarshalling("data", name, sb, TAB, false); + memberType->EmitCppUnMarshalling("data", name, sb, g_tab, false); } } - sb.Append(TAB).AppendFormat("return true;\n", objName.string()); + sb.Append(g_tab).AppendFormat("return true;\n", objName.string()); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 244255264..53190e880 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -87,8 +87,8 @@ void CppServiceDriverCodeEmitter::EmitDriverUsings(StringBuilder& sb) void CppServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) { sb.AppendFormat("struct Hdf%s%s {\n", infName_.string(), "Service"); - sb.Append(TAB).Append("struct IDeviceIoService ioservice;\n"); - sb.Append(TAB).Append("void *instance;\n"); + sb.Append(g_tab).Append("struct IDeviceIoService ioservice;\n"); + sb.Append(g_tab).Append("void *instance;\n"); sb.Append("};\n"); } @@ -96,13 +96,13 @@ void CppServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb) { sb.AppendFormat("static int32_t %sServiceDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", infName_.string()); - sb.Append(TAB).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); + sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", infName_.string()); - sb.Append(TAB).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", + sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", infName_.string(), infName_.string()); sb.Append("}\n"); } @@ -111,8 +111,8 @@ void CppServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); - sb.Append(TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); + sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -120,25 +120,25 @@ void CppServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); sb.Append("\n"); - sb.Append(TAB).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", infName_.string(), infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); - sb.Append(TAB).AppendFormat("if (hdf%sService == nullptr) {\n", infName_.string()); - sb.Append(TAB).Append(TAB).AppendFormat("HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sService failed!\");\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); + sb.Append(g_tab).AppendFormat("if (hdf%sService == nullptr) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sService failed!\");\n", infName_.string(), infName_.string()); - sb.Append(TAB).Append(TAB).Append("return HDF_FAILURE;\n"); - sb.Append(TAB).Append("}\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); + sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", infName_.string(), infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); - sb.Append(TAB).AppendFormat("hdf%sService->instance = %sStubInstance();\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sService->instance = %sStubInstance();\n", infName_.string(), infName_.string()); sb.Append("\n"); - sb.Append(TAB).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); - sb.Append(TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(g_tab).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); + sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -146,18 +146,18 @@ void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", infName_.string()); sb.Append("{\n"); - sb.Append(TAB).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", interfaceName_.string()); sb.Append("}\n"); } void CppServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) { sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); - sb.Append(TAB).Append(".moduleVersion = 1,\n"); - sb.Append(TAB).AppendFormat(".moduleName = \"%s\",\n", infName_.ToLowerCase().string()); - sb.Append(TAB).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); - sb.Append(TAB).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); - sb.Append(TAB).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); + sb.Append(g_tab).Append(".moduleVersion = 1,\n"); + sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", infName_.ToLowerCase().string()); + sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); + sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); + sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); sb.Append("};\n"); sb.Append("\n"); sb.Append("#ifndef __cplusplus\n"); diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index 486c5fe09..05b86fa32 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -79,7 +79,7 @@ void CppServiceImplCodeEmitter::EmitServiceImplDecl(StringBuilder& sb) sb.AppendFormat("class %sService : public %s {\n", infName_.string(), stubName_.string()); } sb.Append("public:\n"); - EmitServiceImplBody(sb, TAB); + EmitServiceImplBody(sb, g_tab); sb.Append("};\n"); sb.Append("\n"); @@ -88,9 +88,9 @@ void CppServiceImplCodeEmitter::EmitServiceImplDecl(StringBuilder& sb) void CppServiceImplCodeEmitter::EmitServiceImplBody(StringBuilder& sb, const String& prefix) { - EmitServiceImplDestruction(sb, TAB); + EmitServiceImplDestruction(sb, g_tab); sb.Append("\n"); - EmitServiceImplMethodDecls(sb, TAB); + EmitServiceImplMethodDecls(sb, g_tab); } void CppServiceImplCodeEmitter::EmitServiceImplDestruction(StringBuilder& sb, const String& prefix) @@ -127,7 +127,7 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodDecl(const AutoPtrGetName().string()); sb.Append("public:\n"); - EmitInterfaceBody(sb, TAB); + EmitInterfaceBody(sb, g_tab); sb.Append("};\n"); } void CppServiceInterfaceCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix) { - EmitInterfaceDestruction(sb, TAB); + EmitInterfaceDestruction(sb, g_tab); sb.Append("\n"); - EmitInterfaceMethods(sb, TAB); + EmitInterfaceMethods(sb, g_tab); } void CppServiceInterfaceCodeEmitter::EmitInterfaceDestruction(StringBuilder& sb, const String& prefix) @@ -199,7 +199,7 @@ void CppServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr {\n", stubName_.string(), interfaceName_.string()); - EmitCbStubBody(sb, TAB); + EmitCbStubBody(sb, g_tab); sb.Append("};\n"); sb.Append("\n"); EmitEndNamespace(sb); @@ -143,7 +143,7 @@ void CppServiceStubCodeEmitter::EmitStubDestruction(StringBuilder& sb, const Str void CppServiceStubCodeEmitter::EmitCbStubOnRequestDecl(StringBuilder& sb, const String& prefix) { sb.Append(prefix).Append("int32_t OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,\n"); - sb.Append(prefix + TAB).Append("MessageOption &option) override;\n"); + sb.Append(prefix + g_tab).Append("MessageOption &option) override;\n"); } void CppServiceStubCodeEmitter::EmitStubMethodDecls(StringBuilder& sb, const String& prefix) @@ -174,7 +174,7 @@ void CppServiceStubCodeEmitter::EmitStubOnRequestMethodDecl(StringBuilder& sb, c { sb.Append(prefix).AppendFormat("int32_t %sOnRemoteRequest(int cmdId, MessageParcel& data, MessageParcel& reply,\n", stubName_.string()); - sb.Append(prefix).Append(TAB).Append("MessageOption& option);\n"); + sb.Append(prefix).Append(g_tab).Append("MessageOption& option);\n"); } void CppServiceStubCodeEmitter::EmitStubMembers(StringBuilder& sb, const String& prefix) @@ -282,25 +282,25 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadMethodParameter(param, "data", true, sb, prefix + TAB); + EmitReadMethodParameter(param, "data", true, sb, prefix + g_tab); sb.Append("\n"); } else { - EmitLocalVariable(param, sb, prefix + TAB); + EmitLocalVariable(param, sb, prefix + g_tab); sb.Append("\n"); } } if (method->GetParameterNumber() == 0) { if (!isCallbackInterface()) { - sb.Append(prefix + TAB).AppendFormat("int32_t ec = service.%s();\n", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s();\n", method->GetName().string()); } else { - sb.Append(prefix + TAB).AppendFormat("int32_t ec = %s();\n", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s();\n", method->GetName().string()); } } else { if (!isCallbackInterface()) { - sb.Append(prefix + TAB).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); } else { - sb.Append(prefix + TAB).AppendFormat("int32_t ec = %s(", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s(", method->GetName().string()); } for (size_t i = 0; i < method->GetParameterNumber(); i++) { @@ -313,23 +313,23 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met sb.Append(");\n"); } - sb.Append(prefix + TAB).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + TAB + TAB).AppendFormat( + sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); - sb.Append(prefix + TAB + TAB).Append("return ec;\n"); - sb.Append(prefix + TAB).Append("}\n\n"); + sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); + sb.Append(prefix + g_tab).Append("}\n\n"); if (!method->IsOneWay()) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitWriteMethodParameter(param, "reply", sb, prefix + TAB); + EmitWriteMethodParameter(param, "reply", sb, prefix + g_tab); sb.Append("\n"); } } } - sb.Append(prefix + TAB).Append("return HDF_SUCCESS;\n"); + sb.Append(prefix + g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -337,47 +337,47 @@ void CppServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, c { sb.Append(prefix).AppendFormat("int32_t %s::%sOnRemoteRequest(int cmdId,\n", stubName_.string(), stubName_.string()); - sb.Append(prefix + TAB).Append("MessageParcel& data, MessageParcel& reply, MessageOption& option)\n"); + sb.Append(prefix + g_tab).Append("MessageParcel& data, MessageParcel& reply, MessageOption& option)\n"); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("switch (cmdId) {\n"); + sb.Append(prefix + g_tab).Append("switch (cmdId) {\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(prefix + TAB + TAB).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("return %sStub%s(data, reply, option);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return %sStub%s(data, reply, option);\n", infName_.string(), method->GetName().string()); } - sb.Append(prefix + TAB + TAB).Append("default: {\n"); - sb.Append(prefix + TAB + TAB + TAB).Append( + sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s: not support cmd %{public}d\", __func__, cmdId);\n"); - sb.Append(prefix + TAB + TAB + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("}\n"); } void CppServiceStubCodeEmitter::EmitCbStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { sb.Append(prefix).AppendFormat("int32_t %s::OnRemoteRequest(uint32_t code,\n", stubName_.string()); - sb.Append(prefix + TAB).Append("MessageParcel& data, MessageParcel& reply, MessageOption& option)\n"); + sb.Append(prefix + g_tab).Append("MessageParcel& data, MessageParcel& reply, MessageOption& option)\n"); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("switch (code) {\n"); + sb.Append(prefix + g_tab).Append("switch (code) {\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(prefix + TAB + TAB).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB + TAB + TAB).AppendFormat("return %sStub%s(data, reply, option);\n", + sb.Append(prefix + g_tab + g_tab).AppendFormat("case CMD_%s:\n", ConstantName(method->GetName()).string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return %sStub%s(data, reply, option);\n", infName_.string(), method->GetName().string()); } - sb.Append(prefix + TAB + TAB).Append("default: {\n"); - sb.Append(prefix + TAB + TAB + TAB).Append( + sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s: not support cmd %{public}d\", __func__, code);\n"); - sb.Append(prefix + TAB + TAB + TAB).Append("return IPCObjectStub::OnRemoteRequest(code, data, reply, option);\n"); - sb.Append(prefix + TAB + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("}\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("return IPCObjectStub::OnRemoteRequest(code, data, reply, option);\n"); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("}\n"); sb.Append("}\n"); } @@ -394,9 +394,9 @@ void CppServiceStubCodeEmitter::EmitStubInstanceMethodImpl(StringBuilder& sb, co { sb.Append(prefix).AppendFormat("void *%sInstance()\n", stubName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).AppendFormat("using namespace %s;\n", + sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + TAB).AppendFormat("return reinterpret_cast(new %s());\n", stubName_.string()); + sb.Append(prefix + g_tab).AppendFormat("return reinterpret_cast(new %s());\n", stubName_.string()); sb.Append(prefix).Append("}\n"); } @@ -404,9 +404,9 @@ void CppServiceStubCodeEmitter::EmitStubReleaseMethodImpl(StringBuilder& sb, con { sb.Append(prefix).AppendFormat("void %sRelease(void *obj)\n", stubName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).AppendFormat("using namespace %s;\n", + sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + TAB).AppendFormat("delete reinterpret_cast<%s *>(obj);\n", stubName_.string()); + sb.Append(prefix + g_tab).AppendFormat("delete reinterpret_cast<%s *>(obj);\n", stubName_.string()); sb.Append(prefix).Append("}\n"); } @@ -417,22 +417,22 @@ void CppServiceStubCodeEmitter::EmitServiceOnRemoteRequest(StringBuilder& sb, co "int32_t %sServiceOnRemoteRequest(void *stub, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)\n", infName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).AppendFormat("using namespace %s;\n", + sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + TAB).AppendFormat("%s *%s = reinterpret_cast<%s *>(stub);\n", + sb.Append(prefix + g_tab).AppendFormat("%s *%s = reinterpret_cast<%s *>(stub);\n", stubName_.string(), stubObjName.string(), stubName_.string()); - sb.Append(prefix + TAB).Append("OHOS::MessageParcel *dataParcel = nullptr;\n"); - sb.Append(prefix + TAB).Append("OHOS::MessageParcel *replyParcel = nullptr;\n"); + sb.Append(prefix + g_tab).Append("OHOS::MessageParcel *dataParcel = nullptr;\n"); + sb.Append(prefix + g_tab).Append("OHOS::MessageParcel *replyParcel = nullptr;\n"); sb.Append("\n"); - sb.Append(prefix + TAB).Append("(void)SbufToParcel(reply, &replyParcel);\n"); - sb.Append(prefix + TAB).Append("if (SbufToParcel(data, &dataParcel) != HDF_SUCCESS) {\n"); - sb.Append(prefix + TAB + TAB).Append( + sb.Append(prefix + g_tab).Append("(void)SbufToParcel(reply, &replyParcel);\n"); + sb.Append(prefix + g_tab).Append("if (SbufToParcel(data, &dataParcel) != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s:invalid data sbuf object to dispatch\", __func__);\n"); - sb.Append(prefix + TAB + TAB).Append("return HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + TAB).Append("}\n\n"); - sb.Append(prefix + TAB).Append("OHOS::MessageOption option;\n"); - sb.Append(prefix + TAB).AppendFormat("return %s->%sOnRemoteRequest(cmdId, *dataParcel, *replyParcel, option);\n", + sb.Append(prefix + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("}\n\n"); + sb.Append(prefix + g_tab).Append("OHOS::MessageOption option;\n"); + sb.Append(prefix + g_tab).AppendFormat("return %s->%sOnRemoteRequest(cmdId, *dataParcel, *replyParcel, option);\n", stubObjName.string(), stubName_.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp index abbe81f12..98bb64cb8 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp @@ -96,7 +96,7 @@ void JavaClientInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeImports(StringB void JavaClientInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) { sb.AppendFormat("public interface %s extends IRemoteBroker {\n", interface_->GetName().string()); - EmitInterfaceMethods(sb, TAB); + EmitInterfaceMethods(sb, g_tab); sb.Append("}"); } @@ -128,7 +128,7 @@ void JavaClientInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& m } paramStr.Append(") throws RemoteException"); - sb.Append(SpecificationParam(paramStr, prefix + TAB)); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); sb.Append("\n"); } EmitProxyMethodBody(method, sb, prefix); @@ -177,9 +177,9 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m const String& prefix) { sb.Append(prefix).Append("{\n"); - sb.Append(prefix + TAB).Append("MessageParcel data = MessageParcel.obtain();\n"); - sb.Append(prefix + TAB).Append("MessageParcel reply = MessageParcel.obtain();\n"); - sb.Append(prefix + TAB).AppendFormat("MessageOption option = new MessageOption(MessageOption.TF_SYNC);\n"); + sb.Append(prefix + g_tab).Append("MessageParcel data = MessageParcel.obtain();\n"); + sb.Append(prefix + g_tab).Append("MessageParcel reply = MessageParcel.obtain();\n"); + sb.Append(prefix + g_tab).AppendFormat("MessageOption option = new MessageOption(MessageOption.TF_SYNC);\n"); sb.Append("\n"); sb.Append(prefix).AppendFormat(" data.writeInterfaceToken(DESCRIPTOR);\n"); @@ -187,12 +187,12 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, "data", sb, prefix + TAB); + EmitWriteMethodParameter(param, "data", sb, prefix + g_tab); needBlankLine = true; } else { AutoPtr type = param->GetType(); if (type->GetTypeKind() == TypeKind::TYPE_ARRAY) { - EmitWriteOutArrayVariable("data", param->GetName(), type, sb, prefix + TAB); + EmitWriteOutArrayVariable("data", param->GetName(), type, sb, prefix + g_tab); } } } @@ -200,24 +200,24 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append("\n"); } - sb.Append(prefix + TAB).Append("try {\n"); - sb.Append(prefix + TAB + TAB).AppendFormat("if (remote.sendRequest(COMMAND_%s, data, reply, option)) {\n", + sb.Append(prefix + g_tab).Append("try {\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("if (remote.sendRequest(COMMAND_%s, data, reply, option)) {\n", ConstantName(method->GetName()).string()); - sb.Append(prefix + TAB + TAB + TAB).Append("return 1;\n"); - sb.Append(prefix + TAB + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append(" reply.readException();\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append("return 1;\n"); + sb.Append(prefix + g_tab + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append(" reply.readException();\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, "reply", sb, prefix + TAB + TAB); + EmitReadMethodParameter(param, "reply", sb, prefix + g_tab + g_tab); } } - sb.Append(prefix + TAB).Append("} finally {\n"); - sb.Append(prefix + TAB + TAB).Append("data.reclaim();\n"); - sb.Append(prefix + TAB + TAB).Append("reply.reclaim();\n"); - sb.Append(prefix + TAB).Append("}\n"); - sb.Append(prefix + TAB).Append("return 0;\n"); + sb.Append(prefix + g_tab).Append("} finally {\n"); + sb.Append(prefix + g_tab + g_tab).Append("data.reclaim();\n"); + sb.Append(prefix + g_tab + g_tab).Append("reply.reclaim();\n"); + sb.Append(prefix + g_tab).Append("}\n"); + sb.Append(prefix + g_tab).Append("return 0;\n"); sb.Append(prefix).Append("}\n"); } @@ -282,7 +282,7 @@ void JavaClientProxyCodeEmitter::EmitWriteVariable(const String& parcelName, con sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); sb.Append(prefix).AppendFormat("for (%s element : %s) {\n", elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string()); - EmitWriteVariable(parcelName, "element", elementType, sb, prefix + TAB); + EmitWriteVariable(parcelName, "element", elementType, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); break; } @@ -295,8 +295,8 @@ void JavaClientProxyCodeEmitter::EmitWriteVariable(const String& parcelName, con sb.Append(prefix).AppendFormat("for (Map.Entry<%s, %s> entry : %s.entrySet()) {\n", keyType->EmitJavaType(TypeMode::NO_MODE, true).string(), valueType->EmitJavaType(TypeMode::NO_MODE, true).string(), name.string()); - EmitWriteVariable(parcelName, "entry.getKey()", keyType, sb, prefix + TAB); - EmitWriteVariable(parcelName, "entry.getValue()", valueType, sb, prefix + TAB); + EmitWriteVariable(parcelName, "entry.getKey()", keyType, sb, prefix + g_tab); + EmitWriteVariable(parcelName, "entry.getValue()", valueType, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); break; } @@ -307,7 +307,7 @@ void JavaClientProxyCodeEmitter::EmitWriteVariable(const String& parcelName, con sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); sb.Append(prefix).Append("} else { \n"); - EmitWriteArrayVariable(parcelName, name, elementType, sb, prefix + TAB); + EmitWriteArrayVariable(parcelName, name, elementType, sb, prefix + g_tab); sb.Append(prefix).Append("}\n"); break; } @@ -427,8 +427,8 @@ void JavaClientProxyCodeEmitter::EmitReadVariable(const String& parcelName, cons sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); AutoPtr listType = dynamic_cast(type.Get()); AutoPtr elementType = listType->GetElementType(); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("%s.add(value);\n", name.string()); + EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -443,9 +443,9 @@ void JavaClientProxyCodeEmitter::EmitReadVariable(const String& parcelName, cons AutoPtr keyType = mapType->GetKeyType(); AutoPtr valueType = mapType->GetValueType(); - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_IN, sb, prefix + TAB); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_IN, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("%s.put(key, value);\n", name.string()); + EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_IN, sb, prefix + g_tab); + EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_IN, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -507,8 +507,8 @@ void JavaClientProxyCodeEmitter::EmitReadArrayVariable(const String& parcelName, elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), elementType->EmitJavaType(TypeMode::NO_MODE).string()); sb.Append(prefix).AppendFormat("for (int i = 0; i < size; ++i) {\n"); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("%s[i] = value;\n", name.string()); + EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s[i] = value;\n", name.string()); sb.Append(prefix).Append("}\n"); break; default: @@ -609,8 +609,8 @@ void JavaClientProxyCodeEmitter::EmitReadOutVariable(const String& parcelName, c AutoPtr listType = dynamic_cast(type.Get()); AutoPtr elementType = listType->GetElementType(); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_OUT, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("%s.add(value);\n", name.string()); + EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); sb.Append(prefix).Append("}\n"); break; } @@ -622,9 +622,9 @@ void JavaClientProxyCodeEmitter::EmitReadOutVariable(const String& parcelName, c AutoPtr keyType = mapType->GetKeyType(); AutoPtr valueType = mapType->GetValueType(); - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_OUT, sb, prefix + TAB); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_OUT, sb, prefix + TAB); - sb.Append(prefix + TAB).AppendFormat("%s.put(key, value);\n", name.string()); + EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); + EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); sb.Append(prefix).Append("}\n"); break; } diff --git a/tools/hdi-gen/codegen/java_code_emitter.cpp b/tools/hdi-gen/codegen/java_code_emitter.cpp index cc9adc685..51a137524 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_code_emitter.cpp @@ -13,8 +13,6 @@ namespace OHOS { namespace HDI { -const char* JavaCodeEmitter::TAB = " "; - JavaCodeEmitter::JavaCodeEmitter(const AutoPtr& ast, const String& targetDirectory) :LightRefCountBase(), ast_(ast), directory_(targetDirectory) { diff --git a/tools/hdi-gen/codegen/java_code_emitter.h b/tools/hdi-gen/codegen/java_code_emitter.h index 5dc400034..eb8004507 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.h +++ b/tools/hdi-gen/codegen/java_code_emitter.h @@ -52,8 +52,6 @@ protected: String SpecificationParam(StringBuilder& paramSb, const String& prefix); - static const char* TAB; - AutoPtr ast_; AutoPtr interface_; diff --git a/tools/hdi-gen/parser/file_detail.cpp b/tools/hdi-gen/parser/file_detail.cpp index 019f95438..f45448954 100755 --- a/tools/hdi-gen/parser/file_detail.cpp +++ b/tools/hdi-gen/parser/file_detail.cpp @@ -7,6 +7,7 @@ */ #include "parser/file_detail.h" +#include "util/string_builder.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/parser/file_detail.h b/tools/hdi-gen/parser/file_detail.h index 7f78afdd4..1684c1e50 100755 --- a/tools/hdi-gen/parser/file_detail.h +++ b/tools/hdi-gen/parser/file_detail.h @@ -10,8 +10,7 @@ #define OHOS_HDI_FILE_DETAIL_H #include -#include "util/string_builder.h" -#include "util/logger.h" +#include "util/string.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/parser/module_parser.cpp b/tools/hdi-gen/parser/module_parser.cpp index d2f3b2586..b4ef43b31 100755 --- a/tools/hdi-gen/parser/module_parser.cpp +++ b/tools/hdi-gen/parser/module_parser.cpp @@ -8,6 +8,8 @@ #include "parser/module_parser.h" #include +#include "parser/parser.h" +#include "util/logger.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index ba94b8f34..07cf1449f 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -10,9 +10,10 @@ #define OHOS_HDI_MODULE_PARSER_H #include +#include +#include "ast/ast_module.h" #include "parser/file_detail.h" -#include "parser/parser.h" -#include "util/logger.h" +#include "util/options.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/test/c_test/array_test/v1_0/c_array_test.cpp b/tools/hdi-gen/test/c_test/array_test/v1_0/c_array_test.cpp index d681912be..32095c5f4 100755 --- a/tools/hdi-gen/test/c_test/array_test/v1_0/c_array_test.cpp +++ b/tools/hdi-gen/test/c_test/array_test/v1_0/c_array_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "c_test/array_test/v1_0/client/iarray_test.h" using namespace OHOS; @@ -23,7 +23,7 @@ using namespace testing::ext; static struct IArrayTest *g_testClient = nullptr; -class ArrayTest : public testing::Test { +class CArrayTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -31,15 +31,15 @@ public: void TearDown(){} }; -void ArrayTest::SetUpTestCase() +void CArrayTest::SetUpTestCase() { g_testClient = HdiArrayTestGet(); if (g_testClient == nullptr) { - printf("ArrayTest: get g_testClient failed.\n"); + printf("CArrayTest: get g_testClient failed.\n"); } } -void ArrayTest::TearDownTestCase() +void CArrayTest::TearDownTestCase() { if (g_testClient != nullptr) { HdiArrayTestRelease(g_testClient); @@ -47,12 +47,12 @@ void ArrayTest::TearDownTestCase() } } -HWTEST_F(ArrayTest, ArratTest_001, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(ArrayTest, ArratTest_002, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_002, TestSize.Level1) { uint32_t inParamLen = 4; bool *inParam = (bool*)OsalMemAlloc(sizeof(bool) * inParamLen); @@ -89,7 +89,7 @@ HWTEST_F(ArrayTest, ArratTest_002, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_003, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_003, TestSize.Level1) { uint32_t inParamLen = 4; int8_t *inParam = (int8_t*)OsalMemAlloc(sizeof(int8_t) * inParamLen); @@ -127,7 +127,7 @@ HWTEST_F(ArrayTest, ArratTest_003, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_004, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_004, TestSize.Level1) { uint32_t inParamLen = 4; int16_t *inParam = (int16_t*)OsalMemAlloc(sizeof(int16_t) * inParamLen); @@ -164,7 +164,7 @@ HWTEST_F(ArrayTest, ArratTest_004, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_005, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_005, TestSize.Level1) { uint32_t inParamLen = 4; int32_t *inParam = (int32_t*)OsalMemAlloc(sizeof(int32_t) * inParamLen); @@ -201,7 +201,7 @@ HWTEST_F(ArrayTest, ArratTest_005, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_006, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_006, TestSize.Level1) { uint32_t inParamLen = 4; int64_t *inParam = (int64_t*)OsalMemAlloc(sizeof(int64_t) * inParamLen); @@ -238,7 +238,7 @@ HWTEST_F(ArrayTest, ArratTest_006, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_007, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_007, TestSize.Level1) { uint32_t inParamLen = 4; uint8_t *inParam = (uint8_t*)OsalMemAlloc(sizeof(uint8_t) * inParamLen); @@ -275,7 +275,7 @@ HWTEST_F(ArrayTest, ArratTest_007, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_008, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_008, TestSize.Level1) { uint32_t inParamLen = 4; uint16_t *inParam = (uint16_t*)OsalMemAlloc(sizeof(uint16_t) * inParamLen); @@ -312,7 +312,7 @@ HWTEST_F(ArrayTest, ArratTest_008, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_009, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_009, TestSize.Level1) { uint32_t inParamLen = 4; uint32_t *inParam = (uint32_t*)OsalMemAlloc(sizeof(uint32_t) * inParamLen); @@ -349,7 +349,7 @@ HWTEST_F(ArrayTest, ArratTest_009, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_010, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_010, TestSize.Level1) { uint32_t inParamLen = 4; uint64_t *inParam = (uint64_t*)OsalMemAlloc(sizeof(uint64_t) * inParamLen); @@ -386,7 +386,7 @@ HWTEST_F(ArrayTest, ArratTest_010, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_011, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_011, TestSize.Level1) { uint32_t inParamLen = 4; float *inParam = (float*)OsalMemAlloc(sizeof(float) * inParamLen); @@ -424,7 +424,7 @@ HWTEST_F(ArrayTest, ArratTest_011, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_012, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_012, TestSize.Level1) { uint32_t inParamLen = 4; double *inParam = (double*)OsalMemAlloc(sizeof(double) * inParamLen); @@ -462,7 +462,7 @@ HWTEST_F(ArrayTest, ArratTest_012, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_013, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_013, TestSize.Level1) { uint32_t inParamLen = 2; char **inParam = (char**)OsalMemAlloc(sizeof(char*) * inParamLen); @@ -505,7 +505,7 @@ HWTEST_F(ArrayTest, ArratTest_013, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_014, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_014, TestSize.Level1) { uint32_t inParamLen = 2; @@ -545,7 +545,7 @@ HWTEST_F(ArrayTest, ArratTest_014, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_015, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_015, TestSize.Level1) { uint32_t inParamLen = 4; enum ESample *inParam = (enum ESample*)OsalMemAlloc(sizeof(enum ESample) * inParamLen); @@ -582,7 +582,7 @@ HWTEST_F(ArrayTest, ArratTest_015, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_016, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_016, TestSize.Level1) { uint32_t inParamLen = 2; struct SSample *inParam = (struct SSample *)OsalMemAlloc(sizeof(struct SSample) * inParamLen); @@ -632,7 +632,7 @@ HWTEST_F(ArrayTest, ArratTest_016, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArratTest_017, TestSize.Level0) +HWTEST_F(CArrayTest, CArrayTest_017, TestSize.Level1) { uint32_t inParamLen = 2; union USample *inParam = (union USample *)OsalMemAlloc(sizeof(union USample) * inParamLen); diff --git a/tools/hdi-gen/test/c_test/cb_test/v1_0/c_cb_test.cpp b/tools/hdi-gen/test/c_test/cb_test/v1_0/c_cb_test.cpp index f84837ffc..25f58600f 100755 --- a/tools/hdi-gen/test/c_test/cb_test/v1_0/c_cb_test.cpp +++ b/tools/hdi-gen/test/c_test/cb_test/v1_0/c_cb_test.cpp @@ -10,11 +10,11 @@ #include #include #include -#include -#include -#include -#include "c_test/cb_test/v1_0/client/icb_test.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "c_test/cb_test/v1_0/callback_stub.h" +#include "c_test/cb_test/v1_0/client/icb_test.h" using namespace OHOS; using namespace testing::ext; @@ -22,7 +22,7 @@ using namespace testing::ext; static struct ICbTest *g_testClient = nullptr; static struct ICallback *g_callback = nullptr; -class CbTest : public testing::Test { +class CCbTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -30,20 +30,20 @@ public: void TearDown(){} }; -void CbTest::SetUpTestCase() +void CCbTest::SetUpTestCase() { g_testClient = HdiCbTestGet(); if (g_testClient == nullptr) { - printf("CbTest: get g_testClient failed.\n"); + printf("CCbTest: get g_testClient failed.\n"); } g_callback = CallbackStubObtain(); if (g_callback == nullptr) { - printf("CbTest: get g_callback failed.\n"); + printf("CCbTest: get g_callback failed.\n"); } } -void CbTest::TearDownTestCase() +void CCbTest::TearDownTestCase() { if (g_testClient != nullptr) { HdiCbTestRelease(g_testClient); @@ -56,13 +56,13 @@ void CbTest::TearDownTestCase() } } -HWTEST_F(CbTest, CbTest_001, TestSize.Level0) +HWTEST_F(CCbTest, CCbTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); ASSERT_NE(nullptr, g_callback); } -HWTEST_F(CbTest, CbTest_002, TestSize.Level0) +HWTEST_F(CCbTest, CCbTest_002, TestSize.Level1) { int32_t ec = g_testClient->CallbackTest(g_testClient, g_callback); ASSERT_EQ(ec, HDF_SUCCESS); diff --git a/tools/hdi-gen/test/c_test/data_test/v1_0/c_data_test.cpp b/tools/hdi-gen/test/c_test/data_test/v1_0/c_data_test.cpp index 5d3bfbab6..6192a4d71 100755 --- a/tools/hdi-gen/test/c_test/data_test/v1_0/c_data_test.cpp +++ b/tools/hdi-gen/test/c_test/data_test/v1_0/c_data_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "test/c_test/data_test/v1_0/client/idata_test.h" using namespace OHOS; @@ -24,7 +24,7 @@ using namespace testing::ext; static struct IDataTest *g_testClient = nullptr; static struct ICallback *g_callback = nullptr; -class DataTest : public testing::Test { +class CDataTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -32,15 +32,15 @@ public: void TearDown(){} }; -void DataTest::SetUpTestCase() +void CDataTest::SetUpTestCase() { g_testClient = HdiDataTestGet(); if (g_testClient == nullptr) { - printf("DataTest: get g_testClient failed.\n"); + printf("CDataTest: get g_testClient failed.\n"); } } -void DataTest::TearDownTestCase() +void CDataTest::TearDownTestCase() { if (g_testClient != nullptr) { HdiDataTestRelease(g_testClient); @@ -48,12 +48,12 @@ void DataTest::TearDownTestCase() } } -HWTEST_F(DataTest, DataTest_001, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(DataTest, DataTest_002, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_002, TestSize.Level1) { bool inParam = true; bool outParam = false; @@ -65,8 +65,7 @@ HWTEST_F(DataTest, DataTest_002, TestSize.Level0) EXPECT_TRUE(outParam); } - -HWTEST_F(DataTest, DataTest_003, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_003, TestSize.Level1) { int8_t inParam = 10; int8_t outParam = 0; @@ -77,7 +76,7 @@ HWTEST_F(DataTest, DataTest_003, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_004, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_004, TestSize.Level1) { int16_t inParam = 10; int16_t outParam = 0; @@ -88,7 +87,7 @@ HWTEST_F(DataTest, DataTest_004, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_005, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_005, TestSize.Level1) { int32_t inParam = 10; int32_t outParam = 0; @@ -99,7 +98,7 @@ HWTEST_F(DataTest, DataTest_005, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_006, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_006, TestSize.Level1) { int64_t inParam = 10; int64_t outParam = 0; @@ -110,7 +109,7 @@ HWTEST_F(DataTest, DataTest_006, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_007, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_007, TestSize.Level1) { uint8_t inParam = 10; uint8_t outParam = 0; @@ -121,7 +120,7 @@ HWTEST_F(DataTest, DataTest_007, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_008, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_008, TestSize.Level1) { uint16_t inParam = 10; uint16_t outParam = 0; @@ -132,7 +131,7 @@ HWTEST_F(DataTest, DataTest_008, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_009, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_009, TestSize.Level1) { uint32_t inParam = 10; uint32_t outParam = 0; @@ -143,7 +142,7 @@ HWTEST_F(DataTest, DataTest_009, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_010, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_010, TestSize.Level1) { uint64_t inParam = 10; uint64_t outParam = 0; @@ -154,7 +153,7 @@ HWTEST_F(DataTest, DataTest_010, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_011, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_011, TestSize.Level1) { float inParam = 10.5; float outParam = 0; @@ -165,7 +164,7 @@ HWTEST_F(DataTest, DataTest_011, TestSize.Level0) EXPECT_FLOAT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_012, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_012, TestSize.Level1) { double inParam = 10.5; double outParam = 0; @@ -176,7 +175,7 @@ HWTEST_F(DataTest, DataTest_012, TestSize.Level0) EXPECT_DOUBLE_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_013, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_013, TestSize.Level1) { const char* inParam = "hello"; char* outParam = nullptr; @@ -187,7 +186,7 @@ HWTEST_F(DataTest, DataTest_013, TestSize.Level0) EXPECT_STREQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_014, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_014, TestSize.Level1) { int fd = open("/c_data_test_014.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); printf("file open, fd = %d\n", fd); @@ -219,7 +218,7 @@ finished: close(fd); } -HWTEST_F(DataTest, DataTest_015, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_015, TestSize.Level1) { enum ESample inParam = MEM_ONE; enum ESample outParam = MEM_TWO; @@ -230,7 +229,7 @@ HWTEST_F(DataTest, DataTest_015, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_016, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_016, TestSize.Level1) { struct SSample inParam; inParam.m1 = true; @@ -260,7 +259,7 @@ HWTEST_F(DataTest, DataTest_016, TestSize.Level0) } } -HWTEST_F(DataTest, DataTest_017, TestSize.Level0) +HWTEST_F(CDataTest, CDataTest_017, TestSize.Level1) { union USample inParam; inParam.m2 = 10; diff --git a/tools/hdi-gen/test/c_test/list_test/v1_0/c_list_test.cpp b/tools/hdi-gen/test/c_test/list_test/v1_0/c_list_test.cpp index 38113c429..80ceecf58 100755 --- a/tools/hdi-gen/test/c_test/list_test/v1_0/c_list_test.cpp +++ b/tools/hdi-gen/test/c_test/list_test/v1_0/c_list_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "c_test/list_test/v1_0/client/ilist_test.h" using namespace OHOS; @@ -23,7 +23,7 @@ using namespace testing::ext; static struct IListTest *g_testClient = nullptr; -class ListTest : public testing::Test { +class CListTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -31,15 +31,15 @@ public: void TearDown(){} }; -void ListTest::SetUpTestCase() +void CListTest::SetUpTestCase() { g_testClient = HdiListTestGet(); if (g_testClient == nullptr) { - printf("ListTest: get g_testClient failed.\n"); + printf("CListTest: get g_testClient failed.\n"); } } -void ListTest::TearDownTestCase() +void CListTest::TearDownTestCase() { if (g_testClient != nullptr) { HdiListTestRelease(g_testClient); @@ -47,12 +47,12 @@ void ListTest::TearDownTestCase() } } -HWTEST_F(ListTest, ArratTest_001, TestSize.Level0) +HWTEST_F(CListTest, CListTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(ListTest, ArratTest_002, TestSize.Level0) +HWTEST_F(CListTest, CListTest_002, TestSize.Level1) { uint32_t inParamLen = 4; bool *inParam = (bool*)OsalMemAlloc(sizeof(bool) * inParamLen); @@ -89,7 +89,7 @@ HWTEST_F(ListTest, ArratTest_002, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_003, TestSize.Level0) +HWTEST_F(CListTest, CListTest_003, TestSize.Level1) { uint32_t inParamLen = 4; int8_t *inParam = (int8_t*)OsalMemAlloc(sizeof(int8_t) * inParamLen); @@ -127,7 +127,7 @@ HWTEST_F(ListTest, ArratTest_003, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_004, TestSize.Level0) +HWTEST_F(CListTest, CListTest_004, TestSize.Level1) { uint32_t inParamLen = 4; int16_t *inParam = (int16_t*)OsalMemAlloc(sizeof(int16_t) * inParamLen); @@ -164,7 +164,7 @@ HWTEST_F(ListTest, ArratTest_004, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_005, TestSize.Level0) +HWTEST_F(CListTest, CListTest_005, TestSize.Level1) { uint32_t inParamLen = 4; int32_t *inParam = (int32_t*)OsalMemAlloc(sizeof(int32_t) * inParamLen); @@ -201,7 +201,7 @@ HWTEST_F(ListTest, ArratTest_005, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_006, TestSize.Level0) +HWTEST_F(CListTest, CListTest_006, TestSize.Level1) { uint32_t inParamLen = 4; int64_t *inParam = (int64_t*)OsalMemAlloc(sizeof(int64_t) * inParamLen); @@ -238,7 +238,7 @@ HWTEST_F(ListTest, ArratTest_006, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_007, TestSize.Level0) +HWTEST_F(CListTest, CListTest_007, TestSize.Level1) { uint32_t inParamLen = 4; uint8_t *inParam = (uint8_t*)OsalMemAlloc(sizeof(uint8_t) * inParamLen); @@ -275,7 +275,7 @@ HWTEST_F(ListTest, ArratTest_007, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_008, TestSize.Level0) +HWTEST_F(CListTest, CListTest_008, TestSize.Level1) { uint32_t inParamLen = 4; uint16_t *inParam = (uint16_t*)OsalMemAlloc(sizeof(uint16_t) * inParamLen); @@ -312,7 +312,7 @@ HWTEST_F(ListTest, ArratTest_008, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_009, TestSize.Level0) +HWTEST_F(CListTest, CListTest_009, TestSize.Level1) { uint32_t inParamLen = 4; uint32_t *inParam = (uint32_t*)OsalMemAlloc(sizeof(uint32_t) * inParamLen); @@ -349,7 +349,7 @@ HWTEST_F(ListTest, ArratTest_009, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_010, TestSize.Level0) +HWTEST_F(CListTest, CListTest_010, TestSize.Level1) { uint32_t inParamLen = 4; uint64_t *inParam = (uint64_t*)OsalMemAlloc(sizeof(uint64_t) * inParamLen); @@ -386,7 +386,7 @@ HWTEST_F(ListTest, ArratTest_010, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_011, TestSize.Level0) +HWTEST_F(CListTest, CListTest_011, TestSize.Level1) { uint32_t inParamLen = 4; float *inParam = (float*)OsalMemAlloc(sizeof(float) * inParamLen); @@ -424,7 +424,7 @@ HWTEST_F(ListTest, ArratTest_011, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_012, TestSize.Level0) +HWTEST_F(CListTest, CListTest_012, TestSize.Level1) { uint32_t inParamLen = 4; double *inParam = (double*)OsalMemAlloc(sizeof(double) * inParamLen); @@ -462,7 +462,7 @@ HWTEST_F(ListTest, ArratTest_012, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_013, TestSize.Level0) +HWTEST_F(CListTest, CListTest_013, TestSize.Level1) { uint32_t inParamLen = 2; char **inParam = (char**)OsalMemAlloc(sizeof(char*) * inParamLen); @@ -505,7 +505,7 @@ HWTEST_F(ListTest, ArratTest_013, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_014, TestSize.Level0) +HWTEST_F(CListTest, CListTest_014, TestSize.Level1) { uint32_t inParamLen = 2; @@ -545,7 +545,7 @@ HWTEST_F(ListTest, ArratTest_014, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_015, TestSize.Level0) +HWTEST_F(CListTest, CListTest_015, TestSize.Level1) { uint32_t inParamLen = 4; enum ESample *inParam = (enum ESample*)OsalMemAlloc(sizeof(enum ESample) * inParamLen); @@ -582,7 +582,7 @@ HWTEST_F(ListTest, ArratTest_015, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_016, TestSize.Level0) +HWTEST_F(CListTest, CListTest_016, TestSize.Level1) { uint32_t inParamLen = 2; struct SSample *inParam = (struct SSample *)OsalMemAlloc(sizeof(struct SSample) * inParamLen); @@ -632,7 +632,7 @@ HWTEST_F(ListTest, ArratTest_016, TestSize.Level0) } } -HWTEST_F(ListTest, ArratTest_017, TestSize.Level0) +HWTEST_F(CListTest, CListTest_017, TestSize.Level1) { uint32_t inParamLen = 2; union USample *inParam = (union USample *)OsalMemAlloc(sizeof(union USample) * inParamLen); diff --git a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp index 1928b42bd..36ac0bd4a 100755 --- a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp +++ b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "c_test/struct_test/v1_0/client/istruct_test.h" using namespace OHOS; @@ -23,7 +23,7 @@ using namespace testing::ext; static struct IStructTest* g_testClient = nullptr; -class StructTest : public testing::Test { +class CStructTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -31,11 +31,11 @@ public: void TearDown(){} }; -void StructTest::SetUpTestCase() +void CStructTest::SetUpTestCase() { g_testClient = HdiStructTestGet(); if (g_testClient == nullptr) { - printf("StructTest: get g_testClient failed.\n"); + printf("CStructTest: get g_testClient failed.\n"); } } @@ -47,45 +47,12 @@ void TearDownTestCase() } } -HWTEST_F(StructTest, StructTest_001, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } - -static std::string ESampleToStr(ESample obj) -{ - switch (obj) { - case MEM_ONE: - return "MEM_ONE"; - case MEM_TWO: - return "MEM_TWO"; - case MEM_THREE: - return "MEM_THREE"; - default: - return "unknown"; - } -} - -static void PrintSSample(const struct SSample* obj) -{ - std::cout << "{"; - std::cout << (obj->m1 ? 1 : 0) << ","; - std::cout << obj->m2 << ","; - std::cout << obj->m3 << ","; - std::cout << obj->m4; - std::cout << "}"; -} - -static void PrintUSample(const union USample* obj) -{ - std::cout << "{"; - std::cout << (obj->m1 ? 1 : 0) << ","; - std::cout << obj->m2; - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_002, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_002, TestSize.Level1) { struct SSample* srcObj = (struct SSample*)OsalMemCalloc(sizeof(struct SSample)); ASSERT_NE(srcObj, nullptr); @@ -95,9 +62,6 @@ HWTEST_F(StructTest, StructTest_002, TestSize.Level0) srcObj->m3 = 10.125; srcObj->m4 = strdup("hello world"); - PrintSSample(srcObj); - std::cout << "\n"; - struct SSample* destObj = nullptr; int32_t ec = g_testClient->SSampleTest(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -107,31 +71,11 @@ HWTEST_F(StructTest, StructTest_002, TestSize.Level0) EXPECT_DOUBLE_EQ(srcObj->m3, destObj->m3); EXPECT_STREQ(srcObj->m4, destObj->m4); - PrintSSample(destObj); - std::cout << "\n"; - SSampleFree(srcObj, true); SSampleFree(destObj, true); } -static void PrintSSample2(const struct SSample2* obj) -{ - std::cout << "{"; - std::cout << (obj->m1 ? 1 : 0) << ","; - std::cout << obj->m2 << ","; - std::cout << obj->m3 << ","; - std::cout << obj->m4 << ","; - std::cout << obj->m5 << ","; - std::cout << obj->m6 << ","; - std::cout << obj->m7 << ","; - std::cout << obj->m8 << ","; - std::cout << obj->m9 << ","; - std::cout << obj->m10 << ","; - std::cout << obj->m11; - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_003, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_003, TestSize.Level1) { struct SSample2* srcObj = (struct SSample2*)OsalMemCalloc(sizeof(struct SSample2)); ASSERT_NE(srcObj, nullptr); @@ -148,9 +92,6 @@ HWTEST_F(StructTest, StructTest_003, TestSize.Level0) srcObj->m10 = 10.5; srcObj->m11 = 20.125; - PrintSSample2(srcObj); - std::cout << "\n"; - struct SSample2* destObj = nullptr; int32_t ec = g_testClient->SSample2Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -167,25 +108,11 @@ HWTEST_F(StructTest, StructTest_003, TestSize.Level0) EXPECT_FLOAT_EQ(srcObj->m10, destObj->m10); EXPECT_DOUBLE_EQ(srcObj->m11, destObj->m11); - PrintSSample2(destObj); - std::cout << "\n"; - SSample2Free(srcObj, true); SSample2Free(destObj, true); } -static void PrintSSample3(const struct SSample3* obj) -{ - std::cout << "{"; - std::cout << obj->m1 << ", "; - std::cout << ESampleToStr(obj->m2) << ", "; - PrintSSample2(&obj->m3); - std::cout << ", "; - std::cout << obj->m4; - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_004, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_004, TestSize.Level1) { struct SSample3* srcObj = (struct SSample3*)OsalMemCalloc(sizeof(struct SSample3)); ASSERT_NE(srcObj, nullptr); @@ -207,9 +134,6 @@ HWTEST_F(StructTest, StructTest_004, TestSize.Level0) srcObj->m4 = open("/fdtest1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); - PrintSSample3(srcObj); - std::cout << "\n"; - struct SSample3* destObj = nullptr; int32_t ec = g_testClient->SSample3Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -229,106 +153,11 @@ HWTEST_F(StructTest, StructTest_004, TestSize.Level0) EXPECT_FLOAT_EQ(srcObj->m3.m10, destObj->m3.m10); EXPECT_DOUBLE_EQ(srcObj->m3.m11, destObj->m3.m11); - PrintSSample3(destObj); - std::cout << "\n"; - SSample3Free(srcObj, true); SSample3Free(destObj, true); } -static void PrintSSample4(const struct SSample4* obj) -{ - std::cout << "{"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m1Len; i++) { - std::cout << (obj->m1[i] ? 1 : 0) << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m2Len; i++) { - std::cout << obj->m2[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m3Len; i++) { - std::cout << obj->m3[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m4Len; i++) { - std::cout << obj->m4[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m5Len; i++) { - std::cout << obj->m5[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m6Len; i++) { - std::cout << obj->m6[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m7Len; i++) { - std::cout << obj->m7[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m8Len; i++) { - std::cout << obj->m8[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m9Len; i++) { - std::cout << obj->m9[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m10Len; i++) { - std::cout << obj->m10[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m11Len; i++) { - std::cout << obj->m11[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m12Len; i++) { - std::cout << obj->m12[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m13Len; i++) { - std::cout << ESampleToStr(obj->m13[i]) << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m14Len; i++) { - PrintSSample(&(obj->m14[i])); - std::cout << ","; - } - std::cout << "}"; - - std::cout << "}\n"; -} - -HWTEST_F(StructTest, StructTest_005, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) { struct SSample4* srcObj = (struct SSample4*)OsalMemCalloc(sizeof(struct SSample4)); ASSERT_NE(srcObj, nullptr); @@ -421,9 +250,6 @@ HWTEST_F(StructTest, StructTest_005, TestSize.Level0) srcObj->m14[i].m4 = strdup("hello"); } - PrintSSample4(srcObj); - std::cout << "\n"; - struct SSample4* destObj = nullptr; int32_t ec = g_testClient->SSample4Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -488,106 +314,11 @@ HWTEST_F(StructTest, StructTest_005, TestSize.Level0) EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } - PrintSSample4(destObj); - std::cout << "\n"; - SSample4Free(srcObj, true); SSample4Free(destObj, true); } -static void PrintSSample5(const struct SSample5* obj) -{ - std::cout << "{"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m1Len; i++) { - std::cout << (obj->m1[i] ? 1 : 0) << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m2Len; i++) { - std::cout << obj->m2[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m3Len; i++) { - std::cout << obj->m3[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m4Len; i++) { - std::cout << obj->m4[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m5Len; i++) { - std::cout << obj->m5[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m6Len; i++) { - std::cout << obj->m6[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m7Len; i++) { - std::cout << obj->m7[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m8Len; i++) { - std::cout << obj->m8[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m9Len; i++) { - std::cout << obj->m9[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m10Len; i++) { - std::cout << obj->m10[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m11Len; i++) { - std::cout << obj->m11[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m12Len; i++) { - std::cout << obj->m12[i] << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m13Len; i++) { - std::cout << ESampleToStr(obj->m13[i]) << ","; - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m14Len; i++) { - PrintSSample(&(obj->m14[i])); - std::cout << ","; - } - std::cout << "},"; - - std::cout << "}\n"; -} - -HWTEST_F(StructTest, StructTest_006, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) { struct SSample5* srcObj = (struct SSample5*)OsalMemCalloc(sizeof(struct SSample5)); ASSERT_NE(srcObj, nullptr); @@ -680,9 +411,6 @@ HWTEST_F(StructTest, StructTest_006, TestSize.Level0) srcObj->m14[i].m4 = strdup("hello"); } - PrintSSample5(srcObj); - std::cout << "\n"; - struct SSample5* destObj = nullptr; int32_t ec = g_testClient->SSample5Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -746,36 +474,11 @@ HWTEST_F(StructTest, StructTest_006, TestSize.Level0) EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } - PrintSSample5(destObj); - std::cout << "\n"; - SSample5Free(srcObj, true); SSample5Free(destObj, true); } -static void PrintSSample6(const struct SSample6* obj) -{ - std::cout << "{"; - - PrintUSample(&obj->m1); - std::cout << ",\n"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m2Len; i++) { - PrintUSample(&obj->m2[i]); - } - std::cout << "},"; - - std::cout << "{"; - for (uint32_t i = 0; i < obj->m3Len; i++) { - PrintUSample(&obj->m3[i]); - } - std::cout << "}"; - - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_007, TestSize.Level0) +HWTEST_F(CStructTest, CStructTest_007, TestSize.Level1) { struct SSample6* srcObj = (struct SSample6*)OsalMemCalloc(sizeof(struct SSample6)); ASSERT_NE(srcObj, nullptr); @@ -797,9 +500,6 @@ HWTEST_F(StructTest, StructTest_007, TestSize.Level0) (srcObj->m3[i]).m2 = 2; } - PrintSSample6(srcObj); - std::cout << "\n"; - struct SSample6* destObj = nullptr; int32_t ec = g_testClient->SSample6Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -817,9 +517,6 @@ HWTEST_F(StructTest, StructTest_007, TestSize.Level0) EXPECT_EQ((srcObj->m3[i]).m2, (destObj->m3[i]).m2); } - PrintSSample6(destObj); - std::cout << "\n"; - SSample6Free(srcObj, true); SSample6Free(destObj, true); } diff --git a/tools/hdi-gen/test/cpp_test/array_test/v1_0/cpp_array_test.cpp b/tools/hdi-gen/test/cpp_test/array_test/v1_0/cpp_array_test.cpp index f89d97475..589d4292c 100755 --- a/tools/hdi-gen/test/cpp_test/array_test/v1_0/cpp_array_test.cpp +++ b/tools/hdi-gen/test/cpp_test/array_test/v1_0/cpp_array_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "test/cpp_test/array_test/v1_0/client/array_test_proxy.h" using namespace OHOS; @@ -25,7 +25,7 @@ using namespace test::cpp_test::types::v1_0; static sptr g_testClient = nullptr; -class ArrayTest : public testing::Test { +class CppArrayTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -33,20 +33,20 @@ public: void TearDown(){} }; -void ArrayTest::SetUpTestCase() +void CppArrayTest::SetUpTestCase() { g_testClient = IArrayTest::Get(); if (g_testClient == nullptr) { - printf("ArrayTest: get g_testClient failed.\n"); + printf("CppArrayTest: get g_testClient failed.\n"); } } -HWTEST_F(ArrayTest, ArrayTest_001, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(ArrayTest, ArrayTest_002, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_002, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -70,7 +70,7 @@ HWTEST_F(ArrayTest, ArrayTest_002, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_003, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_003, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -90,7 +90,7 @@ HWTEST_F(ArrayTest, ArrayTest_003, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_004, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_004, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -110,7 +110,7 @@ HWTEST_F(ArrayTest, ArrayTest_004, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_005, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_005, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -130,7 +130,7 @@ HWTEST_F(ArrayTest, ArrayTest_005, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_006, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_006, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -150,7 +150,7 @@ HWTEST_F(ArrayTest, ArrayTest_006, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_007, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_007, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -170,7 +170,7 @@ HWTEST_F(ArrayTest, ArrayTest_007, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_008, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_008, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -190,7 +190,7 @@ HWTEST_F(ArrayTest, ArrayTest_008, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_009, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_009, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -210,7 +210,7 @@ HWTEST_F(ArrayTest, ArrayTest_009, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_010, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_010, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -230,7 +230,7 @@ HWTEST_F(ArrayTest, ArrayTest_010, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_011, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_011, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -250,7 +250,7 @@ HWTEST_F(ArrayTest, ArrayTest_011, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_012, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_012, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -270,7 +270,7 @@ HWTEST_F(ArrayTest, ArrayTest_012, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_013, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_013, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -290,10 +290,10 @@ HWTEST_F(ArrayTest, ArrayTest_013, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_014, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_014, TestSize.Level1) { - int fd1 = open("/ArrayTest_014_0.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); - int fd2 = open("/ArrayTest_014_1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); + int fd1 = open("/CppArrayTest_014_0.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); + int fd2 = open("/CppArrayTest_014_1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); ASSERT_NE(fd1, -1); ASSERT_NE(fd2, -1); @@ -314,7 +314,7 @@ HWTEST_F(ArrayTest, ArrayTest_014, TestSize.Level0) close(fd2); } -HWTEST_F(ArrayTest, ArrayTest_015, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_015, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -334,7 +334,7 @@ HWTEST_F(ArrayTest, ArrayTest_015, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_016, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_016, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -362,7 +362,7 @@ HWTEST_F(ArrayTest, ArrayTest_016, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_017, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_017, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -385,7 +385,7 @@ HWTEST_F(ArrayTest, ArrayTest_017, TestSize.Level0) } } -HWTEST_F(ArrayTest, ArrayTest_018, TestSize.Level0) +HWTEST_F(CppArrayTest, CppArrayTest_018, TestSize.Level1) { std::vector> inParam = { sptr(new SequenceData(1, 1.2, "hello")), diff --git a/tools/hdi-gen/test/cpp_test/cb_test/v1_0/cpp_cb_test.cpp b/tools/hdi-gen/test/cpp_test/cb_test/v1_0/cpp_cb_test.cpp index 658522b77..87e48b6c0 100755 --- a/tools/hdi-gen/test/cpp_test/cb_test/v1_0/cpp_cb_test.cpp +++ b/tools/hdi-gen/test/cpp_test/cb_test/v1_0/cpp_cb_test.cpp @@ -9,9 +9,9 @@ #include #include #include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "test/cpp_test/cb_test/v1_0/client/cb_test_proxy.h" using namespace OHOS; @@ -24,7 +24,7 @@ static sptr g_testClient = nullptr; static sptr g_callbackObj = nullptr; -class CbTest : public testing::Test { +class CppCbTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -32,24 +32,24 @@ public: void TearDown(){} }; -void CbTest::SetUpTestCase() +void CppCbTest::SetUpTestCase() { g_testClient = ICbTest::Get(); if (g_testClient == nullptr) { - printf("CbTest: get g_testClient failed.\n"); + printf("CppCbTest: get g_testClient failed.\n"); } g_callbackObj = new CallbackService(); if (g_callbackObj == nullptr) { - printf("CbTest: get g_callbackObj failed.\n"); + printf("CppCbTest: get g_callbackObj failed.\n"); } } -HWTEST_F(CbTest, CbTest_001, TestSize.Level0) +HWTEST_F(CppCbTest, CppCbTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(CbTest, CbTest_002, TestSize.Level0) +HWTEST_F(CppCbTest, CppCbTest_002, TestSize.Level1) { int32_t ec = g_testClient->CallbackTest(g_callbackObj); ASSERT_EQ(ec, HDF_SUCCESS); diff --git a/tools/hdi-gen/test/cpp_test/data_test/v1_0/cpp_data_test.cpp b/tools/hdi-gen/test/cpp_test/data_test/v1_0/cpp_data_test.cpp index 4669a6f82..fbe6c0160 100755 --- a/tools/hdi-gen/test/cpp_test/data_test/v1_0/cpp_data_test.cpp +++ b/tools/hdi-gen/test/cpp_test/data_test/v1_0/cpp_data_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "cpp_test/data_test/v1_0/client/data_test_proxy.h" using namespace OHOS; @@ -25,7 +25,7 @@ using namespace test::cpp_test::types::v1_0; static sptr g_testClient = nullptr; -class DataTest : public testing::Test { +class CppDataTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -33,20 +33,20 @@ public: void TearDown(){} }; -void DataTest::SetUpTestCase() +void CppDataTest::SetUpTestCase() { g_testClient = IDataTest::Get(); if (g_testClient == nullptr) { - printf("DataTest: get g_testClient failed.\n"); + printf("CppDataTest: get g_testClient failed.\n"); } } -HWTEST_F(DataTest, DataTest_001, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(DataTest, DataTest_002, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_002, TestSize.Level1) { bool inParam = true; bool outParam = false; @@ -57,7 +57,7 @@ HWTEST_F(DataTest, DataTest_002, TestSize.Level0) EXPECT_TRUE(outParam); } -HWTEST_F(DataTest, DataTest_003, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_003, TestSize.Level1) { int8_t inParam = 10; int8_t outParam = 0; @@ -68,7 +68,7 @@ HWTEST_F(DataTest, DataTest_003, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_004, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_004, TestSize.Level1) { int16_t inParam = 10; int16_t outParam = 0; @@ -79,7 +79,7 @@ HWTEST_F(DataTest, DataTest_004, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_005, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_005, TestSize.Level1) { int32_t inParam = 10; int32_t outParam = 0; @@ -90,7 +90,7 @@ HWTEST_F(DataTest, DataTest_005, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_006, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_006, TestSize.Level1) { int64_t inParam = 10; int64_t outParam = 0; @@ -101,7 +101,7 @@ HWTEST_F(DataTest, DataTest_006, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_007, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_007, TestSize.Level1) { uint8_t inParam = 10; uint8_t outParam = 0; @@ -112,7 +112,7 @@ HWTEST_F(DataTest, DataTest_007, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_008, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_008, TestSize.Level1) { uint16_t inParam = 10; uint16_t outParam = 0; @@ -123,7 +123,7 @@ HWTEST_F(DataTest, DataTest_008, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_009, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_009, TestSize.Level1) { uint32_t inParam = 10; uint32_t outParam = 0; @@ -134,7 +134,7 @@ HWTEST_F(DataTest, DataTest_009, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_010, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_010, TestSize.Level1) { uint64_t inParam = 10; uint64_t outParam = 0; @@ -145,7 +145,7 @@ HWTEST_F(DataTest, DataTest_010, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_011, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_011, TestSize.Level1) { float inParam = 10.5; float outParam = 0; @@ -156,7 +156,7 @@ HWTEST_F(DataTest, DataTest_011, TestSize.Level0) EXPECT_FLOAT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_012, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_012, TestSize.Level1) { double inParam = 10.5; double outParam = 0; @@ -167,7 +167,7 @@ HWTEST_F(DataTest, DataTest_012, TestSize.Level0) EXPECT_DOUBLE_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_013, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_013, TestSize.Level1) { std::string inParam("hello"); std::string outParam; @@ -178,7 +178,7 @@ HWTEST_F(DataTest, DataTest_013, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_014, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_014, TestSize.Level1) { int fd = open("/cpp_data_test_014.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); printf("file open, fd = %d\n", fd); @@ -210,7 +210,7 @@ finished: close(fd); } -HWTEST_F(DataTest, DataTest_015, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_015, TestSize.Level1) { ESample inParam = ESample::MEM_ONE; ESample outParam = ESample::MEM_TWO; @@ -221,7 +221,7 @@ HWTEST_F(DataTest, DataTest_015, TestSize.Level0) EXPECT_EQ(inParam, outParam); } -HWTEST_F(DataTest, DataTest_016, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_016, TestSize.Level1) { SSample inParam; inParam.m1 = true; @@ -240,7 +240,7 @@ HWTEST_F(DataTest, DataTest_016, TestSize.Level0) EXPECT_EQ(inParam.m4, outParam.m4); } -HWTEST_F(DataTest, DataTest_017, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_017, TestSize.Level1) { USample inParam; inParam.m2 = 10; @@ -254,7 +254,7 @@ HWTEST_F(DataTest, DataTest_017, TestSize.Level0) EXPECT_DOUBLE_EQ(inParam.m2, outParam.m2); } -HWTEST_F(DataTest, DataTest_018, TestSize.Level0) +HWTEST_F(CppDataTest, CppDataTest_018, TestSize.Level1) { sptr inParam(new SequenceData(1, 1.2, "hello")); diff --git a/tools/hdi-gen/test/cpp_test/list_test/v1_0/cpp_list_test.cpp b/tools/hdi-gen/test/cpp_test/list_test/v1_0/cpp_list_test.cpp index 2d3a11a14..4fb130400 100755 --- a/tools/hdi-gen/test/cpp_test/list_test/v1_0/cpp_list_test.cpp +++ b/tools/hdi-gen/test/cpp_test/list_test/v1_0/cpp_list_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "test/cpp_test/list_test/v1_0/client/list_test_proxy.h" using namespace OHOS; @@ -25,7 +25,7 @@ using namespace test::cpp_test::types::v1_0; static sptr g_testClient = nullptr; -class ListTest : public testing::Test { +class CppListTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -33,20 +33,20 @@ public: void TearDown(){} }; -void ListTest::SetUpTestCase() +void CppListTest::SetUpTestCase() { g_testClient = IListTest::Get(); if (g_testClient == nullptr) { - printf("ListTest: get g_testClient failed.\n"); + printf("CppListTest: get g_testClient failed.\n"); } } -HWTEST_F(ListTest, ListTest_001, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(ListTest, ListTest_002, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_002, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -70,7 +70,7 @@ HWTEST_F(ListTest, ListTest_002, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_003, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_003, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -90,7 +90,7 @@ HWTEST_F(ListTest, ListTest_003, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_004, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_004, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -110,7 +110,7 @@ HWTEST_F(ListTest, ListTest_004, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_005, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_005, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -130,7 +130,7 @@ HWTEST_F(ListTest, ListTest_005, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_006, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_006, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -150,7 +150,7 @@ HWTEST_F(ListTest, ListTest_006, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_007, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_007, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -170,7 +170,7 @@ HWTEST_F(ListTest, ListTest_007, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_008, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_008, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -190,7 +190,7 @@ HWTEST_F(ListTest, ListTest_008, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_009, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_009, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -210,7 +210,7 @@ HWTEST_F(ListTest, ListTest_009, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_010, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_010, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -230,7 +230,7 @@ HWTEST_F(ListTest, ListTest_010, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_011, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_011, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -250,7 +250,7 @@ HWTEST_F(ListTest, ListTest_011, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_012, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_012, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -270,7 +270,7 @@ HWTEST_F(ListTest, ListTest_012, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_013, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_013, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -290,10 +290,10 @@ HWTEST_F(ListTest, ListTest_013, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_014, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_014, TestSize.Level1) { - int fd1 = open("/ListTest_014_0.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); - int fd2 = open("/ListTest_014_1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); + int fd1 = open("/CppListTest_014_0.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); + int fd2 = open("/CppListTest_014_1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); ASSERT_NE(fd1, -1); ASSERT_NE(fd2, -1); @@ -314,7 +314,7 @@ HWTEST_F(ListTest, ListTest_014, TestSize.Level0) close(fd2); } -HWTEST_F(ListTest, ListTest_015, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_015, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -334,7 +334,7 @@ HWTEST_F(ListTest, ListTest_015, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_016, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_016, TestSize.Level1) { uint32_t len = 4; std::vector inParam; @@ -362,7 +362,7 @@ HWTEST_F(ListTest, ListTest_016, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_017, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_017, TestSize.Level1) { uint32_t len = 2; std::vector inParam; @@ -385,7 +385,7 @@ HWTEST_F(ListTest, ListTest_017, TestSize.Level0) } } -HWTEST_F(ListTest, ListTest_018, TestSize.Level0) +HWTEST_F(CppListTest, CppListTest_018, TestSize.Level1) { std::vector> inParam = { sptr(new SequenceData(1, 1.2, "hello")), diff --git a/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp b/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp index 96edcb6ad..d7241049e 100755 --- a/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp +++ b/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp @@ -6,18 +6,18 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include +#include +#include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "cpp_test/map_test/v1_0/client/map_test_proxy.h" using namespace OHOS; @@ -27,7 +27,7 @@ using namespace test::cpp_test::types::v1_0; static sptr g_testClient = nullptr; -class MapTest : public testing::Test { +class CppMapTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -35,15 +35,15 @@ public: void TearDown(){} }; -void MapTest::SetUpTestCase() +void CppMapTest::SetUpTestCase() { g_testClient = IMapTest::Get(); if (g_testClient == nullptr) { - std::cout << "MapTest: get g_testClient failed." << std::endl; + std::cout << "CppMapTest: get g_testClient failed." << std::endl; } } -void MapTest::TearDownTestCase() +void CppMapTest::TearDownTestCase() { if (g_testClient != nullptr) { delete g_testClient; @@ -51,12 +51,12 @@ void MapTest::TearDownTestCase() } } -HWTEST_F(MapTest, MapTest_001, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -HWTEST_F(MapTest, MapTest_002, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_002, TestSize.Level1) { std::map inParam; inParam[1] = 'A'; @@ -72,13 +72,12 @@ HWTEST_F(MapTest, MapTest_002, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_002 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_002 TestCase is failed!" << std::endl; } } } - -HWTEST_F(MapTest, MapTest_003, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_003, TestSize.Level1) { std::map inParam; inParam[1] = 1; @@ -94,12 +93,12 @@ HWTEST_F(MapTest, MapTest_003, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_003 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_003 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_004, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_004, TestSize.Level1) { std::map inParam; inParam[1] = 1; @@ -115,12 +114,12 @@ HWTEST_F(MapTest, MapTest_004, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_004 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_004 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_005, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_005, TestSize.Level1) { std::map inParam; inParam[1] = 100; @@ -136,12 +135,12 @@ HWTEST_F(MapTest, MapTest_005, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_005 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_005 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_006, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_006, TestSize.Level1) { std::map inParam; inParam[1] = 10.5; @@ -157,12 +156,12 @@ HWTEST_F(MapTest, MapTest_006, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_006 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_006 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_007, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_007, TestSize.Level1) { std::map inParam; inParam[1] = 10.55; @@ -178,12 +177,12 @@ HWTEST_F(MapTest, MapTest_007, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_DOUBLE_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_007 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_007 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_008, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_008, TestSize.Level1) { std::map inParam; inParam[1] = "hello"; @@ -199,12 +198,12 @@ HWTEST_F(MapTest, MapTest_008, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_STREQ(inIter->second.c_str(), outIter->second.c_str()); } else { - std::cout << "MapTest_008 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_008 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_009, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_009, TestSize.Level1) { std::map inParam; inParam[1] = open("/cpp_test_map_009.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); @@ -221,7 +220,7 @@ HWTEST_F(MapTest, MapTest_009, TestSize.Level0) std::cout << "inParam[" << inIter->first << "]:" << inIter->second << std::endl; std::cout << "outParam[" << outIter->first << "]:" << outIter->second << std::endl; } else { - std::cout << "MapTest_009 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_009 TestCase is failed!" << std::endl; } } @@ -229,7 +228,7 @@ HWTEST_F(MapTest, MapTest_009, TestSize.Level0) close(outParam[0]); } -HWTEST_F(MapTest, MapTest_010, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_010, TestSize.Level1) { std::map> inParam = { {0, sptr(new SequenceData(1, 1.2, "hello"))}, @@ -248,12 +247,12 @@ HWTEST_F(MapTest, MapTest_010, TestSize.Level0) EXPECT_DOUBLE_EQ(inIter->second->m2_, outIter->second->m2_); EXPECT_EQ(inIter->second->m3_, outIter->second->m3_); } else { - std::cout << "MapTest_010 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_010 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_011, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_011, TestSize.Level1) { std::map inParam; inParam[1] = ESample::MEM_ONE; @@ -269,12 +268,12 @@ HWTEST_F(MapTest, MapTest_011, TestSize.Level0) if (outIter != outParam.end()) { ASSERT_EQ(inIter->second, outIter->second); } else { - std::cout << "MapTest_011 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_011 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_012, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_012, TestSize.Level1) { std::map inParam; for (int32_t i = 0; i < 2; i++) { @@ -299,12 +298,12 @@ HWTEST_F(MapTest, MapTest_012, TestSize.Level0) ASSERT_DOUBLE_EQ((inIter->second).m3, (outIter->second).m3); ASSERT_EQ((inIter->second).m4, (outIter->second).m4); } else { - std::cout << "MapTest_012 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_012 TestCase is failed!" << std::endl; } } } -HWTEST_F(MapTest, MapTest_013, TestSize.Level0) +HWTEST_F(CppMapTest, CppMapTest_013, TestSize.Level1) { std::map inParam; for (int32_t i = 0; i < 2; i++) { @@ -325,7 +324,7 @@ HWTEST_F(MapTest, MapTest_013, TestSize.Level0) ASSERT_EQ(((inIter->second).m1 ? 1 : 0), ((outIter->second).m1 ? 1 : 0)); ASSERT_EQ((inIter->second).m2, (outIter->second).m2); } else { - std::cout << "MapTest_013 TestCase is failed!" << std::endl; + std::cout << "CppMapTest_013 TestCase is failed!" << std::endl; } } } \ No newline at end of file diff --git a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp index 4343b89c8..6a26787eb 100755 --- a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp +++ b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp @@ -8,14 +8,14 @@ #include #include +#include +#include +#include #include #include -#include -#include -#include -#include -#include -#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" #include "test/cpp_test/struct_test/v1_0/client/struct_test_proxy.h" using namespace OHOS; @@ -25,7 +25,7 @@ using namespace test::cpp_test::types::v1_0; static sptr g_testClient = nullptr; -class StructTest : public testing::Test { +class CppStructTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(){} @@ -33,44 +33,20 @@ public: void TearDown(){} }; -void StructTest::SetUpTestCase() +void CppStructTest::SetUpTestCase() { g_testClient = IStructTest::Get(); if (g_testClient == nullptr) { - printf("StructTest: get g_testClient failed.\n"); + printf("CppStructTest: get g_testClient failed.\n"); } } -HWTEST_F(StructTest, StructTest_001, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_001, TestSize.Level1) { ASSERT_NE(nullptr, g_testClient); } -static std::string ESampleToStr(ESample obj) -{ - switch (obj) { - case ESample::MEM_ONE: - return "MEM_ONE"; - case ESample::MEM_TWO: - return "MEM_TWO"; - case ESample::MEM_THREE: - return "MEM_THREE"; - default: - return "unknown"; - } -} - -static void PrintSSample(const SSample& obj) -{ - std::cout << "{"; - std::cout << "m1:" << (obj.m1 ? 1 : 0) << ", "; - std::cout << "m2:" << obj.m2 << ", "; - std::cout << "m3:" << obj.m3 << ", "; - std::cout << "m4:" << obj.m4; - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_002, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_002, TestSize.Level1) { SSample srcObj = {true, 1, 1000.125, "hello world"}; @@ -83,33 +59,9 @@ HWTEST_F(StructTest, StructTest_002, TestSize.Level0) EXPECT_EQ(srcObj.m2, destObj.m2); EXPECT_DOUBLE_EQ(srcObj.m3, destObj.m3); EXPECT_EQ(srcObj.m4, destObj.m4); - - PrintSSample(srcObj); - std::cout << "\n"; - PrintSSample(destObj); - std::cout << "\n"; - std::cout << "----------------------------" << std::endl; -} - -static void PrintSSample2(const SSample2& obj) -{ - std::cout << "{"; - - std::cout << "m1:" << obj.m1 << ", "; - std::cout << "m2:" << (obj.m2 ? 1 : 0) << ", "; - std::cout << "m3:" << obj.m3 << ", "; - std::cout << "m4:" << obj.m4 << ", "; - std::cout << "m5:" << obj.m5 << ", "; - std::cout << "m6:" << obj.m6 << ", "; - std::cout << "m7:" << obj.m7 << ", "; - std::cout << "m8:" << obj.m8 << ", "; - std::cout << "m9:" << obj.m9 << ", "; - std::cout << "m10:" << obj.m10 << ", "; - std::cout << "m11:" << obj.m11; - std::cout << "}"; } -HWTEST_F(StructTest, StructTest_003, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_003, TestSize.Level1) { SSample2 srcObj = {true, 1, 2, 3, 4, 65, 20, 30, 40, 100.25, 1000.125}; @@ -129,28 +81,9 @@ HWTEST_F(StructTest, StructTest_003, TestSize.Level0) EXPECT_EQ(srcObj.m9, destObj.m9); EXPECT_FLOAT_EQ(srcObj.m10, destObj.m10); EXPECT_DOUBLE_EQ(srcObj.m11, destObj.m11); - - PrintSSample2(srcObj); - std::cout << "\n"; - PrintSSample2(destObj); - std::cout << "\n"; - std::cout << "----------------------------" << std::endl; } -static void PrintSSample3(const SSample3& obj) -{ - std::cout << "{"; - std::cout << "m1:" << obj.m1 << ", "; - std::cout << "m2:" << ESampleToStr(obj.m2) << ", "; - - std::cout << "m3:"; - PrintSSample2(obj.m3); - std::cout << ", "; - - std::cout << "m4:" << obj.m4; -} - -HWTEST_F(StructTest, StructTest_004, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_004, TestSize.Level1) { int fd = open("/fdtest3.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); SSample3 srcObj = { @@ -166,7 +99,6 @@ HWTEST_F(StructTest, StructTest_004, TestSize.Level0) EXPECT_EQ(srcObj.m1, destObj.m1); EXPECT_EQ(srcObj.m2, destObj.m2); - EXPECT_EQ((srcObj.m3.m1 ? 1 : 0), (destObj.m3.m1 ? 1 : 0)); EXPECT_EQ(srcObj.m3.m2, destObj.m3.m2); EXPECT_EQ(srcObj.m3.m3, destObj.m3.m3); @@ -178,114 +110,11 @@ HWTEST_F(StructTest, StructTest_004, TestSize.Level0) EXPECT_EQ(srcObj.m3.m9, destObj.m3.m9); EXPECT_FLOAT_EQ(srcObj.m3.m10, destObj.m3.m10); EXPECT_DOUBLE_EQ(srcObj.m3.m11, destObj.m3.m11); - - PrintSSample3(srcObj); - std::cout << "\n"; - PrintSSample3(destObj); - std::cout << "\n"; - std::cout << "----------------------------" << std::endl; close(srcObj.m4); close(destObj.m4); } -static void PrintSSample4(const SSample4& obj) -{ - std::cout << "{\n"; - - std::cout << "m1:{"; - for (size_t i = 0; i < obj.m1.size(); i++) { - std::cout << (obj.m1[i] ? 1 : 0) << ", "; - } - std::cout << "},\n"; - - std::cout << "m2:{"; - for (size_t i = 0; i < obj.m2.size(); i++) { - std::cout << obj.m2[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m3:{"; - for (size_t i = 0; i < obj.m3.size(); i++) { - std::cout << obj.m3[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m4:{"; - for (size_t i = 0; i < obj.m4.size(); i++) { - std::cout << obj.m4[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m5:{"; - for (size_t i = 0; i < obj.m5.size(); i++) { - std::cout << obj.m5[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m6:{"; - for (size_t i = 0; i < obj.m6.size(); i++) { - std::cout << obj.m6[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m7:{"; - for (size_t i = 0; i < obj.m7.size(); i++) { - std::cout << obj.m7[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m8:{"; - for (size_t i = 0; i < obj.m8.size(); i++) { - std::cout << obj.m8[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m9:{"; - for (size_t i = 0; i < obj.m9.size(); i++) { - std::cout << obj.m9[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m10:{"; - for (size_t i = 0; i < obj.m10.size(); i++) { - std::cout << obj.m10[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m11:{"; - for (size_t i = 0; i < obj.m11.size(); i++) { - std::cout << obj.m11[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m12:{"; - for (size_t i = 0; i < obj.m12.size(); i++) { - std::cout << obj.m12[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m13:{"; - for (size_t i = 0; i < obj.m13.size(); i++) { - std::cout << ESampleToStr(obj.m13[i]) << ", "; - } - std::cout << "},\n"; - - std::cout << "m14:{"; - for (size_t i = 0; i < obj.m13.size(); i++) { - PrintSSample(obj.m14[i]); - std::cout << ", "; - } - std::cout << "},\n"; - - std::cout << "m15:{"; - for (size_t i = 0; i < obj.m15.size(); i++) { - std::cout << obj.m15[i] << ", "; - } - std::cout << "}"; - std::cout << "}\n"; -} - -HWTEST_F(StructTest, StructTest_005, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) { SSample4 srcObj = { {true, false}, @@ -381,112 +210,9 @@ HWTEST_F(StructTest, StructTest_005, TestSize.Level0) std::cout << "var1 or var2 is nullptr" << std::endl; } } - - PrintSSample4(srcObj); - PrintSSample4(destObj); - std::cout << "\n"; - std::cout << "--------------------------------------\n"; } -static void PrintSSample5(const SSample5& obj) -{ - std::cout << "{\n"; - - std::cout << "m1:{"; - for (size_t i = 0; i < obj.m1.size(); i++) { - std::cout << obj.m1[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m2:{"; - for (size_t i = 0; i < obj.m2.size(); i++) { - std::cout << obj.m2[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m3:{"; - for (size_t i = 0; i < obj.m3.size(); i++) { - std::cout << obj.m3[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m4:{"; - for (size_t i = 0; i < obj.m4.size(); i++) { - std::cout << obj.m4[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m5:{"; - for (size_t i = 0; i < obj.m5.size(); i++) { - std::cout << obj.m5[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m6:{"; - for (size_t i = 0; i < obj.m6.size(); i++) { - std::cout << obj.m6[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m7:{"; - for (size_t i = 0; i < obj.m7.size(); i++) { - std::cout << obj.m7[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m8:{"; - for (size_t i = 0; i < obj.m8.size(); i++) { - std::cout << obj.m8[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m9:{"; - for (size_t i = 0; i < obj.m9.size(); i++) { - std::cout << obj.m9[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m10:{"; - for (size_t i = 0; i < obj.m10.size(); i++) { - std::cout << obj.m10[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m11:{"; - for (size_t i = 0; i < obj.m11.size(); i++) { - std::cout << obj.m11[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m12:{"; - for (size_t i = 0; i < obj.m12.size(); i++) { - std::cout << obj.m12[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "m13:{"; - for (size_t i = 0; i < obj.m13.size(); i++) { - std::cout << ESampleToStr(obj.m13[i]) << ", "; - } - std::cout << "},\n"; - - std::cout << "m14:{"; - for (size_t i = 0; i < obj.m14.size(); i++) { - PrintSSample(obj.m14[i]); - std::cout << ", \n"; - } - std::cout << ",\n"; - - std::cout << "m13:{"; - for (size_t i = 0; i < obj.m15.size(); i++) { - std::cout << obj.m15[i] << ", "; - } - std::cout << "},\n"; - - std::cout << "}"; -} - -HWTEST_F(StructTest, StructTest_006, TestSize.Level0) +HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) { SSample5 srcObj = { {true, false}, @@ -582,9 +308,4 @@ HWTEST_F(StructTest, StructTest_006, TestSize.Level0) std::cout << "var1 or var2 is nullptr" << std::endl; } } - - PrintSSample5(srcObj); - PrintSSample5(destObj); - std::cout << "\n"; - std::cout << "--------------------------------------\n"; } \ No newline at end of file diff --git a/tools/hdi-gen/util/file.cpp b/tools/hdi-gen/util/file.cpp index 72bb17381..319c4d3f4 100755 --- a/tools/hdi-gen/util/file.cpp +++ b/tools/hdi-gen/util/file.cpp @@ -114,7 +114,7 @@ int File::Read() return (count != 0) ? count : -1; } -bool File::ReadData(void* data, size_t size) +bool File::ReadData(void* data, size_t size) const { if (data == nullptr || size == 0) { return true; @@ -128,7 +128,7 @@ bool File::ReadData(void* data, size_t size) return count == 1; } -bool File::WriteData(const void* data, size_t size) +bool File::WriteData(const void* data, size_t size) const { if (data == nullptr || size == 0) { return true; diff --git a/tools/hdi-gen/util/file.h b/tools/hdi-gen/util/file.h index 7120962cb..988b9c961 100755 --- a/tools/hdi-gen/util/file.h +++ b/tools/hdi-gen/util/file.h @@ -9,7 +9,6 @@ #ifndef OHOS_HDI_FILE_H #define OHOS_HDI_FILE_H -#include #include #include "util/string.h" @@ -47,9 +46,9 @@ public: return columnNo_; } - bool ReadData(void* data, size_t size); + bool ReadData(void* data, size_t size) const; - bool WriteData(const void* data, size_t size); + bool WriteData(const void* data, size_t size) const; void Flush(); diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 8273ff67a..9afa957c5 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -16,7 +16,7 @@ namespace OHOS { namespace HDI { -const char* Options::OPT_SUPPORT_ARGS = "c:d:"; +const char* Options::optSupportArgs = "c:d:"; static struct option g_longOpts[] = { {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, @@ -34,14 +34,14 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, char** argv) +Options& Options::Parse(int argc, char* const argv[]) { program_ = argv[0]; opterr = 1; int op = 0; int optIndex = 0; - while ((op = getopt_long(argc, argv, OPT_SUPPORT_ARGS, g_longOpts, &optIndex)) != OPT_END) { + while ((op = getopt_long(argc, argv, optSupportArgs, g_longOpts, &optIndex)) != OPT_END) { switch (op) { case 'c': doCompile_ = true; diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index 1eee4583a..8825856bb 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -21,7 +21,7 @@ public: Options(const Options& other) = delete; Options operator=(const Options& other) = delete; - Options& Parse(int argc, char** argv); + Options& Parse(int argc, char* const argv[]); ~Options() = default; @@ -98,7 +98,7 @@ private: void CheckOptions(); - static const char* OPT_SUPPORT_ARGS; + static const char* optSupportArgs; static constexpr int OPT_END = -1; static constexpr int VERSION_MAJOR = 0; -- Gitee From aa8eaf33b64e28df23747eda082bd07a4a078dc7 Mon Sep 17 00:00:00 2001 From: yue Date: Mon, 13 Sep 2021 09:12:19 +0800 Subject: [PATCH 031/272] =?UTF-8?q?hdi-gen=E4=BB=A3=E7=A0=81=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yue --- tools/hdi-gen/ast/ast_parameter.cpp | 1 - tools/hdi-gen/ast/ast_parameter.h | 3 ++- tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp | 3 ++- tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp | 3 ++- tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp | 3 ++- .../hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp | 8 ++++---- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tools/hdi-gen/ast/ast_parameter.cpp b/tools/hdi-gen/ast/ast_parameter.cpp index de7c00227..462b757e1 100755 --- a/tools/hdi-gen/ast/ast_parameter.cpp +++ b/tools/hdi-gen/ast/ast_parameter.cpp @@ -215,6 +215,5 @@ void ASTParameter::EmitCWriteVar(const String& parcelName, const String& gotoLab type_->EmitCWriteVar(parcelName, name_, gotoLabel, sb, prefix); } - } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.h b/tools/hdi-gen/ast/ast_parameter.h index 033f06886..6ecc35287 100755 --- a/tools/hdi-gen/ast/ast_parameter.h +++ b/tools/hdi-gen/ast/ast_parameter.h @@ -68,7 +68,8 @@ public: String EmitJavaLocalVar(); - void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, + const String& prefix) const; private: String name_; AutoPtr type_ = nullptr; diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index d7f9a8b89..b5c899dbb 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -171,7 +171,8 @@ void CServiceImplCodeEmitter::EmitServiceImplInstance(StringBuilder& sb) sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", interfaceName_.string(), objName.string(), interfaceName_.string(), interfaceName_.string()); sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", interfaceName_.string(), objName.string()); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n"); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index fded485b2..aa09a8704 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -208,7 +208,8 @@ void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder& sb, const Strin sb.Append(prefix + g_tab + g_tab).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n"); sb.Append(prefix + g_tab + g_tab).Append("auto servMgr = IServiceManager::Get();\n"); sb.Append(prefix + g_tab + g_tab).Append("if (servMgr == nullptr) {\n"); - sb.Append(prefix + g_tab + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append( + "HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); sb.Append(prefix + g_tab + g_tab + g_tab).Append("break;\n"); sb.Append(prefix + g_tab + g_tab).Append("}\n\n"); sb.Append(prefix + g_tab + g_tab).AppendFormat("sptr remote = servMgr->GetService(\"%sService\");\n", diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index 32ca847a0..bffb79c89 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -375,7 +375,8 @@ void CppServiceStubCodeEmitter::EmitCbStubOnRequestMethodImpl(StringBuilder& sb, sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s: not support cmd %{public}d\", __func__, code);\n"); - sb.Append(prefix + g_tab + g_tab + g_tab).Append("return IPCObjectStub::OnRemoteRequest(code, data, reply, option);\n"); + sb.Append(prefix + g_tab + g_tab + g_tab).Append( + "return IPCObjectStub::OnRemoteRequest(code, data, reply, option);\n"); sb.Append(prefix + g_tab + g_tab).Append("}\n"); sb.Append(prefix + g_tab).Append("}\n"); sb.Append("}\n"); diff --git a/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp b/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp index d7241049e..6a25df095 100755 --- a/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp +++ b/tools/hdi-gen/test/cpp_test/map_test/v1_0/cpp_map_test.cpp @@ -191,7 +191,7 @@ HWTEST_F(CppMapTest, CppMapTest_008, TestSize.Level1) std::map outParam; int32_t ec = g_testClient->MapIntStringTest(inParam, outParam); - ASSERT_EQ(ec, HDF_SUCCESS); + ASSERT_EQ(ec, HDF_SUCCESS); for (auto inIter = inParam.begin(); inIter != inParam.end(); ++inIter) { auto outIter = outParam.find(inIter->first); @@ -212,7 +212,7 @@ HWTEST_F(CppMapTest, CppMapTest_009, TestSize.Level1) std::map outParam; int32_t ec = g_testClient->MapIntFdTest(inParam, outParam); - ASSERT_EQ(ec, HDF_SUCCESS); + ASSERT_EQ(ec, HDF_SUCCESS); for (auto inIter = inParam.begin(); inIter != inParam.end(); ++inIter) { auto outIter = outParam.find(inIter->first); @@ -238,7 +238,7 @@ HWTEST_F(CppMapTest, CppMapTest_010, TestSize.Level1) std::map> outParam; int32_t ec = g_testClient->MapIntSeqTest(inParam, outParam); - ASSERT_EQ(ec, HDF_SUCCESS); + ASSERT_EQ(ec, HDF_SUCCESS); for (auto inIter = inParam.begin(); inIter != inParam.end(); ++inIter) { auto outIter = outParam.find(inIter->first); @@ -261,7 +261,7 @@ HWTEST_F(CppMapTest, CppMapTest_011, TestSize.Level1) std::map outParam; int32_t ec = g_testClient->MapIntEnumTest(inParam, outParam); - ASSERT_EQ(ec, HDF_SUCCESS); + ASSERT_EQ(ec, HDF_SUCCESS); for (auto inIter = inParam.begin(); inIter != inParam.end(); ++inIter) { auto outIter = outParam.find(inIter->first); -- Gitee From 0606a8bfff55a3686e740063c21d7ec48998f8c1 Mon Sep 17 00:00:00 2001 From: jiachanglin Date: Mon, 13 Sep 2021 09:56:26 +0000 Subject: [PATCH 032/272] Description:hdf_unittest_wifi failt Feature or Bugfix:Feature Binary Source: No Signed-off-by: jiachanglin --- .../model/network/wifi/unittest/net/hdf_netbuf_test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c b/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c index e82ab80d5..fc8c15724 100644 --- a/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c +++ b/test/unittest/model/network/wifi/unittest/net/hdf_netbuf_test.c @@ -16,8 +16,8 @@ #define DEFAULT_TAIL_SIZE 20 #define DEFAULT_MAPPING_QUEUE 10 #define DEFAULT_TRIM_SIZE 3 -#define DEFAULT_SECTION_SIZE 3 - +#define DEFAULT_SECTION_SIZE 10 + #define MAX_MEM_ALLOC_SIZE 0x7fffffff typedef int32_t (*pTestCaseFunc)(void); -- Gitee From 0cd259404df69e8ba03e3675cd9f848c915da1c0 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Mon, 13 Sep 2021 19:38:30 +0800 Subject: [PATCH 033/272] clear aleam Signed-off-by: jifengfei --- model/sensor/driver/common/src/sensor_config_controller.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index d0e7c07f8..e2f3689dd 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -106,8 +106,7 @@ static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *va uint32_t tmp; mask = GetSensorRegRealValueMask(cfgItem, &originValue, valueMask); - switch ((enum SensorCalculateType)cfgItem->calType) - { + switch ((enum SensorCalculateType)cfgItem->calType) { case SENSOR_CFG_CALC_TYPE_SET: *value &= ~mask; *value |= (originValue & mask); @@ -190,4 +189,4 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg } return HDF_SUCCESS; -} +} \ No newline at end of file -- Gitee From 394daebcf891d4e4a937843333f279c78aa5b8c2 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Mon, 13 Sep 2021 11:46:18 +0000 Subject: [PATCH 034/272] codex fix Signed-off-by: vb6174 --- model/audio/common/src/audio_codec_base.c | 8 ++++---- model/audio/core/src/audio_core.c | 24 +++++++++++------------ model/audio/sapm/src/audio_sapm.c | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 6d7d0a46d..0bef4037f 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -26,7 +26,7 @@ int32_t CodecDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, uint32 return HDF_ERR_INVALID_OBJECT; } acodecVir = virtualAdd->acodecVir; - *val = OSAL_READL((void *)(acodecVir + reg)); + *val = OSAL_READL((void *)(volatile uintptr_t)(acodecVir + reg)); AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; @@ -50,7 +50,7 @@ int32_t CodecDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, uint3 } acodecVir = virtualAdd->acodecVir; - OSAL_WRITEL(value, (void *)(acodecVir + reg)); + OSAL_WRITEL(value, (void *)(volatile uintptr_t)(acodecVir + reg)); AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; @@ -74,7 +74,7 @@ int32_t CodecAiaoDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, ui } aiaoVir = virtualAdd->aiaoVir; - *val = OSAL_READL((void *)(aiaoVir + reg)); + *val = OSAL_READL((void *)(volatile uintptr_t)(aiaoVir + reg)); AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; @@ -97,7 +97,7 @@ int32_t CodecAiaoDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, u } aiaoVir = virtualAdd->aiaoVir; - OSAL_WRITEL(value, (void *)(aiaoVir + reg)); + OSAL_WRITEL(value, (void *)(volatile uintptr_t)(aiaoVir + reg)); AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index a3a546d9b..0c12213d1 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -388,7 +388,7 @@ int32_t AudioUpdateCodecRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; - uint32_t curValue; + uint32_t curValue = 0; uint32_t mixerControlMask; if (codec == NULL || mixerControl == NULL) { ADM_LOG_ERR("Invalid accessory param."); @@ -423,7 +423,7 @@ int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, const struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; - uint32_t curValue; + uint32_t curValue = 0; uint32_t mixerControlMask; if (accessory == NULL || mixerControl == NULL) { ADM_LOG_ERR("Invalid accessory param."); @@ -457,7 +457,7 @@ int32_t AudioUpdateCodecAiaoRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; - uint32_t curValue; + uint32_t curValue = 0; uint32_t mixerControlMask; ADM_LOG_DEBUG("Entry to update AIAO codec reg bits."); @@ -493,7 +493,7 @@ int32_t AudioUpdateAccessoryAiaoRegBits(struct AccessoryDevice *accessory, const struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; - uint32_t curValue; + uint32_t curValue = 0; uint32_t mixerControlMask; ADM_LOG_DEBUG("Entry to update AIAO accessory reg bits."); @@ -800,8 +800,8 @@ static int32_t AudioGetCtrlOpsReg(struct AudioCtrlElemValue *elemValue, int32_t AudioCodecGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) { - uint32_t curValue; - uint32_t rcurValue; + uint32_t curValue = 0; + uint32_t rcurValue = 0; struct AudioMixerControl *mixerCtrl = NULL; struct CodecDevice *codec = NULL; if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { @@ -830,8 +830,8 @@ int32_t AudioCodecGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioC int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) { - uint32_t curValue; - uint32_t rcurValue; + uint32_t curValue = 0; + uint32_t rcurValue = 0; struct AudioMixerControl *mixerCtrl = NULL; struct AccessoryDevice *accessory = NULL; if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { @@ -861,8 +861,8 @@ int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct Au int32_t AudioCodecAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) { - uint32_t curValue; - uint32_t rcurValue; + uint32_t curValue = 0; + uint32_t rcurValue = 0; struct CodecDevice *codec = NULL; struct AudioMixerControl *mixerCtrl = NULL; if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { @@ -893,8 +893,8 @@ int32_t AudioCodecAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct Au int32_t AudioAccessoryAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) { - uint32_t curValue; - uint32_t rcurValue; + uint32_t curValue = 0; + uint32_t rcurValue = 0; struct AccessoryDevice *accessory = NULL; struct AudioMixerControl *mixerCtrl = NULL; if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index e5791e71d..9f570b967 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -409,7 +409,7 @@ static void MixerSetPathStatus(const struct AudioSapmComponent *sapmComponent, s uint32_t mask; uint32_t shift; uint32_t invert; - uint32_t curValue; + uint32_t curValue = 0; if ((sapmComponent == NULL || sapmComponent->codec == NULL) || (path == NULL) || (mixerCtrl == NULL)) { ADM_LOG_ERR("input params check error: sapmComponent=%p, path=%p, mixerCtrl=%p.", -- Gitee From 1096478e71864e8b64f691bd0f31f6d1a97e6a4d Mon Sep 17 00:00:00 2001 From: bigA2021 Date: Tue, 14 Sep 2021 11:14:16 +0800 Subject: [PATCH 035/272] usb 0914 commit Signed-off-by: bigA2021 Change-Id: I9c5a0b98e45d8950f2c204d92b27777a0b65dd10 --- model/usb/src/usb_ddk_pnp_loader.c | 6 +- test/unittest/model/usb/host/src/usb_raw_io.c | 118 ++++++++++-------- test/unittest/model/usb/host/src/usb_test.c | 50 +++++--- 3 files changed, 99 insertions(+), 75 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index affbd0489..c8be7990e 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -721,7 +721,7 @@ error: static void UsbDdkPnpLoaderAddDevice(uint32_t cmdId, uint8_t index, const struct IDevmgrService *devmgrSvc, const struct UsbPnpNotifyMatchInfoTable *infoTable, struct UsbPnpMatchIdTable **matchIdTable) { - int ret = HDF_FAILURE; + int ret; struct UsbPnpMatchIdTable *idTable = NULL; int32_t tableCount; @@ -743,8 +743,6 @@ static void UsbDdkPnpLoaderAddDevice(uint32_t cmdId, uint8_t index, const struct continue; } } - - HDF_LOGD("%s:%d AddDevice end, index=%d, ret=%d", __func__, __LINE__, index, ret); } static int UsbDdkPnpLoaderRemoveHandle(const struct IDevmgrService *devmgrSvc, @@ -1008,7 +1006,7 @@ int UsbDdkPnpLoaderEventHandle(void) } return status; error: - for (idTable = g_usbPnpMatchIdTable[0]; idTable != NULL; ) { + for (idTable = g_usbPnpMatchIdTable[0]; idTable != NULL;) { tableCount++; idTable = g_usbPnpMatchIdTable[tableCount]; } diff --git a/test/unittest/model/usb/host/src/usb_raw_io.c b/test/unittest/model/usb/host/src/usb_raw_io.c index ac9cbe35d..dc0da48c6 100755 --- a/test/unittest/model/usb/host/src/usb_raw_io.c +++ b/test/unittest/model/usb/host/src/usb_raw_io.c @@ -35,7 +35,7 @@ int UsbIoThread(void *data) int ret; struct AcmRawDevice *acm = (struct AcmRawDevice *)data; - for (; ;) { + for (;;) { printf("%s:%d\n", __func__, __LINE__); if (acm == NULL) { printf("%s:%d acm is NULL\n", __func__, __LINE__); @@ -167,7 +167,6 @@ void AcmReadBulkCallback(const void *requestArg) if (size) { uint8_t *data = req->buffer; printf("rcv:%s\n", (char *)data); - } break; case USB_REQUEST_CANCELLED: @@ -207,28 +206,38 @@ void AcmNotifyReqCallback(const void *requestArg) printf("Irqstatus:%d,actualLength:%u\n", req->status, currentSize); } -int AcmWriteBufAlloc(struct AcmRawDevice *acm) +static int AcmWriteBufAllocHandle(struct AcmRawDevice *acm) { int i; - if (!g_writeBufFlag) { - struct RawWb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { - wb->buf = OsalMemCalloc(acm->dataOutEp.maxPacketSize); - if (!wb->buf) { - while (i != 0) { - --i; - --wb; - OsalMemFree(wb->buf); - wb->buf = NULL; - } - return -HDF_ERR_MALLOC_FAIL; + struct RawWb *wb; + for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { + wb->buf = OsalMemCalloc(acm->dataOutEp.maxPacketSize); + if (!wb->buf) { + while (i != 0) { + --i; + --wb; + OsalMemFree(wb->buf); + wb->buf = NULL; } - g_writeBufFlag = true; + return -HDF_ERR_MALLOC_FAIL; } + g_writeBufFlag = true; } + return HDF_SUCCESS; } +int AcmWriteBufAlloc(struct AcmRawDevice *acm) +{ + int ret = HDF_SUCCESS; + + if (!g_writeBufFlag) { + ret = AcmWriteBufAllocHandle(acm); + } + + return ret; +} + void AcmWriteBufFree(struct AcmRawDevice *acm) { int i; @@ -248,22 +257,58 @@ void AcmCtrlReqCallback(const void *requestArg) printf("%s:%d entry!", __func__, __LINE__); } +static void AcmParaseInterfaceClass(struct AcmRawDevice *acm, const struct UsbRawInterface *interface, uint8_t number) +{ + uint8_t ifaceClass; + uint8_t numEndpoints; + + ifaceClass = interface->altsetting->interfaceDescriptor.bInterfaceClass; + numEndpoints = interface->altsetting->interfaceDescriptor.bNumEndpoints; + + switch (ifaceClass) { + case USB_DDK_CLASS_COMM: + acm->ctrlIface = number; + /* get the first endpoint by default */ + acm->notifyEp.addr = interface->altsetting->endPoint[0].endpointDescriptor.bEndpointAddress; + acm->notifyEp.interval = interface->altsetting->endPoint[0].endpointDescriptor.bInterval; + acm->notifyEp.maxPacketSize = interface->altsetting->endPoint[0].endpointDescriptor.wMaxPacketSize; + break; + case USB_DDK_CLASS_CDC_DATA: + acm->dataIface = number; + for (uint8_t j = 0; j < numEndpoints; j++) { + const struct UsbRawEndpointDescriptor *endPoint = &interface->altsetting->endPoint[j]; + + /* get bulk in endpoint */ + if ((endPoint->endpointDescriptor.bEndpointAddress + & USB_DDK_ENDPOINT_DIR_MASK) == USB_DDK_DIR_IN) { + acm->dataInEp.addr = endPoint->endpointDescriptor.bEndpointAddress; + acm->dataInEp.interval = endPoint->endpointDescriptor.bInterval; + acm->dataInEp.maxPacketSize = endPoint->endpointDescriptor.wMaxPacketSize; + } else { /* get bulk out endpoint */ + acm->dataOutEp.addr = endPoint->endpointDescriptor.bEndpointAddress; + acm->dataOutEp.interval = endPoint->endpointDescriptor.bInterval; + acm->dataOutEp.maxPacketSize = endPoint->endpointDescriptor.wMaxPacketSize; + } + } + break; + default: + printf("%s:%d wrong descriptor type\n", __func__, __LINE__); + break; + } + +} + int UsbParseConfigDescriptor(struct AcmRawDevice *acm, struct UsbRawConfigDescriptor *config) { uint8_t numInterfaces; uint8_t i; - uint8_t j; int ret; - uint8_t ifaceClass; - uint8_t numEndpoints; const struct UsbRawInterface *interface = NULL; numInterfaces = config->configDescriptor.bNumInterfaces; printf("------numInterfaces = [%d]------\n", numInterfaces); for (i = 0; i < numInterfaces; i++) { interface = config->interface[i]; - ifaceClass = interface->altsetting->interfaceDescriptor.bInterfaceClass; - numEndpoints = interface->altsetting->interfaceDescriptor.bNumEndpoints; printf("------UsbRawClaimInterface start------\n"); ret = UsbRawClaimInterface(acm->devHandle, i); @@ -272,36 +317,7 @@ int UsbParseConfigDescriptor(struct AcmRawDevice *acm, struct UsbRawConfigDescri continue; } printf("------UsbRawClaimInterface end------\n"); - switch (ifaceClass) { - case USB_DDK_CLASS_COMM: - acm->ctrlIface = i; - /* get the first endpoint by default */ - acm->notifyEp.addr = interface->altsetting->endPoint[0].endpointDescriptor.bEndpointAddress; - acm->notifyEp.interval = interface->altsetting->endPoint[0].endpointDescriptor.bInterval; - acm->notifyEp.maxPacketSize = interface->altsetting->endPoint[0].endpointDescriptor.wMaxPacketSize; - break; - case USB_DDK_CLASS_CDC_DATA: - acm->dataIface = i; - for (j = 0; j < numEndpoints; j++) { - const struct UsbRawEndpointDescriptor *endPoint = &interface->altsetting->endPoint[j]; - - /* get bulk in endpoint */ - if ((endPoint->endpointDescriptor.bEndpointAddress - & USB_DDK_ENDPOINT_DIR_MASK) == USB_DDK_DIR_IN) { - acm->dataInEp.addr = endPoint->endpointDescriptor.bEndpointAddress; - acm->dataInEp.interval = endPoint->endpointDescriptor.bInterval; - acm->dataInEp.maxPacketSize = endPoint->endpointDescriptor.wMaxPacketSize; - } else { /* get bulk out endpoint */ - acm->dataOutEp.addr = endPoint->endpointDescriptor.bEndpointAddress; - acm->dataOutEp.interval = endPoint->endpointDescriptor.bInterval; - acm->dataOutEp.maxPacketSize = endPoint->endpointDescriptor.wMaxPacketSize; - } - } - break; - default: - printf("%s:%d wrong descriptor type\n", __func__, __LINE__); - break; - } + AcmParaseInterfaceClass(acm, interface, i); } return HDF_SUCCESS; diff --git a/test/unittest/model/usb/host/src/usb_test.c b/test/unittest/model/usb/host/src/usb_test.c index 68eb621f5..60ffe422c 100755 --- a/test/unittest/model/usb/host/src/usb_test.c +++ b/test/unittest/model/usb/host/src/usb_test.c @@ -21,7 +21,7 @@ #define HDF_LOG_TAG USB_TEST_C static struct UsbSession *g_session = NULL; -static struct AcmDevice g_deviceService; +static struct AcmDevice g_deviceService = {0}; static struct AcmDevice *g_acm = &g_deviceService; static struct UsbInterface *g_ecmDataIface = NULL; static struct UsbInterface *g_ecmIntIface = NULL; @@ -84,28 +84,38 @@ static void AcmWriteIsoCallback(struct UsbRequest *requestArg) printf("%s:%d status:%d\n", __func__, __LINE__, req->compInfo.status); } -static int AcmWriteBufAlloc(struct AcmDevice *acm) +static int AcmWriteBufAllocHandle(struct AcmDevice *acm) { int i; - if (!g_writeBufFlag) { - struct AcmWb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { - wb->buf = (uint8_t *)OsalMemCalloc(acm->writeSize); - if (!wb->buf) { - while (i != 0) { - --i; - --wb; - OsalMemFree(wb->buf); - wb->buf = NULL; - } - return -HDF_ERR_MALLOC_FAIL; + struct AcmWb *wb; + for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { + wb->buf = (uint8_t *)OsalMemCalloc(acm->writeSize); + if (!wb->buf) { + while (i != 0) { + --i; + --wb; + OsalMemFree(wb->buf); + wb->buf = NULL; } - g_writeBufFlag = true; + return -HDF_ERR_MALLOC_FAIL; } + g_writeBufFlag = true; } + return HDF_SUCCESS; } +static int AcmWriteBufAlloc(struct AcmDevice *acm) +{ + int ret = HDF_SUCCESS; + + if (!g_writeBufFlag) { + ret = AcmWriteBufAllocHandle(acm); + } + + return ret; +} + static void AcmWriteBufFree(struct AcmDevice *acm) { int i; @@ -1124,7 +1134,7 @@ static int32_t CheckHostSdkIfFreeRequest006(void) static int32_t CheckHostSdkIfFillIsoRequest001(void) { int ret; - struct UsbRequestParams parmas; + struct UsbRequestParams parmas = {0}; int i; char sendData[] = {"abcde\0"}; uint32_t size = strlen(sendData) + 1; @@ -1378,8 +1388,8 @@ static int32_t CheckHostSdkIfFillRequest001(void) readParmas.requestType = USB_REQUEST_PARAMS_DATA_TYPE; readParmas.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; readParmas.dataReq.numIsoPackets = 0; - readParmas.dataReq.directon = (UsbRequestDirection)(((uint32_t)g_acm->dataInPipe->pipeDirection >> USB_DIR_OFFSET) - & DIRECTION_MASK); + readParmas.dataReq.directon = + (UsbRequestDirection)(((uint32_t)g_acm->dataInPipe->pipeDirection >> USB_DIR_OFFSET) & DIRECTION_MASK); readParmas.dataReq.length = g_acm->readSize; ret = UsbFillRequest(g_acm->readReq[i], g_acm->data_devHandle, &readParmas); if (ret) { @@ -1558,8 +1568,8 @@ static int32_t CheckHostSdkIfFillRequest005(void) readParmas.requestType = USB_REQUEST_PARAMS_DATA_TYPE; readParmas.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; readParmas.dataReq.numIsoPackets = 0; - readParmas.dataReq.directon = (UsbRequestDirection)(((uint32_t)g_acm->dataInPipe->pipeDirection >> USB_DIR_OFFSET) - & DIRECTION_MASK); + readParmas.dataReq.directon = + (UsbRequestDirection)(((uint32_t)g_acm->dataInPipe->pipeDirection >> USB_DIR_OFFSET) & DIRECTION_MASK); readParmas.dataReq.length = g_acm->readSize; ret = UsbFillRequest(g_acm->readReq[i], g_acm->data_devHandle, &readParmas); if (ret) { -- Gitee From 2ac66f540878bb33d5a3f089472264d68649ae22 Mon Sep 17 00:00:00 2001 From: wangchangliang21 Date: Tue, 14 Sep 2021 14:39:18 +0800 Subject: [PATCH 036/272] add hdf util function Signed-off-by: wangchangliang21 --- utils/include/hdf_block_buffer.h | 140 +++++++++++++++++++ utils/include/hdf_blocking_queue.h | 55 ++++++++ utils/include/hdf_object_alloc.h | 42 ++++++ utils/include/hdf_ordered_list.h | 58 ++++++++ utils/src/hdf_block_buffer.c | 214 +++++++++++++++++++++++++++++ utils/src/hdf_blocking_queue.c | 125 +++++++++++++++++ utils/src/hdf_object_alloc.c | 198 ++++++++++++++++++++++++++ utils/src/hdf_ordered_list.c | 122 ++++++++++++++++ 8 files changed, 954 insertions(+) create mode 100644 utils/include/hdf_block_buffer.h create mode 100644 utils/include/hdf_blocking_queue.h create mode 100644 utils/include/hdf_object_alloc.h create mode 100644 utils/include/hdf_ordered_list.h create mode 100644 utils/src/hdf_block_buffer.c create mode 100644 utils/src/hdf_blocking_queue.c create mode 100644 utils/src/hdf_object_alloc.c create mode 100644 utils/src/hdf_ordered_list.c diff --git a/utils/include/hdf_block_buffer.h b/utils/include/hdf_block_buffer.h new file mode 100644 index 000000000..205897e25 --- /dev/null +++ b/utils/include/hdf_block_buffer.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef BLOCK_BUFFER_H +#define BLOCK_BUFFER_H + +#include +#include "hdf_slist.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct HdfBlockBuffer { + struct HdfSList link; + uint16_t position; + uint16_t dataSize; + uint8_t data[1]; +}; + +struct HdfBlockBuffer *HdfBlockBufferNew(uint16_t size); + +void HdfBlockBufferFree(struct BlockBuffer *buffer); + +uint16_t HdfBlockBufferGetDataSize(struct BlockBuffer *buffer); + +uint16_t HdfBlockBufferGetAvailableSize(struct BlockBuffer *buffer); + +uint16_t HdfBlockBufferSkipBytes(struct BlockBuffer *buffer, uint16_t bytes); + +uint8_t *HdfBlockBufferRead(struct BlockBuffer *buffer, uint16_t size); + +/* + * @brief read a byte value from buffer and move cursor to next. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] ulOffset the offset from current cursor. + * + * @return the byte value that read from buffer. + */ +bool HdfBlockBufferGetc(struct BlockBuffer *buffer, uint8_t *outValue); + +/* + * @brief read a byte value from buffer and move cursor to next. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] ulOffset the offset from current cursor. + * + * @return the byte value that read from buffer. + */ +bool HdfBlockBufferReadByteAt(struct BlockBuffer *buffer, uint16_t idx, uint8_t *outValue); + +/* + * @brief read a short value from buffer and move cursor to next. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] ulOffset the offset from current cursor. + * + * @return the short value that read from buffer. + */ +bool HdfBlockBufferReadShort(struct BlockBuffer *buffer, uint16_t *value16); + +/* + * @brief read a short value from buffer and move cursor to next. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] ulOffset the offset from current cursor. + * + * @return the short value that read from buffer. + */ +bool HdfBlockBufferReadShortAt(struct BlockBuffer *buffer, size_t idx, uint16_t *outValue); + +uint8_t *HdfBlockBufferGetData(struct BlockBuffer *buffer); + +/* + * @brief put a short value into buffer order with big endian. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] short_value the short value that insert into buffer.. + * + * @return true if uint8 was write successfully, otherwise false. + */ +bool HdfBlockBufferWriteShort(struct BlockBuffer *buffer, uint16_t shortValue); + +/* + * @brief get buffer space size. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] start the start index of duplicate buffer rang. + * @param[in] end the end index of duplicate buffer rang. + * + * @return the new instance of buff which contain specific packet. + */ +struct HdfBlockBuffer *HdfBlockBufferDuplicate( + struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end); + +/* + * @brief append an byte array packet into buffer. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] data the start address of byte array. + * @param[in] length the length of byte array. + * + * @return void + */ +void HdfBlockBufferRewind(struct HdfBlockBuffer *buffer); + +/* + * @brief put a byte into buffer. + * + * @param[in] buff -the instance of gdk buffer. + * @param[in] value -the byte value that insert into buffer.. + * + * @return true if uint8 was write successfully, otherwise false. + */ +bool HdfBlockBufferPutc(struct HdfBlockBuffer *buffer, uint8_t value); + +/* + * @brief append an byte array packet into buffer. + * + * @param[in] buff the instance of gdk buffer. + * @param[in] data the start address of byte array. + * @param[in] length the length of byte array. + * + * @return true if operation is success, otherwise false. + */ +bool HdfBlockBufferWriteData(struct HdfBlockBuffer *buffer, uint8_t *data, size_t length); + +bool HdfBlockBufferWriteBuff(struct HdfBlockBuffer *dst, struct HdfBlockBuffer *src); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* BLOCK_BUFFER_H */ diff --git a/utils/include/hdf_blocking_queue.h b/utils/include/hdf_blocking_queue.h new file mode 100644 index 000000000..5cfda6ecd --- /dev/null +++ b/utils/include/hdf_blocking_queue.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef BLOCKING_QUEUE_H +#define BLOCKING_QUEUE_H + +#include "hdf_slist.h" +#include "osal_sem.h" +#include "osal_mutex.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct HdfBlockingQueue +{ + struct HdfSList list; + struct OsalSem sem; + struct OsalMutex mutex; +}; + +struct HdfSListEntry +{ + struct HdfSListNode node; + void *data; +}; + +void HdfBlockingQueue_Init(struct HdfBlockingQueue *queue); + +void HdfBlockingQueueDestroy(struct HdfBlockingQueue *queue); + +void HdfBlockingQueueFlush(struct HdfBlockingQueue *queue); + +void *HdfBlockingQueueTake(struct HdfBlockingQueue *queue); + +void *HdfBlockingQueueGet(struct HdfBlockingQueue *queue); + +void HdfBlockingQueueRemove(struct HdfBlockingQueue *queue, void *data); + +void *HdfBlockingQueuePoll(struct HdfBlockingQueue *queue, long timeout); + +void HdfBlockingQueueOffer(struct HdfBlockingQueue *queue, void *val); + +void *HdfBlockingQueueFind(struct HdfBlockingQueue *queue, long match_key, SlList_Comparer comparer); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* BLOCKING_QUEUE_H */ diff --git a/utils/include/hdf_object_alloc.h b/utils/include/hdf_object_alloc.h new file mode 100644 index 000000000..bfc6d6d45 --- /dev/null +++ b/utils/include/hdf_object_alloc.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef OBJECT_ALLOC_H +#define OBJECT_ALLOC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct HdfObjectChunkConfig { + uint32_t chunkSize; + uint32_t chunkCount; +}; + +struct HdfObjectPoolConfig { + char *buffer; + uint32_t bufferSize; + uint32_t numChunks; + const struct HdfObjectChunkConfig *chunks; +}; + +void *HdfObjectAllocAlloc(size_t size); + +void HdfObjectAllocFree(void *object); + +const struct HdfObjectPoolConfig *ObjectAllocGetConfig(void); +void HdfObjectAllocInit(); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* BLOCK_BUFFER_H */ + diff --git a/utils/include/hdf_ordered_list.h b/utils/include/hdf_ordered_list.h new file mode 100644 index 000000000..ffb4ad02d --- /dev/null +++ b/utils/include/hdf_ordered_list.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_ORDERED_LIST_H +#define HDF_ORDERED_LIST_H + +#include "hdf_slist.h" +#include "osal_mutex.h" +#include "osal_sem.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct HdfOrderedList { + struct HdfSList head; + struct OsalSem sem; + struct OsalMutex mutex; +}; + +struct HdfOrderedListEntity { + struct HdfSListNode node; + long key; +}; + +typedef void(*HdfOrderedListEntityDeleter)(struct HdfOrderedListEntity *); + +typedef bool (*HdfOrderedListComparer)(long , void *); + +void HdfOrderedListInit(struct HdfOrderedList *list); + +void HdfOrderedListDestroy(struct HdfOrderedList *list); + +int HdfOrderedListIsEmpty(struct HdfOrderedList *list); + +void HdfOrderedListOffer(struct HdfOrderedList *list, struct HdfOrderedListEntity *newEntity); + +struct HdfOrderedListEntity *HdfOrderedListTake(struct HdfOrderedList *list); + +struct HdfOrderedListEntity *HdfOrderedListFetch( + struct HdfOrderedList *list, long match_key, HdfOrderedListComparer comparer); + +int HdfOrderedListWait(struct HdfOrderedList *list, long timeout); + +long HdfOrderedListPeekKey(struct HdfOrderedList *list); + +void HdfOrderedListFlush(struct HdfOrderedList *list, HdfOrderedListEntityDeleter deleter); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* HDF_ORDERED_LIST_H */ diff --git a/utils/src/hdf_block_buffer.c b/utils/src/hdf_block_buffer.c new file mode 100644 index 000000000..7816114ed --- /dev/null +++ b/utils/src/hdf_block_buffer.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include "hdf_block_buffer.h" +#include "osal_mem.h" +#include "utils.h" + +struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t size) +{ + uint16_t wantedSize; + struct HdfBlockBuffer *buffer = NULL; + if (size == 0) { + return NULL; + } + wantedSize = sizeof(struct HdfBlockBuffer) + size; + buffer = (struct HdfBlockBuffer *)OsalMemAlloc(wantedSize); + if (buffer == NULL) { + return NULL; + } + buffer->dataSize = size; + buffer->position = 0; + if (data != NULL) { + memcpy(buffer->data, data, size); + } + return buffer; +} + +void HdfBlockBufferFree(struct HdfBlockBuffer *buffer) +{ + if (buffer != NULL) { + free(buffer); + } +} + +uint16_t HdfBlockBufferGetDataSize(struct HdfBlockBuffer *buffer) +{ + return (buffer == NULL) ? 0 : buffer->dataSize; +} + +uint16_t HdfBlockBufferGetAvailableSize(struct HdfBlockBuffer *buffer) +{ + return (buffer == NULL) ? 0 : buffer->dataSize - buffer->position; +} + +uint8_t *HdfBlockBufferRead(struct HdfBlockBuffer *buffer, uint16_t size) +{ + uint8_t *dataPtr = NULL; + if ((buffer == NULL) || (buffer->dataSize - buffer->position < size)) { + return NULL; + } + dataPtr = &buffer->data[buffer->position]; + buffer->position += size; + return dataPtr; +} + +uint8_t *HdfBlockBufferGetData(struct HdfBlockBuffer *buffer) +{ + return (buffer == NULL) ? NULL : &buffer->data[0]; +} + +uint16_t HdfBlockBufferGetPoistion(struct HdfBlockBuffer *buffer) +{ + return (buffer == NULL) ? 0 : buffer->position; +} + + +uint16_t HdfBlockBufferSkipBytes(struct HdfBlockBuffer *buffer, uint16_t bytes) +{ + if (buffer == NULL) { + return 0; + } + if (buffer->position + bytes <= buffer->dataSize) { + buffer->position += bytes; + return buffer->dataSize - buffer->position; + } else { + buffer->position = buffer->dataSize; + return 0; + } +} + +bool HdfBlockBufferReadUint8(struct HdfBlockBuffer *buffer, uint8_t *outValue) +{ + if (buffer == NULL) { + return false; + } + if (buffer->position + BYTES_UINT8 <= buffer->dataSize) { + *outValue = buffer->data[buffer->position++]; + return true; + } + return false; +} + +bool HdfBlockBufferReadUint8At(struct HdfBlockBuffer *buffer, uint16_t idx, uint8_t *outValue) +{ + if (buffer == NULL) { + return false; + } + if (idx + BYTES_UINT8 <= buffer->dataSize) { + *outValue = buffer->data[idx]; + return true; + } + return false; +} + +bool HdfBlockBufferReadUint16(struct HdfBlockBuffer *buffer, uint16_t *outValue) +{ + if (buffer == NULL) { + return false; + } + if (buffer->position + BYTES_UINT16 <= buffer->dataSize) { + *outValue = read_be16(buffer->data, buffer->position); + buffer->position += BYTES_UINT16; + return true; + } + return false; +} + +bool HdfBlockBufferReadUint16At(struct HdfBlockBuffer *buffer, size_t idx, uint16_t *outValue) +{ + if (buffer == NULL) { + return false; + } + if (idx + BYTES_UINT16 <= buffer->dataSize) { + *outValue = read_be16(buffer->data, idx); + return true; + } + return false; +} + +void HdfBlockBufferRewind(struct HdfBlockBuffer *buffer) +{ + if (buffer != NULL) { + buffer->position = 0; + } +} + +bool HdfBlockBufferWriteUint8(struct HdfBlockBuffer *buffer, uint8_t value) +{ + if (buffer == NULL) { + return false; + } + if (buffer->position + sizeof(uint8_t) <= buffer->dataSize) { + buffer->data[buffer->position++] = value; + return true; + } + return false; +} + +bool HdfBlockBufferWriteUint16(struct HdfBlockBuffer *buffer, uint16_t in_value) +{ + if (buffer == NULL) { + return false; + } + if (buffer->position + BYTES_UINT16 <= buffer->dataSize) { + buffer->data[buffer->position++] = (uint8_t) (in_value >> 8); + buffer->data[buffer->position++] = (uint8_t) (in_value & 0xFF); + return true; + } + return false; +} + +bool HdfBlockBufferWriteData(struct HdfBlockBuffer *buffer, uint8_t *data, size_t length) +{ + uint16_t residualSize; + if (buffer == NULL) { + return false; + } + residualSize = buffer->dataSize - buffer->position; + if (length > residualSize) { + return false; + } + memcpy(buffer->data + buffer->position, data, length); + buffer->position += length; + return true; +} + +struct HdfBlockBuffer *HdfBlockBufferDuplicate( + struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end) +{ + uint16_t bufferSize = HdfBlockBufferGetDataSize(buffer); + uint16_t newBufferSize; + struct HdfBlockBuffer *newBuffer = NULL; + if ((buffer == NULL) || (start > end)) { + return NULL; + } + if ((end > bufferSize) || (start > bufferSize)) { + return NULL; + } + newBufferSize = end - start + 1; + newBuffer = HdfBlockBufferNew(newBufferSize); + if (newBuffer == NULL) { + return NULL; + } + memcpy(newBuffer->data, buffer->data + start, newBufferSize); + return newBuffer; +} + +bool HdfBlockBufferWriteBuff(struct HdfBlockBuffer *dst, struct HdfBlockBuffer *src) +{ + if (dst->position + src->dataSize <= dst->dataSize) { + memcpy(&dst->data[dst->position], src->data, src->dataSize); + dst->position += src->dataSize; + return true; + } + return false; +} + diff --git a/utils/src/hdf_blocking_queue.c b/utils/src/hdf_blocking_queue.c new file mode 100644 index 000000000..613849e9e --- /dev/null +++ b/utils/src/hdf_blocking_queue.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2021-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "blocking_queue.h" + +void HdfBlockingQueueInit(struct HdfBlockingQueue *queue) +{ + HdfSListInit(&queue->list); + OsalSemInit(&queue->sem); + OsalMutexInit(&queue->mutex); +} + +void HdfBlockingQueueDestroy(struct HdfBlockingQueue *queue) +{ + HdfSListInit(&queue->list); + OsalSemDestroy(&queue->sem); + OsalMutexDestroy(&queue->mutex); +} + +void HdfBlockingQueueFlush(struct HdfBlockingQueue *queue) +{ + OsalMutexLock(&queue->mutex); + HdfSListFlush(&queue->list, HdfSListRemove); + OsalMutexUnlock(&queue->mutex); + OsalSemPost(&queue->sem); +} + +void *HdfBlockingQueueTake(struct HdfBlockingQueue *queue) +{ + void *data = HdfBlockingQueueGet(queue); + if (data == NULL) { + OsalSemWait(&queue->sem, OSAL_WAIT_FOREVER); + data = HdfBlockingQueueGet(queue); + } + return data; +} + +void *HdfBlockingQueueGet(struct HdfBlockingQueue *queue) +{ + void *data = NULL; + struct HdfSListEntry *entry; + OsalMutexLock(&queue->mutex); + entry = (struct HdfSListEntry *)HdfSListPeek(&queue->list); + OsalMutexUnlock(&queue->mutex); + if (entry != NULL) { + data = entry->data; + HdfSListEntryFree(entry); + } + return data; +} + + +void *HdfBlockingQueueFind(struct HdfBlockingQueue *queue, long matchKey, SlList_Comparer comparer) +{ + void *matchData = NULL; + struct HdfSListIterator it; + struct HdfSListEntry *entry = NULL; + if (comparer == NULL) { + return NULL; + } + OsalMutexLock(&queue->mutex); + HdfSListIteratorInit(&it, &queue->list); + while (HdfSListIteratorHasNext(&it)) { + entry = (struct HdfSListEntry *) HdfSListIteratorNext(&it); + if (comparer(matchKey, entry->data)) { + matchData = entry->data; + break; + } + } + OsalMutexUnlock(&queue->mutex); + return matchData; +} + +void HdfBlockingQueueRemove(struct HdfBlockingQueue *queue, void *data) +{ + bool targetListChanged = false; + struct HdfSListIterator it; + struct HdfSListEntry *entry = NULL; + OsalMutexLock(&queue->mutex); + HdfSListIteratorInit(&it, &queue->list); + while (HdfSListIteratorHasNext(&it)) { + entry = (struct HdfSListEntry *)HdfSListIteratorNext(&it); + if (entry->data == data) { + HdfSListIteratorRemove(&it); + HdfSListEntryFree(entry); + targetListChanged = true; + break; + } + } + OsalMutexUnlock(&queue->mutex); + if (targetListChanged) { + OsalSemPost(&queue->sem); + } +} + +void *HdfBlockingQueuePoll(struct HdfBlockingQueue *queue, long timeout) +{ + void *data = HdfBlockingQueueGet(queue); + if (data == NULL) { + OsalSemWait(&queue->sem, timeout); + data = HdfBlockingQueueGet(queue); + } + return data; +} + +int HdfBlockingQueueOffer(struct HdfBlockingQueue *queue, void *val, long timeout) +{ + struct HdfSListEntry *entry = NULL; + if (OsalSemWait(&queue->sem, timeout) != 0) { + return -1; + } + entry = HdfSListEntryNew(val); + if (entry != NULL) { + OsalMutexLock(&queue->mutex); + HdfSListAddTail(&queue->list, &entry->node); + OsalMutexUnlock(&queue->mutex); + } + OsalSemPost(&queue->sem); +} + diff --git a/utils/src/hdf_object_alloc.c b/utils/src/hdf_object_alloc.c new file mode 100644 index 000000000..ba4774c75 --- /dev/null +++ b/utils/src/hdf_object_alloc.c @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include + +#include "hdf_slist.h" +#include "object_alloc.h" +#include "osal_mem.h" +#include "osal_mutex.h" +#include "utils.h" + +struct HdfChunkLink { + uint32_t buffSize; + uint8_t *buffer; +}; + +struct HdfObjectNode { + struct HdfSListNode entry; + uint32_t chunkCount; + uint32_t freeCount; + uint32_t chunkSize; + struct HdfChunkLink **chunkStack; +}; + +struct HdfObjectAlloc { + struct HdfSList nodes; + struct OsalMutex mutex; + bool isConstructed; +}; +static const unsigned int ALIGN_MASK = 3; +#define ALIGN4(x) (uint32_t)(((uintptr_t)(x) + ALIGN_MASK) & (~ALIGN_MASK)) + +#define OBJECT_NODE_SIZE sizeof(struct ObjectNode) +#define OBJECT_CHUNK_COOKIE_SIZE (sizeof(struct ChunkLink) + sizeof(void *)) + +void HdfObjectAllocConstruct(struct HdfObjectAlloc *alloc) +{ + HdfSListInit(&alloc->nodes); + OsalMutexInit(&alloc->mutex); + alloc->isConstructed = true; +} +struct HdfObjectAlloc *HdfObjectAllocGetInstance() +{ + static struct HdfObjectAlloc instance = { 0 }; + + if (!instance.isConstructed) { + HdfObjectAllocConstruct(&instance); + } + + return &instance; +} + +struct HdfObjectNode *HdfObjectAllocFindSuitableChunk( + struct HdfObjectAlloc *alloc, size_t size) +{ + struct HdfSListIterator it; + struct HdfObjectNode *bestFitNode = NULL; + struct HdfObjectNode *objectNode = NULL; + HdfSListIteratorInit(&it, &alloc->nodes); + + while (HdfSListIteratorHasNext(&it)) { + objectNode = (struct HdfObjectNode *)HdfSListIteratorNext(&it); + + if (size == objectNode->chunkSize) { + bestFitNode = objectNode; + break; + } else if (size < objectNode->chunkSize) { + bestFitNode = objectNode; + } + } + + return bestFitNode; +} + +static void HdfObjectAllocPushObjectNode( + struct HdfObjectAlloc *alloc, struct HdfObjectNode *node) +{ + struct HdfSListIterator it; + struct HdfObjectNode *objectNode = NULL; + HdfSListIteratorInit(&it, &alloc->nodes); + + while (HdfSListIteratorHasNext(&it)) { + objectNode = (struct HdfObjectNode *)HdfSListIteratorNext(&it); + + if (node->chunkSize >= objectNode->chunkSize) { + break; + } + } + + HdfSListIteratorInsert(&it, &node->entry); +} + +static void HdfObjectAllocPreloadChunk( + void *chunkBuf, uint32_t buffSize, uint32_t chunkSize) +{ + struct HdfObjectAlloc *allocator = HdfObjectAllocGetInstance(); + + if (buffSize > OBJECT_NODE_SIZE) { + uint32_t idx; + struct ChunkLink *chunkLink; + struct ObjectNode *node; + uint32_t alignedSize = ALIGN4(chunkSize); + uint32_t alignedBufSize = ALIGN4(buffSize); + uint32_t blockSize = alignedSize + sizeof(struct ChunkLink); + uint8_t *alignedBuff = (uint8_t *)(uintptr_t)ALIGN4(chunkBuf); + node = (struct ObjectNode *)(alignedBuff + alignedBufSize - OBJECT_NODE_SIZE); + node->freeCount = 0; + node->chunkSize = alignedSize; + node->chunkCount = ((uint8_t *)node - alignedBuff) / (blockSize + sizeof(void *)); + node->chunkStack = (struct ChunkLink **)(alignedBuff + node->chunkCount * blockSize); + + for (idx = 0; idx < node->chunkCount; idx++) { + chunkLink = (struct ChunkLink *)&alignedBuff[idx * blockSize]; + chunkLink->buffSize = node->chunkSize; + node->chunkStack[node->freeCount++] = chunkLink; + chunkLink->buffer = (uint8_t *)(chunkLink + 1); + } + + HdfObjectAllocPushObjectNode(allocator, node); + } +} + +void HdfObjectAllocLoadConfigs(const struct HdfObjectPoolConfig *configs) +{ + uint32_t idx = 0; + char *chunkBuffBegin = configs->buffer; + char *chunkBuffEnd = configs->buffer + configs->bufferSize; + + for (idx = 0; (idx < configs->numChunks) && (chunkBuffBegin < chunkBuffEnd); idx++) { + const struct ObjectChunkConfig *chunkConfig = &configs->chunks[idx]; + size_t chunkBufSize = OBJECT_NODE_SIZE + \ + (OBJECT_CHUNK_COOKIE_SIZE + chunkConfig->chunkSize) * chunkConfig->chunkCount; + + if (chunkBuffBegin + chunkBufSize <= chunkBuffEnd) { + HdfObjectAllocPreloadChunk(chunkBuffBegin, chunkBufSize, chunkConfig->chunkSize); + } + + chunkBuffBegin += chunkBufSize; + } +} + +void HdfObjectAllocInit() +{ + const struct HdfObjectPoolConfig *config = HdfObjectAllocGetConfig(); + + if (config != NULL) { + HdfObjectAllocLoadConfigs(config); + } +} + +void *HdfObjectAllocAlloc(size_t size) +{ + struct HdfChunkLink *chunkLink = NULL; + struct HdfObjectNode *objectNode = NULL; + struct HdfObjectAlloc *allocator = HdfObjectAllocGetInstance(); + OsalMutexLock(&allocator->mutex); + objectNode = HdfObjectAllocFindSuitableChunk(allocator, size); + + if ((objectNode != NULL) && (objectNode->freeCount == 0)) { + goto finished; + } + + if (objectNode->freeCount > objectNode->chunkCount) { + if (objectNode->freeCount > objectNode->chunkCount) { + } + } + + chunkLink = (struct ChunkLink *)objectNode->chunkStack[--objectNode->freeCount]; +finished: + OsalMutexUnlock(&allocator->mutex); + return chunkLink ? chunkLink->buffer : NULL; +} + +void HdfObjectAllocFree(void *object) +{ + struct HdfChunkLink *chunkLink = container_of(void, object, struct ChunkLink, buffer); + struct HdfObjectNode *objectNode = NULL; + struct HdfObjectAlloc *allocator = HdfObjectAllocGetInstance(); + OsalMutexLock(&allocator->mutex); + objectNode = HdfObjectAllocFindSuitableChunk(allocator, chunkLink->buffSize); + + if (objectNode != NULL) { + objectNode->chunkStack[objectNode->freeCount++] = chunkLink; + + if (objectNode->freeCount > objectNode->chunkCount) { + HDF_LOGE("exception: count,free:%d,total %d", objectNode->freeCount, objectNode->chunkCount); + } + } + + OsalMutexUnlock(&allocator->mutex); +} + diff --git a/utils/src/hdf_ordered_list.c b/utils/src/hdf_ordered_list.c new file mode 100644 index 000000000..a3cc2e2b9 --- /dev/null +++ b/utils/src/hdf_ordered_list.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "osal_mem.h" +#include "hdf_ordered_list.h" + +void HdfOrderedListInit(struct HdfOrderedList *list) +{ + OsalMutexInit(&list->mutex); + OsalSemInit(&list->sem); + HdfSListInit(&list->head); +} + +void HdfOrderedListDestroy(struct HdfOrderedList *list) +{ + HdfSListInit(&list->head); + OsalSemDestroy(&list->sem); + OsalMutexDestroy(&list->mutex); +} + +int HdfOrderedListIsEmpty(struct HdfOrderedList *list) +{ + return HdfSListIsEmpty(&list->head); +} + +void HdfOrderedListOffer(struct HdfOrderedList *list, struct HdfOrderedListEntity *newEntity) +{ + struct HdfSListIterator it; + struct HdfOrderedListEntity *matchEntity; + if ((list == NULL) || (newEntity == NULL)) { + return; + } + OsalMutexLock(&list->mutex); + if (HdfSListIsEmpty(&list->head)) { + HdfSListAdd(&list->head, &newEntity->node); + goto finished; + } + HdfSListIteratorInit(&it, &list->head); + while (HdfSListIteratorHasNext(&it)) { + matchEntity = (struct HdfOrderedListEntity *)HdfSListIteratorNext(&it); + if (newEntity->key > matchEntity->key) { + HdfSListIteratorInsert(&it, &newEntity->node); + break; + } + } +finished: + OsalMutexUnlock(&list->mutex); + OsalSemPost(&list->sem); +} + +struct HdfOrderedListEntity *HdfOrderedListGet(struct HdfOrderedList *list) +{ + struct HdfOrderedListEntity *entity; + OsalMutexLock(&list->mutex); + entity = (struct HdfOrderedListEntity *)HdfSListPeek(&list->head); + OsalMutexUnlock(&list->mutex); + return entity; +} + +struct HdfOrderedListEntity *HdfOrderedListTake(struct HdfOrderedList *list) +{ + struct HdfOrderedListEntity *entity = HdfOrderedListGet(list); + while (entity == NULL) { + OsalSemWait(&list->sem, OSAL_WAIT_FOREVER); + entity = HdfOrderedListGet(list); + } + return entity; +} + +long HdfOrderedListPeekKey(struct HdfOrderedList *list) +{ + long orderedKey = 0; + struct HdfOrderedListEntity *firstEntity; + OsalMutexLock(&list->mutex); + firstEntity = (struct HdfOrderedListEntity *)HdfSListPeek(&list->head); + if (firstEntity != NULL) { + orderedKey = firstEntity->key; + } + OsalMutexUnlock(&list->mutex); + return orderedKey; +} + +struct HdfOrderedListEntity *HdfOrderedListFetch( + struct HdfOrderedList *list, long matchKey, HdfOrderedListComparer comparer) +{ + struct HdfSListIterator it; + struct HdfOrderedListEntity *matchEntity = NULL; + if (comparer == NULL) { + return matchEntity; + } + OsalMutexLock(&list->mutex); + HdfSListIteratorInit(&it, &list->head); + while (HdfSListIteratorHasNext(&it)) { + struct OrderedListEntity *searchEntity = + (struct OrderedListEntity *)HdfSListIteratorNext(&it); + if (comparer(matchKey, searchEntity)) { + HdfSListIteratorRemove(&it); + matchEntity = searchEntity; + break; + } + } + OsalMutexUnlock(&list->mutex); + return matchEntity; +} + +void HdfOrderedListFlush(struct HdfOrderedList *list, HdfOrderedListEntityDeleter deleter) +{ + OsalMutexLock(&list->mutex); + HdfSListFlush(&list->head, (HdfSListDeleter)deleter); + OsalMutexUnlock(&list->mutex); + OsalSemPost(&list->sem); +} + +int HdfOrderedListWait(struct HdfOrderedList *list, long timeout) +{ + OsalSemWait(&list->sem, timeout); +} -- Gitee From e29b45b518a2d53a522286ef733984ed07a41d3b Mon Sep 17 00:00:00 2001 From: kevin Date: Thu, 16 Sep 2021 12:15:43 +0800 Subject: [PATCH 037/272] modify sensor warning Signed-off-by: kevin Change-Id: I546d0af4398c120853cc2ef2ff8fe8931d21262f --- model/sensor/driver/als/sensor_als_driver.h | 1 - model/sensor/driver/barometer/sensor_barometer_driver.h | 3 +-- model/sensor/driver/hall/sensor_hall_driver.c | 3 +-- model/sensor/driver/magnetic/sensor_magnetic_driver.h | 3 +-- model/sensor/driver/proximity/sensor_proximity_driver.h | 1 - test/unittest/common/hdf_main_test.c | 2 +- 6 files changed, 4 insertions(+), 9 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.h b/model/sensor/driver/als/sensor_als_driver.h index dcf40d75c..3ca5d7d37 100755 --- a/model/sensor/driver/als/sensor_als_driver.h +++ b/model/sensor/driver/als/sensor_als_driver.h @@ -10,7 +10,6 @@ #define SENSOR_ALS_DRIVER_H #include "hdf_workqueue.h" -#include "osal_mutex.h" #include "osal_timer.h" #include "sensor_config_parser.h" #include "sensor_platform_if.h" diff --git a/model/sensor/driver/barometer/sensor_barometer_driver.h b/model/sensor/driver/barometer/sensor_barometer_driver.h index 0888955f0..37ce1314a 100644 --- a/model/sensor/driver/barometer/sensor_barometer_driver.h +++ b/model/sensor/driver/barometer/sensor_barometer_driver.h @@ -10,7 +10,6 @@ #define SENSOR_BAROMETER_DRIVER_H #include "hdf_workqueue.h" -#include "osal_mutex.h" #include "osal_timer.h" #include "sensor_config_parser.h" #include "sensor_platform_if.h" @@ -117,4 +116,4 @@ int32_t BarometerRegisterChipOps(const struct BarometerOpsCall *ops); struct SensorCfgData *BarometerCreateCfgData(const struct DeviceResourceNode *node); void BarometerReleaseCfgData(struct SensorCfgData *sensorCfgData); -#endif /* SENSOR_BAROMETER_DRIVER_H */ \ No newline at end of file +#endif /* SENSOR_BAROMETER_DRIVER_H */ diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index f8383e40a..354eb9e4d 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -13,7 +13,6 @@ #include "hdf_base.h" #include "hdf_device_desc.h" #include "osal_irq.h" -#include "osal_math.h" #include "osal_mem.h" #include "sensor_config_controller.h" #include "sensor_device_manager.h" @@ -425,4 +424,4 @@ struct HdfDriverEntry g_sensorHallDevEntry = { .Release = HallReleaseDriver, }; -HDF_INIT(g_sensorHallDevEntry); \ No newline at end of file +HDF_INIT(g_sensorHallDevEntry); diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.h b/model/sensor/driver/magnetic/sensor_magnetic_driver.h index 7b51d1914..14b836e09 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.h +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.h @@ -10,7 +10,6 @@ #define SENSOR_MAGNETIC_DRIVER_H #include "hdf_workqueue.h" -#include "osal_mutex.h" #include "osal_timer.h" #include "sensor_config_parser.h" #include "sensor_platform_if.h" @@ -63,4 +62,4 @@ int32_t MagneticRegisterChipOps(const struct MagneticOpsCall *ops); struct SensorCfgData *MagneticCreateCfgData(const struct DeviceResourceNode *node); void MagneticReleaseCfgData(struct SensorCfgData *sensorCfgData); -#endif /* SENSOR_MAGNETIC_DRIVER_H */ \ No newline at end of file +#endif /* SENSOR_MAGNETIC_DRIVER_H */ diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.h b/model/sensor/driver/proximity/sensor_proximity_driver.h index 50d83d42c..cbd8b5c52 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.h +++ b/model/sensor/driver/proximity/sensor_proximity_driver.h @@ -10,7 +10,6 @@ #define SENSOR_PROXIMITY_DRIVER_H #include "hdf_workqueue.h" -#include "osal_mutex.h" #include "osal_timer.h" #include "sensor_config_parser.h" #include "sensor_platform_if.h" diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 75ae6386a..19911d9f7 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -77,7 +77,7 @@ HdfTestFuncList g_hdfTestFuncList[] = { { TEST_PAL_I2C_TYPE, HdfI2cTestEntry }, #endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I2S) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I2S) - { TEST_PAL_I2S_TYPE, HdfI2sUnitTestEntry }, + { TEST_PAL_I2S_TYPE, HdfI2sUnitTestEntry }, #endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) { TEST_PAL_ADC_TYPE, HdfAdcTestEntry }, -- Gitee From 7e828bfea89f1a227d2cbb901a0b9d378cb2c301 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 16 Sep 2021 07:14:53 +0000 Subject: [PATCH 038/272] solve the warning Signed-off-by: YOUR_NAME --- model/display/driver/backlight/hdf_bl.c | 1 - model/display/driver/hdf_disp.c | 21 ++++++++++++++++----- model/display/driver/hdf_disp.h | 1 - model/display/driver/panel/ili9881c_boe.c | 1 + model/display/driver/panel/mipi_icn9700.c | 1 + 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/model/display/driver/backlight/hdf_bl.c b/model/display/driver/backlight/hdf_bl.c index 1f0743961..8caa4f59b 100644 --- a/model/display/driver/backlight/hdf_bl.c +++ b/model/display/driver/backlight/hdf_bl.c @@ -9,7 +9,6 @@ #include "hdf_bl.h" #include #include "hdf_base.h" -#include "hdf_disp.h" #include "hdf_log.h" #include "osal.h" diff --git a/model/display/driver/hdf_disp.c b/model/display/driver/hdf_disp.c index 4cf12379c..902b3b269 100644 --- a/model/display/driver/hdf_disp.c +++ b/model/display/driver/hdf_disp.c @@ -9,6 +9,7 @@ #include "hdf_disp.h" #include #include "hdf_base.h" +#include "hdf_bl.h" #include "hdf_log.h" #include "osal.h" @@ -172,7 +173,7 @@ static int32_t SetDispPower(uint32_t devId, uint32_t powerStatus) OsalMutexLock(&disp->dispMutex); if (panel->powerStatus == powerStatus) { OsalMutexUnlock(&disp->dispMutex); - HDF_LOGE("%s:devId[%d] already in mode = %d", __func__, devId, powerStatus); + HDF_LOGE("%s: panel already in mode = %d", __func__, powerStatus); return HDF_SUCCESS; } switch (powerStatus) { @@ -394,6 +395,10 @@ static void EsdTimerHandler(uintptr_t arg) struct DispManager *disp = NULL; disp = GetDispManager(); + if ((disp == NULL) || (disp->esd == NULL)) { + HDF_LOGE("%s: disp or esd is null", __func__); + return; + } if (devId >= disp->esd->panelNum) { HDF_LOGE("%s: esd is null", __func__); return; @@ -410,14 +415,20 @@ static void EsdWorkHandler(void *arg) struct DispManager *disp = NULL; disp = GetDispManager(); + if ((disp == NULL) || (disp->panelManager == NULL)) { + HDF_LOGE("%s: disp or panelManager is null", __func__); + return; + } if (devId >= disp->panelManager->panelNum) { HDF_LOGE("%s: dispCtrl is null or panel is null", __func__); return; } panel = disp->panelManager->panel[devId]; - if ((panel->esd != NULL) && (panel->esd->checkFunc != NULL)) { - ret = panel->esd->checkFunc(panel); + if ((panel->esd == NULL) || (panel->esd->checkFunc == NULL)) { + HDF_LOGE("%s: esd or checkFunc is null", __func__); + return; } + ret = panel->esd->checkFunc(panel); if (ret != HDF_SUCCESS) { OsalMutexLock(&disp->dispMutex); if (panel->esd->state == ESD_RUNNING) { @@ -460,7 +471,7 @@ static void EsdCheckStartUp(struct DispEsd *esd, uint32_t devId) EsdTimerHandler, (uintptr_t)devId); OsalTimerStartLoop(esd->timer[devId]); esd->panelEsd[devId]->state = ESD_RUNNING; - HDF_LOGI("%s devId[%d] enable esd check", __func__, devId); + HDF_LOGI("%s panel enable esd check", __func__); } } } @@ -477,7 +488,7 @@ static void EsdCheckEnd(struct DispEsd *esd, uint32_t devId) if (esd->panelEsd[devId]->state == ESD_RUNNING) { OsalTimerDelete(esd->timer[devId]); esd->panelEsd[devId]->state = ESD_READY; - HDF_LOGI("%s devId[%d], disable esd check", __func__, devId); + HDF_LOGI("%s panel disable esd check", __func__); } } } diff --git a/model/display/driver/hdf_disp.h b/model/display/driver/hdf_disp.h index d9c6d9de1..8f497d596 100644 --- a/model/display/driver/hdf_disp.h +++ b/model/display/driver/hdf_disp.h @@ -10,7 +10,6 @@ #define HDF_DISP_H #include "hdf_base.h" -#include "hdf_bl.h" #include "hdf_device_desc.h" #include "hdf_log.h" #include "hdf_sbuf.h" diff --git a/model/display/driver/panel/ili9881c_boe.c b/model/display/driver/panel/ili9881c_boe.c index 96945d70f..00a8e4788 100644 --- a/model/display/driver/panel/ili9881c_boe.c +++ b/model/display/driver/panel/ili9881c_boe.c @@ -8,6 +8,7 @@ #include "ili9881c_boe.h" #include "gpio_if.h" +#include "hdf_bl.h" #include "hdf_disp.h" #include "osal.h" diff --git a/model/display/driver/panel/mipi_icn9700.c b/model/display/driver/panel/mipi_icn9700.c index f26994b8f..99c1d49d5 100644 --- a/model/display/driver/panel/mipi_icn9700.c +++ b/model/display/driver/panel/mipi_icn9700.c @@ -7,6 +7,7 @@ */ #include "gpio_if.h" +#include "hdf_bl.h" #include "hdf_disp.h" #include "hdf_log.h" #include "mipi_dsi_if.h" -- Gitee From 979408518b288a51105842017b026ccc6e9ec967 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Thu, 16 Sep 2021 17:33:03 +0800 Subject: [PATCH 039/272] enable kernel build with external obj output Signed-off-by: yuanbo --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index d1606884f..48fd83b28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1 @@ -*.o -*.a -*.d -*.cmd tools/hc-gen/build -- Gitee From 2b9996aa506b8c575718171f90994aa96fb55b83 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 16 Sep 2021 11:20:11 +0000 Subject: [PATCH 040/272] solve the codex warning Signed-off-by: YOUR_NAME --- model/display/driver/hdf_disp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/display/driver/hdf_disp.c b/model/display/driver/hdf_disp.c index 902b3b269..793ff99b7 100644 --- a/model/display/driver/hdf_disp.c +++ b/model/display/driver/hdf_disp.c @@ -441,7 +441,7 @@ static void EsdWorkHandler(void *arg) OsalMutexUnlock(&disp->dispMutex); panel->esd->recoveryNum++; } - HDF_LOGD("%s devId[%d] recoveryNum = %d", __func__, devId, panel->esd->recoveryNum); + HDF_LOGD("%s recoveryNum = %d", __func__, panel->esd->recoveryNum); if (panel->esd->recoveryNum >= ESD_MAX_RECOVERY) { panel->esd->recoveryNum = 0; OsalMutexLock(&disp->dispMutex); -- Gitee From d6312e1a6df133f8df3a1c76fc946e2b2474b0d8 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Wed, 15 Sep 2021 14:47:39 +0800 Subject: [PATCH 041/272] Source dir adjustment and comments completion Signed-off-by: haizhouyang --- model/storage/include/common/storage.h | 34 --- model/storage/include/common/storage_block.h | 77 ----- model/storage/include/mmc/mmc_block.h | 113 ++++++++ model/storage/include/mtd/mtd_block.h | 45 ++- model/storage/include/mtd/mtd_char.h | 41 ++- model/storage/include/mtd/mtd_core.h | 287 +++++++++++++++++-- model/storage/include/mtd/mtd_nand.h | 12 + model/storage/include/mtd/mtd_spi_common.h | 99 ++++++- model/storage/include/mtd/mtd_spi_nand.h | 4 + model/storage/include/mtd/mtd_spi_nor.h | 4 + model/storage/src/common/storage_block.c | 132 --------- model/storage/src/mmc/mmc_block.c | 70 +++++ model/storage/src/mtd/mtd_block.c | 26 +- model/storage/src/mtd/mtd_core.c | 23 +- model/storage/src/mtd/mtd_spi_common.c | 3 +- support/platform/include/mmc/mmc_block.h | 29 -- support/platform/include/mmc/mmc_corex.h | 2 +- support/platform/src/mmc/mmc_block.c | 166 ----------- support/platform/src/mmc/mmc_core.c | 4 +- 19 files changed, 690 insertions(+), 481 deletions(-) delete mode 100644 model/storage/include/common/storage.h delete mode 100644 model/storage/include/common/storage_block.h create mode 100644 model/storage/include/mmc/mmc_block.h delete mode 100644 model/storage/src/common/storage_block.c create mode 100644 model/storage/src/mmc/mmc_block.c delete mode 100644 support/platform/include/mmc/mmc_block.h delete mode 100644 support/platform/src/mmc/mmc_block.c diff --git a/model/storage/include/common/storage.h b/model/storage/include/common/storage.h deleted file mode 100644 index d85a4a259..000000000 --- a/model/storage/include/common/storage.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef STORAGE_H -#define STORAGE_H - -#include "hdf_base.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#define STORAGE_MAX_BYTES ((size_t)(-1)) - -enum StorageType { - MEDIA_MMC = 0, - MEDIA_MTD = 1, - MEDIA_ERR = 2, -}; - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* STORAGE_H */ diff --git a/model/storage/include/common/storage_block.h b/model/storage/include/common/storage_block.h deleted file mode 100644 index 726c84d13..000000000 --- a/model/storage/include/common/storage_block.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef STORAGE_BLOCK_H -#define STORAGE_BLOCK_H - -#include "storage.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#define STORAGE_SEC_SIZE 512 -#define STORAGE_SEC_SHIFT 9 -#define STORAGE_MAX_SEC_NR (STORAGE_MAX_BYTES >> STORAGE_SEC_SHIFT) - -#define STORAGE_SEC_PARAM_INVALID(s, n) \ - (s >= STORAGE_MAX_SEC_NR || \ - n >= STORAGE_MAX_SEC_NR || \ - (STORAGE_MAX_SEC_NR - n) <= s) - -#define BLOCK_NAME_LEN 32 - -struct StorageBlock { - char name[BLOCK_NAME_LEN]; /* name of the block device */ - int32_t index; - enum StorageType type; /* indicate which type of media is used */ - bool removeable; - void *media; /* media device of the block */ - size_t capacity; /* sized by sector */ - size_t secSize; /* sized by bytes */ - uint32_t errCnt; /* err count on io transfer */ - struct StorageBlockMethod *ops; /* storage oparations provided by specific media */ - void *bops; /* block operations of specific os */ -}; - -struct StorageBlockMethod { - ssize_t (*read)(struct StorageBlock *sb, uint8_t *buf, size_t secStart, size_t secNr); - ssize_t (*write)(struct StorageBlock *sb, const uint8_t *buf, size_t secStart, size_t secNr); - ssize_t (*erase)(struct StorageBlock *sb, size_t secStart, size_t secNr); - size_t (*getCapacity)(struct StorageBlock *sb); - bool (*isPresent)(struct StorageBlock *sb); - uint32_t (*getAuSize)(struct StorageBlock *sb); -}; - -ssize_t StorageBlockRead(struct StorageBlock *sb, uint8_t *buf, size_t secStart, size_t secNr); -ssize_t StorageBlockWrite(struct StorageBlock *sb, const uint8_t *buf, size_t secStart, size_t secNr); -ssize_t StorageBlockErase(struct StorageBlock *sb, size_t secStart, size_t secNr); -size_t StorageBlockGetCapacity(struct StorageBlock *sb); -bool StorageBlockIsPresent(struct StorageBlock *sb); -int32_t StorageBlockGetAuSize(struct StorageBlock *sb, uint32_t *auSize); - -int32_t StorageBlockAdd(struct StorageBlock *sb); -void StorageBlockDel(struct StorageBlock *sb); - -/* these two functions gona implemented by specific os */ -int32_t StorageBlockOsInit(struct StorageBlock *sb); -void StorageBlockOsUninit(struct StorageBlock *sb); - -ssize_t StorageBlockMmcErase(uint32_t blockId, size_t secStart, size_t secNr); -struct StorageBlock *StorageBlockFromNumber(uint32_t number); - - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* STORAGE_BLOCK_H */ diff --git a/model/storage/include/mmc/mmc_block.h b/model/storage/include/mmc/mmc_block.h new file mode 100644 index 000000000..a1c91c16f --- /dev/null +++ b/model/storage/include/mmc/mmc_block.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MMC_BLOCK_H +#define MMC_BLOCK_H + +#include "mmc_corex.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @Defines the default mmc sector size + * + */ +#define MMC_SEC_SIZE 512 + +/** + * @Defines the default mmc sector size shift + * + */ +#define MMC_SEC_SHIFT 9 + +/** + * @Defines the help macro for getting sector number + * + */ +#define MMC_MAX_SEC_NR (MMC_MAX_BYTES >> MMC_SEC_SHIFT) + +#define MMC_SEC_PARAM_INVALID(s, n) \ + (s >= MMC_MAX_SEC_NR || \ + n >= MMC_MAX_SEC_NR || \ + (MMC_MAX_SEC_NR - n) <= s) + +/** + * @Defines the max length of mmc block device name + * + */ +#define MMC_BLOCK_NAME_LEN 32 + +/** + * @Defines the structure used to identify a general block device. + * + */ +struct MmcBlock { + char name[MMC_BLOCK_NAME_LEN]; /* name of the block device */ + int32_t index; + bool removeable; + size_t capacity; /* sized by sector */ + size_t secSize; /* sized by bytes */ + uint32_t errCnt; /* err count on io transfer */ + void *bops; /* block operations of specific os */ + void *osData; /* os specific data */ + struct MmcDevice *mmc; +}; + +/** + * @brief Block device init for the mmc device. + * + * This function behaves differently in different OS + * + * @param mmcDevice Indicates the pointer to the mmc device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ +int32_t MmcBlockInit(struct MmcDevice *mmcDevice); + +/** + * @brief Block device uninit for the mmc device. + * + * This function behaves differently in different OS + * + * @param mmcDevice Indicates the pointer to the mmc device. + * + */ +void MmcBlockUninit(struct MmcDevice *mmcDevice); + +/** + * @brief Block device init for the mmc device in specific os. + * + * These function gona be implemented by specific os + * + * @param mmcDevice Indicates the pointer to the mmc device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ +int32_t MmcBlockOsInit(struct MmcDevice *mmcDevice); + +/** + * @brief Block device uninit for the mmc device in specific os. + * + * These function gona be implemented by specific os + * + * @param mmcDevice Indicates the pointer to the mmc device. + * + */ +void MmcBlockOsUninit(struct MmcDevice *mmcDevice); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* MMC_BLOCK_H */ diff --git a/model/storage/include/mtd/mtd_block.h b/model/storage/include/mtd/mtd_block.h index c1dc005ac..9d82c4db0 100644 --- a/model/storage/include/mtd/mtd_block.h +++ b/model/storage/include/mtd/mtd_block.h @@ -17,12 +17,47 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t MtdBlockInit(struct MtdDevice *mtd); -void MtdBlockUninit(struct MtdDevice *mtd); +/** + * @brief Block device init for the mtd device. + * + * This function behaves differently in different OS + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ +int32_t MtdBlockInit(struct MtdDevice *mtdDevice); + +/** + * @brief Block device uninit for the mtd device. + * + * This function behaves differently in different OS + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + */ +void MtdBlockUninit(struct MtdDevice *mtdDevice); -/* these too functions gona implemented by specific os */ -extern int32_t MtdBlockOsInit(struct MtdDevice *mtd); -extern void MtdBlockOsUninit(struct MtdDevice *mtd); +/** + * @brief Block device init for the mtd device in specific os. + * + * These function gona be implemented by specific os + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ +int32_t MtdBlockOsInit(struct MtdDevice *mtd); + +/** + * @brief Block device uninit for the mtd device in specific os. + * + * These function gona be implemented by specific os + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + */ +void MtdBlockOsUninit(struct MtdDevice *mtd); #ifdef __cplusplus #if __cplusplus diff --git a/model/storage/include/mtd/mtd_char.h b/model/storage/include/mtd/mtd_char.h index 3d32a2736..80b8ff4ff 100644 --- a/model/storage/include/mtd/mtd_char.h +++ b/model/storage/include/mtd/mtd_char.h @@ -19,12 +19,47 @@ extern "C" { #define CHAR_NAME_LEN 32 +/** + * @brief Char device init for the mtd device. + * + * This function behaves differently in different OS + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ int32_t MtdCharInit(struct MtdDevice *mtdDevice); + +/** + * @brief Char device uninit for the mtd device. + * + * This function behaves differently in different OS + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + */ void MtdCharUninit(struct MtdDevice *mtdDevice); -/* these too functions gona implemented by specific os */ -extern int32_t MtdCharOsInit(struct MtdDevice *mtdDevice); -extern void MtdCharOsUninit(struct MtdDevice *mtdDevice); +/** + * @brief Char device init for the mtd device in specific OS. + * + * These function gona be implemented by specific os + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 if init successfully; returns a negative value otherwise. + */ +int32_t MtdCharOsInit(struct MtdDevice *mtdDevice); + +/** + * @brief Char device uninit for the mtd device in specific OS. + * + * These function gona be implemented by specific os + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + */ +void MtdCharOsUninit(struct MtdDevice *mtdDevice); #ifdef __cplusplus #if __cplusplus diff --git a/model/storage/include/mtd/mtd_core.h b/model/storage/include/mtd/mtd_core.h index 4b1f31190..0e449b70f 100644 --- a/model/storage/include/mtd/mtd_core.h +++ b/model/storage/include/mtd/mtd_core.h @@ -13,15 +13,20 @@ #include "hdf_base.h" #include "osal_mutex.h" -#include "platform_device.h" +#include "platform_core.h" #define MTD_FLASH_ID_LEN_MAX 8 +#define MTD_DEVICE_NUM_MAX 3 // #define MTD_DEBUG /* open this macro for debug */ struct MtdDevice; struct MtdDeviceMethod; +/** + * @brief Enumerates the types of mtd devices. + * + */ enum MtdDevType { MTD_TYPE_NOR, MTD_TYPE_NAND, @@ -30,32 +35,68 @@ enum MtdDevType { MTD_TYPE_MAX, }; +/** + * @brief Enumerates the types of mtd message. + * + */ enum MtdMsgType { MTD_MSG_TYPE_WRITE, MTD_MSG_TYPE_READ, MTD_MSG_TYPE_ERASE, }; +/** + * @Defines the mtd request message used during request. + * + * This struct describes a custom access request typed by MtdMsgType + * + */ struct MtdMsg { + /** Type of the mtd message */ enum MtdMsgType type; + /** Start address of the mtd device to access */ off_t addr; + /** Indicates the failed address if request failed */ off_t faddr; + /** Pointer to the buffer for storing request data */ uint8_t *buf; + /** Length of the data */ size_t len; + /** Indicates whether request with oob data */ bool withOob; + /** Indicates whether skip on bad block */ bool skipBad; }; +/** + * @Defines the mtd page struct used during page transfer. + * + * This struct describes a page transfer request typed by MtdMsgType + * + */ struct MtdPage { + /** Page transfer type */ enum MtdMsgType type; + /** Start address of the mtd device to transfer from */ off_t addr; + /** Indicates the failed address if transfer failed */ off_t failAddr; + /** Pointer to the data buffer */ uint8_t *dataBuf; + /** Length of the data */ size_t dataLen; + /** Pointer to the oob data buffer */ uint8_t *oobBuf; + /** Length of the oob data */ size_t oobLen; }; +/** + * @Defines the callback method set of a mtd device. + * + * The methods defined in this struct expected to be implemented by drivers + * + */ struct MtdDeviceMethod { int32_t (*read)(struct MtdDevice *mtdDevice, off_t from, size_t len, uint8_t *buf); int32_t (*write)(struct MtdDevice *mtdDevice, off_t to, size_t len, const uint8_t *buf); @@ -68,58 +109,244 @@ struct MtdDeviceMethod { void (*unlock)(struct MtdDevice *mtdDevice); }; +/** + * @Defines the structure used to identify a physical mtd chip. + * + */ struct MtdDevice { + /** The parent device */ struct PlatformDevice device; + /** Number of the mtd device */ int16_t index; + /** Name of the mtd device */ const char *name; + /** Chip name of the mtd device */ const char *chipName; + /** Type of the mtd device */ enum MtdDevType type; union { + /** Vendor id of the mtd device */ uint8_t id[MTD_FLASH_ID_LEN_MAX]; struct { uint8_t mfrId; // id[0]: Manufacture ID uint8_t devId; // id[0]: Device ID }; }; + /** Length of the vendor id */ uint16_t idLen; - size_t capacity; // by bytes - size_t eraseSize; // by bytes - size_t writeSize; // by bytes - size_t readSize; // by bytes - size_t oobSize; // for nand only + /** Length of the vendor id */ + size_t capacity; + /** Erase size of the mtd device */ + size_t eraseSize; + /** Write size of the mtd device */ + size_t writeSize; + /** Read size of the mtd device */ + size_t readSize; + /** Oob size of the mtd device */ + size_t oobSize; + /** Write size shift bits of the mtd device */ unsigned int writeSizeShift; + /** Mutex lock for accessing protection */ struct OsalMutex lock; + /** The callback method set to access the device */ struct MtdDeviceMethod *ops; + /** Os specific data */ void *osData; + /** Flash memory controller specific data */ void *cntlr; + /** Private data of the mtd device */ void *priv; }; +/** + * @brief Get the manager of mtd + * + * @return Returns the pointer to the manager if success; + * returns NULL otherwise. + */ +struct PlatformManager *MtdManagerGet(void); + +/** + * @brief Add a mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 if add successfully; returns a negative value otherwise. + */ int32_t MtdDeviceAdd(struct MtdDevice *mtdDevice); + +/** + * @brief Delete a mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + */ void MtdDeviceDel(struct MtdDevice *mtdDevice); +/** + * @brief Increase reference count for a mtd device. + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns the pointer to the mtd device on success; returns NULL otherwise. + */ +static inline struct MtdDevice *MtdDeviceGet(struct MtdDevice *mtdDevice) +{ + if (mtdDevice != NULL && PlatformDeviceGet(&mtdDevice->device) != NULL) { + return mtdDevice; + } + return NULL; +} + +/** + * @brief Increase reference count for a mtd device by number. + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns the pointer to the mtd device on success; returns NULL otherwise. + */ +static inline struct MtdDevice *MtdDeviceGetByNum(int16_t num) +{ + struct PlatformDevice *device = PlatformManagerGetDeviceByMagic(MtdManagerGet(), num); + + if (device != NULL) { + return CONTAINER_OF(device, struct MtdDevice, device); + } + return NULL; +} + +/** + * @brief Decrease reference count for a mtd device. + * + * @param mtdDevice Indicates the pointer to the mtd device. + */ +static inline void MtdDevicePut(struct MtdDevice *mtdDevice) +{ + if (mtdDevice != NULL) { + PlatformDevicePut(&mtdDevice->device); + } +} + +/** + * @brief Lock the mtd device exclusivly. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t MtdDeviceLock(struct MtdDevice *mtdDevice); + +/** + * @brief Unlock the mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + */ void MtdDeviceUnlock(struct MtdDevice *mtdDevice); +/** + * @brief Reads data of a specified size from a mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param from Indicates the start address to read from. + * @param len Indicates the size of the data to read. + * @param buf Indicates the pointer to the buffer for receiving the data. + * + * @return Returns the size of the data read on success; returns a negative value otherwise. + */ ssize_t MtdDeviceRead(struct MtdDevice *mtdDevice, off_t from, size_t len, uint8_t *buf); + +/** + * @brief Writes data of a specified size to a mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param to Indicates the start address to write to. + * @param len Indicates the size of the data to write. + * @param buf Indicates the pointer to the buffer which provide the data. + * + * @return Returns the size of the data written on success; returns a negative value otherwise. + */ ssize_t MtdDeviceWrite(struct MtdDevice *mtdDevice, off_t to, size_t len, const uint8_t *buf); -ssize_t MtdDeviceErase(struct MtdDevice *mtdDevice, off_t from, size_t len, off_t *failAddr); +/** + * @brief Erases data of a specified size to a mtd device. + * + * do not call in irq context cause it may sleep + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param from Indicates the start address to erase from. + * @param len Indicates the size of the data to erase. + * @param faddr Indicates the pointer for receiving the address when erasing failed. + * + * @return Returns the size of the data erased on success; returns a negative value otherwise. + */ +ssize_t MtdDeviceErase(struct MtdDevice *mtdDevice, off_t from, size_t len, off_t *faddr); + +/** + * @brief Reads data of a specified size from a mtd device including oob data. + * + * It is similar to MtdDeviceRead but read oob data together. + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param from Indicates the start address to read from. + * @param len Indicates the size of the data, including oob, to read. + * @param buf Indicates the pointer to the buffer for receiving the data, including oob data. + * + * @return Returns the size of the data read on success; returns a negative value otherwise. + */ ssize_t MtdDeviceReadWithOob(struct MtdDevice *mtdDevice, off_t from, size_t len, uint8_t *buf); + +/** + * @brief Writes data of a specified size to a mtd device including oob data. + * + * It is similar to MtdDeviceWrite but write oob data together. + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param to Indicates the start address to write to. + * @param len Indicates the size of the data, including oob, to . + * @param buf Indicates the pointer to the buffer which provide the data including oob. + * + * @return Returns the size of the data read on success; returns a negative value otherwise. + */ ssize_t MtdDeviceWriteWithOob(struct MtdDevice *mtdDevice, off_t to, size_t len, const uint8_t *buf); + +/** + * @brief Judge whether the block where the specified address is located is a bad block + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param addr Indicates the address to judge, which is not neccessary to align by block size. + * + * @return Returns true is the specified address falls into a bad block; returns false otherwise. + */ bool MtdDeviceIsBadBlock(struct MtdDevice *mtdDevice, off_t addr); + +/** + * @brief Mark the block where the specified address is located as a bad block + * + * @param mtdDevice Indicates the pointer to the mtd device. + * @param addr Indicates the address to mark, which is not neccessary to align by block size. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t MtdDeviceMarkBadBlock(struct MtdDevice *mtdDevice, off_t addr); -static inline bool MtdDeviceIsPageAligned(struct MtdDevice *mtdDevice, off_t addr) -{ - return ((addr & (mtdDevice->writeSize - 1)) == 0); -} -static inline size_t MtdDeviceAddrToPage(struct MtdDevice *mtdDevice, off_t addr) -{ - return (size_t)(addr >> mtdDevice->writeSizeShift); -} +/***************************** Other Utils *******************************************/ +/** + * @brief A debugging macro which an dump all the attributes of a mtd device + * + */ #define MTD_DEVICE_DUMP(mtd) \ do { \ uint16_t i; \ @@ -134,9 +361,28 @@ static inline size_t MtdDeviceAddrToPage(struct MtdDevice *mtdDevice, off_t addr HDF_LOGI("%s: oobSize: %zu", __func__, mtd->oobSize); \ } while (0) +/** + * @brief Judge whether the specified address is aligned by page size + * + */ +static inline bool MtdDeviceIsPageAligned(struct MtdDevice *mtdDevice, off_t addr) +{ + return ((addr & (mtdDevice->writeSize - 1)) == 0); +} -/***************************** Other Utils *******************************************/ +/** + * @brief Transfer the specified address to page number + * + */ +static inline size_t MtdDeviceAddrToPage(struct MtdDevice *mtdDevice, off_t addr) +{ + return (size_t)(addr >> mtdDevice->writeSizeShift); +} +/** + * @brief Flush the cache for dma transfer + * + */ static inline void MtdDmaCacheClean(void *addr, size_t size) { uintptr_t start = (uintptr_t)addr & ~(CACHE_ALIGNED_SIZE - 1); @@ -147,6 +393,10 @@ static inline void MtdDmaCacheClean(void *addr, size_t size) return; } +/** + * @brief Invalid the cache for dma transfer + * + */ static inline void MtdDmaCacheInv(void *addr, size_t size) { uintptr_t start = (uintptr_t)addr & ~(CACHE_ALIGNED_SIZE - 1); @@ -157,6 +407,11 @@ static inline void MtdDmaCacheInv(void *addr, size_t size) return; } +/** + * @brief Find the first bit set in word + * + * @return Returns the position of first bit set; returns 0 if all zero. + */ int MtdFfs(int x); #endif /* MTD_CORE_H */ diff --git a/model/storage/include/mtd/mtd_nand.h b/model/storage/include/mtd/mtd_nand.h index 055f7c88b..01101da64 100644 --- a/model/storage/include/mtd/mtd_nand.h +++ b/model/storage/include/mtd/mtd_nand.h @@ -18,6 +18,10 @@ extern "C" { #endif #endif /* __cplusplus */ +/** + * @brief Enumerates the page size type of a nand flash memory. + * + */ enum MtdNandPageSize { MTD_NAND_PAGE_SIZE_512 = 512, MTD_NAND_PAGE_SIZE_2K = 2048, @@ -26,6 +30,10 @@ enum MtdNandPageSize { MTD_NAND_PAGE_SIZE_16K = 16384, }; +/** + * @brief Enumerates the ECC type of a nand flash memory. + * + */ enum MtdNandEccTYpe { MTD_NAND_ECC_0BIT = 0, MTD_NAND_ECC_8BIT_1K = 1, @@ -36,6 +44,10 @@ enum MtdNandEccTYpe { MTD_NAND_ECC_64BIT_1K = 6, }; +/** + * @brief Defines the bad block area size of a nand flash memory. + * + */ #define MTD_NAND_BB_SIZE 2 #ifdef __cplusplus diff --git a/model/storage/include/mtd/mtd_spi_common.h b/model/storage/include/mtd/mtd_spi_common.h index cf46b3a57..a55e1f099 100644 --- a/model/storage/include/mtd/mtd_spi_common.h +++ b/model/storage/include/mtd/mtd_spi_common.h @@ -19,14 +19,39 @@ extern "C" { struct SpiFlash; +/** + * @Defines the spi configuration of a specific operation + * + */ struct MtdSpiConfig { + /** spi interface type */ uint8_t ifType; + /** the operation command */ uint8_t cmd; + /** dummy cycles */ uint8_t dummy; + /** not used now */ uint32_t size; + /** system clock used */ uint32_t clock; }; +/** + * @brief Enumerates the type of spi interface. + * + */ +enum SpiIfType { + MTD_SPI_IF_STD = 0, + MTD_SPI_IF_DUAL = 1, + MTD_SPI_IF_DIO = 2, + MTD_SPI_IF_QUAD = 3, + MTD_SPI_IF_QIO = 4, +}; + +/** + * @Defines the spi oepration set of a mtd device. + * + */ struct MtdSpiOps { int32_t (*waitReady)(struct SpiFlash *spi); int32_t (*writeEnable)(struct SpiFlash *spi); @@ -34,38 +59,91 @@ struct MtdSpiOps { int32_t (*entry4Addr)(struct SpiFlash *spi, int enable); }; +/** + * @Defines the info structure which contains vendor id and spi operations + * + */ struct SpiOpsInfo { uint8_t id[MTD_FLASH_ID_LEN_MAX]; uint8_t idLen; struct MtdSpiOps spiOps; }; -enum SpiIfType { - MTD_SPI_IF_STD = 0, - MTD_SPI_IF_DUAL = 1, - MTD_SPI_IF_DIO = 2, - MTD_SPI_IF_QUAD = 3, - MTD_SPI_IF_QIO = 4, -}; - +/** + * @Defines the structure used to identify a physical spi flash. + * + */ struct SpiFlash { + /** The parent device */ struct MtdDevice mtd; + /** chip select number */ uint8_t cs; - uint8_t qeEnable; - uint8_t qeSupport; + /** address cycle */ uint32_t addrCycle; + /** spi configuration of erase */ struct MtdSpiConfig eraseCfg; + /** spi configuration of write */ struct MtdSpiConfig writeCfg; + /** spi configuration of read */ struct MtdSpiConfig readCfg; + /** spi operation set of the device */ struct MtdSpiOps spiOps; }; +/** + * @brief Wait for a spi flash to be ready. + * + * @param spi Indicates the pointer to the spi flash. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t SpiFlashWaitReady(struct SpiFlash *spi); + +/** + * @brief Enable write operation to a spi falsh. + * + * @param spi Indicates the pointer to the spi flash. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t SpiFlashWriteEnable(struct SpiFlash *spi); + +/** + * @brief Enable QUAD I/O mode of a spi falsh if it supports. + * + * @param spi Indicates the pointer to the spi flash. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t SpiFlashQeEnable(struct SpiFlash *spi); + +/** + * @brief Enable 4 byte address mode of a spi falsh if it supports. + * + * @param spi Indicates the pointer to the spi flash. + * + * @return Returns 0 on success; returns a negative value otherwise. + */ int32_t SpiFlashEntry4Addr(struct SpiFlash *spi, int enable); +/** + * @brief Add a spi flash device. + * + * do not call in irq context cause it may sleep + * + * @param spi Indicates the pointer to the spi flash device. + * + * @return Returns 0 if add successfully; returns a negative value otherwise. + */ int32_t SpiFlashAdd(struct SpiFlash *spi); + +/** + * @brief Delete a spi flash device. + * + * do not call in irq context cause it may sleep + * + * @param spi Indicates the pointer to the spi flash device. + */ void SpiFlashDel(struct SpiFlash *spi); /****************************Spi Common Command Set **************************************/ @@ -117,7 +195,6 @@ void SpiFlashDel(struct SpiFlash *spi); #ifdef __cplusplus #if __cplusplus - } #endif #endif /* __cplusplus */ diff --git a/model/storage/include/mtd/mtd_spi_nand.h b/model/storage/include/mtd/mtd_spi_nand.h index 76b3e7ecb..eb8a3dce0 100644 --- a/model/storage/include/mtd/mtd_spi_nand.h +++ b/model/storage/include/mtd/mtd_spi_nand.h @@ -41,6 +41,10 @@ extern "C" { #define MTD_SPI_NAND_ERASE_FAIL 0x04 #define MTD_SPI_NAND_PROG_FAIL 0x08 +/** + * @Defines the structure used to describe a spi nand flash. + * + */ struct SpinandInfo { const char *name; uint8_t id[MTD_FLASH_ID_LEN_MAX]; diff --git a/model/storage/include/mtd/mtd_spi_nor.h b/model/storage/include/mtd/mtd_spi_nor.h index fd1e210eb..cab675bb1 100644 --- a/model/storage/include/mtd/mtd_spi_nor.h +++ b/model/storage/include/mtd/mtd_spi_nor.h @@ -23,6 +23,10 @@ extern "C" { #define MTD_SPI_ADDR_3BYTE 3 #define MTD_SPI_ADDR_4BYTE 4 +/** + * @Defines the structure used to describe a spi nor flash. + * + */ struct SpinorInfo { const char *name; uint8_t id[MTD_FLASH_ID_LEN_MAX]; diff --git a/model/storage/src/common/storage_block.c b/model/storage/src/common/storage_block.c deleted file mode 100644 index 54733351e..000000000 --- a/model/storage/src/common/storage_block.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ -#include "hdf_base.h" -#include "hdf_log.h" -#include "platform_core.h" -#include "storage_block.h" - -#define HDF_LOG_TAG storage_block_c - -#define MAX_BLOCK_COUNT 3 - -static struct StorageBlock *g_blocks[MAX_BLOCK_COUNT]; - -ssize_t StorageBlockErase(struct StorageBlock *sb, size_t secStart, size_t secNr) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->ops == NULL || sb->ops->erase == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - return sb->ops->erase(sb, secStart, secNr); -} - -ssize_t StorageBlockWrite(struct StorageBlock *sb, const uint8_t *buf, size_t secStart, size_t secNr) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->ops == NULL || sb->ops->write == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - return sb->ops->write(sb, buf, secStart, secNr); -} - -ssize_t StorageBlockRead(struct StorageBlock *sb, uint8_t *buf, size_t secStart, size_t secNr) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->ops == NULL || sb->ops->read == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - return sb->ops->read(sb, buf, secStart, secNr); -} - -int32_t StorageBlockGetAuSize(struct StorageBlock *sb, uint32_t *auSize) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->ops == NULL || sb->ops->getAuSize == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - *auSize = sb->ops->getAuSize(sb); - return HDF_SUCCESS; -} - -size_t StorageBlockGetCapacity(struct StorageBlock *sb) -{ - return (sb == NULL) ? 0 : sb->capacity; -} - -bool StorageBlockIsPresent(struct StorageBlock *sb) -{ - return (sb != NULL && sb->ops != NULL && - sb->ops->isPresent != NULL && sb->ops->isPresent(sb)); -} - -int32_t StorageBlockAdd(struct StorageBlock *sb) -{ - int i; - int32_t ret; - - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - - for (i = 0; i < MAX_BLOCK_COUNT; i++) { - if (g_blocks[i] == NULL) { - g_blocks[i] = sb; - sb->index = i; - break; - } - } - if (i >= MAX_BLOCK_COUNT) { - return HDF_PLT_ERR_DEV_FULL; - } - - if (sb->secSize == 0) { - sb->secSize = STORAGE_SEC_SIZE; - } - - ret = StorageBlockOsInit(sb); - if (ret != HDF_SUCCESS) { - g_blocks[i] = NULL; - return ret; - } - - return HDF_SUCCESS; -} - -void StorageBlockDel(struct StorageBlock *sb) -{ - int i; - - if (sb == NULL) { - return; - } - - for (i = 0; i < MAX_BLOCK_COUNT; i++) { - if (g_blocks[i] == sb) { - g_blocks[i] = NULL; - } - } - - StorageBlockOsUninit(sb); -} - -struct StorageBlock *StorageBlockFromNumber(uint32_t number) -{ - if (number >= MAX_BLOCK_COUNT) { - HDF_LOGE("StorageBlockFromNumber: invalid number:%d", number); - return NULL; - } - return g_blocks[number]; -} diff --git a/model/storage/src/mmc/mmc_block.c b/model/storage/src/mmc/mmc_block.c new file mode 100644 index 000000000..86ba1c742 --- /dev/null +++ b/model/storage/src/mmc/mmc_block.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "securec.h" + +#include "hdf_base.h" +#include "hdf_log.h" +#include "mmc_block.h" +#include "platform_core.h" + +#define HDF_LOG_TAG mmc_block_c + +int32_t MmcBlockInit(struct MmcDevice *mmcDevice) +{ + int32_t ret; + size_t nameSize; + struct MmcBlock *mb = NULL; + + if (mmcDevice == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (PlatformDeviceGet(&mmcDevice->device) == NULL) { + return HDF_PLT_ERR_DEV_GET; + } + + mb = (struct MmcBlock *)OsalMemCalloc(sizeof(*mb)); + if (mb == NULL) { + PlatformDevicePut(&mmcDevice->device); + return HDF_ERR_MALLOC_FAIL; + } + + mmcDevice->mb = mb; + mb->mmc = mmcDevice; + mb->secSize = mmcDevice->secSize; + mb->capacity = mmcDevice->capacity; + mb->removeable = (mmcDevice->state.bits.removeable == 0) ? false : true; + nameSize = sizeof(mb->name); + ret = snprintf_s(mb->name, nameSize, nameSize - 1, "/dev/mmcblk%0d", mmcDevice->cntlr->index); + if (ret <= 0) { + OsalMemFree(mb); + PlatformDevicePut(&mmcDevice->device); + HDF_LOGE("%s: format block dev name failed, ret = %d", __func__, ret); + return HDF_PLT_ERR_OS_API; + } + + ret = MmcBlockOsInit(mmcDevice); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: mmc block os init failed, ret = %d", __func__, ret); + OsalMemFree(mb); + PlatformDevicePut(&mmcDevice->device); + return ret; + } + return HDF_SUCCESS; +} + +void MmcBlockUninit(struct MmcDevice *mmcDevice) +{ + if (mmcDevice != NULL) { + MmcBlockOsUninit(mmcDevice); + OsalMemFree(mmcDevice->mb); + mmcDevice->mb = NULL; + PlatformDevicePut(&mmcDevice->device); + } +} diff --git a/model/storage/src/mtd/mtd_block.c b/model/storage/src/mtd/mtd_block.c index fb3c39f30..069172b2c 100644 --- a/model/storage/src/mtd/mtd_block.c +++ b/model/storage/src/mtd/mtd_block.c @@ -6,6 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdf_log.h" #include "mtd_core.h" __attribute__((weak)) int32_t MtdBlockOsInit(struct MtdDevice *mtdDevice) @@ -21,10 +22,31 @@ __attribute__ ((weak)) void MtdBlockOsUninit(struct MtdDevice *mtdDevice) int32_t MtdBlockInit(struct MtdDevice *mtdDevice) { - return MtdBlockOsInit(mtdDevice); + int32_t ret; + + if (mtdDevice == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (MtdDeviceGet(mtdDevice) == NULL) { + HDF_LOGE("%s: get mtd device failed", __func__); + return HDF_PLT_ERR_DEV_GET; + } + + ret = MtdBlockOsInit(mtdDevice); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: os init failed, ret = %d", __func__, ret); + MtdDevicePut(mtdDevice); + return ret; + } + + return HDF_SUCCESS; } void MtdBlockUninit(struct MtdDevice *mtdDevice) { - MtdBlockOsUninit(mtdDevice); + if (mtdDevice != NULL) { + MtdBlockOsUninit(mtdDevice); + MtdDevicePut(mtdDevice); + } } diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 051e55efb..5093da2ce 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -16,7 +16,7 @@ static int32_t MtdDeviceCheckParms(struct MtdDevice *mtdDevice) { - if (mtdDevice->index < 0) { + if (mtdDevice->index < 0 || mtdDevice->index >= MTD_DEVICE_NUM_MAX) { HDF_LOGE("%s: invalid index: %d", __func__, mtdDevice->index); return HDF_ERR_INVALID_OBJECT; } @@ -96,6 +96,16 @@ static void MtdDeviceUnlockDefault(struct MtdDevice *mtdDevice) return; } +struct PlatformManager *MtdManagerGet(void) +{ + static struct PlatformManager *g_mtdManager = NULL; + + if (g_mtdManager == NULL) { + g_mtdManager = PlatformManagerCreate("STORAGE_MTD"); + } + return g_mtdManager; +} + int32_t MtdDeviceAdd(struct MtdDevice *mtdDevice) { int32_t ret; @@ -124,15 +134,25 @@ int32_t MtdDeviceAdd(struct MtdDevice *mtdDevice) mtdDevice->ops->unlock = MtdDeviceUnlockDefault; } + mtdDevice->device.manager = MtdManagerGet(); + mtdDevice->device.magic = mtdDevice->index; + ret = PlatformDeviceAdd(&mtdDevice->device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: mtd device add fail", __func__); + return ret; + } + MtdDeviceDump(mtdDevice); ret = MtdCharInit(mtdDevice); if (ret != HDF_SUCCESS) { + PlatformDeviceDel(&mtdDevice->device); return ret; } ret = MtdBlockInit(mtdDevice); if (ret != HDF_SUCCESS) { + PlatformDeviceDel(&mtdDevice->device); return ret; } @@ -144,6 +164,7 @@ void MtdDeviceDel(struct MtdDevice *mtdDevice) if (mtdDevice != NULL) { MtdCharUninit(mtdDevice); MtdBlockUninit(mtdDevice); + PlatformDeviceDel(&mtdDevice->device); (void)OsalMutexDestroy(&mtdDevice->lock); } } diff --git a/model/storage/src/mtd/mtd_spi_common.c b/model/storage/src/mtd/mtd_spi_common.c index 7561507e3..cf2176e56 100644 --- a/model/storage/src/mtd/mtd_spi_common.c +++ b/model/storage/src/mtd/mtd_spi_common.c @@ -20,8 +20,7 @@ static void SpiFlashDumpDefualt(struct MtdDevice *mtdDevice) MTD_DEVICE_DUMP(mtdDevice); spi = CONTAINER_OF(mtdDevice, struct SpiFlash, mtd); - HDF_LOGD("%s: cs = %u, qe = %u, addrCycle = %u", __func__, - spi->cs, spi->qeEnable, spi->addrCycle); + HDF_LOGD("%s: cs = %u, addrCycle = %u", __func__, spi->cs, spi->addrCycle); cfg = &spi->readCfg; HDF_LOGD("%s: readCfg -> ifType:%u, cmd:0x%x, dummy:%u, size:%u, clock:%u", diff --git a/support/platform/include/mmc/mmc_block.h b/support/platform/include/mmc/mmc_block.h deleted file mode 100644 index bec2bb785..000000000 --- a/support/platform/include/mmc/mmc_block.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef MMC_BLOCK_H -#define MMC_BLOCK_H - -#include "mmc_corex.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -int32_t MmcBlockAdd(struct MmcDevice *mmc); -void MmcBlockDel(struct MmcDevice *mmc); - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* MMC_BLOCK_H */ diff --git a/support/platform/include/mmc/mmc_corex.h b/support/platform/include/mmc/mmc_corex.h index f3c2afdaf..fbf927522 100644 --- a/support/platform/include/mmc/mmc_corex.h +++ b/support/platform/include/mmc/mmc_corex.h @@ -224,7 +224,7 @@ struct MmcDevice { size_t secSize; // by bytes size_t capacity; // by sectors size_t eraseSize; // by sectors - struct StorageBlock *sb; + struct MmcBlock *mb; void *priv; }; diff --git a/support/platform/src/mmc/mmc_block.c b/support/platform/src/mmc/mmc_block.c deleted file mode 100644 index 2917a2842..000000000 --- a/support/platform/src/mmc/mmc_block.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "storage_block.h" -#include "hdf_base.h" -#include "hdf_log.h" -#include "mmc_corex.h" -#include "mmc_sd.h" -#include "osal_mem.h" -#include "securec.h" - -static ssize_t MmcBlockRead(struct StorageBlock *sb, uint8_t *buf, size_t secStart, size_t nSec) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->type == MEDIA_MMC) { - return MmcDeviceRead((struct MmcDevice *)sb->media, buf, secStart, nSec); - } - return HDF_ERR_NOT_SUPPORT; -} - -static ssize_t MmcBlockWrite(struct StorageBlock *sb, const uint8_t *buf, size_t secStart, size_t nSec) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->type == MEDIA_MMC) { - return MmcDeviceWrite((struct MmcDevice *)sb->media, (uint8_t *)buf, secStart, nSec); - } - return HDF_ERR_NOT_SUPPORT; -} - -static ssize_t MmcBlockErase(struct StorageBlock *sb, size_t secStart, size_t nSec) -{ - if (sb == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - if (sb->type == MEDIA_MMC) { - return MmcDeviceErase((struct MmcDevice *)sb->media, secStart, nSec); - } - return HDF_ERR_NOT_SUPPORT; -} - -static uint32_t MmcBlockGetAuSize(struct StorageBlock *sb) -{ - struct MmcDevice *mmc = NULL; - struct SdDevice *sd = NULL; - - if (sb == NULL || sb->media == NULL) { - HDF_LOGE("MmcBlockGetAuSize: invalid sb or media!"); - return 0; - } - - if (sb->type != MEDIA_MMC) { - HDF_LOGE("MmcBlockGetAuSize: media is not mmc!"); - return 0; - } - - mmc = (struct MmcDevice *)sb->media; - if (mmc->type != MMC_DEV_SD) { - HDF_LOGE("MmcBlockGetAuSize: media is not sd!"); - return 0; - } - sd = (struct SdDevice *)mmc; - - return sd->reg.ssr.auSize; -} - -static bool MmcBlockIsPresent(struct StorageBlock *sb) -{ - return (sb != NULL && sb->type == MEDIA_MMC && - MmcDeviceIsPresent((struct MmcDevice *)sb->media)); -} - -static struct StorageBlockMethod g_mmcBlockOps = { - .read = MmcBlockRead, - .write = MmcBlockWrite, - .erase = MmcBlockErase, - .getAuSize = MmcBlockGetAuSize, - .isPresent = MmcBlockIsPresent, -}; - -static int32_t MmcBlockInit(struct StorageBlock *sb, struct MmcDevice *mmc) -{ - int32_t ret; - size_t nameSize; - - if (PlatformDeviceGet(&mmc->device) == NULL) { - return HDF_PLT_ERR_DEV_GET; - } - mmc->sb = sb; - sb->type = MEDIA_MMC; - sb->media = mmc; - sb->secSize = mmc->secSize; - sb->capacity = mmc->capacity; - sb->removeable = (mmc->state.bits.removeable == 0) ? false : true; - sb->ops = &g_mmcBlockOps; - nameSize = sizeof(sb->name); - ret = snprintf_s(sb->name, nameSize, nameSize - 1, "/dev/mmcblk%0d", mmc->cntlr->index); - if (ret <= 0) { - PlatformDevicePut(&mmc->device); - } - - return HDF_SUCCESS; -} - -static void MmcBlockUninit(struct StorageBlock *sb) -{ - struct MmcDevice *mmc = (struct MmcDevice *)sb->media; - - mmc->sb = NULL; - PlatformDevicePut(&mmc->device); -} - -int32_t MmcBlockAdd(struct MmcDevice *mmc) -{ - int32_t ret; - struct StorageBlock *sb = NULL; - - if (mmc == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - - sb = (struct StorageBlock *)OsalMemCalloc(sizeof(*sb)); - if (sb == NULL) { - return HDF_ERR_MALLOC_FAIL; - } - - ret = MmcBlockInit(sb, mmc); - if (ret != HDF_SUCCESS) { - OsalMemFree(sb); - return ret; - } - - ret = StorageBlockAdd(sb); - if (ret != HDF_SUCCESS) { - MmcBlockUninit(sb); - OsalMemFree(sb); - return ret; - } - - return HDF_SUCCESS; -} - -void MmcBlockDel(struct MmcDevice *mmc) -{ - struct StorageBlock *sb = NULL; - - if (mmc == NULL) { - return; - } - sb = mmc->sb; - if (sb == NULL) { - return; - } - - StorageBlockDel(sb); - MmcBlockUninit(sb); - OsalMemFree(sb); -} diff --git a/support/platform/src/mmc/mmc_core.c b/support/platform/src/mmc/mmc_core.c index 6d2670b1a..68493eb6c 100644 --- a/support/platform/src/mmc/mmc_core.c +++ b/support/platform/src/mmc/mmc_core.c @@ -1005,7 +1005,7 @@ int32_t MmcDeviceAdd(struct MmcDevice *mmc) } if (mmc->type == MMC_DEV_EMMC || mmc->type == MMC_DEV_SD || mmc->type == MMC_DEV_COMBO) { - ret = MmcBlockAdd(mmc); + ret = MmcBlockInit(mmc); if (ret != HDF_SUCCESS) { MmcCntlrPut(mmc->cntlr); PlatformDeviceDel(&mmc->device); @@ -1021,7 +1021,7 @@ void MmcDeviceRemove(struct MmcDevice *mmc) return; } if (mmc->type == MMC_DEV_EMMC || mmc->type == MMC_DEV_SD || mmc->type == MMC_DEV_COMBO) { - MmcBlockDel(mmc); + MmcBlockUninit(mmc); } PlatformDeviceDel(&mmc->device); MmcCntlrPut(mmc->cntlr); -- Gitee From 6bf11d52f696623cc162d0226717e18518032c01 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 17 Sep 2021 14:23:48 +0800 Subject: [PATCH 042/272] clean_warning Signed-off-by: YOUR_NAME --- .../driver/chipset/vibrator_linear_driver.c | 14 ++++++--- .../driver/common/src/sensor_config_parser.c | 25 +++++++++------ .../driver/common/src/sensor_device_manager.c | 31 +++++++++++++------ test/unittest/common/hdf_main_test.c | 7 +++-- test/unittest/sensor/hdf_sensor_test.c | 18 ++++++----- 5 files changed, 62 insertions(+), 33 deletions(-) diff --git a/model/misc/vibrator/driver/chipset/vibrator_linear_driver.c b/model/misc/vibrator/driver/chipset/vibrator_linear_driver.c index 6f126069e..b6959fca1 100644 --- a/model/misc/vibrator/driver/chipset/vibrator_linear_driver.c +++ b/model/misc/vibrator/driver/chipset/vibrator_linear_driver.c @@ -82,9 +82,11 @@ static int32_t DispatchLinearVibrator(struct HdfDeviceIoClient *client, int32_t BindLinearVibratorDriver(struct HdfDeviceObject *device) { + struct VibratorLinearDriverData *drvData = NULL; + CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(device, HDF_FAILURE); - struct VibratorLinearDriverData *drvData = (struct VibratorLinearDriverData *)OsalMemCalloc(sizeof(*drvData)); + drvData = (struct VibratorLinearDriverData *)OsalMemCalloc(sizeof(*drvData)); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_MALLOC_FAIL); drvData->ioService.Dispatch = DispatchLinearVibrator; @@ -99,6 +101,7 @@ static int32_t ParserLinearConfig(const struct DeviceResourceNode *node, struct { int32_t ret; struct DeviceResourceIface *parser = NULL; + const struct DeviceResourceNode *configNode = NULL; CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(node, HDF_FAILURE); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); @@ -107,7 +110,7 @@ static int32_t ParserLinearConfig(const struct DeviceResourceNode *node, struct CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); - const struct DeviceResourceNode *configNode = parser->GetChildNode(node, "vibratorChipConfig"); + configNode = parser->GetChildNode(node, "vibratorChipConfig"); ret = parser->GetUint32(configNode, "busType", &drvData->busType, 0); CHECK_VIBRATOR_PARSER_RESULT_RETURN_VALUE(ret, "busType"); if (drvData->busType == VIBRATOR_BUS_GPIO) { @@ -128,10 +131,11 @@ static int32_t ParserLinearConfig(const struct DeviceResourceNode *node, struct int32_t InitLinearVibratorDriver(struct HdfDeviceObject *device) { static struct VibratorOps ops; + struct VibratorLinearDriverData *drvData = NULL; CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(device, HDF_FAILURE); - struct VibratorLinearDriverData *drvData = (struct VibratorLinearDriverData *)device->service; + drvData = (struct VibratorLinearDriverData *)device->service; CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); ops.Start = StartLinearVibrator; @@ -157,11 +161,13 @@ int32_t InitLinearVibratorDriver(struct HdfDeviceObject *device) void ReleaseLinearVibratorDriver(struct HdfDeviceObject *device) { + struct VibratorLinearDriverData *drvData = NULL; + if (device == NULL) { HDF_LOGE("%s: Device is null", __func__); return; } - struct VibratorLinearDriverData *drvData = (struct VibratorLinearDriverData *)device->service; + drvData = (struct VibratorLinearDriverData *)device->service; if (drvData == NULL) { HDF_LOGE("%s: DrvData pointer is null", __func__); return; diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 31efd2f13..b4984976c 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -63,18 +63,20 @@ static int32_t ParseSensorRegItem(struct DeviceResourceIface *parser, const stru int32_t ret; int32_t step; int32_t index; + int32_t num; int32_t itemNum = group->itemNum; + uint16_t *buf = NULL; CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(groupName, HDF_ERR_INVALID_PARAM); - int32_t num = parser->GetElemNum(regNode, groupName); + num = parser->GetElemNum(regNode, groupName); if (num <= 0 || num > SENSOR_CONFIG_MAX_ITEM) { HDF_LOGE("%s: parser %s element num failed", __func__, groupName); return HDF_SUCCESS; } - uint16_t *buf = (uint16_t *)OsalMemCalloc(sizeof(uint16_t) * num); + buf = (uint16_t *)OsalMemCalloc(sizeof(uint16_t) * num); CHECK_NULL_PTR_RETURN_VALUE(buf, HDF_ERR_MALLOC_FAIL); ret = parser->GetUint16Array(regNode, groupName, buf, num, 0); @@ -108,6 +110,7 @@ static int32_t ParseSensorRegItem(struct DeviceResourceIface *parser, const stru static int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode, const char *groupName, struct SensorRegCfgGroupNode **groupNode) { + int32_t num; struct SensorRegCfgGroupNode *group = NULL; CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); @@ -115,7 +118,7 @@ static int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const str CHECK_NULL_PTR_RETURN_VALUE(groupName, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(groupNode, HDF_ERR_INVALID_PARAM); - int32_t num = parser->GetElemNum(regCfgNode, groupName); + num = parser->GetElemNum(regCfgNode, groupName); group = *groupNode; if (num > 0) { @@ -246,13 +249,14 @@ int32_t DetectSensorDevice(struct SensorCfgData *config) uint8_t value = 0; uint16_t chipIdReg; uint16_t chipIdValue; + int32_t ret; CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); chipIdReg = config->sensorAttr.chipIdReg; chipIdValue = config->sensorAttr.chipIdValue; - int32_t ret = GetSensorBusHandle(&config->busCfg); + ret = GetSensorBusHandle(&config->busCfg); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get sensor bus handle failed", __func__); (void)ReleaseSensorBusHandle(&config->busCfg); @@ -280,6 +284,8 @@ static int32_t ParseSensorInfo(struct DeviceResourceIface *parser, const struct struct SensorCfgData *config) { int32_t ret; + uint16_t id; + int32_t value; const char *name = NULL; ret = parser->GetString(infoNode, "sensorName", &name, NULL); @@ -310,7 +316,6 @@ static int32_t ParseSensorInfo(struct DeviceResourceIface *parser, const struct return HDF_FAILURE; } - uint16_t id; ret = parser->GetUint16(infoNode, "sensorTypeId", &id, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "sensorTypeId"); config->sensorInfo.sensorTypeId = id; @@ -318,7 +323,6 @@ static int32_t ParseSensorInfo(struct DeviceResourceIface *parser, const struct CHECK_PARSER_RESULT_RETURN_VALUE(ret, "sensorId"); config->sensorInfo.sensorId = id; - int32_t value; ret = parser->GetUint32(infoNode, "maxRange", (uint32_t *)&value, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "maxRange"); config->sensorInfo.maxRange = value; @@ -377,6 +381,9 @@ int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct Se { int32_t ret; struct DeviceResourceIface *parser = NULL; + const struct DeviceResourceNode *infoNode = NULL; + const struct DeviceResourceNode *busNode = NULL; + const struct DeviceResourceNode *attrNode = NULL; CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); @@ -387,19 +394,19 @@ int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct Se config->root = node; CHECK_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); - const struct DeviceResourceNode *infoNode = parser->GetChildNode(node, "sensorInfo"); + infoNode = parser->GetChildNode(node, "sensorInfo"); if (infoNode != NULL) { ret = ParseSensorInfo(parser, infoNode, config); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "sensorInfo"); } - const struct DeviceResourceNode *busNode = parser->GetChildNode(node, "sensorBusConfig"); + busNode = parser->GetChildNode(node, "sensorBusConfig"); if (busNode != NULL) { ret = ParseSensorBus(parser, busNode, config); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "sensorBusConfig"); } - const struct DeviceResourceNode *attrNode = parser->GetChildNode(node, "sensorIdAttr"); + attrNode = parser->GetChildNode(node, "sensorIdAttr"); if (attrNode != NULL) { ret = ParseSensorAttr(parser, attrNode, config); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "sensorIdAttr"); diff --git a/model/sensor/driver/common/src/sensor_device_manager.c b/model/sensor/driver/common/src/sensor_device_manager.c index 8c3389392..e72dd5db2 100644 --- a/model/sensor/driver/common/src/sensor_device_manager.c +++ b/model/sensor/driver/common/src/sensor_device_manager.c @@ -88,14 +88,16 @@ int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo) int32_t ReportSensorEvent(const struct SensorReportEvent *events) { int32_t ret; + struct SensorDevMgrData *manager = NULL; + struct HdfSBuf *msg = NULL; CHECK_NULL_PTR_RETURN_VALUE(events, HDF_ERR_INVALID_PARAM); - struct SensorDevMgrData *manager = GetSensorDeviceManager(); + manager = GetSensorDeviceManager(); CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM); (void)OsalMutexLock(&manager->eventMutex); - struct HdfSBuf *msg = HdfSBufObtain(HDF_SENSOR_EVENT_MAX_BUF); + msg = HdfSBufObtain(HDF_SENSOR_EVENT_MAX_BUF); if (msg == NULL) { (void)OsalMutexUnlock(&manager->eventMutex); return HDF_ERR_INVALID_PARAM; @@ -128,11 +130,14 @@ EXIT: static int32_t GetAllSensorInfo(struct HdfSBuf *data, struct HdfSBuf *reply) { - (void)data; + int32_t count = 0; struct SensorDevInfoNode *pos = NULL; struct SensorBasicInfo *sensorInfo = NULL; - struct SensorDevMgrData *manager = GetSensorDeviceManager(); - int32_t count = 0; + struct SensorDevMgrData *manager = NULL; + + (void)data; + + manager = GetSensorDeviceManager(); CHECK_NULL_PTR_RETURN_VALUE(reply, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM); @@ -303,9 +308,11 @@ static int32_t DispatchSensor(struct HdfDeviceIoClient *client, int32_t BindSensorDevManager(struct HdfDeviceObject *device) { + struct SensorDevMgrData *manager = NULL; + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct SensorDevMgrData *manager = (struct SensorDevMgrData *)OsalMemCalloc(sizeof(*manager)); + manager = (struct SensorDevMgrData *)OsalMemCalloc(sizeof(*manager)); if (manager == NULL) { HDF_LOGE("%s: malloc manager fail!", __func__); return HDF_ERR_MALLOC_FAIL; @@ -321,8 +328,10 @@ int32_t BindSensorDevManager(struct HdfDeviceObject *device) int32_t InitSensorDevManager(struct HdfDeviceObject *device) { + struct SensorDevMgrData *manager = NULL; + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct SensorDevMgrData *manager = (struct SensorDevMgrData *)device->service; + manager = (struct SensorDevMgrData *)device->service; CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_PARAM); DListHeadInit(&manager->sensorDevInfoHead); @@ -347,11 +356,13 @@ int32_t InitSensorDevManager(struct HdfDeviceObject *device) void ReleaseSensorDevManager(struct HdfDeviceObject *device) { - CHECK_NULL_PTR_RETURN(device); - struct SensorDevInfoNode *pos = NULL; struct SensorDevInfoNode *tmp = NULL; - struct SensorDevMgrData *manager = (struct SensorDevMgrData *)device->service; + struct SensorDevMgrData *manager = NULL; + + CHECK_NULL_PTR_RETURN(device); + + manager = (struct SensorDevMgrData *)device->service; CHECK_NULL_PTR_RETURN(manager); DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &manager->sensorDevInfoHead, struct SensorDevInfoNode, node) { diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 19911d9f7..d7931a49e 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -190,13 +190,14 @@ void HdfTestDriverDispatch(struct HdfDeviceObject *device) int HdfTestDriverBind(struct HdfDeviceObject *device) { + static struct TestService testService; + if (device == NULL) { return -1; } - static struct TestService testService = { - .testRemoteService.Dispatch = HdfTestCaseProcess, - }; + testService.testRemoteService.Dispatch = HdfTestCaseProcess; + device->service = &testService.testRemoteService; return 0; } diff --git a/test/unittest/sensor/hdf_sensor_test.c b/test/unittest/sensor/hdf_sensor_test.c index ce89c9eb3..85871a998 100644 --- a/test/unittest/sensor/hdf_sensor_test.c +++ b/test/unittest/sensor/hdf_sensor_test.c @@ -141,8 +141,10 @@ static int32_t SensorDisableTest(void) static int32_t SensorSetBatchTest(int64_t samplingInterval, int64_t interval) { + struct SensorTestDrvData *drvData = NULL; (void)interval; - struct SensorTestDrvData *drvData = GetSensorTestDrvData(); + + drvData = GetSensorTestDrvData(); drvData->interval = samplingInterval; return HDF_SUCCESS; @@ -172,12 +174,13 @@ static int32_t SensorTestDispatch(struct HdfDeviceIoClient *client, int32_t BindSensorDriverTest(struct HdfDeviceObject *device) { - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - static struct IDeviceIoService service = { .object = {0}, .Dispatch = SensorTestDispatch, }; + + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + device->service = &service; return HDF_SUCCESS; } @@ -185,8 +188,6 @@ int32_t BindSensorDriverTest(struct HdfDeviceObject *device) int32_t InitSensorDriverTest(struct HdfDeviceObject *device) { int32_t ret; - (void)device; - struct SensorDeviceInfo deviceInfo = { .sensorInfo = { .sensorName = "sensor_test", @@ -208,6 +209,8 @@ int32_t InitSensorDriverTest(struct HdfDeviceObject *device) }, }; + (void)device; + ret = SensorInitTestConfig(); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: sensor test config failed", __func__); @@ -226,9 +229,8 @@ int32_t InitSensorDriverTest(struct HdfDeviceObject *device) void ReleaseSensorDriverTest(struct HdfDeviceObject *device) { - (void)device; int32_t ret; - struct SensorTestDrvData *drvData = GetSensorTestDrvData(); + struct SensorTestDrvData *drvData = NULL; struct SensorDeviceInfo deviceInfo = { .sensorInfo = { .sensorName = "sensor_test", @@ -242,6 +244,8 @@ void ReleaseSensorDriverTest(struct HdfDeviceObject *device) .power = SENSOR_TEST_MAX_POWER, } }; + drvData = GetSensorTestDrvData(); + (void)device; (void)DeleteSensorDevice(&deviceInfo.sensorInfo); if (drvData->timer.realTimer != NULL) { -- Gitee From d9226c5f06b1271eb0a47d690c91955a23aeac56 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Fri, 17 Sep 2021 14:43:50 +0800 Subject: [PATCH 043/272] fix devhost process execv fail issue Signed-off-by: yuanbo --- core/common/src/hdf_attribute.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index 3234d52d6..af6022584 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -276,11 +276,10 @@ struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *h deviceNode = deviceNode->sibling; continue; } - deviceNodeInfo->deviceId = deviceIdx; + deviceNodeInfo->deviceId = deviceIdx++; deviceNode = deviceNode->sibling; } device = device->sibling; - deviceIdx++; } if (HdfSListCount(deviceList) == 0) { OsalMemFree(deviceList); -- Gitee From 1d29c014824a1bafde34957c5bbcf796e8479bd8 Mon Sep 17 00:00:00 2001 From: bigA2021 Date: Fri, 17 Sep 2021 20:59:36 +0800 Subject: [PATCH 044/272] usb 0917 commit Signed-off-by: bigA2021 Change-Id: I8810f05ceb2b1fbb52babe0cfaa0425ac68e94cb --- model/usb/src/usb_ddk_pnp_loader.c | 3 +- .../include/usb_device_lite_cdcacm_test.h | 1 - .../device/src/usb_device_lite_cdcacm_test.c | 61 ++- .../device/src/usb_device_lite_sdk_if_test.c | 1 + .../device/src/usb_device_lite_sdk_io_test.c | 58 ++- .../model/usb/host/include/usb_raw_test.h | 3 +- test/unittest/model/usb/host/src/usb_raw_io.c | 15 +- .../model/usb/host/src/usb_raw_test.c | 493 ++++++++++-------- 8 files changed, 365 insertions(+), 270 deletions(-) mode change 100644 => 100755 test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h mode change 100644 => 100755 test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c mode change 100644 => 100755 test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index c8be7990e..41d2dac84 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -1006,7 +1006,8 @@ int UsbDdkPnpLoaderEventHandle(void) } return status; error: - for (idTable = g_usbPnpMatchIdTable[0]; idTable != NULL;) { + idTable = g_usbPnpMatchIdTable[0]; + while (idTable != NULL) { tableCount++; idTable = g_usbPnpMatchIdTable[tableCount]; } diff --git a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h old mode 100644 new mode 100755 index e28d2ad98..95b004948 --- a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h +++ b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h @@ -126,7 +126,6 @@ struct CtrlInfo { struct AcmDevice *acm; }; -extern struct UsbFnDeviceDesc g_acmFnDevice; struct AcmDevice *SetUpAcmDevice(void); void ReleaseAcmDevice(struct AcmDevice *acm); void AcmEventCallback(struct UsbFnEvent *event); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index 841d89300..7250a9366 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -335,13 +335,42 @@ static struct Serial *SerialAlloc(void) return port; } +static void ParsePipes(struct AcmDevice *acmDevice, struct UsbFnInterface *fnIface, UsbFnInterfaceHandle handle) +{ + uint32_t j; + int ret; + for (j = 0; j < fnIface->info.numPipes; j++) { + struct UsbFnPipeInfo pipeInfo; + ret = UsbFnGetInterfacePipeInfo(fnIface, j, &pipeInfo); + if (ret != HDF_SUCCESS) { + return; + } + if (pipeInfo.type == USB_PIPE_TYPE_INTERRUPT) { + acmDevice->notifyPipe.id = pipeInfo.id; + acmDevice->notifyPipe.maxPacketSize = pipeInfo.maxPacketSize; + acmDevice->ctrlIface.fn = fnIface; + acmDevice->ctrlIface.handle = handle; + } else if (pipeInfo.type == USB_PIPE_TYPE_BULK) { + if (pipeInfo.dir == USB_PIPE_DIRECTION_IN) { + acmDevice->dataInPipe.id = pipeInfo.id; + acmDevice->dataInPipe.maxPacketSize = pipeInfo.maxPacketSize; + acmDevice->dataIface.fn = fnIface; + acmDevice->dataIface.handle = handle; + } else { + acmDevice->dataOutPipe.id = pipeInfo.id; + acmDevice->dataOutPipe.maxPacketSize = pipeInfo.maxPacketSize; + acmDevice->dataIface.fn = fnIface; + acmDevice->dataIface.handle = handle; + } + } + } +} + static int ParseInterfaces(struct AcmDevice *acmDevice) { uint32_t i; - uint32_t j; struct UsbFnInterface *fnIface = NULL; - UsbFnInterfaceHandle handle = NULL; - int ret; + UsbFnInterfaceHandle handle; for (i = 0; i < acmDevice->fnDev->numInterfaces; i++) { fnIface = (struct UsbFnInterface *)UsbFnGetInterface(acmDevice->fnDev, i); @@ -352,31 +381,7 @@ static int ParseInterfaces(struct AcmDevice *acmDevice) if (handle == NULL) { return -1; } - for (j = 0; j < fnIface->info.numPipes; j++) { - struct UsbFnPipeInfo pipeInfo; - ret = UsbFnGetInterfacePipeInfo(fnIface, j, &pipeInfo); - if (ret != HDF_SUCCESS) { - return -1; - } - if (pipeInfo.type == USB_PIPE_TYPE_INTERRUPT) { - acmDevice->notifyPipe.id = pipeInfo.id; - acmDevice->notifyPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->ctrlIface.fn = fnIface; - acmDevice->ctrlIface.handle = handle; - } else if (pipeInfo.type == USB_PIPE_TYPE_BULK) { - if (pipeInfo.dir == USB_PIPE_DIRECTION_IN) { - acmDevice->dataInPipe.id = pipeInfo.id; - acmDevice->dataInPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->dataIface.fn = fnIface; - acmDevice->dataIface.handle = handle; - } else { - acmDevice->dataOutPipe.id = pipeInfo.id; - acmDevice->dataOutPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->dataIface.fn = fnIface; - acmDevice->dataIface.handle = handle; - } - } - } + ParsePipes(acmDevice, fnIface, handle); } return 0; } diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c old mode 100644 new mode 100755 index 3a2e38ac2..d9ea3c270 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c @@ -18,6 +18,7 @@ #define HDF_LOG_TAG usb_device_sdk_test static struct AcmDevice *g_acmDevice = NULL; +extern struct UsbFnDeviceDesc g_acmFnDevice; #include "usb_device_lite_sdk_io_test.c" diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c old mode 100644 new mode 100755 index a806584e8..b18304794 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c @@ -570,6 +570,37 @@ int32_t UsbFnDviceTestCancelRequest005(void) return HDF_SUCCESS; } +int32_t TestCancelRequest(struct UsbFnRequest *req, struct UsbFnRequest *req2) +{ + int ret; + ret = UsbFnSubmitRequestAsync(req2); + if (HDF_SUCCESS != ret) { + HDF_LOGE("%s: request async error", __func__); + return HDF_FAILURE; + } + ret = UsbFnCancelRequest(req2); + if (HDF_SUCCESS != ret) { + dprintf("%s: cancel request error", __func__); + return HDF_FAILURE; + } + ret = UsbFnCancelRequest(req); + if (HDF_SUCCESS != ret) { + dprintf("%s: cancel request error", __func__); + return HDF_FAILURE; + } + ret = UsbFnFreeRequest(req); + if (HDF_SUCCESS != ret) { + dprintf("%s: free Request error", __func__); + return HDF_FAILURE; + } + ret = UsbFnFreeRequest(req2); + if (HDF_SUCCESS != ret) { + dprintf("%s: free Request error", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + int32_t UsbFnDviceTestCancelRequest006(void) { int ret; @@ -604,31 +635,6 @@ int32_t UsbFnDviceTestCancelRequest006(void) HDF_LOGE("%s: request async error", __func__); return HDF_FAILURE; } - ret = UsbFnSubmitRequestAsync(req2); - if (HDF_SUCCESS != ret) { - HDF_LOGE("%s: request async error", __func__); - return HDF_FAILURE; - } - ret = UsbFnCancelRequest(req2); - if (HDF_SUCCESS != ret) { - dprintf("%s: cancel request error", __func__); - return HDF_FAILURE; - } - ret = UsbFnCancelRequest(req); - if (HDF_SUCCESS != ret) { - dprintf("%s: cancel request error", __func__); - return HDF_FAILURE; - } - ret = UsbFnFreeRequest(req); - if (HDF_SUCCESS != ret) { - dprintf("%s: free Request error", __func__); - return HDF_FAILURE; - } - ret = UsbFnFreeRequest(req2); - if (HDF_SUCCESS != ret) { - dprintf("%s: free Request error", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; + return TestCancelRequest(req, req2); } diff --git a/test/unittest/model/usb/host/include/usb_raw_test.h b/test/unittest/model/usb/host/include/usb_raw_test.h index b02a0fa0e..de9c6ac37 100755 --- a/test/unittest/model/usb/host/include/usb_raw_test.h +++ b/test/unittest/model/usb/host/include/usb_raw_test.h @@ -352,13 +352,12 @@ struct UsbFillRequestData { UsbRequestCallback userCallback; }; -extern struct AcmRawDevice *g_acm; - struct UsbRawTestFunc { enum UsbRawTestCmd type; int32_t (*Func)(void); }; +struct AcmRawDevice *UsbGetIoAcm(void); int UsbParseConfigDescriptor(struct AcmRawDevice *acm, struct UsbRawConfigDescriptor *config); int AcmWriteBufAlloc(struct AcmRawDevice *acm); void AcmNotifyReqCallback(const void *requestArg); diff --git a/test/unittest/model/usb/host/src/usb_raw_io.c b/test/unittest/model/usb/host/src/usb_raw_io.c index dc0da48c6..42ee4a508 100755 --- a/test/unittest/model/usb/host/src/usb_raw_io.c +++ b/test/unittest/model/usb/host/src/usb_raw_io.c @@ -30,12 +30,17 @@ int g_activeConfig; bool g_initFlag; bool g_stopIoThreadFlag = false; +struct AcmRawDevice *UsbGetIoAcm(void) +{ + return g_acm; +} + int UsbIoThread(void *data) { int ret; struct AcmRawDevice *acm = (struct AcmRawDevice *)data; - for (;;) { + while (true) { printf("%s:%d\n", __func__, __LINE__); if (acm == NULL) { printf("%s:%d acm is NULL\n", __func__, __LINE__); @@ -206,11 +211,11 @@ void AcmNotifyReqCallback(const void *requestArg) printf("Irqstatus:%d,actualLength:%u\n", req->status, currentSize); } -static int AcmWriteBufAllocHandle(struct AcmRawDevice *acm) +static int AcmWriteBufAllocHandle(const struct AcmRawDevice *acm) { int i; struct RawWb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { + for (wb = (struct RawWb *)&acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { wb->buf = OsalMemCalloc(acm->dataOutEp.maxPacketSize); if (!wb->buf) { while (i != 0) { @@ -257,7 +262,8 @@ void AcmCtrlReqCallback(const void *requestArg) printf("%s:%d entry!", __func__, __LINE__); } -static void AcmParaseInterfaceClass(struct AcmRawDevice *acm, const struct UsbRawInterface *interface, uint8_t number) +static void AcmParaseInterfaceClass( + struct AcmRawDevice * const acm, const struct UsbRawInterface *interface, uint8_t number) { uint8_t ifaceClass; uint8_t numEndpoints; @@ -295,7 +301,6 @@ static void AcmParaseInterfaceClass(struct AcmRawDevice *acm, const struct UsbRa printf("%s:%d wrong descriptor type\n", __func__, __LINE__); break; } - } int UsbParseConfigDescriptor(struct AcmRawDevice *acm, struct UsbRawConfigDescriptor *config) diff --git a/test/unittest/model/usb/host/src/usb_raw_test.c b/test/unittest/model/usb/host/src/usb_raw_test.c index 423dcc99e..1f6d00985 100755 --- a/test/unittest/model/usb/host/src/usb_raw_test.c +++ b/test/unittest/model/usb/host/src/usb_raw_test.c @@ -52,8 +52,9 @@ int32_t CheckRawSdkIfClaimInterface001(void) int32_t CheckRawSdkIfClaimInterface005(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbParseConfigDescriptor(g_acm, g_acm->config); + ret = UsbParseConfigDescriptor(rawAcm, rawAcm->config); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -65,8 +66,9 @@ int32_t CheckRawSdkIfClaimInterface005(void) int32_t CheckRawSdkIfReleaseInterface001(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawReleaseInterface(NULL, g_acm->ctrlIface); + ret = UsbRawReleaseInterface(NULL, rawAcm->ctrlIface); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -78,8 +80,9 @@ int32_t CheckRawSdkIfReleaseInterface001(void) int32_t CheckRawSdkIfReleaseInterface002(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawReleaseInterface(g_acm->devHandle, g_acm->ctrlIface); + ret = UsbRawReleaseInterface(rawAcm->devHandle, rawAcm->ctrlIface); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -91,8 +94,9 @@ int32_t CheckRawSdkIfReleaseInterface002(void) int32_t CheckRawSdkIfReleaseInterface003(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawReleaseInterface(NULL, g_acm->dataIface); + ret = UsbRawReleaseInterface(NULL, rawAcm->dataIface); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -104,8 +108,9 @@ int32_t CheckRawSdkIfReleaseInterface003(void) int32_t CheckRawSdkIfReleaseInterface004(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawReleaseInterface(g_acm->devHandle, g_acm->dataIface); + ret = UsbRawReleaseInterface(rawAcm->devHandle, rawAcm->dataIface); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -117,8 +122,9 @@ int32_t CheckRawSdkIfReleaseInterface004(void) int32_t CheckRawSdkIfClaimInterface006(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbParseConfigDescriptor(g_acm, g_acm->config); + ret = UsbParseConfigDescriptor(rawAcm, rawAcm->config); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -131,17 +137,18 @@ int32_t CheckRawSdkIfAllocRequest001(void) { int i; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = AcmWriteBufAlloc(g_acm); + ret = AcmWriteBufAlloc(rawAcm); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } for (i = 0; i < ACM_NW; i++) { - g_acm->wb[i].request = UsbRawAllocRequest(NULL, 0, g_acm->dataOutEp.maxPacketSize); - g_acm->wb[i].instance = g_acm; - if (g_acm->wb[i].request) { + rawAcm->wb[i].request = UsbRawAllocRequest(NULL, 0, rawAcm->dataOutEp.maxPacketSize); + rawAcm->wb[i].instance = rawAcm; + if (rawAcm->wb[i].request) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -154,18 +161,19 @@ int32_t CheckRawSdkIfAllocRequest002(void) { int i; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = AcmWriteBufAlloc(g_acm); + ret = AcmWriteBufAlloc(rawAcm); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } for (i = 0; i < ACM_NW; i++) { - g_acm->wb[i].request = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->dataOutEp.maxPacketSize); - g_acm->wb[i].instance = g_acm; - ((struct UsbHostRequest *)(g_acm->wb[i].request))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; - if (g_acm->wb[i].request == NULL) { + rawAcm->wb[i].request = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataOutEp.maxPacketSize); + rawAcm->wb[i].instance = rawAcm; + ((struct UsbHostRequest *)(rawAcm->wb[i].request))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; + if (rawAcm->wb[i].request == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -177,10 +185,11 @@ int32_t CheckRawSdkIfAllocRequest002(void) int32_t CheckRawSdkIfAllocRequest003(void) { int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NR; i++) { - g_acm->readReq[i] = UsbRawAllocRequest(NULL, 0, g_acm->dataInEp.maxPacketSize); - if (g_acm->readReq[i]) { + rawAcm->readReq[i] = UsbRawAllocRequest(NULL, 0, rawAcm->dataInEp.maxPacketSize); + if (rawAcm->readReq[i]) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -192,11 +201,12 @@ int32_t CheckRawSdkIfAllocRequest003(void) int32_t CheckRawSdkIfAllocRequest004(void) { int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NR; i++) { - g_acm->readReq[i] = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->dataInEp.maxPacketSize); - ((struct UsbHostRequest *)(g_acm->readReq[i]))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; - if (g_acm->readReq[i] == NULL) { + rawAcm->readReq[i] = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataInEp.maxPacketSize); + ((struct UsbHostRequest *)(rawAcm->readReq[i]))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; + if (rawAcm->readReq[i] == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -207,8 +217,9 @@ int32_t CheckRawSdkIfAllocRequest004(void) int32_t CheckRawSdkIfAllocRequest005(void) { - g_acm->ctrlReq = UsbRawAllocRequest(NULL, 0, USB_CTRL_REQ_SIZE); - if (g_acm->ctrlReq) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->ctrlReq = UsbRawAllocRequest(NULL, 0, USB_CTRL_REQ_SIZE); + if (rawAcm->ctrlReq) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -218,9 +229,10 @@ int32_t CheckRawSdkIfAllocRequest005(void) int32_t CheckRawSdkIfAllocRequest006(void) { - g_acm->ctrlReq = UsbRawAllocRequest(g_acm->devHandle, 0, USB_CTRL_REQ_SIZE); - ((struct UsbHostRequest *)(g_acm->ctrlReq))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; - if (g_acm->ctrlReq == NULL) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->ctrlReq = UsbRawAllocRequest(rawAcm->devHandle, 0, USB_CTRL_REQ_SIZE); + ((struct UsbHostRequest *)(rawAcm->ctrlReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; + if (rawAcm->ctrlReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -230,8 +242,9 @@ int32_t CheckRawSdkIfAllocRequest006(void) int32_t CheckRawSdkIfAllocRequest007(void) { - g_acm->notifyReq = UsbRawAllocRequest(NULL, 0, g_acm->notifyEp.maxPacketSize); - if (g_acm->notifyReq) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->notifyReq = UsbRawAllocRequest(NULL, 0, rawAcm->notifyEp.maxPacketSize); + if (rawAcm->notifyReq) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -241,9 +254,10 @@ int32_t CheckRawSdkIfAllocRequest007(void) int32_t CheckRawSdkIfAllocRequest008(void) { - g_acm->notifyReq = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->notifyEp.maxPacketSize); - ((struct UsbHostRequest *)(g_acm->notifyReq))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; - if (g_acm->notifyReq == NULL) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->notifyReq = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->notifyEp.maxPacketSize); + ((struct UsbHostRequest *)(rawAcm->notifyReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; + if (rawAcm->notifyReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -252,23 +266,25 @@ int32_t CheckRawSdkIfAllocRequest008(void) } int32_t CheckRawSdkIfAllocRequest010(void) { - g_acm->isoReq = UsbRawAllocRequest(NULL, USB_ISO_PACKAT_CNT, g_acm->isoEp.maxPacketSize); - if (g_acm->isoReq == NULL) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->isoReq = UsbRawAllocRequest(NULL, USB_ISO_PACKAT_CNT, rawAcm->isoEp.maxPacketSize); + if (rawAcm->isoReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - ((struct UsbHostRequest *)(g_acm->isoReq))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; + ((struct UsbHostRequest *)(rawAcm->isoReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } int32_t CheckRawSdkIfAllocRequest011(void) { - g_acm->isoReq = UsbRawAllocRequest(g_acm->devHandle, USB_ISO_PACKAT_CNT, g_acm->isoEp.maxPacketSize); - if (g_acm->isoReq == NULL) { + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + rawAcm->isoReq = UsbRawAllocRequest(rawAcm->devHandle, USB_ISO_PACKAT_CNT, rawAcm->isoEp.maxPacketSize); + if (rawAcm->isoReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - ((struct UsbHostRequest *)(g_acm->isoReq))->devHandle = (struct UsbDeviceHandle *)g_acm->devHandle; + ((struct UsbHostRequest *)(rawAcm->isoReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -276,13 +292,14 @@ int32_t CheckRawSdkIfAllocRequest011(void) int32_t CheckRawSdkIfFreeRequest006(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawFreeRequest(g_acm->isoReq); + ret = UsbRawFreeRequest(rawAcm->isoReq); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->isoReq = NULL; + rawAcm->isoReq = NULL; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -294,17 +311,18 @@ int32_t CheckRawSdkIfFillIsoRequest001(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.buffer = (unsigned char*)sendData; reqData.length = size; - ret = UsbRawFillIsoRequest(g_acm->isoReq, g_acm->devHandle, &reqData); + ret = UsbRawFillIsoRequest(rawAcm->isoReq, rawAcm->devHandle, &reqData); if (ret) { printf("%s: error++ret=%d\n", __func__, ret); return HDF_FAILURE; @@ -321,17 +339,18 @@ int32_t CheckRawSdkIfFillIsoRequest002(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.buffer = (unsigned char*)sendData; reqData.length = size; - ret = UsbRawFillIsoRequest(NULL, g_acm->devHandle, &reqData); + ret = UsbRawFillIsoRequest(NULL, rawAcm->devHandle, &reqData); if (ret) { printf("%s: error++ret=%d\n", __func__, ret); return HDF_FAILURE; @@ -348,17 +367,18 @@ int32_t CheckRawSdkIfFillIsoRequest003(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.buffer = (unsigned char*)sendData; reqData.length = size; - ret = UsbRawFillIsoRequest(g_acm->isoReq, g_acm->devHandle, NULL); + ret = UsbRawFillIsoRequest(rawAcm->isoReq, rawAcm->devHandle, NULL); if (ret) { printf("%s: error++ret=%d\n", __func__, ret); return HDF_FAILURE; @@ -375,17 +395,18 @@ int32_t CheckRawSdkIfFillIsoRequest004(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.buffer = (unsigned char*)sendData; reqData.length = size; - ret = UsbRawFillIsoRequest(g_acm->isoReq, NULL, &reqData); + ret = UsbRawFillIsoRequest(rawAcm->isoReq, NULL, &reqData); if (ret) { printf("%s: error++ret=%d\n", __func__, ret); return HDF_FAILURE; @@ -402,11 +423,12 @@ int32_t CheckRawSdkIfFillIsoRequest005(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; @@ -429,11 +451,12 @@ int32_t CheckRawSdkIfFillIsoRequest006(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->isoEp.maxPacketSize) ? g_acm->isoEp.maxPacketSize : size; + size = (size > rawAcm->isoEp.maxPacketSize) ? rawAcm->isoEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->isoEp.addr; + reqData.endPoint = rawAcm->isoEp.addr; reqData.numIsoPackets = USB_ISO_PACKAT_CNT; reqData.callback = AcmWriteIsoCallback; reqData.timeout = USB_CTRL_SET_TIMEOUT; @@ -452,16 +475,17 @@ int32_t CheckRawSdkIfFreeRequest001(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NW; i++) { - ret = UsbRawFreeRequest(g_acm->wb[i].request); + ret = UsbRawFreeRequest(rawAcm->wb[i].request); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->wb[i].request = NULL; + rawAcm->wb[i].request = NULL; } - AcmWriteBufFree(g_acm); + AcmWriteBufFree(rawAcm); HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -470,14 +494,15 @@ int32_t CheckRawSdkIfFreeRequest002(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NW; i++) { - ret = UsbRawFreeRequest(g_acm->readReq[i]); + ret = UsbRawFreeRequest(rawAcm->readReq[i]); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->readReq[i] = NULL; + rawAcm->readReq[i] = NULL; } HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; @@ -486,13 +511,14 @@ int32_t CheckRawSdkIfFreeRequest002(void) int32_t CheckRawSdkIfFreeRequest003(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawFreeRequest(g_acm->ctrlReq); + ret = UsbRawFreeRequest(rawAcm->ctrlReq); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->ctrlReq = NULL; + rawAcm->ctrlReq = NULL; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -500,13 +526,14 @@ int32_t CheckRawSdkIfFreeRequest003(void) int32_t CheckRawSdkIfFreeRequest004(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawFreeRequest(g_acm->notifyReq); + ret = UsbRawFreeRequest(rawAcm->notifyReq); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->notifyReq = NULL; + rawAcm->notifyReq = NULL; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -528,38 +555,39 @@ int32_t CheckRawSdkIfAllocRequest009(void) { int i; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = AcmWriteBufAlloc(g_acm); + ret = AcmWriteBufAlloc(rawAcm); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } for (i = 0; i < ACM_NW; i++) { - g_acm->wb[i].request = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->dataOutEp.maxPacketSize); - g_acm->wb[i].instance = g_acm; - if (g_acm->wb[i].request == NULL) { + rawAcm->wb[i].request = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataOutEp.maxPacketSize); + rawAcm->wb[i].instance = rawAcm; + if (rawAcm->wb[i].request == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } } for (i = 0; i < ACM_NR; i++) { - g_acm->readReq[i] = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->dataInEp.maxPacketSize); - if (g_acm->readReq[i] == NULL) { + rawAcm->readReq[i] = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataInEp.maxPacketSize); + if (rawAcm->readReq[i] == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } } - g_acm->ctrlReq = UsbRawAllocRequest(g_acm->devHandle, 0, USB_CTRL_REQ_SIZE); - if (g_acm->ctrlReq == NULL) { + rawAcm->ctrlReq = UsbRawAllocRequest(rawAcm->devHandle, 0, USB_CTRL_REQ_SIZE); + if (rawAcm->ctrlReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } - g_acm->notifyReq = UsbRawAllocRequest(g_acm->devHandle, 0, g_acm->notifyEp.maxPacketSize); - if (g_acm->notifyReq == NULL) { + rawAcm->notifyReq = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->notifyEp.maxPacketSize); + if (rawAcm->notifyReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } @@ -572,6 +600,7 @@ int32_t CheckRawSdkIfGetDescriptor001(void) struct UsbRawDescriptorParam param; unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -579,7 +608,7 @@ int32_t CheckRawSdkIfGetDescriptor001(void) return HDF_ERR_MALLOC_FAIL; } - ret = UsbRawGetDescriptor(NULL, g_acm->devHandle, ¶m, data); + ret = UsbRawGetDescriptor(NULL, rawAcm->devHandle, ¶m, data); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -599,6 +628,7 @@ int32_t CheckRawSdkIfGetDescriptor002(void) struct UsbRawDescriptorParam param; unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -606,7 +636,7 @@ int32_t CheckRawSdkIfGetDescriptor002(void) return HDF_ERR_MALLOC_FAIL; } - ret = UsbRawGetDescriptor(g_acm->ctrlReq, NULL, ¶m, data); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, NULL, ¶m, data); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -652,6 +682,7 @@ int32_t CheckRawSdkIfGetDescriptor004(void) { unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -659,7 +690,7 @@ int32_t CheckRawSdkIfGetDescriptor004(void) return HDF_ERR_MALLOC_FAIL; } - ret = UsbRawGetDescriptor(g_acm->ctrlReq, g_acm->devHandle, NULL, data); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, rawAcm->devHandle, NULL, data); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -678,8 +709,9 @@ int32_t CheckRawSdkIfGetDescriptor005(void) { struct UsbRawDescriptorParam param; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawGetDescriptor(g_acm->ctrlReq, g_acm->devHandle, ¶m, NULL); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, rawAcm->devHandle, ¶m, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -693,6 +725,7 @@ int32_t CheckRawSdkIfGetDescriptor006(void) struct UsbRawDescriptorParam param; unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -704,7 +737,7 @@ int32_t CheckRawSdkIfGetDescriptor006(void) param.descIndex = 0; param.length = USB_BUFFER_MAX_SIZE; - ret = UsbRawGetDescriptor(g_acm->ctrlReq, g_acm->devHandle, ¶m, data); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, rawAcm->devHandle, ¶m, data); if (ret < 0) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -723,6 +756,7 @@ int32_t CheckRawSdkIfGetDescriptor007(void) { unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -730,7 +764,7 @@ int32_t CheckRawSdkIfGetDescriptor007(void) return HDF_ERR_MALLOC_FAIL; } - ret = UsbRawGetDescriptor(g_acm->ctrlReq, NULL, NULL, data); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, NULL, NULL, data); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -748,8 +782,9 @@ error: int32_t CheckRawSdkIfGetDescriptor008(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawGetDescriptor(g_acm->ctrlReq, g_acm->devHandle, NULL, NULL); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, rawAcm->devHandle, NULL, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -762,6 +797,7 @@ int32_t CheckRawSdkIfGetDescriptor009(void) { unsigned char *data = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); data = OsalMemCalloc(USB_BUFFER_MAX_SIZE); if (data == NULL) { @@ -769,7 +805,7 @@ int32_t CheckRawSdkIfGetDescriptor009(void) return HDF_ERR_MALLOC_FAIL; } - ret = UsbRawGetDescriptor(NULL, g_acm->devHandle, NULL, data); + ret = UsbRawGetDescriptor(NULL, rawAcm->devHandle, NULL, data); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; @@ -789,12 +825,13 @@ int32_t CheckRawSdkIfGetDescriptor010(void) struct UsbRawDescriptorParam param; unsigned char data[100]; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); param.descType = 0; param.descIndex = 0; param.length = sizeof(data); - ret = UsbRawGetDescriptor(NULL, g_acm->devHandle, ¶m, NULL); + ret = UsbRawGetDescriptor(NULL, rawAcm->devHandle, ¶m, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -808,12 +845,13 @@ int32_t CheckRawSdkIfGetDescriptor011(void) struct UsbRawDescriptorParam param; unsigned char data[100]; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); param.descType = 0; param.descIndex = 0; param.length = sizeof(data); - ret = UsbRawGetDescriptor(g_acm->ctrlReq, NULL, ¶m, NULL); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, NULL, ¶m, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -870,8 +908,9 @@ int32_t CheckRawSdkIfGetDescriptor013(void) int32_t CheckRawSdkIfGetDescriptor014(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawGetDescriptor(NULL, g_acm->devHandle, NULL, NULL); + ret = UsbRawGetDescriptor(NULL, rawAcm->devHandle, NULL, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -883,8 +922,9 @@ int32_t CheckRawSdkIfGetDescriptor014(void) int32_t CheckRawSdkIfGetDescriptor015(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawGetDescriptor(g_acm->ctrlReq, NULL, NULL, NULL); + ret = UsbRawGetDescriptor(rawAcm->ctrlReq, NULL, NULL, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -913,29 +953,30 @@ int32_t CheckRawSdkIfFillBulkRequest001(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; printf("---size:%d\n", size); - size = (size > g_acm->dataOutEp.maxPacketSize) ? g_acm->dataOutEp.maxPacketSize : size; + size = (size > rawAcm->dataOutEp.maxPacketSize) ? rawAcm->dataOutEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; snd->len = size; - ret = memcpy_s(snd->buf, g_acm->dataOutEp.maxPacketSize, sendData, size); + ret = memcpy_s(snd->buf, rawAcm->dataOutEp.maxPacketSize, sendData, size); if (ret) { printf("memcpy_s fial"); } - g_acm->transmitting++; + rawAcm->transmitting++; - reqData.endPoint = g_acm->dataOutEp.addr; + reqData.endPoint = rawAcm->dataOutEp.addr; reqData.numIsoPackets = 0; reqData.callback = AcmWriteBulkCallback; reqData.userData = (void *)snd; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.buffer = snd->buf; reqData.length = snd->len; - printf("maxPacketSize:%d+snd->request:%p\n", g_acm->dataOutEp.maxPacketSize, snd->request); - ret = UsbRawFillBulkRequest(snd->request, g_acm->devHandle, &reqData); + printf("maxPacketSize:%d+snd->request:%p\n", rawAcm->dataOutEp.maxPacketSize, snd->request); + ret = UsbRawFillBulkRequest(snd->request, rawAcm->devHandle, &reqData); if (ret) { printf("%s: error++ret=%d\n", __func__, ret); return HDF_FAILURE; @@ -950,17 +991,18 @@ int32_t CheckRawSdkIfFillBulkRequest002(void) struct UsbRawFillRequestData reqData; int32_t ret; int i; - int size = g_acm->dataInEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->dataInEp.maxPacketSize; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->dataInEp.addr; + reqData.endPoint = rawAcm->dataInEp.addr; reqData.numIsoPackets = 0; reqData.callback = AcmReadBulkCallback; - reqData.userData = (void *)g_acm; + reqData.userData = (void *)rawAcm; reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.length = size; - ret = UsbRawFillBulkRequest(g_acm->readReq[i], g_acm->devHandle, &reqData); + ret = UsbRawFillBulkRequest(rawAcm->readReq[i], rawAcm->devHandle, &reqData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -974,16 +1016,17 @@ int32_t CheckRawSdkIfFillInterruptRequest001(void) { struct UsbRawFillRequestData fillRequestData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - fillRequestData.endPoint = g_acm->notifyEp.addr; + fillRequestData.endPoint = rawAcm->notifyEp.addr; fillRequestData.length = size; fillRequestData.numIsoPackets = 0; fillRequestData.callback = AcmNotifyReqCallback; - fillRequestData.userData = (void *)g_acm; + fillRequestData.userData = (void *)rawAcm; fillRequestData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - ret = UsbRawFillInterruptRequest(g_acm->notifyReq, g_acm->devHandle, &fillRequestData); + ret = UsbRawFillInterruptRequest(rawAcm->notifyReq, rawAcm->devHandle, &fillRequestData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -996,16 +1039,17 @@ int32_t CheckRawSdkIfFillInterruptRequest002(void) { struct UsbRawFillRequestData fillRequestData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - fillRequestData.endPoint = g_acm->notifyEp.addr; + fillRequestData.endPoint = rawAcm->notifyEp.addr; fillRequestData.length = size; fillRequestData.numIsoPackets = 0; fillRequestData.callback = AcmNotifyReqCallback; - fillRequestData.userData = (void *)g_acm; + fillRequestData.userData = (void *)rawAcm; fillRequestData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - ret = UsbRawFillInterruptRequest(NULL, g_acm->devHandle, &fillRequestData); + ret = UsbRawFillInterruptRequest(NULL, rawAcm->devHandle, &fillRequestData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1018,16 +1062,17 @@ int32_t CheckRawSdkIfFillInterruptRequest003(void) { struct UsbRawFillRequestData fillRequestData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - fillRequestData.endPoint = g_acm->notifyEp.addr; + fillRequestData.endPoint = rawAcm->notifyEp.addr; fillRequestData.length = size; fillRequestData.numIsoPackets = 0; fillRequestData.callback = AcmNotifyReqCallback; - fillRequestData.userData = (void *)g_acm; + fillRequestData.userData = (void *)rawAcm; fillRequestData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - ret = UsbRawFillInterruptRequest(g_acm->notifyReq, NULL, &fillRequestData); + ret = UsbRawFillInterruptRequest(rawAcm->notifyReq, NULL, &fillRequestData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1040,16 +1085,17 @@ int32_t CheckRawSdkIfFillInterruptRequest004(void) { struct UsbRawFillRequestData fillRequestData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - fillRequestData.endPoint = g_acm->notifyEp.addr; + fillRequestData.endPoint = rawAcm->notifyEp.addr; fillRequestData.length = size; fillRequestData.numIsoPackets = 0; fillRequestData.callback = AcmNotifyReqCallback; - fillRequestData.userData = (void *)g_acm; + fillRequestData.userData = (void *)rawAcm; fillRequestData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - ret = UsbRawFillInterruptRequest(g_acm->notifyReq, g_acm->devHandle, NULL); + ret = UsbRawFillInterruptRequest(rawAcm->notifyReq, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1063,12 +1109,13 @@ int32_t CheckRawSdkIfFillControlRequest001(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(g_acm->ctrlReq, g_acm->devHandle, &fillRequestData); + ret = UsbRawFillControlRequest(rawAcm->ctrlReq, rawAcm->devHandle, &fillRequestData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1082,12 +1129,13 @@ int32_t CheckRawSdkIfFillControlRequest002(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(NULL, g_acm->devHandle, &fillRequestData); + ret = UsbRawFillControlRequest(NULL, rawAcm->devHandle, &fillRequestData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1101,12 +1149,13 @@ int32_t CheckRawSdkIfFillControlRequest003(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(g_acm->ctrlReq, NULL, &fillRequestData); + ret = UsbRawFillControlRequest(rawAcm->ctrlReq, NULL, &fillRequestData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1120,12 +1169,13 @@ int32_t CheckRawSdkIfFillControlRequest004(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(g_acm->ctrlReq, g_acm->devHandle, NULL); + ret = UsbRawFillControlRequest(rawAcm->ctrlReq, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1139,12 +1189,13 @@ int32_t CheckRawSdkIfFillControlRequest005(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(NULL, g_acm->devHandle, NULL); + ret = UsbRawFillControlRequest(NULL, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1158,12 +1209,13 @@ int32_t CheckRawSdkIfFillControlRequest006(void) struct UsbRawFillRequestData fillRequestData; int ret; int completed = 0; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); fillRequestData.callback = AcmCtrlReqCallback; fillRequestData.userData = &completed; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillControlRequest(g_acm->ctrlReq, NULL, NULL); + ret = UsbRawFillControlRequest(rawAcm->ctrlReq, NULL, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1214,17 +1266,18 @@ int32_t CheckRawSdkIfFillControlSetup001(void) { struct UsbControlRequestData ctrlReq; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 0; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; @@ -1281,17 +1334,18 @@ int32_t CheckRawSdkIfFillControlSetup004(void) struct UsbControlRequestData ctrlReq; unsigned char *setup = NULL; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 0; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; @@ -1320,20 +1374,21 @@ int32_t CheckRawSdkIfSendControlRequest001(void) { struct UsbControlRequestData ctrlReq; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 0; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawSendControlRequest(NULL, g_acm->devHandle, &ctrlReq); + ret = UsbRawSendControlRequest(NULL, rawAcm->devHandle, &ctrlReq); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1346,20 +1401,21 @@ int32_t CheckRawSdkIfSendControlRequest002(void) { struct UsbControlRequestData ctrlReq; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 0; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawSendControlRequest(g_acm->ctrlReq, NULL, &ctrlReq); + ret = UsbRawSendControlRequest(rawAcm->ctrlReq, NULL, &ctrlReq); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1371,7 +1427,8 @@ int32_t CheckRawSdkIfSendControlRequest002(void) int32_t CheckRawSdkIfSendControlRequest003(void) { int ret; - ret = UsbRawSendControlRequest(g_acm->ctrlReq, g_acm->devHandle, NULL); + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + ret = UsbRawSendControlRequest(rawAcm->ctrlReq, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1384,20 +1441,21 @@ int32_t CheckRawSdkIfSendControlRequest004(void) { struct UsbControlRequestData ctrlReq; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 2; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawSendControlRequest(g_acm->ctrlReq, g_acm->devHandle, &ctrlReq); + ret = UsbRawSendControlRequest(rawAcm->ctrlReq, rawAcm->devHandle, &ctrlReq); if (ret < 0) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1410,16 +1468,17 @@ int32_t CheckRawSdkIfSendControlRequest005(void) { struct UsbControlRequestData ctrlReq; int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; - g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); + rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; + rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); ctrlReq.index = 0; - ctrlReq.data = (unsigned char *)&g_acm->lineCoding; + ctrlReq.data = (unsigned char *)&rawAcm->lineCoding; ctrlReq.length = sizeof(struct UsbCdcLineCoding); ctrlReq.timeout = USB_CTRL_SET_TIMEOUT; @@ -1435,8 +1494,9 @@ int32_t CheckRawSdkIfSendControlRequest005(void) int32_t CheckRawSdkIfSendControlRequest006(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawSendControlRequest(NULL, g_acm->devHandle, NULL); + ret = UsbRawSendControlRequest(NULL, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1448,8 +1508,9 @@ int32_t CheckRawSdkIfSendControlRequest006(void) int32_t CheckRawSdkIfSendControlRequest007(void) { int ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawSendControlRequest(g_acm->ctrlReq, NULL, NULL); + ret = UsbRawSendControlRequest(rawAcm->ctrlReq, NULL, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1465,20 +1526,21 @@ int32_t CheckRawSdkIfSendBulkRequest001(void) int i; uint32_t size; char sendData[] = {"abcd\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; - size = (size > g_acm->dataOutEp.maxPacketSize) ? g_acm->dataOutEp.maxPacketSize : size; + size = (size > rawAcm->dataOutEp.maxPacketSize) ? rawAcm->dataOutEp.maxPacketSize : size; for (i = 0; i < 1; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; snd->len = size; - ret = memcpy_s(snd->buf, g_acm->dataOutEp.maxPacketSize, sendData, size); + ret = memcpy_s(snd->buf, rawAcm->dataOutEp.maxPacketSize, sendData, size); if (ret) { printf("memcpy_s fial"); } - g_acm->transmitting++; + rawAcm->transmitting++; - reqData.endPoint = g_acm->dataOutEp.addr; + reqData.endPoint = rawAcm->dataOutEp.addr; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; reqData.data = snd->buf; reqData.length = snd->len; @@ -1486,9 +1548,9 @@ int32_t CheckRawSdkIfSendBulkRequest001(void) } for (i = 0; i < 1; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; printf("UsbRawSendBulkRequest i = [%d]\n", i); - ret = UsbRawSendBulkRequest(snd->request, g_acm->devHandle, &reqData); + ret = UsbRawSendBulkRequest(snd->request, rawAcm->devHandle, &reqData); if (ret) { printf("%s: error+ret:%d", __func__, ret); return HDF_FAILURE; @@ -1503,19 +1565,20 @@ int32_t CheckRawSdkIfSendBulkRequest002(void) struct UsbRequestData reqData; int32_t ret; int i; - int size = g_acm->dataInEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->dataInEp.maxPacketSize; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->dataInEp.addr; + reqData.endPoint = rawAcm->dataInEp.addr; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; reqData.length = size; - reqData.data = ((struct UsbRawRequest *)g_acm->readReq[i])->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->readReq[i])->buffer; reqData.requested = (int *)&size; } for (i = 0; i < 1; i++) { printf("UsbRawSendBulkRequest i = [%d]\n", i); - ret = UsbRawSendBulkRequest(g_acm->readReq[i], g_acm->devHandle, &reqData); + ret = UsbRawSendBulkRequest(rawAcm->readReq[i], rawAcm->devHandle, &reqData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1530,19 +1593,20 @@ int32_t CheckRawSdkIfSendBulkRequest003(void) struct UsbRequestData reqData; int32_t ret; int i; - int size = g_acm->dataInEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->dataInEp.maxPacketSize; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->dataInEp.addr; + reqData.endPoint = rawAcm->dataInEp.addr; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; reqData.length = size; - reqData.data = ((struct UsbRawRequest *)g_acm->readReq[i])->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->readReq[i])->buffer; reqData.requested = (int *)&size; } for (i = 0; i < 1; i++) { printf("UsbRawSendBulkRequest i = [%d]\n", i); - ret = UsbRawSendBulkRequest(NULL, g_acm->devHandle, &reqData); + ret = UsbRawSendBulkRequest(NULL, rawAcm->devHandle, &reqData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1557,18 +1621,19 @@ int32_t CheckRawSdkIfSendBulkRequest004(void) struct UsbRequestData reqData; int32_t ret; int i; - int size = g_acm->dataInEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->dataInEp.maxPacketSize; for (i = 0; i < 1; i++) { - reqData.endPoint = g_acm->dataInEp.addr; + reqData.endPoint = rawAcm->dataInEp.addr; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; reqData.length = size; - reqData.data = ((struct UsbRawRequest *)g_acm->readReq[i])->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->readReq[i])->buffer; reqData.requested = (int *)&size; } for (i = 0; i < 1; i++) { printf("UsbRawSendBulkRequest i = [%d]\n", i); - ret = UsbRawSendBulkRequest(g_acm->readReq[i], NULL, &reqData); + ret = UsbRawSendBulkRequest(rawAcm->readReq[i], NULL, &reqData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1582,10 +1647,11 @@ int32_t CheckRawSdkIfSendBulkRequest005(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < 1; i++) { printf("UsbRawSendBulkRequest i = [%d]\n", i); - ret = UsbRawSendBulkRequest(g_acm->readReq[i], g_acm->devHandle, NULL); + ret = UsbRawSendBulkRequest(rawAcm->readReq[i], rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1599,14 +1665,15 @@ int32_t CheckRawSdkIfSendInterruptRequest001(void) { struct UsbRequestData reqData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - reqData.endPoint = g_acm->notifyEp.addr; + reqData.endPoint = rawAcm->notifyEp.addr; reqData.length = size; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - reqData.data = ((struct UsbRawRequest *)g_acm->notifyReq)->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->notifyReq)->buffer; reqData.requested = (int *)&size; - ret = UsbRawSendInterruptRequest(g_acm->notifyReq, g_acm->devHandle, &reqData); + ret = UsbRawSendInterruptRequest(rawAcm->notifyReq, rawAcm->devHandle, &reqData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1619,15 +1686,16 @@ int32_t CheckRawSdkIfSendInterruptRequest002(void) { struct UsbRequestData reqData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - reqData.endPoint = g_acm->notifyEp.addr; + reqData.endPoint = rawAcm->notifyEp.addr; reqData.length = size; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - reqData.data = ((struct UsbRawRequest *)g_acm->notifyReq)->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->notifyReq)->buffer; reqData.requested = (int *)&size; - ret = UsbRawSendInterruptRequest(NULL, g_acm->devHandle, &reqData); + ret = UsbRawSendInterruptRequest(NULL, rawAcm->devHandle, &reqData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1640,15 +1708,16 @@ int32_t CheckRawSdkIfSendInterruptRequest003(void) { struct UsbRequestData reqData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; - reqData.endPoint = g_acm->notifyEp.addr; + reqData.endPoint = rawAcm->notifyEp.addr; reqData.length = size; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; - reqData.data = ((struct UsbRawRequest *)g_acm->notifyReq)->buffer; + reqData.data = ((struct UsbRawRequest *)rawAcm->notifyReq)->buffer; reqData.requested = (int *)&size; - ret = UsbRawSendInterruptRequest(g_acm->notifyReq, NULL, &reqData); + ret = UsbRawSendInterruptRequest(rawAcm->notifyReq, NULL, &reqData); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1660,8 +1729,9 @@ int32_t CheckRawSdkIfSendInterruptRequest003(void) int32_t CheckRawSdkIfSendInterruptRequest004(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawSendInterruptRequest(g_acm->notifyReq, g_acm->devHandle, NULL); + ret = UsbRawSendInterruptRequest(rawAcm->notifyReq, rawAcm->devHandle, NULL); if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1677,19 +1747,20 @@ int32_t CheckRawSdkIfFillBulkRequest003(void) int i; uint32_t size; char sendData[] = {"abcde\0"}; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); size = strlen(sendData) + 1; - size = (size > g_acm->dataOutEp.maxPacketSize) ? g_acm->dataOutEp.maxPacketSize : size; + size = (size > rawAcm->dataOutEp.maxPacketSize) ? rawAcm->dataOutEp.maxPacketSize : size; for (i = 0; i < ACM_NW; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; snd->len = size; - ret = memcpy_s(snd->buf, g_acm->dataOutEp.maxPacketSize, sendData, size); + ret = memcpy_s(snd->buf, rawAcm->dataOutEp.maxPacketSize, sendData, size); if (ret) { printf("memcpy_s fial"); } - g_acm->transmitting++; + rawAcm->transmitting++; - reqData.endPoint = g_acm->dataOutEp.addr; + reqData.endPoint = rawAcm->dataOutEp.addr; reqData.numIsoPackets = 0; reqData.callback = AcmWriteBulkCallback; reqData.userData = (void *)snd; @@ -1697,7 +1768,7 @@ int32_t CheckRawSdkIfFillBulkRequest003(void) reqData.buffer = snd->buf; reqData.length = snd->len; - ret = UsbRawFillBulkRequest(snd->request, g_acm->devHandle, &reqData); + ret = UsbRawFillBulkRequest(snd->request, rawAcm->devHandle, &reqData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1712,16 +1783,17 @@ int32_t CheckRawSdkIfFillBulkRequest004(void) struct UsbRawFillRequestData reqData; int32_t ret; int i; - int size = g_acm->dataInEp.maxPacketSize; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->dataInEp.maxPacketSize; for (i = 0; i < ACM_NW; i++) { - reqData.endPoint = g_acm->dataInEp.addr; + reqData.endPoint = rawAcm->dataInEp.addr; reqData.numIsoPackets = 0; reqData.callback = AcmReadBulkCallback; - reqData.userData = (void *)g_acm; + reqData.userData = (void *)rawAcm; reqData.timeout = USB_RAW_REQUEST_TIME_ZERO_MS; reqData.length = size; - ret = UsbRawFillBulkRequest(g_acm->readReq[i], g_acm->devHandle, &reqData); + ret = UsbRawFillBulkRequest(rawAcm->readReq[i], rawAcm->devHandle, &reqData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1735,14 +1807,15 @@ int32_t CheckRawSdkIfFillInterruptRequest005(void) { struct UsbRawFillRequestData fillRequestData; int32_t ret; - int size = g_acm->notifyEp.maxPacketSize; - fillRequestData.endPoint = g_acm->notifyEp.addr; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); + int size = rawAcm->notifyEp.maxPacketSize; + fillRequestData.endPoint = rawAcm->notifyEp.addr; fillRequestData.length = size; fillRequestData.numIsoPackets = 0; fillRequestData.callback = AcmNotifyReqCallback; - fillRequestData.userData = (void *)g_acm; + fillRequestData.userData = (void *)rawAcm; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; - ret = UsbRawFillInterruptRequest(g_acm->notifyReq, g_acm->devHandle, &fillRequestData); + ret = UsbRawFillInterruptRequest(rawAcm->notifyReq, rawAcm->devHandle, &fillRequestData); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1755,9 +1828,10 @@ int32_t CheckRawSdkIfSubmitRequest001(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NW; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; printf("UsbRawSubmitRequest i = [%d]\n", i); ret = UsbRawSubmitRequest(snd->request); if (ret) { @@ -1773,10 +1847,11 @@ int32_t CheckRawSdkIfSubmitRequest002(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NW; i++) { printf("UsbRawSubmitRequest i = [%d]\n", i); - ret = UsbRawSubmitRequest(g_acm->readReq[i]); + ret = UsbRawSubmitRequest(rawAcm->readReq[i]); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1789,8 +1864,9 @@ int32_t CheckRawSdkIfSubmitRequest002(void) int32_t CheckRawSdkIfSubmitRequest003(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawSubmitRequest(g_acm->notifyReq); + ret = UsbRawSubmitRequest(rawAcm->notifyReq); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; @@ -1816,9 +1892,10 @@ int32_t CheckRawSdkIfCancelRequest001(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NW; i++) { - struct RawWb *snd = &g_acm->wb[i]; + struct RawWb *snd = &rawAcm->wb[i]; ret = UsbRawCancelRequest(snd->request); if (ret) { HDF_LOGE("%s: error", __func__); @@ -1833,9 +1910,10 @@ int32_t CheckRawSdkIfCancelRequest002(void) { int32_t ret; int i; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); for (i = 0; i < ACM_NR; i++) { - ret = UsbRawCancelRequest(g_acm->readReq[i]); + ret = UsbRawCancelRequest(rawAcm->readReq[i]); printf("%s+%d+ret:%d\n", __func__, __LINE__, ret); if (ret) { HDF_LOGE("%s: error", __func__); @@ -1849,8 +1927,9 @@ int32_t CheckRawSdkIfCancelRequest002(void) int32_t CheckRawSdkIfCancelRequest003(void) { int32_t ret; + struct AcmRawDevice *rawAcm = UsbGetIoAcm(); - ret = UsbRawCancelRequest(g_acm->notifyReq); + ret = UsbRawCancelRequest(rawAcm->notifyReq); if (ret) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; -- Gitee From 4dbef6f82e192d1a09c1a0ac7319ed0f16c31193 Mon Sep 17 00:00:00 2001 From: jiachanglin Date: Sat, 18 Sep 2021 02:21:34 +0000 Subject: [PATCH 045/272] Description:Clean up the codex Feature or Bugfix:Feature Binary Source: No Signed-off-by: jiachanglin --- model/network/wifi/core/module/wifi_base.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index 1d19774a2..6e88c7e2c 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -1304,7 +1304,8 @@ static int32_t WifiCmdGetNetDevInfo(const RequestContext *context, struct HdfSBu if (GetIftype(netDev, &iftype) != HDF_SUCCESS) { iftype = 0; } - if (!HdfSbufWriteUint32(rspData, i) || !HdfSbufWriteBuffer(rspData, netDev->name, strlen(netDev->name) + 1) || + if (!HdfSbufWriteUint32(rspData, i) || + !HdfSbufWriteBuffer(rspData, netDev->name, strlen(netDev->name) + 1) || !HdfSbufWriteUint8(rspData, iftype) || !HdfSbufWriteBuffer(rspData, GET_NET_DEV_MAC_ADDR(netDev), ETH_ADDR_LEN)) { HDF_LOGE("%s: %s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); @@ -1358,7 +1359,7 @@ static int32_t WifiCmdRemainOnChannel(const RequestContext *context, struct Hdf } ret = RemainOnChannel(netdev, &wifiOnChannel); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to remain on channel,%d",__func__, ret); + HDF_LOGE("%s: fail to remain on channel,%d", __func__, ret); } return ret; } @@ -1396,14 +1397,14 @@ static int32_t WifiCmdProbeReqReport(const RequestContext *context, struct HdfSB HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - if (!HdfSbufReadInt32(reqData,&(report))) { + if (!HdfSbufReadInt32(reqData, &(report))) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "report"); return HDF_FAILURE; } ret = ProbeReqReport(netdev, report); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to probe req report,%d",__func__, ret); + HDF_LOGE("%s: fail to probe req report,%d", __func__, ret); } return ret; } @@ -1444,7 +1445,7 @@ static int32_t WifiCmdCancelRemainOnChannel(const RequestContext *context, struc ret = CancelRemainOnChannel(netdev); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to cancel remain on channel,%d",__func__, ret); + HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); } return ret; } @@ -1490,7 +1491,7 @@ static int32_t WifiCmdAddIf(const RequestContext *context, struct HdfSBuf *reqDa ret = AddIf(netdev, &ifAdd); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to cancel remain on channel,%d",__func__, ret); + HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); } return ret; } @@ -1536,7 +1537,7 @@ static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *re } ret = RemoveIf(netdev, ifRemove); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to remove interface,%d",__func__, ret); + HDF_LOGE("%s: fail to remove interface,%d", __func__, ret); } return ret; } @@ -1589,7 +1590,7 @@ static int32_t WifiCmdSetApWpsP2pIe(const RequestContext *context, struct HdfSBu } ret = SetApWpsP2pIe(netdev, &appIe); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to setapwpsp2pie,%d",__func__, ret); + HDF_LOGE("%s: fail to setapwpsp2pie,%d", __func__, ret); } return ret; } @@ -1630,7 +1631,7 @@ static int32_t WifiCmdGetDriverFlag(const RequestContext *context, struct HdfSBu ret = GetDriverFlag(netdev, ¶ms); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to getdriverflag,%d",__func__, ret); + HDF_LOGE("%s: fail to getdriverflag,%d", __func__, ret); } if (!HdfSbufWriteUint64(rspData, params->drvFlags)) { -- Gitee From 6d1d5db1a9bb581b166b7181e35f35cc2ec0d256 Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 18 Sep 2021 15:35:34 +0800 Subject: [PATCH 046/272] modify reviewbot of utils Signed-off-by: zhang --- utils/include/hdf_block_buffer.h | 3 +-- utils/include/hdf_blocking_queue.h | 6 ++---- utils/include/hdf_ordered_list.h | 4 ++-- utils/src/hdf_block_buffer.c | 16 ++++++---------- utils/src/hdf_blocking_queue.c | 4 ++-- utils/src/hdf_object_alloc.c | 14 +++----------- utils/src/hdf_ordered_list.c | 3 +-- 7 files changed, 17 insertions(+), 33 deletions(-) diff --git a/utils/include/hdf_block_buffer.h b/utils/include/hdf_block_buffer.h index 205897e25..6e6b2f573 100644 --- a/utils/include/hdf_block_buffer.h +++ b/utils/include/hdf_block_buffer.h @@ -96,8 +96,7 @@ bool HdfBlockBufferWriteShort(struct BlockBuffer *buffer, uint16_t shortValue); * * @return the new instance of buff which contain specific packet. */ -struct HdfBlockBuffer *HdfBlockBufferDuplicate( - struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end); +struct HdfBlockBuffer *HdfBlockBufferDuplicate(struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end); /* * @brief append an byte array packet into buffer. diff --git a/utils/include/hdf_blocking_queue.h b/utils/include/hdf_blocking_queue.h index 5cfda6ecd..7b51f3a8d 100644 --- a/utils/include/hdf_blocking_queue.h +++ b/utils/include/hdf_blocking_queue.h @@ -17,15 +17,13 @@ extern "C" { #endif -struct HdfBlockingQueue -{ +struct HdfBlockingQueue { struct HdfSList list; struct OsalSem sem; struct OsalMutex mutex; }; -struct HdfSListEntry -{ +struct HdfSListEntry { struct HdfSListNode node; void *data; }; diff --git a/utils/include/hdf_ordered_list.h b/utils/include/hdf_ordered_list.h index ffb4ad02d..6f9aa2ba6 100644 --- a/utils/include/hdf_ordered_list.h +++ b/utils/include/hdf_ordered_list.h @@ -28,9 +28,9 @@ struct HdfOrderedListEntity { long key; }; -typedef void(*HdfOrderedListEntityDeleter)(struct HdfOrderedListEntity *); +typedef void (*HdfOrderedListEntityDeleter)(struct HdfOrderedListEntity *); -typedef bool (*HdfOrderedListComparer)(long , void *); +typedef bool (*HdfOrderedListComparer)(long, void *); void HdfOrderedListInit(struct HdfOrderedList *list); diff --git a/utils/src/hdf_block_buffer.c b/utils/src/hdf_block_buffer.c index 7816114ed..c5361fe88 100644 --- a/utils/src/hdf_block_buffer.c +++ b/utils/src/hdf_block_buffer.c @@ -6,11 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include -#include #include "hdf_block_buffer.h" #include "osal_mem.h" -#include "utils.h" struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t size) { @@ -25,10 +22,10 @@ struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t siz return NULL; } buffer->dataSize = size; - buffer->position = 0; - if (data != NULL) { - memcpy(buffer->data, data, size); - } + buffer->position = 0; + if (data != NULL) { + memcpy(buffer->data, data, size); + } return buffer; } @@ -46,7 +43,7 @@ uint16_t HdfBlockBufferGetDataSize(struct HdfBlockBuffer *buffer) uint16_t HdfBlockBufferGetAvailableSize(struct HdfBlockBuffer *buffer) { - return (buffer == NULL) ? 0 : buffer->dataSize - buffer->position; + return (buffer == NULL) ? 0 : (buffer->dataSize - buffer->position); } uint8_t *HdfBlockBufferRead(struct HdfBlockBuffer *buffer, uint16_t size) @@ -181,8 +178,7 @@ bool HdfBlockBufferWriteData(struct HdfBlockBuffer *buffer, uint8_t *data, size_ return true; } -struct HdfBlockBuffer *HdfBlockBufferDuplicate( - struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end) +struct HdfBlockBuffer *HdfBlockBufferDuplicate(struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end) { uint16_t bufferSize = HdfBlockBufferGetDataSize(buffer); uint16_t newBufferSize; diff --git a/utils/src/hdf_blocking_queue.c b/utils/src/hdf_blocking_queue.c index 613849e9e..ed419b58c 100644 --- a/utils/src/hdf_blocking_queue.c +++ b/utils/src/hdf_blocking_queue.c @@ -110,7 +110,7 @@ void *HdfBlockingQueuePoll(struct HdfBlockingQueue *queue, long timeout) int HdfBlockingQueueOffer(struct HdfBlockingQueue *queue, void *val, long timeout) { - struct HdfSListEntry *entry = NULL; + struct HdfSListEntry *entry = NULL; if (OsalSemWait(&queue->sem, timeout) != 0) { return -1; } @@ -120,6 +120,6 @@ int HdfBlockingQueueOffer(struct HdfBlockingQueue *queue, void *val, long timeou HdfSListAddTail(&queue->list, &entry->node); OsalMutexUnlock(&queue->mutex); } - OsalSemPost(&queue->sem); + OsalSemPost(&queue->sem); } diff --git a/utils/src/hdf_object_alloc.c b/utils/src/hdf_object_alloc.c index ba4774c75..c923d4936 100644 --- a/utils/src/hdf_object_alloc.c +++ b/utils/src/hdf_object_alloc.c @@ -6,14 +6,10 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include -#include - +#include "hdf_base.h" +#include "hdf_object_alloc.h" #include "hdf_slist.h" -#include "object_alloc.h" -#include "osal_mem.h" #include "osal_mutex.h" -#include "utils.h" struct HdfChunkLink { uint32_t buffSize; @@ -66,7 +62,6 @@ struct HdfObjectNode *HdfObjectAllocFindSuitableChunk( while (HdfSListIteratorHasNext(&it)) { objectNode = (struct HdfObjectNode *)HdfSListIteratorNext(&it); - if (size == objectNode->chunkSize) { bestFitNode = objectNode; break; @@ -87,7 +82,6 @@ static void HdfObjectAllocPushObjectNode( while (HdfSListIteratorHasNext(&it)) { objectNode = (struct HdfObjectNode *)HdfSListIteratorNext(&it); - if (node->chunkSize >= objectNode->chunkSize) { break; } @@ -128,7 +122,7 @@ static void HdfObjectAllocPreloadChunk( void HdfObjectAllocLoadConfigs(const struct HdfObjectPoolConfig *configs) { - uint32_t idx = 0; + uint32_t idx; char *chunkBuffBegin = configs->buffer; char *chunkBuffEnd = configs->buffer + configs->bufferSize; @@ -161,7 +155,6 @@ void *HdfObjectAllocAlloc(size_t size) struct HdfObjectAlloc *allocator = HdfObjectAllocGetInstance(); OsalMutexLock(&allocator->mutex); objectNode = HdfObjectAllocFindSuitableChunk(allocator, size); - if ((objectNode != NULL) && (objectNode->freeCount == 0)) { goto finished; } @@ -184,7 +177,6 @@ void HdfObjectAllocFree(void *object) struct HdfObjectAlloc *allocator = HdfObjectAllocGetInstance(); OsalMutexLock(&allocator->mutex); objectNode = HdfObjectAllocFindSuitableChunk(allocator, chunkLink->buffSize); - if (objectNode != NULL) { objectNode->chunkStack[objectNode->freeCount++] = chunkLink; diff --git a/utils/src/hdf_ordered_list.c b/utils/src/hdf_ordered_list.c index a3cc2e2b9..3f45ac33b 100644 --- a/utils/src/hdf_ordered_list.c +++ b/utils/src/hdf_ordered_list.c @@ -6,7 +6,6 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "osal_mem.h" #include "hdf_ordered_list.h" void HdfOrderedListInit(struct HdfOrderedList *list) @@ -86,7 +85,7 @@ long HdfOrderedListPeekKey(struct HdfOrderedList *list) } struct HdfOrderedListEntity *HdfOrderedListFetch( - struct HdfOrderedList *list, long matchKey, HdfOrderedListComparer comparer) + struct HdfOrderedList *list, long matchKey, HdfOrderedListComparer comparer) { struct HdfSListIterator it; struct HdfOrderedListEntity *matchEntity = NULL; -- Gitee From 57ea257ce092ffd2fa1a356b6b2d3afddf36cad6 Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 18 Sep 2021 15:46:37 +0800 Subject: [PATCH 047/272] modify reviewbot warning Signed-off-by: zhang --- utils/src/hdf_block_buffer.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/utils/src/hdf_block_buffer.c b/utils/src/hdf_block_buffer.c index c5361fe88..6ca8b728e 100644 --- a/utils/src/hdf_block_buffer.c +++ b/utils/src/hdf_block_buffer.c @@ -9,6 +9,8 @@ #include "hdf_block_buffer.h" #include "osal_mem.h" +static const unsigned int OFFSET = 8; + struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t size) { uint16_t wantedSize; @@ -150,14 +152,14 @@ bool HdfBlockBufferWriteUint8(struct HdfBlockBuffer *buffer, uint8_t value) return false; } -bool HdfBlockBufferWriteUint16(struct HdfBlockBuffer *buffer, uint16_t in_value) +bool HdfBlockBufferWriteUint16(struct HdfBlockBuffer *buffer, uint16_t inValue) { if (buffer == NULL) { return false; } if (buffer->position + BYTES_UINT16 <= buffer->dataSize) { - buffer->data[buffer->position++] = (uint8_t) (in_value >> 8); - buffer->data[buffer->position++] = (uint8_t) (in_value & 0xFF); + buffer->data[buffer->position++] = (uint8_t) (inValue >> OFFSET); + buffer->data[buffer->position++] = (uint8_t) (inValue & 0xFF); return true; } return false; -- Gitee From 8cf6e78f78055d02f68204c50fdf955ac08b7996 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Sat, 18 Sep 2021 16:00:39 +0800 Subject: [PATCH 048/272] Coding style cleaning for storage Signed-off-by: haizhouyang --- model/storage/src/mmc/mmc_block.c | 1 - model/storage/src/mtd/mtd_core.c | 10 +++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/model/storage/src/mmc/mmc_block.c b/model/storage/src/mmc/mmc_block.c index 86ba1c742..19a0949ab 100644 --- a/model/storage/src/mmc/mmc_block.c +++ b/model/storage/src/mmc/mmc_block.c @@ -11,7 +11,6 @@ #include "hdf_base.h" #include "hdf_log.h" #include "mmc_block.h" -#include "platform_core.h" #define HDF_LOG_TAG mmc_block_c diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 5093da2ce..65e33a1c4 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -208,8 +208,8 @@ static void MtdDumpBuf(uint8_t *buf, size_t len) #define MTD_DUMP_BUF_LEN (MTD_DUMP_LINE_LEN * MTD_DUMP_SIGLE_WIDTH + 1) char lineBuf[MTD_DUMP_BUF_LEN]; - for (idx = 0; idx < len; ) { - line = (MTD_DUMP_LINE_LEN <= (len - idx)) ? MTD_DUMP_LINE_LEN : len - idx; + for (idx = 0; idx < len;) { + line = (MTD_DUMP_LINE_LEN <= (len - idx)) ? MTD_DUMP_LINE_LEN : (len - idx); for (i = 0, lidx = 0; i < line; i++, lidx += MTD_DUMP_SIGLE_WIDTH, buf++) { ret = snprintf_s(lineBuf + lidx, MTD_DUMP_SIGLE_WIDTH + 1, MTD_DUMP_SIGLE_WIDTH, "%02x", *buf); if (ret < 0) { @@ -388,7 +388,7 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc dataLenLeft = msg->withOob ? (msg->len / (mtdDevice->writeSize + mtdDevice->oobSize)) * mtdDevice->writeSize : msg->len; - for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity; ) { + for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity;) { if (MtdDeviceIsBadBlockUnlocked(mtdDevice, addr)) { if (!msg->skipBad) { HDF_LOGE("%s: failed on bad block @0x%jx", __func__, addr); @@ -399,7 +399,7 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc continue; } eraseOffset = addr & (mtdDevice->eraseSize - 1); - blockSize = dataLenLeft < (mtdDevice->eraseSize - eraseOffset) ? + blockSize = (dataLenLeft < (mtdDevice->eraseSize - eraseOffset)) ? dataLenLeft : (mtdDevice->eraseSize - eraseOffset); // no more than one block at once mtdPage.type = msg->type; @@ -410,7 +410,7 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc if (mtdPage.dataLen > blockSize) { mtdPage.dataLen = blockSize; } - mtdPage.oobBuf = msg->withOob ? buf + mtdPage.dataLen : NULL; + mtdPage.oobBuf = msg->withOob ? (buf + mtdPage.dataLen) : NULL; mtdPage.oobLen = msg->withOob ? mtdDevice->oobSize : 0; ret = MtdDevicePageTransferUnlocked(mtdDevice, &mtdPage); if (ret != HDF_SUCCESS) { -- Gitee From a5a425c2bcf88a632fd9f346036581a444dfd4c8 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Sat, 18 Sep 2021 07:46:00 +0000 Subject: [PATCH 049/272] fix input codex warning Signed-off-by: YOUR_NAME --- model/input/driver/event_hub.c | 5 +++-- model/input/driver/hdf_hid_adapter.c | 7 ------- model/input/driver/hdf_input_device_manager.c | 1 - model/input/driver/hdf_input_device_manager.h | 1 - model/input/driver/hdf_touch.c | 6 ------ 5 files changed, 3 insertions(+), 17 deletions(-) diff --git a/model/input/driver/event_hub.c b/model/input/driver/event_hub.c index 3055b95e1..8fd323369 100644 --- a/model/input/driver/event_hub.c +++ b/model/input/driver/event_hub.c @@ -26,12 +26,13 @@ void PushOnePackage(InputDevice *inputDev, uint32_t type, uint32_t code, int32_t { OsalTimespec time; EventPackage package = {0}; + InputManager *g_inputManager = GetInputManager(); if (inputDev == NULL) { HDF_LOGE("%s: parm is null", __func__); return; } - OsalMutexLock(&inputDev->mutex); + OsalMutexLock(&g_inputManager->mutex); package.type = type; package.code = code; package.value = value; @@ -65,5 +66,5 @@ void PushOnePackage(InputDevice *inputDev, uint32_t type, uint32_t code, int32_t HdfSbufFlush(inputDev->pkgBuf); inputDev->errFrameFlag = false; } - OsalMutexUnlock(&inputDev->mutex); + OsalMutexUnlock(&g_inputManager->mutex); } \ No newline at end of file diff --git a/model/input/driver/hdf_hid_adapter.c b/model/input/driver/hdf_hid_adapter.c index 3ebda661b..3b2842822 100644 --- a/model/input/driver/hdf_hid_adapter.c +++ b/model/input/driver/hdf_hid_adapter.c @@ -188,13 +188,6 @@ static InputDevice* HidConstructInputDev(HidInfo *info) } (void)memset_s(inputDev, sizeof(InputDevice), 0, sizeof(InputDevice)); - int32_t ret = OsalMutexInit(&inputDev->mutex); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init mutex error", __func__); - OsalMemFree(inputDev); - return NULL; - } - inputDev->devType = info->devType; inputDev->devName = info->devName; SetInputDevAbility(inputDev); diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index 9be0cce56..c9fcaa95a 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -344,7 +344,6 @@ void UnregisterInputDevice(InputDevice *inputDev) } HdfSBufRecycle(inputDev->eventBuf); inputDev->eventBuf = NULL; - OsalMutexDestroy(&inputDev->mutex); OsalMemFree(inputDev); OsalMutexUnlock(&g_inputManager->mutex); HDF_LOGI("%s: exit succ, devCount is %d", __func__, g_inputManager->devCount); diff --git a/model/input/driver/hdf_input_device_manager.h b/model/input/driver/hdf_input_device_manager.h index 98d247d88..35f454548 100644 --- a/model/input/driver/hdf_input_device_manager.h +++ b/model/input/driver/hdf_input_device_manager.h @@ -112,7 +112,6 @@ typedef struct InputDeviceInfo { void *pvtData; DevAttr attrSet; DevAbility abilitySet; - struct OsalMutex mutex; struct InputDeviceInfo *next; } InputDevice; diff --git a/model/input/driver/hdf_touch.c b/model/input/driver/hdf_touch.c index 9a1264e39..9f67dea50 100644 --- a/model/input/driver/hdf_touch.c +++ b/model/input/driver/hdf_touch.c @@ -294,12 +294,6 @@ static InputDevice *InputDeviceInstance(ChipDevice *chipDev) inputDev->devType = chipDev->driver->boardCfg->attr.devType; inputDev->devName = chipDev->driver->devName; - int32_t ret = OsalMutexInit(&inputDev->mutex); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init mutex error", __func__); - OsalMemFree(inputDev); - return NULL; - } return inputDev; } -- Gitee From 6458eb69edaaa873fef61d2692ae8319ac22096b Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 18 Sep 2021 16:30:39 +0800 Subject: [PATCH 050/272] modify reviewbot warning Signed-off-by: zhang --- utils/include/hdf_block_buffer.h | 4 ++-- utils/src/hdf_block_buffer.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/utils/include/hdf_block_buffer.h b/utils/include/hdf_block_buffer.h index 6e6b2f573..43a6837de 100644 --- a/utils/include/hdf_block_buffer.h +++ b/utils/include/hdf_block_buffer.h @@ -25,7 +25,7 @@ struct HdfBlockBuffer { struct HdfBlockBuffer *HdfBlockBufferNew(uint16_t size); -void HdfBlockBufferFree(struct BlockBuffer *buffer); +void HdfBlockBufferFree(const struct BlockBuffer *buffer); uint16_t HdfBlockBufferGetDataSize(struct BlockBuffer *buffer); @@ -96,7 +96,7 @@ bool HdfBlockBufferWriteShort(struct BlockBuffer *buffer, uint16_t shortValue); * * @return the new instance of buff which contain specific packet. */ -struct HdfBlockBuffer *HdfBlockBufferDuplicate(struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end); +struct HdfBlockBuffer *HdfBlockBufferDuplicate(const struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end); /* * @brief append an byte array packet into buffer. diff --git a/utils/src/hdf_block_buffer.c b/utils/src/hdf_block_buffer.c index 6ca8b728e..1c61c57b4 100644 --- a/utils/src/hdf_block_buffer.c +++ b/utils/src/hdf_block_buffer.c @@ -31,10 +31,10 @@ struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t siz return buffer; } -void HdfBlockBufferFree(struct HdfBlockBuffer *buffer) +void HdfBlockBufferFree(const struct HdfBlockBuffer *buffer) { if (buffer != NULL) { - free(buffer); + OsalMemFree(buffer); } } @@ -180,7 +180,7 @@ bool HdfBlockBufferWriteData(struct HdfBlockBuffer *buffer, uint8_t *data, size_ return true; } -struct HdfBlockBuffer *HdfBlockBufferDuplicate(struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end) +struct HdfBlockBuffer *HdfBlockBufferDuplicate(const struct HdfBlockBuffer *buffer, uint16_t start, uint16_t end) { uint16_t bufferSize = HdfBlockBufferGetDataSize(buffer); uint16_t newBufferSize; -- Gitee From d089116dfbe1f9f6baf5ab786a54811777073a4a Mon Sep 17 00:00:00 2001 From: vb6174 Date: Sat, 18 Sep 2021 10:56:47 +0000 Subject: [PATCH 051/272] fix audio codex Signed-off-by: vb6174 --- model/audio/core/src/audio_core.c | 4 ++-- model/audio/core/src/audio_host.c | 33 +++++++++++++++++++++++++++++-- model/audio/sapm/src/audio_sapm.c | 7 ++----- 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index 0c12213d1..f61a73415 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -217,7 +217,7 @@ int32_t AudioSeekPlatformDevice(struct AudioRuntimeDeivces *rtd, const struct Au } DLIST_FOR_EACH_ENTRY(platform, &platformController, struct PlatformDevice, list) { - if (platform != NULL && platform->devPlatformName != NULL && + if (platform->devPlatformName != NULL && strcmp(platform->devPlatformName, configData->platformName) == 0) { rtd->platform = platform; break; @@ -269,7 +269,7 @@ int32_t AudioSeekCodecDevice(struct AudioRuntimeDeivces *rtd, const struct Audio } DLIST_FOR_EACH_ENTRY(codec, &codecController, struct CodecDevice, list) { - if (codec != NULL && codec->devCodecName != NULL && strcmp(codec->devCodecName, configData->codecName) == 0) { + if (codec->devCodecName != NULL && strcmp(codec->devCodecName, configData->codecName) == 0) { rtd->codec = codec; DLIST_FOR_EACH_ENTRY(codecDai, &daiController, struct DaiDevice, list) { if (codecDai != NULL && codecDai->device != NULL && codec->device == codecDai->device && diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index e5a74f2a5..e000bf891 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -415,6 +415,12 @@ static void AudioDriverRelease(struct HdfDeviceObject *device) { struct AudioHost *audioHost = NULL; struct AudioCard *audioCard = NULL; + struct DListHead *componentHead = NULL; + struct DListHead *controlHead = NULL; + struct AudioSapmComponent *componentReq = NULL; + struct AudioSapmComponent *componentTmp = NULL; + struct AudioKcontrol *ctrlReq = NULL; + struct AudioKcontrol *ctrlTmp = NULL; ADM_LOG_DEBUG("entry."); if (device == NULL) { @@ -429,9 +435,32 @@ static void AudioDriverRelease(struct HdfDeviceObject *device) if (audioHost->priv != NULL) { audioCard = (struct AudioCard *)audioHost->priv; - if (audioCard->rtd != NULL) { - OsalMemFree(audioCard->rtd); + + componentHead = &audioCard->components; + DLIST_FOR_EACH_ENTRY_SAFE(componentReq, componentTmp, componentHead, struct AudioSapmComponent, list) { + DListRemove(&componentReq->list); + if (componentReq->componentName != NULL) { + OsalMemFree(componentReq->componentName); + } + OsalMemFree(componentReq); + } + + controlHead = &audioCard->controls; + DLIST_FOR_EACH_ENTRY_SAFE(ctrlReq, ctrlTmp, controlHead, struct AudioKcontrol, list) { + DListRemove(&ctrlReq->list); + if (ctrlReq->pri != NULL) { + OsalMemFree(ctrlReq->pri); + } + if (ctrlReq->privateData != NULL) { + OsalMemFree(ctrlReq->privateData); } + OsalMemFree(ctrlReq); + } + + if (audioCard->rtd != NULL) { + OsalMemFree(audioCard->rtd); + } + OsalMemFree(audioHost->priv); } OsalMemFree(audioHost); diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index 9f570b967..af5815025 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -607,7 +607,7 @@ static int32_t AudioSapmAddRoute(struct AudioCard *audioCard, const struct Audio } DLIST_FOR_EACH_ENTRY(sapmComponent, &audioCard->components, struct AudioSapmComponent, list) { - if (sapmComponent == NULL || sapmComponent->componentName == NULL) { + if (sapmComponent->componentName == NULL) { continue; } if ((cptSource == NULL) && (strcmp(sapmComponent->componentName, route->source) == 0)) { @@ -682,7 +682,7 @@ int32_t AudioSapmNewMixerControls(struct AudioSapmComponent *sapmComponent, stru for (i = 0; i < sapmComponent->kcontrolsNum; i++) { DLIST_FOR_EACH_ENTRY(path, &sapmComponent->sources, struct AudioSapmpath, listSink) { - if (path == NULL || path->name == NULL || sapmComponent->kcontrolNews[i].name == NULL) { + if (path->name == NULL || sapmComponent->kcontrolNews[i].name == NULL) { continue; } @@ -1214,9 +1214,6 @@ int32_t AudioSampPowerUp(const struct AudioCard *card) DListHeadInit(&upList); DLIST_FOR_EACH_ENTRY(sapmComponent, &card->components, struct AudioSapmComponent, list) { - if (sapmComponent == NULL) { - continue; - } if (sapmComponent->power == SAPM_POWER_DOWN) { AudioSapmPowerSeqInsert(sapmComponent, &upList, SAPM_POWER_UP); } -- Gitee From 50363691f4c67364e75a6cf7a45998f1d088a44c Mon Sep 17 00:00:00 2001 From: vb6174 Date: Sat, 18 Sep 2021 11:39:04 +0000 Subject: [PATCH 052/272] audio codex fix Signed-off-by: vb6174 --- model/audio/core/src/audio_host.c | 1 + 1 file changed, 1 insertion(+) diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index e000bf891..5ef6da851 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -10,6 +10,7 @@ #include "audio_codec_if.h" #include "audio_core.h" #include "audio_parse.h" +#include "audio_sapm.h" #define HDF_LOG_TAG audio_host -- Gitee From 31926f6a349e83a0fb63ca056b84a0df015b68c2 Mon Sep 17 00:00:00 2001 From: yue Date: Sat, 18 Sep 2021 20:17:48 +0800 Subject: [PATCH 053/272] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yue --- tools/hdi-gen/ast/ast.h | 2 +- tools/hdi-gen/ast/ast_array_type.cpp | 214 ++++++-- tools/hdi-gen/ast/ast_array_type.h | 18 + tools/hdi-gen/ast/ast_boolean_type.cpp | 19 + tools/hdi-gen/ast/ast_boolean_type.h | 11 +- tools/hdi-gen/ast/ast_byte_type.cpp | 19 + tools/hdi-gen/ast/ast_byte_type.h | 11 +- tools/hdi-gen/ast/ast_double_type.cpp | 19 + tools/hdi-gen/ast/ast_double_type.h | 9 + tools/hdi-gen/ast/ast_fd_type.cpp | 19 + tools/hdi-gen/ast/ast_fd_type.h | 11 +- tools/hdi-gen/ast/ast_float_type.cpp | 19 + tools/hdi-gen/ast/ast_float_type.h | 11 +- tools/hdi-gen/ast/ast_integer_type.cpp | 19 + tools/hdi-gen/ast/ast_integer_type.h | 11 +- tools/hdi-gen/ast/ast_interface_type.cpp | 23 + tools/hdi-gen/ast/ast_interface_type.h | 11 +- tools/hdi-gen/ast/ast_list_type.cpp | 113 +++-- tools/hdi-gen/ast/ast_list_type.h | 17 +- tools/hdi-gen/ast/ast_long_type.cpp | 19 + tools/hdi-gen/ast/ast_long_type.h | 11 +- tools/hdi-gen/ast/ast_map_type.cpp | 39 ++ tools/hdi-gen/ast/ast_map_type.h | 9 + tools/hdi-gen/ast/ast_method.h | 2 +- tools/hdi-gen/ast/ast_namespace.h | 2 +- tools/hdi-gen/ast/ast_node.h | 2 +- tools/hdi-gen/ast/ast_parameter.cpp | 22 + tools/hdi-gen/ast/ast_parameter.h | 6 +- tools/hdi-gen/ast/ast_sequenceable_type.cpp | 35 ++ tools/hdi-gen/ast/ast_sequenceable_type.h | 11 +- tools/hdi-gen/ast/ast_short_type.cpp | 19 + tools/hdi-gen/ast/ast_short_type.h | 11 +- tools/hdi-gen/ast/ast_string_type.cpp | 29 ++ tools/hdi-gen/ast/ast_string_type.h | 14 +- tools/hdi-gen/ast/ast_struct_type.cpp | 14 + tools/hdi-gen/ast/ast_struct_type.h | 3 + tools/hdi-gen/ast/ast_type.cpp | 24 + tools/hdi-gen/ast/ast_type.h | 14 +- tools/hdi-gen/ast/ast_uint_type.h | 2 +- tools/hdi-gen/ast/ast_ulong_type.h | 2 +- tools/hdi-gen/ast/ast_union_type.cpp | 12 + tools/hdi-gen/ast/ast_union_type.h | 3 + .../c_client_interface_code_emitter.cpp | 34 +- .../codegen/c_client_interface_code_emitter.h | 9 +- .../codegen/c_client_proxy_code_emitter.cpp | 191 ++----- .../codegen/c_client_proxy_code_emitter.h | 14 +- tools/hdi-gen/codegen/c_code_emitter.cpp | 92 +++- tools/hdi-gen/codegen/c_code_emitter.h | 35 +- tools/hdi-gen/codegen/c_code_generator.cpp | 80 ++- tools/hdi-gen/codegen/c_code_generator.h | 14 +- .../codegen/c_custom_types_code_emitter.cpp | 256 +++------- .../codegen/c_custom_types_code_emitter.h | 17 +- .../codegen/c_service_driver_code_emitter.cpp | 31 +- .../codegen/c_service_driver_code_emitter.h | 7 +- .../codegen/c_service_impl_code_emitter.cpp | 46 +- .../codegen/c_service_impl_code_emitter.h | 6 +- .../c_service_interface_code_emitter.cpp | 34 +- .../c_service_interface_code_emitter.h | 7 +- .../codegen/c_service_stub_code_emitter.cpp | 172 ++----- .../codegen/c_service_stub_code_emitter.h | 10 +- tools/hdi-gen/codegen/code_generator.h | 15 +- .../cpp_client_interface_code_emitter.cpp | 34 +- .../cpp_client_interface_code_emitter.h | 7 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 54 +- .../codegen/cpp_client_proxy_code_emitter.h | 6 +- tools/hdi-gen/codegen/cpp_code_emitter.cpp | 56 ++- tools/hdi-gen/codegen/cpp_code_emitter.h | 31 +- tools/hdi-gen/codegen/cpp_code_generator.cpp | 80 ++- tools/hdi-gen/codegen/cpp_code_generator.h | 16 +- .../codegen/cpp_custom_types_code_emitter.cpp | 17 +- .../codegen/cpp_custom_types_code_emitter.h | 7 +- .../cpp_service_driver_code_emitter.cpp | 25 +- .../codegen/cpp_service_driver_code_emitter.h | 6 +- .../codegen/cpp_service_impl_code_emitter.cpp | 54 +- .../codegen/cpp_service_impl_code_emitter.h | 6 +- .../cpp_service_interface_code_emitter.cpp | 34 +- .../cpp_service_interface_code_emitter.h | 7 +- .../codegen/cpp_service_stub_code_emitter.cpp | 104 ++-- .../codegen/cpp_service_stub_code_emitter.h | 7 +- tools/hdi-gen/codegen/generator_factory.cpp | 15 +- tools/hdi-gen/codegen/generator_factory.h | 14 +- .../java_client_interface_code_emitter.cpp | 27 +- .../java_client_interface_code_emitter.h | 6 +- .../java_client_proxy_code_emitter.cpp | 469 +---------------- .../codegen/java_client_proxy_code_emitter.h | 21 +- tools/hdi-gen/codegen/java_code_emitter.cpp | 46 +- tools/hdi-gen/codegen/java_code_emitter.h | 27 +- tools/hdi-gen/codegen/java_code_generator.cpp | 58 +-- tools/hdi-gen/codegen/java_code_generator.h | 14 +- tools/hdi-gen/main.cpp | 37 +- tools/hdi-gen/parser/module_parser.cpp | 25 +- tools/hdi-gen/parser/module_parser.h | 9 +- tools/hdi-gen/parser/parser.cpp | 470 +++++++++--------- tools/hdi-gen/parser/parser.h | 20 +- .../c_test/struct_test/v1_0/c_struct_test.cpp | 355 ++++++++----- .../struct_test/v1_0/cpp_struct_test.cpp | 92 ++-- tools/hdi-gen/util/file.h | 2 +- tools/hdi-gen/util/light_refcount_base.h | 2 +- tools/hdi-gen/util/logger.h | 2 +- tools/hdi-gen/util/options.h | 2 +- 100 files changed, 2224 insertions(+), 1991 deletions(-) diff --git a/tools/hdi-gen/ast/ast.h b/tools/hdi-gen/ast/ast.h index 5804b77e8..d3a42fe06 100755 --- a/tools/hdi-gen/ast/ast.h +++ b/tools/hdi-gen/ast/ast.h @@ -171,4 +171,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_AST_H +#endif // OHOS_HDI_AST_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index 2f1404a34..e79d33d94 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -119,23 +119,9 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } else { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); @@ -175,25 +161,10 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), - elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } else { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + sb.Append("\n"); sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -356,5 +327,180 @@ void ASTArrayType::EmitCppUnMarshalling(const String& parcelName, const String& } sb.Append(prefix).Append("}\n"); } + +void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); + + sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); + + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING + || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : + String::Format("%s[i]", varName.string()); + elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab).Append("}\n"); + } + + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + if (isClient) { + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + } + + sb.Append(prefix).Append("}\n"); +} + +void ASTArrayType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); + sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); + sb.Append(prefix).Append("} else { \n"); + EmitJavaWriteArrayVar(parcelName, name, sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTArrayType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s.readBooleanArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s.readByteArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s.readShortArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s.readIntArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s.readLongArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s.readFloatArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s.readDoubleArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s.readStringArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("%s.readSequenceableArray(%s);\n", parcelName.string(), name.string()); + break; + default: + break; + } +} + +void ASTArrayType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readBooleanArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readByteArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readShortArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readIntArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readLongArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readFloatArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readDoubleArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s[] %s = %s.readStringArray();\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("int size = %s.readInt();\n", parcelName.string()); + sb.Append(prefix).AppendFormat("%s %s = new %s[size];\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), + elementType_->EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < size; ++i) {\n"); + elementType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s[i] = value;\n", name.string()); + sb.Append(prefix).Append("}\n"); + break; + default: + break; + } +} + +void ASTArrayType::EmitJavaWriteArrayVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + switch (elementType_->GetTypeKind()) { + case TypeKind::TYPE_BOOLEAN: + sb.Append(prefix).AppendFormat("%s.writeBooleanArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_BYTE: + sb.Append(prefix).AppendFormat("%s.writeByteArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SHORT: + sb.Append(prefix).AppendFormat("%s.writeShortArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_INT: + case TypeKind::TYPE_FILEDESCRIPTOR: + sb.Append(prefix).AppendFormat("%s.writeIntArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_LONG: + sb.Append(prefix).AppendFormat("%s.writeLongArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_FLOAT: + sb.Append(prefix).AppendFormat("%s.writeFloatArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_DOUBLE: + sb.Append(prefix).AppendFormat("%s.writeDoubleArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_STRING: + sb.Append(prefix).AppendFormat("%s.writeStringArray(%s);\n", parcelName.string(), name.string()); + break; + case TypeKind::TYPE_SEQUENCEABLE: + sb.Append(prefix).AppendFormat("%s.writeSequenceableArray(%s);\n", parcelName.string(), name.string()); + break; + default: + break; + } +} + +void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; + + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), + elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 9518cc660..968b0c82d 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -62,7 +62,25 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: + void EmitJavaWriteArrayVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + AutoPtr elementType_; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_boolean_type.cpp b/tools/hdi-gen/ast/ast_boolean_type.cpp index 36cd2ff63..956854bb7 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.cpp +++ b/tools/hdi-gen/ast/ast_boolean_type.cpp @@ -161,5 +161,24 @@ void ASTBooleanType::EmitCppUnMarshalling(const String& parcelName, const String name.string(), parcelName.string()); } } + +void ASTBooleanType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeBoolean(%s);\n", parcelName.string(), name.string()); +} + +void ASTBooleanType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readBoolean();\n", name.string(), parcelName.string()); +} + +void ASTBooleanType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readBoolean();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_boolean_type.h b/tools/hdi-gen/ast/ast_boolean_type.h index f88890d22..ebc908022 100755 --- a/tools/hdi-gen/ast/ast_boolean_type.h +++ b/tools/hdi-gen/ast/ast_boolean_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTBOOLEANTYPE_H +#endif // OHOS_HDI_ASTBOOLEANTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_byte_type.cpp b/tools/hdi-gen/ast/ast_byte_type.cpp index 81f827ea4..fb114c3bc 100755 --- a/tools/hdi-gen/ast/ast_byte_type.cpp +++ b/tools/hdi-gen/ast/ast_byte_type.cpp @@ -158,5 +158,24 @@ void ASTByteType::EmitCppUnMarshalling(const String& parcelName, const String& n sb.Append(prefix).AppendFormat("%s = %s.ReadInt8();\n", name.string(), parcelName.string()); } } + +void ASTByteType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeByte(%s);\n", parcelName.string(), name.string()); +} + +void ASTByteType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readByte();\n", name.string(), parcelName.string()); +} + +void ASTByteType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readByte();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_byte_type.h b/tools/hdi-gen/ast/ast_byte_type.h index 8170cfeec..d5b2cda3e 100755 --- a/tools/hdi-gen/ast/ast_byte_type.h +++ b/tools/hdi-gen/ast/ast_byte_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTBYTETYPE_H +#endif // OHOS_HDI_ASTBYTETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_double_type.cpp b/tools/hdi-gen/ast/ast_double_type.cpp index 35c63e8dc..bf6820a4f 100755 --- a/tools/hdi-gen/ast/ast_double_type.cpp +++ b/tools/hdi-gen/ast/ast_double_type.cpp @@ -157,5 +157,24 @@ void ASTDoubleType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadDouble();\n", name.string(), parcelName.string()); } } + +void ASTDoubleType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeDouble(%s);\n", parcelName.string(), name.string()); +} + +void ASTDoubleType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readDouble();\n", name.string(), parcelName.string()); +} + +void ASTDoubleType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readDouble();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_double_type.h b/tools/hdi-gen/ast/ast_double_type.h index 33e9f9390..545482d8d 100755 --- a/tools/hdi-gen/ast/ast_double_type.h +++ b/tools/hdi-gen/ast/ast_double_type.h @@ -52,6 +52,15 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/ast/ast_fd_type.cpp b/tools/hdi-gen/ast/ast_fd_type.cpp index 3f0d70f8b..deb7b3e58 100755 --- a/tools/hdi-gen/ast/ast_fd_type.cpp +++ b/tools/hdi-gen/ast/ast_fd_type.cpp @@ -167,5 +167,24 @@ void ASTFdType::EmitCppUnMarshalling(const String& parcelName, const String& nam sb.Append(prefix).AppendFormat("%s = %s.ReadFileDescriptor();\n", name.string(), parcelName.string()); } } + +void ASTFdType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); +} + +void ASTFdType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", name.string(), parcelName.string()); +} + +void ASTFdType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_fd_type.h b/tools/hdi-gen/ast/ast_fd_type.h index ed775c804..ca6eed648 100755 --- a/tools/hdi-gen/ast/ast_fd_type.h +++ b/tools/hdi-gen/ast/ast_fd_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_FDTYPE_H +#endif // OHOS_HDI_FDTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_float_type.cpp b/tools/hdi-gen/ast/ast_float_type.cpp index 1d75ed457..b4dd45442 100755 --- a/tools/hdi-gen/ast/ast_float_type.cpp +++ b/tools/hdi-gen/ast/ast_float_type.cpp @@ -157,5 +157,24 @@ void ASTFloatType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadFloat();\n", name.string(), parcelName.string()); } } + +void ASTFloatType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeFloat(%s);\n", parcelName.string(), name.string()); +} + +void ASTFloatType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readFloat();\n", name.string(), parcelName.string()); +} + +void ASTFloatType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readFloat();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_float_type.h b/tools/hdi-gen/ast/ast_float_type.h index dee305533..cb0b07f57 100755 --- a/tools/hdi-gen/ast/ast_float_type.h +++ b/tools/hdi-gen/ast/ast_float_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTFLOATTYPE_H +#endif // OHOS_HDI_ASTFLOATTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_integer_type.cpp b/tools/hdi-gen/ast/ast_integer_type.cpp index 00f73158b..62d197513 100755 --- a/tools/hdi-gen/ast/ast_integer_type.cpp +++ b/tools/hdi-gen/ast/ast_integer_type.cpp @@ -157,5 +157,24 @@ void ASTIntegerType::EmitCppUnMarshalling(const String& parcelName, const String sb.Append(prefix).AppendFormat("%s = %s.ReadInt32();\n", name.string(), parcelName.string()); } } + +void ASTIntegerType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); +} + +void ASTIntegerType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", name.string(), parcelName.string()); +} + +void ASTIntegerType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_integer_type.h b/tools/hdi-gen/ast/ast_integer_type.h index aced58964..5ed7723bf 100755 --- a/tools/hdi-gen/ast/ast_integer_type.h +++ b/tools/hdi-gen/ast/ast_integer_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTINTEGERTYPE_H +#endif // OHOS_HDI_ASTINTEGERTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index ddd56c9a1..850f7f6c5 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -180,5 +180,28 @@ void ASTInterfaceType::EmitCppReadVar(const String& parcelName, const String& na name.string(), name_.string(), parcelName.string()); } } + +void ASTInterfaceType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s.asObject());\n", parcelName.string(), + name.string()); +} + +void ASTInterfaceType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub"); + sb.Append(prefix).AppendFormat("%s = %s.asInterface(%s.readRemoteObject());\n", + name.string(), stubName.string(), parcelName.string()); +} + +void ASTInterfaceType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + String stubName = name_.StartsWith("I") ? (name_.Substring(1) + "Stub") : (name_ + "Stub"); + sb.Append(prefix).AppendFormat("%s %s = %s.asInterface(%s.readRemoteObject());\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), stubName.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_interface_type.h b/tools/hdi-gen/ast/ast_interface_type.h index 52673d20c..7d3f11545 100755 --- a/tools/hdi-gen/ast/ast_interface_type.h +++ b/tools/hdi-gen/ast/ast_interface_type.h @@ -106,6 +106,15 @@ public: void EmitCppReadVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool initVariable, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: String license_; bool isOneWay_ = false; @@ -117,4 +126,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTINTERFACETYPE_H +#endif // OHOS_HDI_ASTINTERFACETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index 4c8392ed8..a634ae15c 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -110,7 +110,7 @@ void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, co void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { -String lenName = String::Format("%sLen", name.string()); + String lenName = String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, %s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( @@ -119,23 +119,9 @@ String lenName = String::Format("%sLen", name.string()); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n\n"); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } else { - sb.Append(prefix).AppendFormat("*%s = (%s*)OsalMemCalloc(sizeof(%s) * (*%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix).AppendFormat("if (*%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); - sb.Append(prefix).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String cpName = String::Format("%sCp", name.string()); @@ -166,6 +152,7 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, const String& prefix) const { String lenName = String::Format("%sLen", name.string()); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadUint32(%s, &%s)) {\n", parcelName.string(), lenName.string()); sb.Append(prefix + g_tab).AppendFormat( @@ -175,25 +162,10 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, sb.Append(prefix).Append("}\n\n"); sb.Append(prefix).AppendFormat("if (%s > 0) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", name.string(), - elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } else { - sb.Append(prefix + g_tab).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", - name.string(), elementType_->EmitCType().string(), elementType_->EmitCType().string(), - lenName.string()); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto errors;\n"); - sb.Append(prefix + g_tab).AppendFormat("}\n\n"); - } + EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); + sb.Append("\n"); sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sCp", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -358,5 +330,76 @@ void ASTListType::EmitCppUnMarshalling(const String& parcelName, const String& n } sb.Append(prefix).Append("}\n"); } + +void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); + + sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING + || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : + String::Format("%s[i]", varName.string()); + elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); + sb.Append(prefix + g_tab).Append("}\n"); + } + + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + if (isClient) { + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + } + + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); + sb.Append(prefix).AppendFormat("for (%s element : %s) {\n", + elementType_->EmitJavaType(TypeMode::NO_MODE).string(), name.string()); + elementType_->EmitJavaWriteVar(parcelName, "element", sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + elementType_->EmitJavaReadInnerVar(parcelName, "value", false, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = new Array%s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + elementType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + String lenVarName = isClient ? String::Format("*%s", lenName.string()) : lenName; + + sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemCalloc(sizeof(%s) * (%s));\n", varName.string(), + elementType_->EmitCType().string(), elementType_->EmitCType().string(), lenVarName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).AppendFormat("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index 02d5e3c05..fd90497e2 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -63,10 +63,25 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: + void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + AutoPtr elementType_ = nullptr; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTLISTTYPE_H +#endif // OHOS_HDI_ASTLISTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_long_type.cpp b/tools/hdi-gen/ast/ast_long_type.cpp index 7cf51b79a..fa0cd6f25 100755 --- a/tools/hdi-gen/ast/ast_long_type.cpp +++ b/tools/hdi-gen/ast/ast_long_type.cpp @@ -157,5 +157,24 @@ void ASTLongType::EmitCppUnMarshalling(const String& parcelName, const String& n sb.Append(prefix).AppendFormat("%s = %s.ReadInt64();\n", name.string(), parcelName.string()); } } + +void ASTLongType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeLong(%s);\n", parcelName.string(), name.string()); +} + +void ASTLongType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readLong();\n", name.string(), parcelName.string()); +} + +void ASTLongType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readLong();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_long_type.h b/tools/hdi-gen/ast/ast_long_type.h index 355302f76..130a4bbe5 100755 --- a/tools/hdi-gen/ast/ast_long_type.h +++ b/tools/hdi-gen/ast/ast_long_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTLONGTYPE_H +#endif // OHOS_HDI_ASTLONGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_map_type.cpp b/tools/hdi-gen/ast/ast_map_type.cpp index 999ae8417..4fcd823e8 100755 --- a/tools/hdi-gen/ast/ast_map_type.cpp +++ b/tools/hdi-gen/ast/ast_map_type.cpp @@ -129,5 +129,44 @@ void ASTMapType::EmitCppUnMarshalling(const String& parcelName, const String& na name.string(), KeyName.string(), valueName.string()); sb.Append(prefix).Append("}\n"); } + +void ASTMapType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); + sb.Append(prefix).AppendFormat("for (Map.Entry<%s, %s> entry : %s.entrySet()) {\n", + keyType_->EmitJavaType(TypeMode::NO_MODE, true).string(), + valueType_->EmitJavaType(TypeMode::NO_MODE, true).string(), name.string()); + keyType_->EmitJavaWriteVar(parcelName, "entry.getKey()", sb, prefix + g_tab); + valueType_->EmitJavaWriteVar(parcelName, "entry.getValue()", sb, prefix + g_tab); + sb.Append(prefix).Append("}\n"); +} + +void ASTMapType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + keyType_->EmitJavaReadInnerVar(parcelName, "key", false, sb, prefix + g_tab); + valueType_->EmitJavaReadInnerVar(parcelName, "value", false, sb, prefix + g_tab); + + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTMapType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = new Hash%s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); + + keyType_->EmitJavaReadInnerVar(parcelName, "key", true, sb, prefix + g_tab); + valueType_->EmitJavaReadInnerVar(parcelName, "value", true, sb, prefix + g_tab); + sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); + sb.Append(prefix).Append("}\n"); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_map_type.h b/tools/hdi-gen/ast/ast_map_type.h index 44c011a1e..b020d5998 100755 --- a/tools/hdi-gen/ast/ast_map_type.h +++ b/tools/hdi-gen/ast/ast_map_type.h @@ -59,6 +59,15 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; private: AutoPtr keyType_; AutoPtr valueType_; diff --git a/tools/hdi-gen/ast/ast_method.h b/tools/hdi-gen/ast/ast_method.h index fd157b22d..9b4a21d00 100755 --- a/tools/hdi-gen/ast/ast_method.h +++ b/tools/hdi-gen/ast/ast_method.h @@ -82,4 +82,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTMETHOD_H +#endif // OHOS_HDI_ASTMETHOD_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_namespace.h b/tools/hdi-gen/ast/ast_namespace.h index 26944c594..b3d6fc960 100755 --- a/tools/hdi-gen/ast/ast_namespace.h +++ b/tools/hdi-gen/ast/ast_namespace.h @@ -75,4 +75,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTNAMESPACE_H +#endif // OHOS_HDI_ASTNAMESPACE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_node.h b/tools/hdi-gen/ast/ast_node.h index 0aebbaafb..5f894f615 100755 --- a/tools/hdi-gen/ast/ast_node.h +++ b/tools/hdi-gen/ast/ast_node.h @@ -25,4 +25,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTNODE_H +#endif // OHOS_HDI_ASTNODE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.cpp b/tools/hdi-gen/ast/ast_parameter.cpp index 462b757e1..1e87e1b2b 100755 --- a/tools/hdi-gen/ast/ast_parameter.cpp +++ b/tools/hdi-gen/ast/ast_parameter.cpp @@ -215,5 +215,27 @@ void ASTParameter::EmitCWriteVar(const String& parcelName, const String& gotoLab type_->EmitCWriteVar(parcelName, name_, gotoLabel, sb, prefix); } + +void ASTParameter::EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const +{ + if (attribute_ == ParamAttr::PARAM_IN) { + type_->EmitJavaWriteVar(parcelName, name_, sb, prefix); + } else { + if (type_->GetTypeKind() == TypeKind::TYPE_ARRAY) { + sb.Append(prefix).AppendFormat("if (%s == null) {\n", name_.string()); + sb.Append(prefix + g_tab).AppendFormat("%s.writeInt(-1);\n", parcelName.string()); + sb.Append(prefix).Append("} else {\n"); + sb.Append(prefix + g_tab).AppendFormat("%s.writeInt(%s.length);\n", parcelName.string(), name_.string()); + sb.Append(prefix).Append("}\n"); + } + } +} + +void ASTParameter::EmitJavaReadVar(const String& parcelName, StringBuilder& sb, const String& prefix) const +{ + if (attribute_ == ParamAttr::PARAM_OUT) { + type_->EmitJavaReadVar(parcelName, name_, sb, prefix); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_parameter.h b/tools/hdi-gen/ast/ast_parameter.h index 6ecc35287..97e4cd226 100755 --- a/tools/hdi-gen/ast/ast_parameter.h +++ b/tools/hdi-gen/ast/ast_parameter.h @@ -70,6 +70,10 @@ public: void EmitCWriteVar(const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + + void EmitJavaWriteVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; + + void EmitJavaReadVar(const String& parcelName, StringBuilder& sb, const String& prefix) const; private: String name_; AutoPtr type_ = nullptr; @@ -78,4 +82,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTPARAMETER_H +#endif // OHOS_HDI_ASTPARAMETER_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_sequenceable_type.cpp b/tools/hdi-gen/ast/ast_sequenceable_type.cpp index fd44c9063..dac9ef18f 100755 --- a/tools/hdi-gen/ast/ast_sequenceable_type.cpp +++ b/tools/hdi-gen/ast/ast_sequenceable_type.cpp @@ -125,5 +125,40 @@ void ASTSequenceableType::EmitCppUnMarshalling(const String& parcelName, const S name.string(), parcelName.string(), name_.string()); } } + +void ASTSequenceableType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + if (EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s);\n", parcelName.string(), name.string()); + return; + } + sb.Append(prefix).AppendFormat("%s.writeSequenceable(%s);\n", parcelName.string(), name.string()); +} + +void ASTSequenceableType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + if (EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("%s = %s.readRemoteObject();\n", name.string(), parcelName.string()); + return; + } + sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); +} + +void ASTSequenceableType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + if (!isInner && EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { + sb.Append(prefix).AppendFormat("IRemoteObject %s = %s.readRemoteObject();\n", + name.string(), parcelName.string()); + return; + } + if (!isInner) { + sb.Append(prefix).AppendFormat("%s %s = new %s();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), EmitJavaType(TypeMode::NO_MODE).string()); + } + sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_sequenceable_type.h b/tools/hdi-gen/ast/ast_sequenceable_type.h index 92539424b..8a1b28261 100755 --- a/tools/hdi-gen/ast/ast_sequenceable_type.h +++ b/tools/hdi-gen/ast/ast_sequenceable_type.h @@ -44,8 +44,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSEQUENCEABLETYPE_H +#endif // OHOS_HDI_ASTSEQUENCEABLETYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_short_type.cpp b/tools/hdi-gen/ast/ast_short_type.cpp index 0b1c5e999..9f2b4eeaf 100755 --- a/tools/hdi-gen/ast/ast_short_type.cpp +++ b/tools/hdi-gen/ast/ast_short_type.cpp @@ -158,5 +158,24 @@ void ASTShortType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix).AppendFormat("%s = %s.ReadInt16();\n", name.string(), parcelName.string()); } } + +void ASTShortType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeShort(%s);\n", parcelName.string(), name.string()); +} + +void ASTShortType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readShort();\n", name.string(), parcelName.string()); +} + +void ASTShortType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readShort();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_short_type.h b/tools/hdi-gen/ast/ast_short_type.h index 51e5e2f59..1b5e7642b 100755 --- a/tools/hdi-gen/ast/ast_short_type.h +++ b/tools/hdi-gen/ast/ast_short_type.h @@ -52,8 +52,17 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSHORTTYPE_H +#endif // OHOS_HDI_ASTSHORTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_string_type.cpp b/tools/hdi-gen/ast/ast_string_type.cpp index 2e6cf5dfd..a3c891b16 100755 --- a/tools/hdi-gen/ast/ast_string_type.cpp +++ b/tools/hdi-gen/ast/ast_string_type.cpp @@ -163,5 +163,34 @@ void ASTStringType::EmitCppUnMarshalling(const String& parcelName, const String& name.string(), parcelName.string()); } } + +void ASTStringType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); +} + +void ASTStringType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s.writeString(%s);\n", parcelName.string(), name.string()); +} + +void ASTStringType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s = %s.readString();\n", name.string(), parcelName.string()); +} + +void ASTStringType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("%s %s = %s.readString();\n", + EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_string_type.h b/tools/hdi-gen/ast/ast_string_type.h index 828bfe6f8..55f670761 100755 --- a/tools/hdi-gen/ast/ast_string_type.h +++ b/tools/hdi-gen/ast/ast_string_type.h @@ -52,8 +52,20 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const override; + + void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const override; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTSTRINGTYPE_H +#endif // OHOS_HDI_ASTSTRINGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_struct_type.cpp b/tools/hdi-gen/ast/ast_struct_type.cpp index c56ce8d41..474c12d6f 100755 --- a/tools/hdi-gen/ast/ast_struct_type.cpp +++ b/tools/hdi-gen/ast/ast_struct_type.cpp @@ -249,5 +249,19 @@ void ASTStructType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } + +void ASTStructType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + String varName = isClient ? String::Format("*%s", name.string()) : name; + if (ownership) { + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", name_.string(), varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n", name_.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_struct_type.h b/tools/hdi-gen/ast/ast_struct_type.h index 7da3850f4..3eb3f2462 100755 --- a/tools/hdi-gen/ast/ast_struct_type.h +++ b/tools/hdi-gen/ast/ast_struct_type.h @@ -117,6 +117,9 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; private: bool isFull_ = false; bool isLite_ = false; diff --git a/tools/hdi-gen/ast/ast_type.cpp b/tools/hdi-gen/ast/ast_type.cpp index b6b158b46..61b859e83 100755 --- a/tools/hdi-gen/ast/ast_type.cpp +++ b/tools/hdi-gen/ast/ast_type.cpp @@ -232,5 +232,29 @@ void ASTType::EmitCppUnMarshalling(const String& parcelName, const String& name, { sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); } + +void ASTType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + // only String, Array, List, struct and union type need recycle memory +} + +void ASTType::EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Writeing \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); +} + +void ASTType::EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, + StringBuilder& sb, const String& prefix) const +{ + sb.Append(prefix).AppendFormat("//Reading \"%s\" type of data is not supported\n", name_.string()); +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_type.h b/tools/hdi-gen/ast/ast_type.h index f96725df8..7e8cdd4aa 100755 --- a/tools/hdi-gen/ast/ast_type.h +++ b/tools/hdi-gen/ast/ast_type.h @@ -151,6 +151,18 @@ public: virtual void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const; + + virtual void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaWriteVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaReadVar(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + + virtual void EmitJavaReadInnerVar(const String& parcelName, const String& name, bool isInner, StringBuilder& sb, + const String& prefix) const; protected: String name_; AutoPtr namespace_; @@ -159,4 +171,4 @@ protected: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTTYPE_H +#endif // OHOS_HDI_ASTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_uint_type.h b/tools/hdi-gen/ast/ast_uint_type.h index 80ae8f2e1..d33e9fcd4 100755 --- a/tools/hdi-gen/ast/ast_uint_type.h +++ b/tools/hdi-gen/ast/ast_uint_type.h @@ -56,4 +56,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTUINTTYPE_H +#endif // OHOS_HDI_ASTUINTTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_ulong_type.h b/tools/hdi-gen/ast/ast_ulong_type.h index a53dbbf04..9d616eb9b 100755 --- a/tools/hdi-gen/ast/ast_ulong_type.h +++ b/tools/hdi-gen/ast/ast_ulong_type.h @@ -56,4 +56,4 @@ public: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_ASTULONGTYPE_H +#endif // OHOS_HDI_ASTULONGTYPE_H \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index ee49a1c0f..ea1404f65 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -262,5 +262,17 @@ void ASTUnionType::EmitCppUnMarshalling(const String& parcelName, const String& sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); } + +void ASTUnionType::EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const +{ + if (ownership) { + String varName = isClient ? String::Format("*%s", name.string()) : name; + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", varName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = NULL;\n", varName.string()); + sb.Append(prefix).Append("}\n"); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_union_type.h b/tools/hdi-gen/ast/ast_union_type.h index bcd9acceb..951e08ba1 100755 --- a/tools/hdi-gen/ast/ast_union_type.h +++ b/tools/hdi-gen/ast/ast_union_type.h @@ -117,6 +117,9 @@ public: void EmitCppUnMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, bool emitType, unsigned int innerLevel = 0) const override; + + void EmitMemoryRecycle(const String& name, bool isClient, bool ownership, StringBuilder& sb, + const String& prefix) const override; private: bool isFull_ = false; bool isLite_ = false; diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp index 909d345d6..7ddbd0dbb 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceHeaderFile(); @@ -19,20 +39,8 @@ void CClientInterfaceCodeEmitter::EmitCode() void CClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h b/tools/hdi-gen/codegen/c_client_interface_code_emitter.h index edf0b2068..4a17f93f3 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CClientInterfaceCodeEmitter : public CCodeEmitter { public: - CClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CClientInterfaceCodeEmitter() : CCodeEmitter() {} virtual ~CClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitImportInclusions(StringBuilder& sb); @@ -39,4 +40,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H +#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index 98d984ed3..21f7e869c 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CClientProxyCodeEmitter::CClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sclient.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_proxy.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CClientProxyCodeEmitter::EmitCode() @@ -31,13 +43,7 @@ void CClientProxyCodeEmitter::EmitCode() void CClientProxyCodeEmitter::EmitCbProxyHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(proxyName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -69,20 +75,8 @@ void CClientProxyCodeEmitter::EmitCbProxyMethodsDcl(StringBuilder& sb) void CClientProxyCodeEmitter::EmitProxySourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.c", directory_.string(), FileName(proxyName_).string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(proxyName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(proxyName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -203,19 +197,10 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); sb.Append("\n"); - sb.Append(prefix + g_tab).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix + g_tab).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append("\n"); - - sb.Append(prefix + g_tab).Append("if (data == NULL || reply == NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); - sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab + g_tab).Append("goto finished;\n"); - sb.Append(prefix + g_tab).Append("}\n"); + EmitCreateBuf(sb, prefix + g_tab); sb.Append("\n"); String gotoName = GetGotLabel(method); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { @@ -241,19 +226,37 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth } } - EmitErrorHandle(method, sb, prefix); - + EmitErrorHandle(method, "errors", true, sb, prefix); sb.Append(prefix).Append("finished:\n"); - sb.Append(prefix + g_tab).Append("if (data != NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(data);\n"); - sb.Append(prefix + g_tab).Append("}\n"); - sb.Append(prefix + g_tab).Append("if (reply != NULL) {\n"); - sb.Append(prefix + g_tab + g_tab).Append("HdfSBufRecycle(reply);\n"); - sb.Append(prefix + g_tab).Append("}\n"); + EmitReleaseBuf(sb, prefix + g_tab); + sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append("}\n"); } +void CClientProxyCodeEmitter::EmitCreateBuf(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append("\n"); + + sb.Append(prefix).Append("if (data == NULL || reply == NULL) {\n"); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto finished;\n"); + sb.Append(prefix).Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitReleaseBuf(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).Append("if (data != NULL) {\n"); + sb.Append(prefix + g_tab).Append("HdfSBufRecycle(data);\n"); + sb.Append(prefix).Append("}\n"); + sb.Append(prefix).Append("if (reply != NULL) {\n"); + sb.Append(prefix + g_tab).Append("HdfSBufRecycle(reply);\n"); + sb.Append(prefix).Append("}\n"); +} + void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix) { @@ -308,110 +311,6 @@ String CClientProxyCodeEmitter::GetGotLabel(const AutoPtr& method) return labelName; } -void CClientProxyCodeEmitter::EmitErrorHandle(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - bool errorLabel = false; - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - AutoPtr paramType = param->GetType(); - if (param->GetAttribute() == ParamAttr::PARAM_OUT && - (paramType->GetTypeKind() == TypeKind::TYPE_STRING - || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY - || paramType->GetTypeKind() == TypeKind::TYPE_LIST - || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT - || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { - if (!errorLabel) { - sb.Append(prefix + g_tab).Append("goto finished;\n"); - sb.Append("\n"); - sb.Append(prefix).Append("errors:\n"); - errorLabel = true; - } - - EmitError(paramType, param->GetName(), sb, prefix + g_tab); - sb.Append("\n"); - } - } -} - -void CClientProxyCodeEmitter::EmitError(const AutoPtr& type, const String& name, StringBuilder& sb, - const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: - case TypeKind::TYPE_UNION: { - sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - String lenName = String::Format("%sLen", name.string()); - sb.Append(prefix).AppendFormat("if (*%s > 0 && *%s != NULL) {\n", lenName.string(), name.string()); - - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); - String elementName = String::Format("(*%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_LIST: { - String lenName = String::Format("%sLen", name.string()); - sb.Append(prefix).AppendFormat("if (*%s > 0 && *%s != NULL) {\n", lenName.string(), name.string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); - String elementName = String::Format("(*%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(*%s);\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("if (*%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("%sFree(*%s, true);\n", type->GetName().string(), name.string()); - sb.Append(prefix + g_tab).AppendFormat("*%s = NULL;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - default: - break; - } -} - void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) { String objName; diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 59b1ccaff..42f83cc69 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CClientProxyCodeEmitter : public CCodeEmitter { public: - CClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CClientProxyCodeEmitter() : CCodeEmitter() {} virtual ~CClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCbProxyHeaderFile(); void EmitProxySourceFile(); @@ -39,15 +41,15 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitCreateBuf(StringBuilder& sb, const String& prefix); + + void EmitReleaseBuf(StringBuilder& sb, const String& prefix); + void EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix); String GetGotLabel(const AutoPtr& method); - void EmitErrorHandle(const AutoPtr& method, StringBuilder& sb, const String& prefix); - - void EmitError(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); - void EmitProxyConstruction(StringBuilder&); void EmitProxyGetMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index b98e50c12..25edb7165 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -11,18 +11,32 @@ #include #include -#include "util/logger.h" - namespace OHOS { namespace HDI { -CCodeEmitter::CCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool CCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; + } + + EmitCode(); + return true; +} + +bool CCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; } - if (interface_ != nullptr) { + if (targetDirectory.Equals("")) { + return false; + } + + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; @@ -32,11 +46,33 @@ CCodeEmitter::CCodeEmitter(const AutoPtr& ast, const String& targetDirector stubName_ = infName_ + "Stub"; stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - ImplName_ = infName_ + "Service"; - ImplFullName_ = interface_->GetNamespace()->ToString() + ImplName_; - } else { + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; } String CCodeEmitter::FileName(const String& name) @@ -80,6 +116,42 @@ void CCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& par sb.Append(prefix).Append(parameter->EmitCParameter()); } +void CCodeEmitter::EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, + StringBuilder& sb, const String& prefix) +{ + if (!isClient) { + sb.Append(prefix).AppendFormat("%s:\n", gotoLabel.string()); + for (int i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr paramType = param->GetType(); + paramType->EmitMemoryRecycle(param->GetName(), isClient, true, sb, prefix + g_tab); + } + return; + } + + bool errorLabel = false; + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr paramType = param->GetType(); + if (param->GetAttribute() == ParamAttr::PARAM_OUT && + (paramType->GetTypeKind() == TypeKind::TYPE_STRING + || paramType->GetTypeKind() == TypeKind::TYPE_ARRAY + || paramType->GetTypeKind() == TypeKind::TYPE_LIST + || paramType->GetTypeKind() == TypeKind::TYPE_STRUCT + || paramType->GetTypeKind() == TypeKind::TYPE_UNION)) { + if (!errorLabel) { + sb.Append(prefix + g_tab).Append("goto finished;\n"); + sb.Append("\n"); + sb.Append(prefix).AppendFormat("%s:\n", gotoLabel.string()); + errorLabel = true; + } + + paramType->EmitMemoryRecycle(param->GetName(), isClient, true, sb, prefix + g_tab); + sb.Append("\n"); + } + } +} + void CCodeEmitter::EmitLicense(StringBuilder& sb) { if (ast_->GetLicense().IsEmpty()) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index d2a617575..997cf230e 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -20,30 +20,27 @@ namespace OHOS { namespace HDI { class CCodeEmitter : public LightRefCountBase { public: - CCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~CCodeEmitter() = default; - virtual void EmitCode() = 0; + bool OutPut(const AutoPtr& ast, const String& targetDirectory); - inline String GetSourceFile() - { - return sourceFileName_; - } + static String FileName(const String& name); +protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + void CleanData(); - static String FileName(const String& name); + virtual bool ResolveDirectory(const String& targetDirectory) = 0; -protected: + virtual void EmitCode() = 0; void EmitInterfaceMethodCommands(StringBuilder& sb); void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); + void EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, StringBuilder& sb, + const String& prefix); + void EmitLicense(StringBuilder& sb); void EmitHeadMacro(StringBuilder& sb, const String& fullName); @@ -69,11 +66,9 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; @@ -82,10 +77,10 @@ protected: String proxyFullName_; String stubName_; String stubFullName_; - String ImplName_; - String ImplFullName_; + String implName_; + String implFullName_; }; } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CODE_EMITTER_H +#endif // OHOS_HDI_C_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.cpp b/tools/hdi-gen/codegen/c_code_generator.cpp index 2fadd06aa..1ff73ae37 100755 --- a/tools/hdi-gen/codegen/c_code_generator.cpp +++ b/tools/hdi-gen/codegen/c_code_generator.cpp @@ -22,63 +22,45 @@ namespace OHOS { namespace HDI { -const char* CCodeGenerator::TAG = "CCodeGenerator"; - -bool CCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool CCodeGenerator::Generate() { - ast_ = ast; - targetDirectory_ = targetDirectory; - - if (!ResolveDirectory()) { - return false; - } - - if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - AutoPtr customTypesCodeEmitter = new CCustomTypesCodeEmitter(ast_, targetDirectory_); - emitters_.push_back(customTypesCodeEmitter); - return true; - } - - AutoPtr clientInterfaceCodeEmitter = new CClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new CClientProxyCodeEmitter(ast_, targetDirectory_); - - AutoPtr serviceInterfaceCodeEmitter = new CServiceInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceDriverCodeEmitter = new CServiceDriverCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceStubCodeEmitter = new CServiceStubCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceImplCodeEmitter = new CServiceImplCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - emitters_.push_back(serviceInterfaceCodeEmitter); - emitters_.push_back(serviceDriverCodeEmitter); - emitters_.push_back(serviceStubCodeEmitter); - emitters_.push_back(serviceImplCodeEmitter); + Initializate(); - return true; -} - -bool CCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + emitters_["types"]->OutPut(ast, targetDirectory_); + break; + } + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + emitters_["serviceIface"]->OutPut(ast, targetDirectory_); + emitters_["driver"]->OutPut(ast, targetDirectory_); + emitters_["stub"]->OutPut(ast, targetDirectory_); + emitters_["impl"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool CCodeGenerator::ResolveDirectory() +void CCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), CCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"types", new CCustomTypesCodeEmitter()}, + {"clientIface", new CClientInterfaceCodeEmitter()}, + {"proxy", new CClientProxyCodeEmitter()}, + {"serviceIface", new CServiceInterfaceCodeEmitter()}, + {"driver", new CServiceDriverCodeEmitter()}, + {"stub", new CServiceStubCodeEmitter()}, + {"impl", new CServiceImplCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.h b/tools/hdi-gen/codegen/c_code_generator.h index bfdd046de..b878a2a98 100755 --- a/tools/hdi-gen/codegen/c_code_generator.h +++ b/tools/hdi-gen/codegen/c_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class CCodeGenerator : public CodeGenerator { public: - CCodeGenerator() : CodeGenerator(), - emitters_() {} + using CCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + + CCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} virtual ~CCodeGenerator() = default; - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + CCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index aba22f4ff..4e8f66b28 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -8,9 +8,25 @@ #include "codegen/c_custom_types_code_emitter.h" #include "util/file.h" +#include "util/logger.h" namespace OHOS { namespace HDI { +bool CCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() != ASTFileType::AST_TYPES) { + return false; + } + + directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CCustomTypesCodeEmitter::EmitCode() { EmitCustomTypesHeaderFile(); @@ -21,7 +37,6 @@ void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -136,7 +151,6 @@ void CCustomTypesCodeEmitter::EmitCustomTypesSourceFile() { String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -223,144 +237,80 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, for (size_t i = 0; i < type->GetMemberNumber(); i++) { AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - - if (memberType->GetTypeKind() == TypeKind::TYPE_STRING) { - String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", name.string()); - sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - String paramName = String::Format("&%s", name.string()); - memberType->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_UNION) { - String tmpName = String::Format("%sCp", memberName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", - name.string(), memberType->EmitCType().string(), - tmpName.string(), memberType->EmitCType().string()); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY) { - String tmpName = String::Format("%sCp", memberName.string()); - AutoPtr arrayType = dynamic_cast(memberType.Get()); - AutoPtr elementType = arrayType->GetElementType(); - sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); - sb.Append("\n"); - } else if (memberType->GetTypeKind() == TypeKind::TYPE_LIST) { - String tmpName = String::Format("%sCp", memberName.string()); - AutoPtr listType = dynamic_cast(memberType.Get()); - AutoPtr elementType = listType->GetElementType(); - sb.Append(g_tab).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); - memberType->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = %s;\n", name.string(), tmpName.string()); - sb.Append(g_tab).AppendFormat("%sLen = %sLen;\n", name.string(), tmpName.string()); - sb.Append("\n"); - } else { - memberType->EmitCUnMarshalling(name, sb, g_tab, freeObjStatements_); - sb.Append("\n"); - } + EmitMemberUnmarshalling(memberType, objName, type->GetMemberName(i), sb, g_tab); } sb.Append(g_tab).AppendFormat("return true;\n"); sb.Append("errors:\n"); - for (size_t i = 0; i < type->GetMemberNumber(); i++) { - AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitError(name, memberType, sb, g_tab); - } + EmitCustomTypeMemoryRecycle(type, objName, sb, g_tab); sb.Append(g_tab).Append("return false;\n"); sb.Append("}\n"); } - -void CCustomTypesCodeEmitter::EmitError(const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix) +void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& type, const String& name, + const String& memberName, StringBuilder& sb, const String& prefix) { + String varName = String::Format("%s->%s", name.string(), memberName.string()); switch (type->GetTypeKind()) { case TypeKind::TYPE_STRING: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); + String tmpName = String::Format("%sCp", memberName.string()); + type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); break; } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - String lenName = String::Format("%sLen", name.string()); - - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("(%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", - elementType->GetName().string(), elementName.string()); - } - - sb.Append(prefix + g_tab).Append("}\n"); - } - - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n"); + case TypeKind::TYPE_STRUCT: { + String paramName = String::Format("&%s", varName.string()); + type->EmitCUnMarshalling(paramName, sb, g_tab, freeObjStatements_); sb.Append("\n"); break; } - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - String lenName = String::Format("%sLen", name.string()); - - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("(%s)[i]", name.string()); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(&(%s), false);\n", - elementType->GetName().string(), elementName.string()); - } - - sb.Append(prefix + g_tab).Append("}\n"); - } - - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n"); + case TypeKind::TYPE_UNION: { + String tmpName = String::Format("%sCp", memberName.string()); + type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); + sb.Append(g_tab).AppendFormat("(void)memcpy_s(&%s, sizeof(%s), %s, sizeof(%s));\n", + varName.string(), type->EmitCType().string(), + tmpName.string(), type->EmitCType().string()); sb.Append("\n"); break; } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n", type->GetName().string(), name.string()); - sb.Append(prefix).Append("\n"); + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: { + EmitArrayMemberUnmarshalling(type, memberName, varName, sb, g_tab); + sb.Append("\n"); break; } - default: - break; + default: { + type->EmitCUnMarshalling(varName, sb, g_tab, freeObjStatements_); + sb.Append("\n"); + } } } +void CCustomTypesCodeEmitter::EmitArrayMemberUnmarshalling(const AutoPtr& type, const String& memberName, + const String& varName, StringBuilder& sb, const String& prefix) +{ + String tmpName = String::Format("%sCp", memberName.string()); + AutoPtr elementType = nullptr; + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY) { + AutoPtr arrayType = dynamic_cast(type.Get()); + elementType = arrayType->GetElementType(); + } else { + AutoPtr listType = dynamic_cast(type.Get()); + elementType = listType->GetElementType(); + } + + sb.Append(prefix).AppendFormat("%s* %s = NULL;\n", elementType->EmitCType().string(), tmpName.string()); + sb.Append(prefix).AppendFormat("uint32_t %sLen = 0;\n", tmpName.string()); + type->EmitCUnMarshalling(tmpName, sb, prefix, freeObjStatements_); + sb.Append(prefix).AppendFormat("%s = %s;\n", varName.string(), tmpName.string()); + sb.Append(prefix).AppendFormat("%sLen = %sLen;\n", varName.string(), tmpName.string()); +} + void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type) { String objName("dataBlock"); @@ -372,74 +322,32 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - for (size_t i = 0; i < type->GetMemberNumber(); i++) { - AutoPtr memberType = type->GetMemberType(i); - String memberName = type->GetMemberName(i); - String name = String::Format("%s->%s", objName.string(), memberName.string()); - EmitCustomTypeMemberFree(sb, name, memberType, g_tab); - } + EmitCustomTypeMemoryRecycle(type, objName, sb, g_tab); sb.Append(g_tab).Append("if (freeSelf) {\n"); sb.Append(g_tab).Append(g_tab).Append("OsalMemFree(dataBlock);\n"); sb.Append(g_tab).Append("}\n"); - sb.Append("}\n"); } -void CCustomTypesCodeEmitter::EmitCustomTypeMemberFree(StringBuilder& sb, const String& name, - const AutoPtr& type, const String& prefix) +void CCustomTypesCodeEmitter::EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, + StringBuilder& sb, const String& prefix) { - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", name.string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", - elementType->GetName().string(), name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%sLen > 0 && %s != NULL) {\n", name.string(), name.string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("OsalMemFree(%s[i]);\n", name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%sFree(%s, false);\n", - elementType->GetName().string(), name.string()); - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", name.string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("%sFree(&%s, false);\n\n", type->GetName().string(), name.string()); - break; + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + String memberName = type->GetMemberName(i); + String varName = String::Format("%s->%s", name.string(), memberName.string()); + switch (memberType->GetTypeKind()) { + case TypeKind::TYPE_STRING: + case TypeKind::TYPE_STRUCT: + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: + memberType->EmitMemoryRecycle(varName, false, false, sb, prefix); + sb.Append("\n"); + break; + default: + break; } - default: - break; } } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h index 2473df8a1..6ae5e3a2b 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CCustomTypesCodeEmitter : public CCodeEmitter { public: - CCustomTypesCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CCustomTypesCodeEmitter() : CCodeEmitter() {} virtual ~CCustomTypesCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCustomTypesHeaderFile(); void EmitHeaderInclusions(StringBuilder& sb); @@ -50,11 +51,15 @@ private: void EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, const AutoPtr& type); - void EmitError(const String& name, const AutoPtr& type, StringBuilder& sb, const String& prefix); + void EmitMemberUnmarshalling(const AutoPtr& type, const String& name, const String& memberName, + StringBuilder& sb, const String& prefix); + + void EmitArrayMemberUnmarshalling(const AutoPtr& type, const String& memberName, const String& varName, + StringBuilder& sb, const String& prefix); void EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type); - void EmitCustomTypeMemberFree(StringBuilder& sb, const String& name, const AutoPtr& type, + void EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); std::vector freeObjStatements_; @@ -62,4 +67,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_C_CUSTOM_TYPES_CODE_EMITTER_H +#endif // OHOS_HDI_C_CUSTOM_TYPES_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index 7aa2954d3..3fda364fb 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -12,12 +12,19 @@ namespace OHOS { namespace HDI { -CServiceDriverCodeEmitter::CServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_driver.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() != ASTFileType::AST_IFACE) { + return false; + } + + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceDriverCodeEmitter::EmitCode() @@ -30,20 +37,8 @@ void CServiceDriverCodeEmitter::EmitCode() void CServiceDriverCodeEmitter::EmitDriverSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(infName_ + "Driver").string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Driver").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Driver").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h index 02a0aab74..c4582f276 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CServiceDriverCodeEmitter : public CCodeEmitter { public: - - CServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceDriverCodeEmitter() : CCodeEmitter() {} virtual ~CServiceDriverCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitDriverSourceFile(); void EmitDriverIncluions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index b5c899dbb..f483b2741 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CServiceImplCodeEmitter::CServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_service.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceImplCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceImplCodeEmitter::EmitCode() @@ -31,17 +43,11 @@ void CServiceImplCodeEmitter::EmitCode() void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); - EmitHeadMacro(sb, ImplFullName_); + EmitHeadMacro(sb, implFullName_); sb.Append("\n"); sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); sb.Append("\n"); @@ -51,7 +57,7 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() sb.Append("\n"); EmitTailExternC(sb); sb.Append("\n"); - EmitTailMacro(sb, ImplFullName_); + EmitTailMacro(sb, implFullName_); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -66,20 +72,8 @@ void CServiceImplCodeEmitter::EmitServiceImplConstructDecl(StringBuilder& sb) void CServiceImplCodeEmitter::EmitServiceImplSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(infName_ + "Service").string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Service").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(infName_ + "Service").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h index 99cc5ca1a..1ab5fb5e6 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CServiceImplCodeEmitter : public CCodeEmitter { public: - CServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceImplCodeEmitter() : CCodeEmitter() {} virtual ~CServiceImplCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitServiceImplHeaderFile(); void EmitServiceImplConstructDecl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp index 522e81d7f..01bcf358d 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CServiceInterfaceCodeEmitter::EmitCode() { if (!isCallbackInterface()) { @@ -21,20 +41,8 @@ void CServiceInterfaceCodeEmitter::EmitCode() void CServiceInterfaceCodeEmitter::EmitInterfaceHeadrFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h b/tools/hdi-gen/codegen/c_service_interface_code_emitter.h index b1b6f7a95..02f5db789 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CServiceInterfaceCodeEmitter : public CCodeEmitter { public: - CServiceInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CCodeEmitter(ast, targetDirectory) {} + CServiceInterfaceCodeEmitter() : CCodeEmitter() {} virtual ~CServiceInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeadrFile(); void EmitImportInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index 0613842fb..e8c6996cc 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -13,12 +13,24 @@ namespace OHOS { namespace HDI { -CServiceStubCodeEmitter::CServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CCodeEmitter(ast, targetDirectory) +bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_stub.c", FileName(infFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CServiceStubCodeEmitter::EmitCode() @@ -32,13 +44,7 @@ void CServiceStubCodeEmitter::EmitCode() void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(stubName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -69,20 +75,8 @@ void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb) void CServiceStubCodeEmitter::EmitServiceStubSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.c", directory_.string(), FileName(stubName_).string()); - } else { - filePath = String::Format("%s%s.c", directory_.string(), FileName(stubName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.c", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -115,7 +109,7 @@ void CServiceStubCodeEmitter::EmitServiceStubInclusions(StringBuilder& sb) sb.AppendFormat("#include \"%s.h\"\n", FileName(stubFullName_).string()); EmitServiceStubStdlibInclusions(sb); sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(ImplName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); } } @@ -175,25 +169,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr } } - if (method->GetParameterNumber() == 0) { - sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); - if (i + 1 < method->GetParameterNumber()) { - sb.Append(", "); - } - } - sb.AppendFormat(");\n", method->GetName().string()); - } - - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); - sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoName.string()); - sb.Append(prefix + g_tab).Append("}\n"); + EmitStubCallMethod(method, gotoName, sb, prefix + g_tab); sb.Append("\n"); for (int i = 0; i < method->GetParameterNumber(); i++) { @@ -204,12 +180,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr } } - sb.Append(prefix).AppendFormat("%s:\n", gotoName.string()); - for (int i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitError(param, sb, prefix + g_tab); - } - + EmitErrorHandle(method, gotoName, false, sb, prefix); sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append(prefix).Append("}\n"); } @@ -264,6 +235,30 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr& method, const String& gotoLabel, + StringBuilder& sb, const String& prefix) +{ + if (method->GetParameterNumber() == 0) { + sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl);\n", method->GetName().string()); + } else { + sb.Append(prefix).AppendFormat("ec = serviceImpl->%s(serviceImpl, ", method->GetName().string()); + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + EmitCallParameter(sb, param->GetType(), param->GetAttribute(), param->GetName()); + if (i + 1 < method->GetParameterNumber()) { + sb.Append(", "); + } + } + sb.AppendFormat(");\n", method->GetName().string()); + } + + sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: call %s function failed!\", __func__);\n", method->GetName().string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); +} + void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name) { @@ -280,83 +275,6 @@ void CServiceStubCodeEmitter::EmitCallParameter(StringBuilder& sb, const AutoPtr } } -void CServiceStubCodeEmitter::EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: - case TypeKind::TYPE_UNION: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - String lenName = String::Format("%sLen", param->GetName().string()); - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", - lenName.string(), param->GetName().string()); - - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("%s[i]", param->GetName().string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - break; - } - case TypeKind::TYPE_LIST: { - String lenName = String::Format("%sLen", param->GetName().string()); - sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", - lenName.string(), param->GetName().string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING - || elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); - String elementName = String::Format("%s[i]", param->GetName().string()); - if (elementType->GetTypeKind() == TypeKind::TYPE_STRING) { - sb.Append(prefix + g_tab + g_tab).AppendFormat("if (%s != NULL) {\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("OsalMemFree(%s);\n", elementName.string()); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - } else if (elementType->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("%sFree(&%s, false);\n", - elementType->GetName().string(), elementName.string()); - } - sb.Append(prefix + g_tab).Append("}\n"); - } - sb.Append(prefix + g_tab).AppendFormat("OsalMemFree(%s);\n", param->GetName().string()); - sb.Append(prefix).Append("}\n"); - sb.Append("\n"); - break; - } - case TypeKind::TYPE_STRUCT: { - sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).AppendFormat("%sFree(%s, true);\n", - type->GetName().string(), param->GetName().string()); - sb.Append(prefix).Append("}\n\n"); - break; - } - default: - break; - } -} - void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { String codeName; diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 46068709b..6d24f5ee9 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -15,12 +15,13 @@ namespace OHOS { namespace HDI { class CServiceStubCodeEmitter : public CCodeEmitter { public: - CServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CServiceStubCodeEmitter() : CCodeEmitter() {} virtual ~CServiceStubCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: void EmitCbServiceStubHeaderFile(); @@ -41,9 +42,10 @@ private: void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); - void EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name); + void EmitStubCallMethod(const AutoPtr& method, const String& gotoLabel, StringBuilder& sb, + const String& prefix); - void EmitError(const AutoPtr& param, StringBuilder& sb, const String& prefix); + void EmitCallParameter(StringBuilder& sb, const AutoPtr& type, ParamAttr attribute, const String& name); void EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index 93ba77600..9e001033c 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -9,26 +9,21 @@ #ifndef OHOS_HDI_CODEGENERATOR_H #define OHOS_HDI_CODEGENERATOR_H -#include "ast/ast.h" +#include "ast/ast_module.h" namespace OHOS { namespace HDI { class CodeGenerator : public LightRefCountBase { public: - CodeGenerator() : LightRefCountBase(), - targetDirectory_(), - ast_(nullptr) {} + CodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : LightRefCountBase(), astModule_(astModule), targetDirectory_(targetDirectory) {} virtual ~CodeGenerator() = default; - virtual bool Initializate(const AutoPtr& ast, const String& targetDirectory) = 0; - - virtual bool Generate() const = 0; + virtual bool Generate() = 0; protected: - virtual bool ResolveDirectory() = 0; - + AutoPtr astModule_; String targetDirectory_; - AutoPtr ast_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp index 0d2a37694..bb8941be9 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CppClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceHeaderFile(); @@ -19,20 +39,8 @@ void CppClientInterfaceCodeEmitter::EmitCode() void CppClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h index 27e5662de..a573ff3af 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppClientInterfaceCodeEmitter : public CppCodeEmitter { public: - CppClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppClientInterfaceCodeEmitter() : CppCodeEmitter() {} virtual ~CppClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitClientInfHeadMacro(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index aa09a8704..5ba2bf294 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -13,12 +13,24 @@ namespace OHOS { namespace HDI { -CppClientProxyCodeEmitter::CppClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String proxyName = String::Format("%sclient.%s", - interface_->GetNamespace()->ToString().string(), proxyName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(proxyName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientProxyCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppClientProxyCodeEmitter::EmitCode() @@ -29,20 +41,8 @@ void CppClientProxyCodeEmitter::EmitCode() void CppClientProxyCodeEmitter::EmitProxyHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sclient/%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientProxyCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Proxy").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -142,20 +142,8 @@ void CppClientProxyCodeEmitter::EmitProxyMethodParameter(const AutoPtr remote = servMgr->GetService(\"%sService\");\n", - infName_.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat( + "sptr remote = servMgr->GetService(\"%sService\");\n", infName_.string()); sb.Append(prefix + g_tab + g_tab).Append("if (remote != nullptr) {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return iface_cast<%s>(remote);\n", interface_->GetName().string()); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index 9e97982e7..2ab597f34 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CppClientProxyCodeEmitter : public CppCodeEmitter { public: - CppClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppClientProxyCodeEmitter() : CppCodeEmitter() {} virtual ~CppClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitProxyHeaderFile(); void EmitProxyHeadrInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index c788b7ad1..a0b6d11b5 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -12,16 +12,34 @@ #include #include +#include "util/logger.h" + namespace OHOS { namespace HDI { -CppCodeEmitter::CppCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool CppCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; + } + + EmitCode(); + return true; +} + +bool CppCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; + } + + if (targetDirectory.Equals("")) { + return false; } - if (interface_ != nullptr) { + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; @@ -31,11 +49,33 @@ CppCodeEmitter::CppCodeEmitter(const AutoPtr& ast, const String& targetDire stubName_ = infName_ + "Stub"; stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - ImplName_ = infName_ + "Service"; - ImplFullName_ = interface_->GetNamespace()->ToString() + ImplName_; - } else { + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CppCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; } String CppCodeEmitter::FileName(const String& name) diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index 1a730c62c..127161dcc 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -19,24 +19,19 @@ namespace OHOS { namespace HDI { class CppCodeEmitter : public LightRefCountBase { public: - CppCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~CppCodeEmitter() = default; - virtual void EmitCode() = 0; - - inline String GetSourceFile() - { - return sourceFileName_; - } - - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + bool OutPut(const AutoPtr& ast, const String& targetDirectory); static String FileName(const String& name); protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix); @@ -83,11 +78,9 @@ protected: String SpecificationParam(StringBuilder& sb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; @@ -96,8 +89,8 @@ protected: String proxyFullName_; String stubName_; String stubFullName_; - String ImplName_; - String ImplFullName_; + String implName_; + String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_code_generator.cpp b/tools/hdi-gen/codegen/cpp_code_generator.cpp index 01452799b..7adb9e7a9 100755 --- a/tools/hdi-gen/codegen/cpp_code_generator.cpp +++ b/tools/hdi-gen/codegen/cpp_code_generator.cpp @@ -22,63 +22,45 @@ namespace OHOS { namespace HDI { -const char* CppCodeGenerator::TAG = "CppCodeGenerator"; - -bool CppCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool CppCodeGenerator::Generate() { - ast_ = ast; - targetDirectory_ = targetDirectory; - - if (!ResolveDirectory()) { - return false; - } - - if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - AutoPtr customTypesCodeEmitter = new CppCustomTypesCodeEmitter(ast_, targetDirectory_); - emitters_.push_back(customTypesCodeEmitter); - return true; - } - - AutoPtr clientInterfaceCodeEmitter = new CppClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new CppClientProxyCodeEmitter(ast_, targetDirectory_); - - AutoPtr serviceInterfaceCodeEmitter = new CppServiceInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceDriverCodeEmitter = new CppServiceDriverCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceStubCodeEmitter = new CppServiceStubCodeEmitter(ast_, targetDirectory_); - AutoPtr serviceImplCodeEmitter = new CppServiceImplCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - emitters_.push_back(serviceInterfaceCodeEmitter); - emitters_.push_back(serviceDriverCodeEmitter); - emitters_.push_back(serviceStubCodeEmitter); - emitters_.push_back(serviceImplCodeEmitter); + Initializate(); - return true; -} - -bool CppCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + emitters_["types"]->OutPut(ast, targetDirectory_); + break; + } + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + emitters_["serviceIface"]->OutPut(ast, targetDirectory_); + emitters_["driver"]->OutPut(ast, targetDirectory_); + emitters_["stub"]->OutPut(ast, targetDirectory_); + emitters_["impl"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool CppCodeGenerator::ResolveDirectory() +void CppCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), CppCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"types", new CppCustomTypesCodeEmitter()}, + {"clientIface", new CppClientInterfaceCodeEmitter()}, + {"proxy", new CppClientProxyCodeEmitter()}, + {"serviceIface", new CppServiceInterfaceCodeEmitter()}, + {"driver", new CppServiceDriverCodeEmitter()}, + {"stub", new CppServiceStubCodeEmitter()}, + {"impl", new CppServiceImplCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_code_generator.h b/tools/hdi-gen/codegen/cpp_code_generator.h index 3a36abf3b..5adc37ed4 100755 --- a/tools/hdi-gen/codegen/cpp_code_generator.h +++ b/tools/hdi-gen/codegen/cpp_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class CppCodeGenerator : public CodeGenerator { public: - CppCodeGenerator() : CodeGenerator(), - emitters_() {} + using CppCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - ~CppCodeGenerator() override {}; + CppCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + ~CppCodeGenerator() = default; + + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + CppCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index 9a56dec8d..f6a6d1d4b 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -12,6 +12,21 @@ namespace OHOS { namespace HDI { +bool CppCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() != ASTFileType::AST_TYPES) { + return false; + } + + directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CppCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppCustomTypesCodeEmitter::EmitCode() { EmitCustomTypesHeaderFile(); @@ -23,7 +38,6 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); String marcoName = String::Format("%s.%s", ast_->GetPackageName().string(), infName_.string()); - StringBuilder sb; EmitLicense(sb); @@ -171,7 +185,6 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesSourceFile() { String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h index d8e3be78f..c311c756b 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppCustomTypesCodeEmitter : public CppCodeEmitter { public: - CppCustomTypesCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppCustomTypesCodeEmitter() : CppCodeEmitter() {} virtual ~CppCustomTypesCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitCustomTypesHeaderFile(); void EmitHeaderFileInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 53190e880..1c5dacf16 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -12,12 +12,19 @@ namespace OHOS { namespace HDI { -CppServiceDriverCodeEmitter::CppServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String infFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), infName_.string()); - sourceFileName_ = String::Format("%s_driver.cpp", FileName(infFullName).string()); + if (ast_->GetASTFileType() != ASTFileType::AST_IFACE) { + return false; + } + + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceDriverCodeEmitter::EmitCode() @@ -30,14 +37,8 @@ void CppServiceDriverCodeEmitter::EmitCode() void CppServiceDriverCodeEmitter::EmitDriverSourceFile() { - String filePath = String::Format("%sserver/%s.cpp", directory_.string(), FileName(infName_ + "Driver").string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_ + "Driver").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h index 2d67cbf27..f552b32c4 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.h @@ -15,12 +15,14 @@ namespace OHOS { namespace HDI { class CppServiceDriverCodeEmitter : public CppCodeEmitter { public: - CppServiceDriverCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppServiceDriverCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceDriverCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitDriverSourceFile(); void EmitDriverIncluions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index 05b86fa32..e06b157ad 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CppServiceImplCodeEmitter::CppServiceImplCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String ImplFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), ImplName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(ImplFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceImplCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceImplCodeEmitter::EmitCode() @@ -28,30 +40,18 @@ void CppServiceImplCodeEmitter::EmitCode() void CppServiceImplCodeEmitter::EmitImplHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(infName_ + "Service").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceImplCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Service").string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); - EmitHeadMacro(sb, ImplFullName_); + EmitHeadMacro(sb, implFullName_); sb.Append("\n"); EmitServiceImplInclusions(sb); sb.Append("\n"); EmitServiceImplDecl(sb); sb.Append("\n"); - EmitTailMacro(sb, ImplFullName_); + EmitTailMacro(sb, implFullName_); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -134,20 +134,8 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodDecl(const AutoPtr& ast, const String& targetDirectory); + CppServiceImplCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceImplCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitImplHeaderFile(); void EmitServiceImplInclusions(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp index bf27cce01..03dbe5bd9 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp @@ -12,6 +12,26 @@ namespace OHOS { namespace HDI { +bool CppServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void CppServiceInterfaceCodeEmitter::EmitCode() { if (!isCallbackInterface()) { @@ -21,20 +41,8 @@ void CppServiceInterfaceCodeEmitter::EmitCode() void CppServiceInterfaceCodeEmitter::EmitInterfaceHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(interfaceName_).string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h index 7e648887e..8a6d8c2ef 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h @@ -15,13 +15,14 @@ namespace OHOS { namespace HDI { class CppServiceInterfaceCodeEmitter : public CppCodeEmitter { public: - CppServiceInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : CppCodeEmitter(ast, targetDirectory) {} + CppServiceInterfaceCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitInterfaceHeaderFile(); void EmitServiceInfHeadMacro(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index bffb79c89..a2bfac6bf 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -12,12 +12,24 @@ namespace OHOS { namespace HDI { -CppServiceStubCodeEmitter::CppServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :CppCodeEmitter(ast, targetDirectory) +bool CppServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - String stubFullName = String::Format("%sserver.%s", - interface_->GetNamespace()->ToString().string(), stubName_.string()); - sourceFileName_ = String::Format("%s.cpp", FileName(stubFullName).string()); + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; } void CppServiceStubCodeEmitter::EmitCode() @@ -28,20 +40,8 @@ void CppServiceStubCodeEmitter::EmitCode() void CppServiceStubCodeEmitter::EmitStubHeaderFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.h", directory_.string(), FileName(infName_ + "Stub").string()); - } else { - filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_ + "Stub").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.h", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -196,20 +196,8 @@ void CppServiceStubCodeEmitter::EmitStubExternalsMethodsDel(StringBuilder& sb) void CppServiceStubCodeEmitter::EmitStubSourceFile() { - String filePath; - if (!isCallbackInterface()) { - filePath = String::Format("%sserver/%s.cpp", directory_.string(), FileName(infName_ + "Stub").string()); - } else { - filePath = String::Format("%s%s.cpp", directory_.string(), FileName(infName_ + "Stub").string()); - } - - if (!File::CreateParentDir(filePath)) { - Logger::E("CppServiceStubCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.cpp", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -290,34 +278,8 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met } } - if (method->GetParameterNumber() == 0) { - if (!isCallbackInterface()) { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s();\n", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s();\n", method->GetName().string()); - } - } else { - if (!isCallbackInterface()) { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); - } else { - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = %s(", method->GetName().string()); - } - - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - sb.Append(param->GetName()); - if (i + 1 < method->GetParameterNumber()) { - sb.Append(", "); - } - } - sb.Append(");\n"); - } - - sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); - sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); - sb.Append(prefix + g_tab).Append("}\n\n"); + EmitStubCallMethod(method, sb, prefix + g_tab); + sb.Append("\n"); if (!method->IsOneWay()) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { @@ -333,6 +295,30 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met sb.Append("}\n"); } +void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, + const String& prefix) +{ + if (!isCallbackInterface()) { + sb.Append(prefix).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); + } else { + sb.Append(prefix).AppendFormat("int32_t ec = %s(", method->GetName().string()); + } + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + sb.Append(param->GetName()); + if (i + 1 < method->GetParameterNumber()) { + sb.Append(", "); + } + } + sb.Append(");\n"); + + sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); + sb.Append(prefix + g_tab).Append("return ec;\n"); + sb.Append(prefix).Append("}\n"); +} + void CppServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { sb.Append(prefix).AppendFormat("int32_t %s::%sOnRemoteRequest(int cmdId,\n", diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h index 12f7ce1af..a403a30b2 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h @@ -15,12 +15,13 @@ namespace OHOS { namespace HDI { class CppServiceStubCodeEmitter : public CppCodeEmitter { public: - CppServiceStubCodeEmitter(const AutoPtr& ast, const String& targetDirectory); + CppServiceStubCodeEmitter() : CppCodeEmitter() {} virtual ~CppServiceStubCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: // ISample.idl -> sample_service_stub.h void EmitStubHeaderFile(); @@ -62,6 +63,8 @@ private: void EmitStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitStubCallMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); void EmitCbStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/generator_factory.cpp b/tools/hdi-gen/codegen/generator_factory.cpp index 73418e738..e866efc94 100755 --- a/tools/hdi-gen/codegen/generator_factory.cpp +++ b/tools/hdi-gen/codegen/generator_factory.cpp @@ -13,14 +13,21 @@ namespace OHOS { namespace HDI { -AutoPtr GeneratorFactory::GetCodeGenerator(const String& targetLanuage) +GeneratorFactory& GeneratorFactory::GetInstance() +{ + static GeneratorFactory factory; + return factory; +} + +AutoPtr GeneratorFactory::GetCodeGenerator(const AutoPtr& astModule, + const String& targetLanuage, const String& targetDirectory) { if (targetLanuage.Equals("c")) { - return new CCodeGenerator(); + return new CCodeGenerator(astModule, targetDirectory); } else if (targetLanuage.Equals("cpp")) { - return new CppCodeGenerator(); + return new CppCodeGenerator(astModule, targetDirectory); } else if (targetLanuage.Equals("java")) { - return new JavaCodeGenerator(); + return new JavaCodeGenerator(astModule, targetDirectory); } return nullptr; diff --git a/tools/hdi-gen/codegen/generator_factory.h b/tools/hdi-gen/codegen/generator_factory.h index 8b99621fb..b572cc737 100755 --- a/tools/hdi-gen/codegen/generator_factory.h +++ b/tools/hdi-gen/codegen/generator_factory.h @@ -9,13 +9,25 @@ #ifndef OHOS_HDI_GENERATORFACTORY_H #define OHOS_HDI_GENERATORFACTORY_H +#include "ast/ast_module.h" #include "codegen/code_generator.h" namespace OHOS { namespace HDI { class GeneratorFactory { public: - AutoPtr GetCodeGenerator(const String& targetLanuage); + GeneratorFactory(const GeneratorFactory&) = default; + + GeneratorFactory& operator=(const GeneratorFactory&) = default; + + ~GeneratorFactory() = default; + + static GeneratorFactory& GetInstance(); + + AutoPtr GetCodeGenerator(const AutoPtr& astModule, const String& targetLanuage, + const String& targetDirectory); +private: + GeneratorFactory() = default; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp index 98bb64cb8..7f1c613c7 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp @@ -13,6 +13,26 @@ namespace OHOS { namespace HDI { +bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void JavaClientInterfaceCodeEmitter::EmitCode() { EmitInterfaceFile(); @@ -20,13 +40,8 @@ void JavaClientInterfaceCodeEmitter::EmitCode() void JavaClientInterfaceCodeEmitter::EmitInterfaceFile() { - String filePath = String::Format("%s/%s.java", directory_.string(), FileName(interfaceName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("JavaClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } + String filePath = String::Format("%s%s.java", directory_.string(), FileName(interfaceName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.h b/tools/hdi-gen/codegen/java_client_interface_code_emitter.h index 9ffecd245..3f41a800a 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.h @@ -15,13 +15,13 @@ namespace OHOS { namespace HDI { class JavaClientInterfaceCodeEmitter : public JavaCodeEmitter { public: - JavaClientInterfaceCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : JavaCodeEmitter(ast, targetDirectory) {} + JavaClientInterfaceCodeEmitter() : JavaCodeEmitter() {} virtual ~JavaClientInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: void EmitInterfaceFile(); diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp index 0ef26a470..accefc662 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp @@ -11,6 +11,26 @@ namespace OHOS { namespace HDI { +bool JavaClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string()); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + void JavaClientProxyCodeEmitter::EmitCode() { EmitProxyFile(); @@ -18,14 +38,8 @@ void JavaClientProxyCodeEmitter::EmitCode() void JavaClientProxyCodeEmitter::EmitProxyFile() { - String filePath = String::Format("%s/%s.java", directory_.string(), FileName(proxyName_).string()); - if (!File::CreateParentDir(filePath)) { - Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", filePath.string()); - return; - } - + String filePath = String::Format("%s%s.java", directory_.string(), FileName(proxyName_).string()); File file(filePath, File::WRITE); - StringBuilder sb; EmitLicense(sb); @@ -183,22 +197,11 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append("\n"); sb.Append(prefix).AppendFormat(" data.writeInterfaceToken(DESCRIPTOR);\n"); - bool needBlankLine = false; for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, "data", sb, prefix + g_tab); - needBlankLine = true; - } else { - AutoPtr type = param->GetType(); - if (type->GetTypeKind() == TypeKind::TYPE_ARRAY) { - EmitWriteOutArrayVariable("data", param->GetName(), type, sb, prefix + g_tab); - } - } - } - if (needBlankLine) { - sb.Append("\n"); + param->EmitJavaWriteVar("data", sb, prefix + g_tab); } + sb.Append("\n"); sb.Append(prefix + g_tab).Append("try {\n"); sb.Append(prefix + g_tab + g_tab).AppendFormat("if (remote.sendRequest(COMMAND_%s, data, reply, option)) {\n", @@ -208,9 +211,7 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append(prefix + g_tab).Append(" reply.readException();\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); - if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, "reply", sb, prefix + g_tab + g_tab); - } + param->EmitJavaReadVar("reply", sb, prefix + g_tab + g_tab); } sb.Append(prefix + g_tab).Append("} finally {\n"); @@ -221,423 +222,6 @@ void JavaClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& m sb.Append(prefix).Append("}\n"); } -void JavaClientProxyCodeEmitter::EmitWriteMethodParameter(const AutoPtr& param, const String& parcelName, - StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - EmitWriteVariable(parcelName, param->GetName(), type, sb, prefix); -} - -void JavaClientProxyCodeEmitter::EmitReadMethodParameter(const AutoPtr& param, const String& parcelName, - StringBuilder& sb, const String& prefix) -{ - AutoPtr type = param->GetType(); - EmitReadOutVariable(parcelName, param->GetName(), type, sb, prefix); -} - -void JavaClientProxyCodeEmitter::EmitWriteVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.writeBoolean(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.writeByte(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.writeShort(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.writeInt(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.writeLong(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.writeFloat(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.writeDouble(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.writeString(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s);\n", parcelName.string(), name.string()); - break; - } - sb.Append(prefix).AppendFormat("%s.writeSequenceable(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s.writeRemoteObject(%s.asObject());\n", parcelName.string(), - name.string()); - break; - case TypeKind::TYPE_LIST: { - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); - sb.Append(prefix).AppendFormat("for (%s element : %s) {\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string()); - EmitWriteVariable(parcelName, "element", elementType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - sb.Append(prefix).AppendFormat("%s.writeInt(%s.size());\n", parcelName.string(), name.string()); - sb.Append(prefix).AppendFormat("for (Map.Entry<%s, %s> entry : %s.entrySet()) {\n", - keyType->EmitJavaType(TypeMode::NO_MODE, true).string(), - valueType->EmitJavaType(TypeMode::NO_MODE, true).string(), name.string()); - EmitWriteVariable(parcelName, "entry.getKey()", keyType, sb, prefix + g_tab); - EmitWriteVariable(parcelName, "entry.getValue()", valueType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - AutoPtr elementType = arrayType->GetElementType(); - - sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); - sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); - sb.Append(prefix).Append("} else { \n"); - EmitWriteArrayVariable(parcelName, name, elementType, sb, prefix + g_tab); - sb.Append(prefix).Append("}\n"); - break; - } - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitWriteArrayVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.writeBooleanArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.writeByteArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.writeShortArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.writeIntArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.writeLongArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.writeFloatArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.writeDoubleArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.writeStringArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("%s.writeSequenceableArray(%s);\n", parcelName.string(), name.string()); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitWriteOutArrayVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - sb.Append(prefix).AppendFormat("if (%s == null) {\n", name.string()); - sb.Append(prefix).AppendFormat(" %s.writeInt(-1);\n", parcelName.string()); - sb.Append(prefix).Append("} else {\n"); - sb.Append(prefix).AppendFormat(" %s.writeInt(%s.length);\n", parcelName.string(), name.string()); - sb.Append(prefix).Append("}\n"); -} - -void JavaClientProxyCodeEmitter::EmitReadVariable(const String& parcelName, const String& name, - const AutoPtr& type, ParamAttr attribute, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s %s = %s.readBoolean();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s %s = %s.readByte();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s %s = %s.readShort();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s %s = %s.readInt();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s %s = %s.readLong();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s %s = %s.readFloat();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s %s = %s.readDouble();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s %s = %s.readString();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (attribute == ParamAttr::PARAM_OUT && type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("IRemoteObject %s = %s.readRemoteObject();\n", - name.string(), parcelName.string()); - break; - } - if (attribute == ParamAttr::PARAM_OUT) { - sb.Append(prefix).AppendFormat("%s %s = new %s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - } - sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); - - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s %s = %s.asInterface(%s.readRemoteObject());\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - StubName(type->EmitJavaType(TypeMode::NO_MODE)).string(), parcelName.string()); - break; - case TypeKind::TYPE_LIST: { - sb.Append(prefix).AppendFormat("%s %s = new Array%s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - sb.Append(prefix).AppendFormat("%s %s = new Hash%s();\n", - type->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - type->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - if (attribute == ParamAttr::PARAM_OUT) { - EmitReadOutArrayVariable(parcelName, name, arrayType, sb, prefix); - } else { - EmitReadArrayVariable(parcelName, name, arrayType, attribute, sb, prefix); - } - break; - } - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadArrayVariable(const String& parcelName, const String& name, - const AutoPtr& arrayType, ParamAttr attribute, StringBuilder& sb, const String& prefix) -{ - AutoPtr elementType = arrayType->GetElementType(); - switch (elementType->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readBooleanArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readByteArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readShortArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readIntArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readLongArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readFloatArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readDoubleArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s[] %s = %s.readStringArray();\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("int size = %s.readInt();\n", parcelName.string()); - sb.Append(prefix).AppendFormat("%s %s = new %s[size];\n", - elementType->EmitJavaType(TypeMode::NO_MODE).string(), name.string(), - elementType->EmitJavaType(TypeMode::NO_MODE).string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < size; ++i) {\n"); - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_IN, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s[i] = value;\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadOutArrayVariable(const String& parcelName, const String& name, - const AutoPtr& arrayType, StringBuilder& sb, const String& prefix) -{ - AutoPtr elementType = arrayType->GetElementType(); - switch (elementType->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s.readBooleanArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s.readByteArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s.readShortArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s.readIntArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s.readLongArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s.readFloatArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s.readDoubleArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s.readStringArray(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - sb.Append(prefix).AppendFormat("%s.readSequenceableArray(%s);\n", parcelName.string(), name.string()); - break; - default: - break; - } -} - -void JavaClientProxyCodeEmitter::EmitReadOutVariable(const String& parcelName, const String& name, - const AutoPtr& type, StringBuilder& sb, const String& prefix) -{ - switch (type->GetTypeKind()) { - case TypeKind::TYPE_BOOLEAN: - sb.Append(prefix).AppendFormat("%s = %s.readBoolean();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_BYTE: - sb.Append(prefix).AppendFormat("%s = %s.readByte();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SHORT: - sb.Append(prefix).AppendFormat("%s = %s.readShort();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_INT: - case TypeKind::TYPE_FILEDESCRIPTOR: - sb.Append(prefix).AppendFormat("%s = %s.readInt();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_LONG: - sb.Append(prefix).AppendFormat("%s = %s.readLong();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_FLOAT: - sb.Append(prefix).AppendFormat("%s = %s.readFloat();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_DOUBLE: - sb.Append(prefix).AppendFormat("%s = %s.readDouble();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_STRING: - sb.Append(prefix).AppendFormat("%s = %s.readString();\n", - name.string(), parcelName.string()); - break; - case TypeKind::TYPE_SEQUENCEABLE: - if (type->EmitJavaType(TypeMode::NO_MODE).Equals("IRemoteObject")) { - sb.Append(prefix).AppendFormat("%s = %s.readRemoteObject();\n", name.string(), parcelName.string()); - break; - } - sb.Append(prefix).AppendFormat("%s.readSequenceable(%s);\n", parcelName.string(), name.string()); - break; - case TypeKind::TYPE_INTERFACE: - sb.Append(prefix).AppendFormat("%s = %s.asInterface(%s.readRemoteObject());\n", name.string(), - StubName(type->EmitJavaType(TypeMode::NO_MODE)).string(), parcelName.string()); - break; - case TypeKind::TYPE_LIST: { - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr listType = dynamic_cast(type.Get()); - AutoPtr elementType = listType->GetElementType(); - - EmitReadVariable(parcelName, "value", elementType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.add(value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_MAP: { - sb.Append(prefix).AppendFormat("int %sSize = %s.readInt();\n", name.string(), parcelName.string()); - sb.Append(prefix).AppendFormat("for (int i = 0; i < %sSize; ++i) {\n", name.string()); - - AutoPtr mapType = dynamic_cast(type.Get()); - AutoPtr keyType = mapType->GetKeyType(); - AutoPtr valueType = mapType->GetValueType(); - - EmitReadVariable(parcelName, "key", keyType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - EmitReadVariable(parcelName, "value", valueType, ParamAttr::PARAM_OUT, sb, prefix + g_tab); - sb.Append(prefix + g_tab).AppendFormat("%s.put(key, value);\n", name.string()); - sb.Append(prefix).Append("}\n"); - break; - } - case TypeKind::TYPE_ARRAY: { - AutoPtr arrayType = dynamic_cast(type.Get()); - EmitReadOutArrayVariable(parcelName, name, arrayType, sb, prefix); - break; - } - default: - break; - } -} - void JavaClientProxyCodeEmitter::EmitLocalVariable(const AutoPtr& param, StringBuilder& sb, const String& prefix) { @@ -659,10 +243,5 @@ void JavaClientProxyCodeEmitter::EmitLocalVariable(const AutoPtr& param->GetName().string()); } } - -String JavaClientProxyCodeEmitter::StubName(const String& name) -{ - return name.StartsWith("I") ? (name.Substring(1) + "Stub") : (name + "Stub"); -} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h index bc077cb3b..c304db6aa 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.h @@ -16,13 +16,14 @@ namespace OHOS { namespace HDI { class JavaClientProxyCodeEmitter : public JavaCodeEmitter { public: - JavaClientProxyCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - : JavaCodeEmitter(ast, targetDirectory) {} + JavaClientProxyCodeEmitter() : JavaCodeEmitter() {} virtual ~JavaClientProxyCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; void EmitCode() override; -private: + void EmitProxyFile(); void EmitProxyImports(StringBuilder& sb); @@ -47,21 +48,9 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); - void EmitWriteMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, - const String& prefix); - void EmitReadMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); - void EmitWriteVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - - void EmitWriteArrayVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - - void EmitWriteOutArrayVariable(const String& parcelName, const String& name, const AutoPtr& type, - StringBuilder& sb, const String& prefix); - void EmitReadVariable(const String& parcelName, const String& name, const AutoPtr& type, ParamAttr attribute, StringBuilder& sb, const String& prefix); @@ -75,8 +64,6 @@ private: StringBuilder& sb, const String& prefix); void EmitLocalVariable(const AutoPtr& param, StringBuilder& sb, const String& prefix); - - String StubName(const String& name); }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_code_emitter.cpp b/tools/hdi-gen/codegen/java_code_emitter.cpp index 51a137524..b96e34c87 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_code_emitter.cpp @@ -13,22 +13,56 @@ namespace OHOS { namespace HDI { -JavaCodeEmitter::JavaCodeEmitter(const AutoPtr& ast, const String& targetDirectory) - :LightRefCountBase(), ast_(ast), directory_(targetDirectory) +bool JavaCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); + if (!Reset(ast, targetDirectory)) { + return false; + } + + EmitCode(); + return true; +} + +bool JavaCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) +{ + if (ast == nullptr) { + return false; + } + + if (targetDirectory.Equals("")) { + return false; } - if (interface_ != nullptr) { + CleanData(); + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); interfaceName_ = interface_->GetName(); interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; proxyName_ = infName_ + "Proxy"; proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - } else { + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { infName_ = ast_->GetName(); } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void JavaCodeEmitter::CleanData() +{ + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; } String JavaCodeEmitter::FileName(const String& name) diff --git a/tools/hdi-gen/codegen/java_code_emitter.h b/tools/hdi-gen/codegen/java_code_emitter.h index eb8004507..32c1a99a3 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.h +++ b/tools/hdi-gen/codegen/java_code_emitter.h @@ -19,24 +19,19 @@ namespace OHOS { namespace HDI { class JavaCodeEmitter : public LightRefCountBase { public: - JavaCodeEmitter(const AutoPtr& ast, const String& targetDirectory); - virtual ~JavaCodeEmitter() = default; - virtual void EmitCode() = 0; - - inline String GetSourceFile() - { - return sourceFileName_; - } - - inline bool isInvaildDir() - { - return directory_.Equals(""); - } + bool OutPut(const AutoPtr& ast, const String& targetDirectory); static String FileName(const String& name); protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; bool CreateDirectory(); @@ -52,11 +47,9 @@ protected: String SpecificationParam(StringBuilder& paramSb, const String& prefix); - AutoPtr ast_; - AutoPtr interface_; - + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; String directory_; - String sourceFileName_; String interfaceName_; String interfaceFullName_; diff --git a/tools/hdi-gen/codegen/java_code_generator.cpp b/tools/hdi-gen/codegen/java_code_generator.cpp index 853aee68d..5cae08859 100755 --- a/tools/hdi-gen/codegen/java_code_generator.cpp +++ b/tools/hdi-gen/codegen/java_code_generator.cpp @@ -17,52 +17,32 @@ namespace OHOS { namespace HDI { -const char* JavaCodeGenerator::TAG = "JavaCodeGenerator"; - -bool JavaCodeGenerator::Initializate(const AutoPtr& ast, const String& targetDirectory) +bool JavaCodeGenerator::Generate() { - if (ast->GetASTFileType() == ASTFileType::AST_TYPES) { - Logger::E(TAG, "java has no types idl."); - return false; - } - - ast_ = ast; - targetDirectory_ = targetDirectory; - - if (!ResolveDirectory()) { - return false; - } - - AutoPtr clientInterfaceCodeEmitter = new JavaClientInterfaceCodeEmitter(ast_, targetDirectory_); - AutoPtr clientProxyCodeEmitter = new JavaClientProxyCodeEmitter(ast_, targetDirectory_); - - emitters_.push_back(clientInterfaceCodeEmitter); - emitters_.push_back(clientProxyCodeEmitter); - return true; -} - -bool JavaCodeGenerator::Generate() const -{ - for (auto emitter : emitters_) { - if (!emitter->isInvaildDir()) { - emitter->EmitCode(); + Initializate(); + + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + switch (ast->GetASTFileType()) { + case ASTFileType::AST_IFACE: + case ASTFileType::AST_ICALLBACK: { + emitters_["clientIface"]->OutPut(ast, targetDirectory_); + emitters_["proxy"]->OutPut(ast, targetDirectory_); + break; + } + default: + break; } } - return true; } -bool JavaCodeGenerator::ResolveDirectory() +void JavaCodeGenerator::Initializate() { - String packageFilePath = String::Format("%s/%s/", - targetDirectory_.string(), JavaCodeEmitter::FileName(ast_->GetPackageName()).string()); - targetDirectory_ = packageFilePath; - - if (!File::CreateParentDir(targetDirectory_)) { - Logger::E(TAG, "create '%s' directory failed!", targetDirectory_); - return false; - } - return true; + emitters_ = { + {"clientIface", new JavaClientInterfaceCodeEmitter()}, + {"proxy", new JavaClientProxyCodeEmitter()}, + }; } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_code_generator.h b/tools/hdi-gen/codegen/java_code_generator.h index 0fea5d53b..0274854e1 100755 --- a/tools/hdi-gen/codegen/java_code_generator.h +++ b/tools/hdi-gen/codegen/java_code_generator.h @@ -16,18 +16,18 @@ namespace OHOS { namespace HDI { class JavaCodeGenerator : public CodeGenerator { public: - JavaCodeGenerator() : CodeGenerator(), - emitters_() {} + using JavaCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + + JavaCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) + : CodeGenerator(astModule, targetDirectory), emitters_() {} ~JavaCodeGenerator() override {}; - bool Initializate(const AutoPtr& ast, const String& targetDirectory) override; - bool Generate() const override; + bool Generate() override; private: - bool ResolveDirectory() override; + void Initializate(); - static const char* TAG; - std::vector> emitters_; + JavaCodeEmitMap emitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/main.cpp b/tools/hdi-gen/main.cpp index 907efed68..e54e597aa 100755 --- a/tools/hdi-gen/main.cpp +++ b/tools/hdi-gen/main.cpp @@ -18,7 +18,6 @@ using namespace OHOS::HDI; int main(int argc, char** argv) { Options& options = Options::GetInstance().Parse(argc, argv); - if (options.HasErrors()) { options.ShowErrors(); return 0; @@ -44,47 +43,25 @@ int main(int argc, char** argv) Logger::E("hdi-gen", "open idl file failed!"); return -1; } - printf("%s:%lu\n", idlFile->GetPath().string(), idlFile->GetHashKey()); return 0; } ModuleParser moduleParser(options); - if (!moduleParser.ParserDependencies()) { - Logger::E("hdi-gen", "Parsing dependencies failed."); - return -1; - } - - if (!moduleParser.CompileFiles()) { - Logger::E("hdi-gen", "Parsing .idl failed."); + AutoPtr astModule = moduleParser.Parse(); + if (astModule == nullptr) { return -1; } - AutoPtr astModule = moduleParser.GetAStModule(); - if (!options.DoGenerateCode()) { return 0; } - for (auto& astPair : astModule->GetAllAsts()) { - AutoPtr ast = astPair.second; - GeneratorFactory factory; - AutoPtr codeGen = factory.GetCodeGenerator(options.GetTargetLanguage()); - if (codeGen == nullptr) { - Logger::E("hdi-gen", "new Generate failed."); - return -1; - } - - if (!codeGen->Initializate(ast, options.GetGenerationDirectory())) { - Logger::E("hdi-gen", "Generate initializate failed."); - return -1; - } - - if (!codeGen->Generate()) { - Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); - return -1; - } + AutoPtr codeGen = GeneratorFactory::GetInstance().GetCodeGenerator(astModule, + options.GetTargetLanguage(), options.GetGenerationDirectory()); + if (!codeGen->Generate()) { + Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); + return -1; } - return 0; } \ No newline at end of file diff --git a/tools/hdi-gen/parser/module_parser.cpp b/tools/hdi-gen/parser/module_parser.cpp index b4ef43b31..222f89f79 100755 --- a/tools/hdi-gen/parser/module_parser.cpp +++ b/tools/hdi-gen/parser/module_parser.cpp @@ -13,17 +13,28 @@ namespace OHOS { namespace HDI { -const char* ModuleParser::TAG = "ModuleParser"; +AutoPtr ModuleParser::Parse() +{ + if (!ParserDependencies()) { + return nullptr; + } + + if (!CompileFiles()) { + return nullptr; + } + + return module_; +} bool ModuleParser::ParserDependencies() { if (!ParserAllImports(option_.GetSourceFile())) { - Logger::E(TAG, "Parsing all idl file failed."); + Logger::E(g_tab, "Parsing all idl file failed."); return false; } if (!CheckCircularReference()) { - Logger::E(TAG, "has circle reference."); + Logger::E(g_tab, "has circle reference."); return false; } @@ -36,7 +47,7 @@ bool ModuleParser::CompileFiles() for (const auto& filePath : compileFiles_) { if (!parserPtr->Parse(filePath)) { - Logger::E(TAG, "parse %s failed", filePath.string()); + Logger::E(g_tab, "parse %s failed", filePath.string()); return false; } } @@ -73,19 +84,19 @@ bool ModuleParser::ParserAllImportsRecursion(const std::shared_ptr& std::unique_ptr parserPtr = std::make_unique(option_); std::shared_ptr file = nullptr; if (!parserPtr->Parse(filePath, file)) { - Logger::E(TAG, "Parsing %s failed.", filePath.string()); + Logger::E(g_tab, "Parsing %s failed.", filePath.string()); return false; } if (file == nullptr) { - Logger::E(TAG, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); + Logger::E(g_tab, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); return false; } sourceFiles_[file->GetFullName()] = file; if (!ParserAllImportsRecursion(file)) { - Logger::E(TAG, "Parsing %s file's import failed.", file->GetFilePath().string()); + Logger::E(g_tab, "Parsing %s file's import failed.", file->GetFilePath().string()); return false; } } diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 07cf1449f..4041d914b 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -31,17 +31,13 @@ public: ~ModuleParser() {} + AutoPtr Parse(); +private: // parser file and circular reference bool ParserDependencies(); bool CompileFiles(); - inline AutoPtr GetAStModule() const - { - return module_; - } - -private: // parse all idl file involved in compilation. bool ParserAllImports(const String& rootFilePath); @@ -50,7 +46,6 @@ private: // check circular reference and reverse topology sorting of all idl file bool CheckCircularReference(); - static const char* TAG; const Options& option_; FileDetailMap sourceFiles_; diff --git a/tools/hdi-gen/parser/parser.cpp b/tools/hdi-gen/parser/parser.cpp index 73a1499db..26d4f5fdf 100755 --- a/tools/hdi-gen/parser/parser.cpp +++ b/tools/hdi-gen/parser/parser.cpp @@ -185,10 +185,8 @@ bool Parser::ParseIdlImport(std::shared_ptr& fileDetailPtr) bool Parser::ParseFile() { bool ret = true; - ast_ = new AST(); ast_->SetIdlFile(lexer_->GetFilePath()); - ParseLicense(); Token token; @@ -229,17 +227,7 @@ bool Parser::ParseFile() } } lexer_->GetToken(); - - // here, ast_ cannot be a sequenceable idl - if (ast_->GetInterfaceDef() != nullptr) { - if (ast_->GetInterfaceDef()->IsCallback()) { - ast_->SetAStFileType(ASTFileType::AST_ICALLBACK); - } else { - ast_->SetAStFileType(ASTFileType::AST_IFACE); - } - } else { - ast_->SetAStFileType(ASTFileType::AST_TYPES); - } + SetAstFileType(); return ret; } @@ -413,48 +401,11 @@ bool Parser::ParseAttribute() bool ret = true; AutoPtr attributes = nullptr; - // read '[' - Token token = lexer_->GetToken(); - if (token == Token::BRACKETS_LEFT) { - attributes = new Attribute(); - token = lexer_->PeekToken(); - while (token != Token::BRACKETS_RIGHT) { - switch (token) { - case Token::ONEWAY: - attributes->isOneWay = true; - break; - case Token::CALLBACK: - attributes->isCallback = true; - break; - case Token::FULL: - attributes->isFull = true; - break; - case Token::LITE: - attributes->isLite = true; - break; - default: { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token == Token::COMMA) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } else if (token == Token::BRACKETS_RIGHT) { - break; - } else { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - return false; - } - } - lexer_->GetToken(); + if (!ParseAttributeBody(attributes)) { + return false; } - token = lexer_->PeekToken(); + Token token = lexer_->PeekToken(); switch (token) { case Token::ENUM: ret = ParseEnumDefine(attributes) && ret; @@ -479,11 +430,6 @@ bool Parser::ParseAttribute() bool Parser::ParseInterface(const AutoPtr& attributes) { lexer_->GetToken(); - bool ret = true; - bool isOneWay = false; - bool isCallback = false; - bool isFull = false; - bool isLite = false; String interfaceName; Token token = lexer_->PeekToken(); @@ -494,7 +440,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) return false; } lexer_->GetToken(); - interfaceName = lexer_->GetIdentifier(); token = lexer_->PeekToken(); @@ -504,8 +449,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) lexer_->GetToken(); return false; } - - // read '{' lexer_->GetToken(); if (interfaceName.IsEmpty()) { @@ -529,7 +472,13 @@ bool Parser::ParseInterface(const AutoPtr& attributes) interface->SetFull(attributes->isFull); interface->SetLite(attributes->isLite); } + return ParseInterfaceBody(interface); +} +bool Parser::ParseInterfaceBody(const AutoPtr& interface) +{ + bool ret = true; + Token token = lexer_->PeekToken(); while (token != Token::BRACES_RIGHT && token != Token::END_OF_FILE) { ret = ParseMethod(interface) && ret; token = lexer_->PeekToken(); @@ -540,7 +489,6 @@ bool Parser::ParseInterface(const AutoPtr& attributes) lexer_->SkipEof(); return false; } - lexer_->GetToken(); if (ast_->GetInterfaceDef() != nullptr) { @@ -550,16 +498,13 @@ bool Parser::ParseInterface(const AutoPtr& attributes) } ast_->AddInterfaceDef(interface); - return ret; } bool Parser::ParseMethod(const AutoPtr& interface) { - bool ret = true; - AutoPtr attributes = new Attribute(); - ret = ParseMethodAttr(interface, attributes) && ret; - if (!ret) { + AutoPtr attributes = nullptr; + if (!ParseAttributeBody(attributes)) { return false; } @@ -580,7 +525,7 @@ bool Parser::ParseMethod(const AutoPtr& interface) } return false; } - token = lexer_->GetToken(); + lexer_->GetToken(); AutoPtr method = new ASTMethod(); method->SetName(lexer_->GetIdentifier()); @@ -591,24 +536,73 @@ bool Parser::ParseMethod(const AutoPtr& interface) method->SetLite(attributes->isLite); } + if (!ParseParameterList(method)) { + return false; + } + + interface->AddMethod(method); + return true; +} + +bool Parser::ParseAttributeBody(AutoPtr& attributes) +{ + Token token = lexer_->PeekToken(); + if (token != Token::BRACKETS_LEFT) { + return true; + } + lexer_->GetToken(); + + attributes = new Attribute(); token = lexer_->PeekToken(); - if (token != Token::PARENTHESES_LEFT) { - LogError(String("'(' is expected.")); - if (token == Token::BRACES_RIGHT) { - return false; + while (token != Token::BRACKETS_RIGHT) { + switch (token) { + case Token::ONEWAY: + attributes->isOneWay = true; + break; + case Token::CALLBACK: + attributes->isCallback = true; + break; + case Token::FULL: + attributes->isFull = true; + break; + case Token::LITE: + attributes->isLite = true; + break; + default: { + LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); + lexer_->Skip(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); + lexer_->GetToken(); + return false; + } } - // jump over colon lexer_->GetToken(); - while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { + token = lexer_->PeekToken(); + if (token == Token::COMMA) { + lexer_->GetToken(); token = lexer_->PeekToken(); - if (token == Token::BRACES_RIGHT) { - break; - } + } else if (token == Token::BRACKETS_RIGHT) { + break; + } else { + LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); + lexer_->Skip(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); lexer_->GetToken(); + return false; } + } + lexer_->GetToken(); + return true; +} + +bool Parser::ParseParameterList(AutoPtr& method) +{ + bool ret = true; + Token token = lexer_->PeekToken(); + if (token != Token::PARENTHESES_LEFT) { + LogError(String("'(' is expected.")); + lexer_->Skip(';'); return false; } - token = lexer_->GetToken(); + lexer_->GetToken(); token = lexer_->PeekToken(); while (token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { @@ -637,92 +631,19 @@ bool Parser::ParseMethod(const AutoPtr& interface) return false; } lexer_->GetToken(); - interface->AddMethod(method); - return ret; -} - -bool Parser::ParseMethodAttr(const AutoPtr& interface, const AutoPtr& attributes) -{ - if (interface == nullptr || attributes == nullptr) { - return false; - } - - Token token = lexer_->PeekToken(); - if (token == Token::BRACES_RIGHT) { - LogError(String::Format("%s has no method.", interface->GetName().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACES_RIGHT)); - lexer_->GetToken(); - return false; - } - - if (token == Token::BRACKETS_LEFT) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - while (token != Token::BRACKETS_RIGHT) { - switch (token) { - case Token::ONEWAY: - attributes->isOneWay = true; - break; - case Token::FULL: - attributes->isFull = true; - break; - case Token::LITE: - attributes->isLite = true; - break; - default: { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token == Token::COMMA) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } else if (token == Token::BRACKETS_RIGHT) { - } else { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - lexer_->SkipCurrentLine(Lexer::TokenToChar(Token::BRACKETS_RIGHT)); - lexer_->GetToken(); - return false; - } - } - lexer_->GetToken(); - } return true; } bool Parser::ParseParameter(const AutoPtr& method) { - Token token = lexer_->PeekToken(); - if (token != Token::BRACKETS_LEFT) { - LogError(String("'[' is expected.")); - while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } - return false; - } - lexer_->GetToken(); - AutoPtr parameter = new ASTParameter(); if (!ParseParamAttr(parameter)) { return false; } - token = lexer_->PeekToken(); - if (token != Token::BRACKETS_RIGHT) { - LogError(String::Format("'%s' is not expected.", lexer_->DumpToken().string())); - while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { - lexer_->GetToken(); - token = lexer_->PeekToken(); - } - return false; - } - lexer_->GetToken(); AutoPtr type = ParseType(); + + Token token = lexer_->PeekToken(); if (type == nullptr) { while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { lexer_->GetToken(); @@ -731,7 +652,6 @@ bool Parser::ParseParameter(const AutoPtr& method) return false; } - token = lexer_->PeekToken(); if (token != Token::IDENTIFIER) { LogError(String("Parameter name is expected.")); while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { @@ -741,6 +661,7 @@ bool Parser::ParseParameter(const AutoPtr& method) return false; } lexer_->GetToken(); + parameter->SetName(lexer_->GetIdentifier()); parameter->SetType(type); method->AddParameter(parameter); @@ -749,10 +670,22 @@ bool Parser::ParseParameter(const AutoPtr& method) bool Parser::ParseParamAttr(const AutoPtr& parameter) { + Token token = lexer_->PeekToken(); + if (token != Token::BRACKETS_LEFT) { + LogError(String("'[' is expected.")); + while (token != Token::COMMA && token != Token::PARENTHESES_RIGHT && token != Token::END_OF_FILE) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } + return false; + } + lexer_->GetToken(); + if (parameter == nullptr) { return false; } - Token token = lexer_->PeekToken(); + + token = lexer_->PeekToken(); if (token == Token::IN) { lexer_->GetToken(); parameter->SetAttribute(ParamAttr::PARAM_IN); @@ -768,6 +701,18 @@ bool Parser::ParseParamAttr(const AutoPtr& parameter) } return false; } + + token = lexer_->PeekToken(); + if (token != Token::BRACKETS_RIGHT) { + LogError(String::Format("']' is expected.")); + while (token != Token::SEMICOLON && token != Token::END_OF_FILE) { + lexer_->GetToken(); + token = lexer_->PeekToken(); + } + return false; + } + lexer_->GetToken(); + return true; } @@ -791,25 +736,8 @@ AutoPtr Parser::ParseType() lexer_->GetToken(); type = ast_->FindType(lexer_->GetIdentifier()); } else if (token == Token::UNSIGNED) { - String unsignedStr = lexer_->DumpToken(); lexer_->GetToken(); - token = lexer_->PeekToken(); - switch (token) { - case Token::CHAR: - case Token::SHORT: - case Token::INTEGER: - case Token::LONG: { - type = ast_->FindType(unsignedStr + " " + lexer_->DumpToken()); - lexer_->GetToken(); - break; - } - default: { - LogError(typeLineNo, typeColumnNo, - String::Format("'unsigned %s' type was not declared in the idl file.", - lexer_->DumpToken().string())); - return nullptr; - } - } + type = ParseUnsignedType(typeLineNo, typeColumnNo); } else { LogError(typeLineNo, typeColumnNo, String("Invalid type name.")); return nullptr; @@ -823,23 +751,7 @@ AutoPtr Parser::ParseType() token = lexer_->PeekToken(); if (token == Token::BRACKETS_LEFT) { lexer_->GetToken(); - token = lexer_->PeekToken(); - if (token != Token::BRACKETS_RIGHT) { - LogError(typeLineNo, typeColumnNo, String("']' is expected.")); - return nullptr; - } - lexer_->GetToken(); - - if (type != nullptr) { - AutoPtr arrayType = new ASTArrayType(); - arrayType->SetElementType(type); - - type = ast_->FindType(arrayType->ToString()); - if (type == nullptr) { - ast_->AddType(arrayType.Get()); - type = static_cast(arrayType.Get()); - } - } + type = ParseArrayType(type); } if (!CheckType(typeLineNo, typeColumnNo, type)) { @@ -849,6 +761,31 @@ AutoPtr Parser::ParseType() return type; } +AutoPtr Parser::ParseUnsignedType(int typeLineNo, int typeColumnNo) +{ + AutoPtr type = nullptr; + String unsignedStr = lexer_->DumpToken(); + Token token = lexer_->PeekToken(); + switch (token) { + case Token::CHAR: + case Token::SHORT: + case Token::INTEGER: + case Token::LONG: { + type = ast_->FindType(unsignedStr + " " + lexer_->DumpToken()); + lexer_->GetToken(); + break; + } + default: { + LogError(typeLineNo, typeColumnNo, + String::Format("'unsigned %s' type was not declared in the idl file.", + lexer_->DumpToken().string())); + return nullptr; + } + } + + return type; +} + AutoPtr Parser::ParseList() { lexer_->GetToken(); @@ -936,6 +873,31 @@ AutoPtr Parser::ParseMap() return ret; } +AutoPtr Parser::ParseArrayType(const AutoPtr& elementType) +{ + Token token = lexer_->PeekToken(); + if (token != Token::BRACKETS_RIGHT) { + LogError(String("']' is expected.")); + return nullptr; + } + lexer_->GetToken(); + + if (elementType == nullptr) { + return nullptr; + } + + AutoPtr arrayType = new ASTArrayType(); + arrayType->SetElementType(elementType); + AutoPtr type = ast_->FindType(arrayType->ToString()); + + if (type == nullptr) { + ast_->AddType(arrayType.Get()); + type = static_cast(arrayType.Get()); + } + + return type; +} + AutoPtr Parser::ParseCustomType() { Token token = lexer_->GetToken(); @@ -1106,7 +1068,22 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) type->SetName(lexer_->GetIdentifier()); lexer_->GetToken(); - token = lexer_->PeekToken(); + if (!ParseStructMember(type)) { + return false; + } + + if (attributes != nullptr) { + type->SetFull(attributes->isFull); + type->SetLite(attributes->isLite); + } + + ast_->AddTypeDefinition(type.Get()); + return true; +} + +bool Parser::ParseStructMember(const AutoPtr& type) +{ + Token token = lexer_->PeekToken(); if (token != Token::BRACES_LEFT) { lexer_->SkipCurrentLine(';'); return false; @@ -1129,7 +1106,6 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) } String memberName = lexer_->GetIdentifier(); lexer_->GetToken(); - type->AddMember(member, memberName); token = lexer_->PeekToken(); @@ -1152,13 +1128,6 @@ bool Parser::ParseStructDefine(const AutoPtr& attributes) return false; } lexer_->GetToken(); - - if (attributes != nullptr) { - type->SetFull(attributes->isFull); - type->SetLite(attributes->isLite); - } - - ast_->AddTypeDefinition(type.Get()); return true; } @@ -1180,7 +1149,22 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) type->SetName(lexer_->GetIdentifier()); lexer_->GetToken(); - token = lexer_->PeekToken(); + if (!ParseUnionMember(type)) { + return false; + } + + if (attributes != nullptr) { + type->SetFull(attributes->isFull); + type->SetLite(attributes->isLite); + } + + ast_->AddTypeDefinition(type.Get()); + return true; +} + +bool Parser::ParseUnionMember(const AutoPtr& type) +{ + Token token = lexer_->PeekToken(); if (token != Token::BRACES_LEFT) { lexer_->SkipCurrentLine(';'); return false; @@ -1203,7 +1187,6 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) } String memberName = lexer_->GetIdentifier(); lexer_->GetToken(); - type->AddMember(member, memberName); token = lexer_->PeekToken(); @@ -1226,13 +1209,6 @@ bool Parser::ParseUnionDefine(const AutoPtr& attributes) return false; } lexer_->GetToken(); - - if (attributes != nullptr) { - type->SetFull(attributes->isFull); - type->SetLite(attributes->isLite); - } - - ast_->AddTypeDefinition(type.Get()); return true; } @@ -1268,6 +1244,19 @@ bool Parser::CheckType(int lineNo, int columnNo, const AutoPtr& type) return true; } +void Parser::SetAstFileType() +{ + if (ast_->GetInterfaceDef() != nullptr) { + if (ast_->GetInterfaceDef()->IsCallback()) { + ast_->SetAStFileType(ASTFileType::AST_ICALLBACK); + } else { + ast_->SetAStFileType(ASTFileType::AST_IFACE); + } + } else { + ast_->SetAStFileType(ASTFileType::AST_TYPES); + } +} + bool Parser::CheckIntegrity() { if (ast_ == nullptr) { @@ -1287,36 +1276,10 @@ bool Parser::CheckIntegrity() switch (ast_->GetASTFileType()) { case ASTFileType::AST_IFACE: { - AutoPtr interface = ast_->GetInterfaceDef(); - if (interface == nullptr) { - LogError(String("ast's interface is empty.")); - return false; - } - - if (ast_->GetTypeDefinitionNumber() > 0) { - LogError(String("interface ast cannot has custom types.")); - return false; - } - - if (interface->GetMethodNumber() == 0) { - LogError(String("interface ast has no method.")); - return false; - } - - break; + return CheckInterfaceAst(); } case ASTFileType::AST_ICALLBACK: { - AutoPtr interface = ast_->GetInterfaceDef(); - if (interface == nullptr) { - LogError(String("ast's interface is empty.")); - return false; - } - - if (!interface->IsCallback()) { - LogError(String("ast is callback, but ast's interface is not callback.")); - return false; - } - break; + return CheckCallbackAst(); } case ASTFileType::AST_SEQUENCEABLE: { LogError(String("it's impossible that ast is sequenceable.")); @@ -1336,6 +1299,41 @@ bool Parser::CheckIntegrity() return true; } +bool Parser::CheckInterfaceAst() +{ + AutoPtr interface = ast_->GetInterfaceDef(); + if (interface == nullptr) { + LogError(String("ast's interface is empty.")); + return false; + } + + if (ast_->GetTypeDefinitionNumber() > 0) { + LogError(String("interface ast cannot has custom types.")); + return false; + } + + if (interface->GetMethodNumber() == 0) { + LogError(String("interface ast has no method.")); + return false; + } + return true; +} + +bool Parser::CheckCallbackAst() +{ + AutoPtr interface = ast_->GetInterfaceDef(); + if (interface == nullptr) { + LogError(String("ast's interface is empty.")); + return false; + } + + if (!interface->IsCallback()) { + LogError(String("ast is callback, but ast's interface is not callback.")); + return false; + } + return true; +} + bool Parser::IsValidTypeName(const String& typeName) { if (typeName[0] == '.') { diff --git a/tools/hdi-gen/parser/parser.h b/tools/hdi-gen/parser/parser.h index 578bb8364..bfd1f02de 100755 --- a/tools/hdi-gen/parser/parser.h +++ b/tools/hdi-gen/parser/parser.h @@ -81,9 +81,13 @@ private: bool ParseInterface(const AutoPtr& attributes = nullptr); + bool ParseInterfaceBody(const AutoPtr& interface); + bool ParseMethod(const AutoPtr& interface); - bool ParseMethodAttr(const AutoPtr& interface, const AutoPtr& attributes); + bool ParseAttributeBody(AutoPtr& attributes); + + bool ParseParameterList(AutoPtr& method); bool ParseParameter(const AutoPtr& method); @@ -91,10 +95,14 @@ private: AutoPtr ParseType(); + AutoPtr ParseUnsignedType(int typeLineNo, int typeColumnNo); + AutoPtr ParseList(); AutoPtr ParseMap(); + AutoPtr ParseArrayType(const AutoPtr& elementType); + AutoPtr ParseCustomType(); bool ParseEnumDefine(const AutoPtr& attributes = nullptr); @@ -105,12 +113,22 @@ private: bool ParseStructDefine(const AutoPtr& attributes = nullptr); + bool ParseStructMember(const AutoPtr& type); + bool ParseUnionDefine(const AutoPtr& attributes = nullptr); + bool ParseUnionMember(const AutoPtr& type); + bool CheckType(int lineNo, int columnNo, const AutoPtr& type); + void SetAstFileType(); + bool CheckIntegrity(); + bool CheckInterfaceAst(); + + bool CheckCallbackAst(); + bool IsValidTypeName(const String& typeName); bool CheckPackageName(const String& filePath, const String& packageName); diff --git a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp index 36ac0bd4a..d4b937007 100755 --- a/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp +++ b/tools/hdi-gen/test/c_test/struct_test/v1_0/c_struct_test.cpp @@ -21,7 +21,19 @@ using namespace OHOS; using namespace testing::ext; -static struct IStructTest* g_testClient = nullptr; +static const uint32_t g_arrayLen = 2; +static const int8_t g_integer8Var = 65; +static const int16_t g_integer16Var = 3; +static const int32_t g_integer32Var = 4; +static const int64_t g_integer64Var = 5; +static const uint8_t g_uInteger8Var = 97; +static const uint16_t g_uInteger16Var = 7; +static const uint32_t g_uInteger32Var = 8; +static const uint64_t g_uInteger64Var = 8; +static const float g_floatVar = 10.5; +static const double g_doubleVar = 11.55; + +static struct IStructTest *g_testClient = nullptr; class CStructTest : public testing::Test { public: @@ -54,15 +66,15 @@ HWTEST_F(CStructTest, CStructTest_001, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_002, TestSize.Level1) { - struct SSample* srcObj = (struct SSample*)OsalMemCalloc(sizeof(struct SSample)); + struct SSample *srcObj = (struct SSample *)OsalMemCalloc(sizeof(struct SSample)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = true; - srcObj->m2 = 1; - srcObj->m3 = 10.125; + srcObj->m2 = g_integer32Var; + srcObj->m3 = g_doubleVar; srcObj->m4 = strdup("hello world"); - struct SSample* destObj = nullptr; + struct SSample *destObj = nullptr; int32_t ec = g_testClient->SSampleTest(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -77,22 +89,22 @@ HWTEST_F(CStructTest, CStructTest_002, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_003, TestSize.Level1) { - struct SSample2* srcObj = (struct SSample2*)OsalMemCalloc(sizeof(struct SSample2)); + struct SSample2 *srcObj = (struct SSample2 *)OsalMemCalloc(sizeof(struct SSample2)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = true; - srcObj->m2 = 65; - srcObj->m3 = 10; - srcObj->m4 = 20; - srcObj->m5 = 30; - srcObj->m6 = 97; - srcObj->m7 = 100; - srcObj->m8 = 200; - srcObj->m9 = 300; - srcObj->m10 = 10.5; - srcObj->m11 = 20.125; - - struct SSample2* destObj = nullptr; + srcObj->m2 = g_integer8Var; + srcObj->m3 = g_integer16Var; + srcObj->m4 = g_integer32Var; + srcObj->m5 = g_integer64Var; + srcObj->m6 = g_uInteger8Var; + srcObj->m7 = g_uInteger16Var; + srcObj->m8 = g_uInteger32Var; + srcObj->m9 = g_uInteger64Var; + srcObj->m10 = g_floatVar; + srcObj->m11 = g_doubleVar; + + struct SSample2 *destObj = nullptr; int32_t ec = g_testClient->SSample2Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); @@ -114,33 +126,30 @@ HWTEST_F(CStructTest, CStructTest_003, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_004, TestSize.Level1) { - struct SSample3* srcObj = (struct SSample3*)OsalMemCalloc(sizeof(struct SSample3)); + struct SSample3 *srcObj = (struct SSample3 *)OsalMemCalloc(sizeof(struct SSample3)); ASSERT_NE(srcObj, nullptr); srcObj->m1 = strdup("hello world"); srcObj->m2 = MEM_THREE; - srcObj->m3.m1 = true; - srcObj->m3.m2 = 65; - srcObj->m3.m3 = 10; - srcObj->m3.m4 = 20; - srcObj->m3.m5 = 30; - srcObj->m3.m6 = 97; - srcObj->m3.m7 = 100; - srcObj->m3.m8 = 200; - srcObj->m3.m9 = 300; - srcObj->m3.m10 = 10.5; - srcObj->m3.m11 = 20.125; - + srcObj->m3.m2 = g_integer8Var; + srcObj->m3.m3 = g_integer16Var; + srcObj->m3.m4 = g_integer32Var; + srcObj->m3.m5 = g_integer64Var; + srcObj->m3.m6 = g_uInteger8Var; + srcObj->m3.m7 = g_uInteger16Var; + srcObj->m3.m8 = g_uInteger32Var; + srcObj->m3.m9 = g_uInteger64Var; + srcObj->m3.m10 = g_floatVar; + srcObj->m3.m11 = g_doubleVar; srcObj->m4 = open("/fdtest1.txt", O_CREAT | O_RDWR | O_TRUNC, 0644); - struct SSample3* destObj = nullptr; + struct SSample3 *destObj = nullptr; int32_t ec = g_testClient->SSample3Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); EXPECT_STREQ(srcObj->m1, destObj->m1); EXPECT_EQ(srcObj->m2, destObj->m2); - EXPECT_EQ((srcObj->m3.m1 ? 1 : 0), (destObj->m3.m1 ? 1 : 0)); EXPECT_EQ(srcObj->m3.m2, destObj->m3.m2); EXPECT_EQ(srcObj->m3.m3, destObj->m3.m3); @@ -152,109 +161,116 @@ HWTEST_F(CStructTest, CStructTest_004, TestSize.Level1) EXPECT_EQ(srcObj->m3.m9, destObj->m3.m9); EXPECT_FLOAT_EQ(srcObj->m3.m10, destObj->m3.m10); EXPECT_DOUBLE_EQ(srcObj->m3.m11, destObj->m3.m11); - SSample3Free(srcObj, true); SSample3Free(destObj, true); } -HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) +static void SSample4Part1Init(struct SSample4 *srcObj) { - struct SSample4* srcObj = (struct SSample4*)OsalMemCalloc(sizeof(struct SSample4)); - ASSERT_NE(srcObj, nullptr); - - srcObj->m1Len = 2; - srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * srcObj->m1Len); + srcObj->m1Len = g_arrayLen; + srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m1Len; i++) { srcObj->m1[i] = true; } - srcObj->m2Len = 2; - srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { - srcObj->m2[i] = 65; + srcObj->m2[i] = g_integer8Var; } - srcObj->m3Len = 2; - srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { - srcObj->m3[i] = 3; + srcObj->m3[i] = g_integer16Var; } - srcObj->m4Len = 2; - srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * srcObj->m4Len); + srcObj->m4Len = g_arrayLen; + srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m4Len; i++) { - srcObj->m4[i] = 4; + srcObj->m4[i] = g_integer32Var; } - srcObj->m5Len = 2; - srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * srcObj->m5Len); + srcObj->m5Len = g_arrayLen; + srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m5Len; i++) { - srcObj->m5[i] = 5; + srcObj->m5[i] = g_integer64Var; } +} - srcObj->m6Len = 2; - srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * srcObj->m6Len); +static void SSample4Part2Init(struct SSample4 *srcObj) +{ + srcObj->m6Len = g_arrayLen; + srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m6Len; i++) { - srcObj->m6[i] = 97; + srcObj->m6[i] = g_uInteger8Var; } - srcObj->m7Len = 2; - srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * srcObj->m7Len); + srcObj->m7Len = g_arrayLen; + srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m7Len; i++) { - srcObj->m7[i] = 7; + srcObj->m7[i] = g_uInteger16Var; } - srcObj->m8Len = 2; - srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * srcObj->m8Len); + srcObj->m8Len = g_arrayLen; + srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m8Len; i++) { - srcObj->m8[i] = 8; + srcObj->m8[i] = g_uInteger32Var; } - srcObj->m9Len = 2; - srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * srcObj->m9Len); + srcObj->m9Len = g_arrayLen; + srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m9Len; i++) { - srcObj->m9[i] = 9; + srcObj->m9[i] = g_uInteger64Var; } - srcObj->m10Len = 2; - srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * srcObj->m10Len); + srcObj->m10Len = g_arrayLen; + srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m10Len; i++) { - srcObj->m10[i] = 10.5; + srcObj->m10[i] = g_floatVar; } - srcObj->m11Len = 2; - srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * srcObj->m11Len); + srcObj->m11Len = g_arrayLen; + srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m11Len; i++) { - srcObj->m11[i] = 11.55; + srcObj->m11[i] = g_doubleVar; } +} - srcObj->m12Len = 2; - srcObj->m12 = (char**)OsalMemCalloc(sizeof(char*) * srcObj->m12Len); +static void SSample4Part3Init(struct SSample4 *srcObj) +{ + srcObj->m12Len = g_arrayLen; + srcObj->m12 = (char**)OsalMemCalloc(sizeof(char *) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m12Len; i++) { - const char* str = "hello world"; + const char *str = "hello world"; srcObj->m12[i] = strdup(str); } - srcObj->m13Len = 2; - srcObj->m13 = (enum ESample*)OsalMemCalloc(sizeof(enum ESample) * srcObj->m13Len); + srcObj->m13Len = g_arrayLen; + srcObj->m13 = (enum ESample *)OsalMemCalloc(sizeof(enum ESample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m13Len; i++) { srcObj->m13[i] = MEM_ONE; } - srcObj->m14Len = 2; - srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * srcObj->m14Len); + srcObj->m14Len = g_arrayLen; + srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m14Len; i++) { srcObj->m14[i].m1 = true; - srcObj->m14[i].m2 = 2; - srcObj->m14[i].m3 = 3.55; + srcObj->m14[i].m2 = g_integer32Var; + srcObj->m14[i].m3 = g_doubleVar; srcObj->m14[i].m4 = strdup("hello"); } +} - struct SSample4* destObj = nullptr; - int32_t ec = g_testClient->SSample4Test(g_testClient, srcObj, &destObj); - ASSERT_EQ(ec, HDF_SUCCESS); - +static void SSample4Init(struct SSample4 *srcObj) +{ + SSample4Part1Init(srcObj); + SSample4Part2Init(srcObj); + SSample4Part3Init(srcObj); +} +static void CompareSSample4Part1(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m1Len; i++) { EXPECT_EQ((srcObj->m1[i] ? 1 : 0), (destObj->m1[i] ? 1 : 0)); } @@ -274,7 +290,10 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m5Len; i++) { EXPECT_EQ(srcObj->m5[i], destObj->m5[i]); } +} +static void CompareSSample4Part2(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m6Len; i++) { EXPECT_EQ(srcObj->m6[i], destObj->m6[i]); } @@ -298,7 +317,10 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m11Len; i++) { EXPECT_DOUBLE_EQ(srcObj->m11[i], destObj->m11[i]); } +} +static void CompareSSample4Part3(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ for (uint32_t i = 0; i < srcObj->m12Len; i++) { EXPECT_STREQ(srcObj->m12[i], destObj->m12[i]); } @@ -313,108 +335,138 @@ HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) EXPECT_DOUBLE_EQ((srcObj->m14[i]).m3, (destObj->m14[i]).m3); EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } +} - SSample4Free(srcObj, true); - SSample4Free(destObj, true); +static void CompareSSample4(const struct SSample4 *srcObj, const struct SSample4 *destObj) +{ + CompareSSample4Part1(srcObj, destObj); + CompareSSample4Part2(srcObj, destObj); + CompareSSample4Part3(srcObj, destObj); } -HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) +HWTEST_F(CStructTest, CStructTest_005, TestSize.Level1) { - struct SSample5* srcObj = (struct SSample5*)OsalMemCalloc(sizeof(struct SSample5)); + struct SSample4 *srcObj = (struct SSample4*)OsalMemCalloc(sizeof(struct SSample4)); ASSERT_NE(srcObj, nullptr); - srcObj->m1Len = 2; - srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * srcObj->m1Len); + SSample4Init(srcObj); + + struct SSample4 *destObj = nullptr; + int32_t ec = g_testClient->SSample4Test(g_testClient, srcObj, &destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample4(srcObj, destObj); + + SSample4Free(srcObj, true); + SSample4Free(destObj, true); +} + +static void SSample5Part1Init(struct SSample4 *srcObj) +{ + srcObj->m1Len = g_arrayLen; + srcObj->m1 = (bool*)OsalMemCalloc(sizeof(bool) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m1Len; i++) { srcObj->m1[i] = true; } - srcObj->m2Len = 2; - srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (int8_t*)OsalMemCalloc(sizeof(int8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { - srcObj->m2[i] = 65; + srcObj->m2[i] = g_integer8Var; } - srcObj->m3Len = 2; - srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (int16_t*)OsalMemCalloc(sizeof(int16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { - srcObj->m3[i] = 3; + srcObj->m3[i] = g_integer16Var; } - srcObj->m4Len = 2; - srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * srcObj->m4Len); + srcObj->m4Len = g_arrayLen; + srcObj->m4 = (int32_t*)OsalMemCalloc(sizeof(int32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m4Len; i++) { - srcObj->m4[i] = 4; + srcObj->m4[i] = g_integer32Var; } - srcObj->m5Len = 2; - srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * srcObj->m5Len); + srcObj->m5Len = g_arrayLen; + srcObj->m5 = (int64_t*)OsalMemCalloc(sizeof(int64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m5Len; i++) { - srcObj->m5[i] = 5; + srcObj->m5[i] = g_integer64Var; } +} - srcObj->m6Len = 2; - srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * srcObj->m6Len); +static void SSample5Part2Init(struct SSample4 *srcObj) +{ + srcObj->m6Len = g_arrayLen; + srcObj->m6 = (uint8_t*)OsalMemCalloc(sizeof(uint8_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m6Len; i++) { - srcObj->m6[i] = 97; + srcObj->m6[i] = g_uInteger8Var; } - srcObj->m7Len = 2; - srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * srcObj->m7Len); + srcObj->m7Len = g_arrayLen; + srcObj->m7 = (uint16_t*)OsalMemCalloc(sizeof(uint16_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m7Len; i++) { - srcObj->m7[i] = 7; + srcObj->m7[i] = g_uInteger16Var; } - srcObj->m8Len = 2; - srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * srcObj->m8Len); + srcObj->m8Len = g_arrayLen; + srcObj->m8 = (uint32_t*)OsalMemCalloc(sizeof(uint32_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m8Len; i++) { - srcObj->m8[i] = 8; + srcObj->m8[i] = g_uInteger32Var; } - srcObj->m9Len = 2; - srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * srcObj->m9Len); + srcObj->m9Len = g_arrayLen; + srcObj->m9 = (uint64_t*)OsalMemCalloc(sizeof(uint64_t) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m9Len; i++) { - srcObj->m9[i] = 9; + srcObj->m9[i] = g_uInteger64Var; } - srcObj->m10Len = 2; - srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * srcObj->m10Len); + srcObj->m10Len = g_arrayLen; + srcObj->m10 = (float*)OsalMemCalloc(sizeof(float) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m10Len; i++) { - srcObj->m10[i] = 10.5; + srcObj->m10[i] = g_floatVar; } - srcObj->m11Len = 2; - srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * srcObj->m11Len); + srcObj->m11Len = g_arrayLen; + srcObj->m11 = (double*)OsalMemCalloc(sizeof(double) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m11Len; i++) { - srcObj->m11[i] = 11.55; + srcObj->m11[i] = g_doubleVar; } +} - srcObj->m12Len = 2; - srcObj->m12 = (char**)OsalMemCalloc(sizeof(char*) * srcObj->m12Len); +static void SSample5Part3Init(struct SSample4 *srcObj) +{ + srcObj->m12Len = g_arrayLen; + srcObj->m12 = (char**)OsalMemCalloc(sizeof(char *) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m12Len; i++) { - const char* str = "hello world"; + const char *str = "hello world"; srcObj->m12[i] = strdup(str); } - srcObj->m13Len = 2; - srcObj->m13 = (enum ESample*)OsalMemCalloc(sizeof(enum ESample) * srcObj->m13Len); + srcObj->m13Len = g_arrayLen; + srcObj->m13 = (enum ESample *)OsalMemCalloc(sizeof(enum ESample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m13Len; i++) { srcObj->m13[i] = MEM_ONE; } - srcObj->m14Len = 2; - srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * srcObj->m14Len); + srcObj->m14Len = g_arrayLen; + srcObj->m14 = (struct SSample*)OsalMemCalloc(sizeof(struct SSample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m14Len; i++) { srcObj->m14[i].m1 = true; - srcObj->m14[i].m2 = 2; - srcObj->m14[i].m3 = 3.55; + srcObj->m14[i].m2 = g_integer32Var; + srcObj->m14[i].m3 = g_doubleVar; srcObj->m14[i].m4 = strdup("hello"); } +} - struct SSample5* destObj = nullptr; - int32_t ec = g_testClient->SSample5Test(g_testClient, srcObj, &destObj); - ASSERT_EQ(ec, HDF_SUCCESS); +static void SSample5Init(struct SSample5 *srcObj) +{ + SSample5Part1Init(srcObj); + SSample5Part2Init(srcObj); + SSample5Part3Init(srcObj); +} +static void CompareSSample5Part1(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m1Len; i++) { EXPECT_EQ((srcObj->m1[i] ? 1 : 0), (destObj->m1[i] ? 1 : 0)); } @@ -434,7 +486,10 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m5Len; i++) { EXPECT_EQ(srcObj->m5[i], destObj->m5[i]); } +} +static void CompareSSample5Part2(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m6Len; i++) { EXPECT_EQ(srcObj->m6[i], destObj->m6[i]); } @@ -458,7 +513,10 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) for (uint32_t i = 0; i < srcObj->m11Len; i++) { EXPECT_DOUBLE_EQ(srcObj->m11[i], destObj->m11[i]); } +} +static void CompareSSample5Part3(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ for (uint32_t i = 0; i < srcObj->m12Len; i++) { EXPECT_STREQ(srcObj->m12[i], destObj->m12[i]); } @@ -473,6 +531,27 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) EXPECT_DOUBLE_EQ((srcObj->m14[i]).m3, (destObj->m14[i]).m3); EXPECT_STREQ((srcObj->m14[i]).m4, (destObj->m14[i]).m4); } +} + +static void CompareSSample5(const struct SSample5 *srcObj, const struct SSample5 *destObj) +{ + CompareSSample5Part1(srcObj, destObj); + CompareSSample5Part2(srcObj, destObj); + CompareSSample5Part3(srcObj, destObj); +} + +HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) +{ + struct SSample5 *srcObj = (struct SSample5*)OsalMemCalloc(sizeof(struct SSample5)); + ASSERT_NE(srcObj, nullptr); + + SSample5Init(srcObj); + + struct SSample5 *destObj = nullptr; + int32_t ec = g_testClient->SSample5Test(g_testClient, srcObj, &destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample5(srcObj, destObj); SSample5Free(srcObj, true); SSample5Free(destObj, true); @@ -480,27 +559,27 @@ HWTEST_F(CStructTest, CStructTest_006, TestSize.Level1) HWTEST_F(CStructTest, CStructTest_007, TestSize.Level1) { - struct SSample6* srcObj = (struct SSample6*)OsalMemCalloc(sizeof(struct SSample6)); + struct SSample6 *srcObj = (struct SSample6 *)OsalMemCalloc(sizeof(struct SSample6)); ASSERT_NE(srcObj, nullptr); srcObj->m1.m1 = true; - srcObj->m1.m2 = 1; + srcObj->m1.m2 = g_integer32Var; - srcObj->m2Len = 2; - srcObj->m2 = (union USample*)OsalMemCalloc(sizeof(union USample) * srcObj->m2Len); + srcObj->m2Len = g_arrayLen; + srcObj->m2 = (union USample*)OsalMemCalloc(sizeof(union USample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m2Len; i++) { (srcObj->m2[i]).m1 = true; (srcObj->m2[i]).m2 = 2; } - srcObj->m3Len = 2; - srcObj->m3 = (union USample*)OsalMemCalloc(sizeof(union USample) * srcObj->m3Len); + srcObj->m3Len = g_arrayLen; + srcObj->m3 = (union USample*)OsalMemCalloc(sizeof(union USample) * g_arrayLen); for (uint32_t i = 0; i < srcObj->m3Len; i++) { (srcObj->m3[i]).m1 = true; (srcObj->m3[i]).m2 = 2; } - struct SSample6* destObj = nullptr; + struct SSample6 *destObj = nullptr; int32_t ec = g_testClient->SSample6Test(g_testClient, srcObj, &destObj); ASSERT_EQ(ec, HDF_SUCCESS); diff --git a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp index 6a26787eb..3473bf4af 100755 --- a/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp +++ b/tools/hdi-gen/test/cpp_test/struct_test/v1_0/cpp_struct_test.cpp @@ -114,31 +114,8 @@ HWTEST_F(CppStructTest, CppStructTest_004, TestSize.Level1) close(destObj.m4); } -HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) +static void CompareSSample4Part1(const SSample4& srcObj, const SSample4& destObj) const { - SSample4 srcObj = { - {true, false}, - {65, 66}, - {3, 4}, - {5, 6}, - {7, 8}, - {97, 98}, - {30, 40}, - {50, 60}, - {70, 80}, - {10.5, 20.5}, - {30.125, 30.125}, - {"hello", "world"}, - {ESample::MEM_ONE, ESample::MEM_THREE}, - {{true, 1, 1000.125, "hello"}, {false, 1, 1000.125, "world"}}, - {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, - }; - - SSample4 destObj; - - int32_t ec = g_testClient->SSample4Test(srcObj, destObj); - ASSERT_EQ(ec, HDF_SUCCESS); - for (size_t i = 0; i < srcObj.m1.size(); i++) { EXPECT_EQ((srcObj.m1[i] ? 1 : 0), (destObj.m1[i] ? 1 : 0)); } @@ -158,7 +135,10 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) for (size_t i = 0; i < srcObj.m5.size(); i++) { EXPECT_EQ(srcObj.m5[i], destObj.m5[i]); } +} +static void CompareSSample4Part2(const SSample4& srcObj, const SSample4& destObj) const +{ for (size_t i = 0; i < srcObj.m6.size(); i++) { EXPECT_EQ(srcObj.m6[i], destObj.m6[i]); } @@ -182,7 +162,10 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) for (size_t i = 0; i < srcObj.m11.size(); i++) { EXPECT_DOUBLE_EQ(srcObj.m11[i], destObj.m11[i]); } +} +static void CompareSSample4Part3(const SSample4& srcObj, const SSample4& destObj) const +{ for (size_t i = 0; i < srcObj.m12.size(); i++) { EXPECT_EQ(srcObj.m12[i], destObj.m12[i]); } @@ -212,9 +195,16 @@ HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) } } -HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) +static void CompareSSample4(const SSample4& srcObj, const SSample4& destObj) const { - SSample5 srcObj = { + CompareSSample4Part1(srcObj, destObj); + CompareSSample4Part2(srcObj, destObj); + CompareSSample4Part3(srcObj, destObj); +} + +HWTEST_F(CppStructTest, CppStructTest_005, TestSize.Level1) +{ + SSample4 srcObj = { {true, false}, {65, 66}, {3, 4}, @@ -232,11 +222,16 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, }; - SSample5 destObj; + SSample4 destObj; - int32_t ec = g_testClient->SSample5Test(srcObj, destObj); + int32_t ec = g_testClient->SSample4Test(srcObj, destObj); ASSERT_EQ(ec, HDF_SUCCESS); + CompareSSample4(srcObj, destObj); +} + +static void CompareSSample5Part1(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m1.size(); i++) { EXPECT_EQ((srcObj.m1[i] ? 1 : 0), (destObj.m1[i] ? 1 : 0)); } @@ -256,7 +251,10 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) for (size_t i = 0; i < srcObj.m5.size(); i++) { EXPECT_EQ(srcObj.m5[i], destObj.m5[i]); } +} +static void CompareSSample5Part2(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m6.size(); i++) { EXPECT_EQ(srcObj.m6[i], destObj.m6[i]); } @@ -280,7 +278,10 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) for (size_t i = 0; i < srcObj.m11.size(); i++) { EXPECT_DOUBLE_EQ(srcObj.m11[i], destObj.m11[i]); } +} +static void CompareSSample5Part3(const SSample5& srcObj, const SSample5& destObj) const +{ for (size_t i = 0; i < srcObj.m12.size(); i++) { EXPECT_EQ(srcObj.m12[i], destObj.m12[i]); } @@ -308,4 +309,39 @@ HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) std::cout << "var1 or var2 is nullptr" << std::endl; } } +} + +static void CompareSSample5(const SSample5& srcObj, const SSample5& destObj) const +{ + CompareSSample5Part1(srcObj, destObj); + CompareSSample5Part2(srcObj, destObj); + CompareSSample5Part3(srcObj, destObj); +} + +HWTEST_F(CppStructTest, CppStructTest_006, TestSize.Level1) +{ + SSample5 srcObj = { + {true, false}, + {65, 66}, + {3, 4}, + {5, 6}, + {7, 8}, + {97, 98}, + {30, 40}, + {50, 60}, + {70, 80}, + {10.5, 20.5}, + {30.125, 30.125}, + {"hello", "world"}, + {ESample::MEM_ONE, ESample::MEM_THREE}, + {{true, 1, 1000.125, "hello"}, {false, 1, 1000.125, "world"}}, + {sptr(new SequenceData(1, 1.2, "hello")), sptr(new SequenceData(2, 2.2, "world"))}, + }; + + SSample5 destObj; + + int32_t ec = g_testClient->SSample5Test(srcObj, destObj); + ASSERT_EQ(ec, HDF_SUCCESS); + + CompareSSample5(srcObj, destObj); } \ No newline at end of file diff --git a/tools/hdi-gen/util/file.h b/tools/hdi-gen/util/file.h index 988b9c961..dec9279ab 100755 --- a/tools/hdi-gen/util/file.h +++ b/tools/hdi-gen/util/file.h @@ -88,4 +88,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_FILE_H +#endif // OHOS_HDI_FILE_H \ No newline at end of file diff --git a/tools/hdi-gen/util/light_refcount_base.h b/tools/hdi-gen/util/light_refcount_base.h index b0ea25471..2afac227f 100755 --- a/tools/hdi-gen/util/light_refcount_base.h +++ b/tools/hdi-gen/util/light_refcount_base.h @@ -38,4 +38,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_LIGHTREFCOUNTBASE_H +#endif // OHOS_HDI_LIGHTREFCOUNTBASE_H \ No newline at end of file diff --git a/tools/hdi-gen/util/logger.h b/tools/hdi-gen/util/logger.h index c2d6ad939..2ba473cb0 100755 --- a/tools/hdi-gen/util/logger.h +++ b/tools/hdi-gen/util/logger.h @@ -46,4 +46,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDI_LOGGER_H +#endif // OHOS_HDI_LOGGER_H \ No newline at end of file diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index 8825856bb..a8f8a7c45 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -122,4 +122,4 @@ private: } // namespace HDI } // namespace OHOS -#endif // OHOS_HDIL_OPTION_H +#endif // OHOS_HDIL_OPTION_H \ No newline at end of file -- Gitee From 9f3192982fa16fc5264f5b69587eca10c485cdb3 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Fri, 24 Sep 2021 10:31:11 +0800 Subject: [PATCH 054/272] Large function optimization Signed-off-by: haizhouyang --- model/storage/src/mtd/mtd_core.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 65e33a1c4..001d299c1 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -380,11 +380,6 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc off_t eraseOffset; struct MtdPage mtdPage; -#ifdef MTD_DEBUG - HDF_LOGD("%s: addr=0x%jd, len=%zu, buf=%p, type:%d, withoob:%d, skipbad:%d", __func__, - msg->addr, msg->len, msg->buf, msg->type, msg->withOob, msg->skipBad); -#endif - dataLenLeft = msg->withOob ? (msg->len / (mtdDevice->writeSize + mtdDevice->oobSize)) * mtdDevice->writeSize : msg->len; -- Gitee From 1fc853c70566bd9d22cc2b58902e1da9bd88bfb1 Mon Sep 17 00:00:00 2001 From: fanxiaoyu Date: Fri, 24 Sep 2021 09:20:29 +0000 Subject: [PATCH 055/272] Description:adapte dsoftbus kernel driver module for liteos-a Feature or Bugfix:Feature Binary Source: No Signed-off-by: fanxiaoyu --- model/misc/dsoftbus/src/module_manager.c | 2 +- model/misc/dsoftbus/src/wlan_param_monitor.c | 66 ++------------------ 2 files changed, 5 insertions(+), 63 deletions(-) diff --git a/model/misc/dsoftbus/src/module_manager.c b/model/misc/dsoftbus/src/module_manager.c index ea9f741bb..0f9da6086 100644 --- a/model/misc/dsoftbus/src/module_manager.c +++ b/model/misc/dsoftbus/src/module_manager.c @@ -19,7 +19,7 @@ static SoftbusDriverModule g_modules[] = { #ifdef ENABLE_WLAN_PARAM_MONITOR { .init = SoftbusWlanParamMonitorInit, - .deinit = SoftbusWlanParamMonitorDeinit, + .deinit = NULL, .process = SoftbusWlanParamMonitorProcess, }, #endif diff --git a/model/misc/dsoftbus/src/wlan_param_monitor.c b/model/misc/dsoftbus/src/wlan_param_monitor.c index 07eeb8309..d06fa4fec 100644 --- a/model/misc/dsoftbus/src/wlan_param_monitor.c +++ b/model/misc/dsoftbus/src/wlan_param_monitor.c @@ -12,15 +12,13 @@ #include "hdf_log.h" #include "module_manager.h" #include "osal_time.h" -#include "osal_timer.h" #define HDF_LOG_TAG "wlan_param_monitor" #define WLAN_PARAM_REPORT_INTERVAL 1000 typedef enum { - CMD_START_MONITOR = 0, - CMD_STOP_MONITOR, + CMD_REQUEST_PARAM = 0, CMD_MAX_INDEX } Command; @@ -29,26 +27,16 @@ typedef enum { EVENT_MAX_INDEX } Event; -typedef struct { - OSAL_DECLARE_TIMER(timer); - bool isTimerStart; -} WlanParamMonitorCtrl; - typedef struct { uint32_t event; uint32_t value; } ReportInfo; -static WlanParamMonitorCtrl g_wlanParamMonitorCtrl = { - .isTimerStart = false, -}; - -static void WlanParamReportTimer(uintptr_t arg) +static void ProcessRequestParam(void) { ReportInfo info; struct HdfSBuf *data = NULL; - (void)arg; info.event = EVENT_WLAN_PARAM; info.value = (uint32_t)OsalGetSysTimeMs(); data = HdfSBufObtainDefaultSize(); @@ -65,38 +53,6 @@ static void WlanParamReportTimer(uintptr_t arg) HdfSBufRecycle(data); } -static void ProcessStartMonitor(void) -{ - if (g_wlanParamMonitorCtrl.isTimerStart) { - HDF_LOGE("wlan param monitor timer is already started"); - return; - } - if (OsalTimerCreate(&g_wlanParamMonitorCtrl.timer, WLAN_PARAM_REPORT_INTERVAL, - WlanParamReportTimer, 0) != HDF_SUCCESS) { - HDF_LOGE("create wlan param monitor timer fail"); - return; - } - if (OsalTimerStartLoop(&g_wlanParamMonitorCtrl.timer) != HDF_SUCCESS) { - OsalTimerDelete(&g_wlanParamMonitorCtrl.timer); - HDF_LOGE("start wlan param monitor timer fail"); - return; - } - g_wlanParamMonitorCtrl.isTimerStart = true; -} - -static void ProcessStopMonitor(void) -{ - if (!g_wlanParamMonitorCtrl.isTimerStart) { - HDF_LOGE("wlan param monitor timer is not started"); - return; - } - if (OsalTimerDelete(&g_wlanParamMonitorCtrl.timer) != HDF_SUCCESS) { - HDF_LOGE("delete wlan param monitor timer fail"); - } else { - g_wlanParamMonitorCtrl.isTimerStart = false; - } -} - int32_t SoftbusWlanParamMonitorInit(struct HdfDeviceObject *device) { (void)device; @@ -104,13 +60,6 @@ int32_t SoftbusWlanParamMonitorInit(struct HdfDeviceObject *device) return HDF_SUCCESS; } -void SoftbusWlanParamMonitorDeinit(void) -{ - if (g_wlanParamMonitorCtrl.isTimerStart) { - ProcessStartMonitor(); - } -} - void SoftbusWlanParamMonitorProcess(const struct HdfSBuf *reqData, struct HdfSBuf *rspData) { uint32_t cmd; @@ -128,14 +77,7 @@ void SoftbusWlanParamMonitorProcess(const struct HdfSBuf *reqData, struct HdfSBu } cmd = *((uint32_t *)data); HDF_LOGI("process command: %d", cmd); - switch (cmd) { - case CMD_START_MONITOR: - ProcessStartMonitor(); - break; - case CMD_STOP_MONITOR: - ProcessStopMonitor(); - break; - default: - break; + if (cmd == CMD_REQUEST_PARAM) { + ProcessRequestParam(); } } \ No newline at end of file -- Gitee From ec287d4d1ab8c6f7311ea7eb95ee008b834432a3 Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Fri, 24 Sep 2021 17:23:40 +0800 Subject: [PATCH 056/272] =?UTF-8?q?0924-drivers-mtd=20reviewbot=E6=B8=85?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- model/storage/src/mtd/mtd_core.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 65e33a1c4..8558c683a 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -207,7 +207,6 @@ static void MtdDumpBuf(uint8_t *buf, size_t len) #define MTD_DUMP_LINE_LEN 32 #define MTD_DUMP_BUF_LEN (MTD_DUMP_LINE_LEN * MTD_DUMP_SIGLE_WIDTH + 1) char lineBuf[MTD_DUMP_BUF_LEN]; - for (idx = 0; idx < len;) { line = (MTD_DUMP_LINE_LEN <= (len - idx)) ? MTD_DUMP_LINE_LEN : (len - idx); for (i = 0, lidx = 0; i < line; i++, lidx += MTD_DUMP_SIGLE_WIDTH, buf++) { @@ -387,7 +386,6 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc dataLenLeft = msg->withOob ? (msg->len / (mtdDevice->writeSize + mtdDevice->oobSize)) * mtdDevice->writeSize : msg->len; - for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity;) { if (MtdDeviceIsBadBlockUnlocked(mtdDevice, addr)) { if (!msg->skipBad) { -- Gitee From 590b4e4af37b9be9b0edd86cd836e951d6c7692d Mon Sep 17 00:00:00 2001 From: zianed Date: Sun, 26 Sep 2021 12:11:34 +0800 Subject: [PATCH 057/272] delete unused file Signed-off-by: zianed --- model/audio/common/src/audio_dsp_base.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 model/audio/common/src/audio_dsp_base.c diff --git a/model/audio/common/src/audio_dsp_base.c b/model/audio/common/src/audio_dsp_base.c deleted file mode 100755 index e69de29bb..000000000 -- Gitee From bd3b607b60794a32abb7c0aa36a1a1f5feb1ca02 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 22 Sep 2021 15:37:21 +0800 Subject: [PATCH 058/272] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=EF=BC=9A1.mipi=5Fcsi=20=E6=8E=A5=E5=85=A5=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- include/platform/mipi_csi_if.h | 545 +++++++++++++ .../platform/include/common/platform_core.h | 1 + support/platform/include/mipi_csi_core.h | 612 +++++++++++++++ support/platform/include/mipi_csi_dev.h | 83 ++ support/platform/src/common/platform_common.c | 6 + support/platform/src/mipi_csi_core.c | 742 ++++++++++++++++++ support/platform/src/mipi_csi_if.c | 82 ++ 7 files changed, 2071 insertions(+) create mode 100755 include/platform/mipi_csi_if.h create mode 100755 support/platform/include/mipi_csi_core.h create mode 100755 support/platform/include/mipi_csi_dev.h create mode 100755 support/platform/src/mipi_csi_core.c create mode 100755 support/platform/src/mipi_csi_if.c diff --git a/include/platform/mipi_csi_if.h b/include/platform/mipi_csi_if.h new file mode 100755 index 000000000..856284292 --- /dev/null +++ b/include/platform/mipi_csi_if.h @@ -0,0 +1,545 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +/** + * @addtogroup MIPI CSI + * @{ + * + * @brief Defines standard MIPI CSI APIs for display driver development. + * + * This MIPI CSI module abstracts MIPI CSI capabilities of different system platforms to provide stable APIs + * for display driver development. You can use this module to obtain/release the MIPI CSI device handle, + * initialize the MIPI CSI device, and send/receive commands that interact with display peripherals. + * + * @since 1.0 + */ + +/** + * @file mipi_csi_if.h + * + * @brief Declares standard MIPI CSI APIs for display driver development. + * + * + * + * @since 1.0 + */ + +#ifndef MIPI_CSI_IF_H +#define MIPI_CSI_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @brief Maximum number of lanes supported by MIPI RX's Mipi device. + * + * @since 1.0 + */ +#define MIPI_LANE_NUM 4 + +/** + * @brief The maximum number of lanes supported by the LVDS device of Mipi Rx. + * + * @since 1.0 + */ +#define LVDS_LANE_NUM 4 + +/** + * @brief Defines the maximum number of virtual channels supported. + * + * @since 1.0 + */ +#define WDR_VC_NUM 4 + +/** + * @brief Define the number of synchronization codes for each virtual channel of LVDS. + * + * @since 1.0 + */ +#define SYNC_CODE_NUM 4 + +/** + * @brief Maximum 3 groups of extended data types. + * + * @since 1.0 + */ +#define MAX_EXT_DATA_TYPE_NUM 3 + +/** + * @brief Lane distribution of Mipi Rx. + * + * @since 1.0 + */ +typedef enum { + LANE_DIVIDE_MODE_0 = 0, + LANE_DIVIDE_MODE_1 = 1, + LANE_DIVIDE_MODE_BUTT +} LaneDivideMode; + +/** + * @brief MIPI RX input interface type. + * + * @since 1.0 + */ +typedef enum { + /** mipi */ + INPUT_MODE_MIPI = 0x0, + /** SUB_LVDS */ + INPUT_MODE_SUBLVDS = 0x1, + /** LVDS */ + INPUT_MODE_LVDS = 0x2, + /* HISPI */ + INPUT_MODE_HISPI = 0x3, + /** CMOS */ + INPUT_MODE_CMOS = 0x4, + /** BT601 */ + INPUT_MODE_BT601 = 0x5, + /** BT656 */ + INPUT_MODE_BT656 = 0x6, + /** BT1120 */ + INPUT_MODE_BT1120 = 0x7, + /** MIPI Bypass */ + INPUT_MODE_BYPASS = 0x8, + INPUT_MODE_BUTT +} InputMode; + +/** + * @brief Mipi Rx, SLVS input rate. + * + * @since 1.0 + */ +typedef enum { + /** output 1 pixel per clock */ + MIPI_DATA_RATE_X1 = 0, + /** output 2 pixel per clock */ + MIPI_DATA_RATE_X2 = 1, + MIPI_DATA_RATE_BUTT +} MipiDataRate; + +/** + * @brief Mipi crop area properties. + * + * @since 1.0 + */ +typedef struct { + int x; + int y; + unsigned int width; + unsigned int height; +} ImgRect; + +/** + * @brief Type of data transmitted. + * + * @since 1.0 + */ +typedef enum { + DATA_TYPE_RAW_8BIT = 0, + DATA_TYPE_RAW_10BIT, + DATA_TYPE_RAW_12BIT, + DATA_TYPE_RAW_14BIT, + DATA_TYPE_RAW_16BIT, + DATA_TYPE_YUV420_8BIT_NORMAL, + DATA_TYPE_YUV420_8BIT_LEGACY, + DATA_TYPE_YUV422_8BIT, + /** yuv422 8bit transform user define 16bit raw */ + DATA_TYPE_YUV422_PACKED, + DATA_TYPE_BUTT +} DataType; + +/** + * @brief Define YUV and RAW data format and bit depth. + * + * @since 1.0 + */ +typedef struct { + uint8_t devno; + unsigned int num; + unsigned int extDataBitWidth[MAX_EXT_DATA_TYPE_NUM]; + unsigned int extDataType[MAX_EXT_DATA_TYPE_NUM]; +} ExtDataType; + +/** + * @brief MIPI D-PHY WDR MODE defines + * + * @since 1.0 + */ +typedef enum { + HI_MIPI_WDR_MODE_NONE = 0x0, + /** Virtual Channel */ + HI_MIPI_WDR_MODE_VC = 0x1, + /** Data Type */ + HI_MIPI_WDR_MODE_DT = 0x2, + /** DOL Mode */ + HI_MIPI_WDR_MODE_DOL = 0x3, + HI_MIPI_WDR_MODE_BUTT +} MipiWdrMode; + +/** + * @brief Mipi device properties. + * + * @since 1.0 + */ +typedef struct { + /** data type: 8/10/12/14/16 bit */ + DataType inputDataType; + /** MIPI WDR mode */ + MipiWdrMode wdrMode; + /** laneId: -1 - disable */ + short laneId[MIPI_LANE_NUM]; + + union { + /** used by the HI_MIPI_WDR_MODE_DT */ + short dataType[WDR_VC_NUM]; + }; +} MipiDevAttr; + +/** + * @brief LVDS WDR mode. + * + * @since 1.0 + */ +typedef enum { + HI_WDR_MODE_NONE = 0x0, + HI_WDR_MODE_2F = 0x1, + HI_WDR_MODE_3F = 0x2, + HI_WDR_MODE_4F = 0x3, + HI_WDR_MODE_DOL_2F = 0x4, + HI_WDR_MODE_DOL_3F = 0x5, + HI_WDR_MODE_DOL_4F = 0x6, + HI_WDR_MODE_BUTT +} WdrMode; + +/** + * @brief LVDS synchronization mode. + * + * @since 1.0 + */ +typedef enum { + /** sensor SOL, EOL, SOF, EOF */ + LVDS_SYNC_MODE_SOF = 0, + /** SAV, EAV */ + LVDS_SYNC_MODE_SAV, + LVDS_SYNC_MODE_BUTT +} LvdsSyncMode; + +/** + * @brief LVDS Vsync type. + * + * @since 1.0 + */ +typedef enum { + LVDS_VSYNC_NORMAL = 0x00, + LVDS_VSYNC_SHARE = 0x01, + LVDS_VSYNC_HCONNECT = 0x02, + LVDS_VSYNC_BUTT +} LvdsVsyncType; + +/** + * @brief LVDS Vsync column synchronization parameters. + * + * @since 1.0 + */ +typedef struct { + LvdsVsyncType syncType; + + /* hconnect vsync blanking len, valid when the syncType is LVDS_VSYNC_HCONNECT */ + unsigned short hblank1; + unsigned short hblank2; +} LvdsVsyncAttr; + +/** + * @brief Frame ID type. + * + * @since 1.0 + */ +typedef enum { + LVDS_FID_NONE = 0x00, + /** frame identification id in SAV 4th */ + LVDS_FID_IN_SAV = 0x01, + /** frame identification id in first data */ + LVDS_FID_IN_DATA = 0x02, + LVDS_FID_BUTT +} LvdsFidType; + +/** + * @brief Frame ID configuration information. + * + * @since 1.0 + */ +typedef struct { + LvdsFidType fidType; + + /** Sony DOL has the Frame Information Line, in DOL H-Connection mode, + should configure this flag as false to disable output the Frame Information Line */ + unsigned char outputFil; +} LvdsFidAttr; + +/** + * @brief LVDS bit size end mode. + * + * @since 1.0 + */ +typedef enum { + LVDS_ENDIAN_LITTLE = 0x0, + LVDS_ENDIAN_BIG = 0x1, + LVDS_ENDIAN_BUTT +} LvdsBitEndian; + +/** + * @brief LVDS / SubLVDS / HiSPi device properties. + * + * @since 1.0 + */ +typedef struct { + /** data type: 8/10/12/14 bit */ + DataType inputDataType; + /** WDR mode */ + WdrMode wdrMode; + + /** sync mode: SOF, SAV */ + LvdsSyncMode syncMode; + /** normal, share, hconnect */ + LvdsVsyncAttr vsyncAttr; + /** frame identification code */ + LvdsFidAttr fidAttr; + + /** data endian: little/big */ + LvdsBitEndian dataEndian; + /** sync code endian: little/big */ + LvdsBitEndian syncCodeEndian; + /** laneId: -1 - disable */ + short laneId[LVDS_LANE_NUM]; + + /** each vc has 4 params, syncCode[i]: + syncMode is SYNC_MODE_SOF: SOF, EOF, SOL, EOL + syncMode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav */ + unsigned short syncCode[LVDS_LANE_NUM][WDR_VC_NUM][SYNC_CODE_NUM]; +} LvdsDevAttr; + +/** + * @brief The attribute of the combo device. + * + * Since MIPI RX can interface with CSI-2, LVDS, HiSPi and other timing, Mipi Rx is called a combo device. + * + * @since 1.0 + */ +typedef struct { + /** device number */ + uint8_t devno; + /** input mode: MIPI/LVDS/SUBLVDS/HISPI/DC */ + InputMode inputMode; + MipiDataRate dataRate; + /** MIPI Rx device crop area (corresponding to the oringnal sensor input image size) */ + ImgRect imgRect; + + union { + MipiDevAttr mipiAttr; + LvdsDevAttr lvdsAttr; + }; +} ComboDevAttr; + +/** + * @brief PHY common mode voltage mode. + * + * @since 1.0 + */ +typedef enum { + PHY_CMV_GE1200MV = 0x00, + PHY_CMV_LT1200MV = 0x01, + PHY_CMV_BUTT +} PhyCmvMode; + +/** + * @brief Obtains the MIPI CSI device handle with a specified channel ID. + * + * @param id Indicates the MIPI CSI channel ID. + * + * @return Returns the MIPI CSI device handle if the operation is successful; returns NULL otherwise. + * + * @since 1.0 + */ +DevHandle MipiCsiOpen(uint8_t id); + +/** + * @brief Releases the MIPI CSI device handle. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * + * @since 1.0 + */ +void MipiCsiClose(DevHandle handle); + +/** + * @brief Set the parameters of Mipi, CMOS or LVDS camera to the controller. + * + * The parameters including working mode, image area, image depth, data rate and physical channel. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param pAttr Indicates the pointer to the attribute. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr); + +/** + * @brief Set common mode voltage mode. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param devno There are 2 device numbers in total, pointing to 0 or 1. + * @param cmvMode Common mode voltage mode parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode); + +/** + * @brief Reset sensor. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. + * sns is the abbreviation of sensor. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource); + +/** + * @brief Unreset sensor. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. + * sns is the abbreviation of sensor. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource); + +/** + * @brief Reset Mipi Rx. + * + * Different s32WorkingViNum have different enSnsType. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev); + +/** + * @brief Uneset MIPI RX. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev); + +/** + * @brief Set the lane distribution of Mipi Rx. + * + * Select the specific mode according to the form of hardware connection. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param laneDivideMode Lane division mode parameters. + * + * @since 1.0 + */ +int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode); + +/** + * @brief Enable Mipi clock. + * + * Decide whether to use Mipi or LVDS according to the ensnstype parameter + * passed by the upper layer function. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev); + +/** + * @brief Disable the clock of Mipi device. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev); + +/** + * @brief Enable the sensor clock on Mipi. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. + * sns is the abbreviation of sensor. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource); + +/** + * @brief Disable the sensor clock. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. + * sns is the abbreviation of sensor. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource); + +/** + * @brief Set YUV and RAW data format and bit depth. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param dataType Pointer to image data format. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* MIPI_CSI_IF_H */ diff --git a/support/platform/include/common/platform_core.h b/support/platform/include/common/platform_core.h index 08e5770dd..bd1203ea8 100644 --- a/support/platform/include/common/platform_core.h +++ b/support/platform/include/common/platform_core.h @@ -30,6 +30,7 @@ enum PlatformModuleType { PLATFORM_MODULE_CLOCK, PLATFORM_MODULE_REGULATOR, PLATFORM_MODULE_MIPI_DSI, + PLATFORM_MODULE_MIPI_CSI, PLATFORM_MODULE_UART, PLATFORM_MODULE_SDIO, PLATFORM_MODULE_MDIO, diff --git a/support/platform/include/mipi_csi_core.h b/support/platform/include/mipi_csi_core.h new file mode 100755 index 000000000..54fdba139 --- /dev/null +++ b/support/platform/include/mipi_csi_core.h @@ -0,0 +1,612 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MIPI_CSI_CORE_H +#define MIPI_CSI_CORE_H + +#include "hdf_base.h" +#include "hdf_device.h" +#include "hdf_device_desc.h" +#include "hdf_object.h" +#include "mipi_csi_if.h" +#include "osal_mutex.h" +#include "osal_spinlock.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + + +#define MAX_CNTLR_CNT 2 +#define COMBO_DEV_MAX_NUM 2 +#define MIPI_RX_MAX_DEV_NUM 2 + +/** + * @brief Image size. + * + * @since 1.0 + */ +typedef struct { + /** Image width */ + unsigned int width; + /** Image height */ + unsigned int height; +} ImgSize; + +/** + * @brief LP, HS and escape mode switching timeout error. + * + * @since 1.0 + */ +typedef struct { + /** Clock1 Lane switching from LP to HS timeout */ + unsigned int clk1FsmTimeoutErrCnt; + /** Clock0 Lane switching from LP to HS timeout */ + unsigned int clk0FsmTimeoutErrCnt; + /** Data lane0 switching from LP to HS timeout */ + unsigned int d0FsmTimeoutErrCnt; + /** Data lane1 switching from LP to HS timeout */ + unsigned int d1FsmTimeoutErrCnt; + /** Data lane2 switching from LP to HS timeout */ + unsigned int d2FsmTimeoutErrCnt; + /** Data lane3 switching from LP to HS timeout */ + unsigned int d3FsmTimeoutErrCnt; + + /** Clock1 Lane switching to escape mode timed out */ + unsigned int clk1FsmEscapeErrCnt; + /** Clock0 Lane switching to escape mode timed out */ + unsigned int clk0FsmEscapeErrCnt; + /** Data lane0 switching to escape mode timed out */ + unsigned int d0FsmEscapeErrCnt; + /** Data lane1 switching to escape mode timeout */ + unsigned int d1FsmEscapeErrCnt; + /** Data lane2 switching to escape mode timeout */ + unsigned int d2FsmEscapeErrCnt; + /** Data lane3 switching to escape mode timeout */ + unsigned int d3FsmEscapeErrCnt; +} PhyErrIntCnt; + +/** + * @brief Errors generated during Mipi communication, including data packets, + * data frames and read-write control. + * + * @since 1.0 + */ +typedef struct { + /** Packet err. + Header has at least 2 errors and ECC cannot correct them */ + unsigned int errEccDoubleCnt; + /** CRC redundancy check error count for vc3 channel data */ + unsigned int vc3ErrCrcCnt; + /** CRC redundancy check error count for vc2 channel data */ + unsigned int vc2ErrCrcCnt; + /** CRC redundancy check error count for Vc1 channel data */ + unsigned int vc1ErrCrcCnt; + /** CRC redundancy check error count for vc0 channel data */ + unsigned int vc0ErrCrcCnt; + /** ECC corrected error count for vc3 channel header */ + unsigned int vc3ErrEccCorrectedCnt; + /** ECC corrected error count for vc2 channel header */ + unsigned int vc2ErrEccCorrectedCnt; + /** ECC corrected error count for Vc1 channel header */ + unsigned int vc1ErrEccCorrectedCnt; + /** ECC corrected error count for vc0 channel header */ + unsigned int vc0ErrEccCorrectedCnt; + /** Frame sequence error count of vc3 */ + unsigned int errIdVc3Cnt; + /** Frame sequence error count of vc2 */ + unsigned int errIdVc2Cnt; + /** Frame sequence error count of Vc1 */ + unsigned int errIdVc1Cnt; + /** Frame sequence error count or vc0 */ + unsigned int errIdVc0Cnt; + + /** Frame err. + Count of data types not supported by vc3 channel */ + unsigned int errFrameDataVc3Cnt; + /** Count of data types not supported by vc2 channel */ + unsigned int errFrameDataVc2Cnt; + /** Count of data types not supported by Vc1 channel */ + unsigned int errFrameDataVc1Cnt; + /** Count of data types not supported by vc0 channel */ + unsigned int errFrameDataVc0Cnt; + /** Frame sequence error count of vc3 */ + unsigned int errFSeqVc3Cnt; + /** Frame sequence error count of vc2 */ + unsigned int errFSeqVc2Cnt; + /** Frame sequence error count of Vc1 */ + unsigned int errFSeqVc1Cnt; + /** Frame sequence error count or vc0 */ + unsigned int errFSeqVc0Cnt; + /** Mismatch count of frame start and frame end short packets of vc3 channel */ + unsigned int errFBndryMatchVc3Cnt; + /** Mismatch count of frame start and frame end short packets of vc2 channel */ + unsigned int errFBndryMatchVc2Cnt; + /** Mismatch count of frame start and frame end short packets of Vc1 channel */ + unsigned int errFBndryMatchVc1Cnt; + /** Count of mismatch between frame start and frame end short packets of vc0 channel */ + unsigned int errFBndryMatchVc0Cnt; + + /** Ctrl err. + Mipi read data FIFO raw interrupt count */ + unsigned int dataFifoRderrCnt; + /** Mipi read command FIFO raw interrupt count */ + unsigned int cmdFifoRderrCnt; + /** Mipi write data FIFO raw interrupt count */ + unsigned int dataFifoWrerrCnt; + /** Mipi write command FIFO raw interrupt count */ + unsigned int cmdFifoWrerrCnt; +} MipiErrIntCnt; + +/** + * @brief LVDS internal read or write interrupt error. + * + * @since 1.0 + */ +typedef struct { + /** CMD_ FIFO register read error interrupt count */ + unsigned int cmdRdErrCnt; + /** CMD_ FIFO register write error interrupt count */ + unsigned int cmdWrErrCnt; + /** Read line_ BUF error interrupt count */ + unsigned int popErrCnt; + /** Synchronization error interrupt count of each lane during LVDS */ + unsigned int lvdsStateErrCnt; + /** Link0 read FIFO error interrupt count */ + unsigned int link0RdErrCnt; + /** Link0 write FIFO error interrupt count */ + unsigned int link0WrErrCnt; +} LvdsErrIntCnt; + +/** + * @brief Internal FIFO alignment error. + * + * @since 1.0 + */ +typedef struct { + /** Lane3 FIFO overflow */ + unsigned int lane3AlignErrCnt; + /** Lane2 FIFO overflow */ + unsigned int lane2AlignErrCnt; + /** Lane1 FIFO overflow */ + unsigned int lane1AlignErrCnt; + /** Lane0 FIFO overflow */ + unsigned int lane0AlignErrCnt; + /** FIFO overflow */ + unsigned int fifoFullErrCnt; +} AlignErrIntCnt; + +/** + * @brief Controller context parameter variable. + * + * @since 1.0 + */ +typedef struct { + /** Set by {@link MipiCsiSetHsMode} function */ + LaneDivideMode laneDivideMode; + bool hsModeCfged; + /** The properties of different types of devices are set through the {@link MipiCsiSetComboDevAttr} function */ + ComboDevAttr comboDevAttr[COMBO_DEV_MAX_NUM]; + bool devValid[COMBO_DEV_MAX_NUM]; + /** Whether the {@link MipiCsiSetComboDevAttr} function is called for parameter setting */ + bool devCfged[COMBO_DEV_MAX_NUM]; + unsigned int laneBitmap[COMBO_DEV_MAX_NUM]; +} MipiDevCtx; + +/** + * @brief Mipi CSI controller attribute and method definition. + * + * @since 1.0 + */ +struct MipiCsiCntlr { + /** The services provided by this controller are sent out when the driver is bound to the HDF framework */ + struct IDeviceIoService service; + /** The device side pointer is passed in when the driver binds to the HDF frame */ + struct HdfDeviceObject *device; + /** device number */ + unsigned int devNo; + /** All interfaces provided by the controller */ + struct MipiCsiCntlrMethod *ops; + /** For all interfaces debugged by the controller, null is required when the driver is not implemented */ + struct MipiCsiCntlrDebugMethod *debugs; + /** Controller context parameter variable */ + MipiDevCtx ctx; + /** Lock when accessing controller context parameter variables */ + OsalSpinlock ctxLock; + /** Lock when operating controller method */ + struct OsalMutex lock; + /** Anonymous data pointer, used to store struct mipi_csi_device */ + void *priv; +}; + +/** + * @brief All interfaces provided by the MIPI-CSI controller. + * + * Refer to the corresponding interface declaration for function pointer description. + * + * @since 1.0 + */ +struct MipiCsiCntlrMethod { + int32_t (*setComboDevAttr)(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr); + int32_t (*setPhyCmvmode)(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode); + int32_t (*setExtDataType)(struct MipiCsiCntlr *cntlr, ExtDataType* dataType); + int32_t (*setHsMode)(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode); + int32_t (*enableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + int32_t (*disableClock)(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + int32_t (*resetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + int32_t (*unresetRx)(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + int32_t (*enableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource); + int32_t (*disableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource); + int32_t (*resetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); + int32_t (*unresetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); +}; + +/** + * @brief For all interfaces debugged by the MIPI-CSI controller, NULL is required when + * the driver is not implemented. + * + * Refer to the corresponding interface declaration for function pointer description. + * + * @since 1.0 + */ +struct MipiCsiCntlrDebugMethod { + void (*getMipiDevCtx)(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx); + void (*getPhyErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo); + void (*getMipiErrInt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo); + void (*getLvdsErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo); + void (*getAlignErrIntCnt)(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo); + void (*getPhyData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + void (*getPhyMipiLinkData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + void (*getPhyLvdsLinkData)(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + void (*getMipiImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize); + void (*getLvdsImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize); + void (*getLvdsLaneImgsizeStatis)(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize); +}; + +int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject *device); +void MipiCsiUnregisterCntlr(struct MipiCsiCntlr *cntlr); + +/** + * @brief Turn HdfDeviceObject to an MipiCsiCntlr. + * + * @param device Indicates a HdfDeviceObject. + * + * @return Retrns the pointer of the MipiCsiCntlr on success; returns NULL otherwise. + * @since 1.0 + */ +struct MipiCsiCntlr *MipiCsiCntlrFromDevice(const struct HdfDeviceObject *device); + +/** + * @brief Obtains the MIPI CSI device handle with a specified channel ID. + * + * @param id Indicates the MIPI CSI channel ID. + * + * @return Returns the MIPI CSI device if the operation is successful; returns NULL otherwise. + * + * @since 1.0 + */ +struct MipiCsiCntlr *MipiCsiCntlrGet(uint8_t id); + +/** + * @brief Releases the MIPI CSI device handle. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * + * @since 1.0 + */ +void MipiCsiCntlrPut(const struct MipiCsiCntlr *cntlr); + +/** + * @brief Set the parameters of Mipi, CMOS or LVDS camera to the controller. + * + * The parameters including working mode, image area, image depth, data rate and physical channel. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param pAttr Indicates the pointer to the attribute. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr); + +/** + * @brief Set common mode voltage mode. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param devno There are 2 device numbers in total, pointing to 0 or 1. + * @param cmvMode Common mode voltage mode parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode); + +/** + * @brief Reset sensor. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); + +/** + * @brief Unreset sensor. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param snsResetSource The reset signal line number of sensor is called the reset source of sensor in software. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); + +/** + * @brief Reset Mipi Rx. + * + * Different s32WorkingViNum have different enSnsType. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + +/** + * @brief Uneset MIPI RX. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + +/** + * @brief Set the lane distribution of Mipi Rx. + * + * Select the specific mode according to the form of hardware connection. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param laneDivideMode Lane division mode parameters. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode); + +/** + * @brief Enable Mipi clock. + * + * Decide whether to use Mipi or LVDS according to the ensnstype parameter + * passed by the upper layer function. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + +/** + * @brief Disable the clock of Mipi device. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param comboDev MIPI RX or LVDS device type. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev); + +/** + * @brief Enable the sensor clock on Mipi. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource); + +/** + * @brief Disable the sensor clock. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param snsClkSource The clock signal line number of sensor, which is called the clock source of sensor in software. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource); + +/** + * @brief Set YUV and RAW data format and bit depth. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param dataType Pointer to image data format. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* dataType); + +/** + * @brief Get controller context parameter variable for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param ctx Controller context parameter variable. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx); + +/** + * @brief Get mode switching timeout error for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param errInfo Indicates mode switching timeout error. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo); + +/** + * @brief Get errors generated during Mipi communication for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param errInfo Indicates Mipi communication error. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo); + +/** + * @brief Get LVDS internal read or write interrupt error for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param errInfo Indicates LVDS read or write interrupt error. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo); + +/** + * @brief Get internal FIFO alignment error for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param errInfo Indicates FIFO alignment error. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo); + +/** + * @brief Get PHY data for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1. + * @param laneData Indicates a single PHY data. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + +/** + * @brief Get MIPI data for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1. + * @param laneData Indicates a single MIPI data. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + +/** + * @brief Get LVDS data for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param phyId Indicates PHY index. + * @param laneId Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1. + * @param laneData Indicates a single LVDS data. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData); + +/** + * @brief Get image size of MIPI for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param devno There are 2 device numbers in total, pointing to 0 or 1. + * @param vc Indicates virtual channel subscript. + * @param pSize Pointer to image size. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize); + +/** + * @brief Get image size of LVDS for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param devno There are 2 device numbers in total, pointing to 0 or 1. + * @param vc Indicates virtual channel subscript. + * @param pSize Pointer to image size. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize); + +/** + * @brief Get image size of LVDS-Lane for debugging. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param devno There are 2 device numbers in total, pointing to 0 or 1. + * @param lane Indicates lane index, and the value range is 0 to COMBO_MAX_LANE_NUM-1. + * @param pSize Pointer to image size. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/support/platform/include/mipi_csi_dev.h b/support/platform/include/mipi_csi_dev.h new file mode 100755 index 000000000..c0900a522 --- /dev/null +++ b/support/platform/include/mipi_csi_dev.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MIPI_CSI_DEV_H +#define MIPI_CSI_DEV_H + +#include "hdf_base.h" +#include "mipi_csi_if.h" + +typedef enum { + WORK_MODE_LVDS = 0x0, + WORK_MODE_MIPI = 0x1, + WORK_MODE_CMOS = 0x2, + WORK_MODE_BT1120 = 0x3, + WORK_MODE_SLVS = 0x4, + WORK_MODE_BUTT +} WorkMode; + +typedef struct { + uint8_t devno; + PhyCmvMode cmvMode; +} PhyCmv; + +#define CONFIG_HI_PROC_SHOW_SUPPORT + +#define HI_MIPI_IOC_MAGIC 'm' + +/* init data lane, input mode, data type */ +#define HI_MIPI_SET_DEV_ATTR _IOW(HI_MIPI_IOC_MAGIC, 0x01, ComboDevAttr) + +/* set phy common mode voltage mode */ +#define HI_MIPI_SET_PHY_CMVMODE _IOW(HI_MIPI_IOC_MAGIC, 0x04, PhyCmv) + +/* reset sensor */ +#define HI_MIPI_RESET_SENSOR _IOW(HI_MIPI_IOC_MAGIC, 0x05, uint8_t) + +/* unreset sensor */ +#define HI_MIPI_UNRESET_SENSOR _IOW(HI_MIPI_IOC_MAGIC, 0x06, uint8_t) + +/* reset mipi */ +#define HI_MIPI_RESET_MIPI _IOW(HI_MIPI_IOC_MAGIC, 0x07, uint8_t) + +/* unreset mipi */ +#define HI_MIPI_UNRESET_MIPI _IOW(HI_MIPI_IOC_MAGIC, 0x08, uint8_t) + +/* reset slvs */ +#define HI_MIPI_RESET_SLVS _IOW(HI_MIPI_IOC_MAGIC, 0x09, uint8_t) + +/* unreset slvs */ +#define HI_MIPI_UNRESET_SLVS _IOW(HI_MIPI_IOC_MAGIC, 0x0a, uint8_t) + +/* set mipi hs_mode */ +#define HI_MIPI_SET_HS_MODE _IOW(HI_MIPI_IOC_MAGIC, 0x0b, LaneDivideMode) + +/* enable mipi clock */ +#define HI_MIPI_ENABLE_MIPI_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0c, uint8_t) + +/* disable mipi clock */ +#define HI_MIPI_DISABLE_MIPI_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0d, uint8_t) + +/* enable slvs clock */ +#define HI_MIPI_ENABLE_SLVS_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0e, uint8_t) + +/* disable slvs clock */ +#define HI_MIPI_DISABLE_SLVS_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x0f, uint8_t) + +/* enable sensor clock */ +#define HI_MIPI_ENABLE_SENSOR_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x10, uint8_t) + +/* disable sensor clock */ +#define HI_MIPI_DISABLE_SENSOR_CLOCK _IOW(HI_MIPI_IOC_MAGIC, 0x11, uint8_t) + +#define HI_MIPI_SET_EXT_DATA_TYPE _IOW(HI_MIPI_IOC_MAGIC, 0x12, ExtDataType) + +int MipiCsiDevModuleInit(uint8_t id); +void MipiCsiDevModuleExit(uint8_t id); + +#endif /* MIPI_CSI_DEV_H */ diff --git a/support/platform/src/common/platform_common.c b/support/platform/src/common/platform_common.c index 462331a55..774a84bc9 100644 --- a/support/platform/src/common/platform_common.c +++ b/support/platform/src/common/platform_common.c @@ -53,6 +53,12 @@ static struct PlatformModuleInfo g_platformModules[] = { .moduleName = "PLATFORM_MODULE_MIPI_DSI", }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_CSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_CSI) + { + .moduleType = PLATFORM_MODULE_MIPI_CSI, + .moduleName = "PLATFORM_MODULE_MIPI_CSI", + }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_UART) || defined(CONFIG_DRIVERS_HDF_PLATFORM_UART) { .moduleType = PLATFORM_MODULE_UART, diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi_csi_core.c new file mode 100755 index 000000000..53fd28aea --- /dev/null +++ b/support/platform/src/mipi_csi_core.c @@ -0,0 +1,742 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "mipi_csi_core.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_time.h" + +#define HDF_LOG_TAG mipi_csi_core + +struct MipiCsiHandle { + struct MipiCsiCntlr *cntlr; + struct OsalMutex lock; + void *priv; +}; + +static struct MipiCsiHandle g_mipiCsihandle[MAX_CNTLR_CNT]; + +int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject *device) +{ + HDF_LOGI("%s: enter!", __func__); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (cntlr->devNo >= MAX_CNTLR_CNT) { + HDF_LOGE("%s: cntlr->devNo is error.", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (device == NULL) { + HDF_LOGE("%s: device is NULL.", __func__); + return HDF_FAILURE; + } + + if (g_mipiCsihandle[cntlr->devNo].cntlr == NULL) { + (void)OsalMutexInit(&g_mipiCsihandle[cntlr->devNo].lock); + (void)OsalMutexInit(&(cntlr->lock)); + + g_mipiCsihandle[cntlr->devNo].cntlr = cntlr; + g_mipiCsihandle[cntlr->devNo].priv = NULL; + cntlr->device = device; + device->service = &(cntlr->service); + cntlr->priv = NULL; + HDF_LOGI("%s: success.", __func__); + + return HDF_SUCCESS; + } + + HDF_LOGE("%s: cntlr already exists.", __func__); + return HDF_FAILURE; +} + +void MipiCsiUnregisterCntlr(struct MipiCsiCntlr *cntlr) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return; + } + + (void)OsalMutexDestroy(&(cntlr->lock)); + (void)OsalMutexDestroy(&(g_mipiCsihandle[cntlr->devNo].lock)); + + HDF_LOGI("%s: success.", __func__); + return; +} + +struct MipiCsiCntlr *MipiCsiCntlrFromDevice(const struct HdfDeviceObject *device) +{ + return (device == NULL) ? NULL : (struct MipiCsiCntlr *)device->service; +} + +struct MipiCsiCntlr *MipiCsiCntlrGet(uint8_t number) +{ + struct MipiCsiCntlr *cntlr = NULL; + HDF_LOGI("%s: enter!", __func__); + + if (number >= MAX_CNTLR_CNT) { + HDF_LOGE("%s: invalid number.", __func__); + return NULL; + } + if (g_mipiCsihandle[number].cntlr == NULL) { + HDF_LOGE("%s: g_mipiCsihandle[number].cntlr is NULL.", __func__); + return NULL; + } + + (void)OsalMutexLock(&(g_mipiCsihandle[number].lock)); + g_mipiCsihandle[number].cntlr->devNo = number; + cntlr = g_mipiCsihandle[number].cntlr; + (void)OsalMutexUnlock(&(g_mipiCsihandle[number].lock)); + + return cntlr; +} + +void MipiCsiCntlrPut(const struct MipiCsiCntlr *cntlr) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return; + } + + uint8_t number = cntlr->devNo; + if (number >= MAX_CNTLR_CNT) { + HDF_LOGE("%s: invalid number.", __func__); + return; + } + + HDF_LOGI("%s: success!", __func__); +} + +int32_t MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pAttr) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (pAttr == NULL) { + HDF_LOGE("%s: pAttr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->setComboDevAttr == NULL) { + HDF_LOGE("%s: setComboDevAttr is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setComboDevAttr(cntlr, pAttr); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, PhyCmvMode cmvMode) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->setPhyCmvmode == NULL) { + HDF_LOGE("%s: setPhyCmvmode is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setPhyCmvmode(cntlr, devno, cmvMode); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* dataType) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (dataType == NULL) { + HDF_LOGE("%s: dataType is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->setExtDataType == NULL) { + HDF_LOGE("%s: setExtDataType is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setExtDataType(cntlr, dataType); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDivideMode) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->setHsMode == NULL) { + HDF_LOGE("%s: setHsMode is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setHsMode(cntlr, laneDivideMode); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->enableClock == NULL) { + HDF_LOGE("%s: enableClock is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->enableClock(cntlr, comboDev); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->disableClock == NULL) { + HDF_LOGE("%s: disableClock is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->disableClock(cntlr, comboDev); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->resetRx == NULL) { + HDF_LOGE("%s: resetRx is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->resetRx(cntlr, comboDev); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->unresetRx == NULL) { + HDF_LOGE("%s: unresetRx is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->unresetRx(cntlr, comboDev); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->enableSensorClock == NULL) { + HDF_LOGE("%s: enableSensorClock is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->enableSensorClock(cntlr, snsClkSource); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->disableSensorClock == NULL) { + HDF_LOGE("%s: disableSensorClock is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->disableSensorClock(cntlr, snsClkSource); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->resetSensor == NULL) { + HDF_LOGE("%s: resetSensor is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->resetSensor(cntlr, snsResetSource); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource) +{ + int32_t ret; + HDF_LOGI("%s: enter!", __func__); + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->ops->unresetSensor == NULL) { + HDF_LOGE("%s: unresetSensor is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->unresetSensor(cntlr, snsResetSource); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + +int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getMipiDevCtx == NULL) { + HDF_LOGE("%s: getMipiDevCtx is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (ctx == NULL) { + HDF_LOGE("%s: ctx is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getMipiDevCtx(cntlr, ctx); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, PhyErrIntCnt *errInfo) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getPhyErrIntCnt == NULL) { + HDF_LOGE("%s: getPhyErrIntCnt is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (errInfo == NULL) { + HDF_LOGE("%s: errInfo is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getPhyErrIntCnt(cntlr, phyId, errInfo); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId, MipiErrIntCnt *errInfo) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getMipiErrInt == NULL) { + HDF_LOGE("%s: getMipiErrInt is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (errInfo == NULL) { + HDF_LOGE("%s: errInfo is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getMipiErrInt(cntlr, phyId, errInfo); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, LvdsErrIntCnt *errInfo) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getLvdsErrIntCnt == NULL) { + HDF_LOGE("%s: getLvdsErrIntCnt is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (errInfo == NULL) { + HDF_LOGE("%s: errInfo is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getLvdsErrIntCnt(cntlr, phyId, errInfo); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phyId, AlignErrIntCnt *errInfo) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getAlignErrIntCnt == NULL) { + HDF_LOGE("%s: getAlignErrIntCnt is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (errInfo == NULL) { + HDF_LOGE("%s: errInfo is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getAlignErrIntCnt(cntlr, phyId, errInfo); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getPhyData == NULL) { + HDF_LOGE("%s: getPhyData is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (laneData == NULL) { + HDF_LOGE("%s: laneData is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getPhyData(cntlr, phyId, laneId, laneData); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getPhyMipiLinkData == NULL) { + HDF_LOGE("%s: getPhyMipiLinkData is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (laneData == NULL) { + HDF_LOGE("%s: laneData is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getPhyMipiLinkData(cntlr, phyId, laneId, laneData); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, int laneId, unsigned int *laneData) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getPhyLvdsLinkData == NULL) { + HDF_LOGE("%s: getPhyLvdsLinkData is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (laneData == NULL) { + HDF_LOGE("%s: laneData is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getPhyLvdsLinkData(cntlr, phyId, laneId, laneData); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getMipiImgsizeStatis == NULL) { + HDF_LOGE("%s: getMipiImgsizeStatis is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (pSize == NULL) { + HDF_LOGE("%s: pSize is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getMipiImgsizeStatis(cntlr, devno, vc, pSize); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short vc, ImgSize *pSize) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getLvdsImgsizeStatis == NULL) { + HDF_LOGE("%s: getLvdsImgsizeStatis is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (pSize == NULL) { + HDF_LOGE("%s: pSize is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getLvdsImgsizeStatis(cntlr, devno, vc, pSize); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} + +int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t devno, short lane, ImgSize *pSize) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL.", __func__); + return HDF_FAILURE; + } + if (cntlr->debugs == NULL) { + HDF_LOGE("%s: debugs is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (cntlr->debugs->getLvdsLaneImgsizeStatis == NULL) { + HDF_LOGE("%s: getLvdsLaneImgsizeStatis is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + if (pSize == NULL) { + HDF_LOGE("%s: pSize is NULL.", __func__); + return HDF_FAILURE; + } + + (void)OsalMutexLock(&(cntlr->lock)); + cntlr->debugs->getLvdsLaneImgsizeStatis(cntlr, devno, lane, pSize); + (void)OsalMutexUnlock(&(cntlr->lock)); + HDF_LOGI("%s: success!", __func__); + + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/support/platform/src/mipi_csi_if.c b/support/platform/src/mipi_csi_if.c new file mode 100755 index 000000000..c856f1a0a --- /dev/null +++ b/support/platform/src/mipi_csi_if.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "mipi_csi_if.h" +#include "mipi_csi_core.h" + +#define HDF_LOG_TAG mipi_csi_if + +DevHandle MipiCsiOpen(uint8_t id) +{ + return (DevHandle)MipiCsiCntlrGet(id); +} + +void MipiCsiClose(DevHandle handle) +{ + MipiCsiCntlrPut((struct MipiCsiCntlr *)handle); +} + +int32_t MipiCsiSetComboDevAttr(DevHandle handle, ComboDevAttr *pAttr) +{ + return MipiCsiCntlrSetComboDevAttr((struct MipiCsiCntlr *)handle, pAttr); +} + +int32_t MipiCsiSetPhyCmvmode(DevHandle handle, uint8_t devno, PhyCmvMode cmvMode) +{ + return MipiCsiCntlrSetPhyCmvmode((struct MipiCsiCntlr *)handle, devno, cmvMode); +} + +int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType) +{ + return MipiCsiCntlrSetExtDataType((struct MipiCsiCntlr *)handle, dataType); +} + +int32_t MipiCsiSetHsMode(DevHandle handle, LaneDivideMode laneDivideMode) +{ + return MipiCsiCntlrSetHsMode((struct MipiCsiCntlr *)handle, laneDivideMode); +} + +int32_t MipiCsiEnableClock(DevHandle handle, uint8_t comboDev) +{ + return MipiCsiCntlrEnableClock((struct MipiCsiCntlr *)handle, comboDev); +} + +int32_t MipiCsiDisableClock(DevHandle handle, uint8_t comboDev) +{ + return MipiCsiCntlrDisableClock((struct MipiCsiCntlr *)handle, comboDev); +} + +int32_t MipiCsiResetRx(DevHandle handle, uint8_t comboDev) +{ + return MipiCsiCntlrResetRx((struct MipiCsiCntlr *)handle, comboDev); +} + +int32_t MipiCsiUnresetRx(DevHandle handle, uint8_t comboDev) +{ + return MipiCsiCntlrUnresetRx((struct MipiCsiCntlr *)handle, comboDev); +} + +int32_t MipiCsiEnableSensorClock(DevHandle handle, uint8_t snsClkSource) +{ + return MipiCsiCntlrEnableSensorClock((struct MipiCsiCntlr *)handle, snsClkSource); +} + +int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource) +{ + return MipiCsiCntlrDisableSensorClock((struct MipiCsiCntlr *)handle, snsClkSource); +} + +int32_t MipiCsiResetSensor(DevHandle handle, uint8_t snsResetSource) +{ + return MipiCsiCntlrResetSensor((struct MipiCsiCntlr *)handle, snsResetSource); +} + +int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource) +{ + return MipiCsiCntlrUnresetSensor((struct MipiCsiCntlr *)handle, snsResetSource); +} -- Gitee From 3348c1dace3ecf4c10de896cd97e6de333715a42 Mon Sep 17 00:00:00 2001 From: kevin Date: Sun, 26 Sep 2021 16:30:06 +0800 Subject: [PATCH 059/272] modify sensor format Signed-off-by: kevin Change-Id: Ib8dd76636aaf9b3477bc5aea5e7345b1197610f3 --- .../barometer/sensor_barometer_driver.c | 738 ++++++++-------- .../barometer/sensor_barometer_driver.h | 238 ++--- .../chipset/barometer/barometer_bmp180.c | 820 +++++++++--------- .../chipset/barometer/barometer_bmp180.h | 190 ++-- model/sensor/driver/hall/sensor_hall_driver.c | 6 +- model/sensor/driver/hall/sensor_hall_driver.h | 2 +- .../sensor/driver/include/sensor_device_if.h | 62 +- 7 files changed, 1028 insertions(+), 1028 deletions(-) diff --git a/model/sensor/driver/barometer/sensor_barometer_driver.c b/model/sensor/driver/barometer/sensor_barometer_driver.c index 988ea0333..5712c3651 100644 --- a/model/sensor/driver/barometer/sensor_barometer_driver.c +++ b/model/sensor/driver/barometer/sensor_barometer_driver.c @@ -1,370 +1,370 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "sensor_barometer_driver.h" -#include -#include "hdf_base.h" -#include "hdf_device_desc.h" -#include "osal_math.h" -#include "osal_mem.h" -#include "sensor_config_controller.h" -#include "sensor_device_manager.h" -#include "sensor_platform_if.h" - -#define HDF_LOG_TAG sensor_barometer_driver_c - -#define HDF_BAROMETER_WORK_QUEUE_NAME "hdf_barometer_work_queue" - -static struct BarometerDrvData *g_barometerDrvData = NULL; - -static struct BarometerDrvData *BarometerGetDrvData(void) -{ - return g_barometerDrvData; -} - -static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; - -int32_t BarometerRegisterChipOps(const struct BarometerOpsCall *ops) -{ - struct BarometerDrvData *drvData = BarometerGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); - - drvData->ops.Init = ops->Init; - drvData->ops.ReadData = ops->ReadData; - return HDF_SUCCESS; -} - -static void BarometerDataWorkEntry(void *arg) -{ - struct BarometerDrvData *drvData = NULL; - - drvData = (struct BarometerDrvData *)arg; - CHECK_NULL_PTR_RETURN(drvData); - - if (drvData->ops.ReadData == NULL) { - HDF_LOGI("%s: Barometer ReadData function NULl", __func__); - return; - } - if (drvData->ops.ReadData(drvData->barometerCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Barometer read data failed", __func__); - } -} - -static void BarometerTimerEntry(uintptr_t arg) -{ - int64_t interval; - int32_t ret; - struct BarometerDrvData *drvData = (struct BarometerDrvData *)arg; - CHECK_NULL_PTR_RETURN(drvData); - - if (!HdfAddWork(&drvData->barometerWorkQueue, &drvData->barometerWork)) { - HDF_LOGE("%s: barometer add work queue failed", __func__); - } - - interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); - interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; - ret = OsalTimerSetTimeout(&drvData->barometerTimer, interval); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer modify time failed", __func__); - } -} - -static int32_t InitBarometerData(struct BarometerDrvData *drvData) -{ - if (HdfWorkQueueInit(&drvData->barometerWorkQueue, HDF_BAROMETER_WORK_QUEUE_NAME) != HDF_SUCCESS) { - HDF_LOGE("%s: barometer init work queue failed", __func__); - return HDF_FAILURE; - } - - if (HdfWorkInit(&drvData->barometerWork, BarometerDataWorkEntry, drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: barometer create thread failed", __func__); - return HDF_FAILURE; - } - - drvData->interval = SENSOR_TIMER_MIN_TIME; - drvData->enable = false; - drvData->detectFlag = false; - - return HDF_SUCCESS; -} - -static int32_t SetBarometerEnable(void) -{ - int32_t ret; - struct BarometerDrvData *drvData = BarometerGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData->barometerCfg, HDF_ERR_INVALID_PARAM); - - if (drvData->enable) { - HDF_LOGE("%s: barometer sensor is enabled", __func__); - return HDF_SUCCESS; - } - - ret = SetSensorRegCfgArray(&drvData->barometerCfg->busCfg, drvData->barometerCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer sensor enable config failed", __func__); - return ret; - } - - ret = OsalTimerCreate(&drvData->barometerTimer, SENSOR_TIMER_MIN_TIME, BarometerTimerEntry, (uintptr_t)drvData); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer create timer failed[%d]", __func__, ret); - return ret; - } - - ret = OsalTimerStartLoop(&drvData->barometerTimer); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer start timer failed[%d]", __func__, ret); - return ret; - } - drvData->enable = true; - - return HDF_SUCCESS; -} - -static int32_t SetBarometerDisable(void) -{ - int32_t ret; - struct BarometerDrvData *drvData = BarometerGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData->barometerCfg, HDF_ERR_INVALID_PARAM); - - if (!drvData->enable) { - HDF_LOGE("%s: barometer sensor had disable", __func__); - return HDF_SUCCESS; - } - - ret = SetSensorRegCfgArray(&drvData->barometerCfg->busCfg, - drvData->barometerCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer sensor disable config failed", __func__); - return ret; - } - - ret = OsalTimerDelete(&drvData->barometerTimer); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: barometer delete timer failed", __func__); - return ret; - } - drvData->enable = false; - return HDF_SUCCESS; -} - -static int32_t SetBarometerBatch(int64_t samplingInterval, int64_t interval) -{ - (void)interval; - - struct BarometerDrvData *drvData = NULL; - - drvData = BarometerGetDrvData(); - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - drvData->interval = samplingInterval; - - return HDF_SUCCESS; -} - -static int32_t SetBarometerMode(int32_t mode) -{ - return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; -} - -static int32_t SetBarometerOption(uint32_t option) -{ - (void)option; - return HDF_SUCCESS; -} - -static int32_t DispatchBarometer(struct HdfDeviceIoClient *client, - int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - (void)client; - (void)cmd; - (void)data; - (void)reply; - - return HDF_SUCCESS; -} - -int32_t BarometerBindDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - - struct BarometerDrvData *drvData = (struct BarometerDrvData *)OsalMemCalloc(sizeof(*drvData)); - if (drvData == NULL) { - HDF_LOGE("%s: malloc barometer drv data fail!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - - drvData->ioService.Dispatch = DispatchBarometer; - drvData->device = device; - device->service = &drvData->ioService; - g_barometerDrvData = drvData; - return HDF_SUCCESS; -} - -static int32_t InitBarometerOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) -{ - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - - deviceInfo->ops.Enable = SetBarometerEnable; - deviceInfo->ops.Disable = SetBarometerDisable; - deviceInfo->ops.SetBatch = SetBarometerBatch; - deviceInfo->ops.SetMode = SetBarometerMode; - deviceInfo->ops.SetOption = SetBarometerOption; - - if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), - &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { - HDF_LOGE("%s: copy sensor info failed", __func__); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -static int32_t InitBarometerAfterDetected(struct SensorCfgData *config) -{ - struct SensorDeviceInfo deviceInfo; - CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - - if (InitBarometerOps(config, &deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Init barometer ops failed", __func__); - return HDF_FAILURE; - } - - if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: Add barometer device failed", __func__); - return HDF_FAILURE; - } - - if (ParseSensorRegConfig(config) != HDF_SUCCESS) { - HDF_LOGE("%s: Parse sensor register failed", __func__); - (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorAllRegConfig(config); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -struct SensorCfgData *BarometerCreateCfgData(const struct DeviceResourceNode *node) -{ - struct BarometerDrvData *drvData = BarometerGetDrvData(); - - if (drvData == NULL || node == NULL) { - HDF_LOGE("%s: Barometer node pointer NULL", __func__); - return NULL; - } - - if (drvData->detectFlag) { - HDF_LOGE("%s: Barometer sensor have detected", __func__); - return NULL; - } - - if (drvData->barometerCfg == NULL) { - HDF_LOGE("%s: Barometer barometerCfg pointer NULL", __func__); - return NULL; - } - - if (GetSensorBaseConfigData(node, drvData->barometerCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Get sensor base config failed", __func__); - goto BASE_CONFIG_EXIT; - } - - if (DetectSensorDevice(drvData->barometerCfg) != HDF_SUCCESS) { - HDF_LOGI("%s: Barometer sensor detect device no exist", __func__); - drvData->detectFlag = false; - goto BASE_CONFIG_EXIT; - } - - drvData->detectFlag = true; - if (InitBarometerAfterDetected(drvData->barometerCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: Barometer sensor detect device no exist", __func__); - goto INIT_EXIT; - } - return drvData->barometerCfg; - -INIT_EXIT: - (void)ReleaseSensorBusHandle(&drvData->barometerCfg->busCfg); -BASE_CONFIG_EXIT: - drvData->barometerCfg->root = NULL; - (void)memset_s(&drvData->barometerCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, - sizeof(struct SensorBasicInfo)); - (void)memset_s(&drvData->barometerCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&drvData->barometerCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; -} - -void BarometerReleaseCfgData(struct SensorCfgData *barometerCfg) -{ - CHECK_NULL_PTR_RETURN(barometerCfg); - - (void)DeleteSensorDevice(&barometerCfg->sensorInfo); - ReleaseSensorAllRegConfig(barometerCfg); - (void)ReleaseSensorBusHandle(&barometerCfg->busCfg); - - barometerCfg->root = NULL; - (void)memset_s(&barometerCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); - (void)memset_s(&barometerCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&barometerCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); -} - -int32_t BarometerInitDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct BarometerDrvData *drvData = (struct BarometerDrvData *)device->service; - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - if (InitBarometerData(drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: Init barometer config failed", __func__); - return HDF_FAILURE; - } - - drvData->barometerCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->barometerCfg)); - if (drvData->barometerCfg == NULL) { - HDF_LOGE("%s: Malloc barometer config data failed", __func__); - return HDF_FAILURE; - } - - drvData->barometerCfg->regCfgGroup = &g_regCfgGroup[0]; - - HDF_LOGI("%s: Init barometer driver success", __func__); - return HDF_SUCCESS; -} - -void BarometerReleaseDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN(device); - - struct BarometerDrvData *drvData = (struct BarometerDrvData *)device->service; - CHECK_NULL_PTR_RETURN(drvData); - - if (drvData->detectFlag) { - BarometerReleaseCfgData(drvData->barometerCfg); - } - - OsalMemFree(drvData->barometerCfg); - drvData->barometerCfg = NULL; - - HdfWorkDestroy(&drvData->barometerWork); - HdfWorkQueueDestroy(&drvData->barometerWorkQueue); - OsalMemFree(drvData); -} - -struct HdfDriverEntry g_sensorBarometerDevEntry = { - .moduleVersion = 1, - .moduleName = "HDF_SENSOR_BAROMETER", - .Bind = BarometerBindDriver, - .Init = BarometerInitDriver, - .Release = BarometerReleaseDriver, -}; - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_barometer_driver.h" +#include +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_barometer_driver_c + +#define HDF_BAROMETER_WORK_QUEUE_NAME "hdf_barometer_work_queue" + +static struct BarometerDrvData *g_barometerDrvData = NULL; + +static struct BarometerDrvData *BarometerGetDrvData(void) +{ + return g_barometerDrvData; +} + +static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; + +int32_t BarometerRegisterChipOps(const struct BarometerOpsCall *ops) +{ + struct BarometerDrvData *drvData = BarometerGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); + + drvData->ops.Init = ops->Init; + drvData->ops.ReadData = ops->ReadData; + return HDF_SUCCESS; +} + +static void BarometerDataWorkEntry(void *arg) +{ + struct BarometerDrvData *drvData = NULL; + + drvData = (struct BarometerDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->ops.ReadData == NULL) { + HDF_LOGI("%s: Barometer ReadData function NULl", __func__); + return; + } + if (drvData->ops.ReadData(drvData->barometerCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Barometer read data failed", __func__); + } +} + +static void BarometerTimerEntry(uintptr_t arg) +{ + int64_t interval; + int32_t ret; + struct BarometerDrvData *drvData = (struct BarometerDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->barometerWorkQueue, &drvData->barometerWork)) { + HDF_LOGE("%s: barometer add work queue failed", __func__); + } + + interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; + ret = OsalTimerSetTimeout(&drvData->barometerTimer, interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer modify time failed", __func__); + } +} + +static int32_t InitBarometerData(struct BarometerDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->barometerWorkQueue, HDF_BAROMETER_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: barometer init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->barometerWork, BarometerDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: barometer create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = SENSOR_TIMER_MIN_TIME; + drvData->enable = false; + drvData->detectFlag = false; + + return HDF_SUCCESS; +} + +static int32_t SetBarometerEnable(void) +{ + int32_t ret; + struct BarometerDrvData *drvData = BarometerGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->barometerCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: barometer sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->barometerCfg->busCfg, drvData->barometerCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer sensor enable config failed", __func__); + return ret; + } + + ret = OsalTimerCreate(&drvData->barometerTimer, SENSOR_TIMER_MIN_TIME, BarometerTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->barometerTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetBarometerDisable(void) +{ + int32_t ret; + struct BarometerDrvData *drvData = BarometerGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->barometerCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: barometer sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = SetSensorRegCfgArray(&drvData->barometerCfg->busCfg, + drvData->barometerCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer sensor disable config failed", __func__); + return ret; + } + + ret = OsalTimerDelete(&drvData->barometerTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: barometer delete timer failed", __func__); + return ret; + } + drvData->enable = false; + return HDF_SUCCESS; +} + +static int32_t SetBarometerBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + struct BarometerDrvData *drvData = NULL; + + drvData = BarometerGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->interval = samplingInterval; + + return HDF_SUCCESS; +} + +static int32_t SetBarometerMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetBarometerOption(uint32_t option) +{ + (void)option; + return HDF_SUCCESS; +} + +static int32_t DispatchBarometer(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t BarometerBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct BarometerDrvData *drvData = (struct BarometerDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: malloc barometer drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchBarometer; + drvData->device = device; + device->service = &drvData->ioService; + g_barometerDrvData = drvData; + return HDF_SUCCESS; +} + +static int32_t InitBarometerOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetBarometerEnable; + deviceInfo->ops.Disable = SetBarometerDisable; + deviceInfo->ops.SetBatch = SetBarometerBatch; + deviceInfo->ops.SetMode = SetBarometerMode; + deviceInfo->ops.SetOption = SetBarometerOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: copy sensor info failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitBarometerAfterDetected(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitBarometerOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init barometer ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add barometer device failed", __func__); + return HDF_FAILURE; + } + + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +struct SensorCfgData *BarometerCreateCfgData(const struct DeviceResourceNode *node) +{ + struct BarometerDrvData *drvData = BarometerGetDrvData(); + + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Barometer node pointer NULL", __func__); + return NULL; + } + + if (drvData->detectFlag) { + HDF_LOGE("%s: Barometer sensor have detected", __func__); + return NULL; + } + + if (drvData->barometerCfg == NULL) { + HDF_LOGE("%s: Barometer barometerCfg pointer NULL", __func__); + return NULL; + } + + if (GetSensorBaseConfigData(node, drvData->barometerCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + goto BASE_CONFIG_EXIT; + } + + if (DetectSensorDevice(drvData->barometerCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Barometer sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; + } + + drvData->detectFlag = true; + if (InitBarometerAfterDetected(drvData->barometerCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Barometer sensor detect device no exist", __func__); + goto INIT_EXIT; + } + return drvData->barometerCfg; + +INIT_EXIT: + (void)ReleaseSensorBusHandle(&drvData->barometerCfg->busCfg); +BASE_CONFIG_EXIT: + drvData->barometerCfg->root = NULL; + (void)memset_s(&drvData->barometerCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, + sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->barometerCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->barometerCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + return NULL; +} + +void BarometerReleaseCfgData(struct SensorCfgData *barometerCfg) +{ + CHECK_NULL_PTR_RETURN(barometerCfg); + + (void)DeleteSensorDevice(&barometerCfg->sensorInfo); + ReleaseSensorAllRegConfig(barometerCfg); + (void)ReleaseSensorBusHandle(&barometerCfg->busCfg); + + barometerCfg->root = NULL; + (void)memset_s(&barometerCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&barometerCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&barometerCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t BarometerInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct BarometerDrvData *drvData = (struct BarometerDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitBarometerData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init barometer config failed", __func__); + return HDF_FAILURE; + } + + drvData->barometerCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->barometerCfg)); + if (drvData->barometerCfg == NULL) { + HDF_LOGE("%s: Malloc barometer config data failed", __func__); + return HDF_FAILURE; + } + + drvData->barometerCfg->regCfgGroup = &g_regCfgGroup[0]; + + HDF_LOGI("%s: Init barometer driver success", __func__); + return HDF_SUCCESS; +} + +void BarometerReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct BarometerDrvData *drvData = (struct BarometerDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->detectFlag) { + BarometerReleaseCfgData(drvData->barometerCfg); + } + + OsalMemFree(drvData->barometerCfg); + drvData->barometerCfg = NULL; + + HdfWorkDestroy(&drvData->barometerWork); + HdfWorkQueueDestroy(&drvData->barometerWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorBarometerDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_BAROMETER", + .Bind = BarometerBindDriver, + .Init = BarometerInitDriver, + .Release = BarometerReleaseDriver, +}; + HDF_INIT(g_sensorBarometerDevEntry); \ No newline at end of file diff --git a/model/sensor/driver/barometer/sensor_barometer_driver.h b/model/sensor/driver/barometer/sensor_barometer_driver.h index 37ce1314a..03ba8234d 100644 --- a/model/sensor/driver/barometer/sensor_barometer_driver.h +++ b/model/sensor/driver/barometer/sensor_barometer_driver.h @@ -1,119 +1,119 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SENSOR_BAROMETER_DRIVER_H -#define SENSOR_BAROMETER_DRIVER_H - -#include "hdf_workqueue.h" -#include "osal_timer.h" -#include "sensor_config_parser.h" -#include "sensor_platform_if.h" - -#define BAR_DEFAULT_SAMPLING_200_MS 200000000 -#define BAROMETER_CHIP_NAME_BMP180 "bmp180" - -enum BarometerEeprom { - BAROMETER_AC1_MSB = 0, - BAROMETER_AC1_LSB = 1, - BAROMETER_AC2_MSB = 2, - BAROMETER_AC2_LSB = 3, - BAROMETER_AC3_MSB = 4, - BAROMETER_AC3_LSB = 5, - BAROMETER_AC4_MSB = 6, - BAROMETER_AC4_LSB = 7, - BAROMETER_AC5_MSB = 8, - BAROMETER_AC5_LSB = 9, - BAROMETER_AC6_MSB = 10, - BAROMETER_AC6_LSB = 11, - BAROMETER_B1_MSB = 12, - BAROMETER_B1_LSB = 13, - BAROMETER_B2_MSB = 14, - BAROMETER_B2_LSB = 15, - BAROMETER_MB_MSB = 16, - BAROMETER_MB_LSB = 17, - BAROMETER_MC_MSB = 18, - BAROMETER_MC_LSB = 19, - BAROMETER_MD_MSB = 20, - BAROMETER_MD_LSB = 21, - BAROMETER_EEPROM_SUM, -}; - -struct BarometerEepromData { - int32_t ac1; - int32_t ac2; - int32_t ac3; - int32_t b1; - int32_t b2; - int32_t mb; - int32_t mc; - int32_t md; - uint32_t ac4; - uint32_t ac5; - uint32_t ac6; -}; - -struct Coefficient { - int32_t b3; - int32_t b5; - int32_t b6; - int32_t x1; - int32_t x2; - int32_t x3; - int32_t p; - uint32_t b4; - uint32_t b7; -}; - -enum Temperature { - BAROMETER_TEM_MSB = 0, - BAROMETER_TEM_LSB = 1, - BAROMETER_TEM_SUM, -}; - -enum Barometer { - BAROMETER_BAR_MSB = 0, - BAROMETER_BAR_LSB = 1, - BAROMETER_BAR_XLSB = 2, - BAROMETER_BAR_SUM, -}; - -struct BarometerRawData { - int32_t unpensatePre; - int32_t unpensateTemp; -}; - -enum BarometerData { - BAROMETER_BAROMETER = 0, - BAROMETER_TEMPERATURE = 1, - BAROMETER_ALTITUDE = 2, - BAROMETER_SUM, -}; - -struct BarometerOpsCall { - int32_t (*Init)(struct SensorCfgData *data); - int32_t (*ReadData)(struct SensorCfgData *data); -}; - -struct BarometerDrvData { - struct IDeviceIoService ioService; - struct HdfDeviceObject *device; - HdfWorkQueue barometerWorkQueue; - HdfWork barometerWork; - OsalTimer barometerTimer; - bool detectFlag; - bool enable; - int64_t interval; - struct SensorCfgData *barometerCfg; - struct BarometerOpsCall ops; -}; - -int32_t BarometerRegisterChipOps(const struct BarometerOpsCall *ops); -struct SensorCfgData *BarometerCreateCfgData(const struct DeviceResourceNode *node); -void BarometerReleaseCfgData(struct SensorCfgData *sensorCfgData); - -#endif /* SENSOR_BAROMETER_DRIVER_H */ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_BAROMETER_DRIVER_H +#define SENSOR_BAROMETER_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define BAR_DEFAULT_SAMPLING_200_MS 200000000 +#define BAROMETER_CHIP_NAME_BMP180 "bmp180" + +enum BarometerEeprom { + BAROMETER_AC1_MSB = 0, + BAROMETER_AC1_LSB = 1, + BAROMETER_AC2_MSB = 2, + BAROMETER_AC2_LSB = 3, + BAROMETER_AC3_MSB = 4, + BAROMETER_AC3_LSB = 5, + BAROMETER_AC4_MSB = 6, + BAROMETER_AC4_LSB = 7, + BAROMETER_AC5_MSB = 8, + BAROMETER_AC5_LSB = 9, + BAROMETER_AC6_MSB = 10, + BAROMETER_AC6_LSB = 11, + BAROMETER_B1_MSB = 12, + BAROMETER_B1_LSB = 13, + BAROMETER_B2_MSB = 14, + BAROMETER_B2_LSB = 15, + BAROMETER_MB_MSB = 16, + BAROMETER_MB_LSB = 17, + BAROMETER_MC_MSB = 18, + BAROMETER_MC_LSB = 19, + BAROMETER_MD_MSB = 20, + BAROMETER_MD_LSB = 21, + BAROMETER_EEPROM_SUM, +}; + +struct BarometerEepromData { + int32_t ac1; + int32_t ac2; + int32_t ac3; + int32_t b1; + int32_t b2; + int32_t mb; + int32_t mc; + int32_t md; + uint32_t ac4; + uint32_t ac5; + uint32_t ac6; +}; + +struct Coefficient { + int32_t b3; + int32_t b5; + int32_t b6; + int32_t x1; + int32_t x2; + int32_t x3; + int32_t p; + uint32_t b4; + uint32_t b7; +}; + +enum Temperature { + BAROMETER_TEM_MSB = 0, + BAROMETER_TEM_LSB = 1, + BAROMETER_TEM_SUM, +}; + +enum Barometer { + BAROMETER_BAR_MSB = 0, + BAROMETER_BAR_LSB = 1, + BAROMETER_BAR_XLSB = 2, + BAROMETER_BAR_SUM, +}; + +struct BarometerRawData { + int32_t unpensatePre; + int32_t unpensateTemp; +}; + +enum BarometerData { + BAROMETER_BAROMETER = 0, + BAROMETER_TEMPERATURE = 1, + BAROMETER_ALTITUDE = 2, + BAROMETER_SUM, +}; + +struct BarometerOpsCall { + int32_t (*Init)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data); +}; + +struct BarometerDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue barometerWorkQueue; + HdfWork barometerWork; + OsalTimer barometerTimer; + bool detectFlag; + bool enable; + int64_t interval; + struct SensorCfgData *barometerCfg; + struct BarometerOpsCall ops; +}; + +int32_t BarometerRegisterChipOps(const struct BarometerOpsCall *ops); +struct SensorCfgData *BarometerCreateCfgData(const struct DeviceResourceNode *node); +void BarometerReleaseCfgData(struct SensorCfgData *sensorCfgData); + +#endif /* SENSOR_BAROMETER_DRIVER_H */ diff --git a/model/sensor/driver/chipset/barometer/barometer_bmp180.c b/model/sensor/driver/chipset/barometer/barometer_bmp180.c index 298684807..947c51a28 100644 --- a/model/sensor/driver/chipset/barometer/barometer_bmp180.c +++ b/model/sensor/driver/chipset/barometer/barometer_bmp180.c @@ -1,411 +1,411 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "barometer_bmp180.h" -#include -#include "osal_mem.h" -#include "osal_time.h" -#include "sensor_barometer_driver.h" -#include "sensor_config_controller.h" -#include "sensor_device_manager.h" -#include "sensor_platform_if.h" - -static struct Bmp180DrvData *g_bmp180DrvData = NULL; - -struct Bmp180DrvData *Bmp180GetDrvData(void) -{ - return g_bmp180DrvData; -} - -/* IO config for int-pin and I2C-pin */ -#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c -#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 -#define SENSOR_I2C_REG_CFG 0x403 - -static struct BarometerEepromData g_calibraData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -static int32_t ReadEepromRawData(struct SensorCfgData *data, uint8_t rfg[BAROMETER_EEPROM_SUM]) -{ - int32_t ret; - - ret = ReadSensor(&data->busCfg, BMP180_AC1_MSB_ADDR, &rfg[BAROMETER_AC1_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC1_LSB_ADDR, &rfg[BAROMETER_AC1_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC2_MSB_ADDR, &rfg[BAROMETER_AC2_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC2_LSB_ADDR, &rfg[BAROMETER_AC2_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC3_MSB_ADDR, &rfg[BAROMETER_AC3_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC3_LSB_ADDR, &rfg[BAROMETER_AC3_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC4_MSB_ADDR, &rfg[BAROMETER_AC4_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC4_LSB_ADDR, &rfg[BAROMETER_AC4_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC5_MSB_ADDR, &rfg[BAROMETER_AC5_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC5_LSB_ADDR, &rfg[BAROMETER_AC5_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_AC6_MSB_ADDR, &rfg[BAROMETER_AC6_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - ret = ReadSensor(&data->busCfg, BMP180_AC6_LSB_ADDR, &rfg[BAROMETER_AC6_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_B1_MSB_ADDR, &rfg[BAROMETER_B1_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_B1_LSB_ADDR, &rfg[BAROMETER_B1_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_B2_MSB_ADDR, &rfg[BAROMETER_B2_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_B2_LSB_ADDR, &rfg[BAROMETER_B2_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MB_MSB_ADDR, &rfg[BAROMETER_MB_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MB_LSB_ADDR, &rfg[BAROMETER_MB_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MC_MSB_ADDR, &rfg[BAROMETER_MC_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MC_LSB_ADDR, &rfg[BAROMETER_MC_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MD_MSB_ADDR, &rfg[BAROMETER_MD_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_MD_LSB_ADDR, &rfg[BAROMETER_MD_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - return ret; -} - -static int32_t ReadEepromData(struct SensorCfgData *data, struct BarometerEepromData *g_calibraData) -{ - int32_t ret; - uint8_t reg[BAROMETER_EEPROM_SUM]; - - (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); - - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - - ret = ReadEepromRawData(data, reg); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - - g_calibraData->ac1 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC1_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC1_LSB]); - g_calibraData->ac2 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC2_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC2_LSB]); - g_calibraData->ac3 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC3_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC3_LSB]); - g_calibraData->ac4 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC4_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC4_LSB]); - g_calibraData->ac5 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC5_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC5_LSB]); - g_calibraData->ac6 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC6_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_AC6_LSB]); - g_calibraData->b1 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_B1_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_B1_LSB]); - g_calibraData->b2 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_B2_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_B2_LSB]); - g_calibraData->mb = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MB_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_MB_LSB]); - g_calibraData->mc = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MC_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_MC_LSB]); - g_calibraData->md = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MD_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_MD_LSB]); - - return ret; -} - -static int32_t ReadTempData(struct SensorCfgData *data, struct BarometerRawData *Temp) -{ - int32_t ret; - uint8_t status = 0; - uint8_t reg[BAROMETER_TEM_SUM]; - uint8_t value[SENSOR_VALUE_BUTT]; - value[SENSOR_ADDR_INDEX] = BMP180_CONTROL_REG_ADDR; - value[SENSOR_VALUE_INDEX] = BMP180_COVERT_TEMP; - - (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); - - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - - ret = ReadSensor(&data->busCfg, BMP180_COVERT_PRES_3, &status, sizeof(uint8_t)); - if ((status & BMP180_STATUS_ADDR) == BMP180_STATUS_JUDGE) { - WriteSensor(&data->busCfg, value, sizeof(value)); - OsalMDelay(DELAY_0); - ret = ReadSensor(&data->busCfg, BMP180_OUT_MSB_ADDR, ®[BAROMETER_TEM_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_OUT_LSB_ADDR, ®[BAROMETER_TEM_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - Temp->unpensateTemp = (int32_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_TEM_MSB], SENSOR_DATA_WIDTH_8_BIT) | - reg[BAROMETER_TEM_LSB]); - } - return ret; -} - -static int32_t ReadBarometerData(struct SensorCfgData *data, struct BarometerRawData *Barom) -{ - int32_t ret; - uint8_t status = 0; - uint8_t reg[BAROMETER_BAR_SUM]; - uint8_t value[SENSOR_VALUE_BUTT]; - value[SENSOR_ADDR_INDEX] = BMP180_CONTROL_REG_ADDR; - value[SENSOR_VALUE_INDEX] = BMP180_COVERT_PRES_1; - - (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); - - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - - ret = ReadSensor(&data->busCfg, BMP180_COVERT_PRES_3, &status, sizeof(uint8_t)); - if ((status & BMP180_STATUS_ADDR) == BMP180_STATUS_JUDGE) { - WriteSensor(&data->busCfg, value, sizeof(value)); - OsalMDelay(DELAY_1); - ret = ReadSensor(&data->busCfg, BMP180_OUT_MSB_ADDR, ®[BAROMETER_BAR_MSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_OUT_LSB_ADDR, ®[BAROMETER_BAR_LSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - ret = ReadSensor(&data->busCfg, BMP180_OUT_XLSB_ADDR, ®[BAROMETER_BAR_XLSB], sizeof(uint8_t)); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - - Barom->unpensatePre = (int32_t)(SENSOR_DATA_SHIFT_RIGHT( - (SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_BAR_MSB], SENSOR_DATA_WIDTH_16_BIT) | - SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_BAR_LSB], SENSOR_DATA_WIDTH_8_BIT) | reg[BAROMETER_BAR_XLSB]), - (BMP180_CONSTANT_4 - OSSETTING))); - } - return ret; -} - -static int32_t CalcBarometerData(struct BarometerRawData *barometerData, int32_t tnp[BAROMETER_SUM]) -{ - struct Coefficient coefficientData = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - - // Calculated temperature - - coefficientData.x1 = ((barometerData->unpensateTemp - g_calibraData.ac6) * (g_calibraData.ac5)) - >> BMP180_CONSTANT_8; - coefficientData.x2 = (g_calibraData.mc << BMP180_CONSTANT_5) / (coefficientData.x1 + g_calibraData.md); - coefficientData.b5 = coefficientData.x1 + coefficientData.x2; - tnp[BAROMETER_TEMPERATURE] = (coefficientData.b5 + BMP180_CONSTANT_4) >> BMP180_CONSTANT_3; - - // Calculated pressure - - coefficientData.b6 = coefficientData.b5 - BMP180_CONSTANT_12; - coefficientData.x1 = (g_calibraData.b2 * ((coefficientData.b6 * coefficientData.b6) >> BMP180_CONSTANT_6)) - >> BMP180_CONSTANT_5; - coefficientData.x2 = (g_calibraData.ac2 * coefficientData.b6) >> BMP180_CONSTANT_5; - coefficientData.x3 = coefficientData.x1 + coefficientData.x2; - coefficientData.b3 = (((((int32_t)g_calibraData.ac1) * BMP180_CONSTANT_3 + coefficientData.x3) << OSSETTING) - + BMP180_CONSTANT_2) >> BMP180_CONSTANT_2; - coefficientData.x1 = (g_calibraData.ac3 * coefficientData.b6) >> BMP180_CONSTANT_7; - coefficientData.x2 = (g_calibraData.b1 * ((coefficientData.b6 * coefficientData.b6) >> BMP180_CONSTANT_6)) - >> BMP180_CONSTANT_9; - coefficientData.x3 = ((coefficientData.x1 + coefficientData.x2) + BMP180_CONSTANT_2) >> BMP180_CONSTANT_2; - coefficientData.b4 = (g_calibraData.ac4 * (uint32_t)(coefficientData.x3 + BMP180_CONSTANT_13)) - >> BMP180_CONSTANT_8; - coefficientData.b7 = ((uint32_t)(barometerData->unpensatePre) - (uint32_t)coefficientData.b3) - * (BMP180_CONSTANT_14 >> OSSETTING); - if (coefficientData.b7 < BMP180_CONSTANT_15) { - coefficientData.p = (coefficientData.b7 << BMP180_CONSTANT_1) / coefficientData.b4; - } else { - coefficientData.p = (coefficientData.b7 / coefficientData.b4) << BMP180_CONSTANT_1; - } - coefficientData.x1 = (coefficientData.p >> BMP180_CONSTANT_4) * (coefficientData.p >> BMP180_CONSTANT_4); - coefficientData.x1 = (coefficientData.x1 * BMP180_CONSTANT_10) >> BMP180_CONSTANT_9; - coefficientData.x2 = (BMP180_CONSTANT_0 * coefficientData.p) >> BMP180_CONSTANT_9; - tnp[BAROMETER_BAROMETER] = coefficientData.p + ((coefficientData.x1 + coefficientData.x2 - + BMP180_CONSTANT_11) >> BMP180_CONSTANT_3); - - return HDF_SUCCESS; -} - -int32_t ReadBmp180Data(struct SensorCfgData *data) -{ - int32_t ret; - int32_t tmp[BAROMETER_SUM]; - struct BarometerRawData barometerData = {0, 0}; - OsalTimespec time; - struct SensorReportEvent event; - - (void)memset_s(&time, sizeof(time), 0, sizeof(time)); - (void)memset_s(&event, sizeof(event), 0, sizeof(event)); - - if (OsalGetTime(&time) != HDF_SUCCESS) { - HDF_LOGE("%s: Get time failed", __func__); - return HDF_FAILURE; - } - event.timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; - - ret = ReadTempData(data, &barometerData); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - - ret = ReadBarometerData(data, &barometerData); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - - ret = CalcBarometerData(&barometerData, tmp); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - - event.sensorId = SENSOR_TAG_BAROMETER; - event.option = 0; - event.mode = SENSOR_WORK_MODE_REALTIME; - event.dataLen = sizeof(tmp); - event.data = (uint8_t *)&tmp; - ret = ReportSensorEvent(&event); - return ret; -} - -static int32_t InitBmp180(struct SensorCfgData *data) -{ - int32_t ret; - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - struct SensorReportEvent event; - - (void)memset_s(&event, sizeof(event), 0, sizeof(event)); - - ret = ReadEepromData(data, &g_calibraData); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: BMP180 sensor init config failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -static int32_t InitBarometerPreConfig(void) -{ - if (SetSensorPinMux(SENSOR_I2C6_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { - HDF_LOGE("%s: Data write mux pin failed", __func__); - return HDF_FAILURE; - } - if (SetSensorPinMux(SENSOR_I2C6_CLK_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { - HDF_LOGE("%s: Clk write mux pin failed", __func__); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -static int32_t DispatchBMP180(struct HdfDeviceIoClient *client, - int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - (void)client; - (void)cmd; - (void)data; - (void)reply; - - return HDF_SUCCESS; -} - -int32_t Bmp180BindDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - - struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)OsalMemCalloc(sizeof(*drvData)); - if (drvData == NULL) { - HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); - return HDF_ERR_MALLOC_FAIL; - } - - drvData->ioService.Dispatch = DispatchBMP180; - drvData->device = device; - device->service = &drvData->ioService; - g_bmp180DrvData = drvData; - - return HDF_SUCCESS; -} - -int32_t Bmp180InitDriver(struct HdfDeviceObject *device) -{ - int32_t ret; - struct BarometerOpsCall ops; - - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)device->service; - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - ret = InitBarometerPreConfig(); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init BMp180 bus mux config", __func__); - return HDF_FAILURE; - } - - drvData->sensorCfg = BarometerCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { - return HDF_ERR_NOT_SUPPORT; - } - - ops.Init = NULL; - ops.ReadData = ReadBmp180Data; - ret = BarometerRegisterChipOps(&ops); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Register BMp180 barometer failed", __func__); - return HDF_FAILURE; - } - - ret = InitBmp180(drvData->sensorCfg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Init BMP180 barometer failed", __func__); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -void Bmp180ReleaseDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN(device); - - struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)device->service; - CHECK_NULL_PTR_RETURN(drvData); - - BarometerReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; - OsalMemFree(drvData); -} - -struct HdfDriverEntry g_barometerBmp180DevEntry = { - .moduleVersion = 1, - .moduleName = "HDF_SENSOR_BAROMETER_BMP180", - .Bind = Bmp180BindDriver, - .Init = Bmp180InitDriver, - .Release = Bmp180ReleaseDriver, -}; - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "barometer_bmp180.h" +#include +#include "osal_mem.h" +#include "osal_time.h" +#include "sensor_barometer_driver.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +static struct Bmp180DrvData *g_bmp180DrvData = NULL; + +struct Bmp180DrvData *Bmp180GetDrvData(void) +{ + return g_bmp180DrvData; +} + +/* IO config for int-pin and I2C-pin */ +#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c +#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 +#define SENSOR_I2C_REG_CFG 0x403 + +static struct BarometerEepromData g_calibraData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +static int32_t ReadEepromRawData(struct SensorCfgData *data, uint8_t rfg[BAROMETER_EEPROM_SUM]) +{ + int32_t ret; + + ret = ReadSensor(&data->busCfg, BMP180_AC1_MSB_ADDR, &rfg[BAROMETER_AC1_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC1_LSB_ADDR, &rfg[BAROMETER_AC1_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC2_MSB_ADDR, &rfg[BAROMETER_AC2_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC2_LSB_ADDR, &rfg[BAROMETER_AC2_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC3_MSB_ADDR, &rfg[BAROMETER_AC3_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC3_LSB_ADDR, &rfg[BAROMETER_AC3_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC4_MSB_ADDR, &rfg[BAROMETER_AC4_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC4_LSB_ADDR, &rfg[BAROMETER_AC4_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC5_MSB_ADDR, &rfg[BAROMETER_AC5_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC5_LSB_ADDR, &rfg[BAROMETER_AC5_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_AC6_MSB_ADDR, &rfg[BAROMETER_AC6_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + ret = ReadSensor(&data->busCfg, BMP180_AC6_LSB_ADDR, &rfg[BAROMETER_AC6_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_B1_MSB_ADDR, &rfg[BAROMETER_B1_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_B1_LSB_ADDR, &rfg[BAROMETER_B1_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_B2_MSB_ADDR, &rfg[BAROMETER_B2_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_B2_LSB_ADDR, &rfg[BAROMETER_B2_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MB_MSB_ADDR, &rfg[BAROMETER_MB_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MB_LSB_ADDR, &rfg[BAROMETER_MB_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MC_MSB_ADDR, &rfg[BAROMETER_MC_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MC_LSB_ADDR, &rfg[BAROMETER_MC_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MD_MSB_ADDR, &rfg[BAROMETER_MD_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_MD_LSB_ADDR, &rfg[BAROMETER_MD_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + return ret; +} + +static int32_t ReadEepromData(struct SensorCfgData *data, struct BarometerEepromData *g_calibraData) +{ + int32_t ret; + uint8_t reg[BAROMETER_EEPROM_SUM]; + + (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + ret = ReadEepromRawData(data, reg); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + + g_calibraData->ac1 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC1_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC1_LSB]); + g_calibraData->ac2 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC2_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC2_LSB]); + g_calibraData->ac3 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC3_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC3_LSB]); + g_calibraData->ac4 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC4_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC4_LSB]); + g_calibraData->ac5 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC5_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC5_LSB]); + g_calibraData->ac6 = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_AC6_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_AC6_LSB]); + g_calibraData->b1 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_B1_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_B1_LSB]); + g_calibraData->b2 = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_B2_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_B2_LSB]); + g_calibraData->mb = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MB_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_MB_LSB]); + g_calibraData->mc = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MC_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_MC_LSB]); + g_calibraData->md = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_MD_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_MD_LSB]); + + return ret; +} + +static int32_t ReadTempData(struct SensorCfgData *data, struct BarometerRawData *Temp) +{ + int32_t ret; + uint8_t status = 0; + uint8_t reg[BAROMETER_TEM_SUM]; + uint8_t value[SENSOR_VALUE_BUTT]; + value[SENSOR_ADDR_INDEX] = BMP180_CONTROL_REG_ADDR; + value[SENSOR_VALUE_INDEX] = BMP180_COVERT_TEMP; + + (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + ret = ReadSensor(&data->busCfg, BMP180_COVERT_PRES_3, &status, sizeof(uint8_t)); + if ((status & BMP180_STATUS_ADDR) == BMP180_STATUS_JUDGE) { + WriteSensor(&data->busCfg, value, sizeof(value)); + OsalMDelay(DELAY_0); + ret = ReadSensor(&data->busCfg, BMP180_OUT_MSB_ADDR, ®[BAROMETER_TEM_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_OUT_LSB_ADDR, ®[BAROMETER_TEM_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + Temp->unpensateTemp = (int32_t)(SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_TEM_MSB], SENSOR_DATA_WIDTH_8_BIT) | + reg[BAROMETER_TEM_LSB]); + } + return ret; +} + +static int32_t ReadBarometerData(struct SensorCfgData *data, struct BarometerRawData *Barom) +{ + int32_t ret; + uint8_t status = 0; + uint8_t reg[BAROMETER_BAR_SUM]; + uint8_t value[SENSOR_VALUE_BUTT]; + value[SENSOR_ADDR_INDEX] = BMP180_CONTROL_REG_ADDR; + value[SENSOR_VALUE_INDEX] = BMP180_COVERT_PRES_1; + + (void)memset_s(reg, sizeof(reg), 0, sizeof(reg)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + ret = ReadSensor(&data->busCfg, BMP180_COVERT_PRES_3, &status, sizeof(uint8_t)); + if ((status & BMP180_STATUS_ADDR) == BMP180_STATUS_JUDGE) { + WriteSensor(&data->busCfg, value, sizeof(value)); + OsalMDelay(DELAY_1); + ret = ReadSensor(&data->busCfg, BMP180_OUT_MSB_ADDR, ®[BAROMETER_BAR_MSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_OUT_LSB_ADDR, ®[BAROMETER_BAR_LSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + ret = ReadSensor(&data->busCfg, BMP180_OUT_XLSB_ADDR, ®[BAROMETER_BAR_XLSB], sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + Barom->unpensatePre = (int32_t)(SENSOR_DATA_SHIFT_RIGHT( + (SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_BAR_MSB], SENSOR_DATA_WIDTH_16_BIT) | + SENSOR_DATA_SHIFT_LEFT(reg[BAROMETER_BAR_LSB], SENSOR_DATA_WIDTH_8_BIT) | reg[BAROMETER_BAR_XLSB]), + (BMP180_CONSTANT_4 - OSSETTING))); + } + return ret; +} + +static int32_t CalcBarometerData(struct BarometerRawData *barometerData, int32_t tnp[BAROMETER_SUM]) +{ + struct Coefficient coefficientData = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + + // Calculated temperature + + coefficientData.x1 = ((barometerData->unpensateTemp - g_calibraData.ac6) * (g_calibraData.ac5)) + >> BMP180_CONSTANT_8; + coefficientData.x2 = (g_calibraData.mc << BMP180_CONSTANT_5) / (coefficientData.x1 + g_calibraData.md); + coefficientData.b5 = coefficientData.x1 + coefficientData.x2; + tnp[BAROMETER_TEMPERATURE] = (coefficientData.b5 + BMP180_CONSTANT_4) >> BMP180_CONSTANT_3; + + // Calculated pressure + + coefficientData.b6 = coefficientData.b5 - BMP180_CONSTANT_12; + coefficientData.x1 = (g_calibraData.b2 * ((coefficientData.b6 * coefficientData.b6) >> BMP180_CONSTANT_6)) + >> BMP180_CONSTANT_5; + coefficientData.x2 = (g_calibraData.ac2 * coefficientData.b6) >> BMP180_CONSTANT_5; + coefficientData.x3 = coefficientData.x1 + coefficientData.x2; + coefficientData.b3 = (((((int32_t)g_calibraData.ac1) * BMP180_CONSTANT_3 + coefficientData.x3) << OSSETTING) + + BMP180_CONSTANT_2) >> BMP180_CONSTANT_2; + coefficientData.x1 = (g_calibraData.ac3 * coefficientData.b6) >> BMP180_CONSTANT_7; + coefficientData.x2 = (g_calibraData.b1 * ((coefficientData.b6 * coefficientData.b6) >> BMP180_CONSTANT_6)) + >> BMP180_CONSTANT_9; + coefficientData.x3 = ((coefficientData.x1 + coefficientData.x2) + BMP180_CONSTANT_2) >> BMP180_CONSTANT_2; + coefficientData.b4 = (g_calibraData.ac4 * (uint32_t)(coefficientData.x3 + BMP180_CONSTANT_13)) + >> BMP180_CONSTANT_8; + coefficientData.b7 = ((uint32_t)(barometerData->unpensatePre) - (uint32_t)coefficientData.b3) + * (BMP180_CONSTANT_14 >> OSSETTING); + if (coefficientData.b7 < BMP180_CONSTANT_15) { + coefficientData.p = (coefficientData.b7 << BMP180_CONSTANT_1) / coefficientData.b4; + } else { + coefficientData.p = (coefficientData.b7 / coefficientData.b4) << BMP180_CONSTANT_1; + } + coefficientData.x1 = (coefficientData.p >> BMP180_CONSTANT_4) * (coefficientData.p >> BMP180_CONSTANT_4); + coefficientData.x1 = (coefficientData.x1 * BMP180_CONSTANT_10) >> BMP180_CONSTANT_9; + coefficientData.x2 = (BMP180_CONSTANT_0 * coefficientData.p) >> BMP180_CONSTANT_9; + tnp[BAROMETER_BAROMETER] = coefficientData.p + ((coefficientData.x1 + coefficientData.x2 + + BMP180_CONSTANT_11) >> BMP180_CONSTANT_3); + + return HDF_SUCCESS; +} + +int32_t ReadBmp180Data(struct SensorCfgData *data) +{ + int32_t ret; + int32_t tmp[BAROMETER_SUM]; + struct BarometerRawData barometerData = {0, 0}; + OsalTimespec time; + struct SensorReportEvent event; + + (void)memset_s(&time, sizeof(time), 0, sizeof(time)); + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return HDF_FAILURE; + } + event.timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; + + ret = ReadTempData(data, &barometerData); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + + ret = ReadBarometerData(data, &barometerData); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + + ret = CalcBarometerData(&barometerData, tmp); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + + event.sensorId = SENSOR_TAG_BAROMETER; + event.option = 0; + event.mode = SENSOR_WORK_MODE_REALTIME; + event.dataLen = sizeof(tmp); + event.data = (uint8_t *)&tmp; + ret = ReportSensorEvent(&event); + return ret; +} + +static int32_t InitBmp180(struct SensorCfgData *data) +{ + int32_t ret; + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + struct SensorReportEvent event; + + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + + ret = ReadEepromData(data, &g_calibraData); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BMP180 sensor init config failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t InitBarometerPreConfig(void) +{ + if (SetSensorPinMux(SENSOR_I2C6_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Data write mux pin failed", __func__); + return HDF_FAILURE; + } + if (SetSensorPinMux(SENSOR_I2C6_CLK_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Clk write mux pin failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t DispatchBMP180(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t Bmp180BindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchBMP180; + drvData->device = device; + device->service = &drvData->ioService; + g_bmp180DrvData = drvData; + + return HDF_SUCCESS; +} + +int32_t Bmp180InitDriver(struct HdfDeviceObject *device) +{ + int32_t ret; + struct BarometerOpsCall ops; + + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + ret = InitBarometerPreConfig(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BMp180 bus mux config", __func__); + return HDF_FAILURE; + } + + drvData->sensorCfg = BarometerCreateCfgData(device->property); + if (drvData->sensorCfg == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + ops.Init = NULL; + ops.ReadData = ReadBmp180Data; + ret = BarometerRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register BMp180 barometer failed", __func__); + return HDF_FAILURE; + } + + ret = InitBmp180(drvData->sensorCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init BMP180 barometer failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +void Bmp180ReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + BarometerReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_barometerBmp180DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_BAROMETER_BMP180", + .Bind = Bmp180BindDriver, + .Init = Bmp180InitDriver, + .Release = Bmp180ReleaseDriver, +}; + HDF_INIT(g_barometerBmp180DevEntry); \ No newline at end of file diff --git a/model/sensor/driver/chipset/barometer/barometer_bmp180.h b/model/sensor/driver/chipset/barometer/barometer_bmp180.h index a361405bf..c62e1aa1f 100644 --- a/model/sensor/driver/chipset/barometer/barometer_bmp180.h +++ b/model/sensor/driver/chipset/barometer/barometer_bmp180.h @@ -1,96 +1,96 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef BAROMETER_BMP180_H -#define BAROMETER_BMP180_H - -#include "sensor_barometer_driver.h" -#include "sensor_config_parser.h" - -#define BMP180_REG_CHIP_ID 0xD0 - -// i2c slave address - -#define BMP180_ADDR 0x77 - -// Define calibration register address - -#define BMP180_AC1_MSB_ADDR 0xAA -#define BMP180_AC1_LSB_ADDR 0xAB -#define BMP180_AC2_MSB_ADDR 0xAC -#define BMP180_AC2_LSB_ADDR 0xAD -#define BMP180_AC3_MSB_ADDR 0xAE -#define BMP180_AC3_LSB_ADDR 0xAF -#define BMP180_AC4_MSB_ADDR 0xB0 -#define BMP180_AC4_LSB_ADDR 0xB1 -#define BMP180_AC5_MSB_ADDR 0xB2 -#define BMP180_AC5_LSB_ADDR 0xB3 -#define BMP180_AC6_MSB_ADDR 0xB4 -#define BMP180_AC6_LSB_ADDR 0xB5 -#define BMP180_B1_MSB_ADDR 0xB6 -#define BMP180_B1_LSB_ADDR 0xB7 -#define BMP180_B2_MSB_ADDR 0xB8 -#define BMP180_B2_LSB_ADDR 0xB9 -#define BMP180_MB_MSB_ADDR 0xBA -#define BMP180_MB_LSB_ADDR 0xBB -#define BMP180_MC_MSB_ADDR 0xBC -#define BMP180_MC_LSB_ADDR 0xBD -#define BMP180_MD_MSB_ADDR 0xBE -#define BMP180_MD_LSB_ADDR 0xBf - -// Control register - -#define BMP180_CONTROL_REG_ADDR 0xF4 -#define BMP180_COVERT_TEMP 0x2E -#define BMP180_COVERT_PRES_0 0x34 -#define BMP180_COVERT_PRES_1 0x74 -#define BMP180_COVERT_PRES_2 0xB4 -#define BMP180_COVERT_PRES_3 0xF4 - -#define BMP180_OUT_MSB_ADDR 0xF6 -#define BMP180_OUT_LSB_ADDR 0xF7 -#define BMP180_OUT_XLSB_ADDR 0xF8 - -#define BMP180_STATUS_ADDR 0X20 -#define BMP180_STATUS_JUDGE 0X00 - -#define SENSOR_DATA_WIDTH_16_BIT 16 - -#define OSSETTING 1 -#define DELAY_0 5 -#define DELAY_1 8 -#define OSS_TIME_MS 26 - -#define BMP180_CONSTANT_0 (-7357) -#define BMP180_CONSTANT_1 1 -#define BMP180_CONSTANT_2 2 -#define BMP180_CONSTANT_3 4 -#define BMP180_CONSTANT_4 8 -#define BMP180_CONSTANT_5 11 -#define BMP180_CONSTANT_6 12 -#define BMP180_CONSTANT_7 13 -#define BMP180_CONSTANT_8 15 -#define BMP180_CONSTANT_9 16 -#define BMP180_CONSTANT_10 3038 -#define BMP180_CONSTANT_11 3791 -#define BMP180_CONSTANT_12 4000 -#define BMP180_CONSTANT_13 32768 -#define BMP180_CONSTANT_14 50000 -#define BMP180_CONSTANT_15 0x80000000 - - -int32_t DetectBarometerBmp180Chip(struct SensorCfgData *data); -int32_t ReadBmp180Data(struct SensorCfgData *data); - -struct Bmp180DrvData { - struct IDeviceIoService ioService; - struct HdfDeviceObject *device; - struct SensorCfgData *sensorCfg; -}; - +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef BAROMETER_BMP180_H +#define BAROMETER_BMP180_H + +#include "sensor_barometer_driver.h" +#include "sensor_config_parser.h" + +#define BMP180_REG_CHIP_ID 0xD0 + +// i2c slave address + +#define BMP180_ADDR 0x77 + +// Define calibration register address + +#define BMP180_AC1_MSB_ADDR 0xAA +#define BMP180_AC1_LSB_ADDR 0xAB +#define BMP180_AC2_MSB_ADDR 0xAC +#define BMP180_AC2_LSB_ADDR 0xAD +#define BMP180_AC3_MSB_ADDR 0xAE +#define BMP180_AC3_LSB_ADDR 0xAF +#define BMP180_AC4_MSB_ADDR 0xB0 +#define BMP180_AC4_LSB_ADDR 0xB1 +#define BMP180_AC5_MSB_ADDR 0xB2 +#define BMP180_AC5_LSB_ADDR 0xB3 +#define BMP180_AC6_MSB_ADDR 0xB4 +#define BMP180_AC6_LSB_ADDR 0xB5 +#define BMP180_B1_MSB_ADDR 0xB6 +#define BMP180_B1_LSB_ADDR 0xB7 +#define BMP180_B2_MSB_ADDR 0xB8 +#define BMP180_B2_LSB_ADDR 0xB9 +#define BMP180_MB_MSB_ADDR 0xBA +#define BMP180_MB_LSB_ADDR 0xBB +#define BMP180_MC_MSB_ADDR 0xBC +#define BMP180_MC_LSB_ADDR 0xBD +#define BMP180_MD_MSB_ADDR 0xBE +#define BMP180_MD_LSB_ADDR 0xBf + +// Control register + +#define BMP180_CONTROL_REG_ADDR 0xF4 +#define BMP180_COVERT_TEMP 0x2E +#define BMP180_COVERT_PRES_0 0x34 +#define BMP180_COVERT_PRES_1 0x74 +#define BMP180_COVERT_PRES_2 0xB4 +#define BMP180_COVERT_PRES_3 0xF4 + +#define BMP180_OUT_MSB_ADDR 0xF6 +#define BMP180_OUT_LSB_ADDR 0xF7 +#define BMP180_OUT_XLSB_ADDR 0xF8 + +#define BMP180_STATUS_ADDR 0X20 +#define BMP180_STATUS_JUDGE 0X00 + +#define SENSOR_DATA_WIDTH_16_BIT 16 + +#define OSSETTING 1 +#define DELAY_0 5 +#define DELAY_1 8 +#define OSS_TIME_MS 26 + +#define BMP180_CONSTANT_0 (-7357) +#define BMP180_CONSTANT_1 1 +#define BMP180_CONSTANT_2 2 +#define BMP180_CONSTANT_3 4 +#define BMP180_CONSTANT_4 8 +#define BMP180_CONSTANT_5 11 +#define BMP180_CONSTANT_6 12 +#define BMP180_CONSTANT_7 13 +#define BMP180_CONSTANT_8 15 +#define BMP180_CONSTANT_9 16 +#define BMP180_CONSTANT_10 3038 +#define BMP180_CONSTANT_11 3791 +#define BMP180_CONSTANT_12 4000 +#define BMP180_CONSTANT_13 32768 +#define BMP180_CONSTANT_14 50000 +#define BMP180_CONSTANT_15 0x80000000 + + +int32_t DetectBarometerBmp180Chip(struct SensorCfgData *data); +int32_t ReadBmp180Data(struct SensorCfgData *data); + +struct Bmp180DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + #endif /* BAROMETER_BMP180_H */ \ No newline at end of file diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 354eb9e4d..6c25692ef 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -34,7 +34,7 @@ int32_t HallRegisterChipOps(const struct HallOpsCall *ops) CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); - + drvData->ops.Init = ops->Init; drvData->ops.ReadData = ops->ReadData; return HDF_SUCCESS; @@ -43,7 +43,7 @@ int32_t HallRegisterChipOps(const struct HallOpsCall *ops) static void HallDataWorkEntry(void *arg) { struct HallDrvData *drvData = NULL; - + drvData = (struct HallDrvData *)arg; CHECK_NULL_PTR_RETURN(drvData); @@ -256,7 +256,7 @@ static int32_t ParserHallPinConfigData(const struct DeviceResourceNode *node, st CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); - + const struct DeviceResourceNode *pinNode = parser->GetChildNode(node, "hallPinConfig"); CHECK_NULL_PTR_RETURN_VALUE(pinNode, HDF_ERR_INVALID_PARAM); diff --git a/model/sensor/driver/hall/sensor_hall_driver.h b/model/sensor/driver/hall/sensor_hall_driver.h index 3b706dcc3..649059775 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.h +++ b/model/sensor/driver/hall/sensor_hall_driver.h @@ -9,7 +9,7 @@ #ifndef SENSOR_HALL_DRIVER_H #define SENSOR_HALL_DRIVER_H -#include "hdf_workqueue.h" +#include "hdf_workqueue.h" #include "sensor_config_parser.h" #include "sensor_platform_if.h" diff --git a/model/sensor/driver/include/sensor_device_if.h b/model/sensor/driver/include/sensor_device_if.h index c3315fdc7..5a68aa5df 100644 --- a/model/sensor/driver/include/sensor_device_if.h +++ b/model/sensor/driver/include/sensor_device_if.h @@ -1,31 +1,31 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SENSOR_DEVICE_IF_H -#define SENSOR_DEVICE_IF_H - -#include "sensor_device_type.h" - -struct SensorOps { - int32_t (*Enable)(void); - int32_t (*Disable)(void); - int32_t (*SetBatch)(int64_t samplingInterval, int64_t reportInterval); - int32_t (*SetMode)(int32_t mode); - int32_t (*SetOption)(uint32_t option); -}; - -struct SensorDeviceInfo { - struct SensorBasicInfo sensorInfo; - struct SensorOps ops; -}; - -int32_t AddSensorDevice(const struct SensorDeviceInfo *deviceInfo); -int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo); -int32_t ReportSensorEvent(const struct SensorReportEvent *events); - -#endif /* SENSOR_DEVICE_IF_H */ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_DEVICE_IF_H +#define SENSOR_DEVICE_IF_H + +#include "sensor_device_type.h" + +struct SensorOps { + int32_t (*Enable)(void); + int32_t (*Disable)(void); + int32_t (*SetBatch)(int64_t samplingInterval, int64_t reportInterval); + int32_t (*SetMode)(int32_t mode); + int32_t (*SetOption)(uint32_t option); +}; + +struct SensorDeviceInfo { + struct SensorBasicInfo sensorInfo; + struct SensorOps ops; +}; + +int32_t AddSensorDevice(const struct SensorDeviceInfo *deviceInfo); +int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo); +int32_t ReportSensorEvent(const struct SensorReportEvent *events); + +#endif /* SENSOR_DEVICE_IF_H */ -- Gitee From 6b50a7e9d284f7c5fe80ab094a06104d74d88c1f Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Sun, 26 Sep 2021 18:02:57 +0800 Subject: [PATCH 060/272] =?UTF-8?q?0926-reviewbot=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- test/unittest/platform/common/spi_test.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unittest/platform/common/spi_test.c b/test/unittest/platform/common/spi_test.c index d1603ac08..0fce13ea3 100644 --- a/test/unittest/platform/common/spi_test.c +++ b/test/unittest/platform/common/spi_test.c @@ -237,6 +237,7 @@ static int32_t SpiDmaTransferTest(struct SpiTest *test) return ret; } + SpiUnsetDmaIntMsg(&msg); return HDF_SUCCESS; } @@ -268,6 +269,7 @@ static int32_t SpiIntTransferTest(struct SpiTest *test) return ret; } + SpiUnsetDmaIntMsg(&msg); return HDF_SUCCESS; } -- Gitee From f46b4213c89a95aa92e0d4f33bd0a4d14856931c Mon Sep 17 00:00:00 2001 From: zhang Date: Sun, 26 Sep 2021 19:02:38 +0800 Subject: [PATCH 061/272] modify unsave function Signed-off-by: zhang --- utils/src/hdf_block_buffer.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/utils/src/hdf_block_buffer.c b/utils/src/hdf_block_buffer.c index 1c61c57b4..e5deb0387 100644 --- a/utils/src/hdf_block_buffer.c +++ b/utils/src/hdf_block_buffer.c @@ -8,6 +8,7 @@ #include "hdf_block_buffer.h" #include "osal_mem.h" +#include "securec.h" static const unsigned int OFFSET = 8; @@ -26,7 +27,10 @@ struct HdfHdfBlockBuffer *HdfHdfBlockBufferNew(const uint8_t *data, uint16_t siz buffer->dataSize = size; buffer->position = 0; if (data != NULL) { - memcpy(buffer->data, data, size); + if (memcpy_s(buffer->data, buffer->dataSize, data, size) != EOK) { + OsalMemFree(buffer); + return NULL; + } } return buffer; } @@ -172,10 +176,9 @@ bool HdfBlockBufferWriteData(struct HdfBlockBuffer *buffer, uint8_t *data, size_ return false; } residualSize = buffer->dataSize - buffer->position; - if (length > residualSize) { + if (memcpy_s(buffer->data + buffer->position, residualSize, data, length) != EOK) { return false; } - memcpy(buffer->data + buffer->position, data, length); buffer->position += length; return true; } @@ -196,17 +199,20 @@ struct HdfBlockBuffer *HdfBlockBufferDuplicate(const struct HdfBlockBuffer *buff if (newBuffer == NULL) { return NULL; } - memcpy(newBuffer->data, buffer->data + start, newBufferSize); + if (memcpy_s(newBuffer->data, newBufferSize, buffer->data + start, newBufferSize) != EOK) { + OsalMemFree(newBuffer); + return NULL; + } + return newBuffer; } bool HdfBlockBufferWriteBuff(struct HdfBlockBuffer *dst, struct HdfBlockBuffer *src) { - if (dst->position + src->dataSize <= dst->dataSize) { - memcpy(&dst->data[dst->position], src->data, src->dataSize); - dst->position += src->dataSize; - return true; + if (memcpy_s(&dst->data[dst->position], dst->dataSize - dst->position, src->data, src->dataSize) != EOK) { + return false; } - return false; + dst->position += src->dataSize; + return true; } -- Gitee From 6592e1ee42208f514602deecd40db428b5131590 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 27 Sep 2021 01:23:42 +0000 Subject: [PATCH 062/272] solve the code error Signed-off-by: YOUR_NAME --- model/display/driver/backlight/pwm_bl.c | 4 ++-- model/display/driver/lcdkit/lite_lcdkit.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/model/display/driver/backlight/pwm_bl.c b/model/display/driver/backlight/pwm_bl.c index c3710b4ff..2532e0f4a 100644 --- a/model/display/driver/backlight/pwm_bl.c +++ b/model/display/driver/backlight/pwm_bl.c @@ -51,7 +51,7 @@ static int32_t BlPwmUpdateBrightness(struct BacklightDev *blDev, uint32_t bright duty = (brightness * blPwmDev->config.period) / blPwmDev->props.maxBrightness; ret = PwmSetDuty(blPwmDev->pwmHandle, duty); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: PwmSetDutyCycle failed, ret %d", __func__, ret); + HDF_LOGE("%s: PwmSetDuty failed, ret %d", __func__, ret); return HDF_FAILURE; } if (brightness != 0) { @@ -183,4 +183,4 @@ struct HdfDriverEntry g_pwmBlDevEntry = { .Init = BlPwmEntryInit, }; -HDF_INIT(g_pwmBlDevEntry); \ No newline at end of file +HDF_INIT(g_pwmBlDevEntry); diff --git a/model/display/driver/lcdkit/lite_lcdkit.c b/model/display/driver/lcdkit/lite_lcdkit.c index 7fdf1fb02..b7b3cd4bc 100644 --- a/model/display/driver/lcdkit/lite_lcdkit.c +++ b/model/display/driver/lcdkit/lite_lcdkit.c @@ -205,9 +205,9 @@ static int32_t SetBacklightByPwm(uint32_t level) return HDF_FAILURE; } duty = (level * panelCfg->info.pwm.period) / panelCfg->info.blk.maxLevel; - ret = PwmSetDutyCycle(panelCfg->pwmHandle, duty); + ret = PwmSetDuty(panelCfg->pwmHandle, duty); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: PwmSetDutyCycle failed", __func__); + HDF_LOGE("%s: PwmSetDuty failed", __func__); return HDF_FAILURE; } static uint32_t lastLevel = 0; -- Gitee From 412c67334f86893cea77c1a3476e5c9d9d95d9ae Mon Sep 17 00:00:00 2001 From: bigA2021 Date: Thu, 23 Sep 2021 14:18:36 +0800 Subject: [PATCH 063/272] usb 0922 commit Signed-off-by: bigA2021 Change-Id: Iecce799f7a24e8ceb98153397a00f3c41fa963f9 --- model/usb/src/usb_ddk_pnp_loader.c | 2 +- .../device/src/usb_device_lite_cdcacm_test.c | 18 ++++++------ .../device/src/usb_device_lite_sdk_if_test.c | 21 ++++++++++++++ .../device/src/usb_device_lite_sdk_io_test.c | 28 +++++++++++++++---- .../model/usb/host/src/usb_raw_test.c | 8 +++--- 5 files changed, 58 insertions(+), 19 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index 41d2dac84..6fc3b7469 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -133,7 +133,7 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS) { for (i = 0; i < id->interfaceClassLength; i++) { - if (!((id->interfaceClassMask >> i) & 0x01)) { + if (!((uint32_t)(id->interfaceClassMask >> i) & 0x01)) { break; } } diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index 7250a9366..616660e89 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -339,8 +339,8 @@ static void ParsePipes(struct AcmDevice *acmDevice, struct UsbFnInterface *fnIfa { uint32_t j; int ret; + struct UsbFnPipeInfo pipeInfo = {0}; for (j = 0; j < fnIface->info.numPipes; j++) { - struct UsbFnPipeInfo pipeInfo; ret = UsbFnGetInterfacePipeInfo(fnIface, j, &pipeInfo); if (ret != HDF_SUCCESS) { return; @@ -388,12 +388,11 @@ static int ParseInterfaces(struct AcmDevice *acmDevice) static void CtrlComplete(uint8_t pipe, struct UsbFnRequest *req) { - struct CtrlInfo *ctrlInfo = (struct CtrlInfo *)req->context; - struct AcmDevice *acm = ctrlInfo->acm; - if (req == NULL) { return; } + struct CtrlInfo *ctrlInfo = (struct CtrlInfo *)req->context; + struct AcmDevice *acm = ctrlInfo->acm; if (USB_REQUEST_COMPLETED != req->status) { goto out; } @@ -446,7 +445,7 @@ static int32_t SendNotifyRequest(struct AcmDevice *acm, uint8_t type, struct UsbFnRequest *req = acm->notifyReq; struct UsbCdcNotification *notify = NULL; int ret; - if (acm == NULL || req->buf) { + if ((acm == NULL) || (req == NULL) || (req->buf == NULL) || (data == NULL)) { return -1; } acm->notifyReq = NULL; @@ -592,7 +591,7 @@ static struct UsbFnRequest *GetCtrlReq(struct AcmDevice *acm) return req; } -static void Setup(struct AcmDevice *acm, struct UsbFnCtrlRequest *setup) +static int Setup(struct AcmDevice *acm, struct UsbFnCtrlRequest *setup) { struct UsbFnRequest *req = NULL; struct CtrlInfo *ctrlInfo = NULL; @@ -601,7 +600,7 @@ static void Setup(struct AcmDevice *acm, struct UsbFnCtrlRequest *setup) int ret = 0; req = GetCtrlReq(acm); if (req == NULL) { - return; + return ret; } switch (setup->request) { case USB_DDK_CDC_REQ_SET_LINE_CODING: @@ -616,7 +615,9 @@ static void Setup(struct AcmDevice *acm, struct UsbFnCtrlRequest *setup) if (acm->lineCoding.dwDTERate == 0) { acm->lineCoding = acm->port->lineCoding; } - memcpy_s(req->buf, req->length, &acm->lineCoding, ret); + if (memcpy_s(req->buf, req->length, &acm->lineCoding, ret) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } break; case USB_DDK_CDC_REQ_SET_CONTROL_LINE_STATE: ret = 0; @@ -631,6 +632,7 @@ out: ctrlInfo->request = setup->request; req->length = ret; ret = UsbFnSubmitRequestAsync(req); + return ret; } static void Suspend(struct AcmDevice *acm) diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c index d9ea3c270..aa33cb215 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c @@ -946,6 +946,10 @@ int32_t UsbFnDviceTestAllocCtrlRequest005(void) struct UsbFnRequest *req = NULL; UsbFnInterfaceHandle handle = NULL; + if (g_acmDevice == NULL) { + HDF_LOGE("%s: dataIface.handle is invail", __func__); + return HDF_FAILURE; + } req = UsbFnAllocCtrlRequest(handle, g_acmDevice->notifyPipe.maxPacketSize); if (req != NULL) { @@ -1093,6 +1097,10 @@ int32_t UsbFnDviceTestAllocRequest004(void) struct UsbFnRequest *req = NULL; UsbFnInterfaceHandle handle = NULL; + if (g_acmDevice == NULL) { + HDF_LOGE("%s: dataIface.handle is invail", __func__); + return HDF_FAILURE; + } req = UsbFnAllocRequest(handle, g_acmDevice->notifyPipe.id, 0x800); if (req != NULL) { HDF_LOGE("%s: alloc req success!!", __func__); @@ -1594,6 +1602,11 @@ int32_t UsbFnDviceTestStartReceEvent003(void) { int ret; struct UsbFnInterface *fn = NULL; + + if (g_acmDevice == NULL) { + HDF_LOGE("%s: dataIface.handle is invail", __func__); + return HDF_FAILURE; + } ret = UsbFnStartRecvInterfaceEvent(fn, 0xff, EventCallBack, g_acmDevice); if (HDF_SUCCESS == ret) { @@ -1818,6 +1831,10 @@ int32_t UsbFnDviceTestCloseInterface003(void) { int ret; + if (g_acmDevice == NULL) { + HDF_LOGE("%s: dataIface.handle is invail", __func__); + return HDF_FAILURE; + } ret = UsbFnCloseInterface(g_acmDevice->ctrlIface.handle); if (HDF_SUCCESS == ret) { HDF_LOGE("%s: close interface success!!", __func__); @@ -1831,6 +1848,10 @@ int32_t UsbFnDviceTestCloseInterface004(void) { int ret; + if (g_acmDevice == NULL) { + HDF_LOGE("%s: dataIface.handle is invail", __func__); + return HDF_FAILURE; + } ret = UsbFnCloseInterface(g_acmDevice->dataIface.handle); if (HDF_SUCCESS == ret) { HDF_LOGE("%s: close interface success!!", __func__); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c index b18304794..7efc23b48 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c @@ -154,7 +154,16 @@ int32_t UsbFnDviceTestRequestAsync004(void) req->context = g_acmDevice; g_acmDevice->submit = 0; dprintf("------send \"abc\" to host------\n"); - memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")); + if (g_acmDevice->dataInPipe.maxPacketSize < strlen("abc")) { + ret = UsbFnFreeRequest(req); + if (HDF_SUCCESS != ret) { + HDF_LOGE("%s: free Request error", __func__); + } + return HDF_FAILURE; + } + if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } req->length = strlen("abc"); ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { @@ -194,7 +203,9 @@ int32_t UsbFnDviceTestRequestAsync005(void) req->complete = WriteComplete; req->context = g_acmDevice; g_acmDevice->submit = 0; - memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "xyz", strlen("xyz")); + if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "xyz", strlen("xyz")) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } req->length = strlen("xyz"); ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { @@ -318,7 +329,9 @@ int32_t UsbFnDviceTestRequestSync004(void) return HDF_FAILURE; } dprintf("------send \"abc\" to host------\n"); - memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")); + if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } req->length = strlen("abc"); ret = UsbFnSubmitRequestSync(req, 0); if (HDF_SUCCESS != ret || (req->actual != strlen("abc")) || \ @@ -352,7 +365,9 @@ int32_t UsbFnDviceTestRequestSync005(void) HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } - memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abcdefg", strlen("abcdefg")); + if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abcdefg", strlen("abcdefg")) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } req->length = strlen("abcdefg"); ret = UsbFnSubmitRequestSync(req, 0); if (HDF_SUCCESS != ret || (req->actual != strlen("abcdefg")) || \ @@ -412,7 +427,6 @@ int32_t UsbFnDviceTestRequestSync007(void) static void TestCancelComplete(uint8_t pipe, struct UsbFnRequest *req) { - dprintf("%s, req->buf = 0x%x\n", __func__, (uint32_t)req->buf); g_acmDevice->havedSubmit = true; } @@ -546,7 +560,9 @@ int32_t UsbFnDviceTestCancelRequest005(void) req->complete = TestCancelComplete; req->context = g_acmDevice; dprintf("------send \"abc\" to host------\n"); - memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")); + if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); + } req->length = strlen("abc"); ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { diff --git a/test/unittest/model/usb/host/src/usb_raw_test.c b/test/unittest/model/usb/host/src/usb_raw_test.c index 1f6d00985..59cac2687 100755 --- a/test/unittest/model/usb/host/src/usb_raw_test.c +++ b/test/unittest/model/usb/host/src/usb_raw_test.c @@ -172,11 +172,11 @@ int32_t CheckRawSdkIfAllocRequest002(void) for (i = 0; i < ACM_NW; i++) { rawAcm->wb[i].request = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataOutEp.maxPacketSize); rawAcm->wb[i].instance = rawAcm; - ((struct UsbHostRequest *)(rawAcm->wb[i].request))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; if (rawAcm->wb[i].request == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } + ((struct UsbHostRequest *)(rawAcm->wb[i].request))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; } HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; @@ -205,11 +205,11 @@ int32_t CheckRawSdkIfAllocRequest004(void) for (i = 0; i < ACM_NR; i++) { rawAcm->readReq[i] = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->dataInEp.maxPacketSize); - ((struct UsbHostRequest *)(rawAcm->readReq[i]))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; if (rawAcm->readReq[i] == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } + ((struct UsbHostRequest *)(rawAcm->readReq[i]))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; } HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; @@ -231,11 +231,11 @@ int32_t CheckRawSdkIfAllocRequest006(void) { struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->ctrlReq = UsbRawAllocRequest(rawAcm->devHandle, 0, USB_CTRL_REQ_SIZE); - ((struct UsbHostRequest *)(rawAcm->ctrlReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; if (rawAcm->ctrlReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } + ((struct UsbHostRequest *)(rawAcm->ctrlReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } @@ -256,11 +256,11 @@ int32_t CheckRawSdkIfAllocRequest008(void) { struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->notifyReq = UsbRawAllocRequest(rawAcm->devHandle, 0, rawAcm->notifyEp.maxPacketSize); - ((struct UsbHostRequest *)(rawAcm->notifyReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; if (rawAcm->notifyReq == NULL) { HDF_LOGE("%s: error", __func__); return HDF_FAILURE; } + ((struct UsbHostRequest *)(rawAcm->notifyReq))->devHandle = (struct UsbDeviceHandle *)rawAcm->devHandle; HDF_LOGE("%s: success", __func__); return HDF_SUCCESS; } -- Gitee From f36c1e154e6ebd6bb170569a749bdc5ce09da926 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Tue, 28 Sep 2021 16:19:08 +0800 Subject: [PATCH 064/272] optimize hdf utils dirs Signed-off-by: yuanbo --- include/{config => utils}/device_resource_if.h | 0 {ability/sbuf/include => include/utils}/hdf_sbuf.h | 0 test/unittest/common/hdf_main_test.c | 2 +- .../config => utils}/hcs_parser/unittest/hcs_config_test.c | 0 .../config => utils}/hcs_parser/unittest/hcs_config_test.h | 0 .../hcs_parser/unittest/hcs_parser_test.c} | 2 +- .../hcs_parser/unittest/hcs_parser_test.h} | 6 +++--- {ability/config/hcs_parser => utils}/include/hcs_blob_if.h | 0 {ability/config/hcs_parser => utils}/include/hcs_parser.h | 0 {ability/config/hcs_parser => utils}/include/hcs_tree_if.h | 0 {ability/sbuf => utils}/include/hdf_sbuf_impl.h | 0 .../config => utils/src/hcs_parser}/device_resource_if.c | 0 .../hcs_parser/src => utils/src/hcs_parser}/hcs_blob_if.c | 0 .../src => utils/src/hcs_parser}/hcs_generate_tree.c | 0 .../include => utils/src/hcs_parser}/hcs_generate_tree.h | 0 .../hcs_parser/src => utils/src/hcs_parser}/hcs_parser.c | 0 .../hcs_parser/src => utils/src/hcs_parser}/hcs_tree_if.c | 0 .../hcs_parser}/test/unittest/common/hdf_config_test.cpp | 0 {ability/sbuf => utils}/src/hdf_sbuf.c | 0 {ability/sbuf => utils}/src/hdf_sbuf_impl_raw.c | 0 20 files changed, 5 insertions(+), 5 deletions(-) rename include/{config => utils}/device_resource_if.h (100%) rename {ability/sbuf/include => include/utils}/hdf_sbuf.h (100%) rename test/unittest/{ability/config => utils}/hcs_parser/unittest/hcs_config_test.c (100%) rename test/unittest/{ability/config => utils}/hcs_parser/unittest/hcs_config_test.h (100%) rename test/unittest/{config/hdf_config_test.c => utils/hcs_parser/unittest/hcs_parser_test.c} (99%) rename test/unittest/{config/hdf_config_test.h => utils/hcs_parser/unittest/hcs_parser_test.h} (95%) rename {ability/config/hcs_parser => utils}/include/hcs_blob_if.h (100%) rename {ability/config/hcs_parser => utils}/include/hcs_parser.h (100%) rename {ability/config/hcs_parser => utils}/include/hcs_tree_if.h (100%) rename {ability/sbuf => utils}/include/hdf_sbuf_impl.h (100%) rename {ability/config => utils/src/hcs_parser}/device_resource_if.c (100%) rename {ability/config/hcs_parser/src => utils/src/hcs_parser}/hcs_blob_if.c (100%) rename {ability/config/hcs_parser/src => utils/src/hcs_parser}/hcs_generate_tree.c (100%) rename {ability/config/hcs_parser/include => utils/src/hcs_parser}/hcs_generate_tree.h (100%) rename {ability/config/hcs_parser/src => utils/src/hcs_parser}/hcs_parser.c (100%) rename {ability/config/hcs_parser/src => utils/src/hcs_parser}/hcs_tree_if.c (100%) rename {ability/config => utils/src/hcs_parser}/test/unittest/common/hdf_config_test.cpp (100%) rename {ability/sbuf => utils}/src/hdf_sbuf.c (100%) rename {ability/sbuf => utils}/src/hdf_sbuf_impl_raw.c (100%) diff --git a/include/config/device_resource_if.h b/include/utils/device_resource_if.h similarity index 100% rename from include/config/device_resource_if.h rename to include/utils/device_resource_if.h diff --git a/ability/sbuf/include/hdf_sbuf.h b/include/utils/hdf_sbuf.h similarity index 100% rename from ability/sbuf/include/hdf_sbuf.h rename to include/utils/hdf_sbuf.h diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index d7931a49e..c803bd8c1 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -8,7 +8,7 @@ #include "hdf_log.h" #include "hdf_base.h" -#include "hdf_config_test.h" +#include "hcs_parser_test.h" #include "hdf_device_desc.h" #include "hdf_main_test.h" #include "osal_test_entry.h" diff --git a/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_config_test.c similarity index 100% rename from test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.c rename to test/unittest/utils/hcs_parser/unittest/hcs_config_test.c diff --git a/test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.h b/test/unittest/utils/hcs_parser/unittest/hcs_config_test.h similarity index 100% rename from test/unittest/ability/config/hcs_parser/unittest/hcs_config_test.h rename to test/unittest/utils/hcs_parser/unittest/hcs_config_test.h diff --git a/test/unittest/config/hdf_config_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c similarity index 99% rename from test/unittest/config/hdf_config_test.c rename to test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c index 7cf001db6..c41032459 100644 --- a/test/unittest/config/hdf_config_test.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c @@ -6,7 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_config_test.h" +#include "hcs_parser_test.h" #include "device_resource_if.h" #include "hcs_config_test.h" #include "hdf_base.h" diff --git a/test/unittest/config/hdf_config_test.h b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h similarity index 95% rename from test/unittest/config/hdf_config_test.h rename to test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h index 8c7193001..da78c08b8 100644 --- a/test/unittest/config/hdf_config_test.h +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#ifndef HDF_CONFIG_TEST_H -#define HDF_CONFIG_TEST_H +#ifndef HCS_PARSER_TEST_H +#define HCS_PARSER_TEST_H #include "hdf_main_test.h" @@ -57,4 +57,4 @@ enum HdfConfigTestCaseCmd { int32_t HdfConfigEntry(HdfTestMsg *msg); -#endif // HDF_CONFIG_TEST_H +#endif // HCS_PARSER_TEST_H diff --git a/ability/config/hcs_parser/include/hcs_blob_if.h b/utils/include/hcs_blob_if.h similarity index 100% rename from ability/config/hcs_parser/include/hcs_blob_if.h rename to utils/include/hcs_blob_if.h diff --git a/ability/config/hcs_parser/include/hcs_parser.h b/utils/include/hcs_parser.h similarity index 100% rename from ability/config/hcs_parser/include/hcs_parser.h rename to utils/include/hcs_parser.h diff --git a/ability/config/hcs_parser/include/hcs_tree_if.h b/utils/include/hcs_tree_if.h similarity index 100% rename from ability/config/hcs_parser/include/hcs_tree_if.h rename to utils/include/hcs_tree_if.h diff --git a/ability/sbuf/include/hdf_sbuf_impl.h b/utils/include/hdf_sbuf_impl.h similarity index 100% rename from ability/sbuf/include/hdf_sbuf_impl.h rename to utils/include/hdf_sbuf_impl.h diff --git a/ability/config/device_resource_if.c b/utils/src/hcs_parser/device_resource_if.c similarity index 100% rename from ability/config/device_resource_if.c rename to utils/src/hcs_parser/device_resource_if.c diff --git a/ability/config/hcs_parser/src/hcs_blob_if.c b/utils/src/hcs_parser/hcs_blob_if.c similarity index 100% rename from ability/config/hcs_parser/src/hcs_blob_if.c rename to utils/src/hcs_parser/hcs_blob_if.c diff --git a/ability/config/hcs_parser/src/hcs_generate_tree.c b/utils/src/hcs_parser/hcs_generate_tree.c similarity index 100% rename from ability/config/hcs_parser/src/hcs_generate_tree.c rename to utils/src/hcs_parser/hcs_generate_tree.c diff --git a/ability/config/hcs_parser/include/hcs_generate_tree.h b/utils/src/hcs_parser/hcs_generate_tree.h similarity index 100% rename from ability/config/hcs_parser/include/hcs_generate_tree.h rename to utils/src/hcs_parser/hcs_generate_tree.h diff --git a/ability/config/hcs_parser/src/hcs_parser.c b/utils/src/hcs_parser/hcs_parser.c similarity index 100% rename from ability/config/hcs_parser/src/hcs_parser.c rename to utils/src/hcs_parser/hcs_parser.c diff --git a/ability/config/hcs_parser/src/hcs_tree_if.c b/utils/src/hcs_parser/hcs_tree_if.c similarity index 100% rename from ability/config/hcs_parser/src/hcs_tree_if.c rename to utils/src/hcs_parser/hcs_tree_if.c diff --git a/ability/config/test/unittest/common/hdf_config_test.cpp b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp similarity index 100% rename from ability/config/test/unittest/common/hdf_config_test.cpp rename to utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp diff --git a/ability/sbuf/src/hdf_sbuf.c b/utils/src/hdf_sbuf.c similarity index 100% rename from ability/sbuf/src/hdf_sbuf.c rename to utils/src/hdf_sbuf.c diff --git a/ability/sbuf/src/hdf_sbuf_impl_raw.c b/utils/src/hdf_sbuf_impl_raw.c similarity index 100% rename from ability/sbuf/src/hdf_sbuf_impl_raw.c rename to utils/src/hdf_sbuf_impl_raw.c -- Gitee From 2cc6260efae2a37cf650932d232438eb5a291e47 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 28 Sep 2021 14:29:10 +0800 Subject: [PATCH 065/272] solve the warings of C90 Signed-off-by: YOUR_NAME --- .../config/hcs_parser/src/hcs_generate_tree.c | 16 +++--- ability/config/hcs_parser/src/hcs_parser.c | 9 ++-- ability/sbuf/src/hdf_sbuf_impl_raw.c | 50 ++++++++++++------- core/adapter/vnode/src/hdf_vnode_adapter.c | 3 +- core/common/src/devmgr_service_start.c | 14 +++--- core/common/src/hdf_attribute.c | 24 ++++++--- core/common/src/hdf_device_node_ext.c | 7 +-- core/common/src/load_driver_entry.c | 10 ++-- core/host/src/devhost_service.c | 7 +-- core/host/src/devsvc_manager_clnt.c | 18 ++++--- core/host/src/hdf_device_node.c | 20 +++++--- core/host/src/hdf_device_object.c | 33 ++++++++---- core/host/src/hdf_observer_record.c | 3 +- core/host/src/power_state_token.c | 9 ++-- core/manager/src/devmgr_service.c | 13 +++-- core/manager/src/devsvc_manager.c | 15 ++++-- core/manager/src/hdf_driver_installer.c | 3 +- utils/src/hdf_cstring.c | 3 +- utils/src/hdf_map.c | 26 +++++++--- utils/src/hdf_slist.c | 4 +- 20 files changed, 185 insertions(+), 102 deletions(-) diff --git a/ability/config/hcs_parser/src/hcs_generate_tree.c b/ability/config/hcs_parser/src/hcs_generate_tree.c index c3306ed64..672c29db5 100644 --- a/ability/config/hcs_parser/src/hcs_generate_tree.c +++ b/ability/config/hcs_parser/src/hcs_generate_tree.c @@ -31,12 +31,13 @@ static struct DeviceResourceNode *CreateTreeNode(const char *start, int32_t offs struct DeviceResourceNode *parentNode, char **treeMem) { struct DeviceResourceNode *newNode = (struct DeviceResourceNode *)(*treeMem); + struct DeviceResourceNode *curNode = NULL; *treeMem += sizeof(struct DeviceResourceNode); newNode->name = start + offset + HCS_PREFIX_LENGTH; newNode->hashValue = offset + sizeof(struct HbcHeader); if (parentNode != NULL) { newNode->parent = parentNode; - struct DeviceResourceNode *curNode = parentNode->child; + curNode = parentNode->child; while ((curNode != NULL) && (curNode->sibling != NULL)) { curNode = curNode->sibling; } @@ -64,15 +65,17 @@ static bool UpdateTreeStack(struct TreeStack **treeStack, int32_t *treeLayer, st static bool AddAttrInNode(const char *start, struct DeviceResourceNode *parentNode, char **treeMem) { + struct DeviceResourceAttr *newAttr = NULL; + struct DeviceResourceAttr *curAttr = NULL; if (parentNode == NULL) { HDF_LOGE("%s failed, the parentNode is NULL", __func__); return false; } - struct DeviceResourceAttr *newAttr = (struct DeviceResourceAttr *)(*treeMem); + newAttr = (struct DeviceResourceAttr *)(*treeMem); *treeMem += sizeof(struct DeviceResourceAttr); newAttr->name = start + HCS_PREFIX_LENGTH; newAttr->value = start + HCS_PREFIX_LENGTH + HCS_STRING_LENGTH(newAttr->name); - struct DeviceResourceAttr *curAttr = parentNode->attrData; + curAttr = parentNode->attrData; parentNode->attrData = newAttr; newAttr->next = curAttr; return true; @@ -82,12 +85,14 @@ static int32_t ParseByteCode(const char *treeStart, int32_t offset, char **treeM struct TreeStack **treeStack, int32_t *treeLayerOrMemLen) { int32_t termOffset = HcsGetNodeOrAttrLength(treeStart + offset); + struct DeviceResourceNode *parentOrCurNode = NULL; + struct DeviceResourceNode *newNode = NULL; + uint32_t newNodeOffset; if (termOffset <= 0) { HDF_LOGE("%s failed, HcsGetNodeOrAttrLength error, errno: %d", __func__, termOffset); return HDF_FAILURE; } - struct DeviceResourceNode *parentOrCurNode = NULL; switch (HcsGetPrefix(treeStart + offset)) { case CONFIG_NODE: if (*treeMem == NULL) { @@ -95,8 +100,7 @@ static int32_t ParseByteCode(const char *treeStart, int32_t offset, char **treeM break; } parentOrCurNode = GetParentNode(offset, *treeStack, treeLayerOrMemLen, termOffset); - struct DeviceResourceNode *newNode = CreateTreeNode(treeStart, offset, parentOrCurNode, treeMem); - uint32_t newNodeOffset; + newNode = CreateTreeNode(treeStart, offset, parentOrCurNode, treeMem); (void)HcsSwapToUint32(&newNodeOffset, treeStart + offset + HCS_STRING_LENGTH(newNode->name) + HCS_PREFIX_LENGTH, CONFIG_DWORD); newNodeOffset += offset + termOffset; diff --git a/ability/config/hcs_parser/src/hcs_parser.c b/ability/config/hcs_parser/src/hcs_parser.c index 29596bd54..b12380ff7 100644 --- a/ability/config/hcs_parser/src/hcs_parser.c +++ b/ability/config/hcs_parser/src/hcs_parser.c @@ -22,23 +22,26 @@ static int32_t GetHcsTreeSize(const char *blob, int32_t nodeLength) bool HcsDecompile(const char *hcsBlob, uint32_t offset, struct DeviceResourceNode **root) { int32_t nodeLength = HcsGetNodeLength(hcsBlob + offset); + int32_t treeMemLength; + char *treeMem = NULL; + int32_t treeLayer; if (nodeLength < 0) { HDF_LOGE("%s failed, HcsGetNodeLength error", __func__); return false; } - int32_t treeMemLength = GetHcsTreeSize(hcsBlob + offset, nodeLength); + treeMemLength = GetHcsTreeSize(hcsBlob + offset, nodeLength); if (treeMemLength <= 0) { HDF_LOGE("%s failed, GetHcsTreeSize error, treeMemLength = %d", __func__, treeMemLength); return false; } - char *treeMem = (char *)OsalMemCalloc(treeMemLength); + treeMem = (char *)OsalMemCalloc(treeMemLength); if (treeMem == NULL) { HDF_LOGE("%s failed, OsalMemCalloc error", __func__); return false; } - int32_t treeLayer = GenerateCfgTree(hcsBlob + offset, nodeLength, treeMem, root); + treeLayer = GenerateCfgTree(hcsBlob + offset, nodeLength, treeMem, root); if (treeLayer <= 0) { HDF_LOGE("%s failed, the treeLayer is %d", __func__, treeLayer); OsalMemFree(treeMem); diff --git a/ability/sbuf/src/hdf_sbuf_impl_raw.c b/ability/sbuf/src/hdf_sbuf_impl_raw.c index 051eacb46..24423d112 100644 --- a/ability/sbuf/src/hdf_sbuf_impl_raw.c +++ b/ability/sbuf/src/hdf_sbuf_impl_raw.c @@ -67,11 +67,12 @@ static size_t SbufRawImplGetLeftReadSize(struct HdfSBufRaw *sbuf) static bool SbufRawImplWriteRollback(struct HdfSbufImpl *impl, uint32_t size) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + size_t alignSize; if (sbuf == NULL) { return false; } - size_t alignSize = SbufRawImplGetAlignSize(size); + alignSize = SbufRawImplGetAlignSize(size); if (sbuf->writePos < alignSize) { return false; } @@ -83,11 +84,12 @@ static bool SbufRawImplWriteRollback(struct HdfSbufImpl *impl, uint32_t size) static bool SbufRawImplReadRollback(struct HdfSbufImpl *impl, uint32_t size) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + size_t alignSize; if (sbuf == NULL) { return false; } - size_t alignSize = SbufRawImplGetAlignSize(size); + alignSize = SbufRawImplGetAlignSize(size); if (sbuf->readPos < alignSize) { return false; } @@ -141,12 +143,14 @@ static size_t SbufRawImplGetDataSize(const struct HdfSbufImpl *impl) static bool SbufRawImplGrow(struct HdfSBufRaw *sbuf, uint32_t growSize) { + uint32_t newSize; + uint8_t *newData = NULL; if (sbuf->isBind) { HDF_LOGE("%s: binded sbuf oom", __func__); return false; } - uint32_t newSize = SbufRawImplGetAlignSize(sbuf->capacity + growSize); + newSize = SbufRawImplGetAlignSize(sbuf->capacity + growSize); if (newSize < sbuf->capacity) { HDF_LOGE("%s: grow size overflow", __func__); return false; @@ -156,7 +160,7 @@ static bool SbufRawImplGrow(struct HdfSBufRaw *sbuf, uint32_t growSize) return false; } - uint8_t *newData = OsalMemCalloc(newSize); + newData = OsalMemCalloc(newSize); if (newData == NULL) { HDF_LOGE("%s: oom", __func__); return false; @@ -179,6 +183,10 @@ static bool SbufRawImplGrow(struct HdfSBufRaw *sbuf, uint32_t growSize) static bool SbufRawImplWrite(struct HdfSbufImpl *impl, const uint8_t *data, uint32_t size) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + size_t alignSize; + size_t writeableSize; + uint8_t *dest = NULL; + if (sbuf == NULL || sbuf->data == NULL || data == NULL) { return false; } @@ -187,13 +195,13 @@ static bool SbufRawImplWrite(struct HdfSbufImpl *impl, const uint8_t *data, uint return true; } - size_t alignSize = SbufRawImplGetAlignSize(size); + alignSize = SbufRawImplGetAlignSize(size); // in case of desireCapacity overflow if (alignSize < size) { HDF_LOGE("desireCapacity overflow"); return false; } - size_t writeableSize = SbufRawImplGetLeftWriteSize(sbuf); + writeableSize = SbufRawImplGetLeftWriteSize(sbuf); if (alignSize > writeableSize) { size_t growSize = (alignSize > HDF_SBUF_GROW_SIZE_DEFAULT) ? (alignSize + HDF_SBUF_GROW_SIZE_DEFAULT) : HDF_SBUF_GROW_SIZE_DEFAULT; @@ -203,7 +211,7 @@ static bool SbufRawImplWrite(struct HdfSbufImpl *impl, const uint8_t *data, uint writeableSize = SbufRawImplGetLeftWriteSize(sbuf); } - uint8_t *dest = sbuf->data + sbuf->writePos; + dest = sbuf->data + sbuf->writePos; if (memcpy_s(dest, writeableSize, data, size) != EOK) { return false; /* never hits */ } @@ -215,6 +223,7 @@ static bool SbufRawImplWrite(struct HdfSbufImpl *impl, const uint8_t *data, uint static bool SbufRawImplRead(struct HdfSbufImpl *impl, uint8_t *data, uint32_t readSize) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + size_t alignSize; if (sbuf == NULL || sbuf->data == NULL || data == NULL) { return false; } @@ -223,7 +232,7 @@ static bool SbufRawImplRead(struct HdfSbufImpl *impl, uint8_t *data, uint32_t re return true; } - size_t alignSize = SbufRawImplGetAlignSize(readSize); + alignSize = SbufRawImplGetAlignSize(readSize); if (alignSize > SbufRawImplGetLeftReadSize(sbuf)) { HDF_LOGE("Read out of buffer range"); return false; @@ -350,12 +359,13 @@ static bool SbufRawImplReadInt8(struct HdfSbufImpl *impl, int8_t *value) static bool SbufRawImplReadBuffer(struct HdfSbufImpl *impl, const uint8_t **data, uint32_t *readSize) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + int buffSize = 0; + size_t alignSize; if (sbuf == NULL || sbuf->data == NULL || data == NULL || readSize == NULL) { HDF_LOGE("%s: input invalid", __func__); return false; } - int buffSize = 0; if (!SbufRawImplReadInt32(impl, &buffSize)) { return false; } @@ -365,7 +375,7 @@ static bool SbufRawImplReadBuffer(struct HdfSbufImpl *impl, const uint8_t **data *readSize = 0; return true; } - size_t alignSize = SbufRawImplGetAlignSize(buffSize); + alignSize = SbufRawImplGetAlignSize(buffSize); if (alignSize > SbufRawImplGetLeftReadSize(sbuf)) { HDF_LOGE("%s:readBuff out of range", __func__); (void)SbufRawImplReadRollback(impl, sizeof(int32_t)); @@ -381,22 +391,24 @@ static bool SbufRawImplReadBuffer(struct HdfSbufImpl *impl, const uint8_t **data static const char *SbufRawImplReadString(struct HdfSbufImpl *impl) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + int32_t strLen = 0; + size_t alignSize; + char *str = NULL; if (sbuf == NULL || sbuf->data == NULL) { HDF_LOGE("%s: input null", __func__); return NULL; } /* This length contains the '\0' at the end of the string. */ - int32_t strLen = 0; if (!SbufRawImplReadInt32(impl, &strLen) || strLen <= 0) { return NULL; } - size_t alignSize = SbufRawImplGetAlignSize(strLen); + alignSize = SbufRawImplGetAlignSize(strLen); if (strLen > INT16_MAX || alignSize > SbufRawImplGetLeftReadSize(sbuf)) { (void)SbufRawImplReadRollback(impl, sizeof(int32_t)); return NULL; } - char *str = (char *)(sbuf->data + sbuf->readPos); + str = (char *)(sbuf->data + sbuf->readPos); sbuf->readPos += alignSize; /* Set '\0' at end of the string forcibly. */ str[strLen - 1] = '\0'; @@ -406,11 +418,12 @@ static const char *SbufRawImplReadString(struct HdfSbufImpl *impl) static struct HdfSbufImpl *SbufRawImplCopy(const struct HdfSbufImpl *impl) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + struct HdfSBufRaw *new = NULL; if (sbuf == NULL || sbuf->data == NULL) { return NULL; } - struct HdfSBufRaw *new = SbufRawImplNewInstance(sbuf->capacity); + new = SbufRawImplNewInstance(sbuf->capacity); if (new == NULL) { return NULL; } @@ -428,11 +441,12 @@ static struct HdfSbufImpl *SbufRawImplCopy(const struct HdfSbufImpl *impl) static struct HdfSbufImpl *SbufRawImplMove(struct HdfSbufImpl *impl) { struct HdfSBufRaw *sbuf = SBUF_RAW_CAST(impl); + struct HdfSBufRaw *new = NULL; if (sbuf == NULL || sbuf->isBind) { return NULL; } - struct HdfSBufRaw *new = OsalMemCalloc(sizeof(struct HdfSBufRaw)); + new = OsalMemCalloc(sizeof(struct HdfSBufRaw)); if (new == NULL) { return NULL; } @@ -494,11 +508,12 @@ static void SbufInterfaceAssign(struct HdfSbufImpl *inf) static struct HdfSBufRaw *SbufRawImplNewInstance(size_t capacity) { + struct HdfSBufRaw *sbuf = NULL; if (capacity > HDF_SBUF_MAX_SIZE) { HDF_LOGE("%s: Sbuf size exceeding max limit", __func__); return NULL; } - struct HdfSBufRaw *sbuf = (struct HdfSBufRaw *)OsalMemCalloc(sizeof(struct HdfSBufRaw)); + sbuf = (struct HdfSBufRaw *)OsalMemCalloc(sizeof(struct HdfSBufRaw)); if (sbuf == NULL) { HDF_LOGE("Sbuf instance failure"); return NULL; @@ -529,6 +544,7 @@ struct HdfSbufImpl *SbufObtainRaw(size_t capacity) struct HdfSbufImpl *SbufBindRaw(uintptr_t base, size_t size) { + struct HdfSBufRaw *sbuf = NULL; if (base == 0 || size == 0) { return NULL; } @@ -537,7 +553,7 @@ struct HdfSbufImpl *SbufBindRaw(uintptr_t base, size_t size) HDF_LOGE("Base not in 4-byte alignment"); return NULL; } - struct HdfSBufRaw *sbuf = (struct HdfSBufRaw *)OsalMemAlloc(sizeof(struct HdfSBufRaw)); + sbuf = (struct HdfSBufRaw *)OsalMemAlloc(sizeof(struct HdfSBufRaw)); if (sbuf == NULL) { HDF_LOGE("%s: oom", __func__); return NULL; diff --git a/core/adapter/vnode/src/hdf_vnode_adapter.c b/core/adapter/vnode/src/hdf_vnode_adapter.c index dab5a350e..340054fb3 100644 --- a/core/adapter/vnode/src/hdf_vnode_adapter.c +++ b/core/adapter/vnode/src/hdf_vnode_adapter.c @@ -545,8 +545,9 @@ static unsigned int HdfVNodeAdapterPoll(struct file *filep, poll_table *wait) static int HdfVNodeAdapterClose(struct OsalCdev *cdev, struct file *filep) { + struct HdfVNodeAdapterClient *client = NULL; (void)cdev; - struct HdfVNodeAdapterClient *client = (struct HdfVNodeAdapterClient *)OsalGetFilePriv(filep); + client = (struct HdfVNodeAdapterClient *)OsalGetFilePriv(filep); if (client->ioServiceClient.device != NULL && client->ioServiceClient.device->service != NULL && client->ioServiceClient.device->service->Release != NULL) { client->ioServiceClient.device->service->Release(&client->ioServiceClient); diff --git a/core/common/src/devmgr_service_start.c b/core/common/src/devmgr_service_start.c index a7d27eb9c..a1ceba2ee 100644 --- a/core/common/src/devmgr_service_start.c +++ b/core/common/src/devmgr_service_start.c @@ -53,6 +53,10 @@ int DeviceManagerDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data int32_t deviceClass = 0; const char *svcName = NULL; struct DevmgrService *devMgrSvc = (struct DevmgrService *)stub; + static struct SubscriberCallback callback = { + .deviceObject = NULL, + .OnServiceConnected = NULL, + }; if (data == NULL || devMgrSvc == NULL) { HDF_LOGE("%s: input param is invalid", __func__); return ret; @@ -65,10 +69,6 @@ int DeviceManagerDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data HDF_LOGE("%s: get svc name is null", __func__); break; } - static struct SubscriberCallback callback = { - .deviceObject = NULL, - .OnServiceConnected = NULL, - }; ret = DevSvcManagerClntSubscribeService(svcName, callback); break; case DEVMGR_UNLOAD_SERVICE: @@ -107,13 +107,14 @@ int DeviceManagerIsQuickLoad(void) int DeviceManagerStart(void) { + struct HdfIoService *ioService = NULL; struct IDevmgrService *instance = DevmgrServiceGetInstance(); if (instance == NULL || instance->StartService == NULL) { HDF_LOGE("device manager start failed, service instance is null"); return HDF_FAILURE; } - struct HdfIoService *ioService = HdfIoServicePublish(DEV_MGR_NODE, DEV_MGR_NODE_PERM); + ioService = HdfIoServicePublish(DEV_MGR_NODE, DEV_MGR_NODE_PERM); if (ioService != NULL) { static struct HdfIoDispatcher dispatcher = { .Dispatch = DeviceManagerDispatch, @@ -126,11 +127,12 @@ int DeviceManagerStart(void) int DeviceManagerStartStep2() { + struct DevmgrService *devMgrSvc = NULL; if (DeviceManagerIsQuickLoad() == DEV_MGR_SLOW_LOAD) { HDF_LOGW("%s: device manager is not set to QuickLoad mode", __func__); return HDF_SUCCESS; } - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); + devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); return DevmgrServiceLoadLeftDriver(devMgrSvc); } diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index af6022584..b6af3fe7c 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -66,11 +66,13 @@ const struct DeviceResourceNode *HdfGetRootNode(void) static bool HdfHostListCompare(struct HdfSListNode *listEntryFirst, struct HdfSListNode *listEntrySecond) { + struct HdfHostInfo *attrFirst = NULL; + struct HdfHostInfo *attrSecond = NULL; if (listEntryFirst == NULL || listEntrySecond == NULL) { return false; } - struct HdfHostInfo *attrFirst = (struct HdfHostInfo *)listEntryFirst; - struct HdfHostInfo *attrSecond = (struct HdfHostInfo *)listEntrySecond; + attrFirst = (struct HdfHostInfo *)listEntryFirst; + attrSecond = (struct HdfHostInfo *)listEntrySecond; return attrFirst->priority <= attrSecond->priority; } @@ -138,11 +140,13 @@ bool HdfAttributeManagerGetHostList(struct HdfSList *hostList) static bool HdfDeviceListCompare(struct HdfSListNode *listEntryFirst, struct HdfSListNode *listEntrySecond) { + struct HdfDeviceInfo *attrFirst = NULL; + struct HdfDeviceInfo *attrSecond = NULL; if (listEntryFirst == NULL || listEntrySecond == NULL) { return false; } - struct HdfDeviceInfo *attrFirst = (struct HdfDeviceInfo *)listEntryFirst; - struct HdfDeviceInfo *attrSecond = (struct HdfDeviceInfo *)listEntrySecond; + attrFirst = (struct HdfDeviceInfo *)listEntryFirst; + attrSecond = (struct HdfDeviceInfo *)listEntrySecond; return attrFirst->priority <= attrSecond->priority; } @@ -244,14 +248,16 @@ struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *h { uint16_t deviceIdx = 0; const struct DeviceResourceNode *hostNode = GetHostNode(hostName); + struct HdfSList *deviceList = NULL; + const struct DeviceResourceNode *device = NULL; if (hostNode == NULL) { return NULL; } - struct HdfSList *deviceList = (struct HdfSList *)OsalMemCalloc(sizeof(struct HdfSList)); + deviceList = (struct HdfSList *)OsalMemCalloc(sizeof(struct HdfSList)); if (deviceList == NULL) { return NULL; } - const struct DeviceResourceNode *device = hostNode->child; + device = hostNode->child; while (device != NULL) { const struct DeviceResourceNode *deviceNode = device->child; while (deviceNode != NULL) { @@ -294,11 +300,13 @@ bool HdfDeviceListAdd(const char *moduleName, const char *serviceName, const voi struct HdfDeviceInfo *deviceInfo = NULL; struct DevHostServiceClnt *hostClnt = NULL; struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); + struct HdfDeviceInfo *deviceNodeInfo = NULL; + char *svcName = NULL; if (devMgrSvc == NULL || moduleName == NULL || serviceName == NULL) { return false; } - struct HdfDeviceInfo *deviceNodeInfo = HdfDeviceInfoNewInstance(); + deviceNodeInfo = HdfDeviceInfoNewInstance(); if (deviceNodeInfo == NULL) { return false; } @@ -319,7 +327,7 @@ bool HdfDeviceListAdd(const char *moduleName, const char *serviceName, const voi deviceNodeInfo->permission = deviceInfo->permission; deviceNodeInfo->deviceMatchAttr = deviceInfo->deviceMatchAttr; deviceNodeInfo->moduleName = deviceInfo->moduleName; - char *svcName = OsalMemCalloc(strlen(serviceName) + 1); + svcName = OsalMemCalloc(strlen(serviceName) + 1); if (svcName == NULL) { break; } diff --git a/core/common/src/hdf_device_node_ext.c b/core/common/src/hdf_device_node_ext.c index a8143a441..c0eab0d70 100644 --- a/core/common/src/hdf_device_node_ext.c +++ b/core/common/src/hdf_device_node_ext.c @@ -22,12 +22,12 @@ static int DeviceNodeExtDispatch(struct HdfObject *stub, int code, struct HdfSBu struct IDeviceIoService *deviceMethod = NULL; const struct HdfDeviceInfo *deviceInfo = NULL; struct HdfDeviceNode *devNode = NULL; + uint64_t ioClientPtr = 0; if (stub == NULL) { HDF_LOGE("device ext dispatch: stub is null"); return HDF_FAILURE; } - uint64_t ioClientPtr = 0; if (!HdfSbufReadUint64(reply, &ioClientPtr) || ioClientPtr == 0) { HDF_LOGE("device ext dispatch: input ioClient is null"); return HDF_FAILURE; @@ -59,10 +59,11 @@ static int DeviceNodeExtPublishService(struct HdfDeviceNode *inst, const char *s const struct HdfDeviceInfo *deviceInfo = NULL; struct HdfDeviceObject *deviceObject = NULL; struct DeviceNodeExt *devNodeExt = (struct DeviceNodeExt *)inst; + int ret; if (devNodeExt == NULL) { return HDF_FAILURE; } - int ret = HdfDeviceNodePublishPublicService(inst, serviceName); + ret = HdfDeviceNodePublishPublicService(inst, serviceName); if (ret != HDF_SUCCESS) { HDF_LOGE("failed to publish device service, ret is %d", ret); return HDF_FAILURE; @@ -77,10 +78,10 @@ static int DeviceNodeExtPublishService(struct HdfDeviceNode *inst, const char *s if (deviceInfo->policy == SERVICE_POLICY_CAPACITY) { devNodeExt->ioService = HdfIoServicePublish(serviceName, deviceInfo->permission); if (devNodeExt->ioService != NULL) { - devNodeExt->ioService->target = (struct HdfObject*)(&inst->deviceObject); static struct HdfIoDispatcher dispatcher = { .Dispatch = DeviceNodeExtDispatch }; + devNodeExt->ioService->target = (struct HdfObject*)(&inst->deviceObject); devNodeExt->ioService->dispatcher = &dispatcher; } else { HDF_LOGE("Device remote service bind failed"); diff --git a/core/common/src/load_driver_entry.c b/core/common/src/load_driver_entry.c index 9a42ecbdc..165a7840f 100644 --- a/core/common/src/load_driver_entry.c +++ b/core/common/src/load_driver_entry.c @@ -13,18 +13,20 @@ static struct HdfDriverEntry *HdfDriverEntryConstruct(int32_t *driverCount) { int i; + struct HdfDriverEntry *driverEntry = NULL; + size_t *addrBegin = NULL; *driverCount = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); if (*driverCount <= 0) { HDF_LOGE("%s: failed to hdf get device counts", __func__); return NULL; } - struct HdfDriverEntry *driverEntry = OsalMemCalloc(*driverCount * sizeof(struct HdfDriverEntry)); + driverEntry = OsalMemCalloc(*driverCount * sizeof(struct HdfDriverEntry)); if (driverEntry == NULL) { HDF_LOGE("%s: failed to alloc driver entry mem", __func__); *driverCount = 0; return NULL; } - size_t *addrBegin = (size_t *)(HDF_DRIVER_BEGIN()); + addrBegin = (size_t *)(HDF_DRIVER_BEGIN()); for (i = 0; i < *driverCount; i++) { driverEntry[i] = *(struct HdfDriverEntry *)(*addrBegin); addrBegin++; @@ -35,12 +37,12 @@ static struct HdfDriverEntry *HdfDriverEntryConstruct(int32_t *driverCount) struct HdfDriverEntry *HdfDriverLoaderGetDriverEntry(const struct HdfDeviceInfo *deviceInfo) { int i; + static struct HdfDriverEntry *driverEntry = NULL; + static int32_t driverCount = 0; if ((deviceInfo == NULL) || (deviceInfo->moduleName == NULL) || (deviceInfo->svcName == NULL)) { HDF_LOGE("%s: failed to get device entry, input deviceInfo is NULL", __func__); return NULL; } - static struct HdfDriverEntry *driverEntry = NULL; - static int32_t driverCount = 0; if (driverEntry == NULL) { driverEntry = HdfDriverEntryConstruct(&driverCount); if (driverEntry == NULL) { diff --git a/core/host/src/devhost_service.c b/core/host/src/devhost_service.c index bd0c84135..984f6e6c2 100644 --- a/core/host/src/devhost_service.c +++ b/core/host/src/devhost_service.c @@ -114,6 +114,7 @@ int DevHostServiceDelDevice(struct IDevHostService *inst, const struct HdfDevice struct HdfDevice *device = NULL; struct DevHostService *hostService = (struct DevHostService *)inst; struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); + struct HdfDeviceNode *devNode = NULL; if ((deviceInfo == NULL) || (driverLoader == NULL) || (driverLoader->UnLoadNode == NULL)) { HDF_LOGE("failed to del device, input param is null"); @@ -127,7 +128,7 @@ int DevHostServiceDelDevice(struct IDevHostService *inst, const struct HdfDevice } driverLoader->UnLoadNode(driverLoader, deviceInfo); - struct HdfDeviceNode *devNode = DevHostServiceSeparateDeviceNode(&device->devNodes, deviceInfo); + devNode = DevHostServiceSeparateDeviceNode(&device->devNodes, deviceInfo); if (device->super.Detach != NULL) { device->super.Detach(&device->super, devNode); } else { @@ -223,12 +224,12 @@ void DevHostServiceConstruct(struct DevHostService *service) void DevHostServiceDestruct(struct DevHostService *service) { + struct HdfDevice *device = NULL; + struct HdfDevice *tmp = NULL; if (service == NULL) { return; } - struct HdfDevice *device = NULL; - struct HdfDevice *tmp = NULL; DLIST_FOR_EACH_ENTRY_SAFE(device, tmp, &service->devices, struct HdfDevice, node) { HdfDeviceFreeInstance(device); } diff --git a/core/host/src/devsvc_manager_clnt.c b/core/host/src/devsvc_manager_clnt.c index 479839b94..3cce4a59c 100644 --- a/core/host/src/devsvc_manager_clnt.c +++ b/core/host/src/devsvc_manager_clnt.c @@ -19,12 +19,13 @@ int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *service) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to add service, client is null"); return HDF_FAILURE; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->AddService == NULL) { HDF_LOGE("serviceManager AddService function is null"); return HDF_FAILURE; @@ -35,12 +36,13 @@ int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *ser const struct HdfObject *DevSvcManagerClntGetService(const char *svcName) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to get service, client is null"); return NULL; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->GetService == NULL) { HDF_LOGE("serviceManager GetService function is null"); return NULL; @@ -51,12 +53,13 @@ const struct HdfObject *DevSvcManagerClntGetService(const char *svcName) struct HdfDeviceObject *DevSvcManagerClntGetDeviceObject(const char *svcName) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to get device object, client is null"); return NULL; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->GetObject == NULL) { HDF_LOGE("failed to get device object, method not implement"); return NULL; @@ -91,12 +94,13 @@ void HdfUnregisterDevice(const char *moduleName, const char *serviceName) int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to subscribe service, client is null"); return HDF_FAILURE; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->SubscribeService == NULL) { HDF_LOGE("failed to subscribe service, method not implement"); return HDF_FAILURE; @@ -107,12 +111,13 @@ int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCall int DevSvcManagerClntUnsubscribeService(const char *svcName) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to unsubscribe service, client is null"); return HDF_FAILURE; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->UnsubscribeService == NULL) { HDF_LOGE("failed to unsubscribe service, method not implement"); return HDF_FAILURE; @@ -123,12 +128,13 @@ int DevSvcManagerClntUnsubscribeService(const char *svcName) void DevSvcManagerClntRemoveService(const char *svcName) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; if (devSvcMgrClnt == NULL) { HDF_LOGE("failed to remove service, devSvcMgrClnt is null"); return; } - struct IDevSvcManager *serviceManager = devSvcMgrClnt->devSvcMgrIf; + serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->RemoveService == NULL) { HDF_LOGE("failed to remove service, method not implement"); return; diff --git a/core/host/src/hdf_device_node.c b/core/host/src/hdf_device_node.c index 06f46b436..f08c25394 100644 --- a/core/host/src/hdf_device_node.c +++ b/core/host/src/hdf_device_node.c @@ -25,11 +25,12 @@ static int HdfDeviceNodePublishLocalService( struct HdfDeviceNode *devNode, const struct HdfDeviceInfo *deviceInfo) { uint32_t matchId; + struct DevHostService *hostService = NULL; if ((devNode == NULL) || (deviceInfo == NULL)) { HDF_LOGE("failed to publish local service, device is null"); return HDF_FAILURE; } - struct DevHostService *hostService = devNode->hostService; + hostService = devNode->hostService; if (hostService == NULL) { HDF_LOGE("failed to publish local service, host service is null"); return HDF_FAILURE; @@ -42,15 +43,16 @@ static int HdfDeviceNodePublishLocalService( static int HdfDeviceNodePublishService( struct HdfDeviceNode *devNode, const struct HdfDeviceInfo *deviceInfo, struct IHdfDevice *device) { - (void)device; int status = HDF_SUCCESS; + struct IDeviceNode *nodeIf = NULL; + (void)device; if ((deviceInfo->policy == SERVICE_POLICY_NONE) || ((deviceInfo->svcName != NULL) && (strlen(deviceInfo->svcName) == 0))) { HDF_LOGI("policy is %d", SERVICE_POLICY_NONE); return status; } - struct IDeviceNode *nodeIf = &devNode->super; + nodeIf = &devNode->super; if ((deviceInfo->policy == SERVICE_POLICY_PUBLIC) || (deviceInfo->policy == SERVICE_POLICY_CAPACITY)) { if (nodeIf->PublishService != NULL) { @@ -66,15 +68,17 @@ static int HdfDeviceNodePublishService( int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode, struct IHdfDevice *devInst) { struct HdfDevice *device = (struct HdfDevice *)devInst; + struct HdfDriverEntry *driverEntry = NULL; + const struct HdfDeviceInfo *deviceInfo = NULL; + struct IHdfDeviceToken *deviceToken = NULL; + int ret; if (device == NULL || devNode == NULL) { HDF_LOGE("failed to launch service, device or service is null"); return HDF_ERR_INVALID_PARAM; } - struct HdfDriverEntry *driverEntry = devNode->driverEntry; - const struct HdfDeviceInfo *deviceInfo = devNode->deviceInfo; - struct IHdfDeviceToken *deviceToken = NULL; - + driverEntry = devNode->driverEntry; + deviceInfo = devNode->deviceInfo; if (deviceInfo == NULL) { HDF_LOGE("failed to launch service, deviceInfo is null"); return HDF_ERR_INVALID_PARAM; @@ -84,7 +88,7 @@ int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode, struct IHdfDevice *devIns HDF_LOGE("failed to launch service, deviceEntry invalid"); return HDF_ERR_INVALID_PARAM; } - int ret = driverEntry->Init(&devNode->deviceObject); + ret = driverEntry->Init(&devNode->deviceObject); if (ret != HDF_SUCCESS) { return HDF_DEV_ERR_DEV_INIT_FAIL; } diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index 832b11d8e..6ab710031 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -22,11 +22,12 @@ int32_t HdfDeviceSubscribeService( uint32_t matchId; struct DevHostService *hostService = NULL; const struct HdfDeviceInfo *deviceInfo = NULL; + struct HdfDeviceNode *devNode = NULL; if (deviceObject == NULL || serviceName == NULL) { HDF_LOGE("failed to subscribe service, deviceObject/serviceName is null"); return HDF_FAILURE; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); hostService = devNode->hostService; if (hostService == NULL) { @@ -44,13 +45,15 @@ int32_t HdfDeviceSubscribeService( const char *HdfDeviceGetServiceName(const struct HdfDeviceObject *deviceObject) { + struct HdfDeviceNode *devNode = NULL; + const struct HdfDeviceInfo *deviceInfo = NULL; if (deviceObject == NULL) { HDF_LOGE("failed to get service name, deviceObject is invalid"); return NULL; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); - const struct HdfDeviceInfo *deviceInfo = devNode->deviceInfo; + deviceInfo = devNode->deviceInfo; if (deviceInfo == NULL) { HDF_LOGE("failed to get service name, deviceInfo is null"); return NULL; @@ -60,33 +63,37 @@ const char *HdfDeviceGetServiceName(const struct HdfDeviceObject *deviceObject) int HdfPmRegisterPowerListener(struct HdfDeviceObject *deviceObject, const struct IPowerEventListener *listener) { + struct HdfDeviceNode *devNode = NULL; if (deviceObject == NULL) { return HDF_ERR_INVALID_PARAM; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); return HdfDeviceNodeAddPowerStateListener(devNode, listener); } void HdfPmUnregisterPowerListener(struct HdfDeviceObject *deviceObject, const struct IPowerEventListener *listener) { + struct HdfDeviceNode *devNode = NULL; if (deviceObject == NULL) { return; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); HdfDeviceNodeRemovePowerStateListener(devNode, listener); } void HdfPmAcquireDevice(struct HdfDeviceObject *deviceObject) { + struct HdfDeviceNode *devNode = NULL; + struct IPowerStateToken *tokenIf = NULL; if (deviceObject == NULL) { HDF_LOGE("%s: input param is invalid", __func__); return; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); - struct IPowerStateToken *tokenIf = (struct IPowerStateToken *)devNode->powerToken; + tokenIf = (struct IPowerStateToken *)devNode->powerToken; if ((tokenIf != NULL) && (tokenIf->AcquireWakeLock != NULL)) { tokenIf->AcquireWakeLock(tokenIf); } @@ -94,13 +101,15 @@ void HdfPmAcquireDevice(struct HdfDeviceObject *deviceObject) void HdfPmReleaseDevice(struct HdfDeviceObject *deviceObject) { + struct HdfDeviceNode *devNode = NULL; + struct IPowerStateToken *tokenIf = NULL; if (deviceObject == NULL) { HDF_LOGE("%s: input param is invalid", __func__); return; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); - struct IPowerStateToken *tokenIf = (struct IPowerStateToken *)devNode->powerToken; + tokenIf = (struct IPowerStateToken *)devNode->powerToken; if ((tokenIf != NULL) && (tokenIf->ReleaseWakeLock != NULL)) { tokenIf->ReleaseWakeLock(tokenIf); } @@ -108,13 +117,15 @@ void HdfPmReleaseDevice(struct HdfDeviceObject *deviceObject) void HdfPmSetMode(struct HdfDeviceObject *deviceObject, uint32_t mode) { + struct HdfDeviceNode *devNode = NULL; + struct PowerStateToken *token = NULL; if (deviceObject == NULL || mode > HDF_POWER_MODE_MAX) { HDF_LOGE("%s: input param is invalid", __func__); return; } - struct HdfDeviceNode *devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); - struct PowerStateToken *token = devNode->powerToken; + token = devNode->powerToken; if (token != NULL) { token->mode = mode; } diff --git a/core/host/src/hdf_observer_record.c b/core/host/src/hdf_observer_record.c index 645d7d54e..574afecdd 100644 --- a/core/host/src/hdf_observer_record.c +++ b/core/host/src/hdf_observer_record.c @@ -47,10 +47,11 @@ void HdfServiceObserverRecordRecycle(struct HdfServiceObserverRecord *observerRe bool HdfServiceObserverRecordCompare(struct HdfSListNode *listEntry, uint32_t serviceKey) { + struct HdfServiceObserverRecord *record = NULL; if (listEntry == NULL) { return false; } - struct HdfServiceObserverRecord *record = (struct HdfServiceObserverRecord *)listEntry; + record = (struct HdfServiceObserverRecord *)listEntry; if (record->serviceKey == serviceKey) { return true; } diff --git a/core/host/src/power_state_token.c b/core/host/src/power_state_token.c index f32c21354..f4abe0726 100644 --- a/core/host/src/power_state_token.c +++ b/core/host/src/power_state_token.c @@ -15,10 +15,11 @@ static void PowerStateTokenOnFirstAcquire(struct HdfSRef *sref) { + struct PowerStateToken *stateToken = NULL; if (sref == NULL) { return; } - struct PowerStateToken *stateToken = (struct PowerStateToken *)HDF_SLIST_CONTAINER_OF( + stateToken = (struct PowerStateToken *)HDF_SLIST_CONTAINER_OF( struct HdfSRef, sref, struct PowerStateToken, wakeRef); if (stateToken->psmState == PSM_STATE_ACTIVE) { @@ -36,17 +37,19 @@ static void PowerStateTokenOnFirstAcquire(struct HdfSRef *sref) static void PowerStateTokenOnLastRelease(struct HdfSRef *sref) { + struct PowerStateToken *stateToken = NULL; + const struct IPowerEventListener *listener = NULL; if (sref == NULL) { return; } - struct PowerStateToken *stateToken = (struct PowerStateToken *)HDF_SLIST_CONTAINER_OF( + stateToken = (struct PowerStateToken *)HDF_SLIST_CONTAINER_OF( struct HdfSRef, sref, struct PowerStateToken, wakeRef); if (stateToken->psmState != PSM_STATE_ACTIVE && stateToken->psmState != PSM_STATE_IDLE) { return; } - const struct IPowerEventListener *listener = stateToken->listener; + listener = stateToken->listener; if ((listener != NULL) && (listener->Suspend != NULL)) { listener->Suspend(stateToken->deviceObject); } diff --git a/core/manager/src/devmgr_service.c b/core/manager/src/devmgr_service.c index 36886a931..e11da3ed7 100644 --- a/core/manager/src/devmgr_service.c +++ b/core/manager/src/devmgr_service.c @@ -139,16 +139,18 @@ static void DevmgrServiceUpdateStatus(struct DevHostServiceClnt *hostClnt, uint1 static int DevmgrServiceAttachDevice( struct IDevmgrService *inst, const struct HdfDeviceInfo *deviceInfo, struct IHdfDeviceToken *token) { + struct DevHostServiceClnt *hostClnt = NULL; + struct DeviceTokenClnt *tokenClnt = NULL; if (deviceInfo == NULL) { HDF_LOGE("failed to attach device, deviceInfo is null"); return HDF_FAILURE; } - struct DevHostServiceClnt *hostClnt = DevmgrServiceFindDeviceHost(inst, deviceInfo->hostId); + hostClnt = DevmgrServiceFindDeviceHost(inst, deviceInfo->hostId); if (hostClnt == NULL) { HDF_LOGE("failed to attach device, hostClnt is null"); return HDF_FAILURE; } - struct DeviceTokenClnt *tokenClnt = DeviceTokenClntNewInstance(token); + tokenClnt = DeviceTokenClntNewInstance(token); if (tokenClnt == NULL) { HDF_LOGE("failed to attach device, tokenClnt is null"); return HDF_FAILURE; @@ -271,11 +273,12 @@ int DevmgrServicePowerStateChange(struct IDevmgrService *devmgrService, enum Hdf bool DevmgrServiceConstruct(struct DevmgrService *inst) { + struct IDevmgrService *devMgrSvcIf = NULL; if (OsalMutexInit(&inst->devMgrMutex) != HDF_SUCCESS) { HDF_LOGE("%s:failed to mutex init ", __func__); return false; } - struct IDevmgrService *devMgrSvcIf = (struct IDevmgrService *)inst; + devMgrSvcIf = (struct IDevmgrService *)inst; if (devMgrSvcIf != NULL) { devMgrSvcIf->AttachDevice = DevmgrServiceAttachDevice; devMgrSvcIf->AttachDeviceHost = DevmgrServiceAttachDeviceHost; @@ -313,11 +316,11 @@ struct IDevmgrService *DevmgrServiceGetInstance() void DevmgrServiceRelease(struct HdfObject *object) { struct DevmgrService *devmgrService = (struct DevmgrService *)object; + struct DevHostServiceClnt *hostClnt = NULL; + struct DevHostServiceClnt *hostClntTmp = NULL; if (devmgrService == NULL) { return; } - struct DevHostServiceClnt *hostClnt = NULL; - struct DevHostServiceClnt *hostClntTmp = NULL; DLIST_FOR_EACH_ENTRY_SAFE(hostClnt, hostClntTmp, &devmgrService->hosts, struct DevHostServiceClnt, node) { DListRemove(&hostClnt->node); DevHostServiceClntDelete(hostClnt); diff --git a/core/manager/src/devsvc_manager.c b/core/manager/src/devsvc_manager.c index 1c7b765ac..d3f377bb0 100644 --- a/core/manager/src/devsvc_manager.c +++ b/core/manager/src/devsvc_manager.c @@ -43,12 +43,13 @@ static struct DevSvcRecord *DevSvcManagerSearchService(struct IDevSvcManager *in int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *svcName, struct HdfDeviceObject *service) { struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; + struct DevSvcRecord *record = NULL; if ((devSvcManager == NULL) || (service == NULL) || (svcName == NULL)) { HDF_LOGE("failed to add service, input param is null"); return HDF_FAILURE; } - struct DevSvcRecord *record = DevSvcRecordNewInstance(); + record = DevSvcRecordNewInstance(); if (record == NULL) { HDF_LOGE("failed to add service , record is null"); return HDF_FAILURE; @@ -66,11 +67,12 @@ int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcNa { int ret = HDF_FAILURE; struct DevSvcManager *devSvcMgr = (struct DevSvcManager *)inst; + struct HdfObject *deviceService = NULL; if (svcName == NULL || devSvcMgr == NULL) { return ret; } - struct HdfObject *deviceService = DevSvcManagerGetService(inst, svcName); + deviceService = DevSvcManagerGetService(inst, svcName); if (deviceService != NULL) { if (callBack.OnServiceConnected != NULL) { callBack.OnServiceConnected(callBack.deviceObject, deviceService); @@ -85,10 +87,11 @@ void DevSvcManagerRemoveService(struct IDevSvcManager *inst, const char *svcName { struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; uint32_t serviceKey = HdfStringMakeHashKey(svcName, 0); + struct DevSvcRecord *serviceRecord = NULL; if (svcName == NULL || devSvcManager == NULL) { return; } - struct DevSvcRecord *serviceRecord = DevSvcManagerSearchService(inst, serviceKey); + serviceRecord = DevSvcManagerSearchService(inst, serviceKey); if (serviceRecord != NULL) { OsalMutexLock(&devSvcManager->mutex); HdfSListRemove(&devSvcManager->services, &serviceRecord->entry); @@ -100,11 +103,12 @@ void DevSvcManagerRemoveService(struct IDevSvcManager *inst, const char *svcName struct HdfDeviceObject *DevSvcManagerGetObject(struct IDevSvcManager *inst, const char *svcName) { uint32_t serviceKey = HdfStringMakeHashKey(svcName, 0); + struct DevSvcRecord *serviceRecord = NULL; if (svcName == NULL) { HDF_LOGE("Get service failed, svcName is null"); return NULL; } - struct DevSvcRecord *serviceRecord = DevSvcManagerSearchService(inst, serviceKey); + serviceRecord = DevSvcManagerSearchService(inst, serviceKey); if (serviceRecord != NULL) { return serviceRecord->value; } @@ -122,11 +126,12 @@ struct HdfObject *DevSvcManagerGetService(struct IDevSvcManager *inst, const cha bool DevSvcManagerConstruct(struct DevSvcManager *inst) { + struct IDevSvcManager *devSvcMgrIf = NULL; if (inst == NULL) { HDF_LOGE("%s: inst is null!", __func__); return false; } - struct IDevSvcManager *devSvcMgrIf = &inst->super; + devSvcMgrIf = &inst->super; devSvcMgrIf->AddService = DevSvcManagerAddService; devSvcMgrIf->SubscribeService = DevSvcManagerSubscribeService; devSvcMgrIf->UnsubscribeService = NULL; diff --git a/core/manager/src/hdf_driver_installer.c b/core/manager/src/hdf_driver_installer.c index 4071b2eec..0ed60f47f 100644 --- a/core/manager/src/hdf_driver_installer.c +++ b/core/manager/src/hdf_driver_installer.c @@ -17,11 +17,12 @@ static int DriverInstallerStartDeviceHost(uint32_t devHostId, const char *devHostName) { struct IDevHostService *hostServiceIf = DevHostServiceNewInstance(devHostId, devHostName); + int ret; if ((hostServiceIf == NULL) || (hostServiceIf->StartService == NULL)) { HDF_LOGE("hostServiceIf or hostServiceIf->StartService is null"); return HDF_FAILURE; } - int ret = hostServiceIf->StartService(hostServiceIf); + ret = hostServiceIf->StartService(hostServiceIf); if (ret != HDF_SUCCESS) { HDF_LOGE("failed to start host service, ret: %d", ret); DevHostServiceFreeInstance(hostServiceIf); diff --git a/utils/src/hdf_cstring.c b/utils/src/hdf_cstring.c index 761e21659..cdba3fdf7 100644 --- a/utils/src/hdf_cstring.c +++ b/utils/src/hdf_cstring.c @@ -26,12 +26,13 @@ uint32_t HdfStringMakeHashKey(const char *key, uint32_t mask) struct HdfCString *HdfCStringObtain(const char *str) { struct HdfCString *instance = NULL; + size_t size; if (str != NULL) { size_t strLen = strlen(str); if (strLen > CSTRING_MAX) { return NULL; } - size_t size = sizeof(struct HdfCString) + strLen + 1; + size = sizeof(struct HdfCString) + strLen + 1; instance = (struct HdfCString *)OsalMemCalloc(size); if (instance == NULL) { HDF_LOGE("HdfCStringObtain failed, alloc memory failed"); diff --git a/utils/src/hdf_map.c b/utils/src/hdf_map.c index 67e14f451..627c9e66e 100644 --- a/utils/src/hdf_map.c +++ b/utils/src/hdf_map.c @@ -119,6 +119,7 @@ static struct MapNode *MapCreateNode(const char *key, uint32_t hash, int32_t MapSet(Map *map, const char *key, const void *value, uint32_t valueSize) { struct MapNode *node = NULL; + uint32_t hash; if (map == NULL || key == NULL || value == NULL || valueSize == 0) { return HDF_ERR_INVALID_PARAM; @@ -126,7 +127,7 @@ int32_t MapSet(Map *map, const char *key, const void *value, uint32_t valueSize) if (valueSize > HDF_MAP_KEY_MAX_SIZE || strlen(key) > HDF_MAP_VALUE_MAX_SIZE) { return HDF_ERR_INVALID_PARAM; } - uint32_t hash = MapHash(key); + hash = MapHash(key); if (map->nodeSize > 0 && map->nodes != NULL) { uint32_t idx = MapHashIdx(map, hash); node = map->nodes[idx]; @@ -167,13 +168,17 @@ int32_t MapSet(Map *map, const char *key, const void *value, uint32_t valueSize) void* MapGet(const Map *map, const char *key) { + uint32_t hash; + uint32_t idx; + struct MapNode *node = NULL; + if (map == NULL || key == NULL || map->nodeSize == 0 || map->nodes == NULL) { return NULL; } - uint32_t hash = MapHash(key); - uint32_t idx = MapHashIdx(map, hash); - struct MapNode *node = map->nodes[idx]; + hash = MapHash(key); + idx = MapHashIdx(map, hash); + node = map->nodes[idx]; while (node != NULL) { if (node->hash == hash && node->key != NULL && !strcmp(node->key, key)) { @@ -188,14 +193,19 @@ void* MapGet(const Map *map, const char *key) int32_t MapErase(Map *map, const char *key) { + uint32_t hash; + uint32_t idx; + struct MapNode *node = NULL; + struct MapNode *prev = NULL; + if (map == NULL || key == NULL || map->nodeSize == 0 || map->nodes == NULL) { return HDF_ERR_INVALID_PARAM; } - uint32_t hash = MapHash(key); - uint32_t idx = MapHashIdx(map, hash); - struct MapNode *node = map->nodes[idx]; - struct MapNode *prev = node; + hash = MapHash(key); + idx = MapHashIdx(map, hash); + node = map->nodes[idx]; + prev = node; while (node != NULL) { if (node->hash == hash && node->key != NULL && !strcmp(node->key, key)) { diff --git a/utils/src/hdf_slist.c b/utils/src/hdf_slist.c index 1aeb396c5..e74bd864f 100644 --- a/utils/src/hdf_slist.c +++ b/utils/src/hdf_slist.c @@ -180,11 +180,11 @@ struct HdfSListNode *HdfSListNext(struct HdfSListNode *link) struct HdfSListNode *HdfSListPop(struct HdfSList *list) { + struct HdfSListNode *first = NULL; if (list == NULL || list->root == NULL) { return NULL; } - - struct HdfSListNode *first = list->root; + first = list->root; list->root = first->next; return first; } -- Gitee From 72aba8db656ab9162d91887df37d736339b0aaec Mon Sep 17 00:00:00 2001 From: fanxiaoyu Date: Wed, 29 Sep 2021 07:27:08 +0000 Subject: [PATCH 066/272] Description:Add netif status monitor for dsoftbus in liteos-a Feature or Bugfix:Feature Binary Source: No Signed-off-by: fanxiaoyu --- model/misc/dsoftbus/include/module_manager.h | 1 + model/misc/dsoftbus/src/module_manager.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/model/misc/dsoftbus/include/module_manager.h b/model/misc/dsoftbus/include/module_manager.h index a59ef5fe1..19464c647 100644 --- a/model/misc/dsoftbus/include/module_manager.h +++ b/model/misc/dsoftbus/include/module_manager.h @@ -19,6 +19,7 @@ extern "C" { typedef enum { SOFTBUS_MODULE_WLAN_PARAM_MONITOR = 0, + SOFTBUS_MODULE_LWIP_MONITOR, SOFTBUS_MODULE_MAX_INDEX, } SoftbusDriverModuleId; diff --git a/model/misc/dsoftbus/src/module_manager.c b/model/misc/dsoftbus/src/module_manager.c index 0f9da6086..6dc8b25e1 100644 --- a/model/misc/dsoftbus/src/module_manager.c +++ b/model/misc/dsoftbus/src/module_manager.c @@ -9,6 +9,9 @@ #include "module_manager.h" #include "hdf_log.h" +#ifdef ENABLE_LWIP_MONITOR +#include "softbus_lwip_monitor.h" +#endif #ifdef ENABLE_WLAN_PARAM_MONITOR #include "wlan_param_monitor.h" #endif @@ -16,6 +19,13 @@ #define HDF_LOG_TAG "hdf_dsoftbus" static SoftbusDriverModule g_modules[] = { +#ifdef ENABLE_LWIP_MONITOR + { + .init = SoftbusLwipMonitorInit, + .deinit = NULL, + .process = NULL, + }, +#endif #ifdef ENABLE_WLAN_PARAM_MONITOR { .init = SoftbusWlanParamMonitorInit, @@ -40,7 +50,7 @@ void SoftbusDispatchModuleCommand(int32_t moduleId, const struct HdfSBuf *reqDat g_modules[i].process(reqData, rspData); return; } - HDF_LOGE("no moduleId: %d registered", moduleId); + HDF_LOGE("no moduleId: %d process command", moduleId); } int32_t SoftbusModuleManagerInit(struct HdfDeviceObject *device) -- Gitee From 963464397cdab332a8fd4e1d5bd77acda23af9df Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Thu, 30 Sep 2021 11:25:57 +0800 Subject: [PATCH 067/272] =?UTF-8?q?0929=E4=BB=A3=E7=A0=81=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/src/mipi_csi_core.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi_csi_core.c index 53fd28aea..e1d5d1732 100755 --- a/support/platform/src/mipi_csi_core.c +++ b/support/platform/src/mipi_csi_core.c @@ -8,8 +8,6 @@ #include "mipi_csi_core.h" #include "hdf_log.h" -#include "osal_mem.h" -#include "osal_time.h" #define HDF_LOG_TAG mipi_csi_core -- Gitee From 87dbf34d8c56593cbeba5aa17faeab56c62d1ee5 Mon Sep 17 00:00:00 2001 From: lzl Date: Fri, 8 Oct 2021 07:06:07 +0000 Subject: [PATCH 068/272] modify mmc c90 warning Signed-off-by: lzl --- support/platform/src/mmc/emmc_if.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/support/platform/src/mmc/emmc_if.c b/support/platform/src/mmc/emmc_if.c index b3c9f2061..02bfe8c1c 100644 --- a/support/platform/src/mmc/emmc_if.c +++ b/support/platform/src/mmc/emmc_if.c @@ -112,6 +112,10 @@ static int32_t EmmcDeviceGetFromHandle(DevHandle handle, struct EmmcDevice **emm int32_t EmmcGetCid(DevHandle handle, uint8_t *cid, uint32_t size) { +#ifndef __USER__ + struct EmmcDevice *emmc = NULL; + int32_t ret; +#endif if (handle == NULL) { HDF_LOGE("EmmcGetCid: handle is NULL!"); return HDF_ERR_INVALID_OBJECT; @@ -124,9 +128,6 @@ int32_t EmmcGetCid(DevHandle handle, uint8_t *cid, uint32_t size) #ifdef __USER__ return EmmcServiceGetCid((struct HdfIoService *)handle, cid, size); #else - struct EmmcDevice *emmc = NULL; - int32_t ret; - if (EmmcDeviceGetFromHandle(handle, &emmc) != HDF_SUCCESS) { return HDF_ERR_INVALID_OBJECT; } -- Gitee From d636144de4842c5a0fbacd60708d63f66472948e Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 8 Oct 2021 15:18:34 +0800 Subject: [PATCH 069/272] clear the warings of c90 Signed-off-by: YOUR_NAME --- .../hcs_parser/unittest/hcs_config_test.c | 250 +++++++++++------- 1 file changed, 161 insertions(+), 89 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_config_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_config_test.c index b5757268e..71baeee70 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_config_test.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_config_test.c @@ -75,13 +75,13 @@ int HcsTestCreateDMHcsToTree(void) static bool TestHcsGetNodeByMatchAttrSuccess(void) { + const struct DeviceResourceNode *fingerPrintNode = NULL; const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); if (audioNode == NULL) { HDF_LOGE("%s failed, HcsGetNodeByMatchAttr failed, line: %d\n", __FUNCTION__, __LINE__); return false; } - const struct DeviceResourceNode *fingerPrintNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, - HW_FINGERPRINT_INFO); + fingerPrintNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); if (fingerPrintNode == NULL) { HDF_LOGE("%s failed, HcsGetNodeByMatchAttr failed, line: %d\n", __FUNCTION__, __LINE__); return false; @@ -133,18 +133,20 @@ int HcsTestGetNodeByMatchAttrFail(void) static bool TestHcsAttrGetBoolSuccess(void) { + const struct DeviceResourceNode *fingerNode = NULL; const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); bool primaryMic = g_devResInstance->GetBool(audioNode, "builtin_primary_mic_exist"); + bool dualFinger = NULL; if (!primaryMic) { HDF_LOGE("%s failed, HcsGetBool failed, line: %d\n", __FUNCTION__, __LINE__); return false; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); if (fingerNode == NULL) { HDF_LOGE("%s failed, HcsGetNodeByMatchAttr failed, line: %d\n", __FUNCTION__, __LINE__); return false; } - bool dualFinger = g_devResInstance->GetBool(fingerNode, DUAL_FINGERPRINT); + dualFinger = g_devResInstance->GetBool(fingerNode, DUAL_FINGERPRINT); if (dualFinger) { HDF_LOGE("%s failed, HcsGetBool failed, line: %d\n", __FUNCTION__, __LINE__); return false; @@ -165,17 +167,19 @@ int HcsTestGetBoolAttrValueSuccess(void) static bool TestHcsAttrGetBoolFailed(void) { + const struct DeviceResourceNode *fingerNode = NULL; const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + bool testReadBool = NULL; if (audioNode == NULL) { HDF_LOGE("%s failed, HcsGetNodeByMatchAttr failed, line: %d", __FUNCTION__, __LINE__); return false; } - bool testReadBool = g_devResInstance->GetBool(audioNode, INVALID_STRING); + testReadBool = g_devResInstance->GetBool(audioNode, INVALID_STRING); if (testReadBool) { HDF_LOGE("%s failed, HcsGetBool failed, line: %d", __FUNCTION__, __LINE__); return false; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); if (fingerNode == NULL) { HDF_LOGE("%s failed, HcsGetNodeByMatchAttr failed, line: %d", __FUNCTION__, __LINE__); return false; @@ -211,12 +215,14 @@ int HcsTestGetBoolAttrValueFail(void) int HcsTestGetUint8AttrValueSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; uint8_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint8(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT8_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint8(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT8_MAX); if ((ret != HDF_SUCCESS) || (data != U8_DATA)) { HDF_LOGE("%s failed, line: %d, ret = %d, data = %u", __FUNCTION__, __LINE__, ret, data); return HDF_FAILURE; @@ -226,12 +232,14 @@ int HcsTestGetUint8AttrValueSuccess(void) int HcsTestGetUint8AttrValueFail(void) { + const struct DeviceResourceNode *audioNode = NULL; uint8_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint8(audioNode, INVALID_STRING, &data, DEFAULT_UINT8_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint8(audioNode, INVALID_STRING, &data, DEFAULT_UINT8_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT8_MAX)) { return HDF_FAILURE; } @@ -256,15 +264,17 @@ int HcsTestGetUint8AttrValueFail(void) int HcsTestGetUint8ArrayElemSuccess(void) { + const struct DeviceResourceNode *dataType = NULL; uint8_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; // the test data is 0, 1, 2, 3, 4, 5, 6, 7. uint8_t testData[DATA_TEST_ARRAY_LENGTH] = { 0, 1, 2, 3, 4, 5, 6, 7 }; uint32_t i; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t count = g_devResInstance->GetElemNum(dataType, TEST_U8_ELEM_DATA); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + count = g_devResInstance->GetElemNum(dataType, TEST_U8_ELEM_DATA); if (count != DATA_TEST_ARRAY_LENGTH) { return HDF_FAILURE; } @@ -281,22 +291,24 @@ int HcsTestGetUint8ArrayElemSuccess(void) int HcsTestGetUint8ArrayElemFail(void) { + const struct DeviceResourceNode *dataType = NULL; + uint8_t data1[DATA_TYPE_NUM_U64] = { 0 }; uint8_t data; uint32_t i; + int32_t ret; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); // the number of 8 is invalid value. - int32_t ret = g_devResInstance->GetUint8ArrayElem(dataType, TEST_U8_ELEM_DATA, 8, &data, - DEFAULT_UINT8_MAX); + ret = g_devResInstance->GetUint8ArrayElem(dataType, TEST_U8_ELEM_DATA, 8, &data, DEFAULT_UINT8_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT8_MAX)) { HDF_LOGE("%s failed, line: %d, ret = %d, data = %x", __FUNCTION__, __LINE__, ret, data); return HDF_FAILURE; } - uint8_t data1[DATA_TYPE_NUM_U64] = { 0 }; dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); + count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); if (count != DATA_TYPE_NUM_U64) { return HDF_FAILURE; } @@ -314,13 +326,14 @@ int HcsTestGetUint8ArrayElemFail(void) int HcsTestGetUint8ArraySuccess(void) { + const struct DeviceResourceNode *dataType = NULL; uint8_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint8Array(dataType, TEST_U8_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, - DEFAULT_UINT8_MAX); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint8Array(dataType, TEST_U8_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, DEFAULT_UINT8_MAX); // the 0~7 represents the location in array or the value in hcs file. if ((ret != HDF_SUCCESS) || (data[0] != 0) || (data[1] != 1) || (data[2] != 2) || (data[3] != 3) || (data[4] != 4) || (data[5] != 5) || (data[6] != 6) || (data[7] != 7)) { @@ -331,12 +344,14 @@ int HcsTestGetUint8ArraySuccess(void) int HcsTestGetUint8ArrayFail(void) { + const struct DeviceResourceNode *dataType = NULL; uint8_t data[DATA_TYPE_NUM_U64 + 1] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint8Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT8_MAX); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint8Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT8_MAX); // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; @@ -353,12 +368,14 @@ int HcsTestGetUint8ArrayFail(void) int HcsTestGetUint16AttrValueSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; uint16_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint16(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT16_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint16(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT16_MAX); if ((ret != HDF_SUCCESS) || (data != U8_DATA)) { HDF_LOGE("%s failed, line: %d, ret = %d, data = %u", __FUNCTION__, __LINE__, ret, data); return HDF_FAILURE; @@ -373,12 +390,14 @@ int HcsTestGetUint16AttrValueSuccess(void) int HcsTestGetUint16AttrValueFail(void) { + const struct DeviceResourceNode *audioNode = NULL; uint16_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint16(audioNode, INVALID_STRING, &data, DEFAULT_UINT16_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint16(audioNode, INVALID_STRING, &data, DEFAULT_UINT16_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT16_MAX)) { return HDF_FAILURE; } @@ -399,16 +418,18 @@ int HcsTestGetUint16AttrValueFail(void) int HcsTestGetUint16ArrayElemSuccess(void) { + const struct DeviceResourceNode *dataType = NULL; // the length of data is 8. uint16_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; // the test data is 0, 1, 2, 3, 4, 5, 256, 257. uint16_t testData[DATA_TEST_ARRAY_LENGTH] = { 0, 1, 2, 3, 4, 5, 256, 257 }; uint32_t i; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t count = g_devResInstance->GetElemNum(dataType, TEST_U16_ELEM_DATA); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + count = g_devResInstance->GetElemNum(dataType, TEST_U16_ELEM_DATA); if (count != DATA_TEST_ARRAY_LENGTH) { return HDF_FAILURE; } @@ -424,20 +445,23 @@ int HcsTestGetUint16ArrayElemSuccess(void) int HcsTestGetUint16ArrayElemFail(void) { + const struct DeviceResourceNode *dataType = NULL; + uint16_t data1[DATA_TYPE_NUM_U64] = { 0 }; uint16_t data; uint32_t i; + int32_t ret; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint16ArrayElem(dataType, TEST_U16_ELEM_DATA, DATA_TEST_ARRAY_LENGTH, &data, + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint16ArrayElem(dataType, TEST_U16_ELEM_DATA, DATA_TEST_ARRAY_LENGTH, &data, DEFAULT_UINT16_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT16_MAX)) { return HDF_FAILURE; } - uint16_t data1[DATA_TYPE_NUM_U64] = { 0 }; dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); + count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); if (count != DATA_TYPE_NUM_U64) { return HDF_FAILURE; } @@ -454,12 +478,14 @@ int HcsTestGetUint16ArrayElemFail(void) int HcsTestGetUint16ArraySuccess(void) { + const struct DeviceResourceNode *dataType = NULL; uint16_t data[DATA_TEST_ARRAY_LENGTH] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint16Array(dataType, TEST_U16_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint16Array(dataType, TEST_U16_ELEM_DATA, data, DATA_TEST_ARRAY_LENGTH, DEFAULT_UINT16_MAX); // the data[0~7] represents the location in array, the test data is 0, 1, 2, 3, 4, 5, 256, 257. if ((ret != HDF_SUCCESS) || (data[0] != 0) || (data[1] != 1) || (data[2] != 2) || (data[3] != 3) || (data[4] != 4) @@ -471,12 +497,14 @@ int HcsTestGetUint16ArraySuccess(void) int HcsTestGetUint16ArrayFail(void) { + const struct DeviceResourceNode *dataType = NULL; uint16_t data[DATA_TYPE_NUM_U64 + 1] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint16Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT16_MAX); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint16Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT16_MAX); // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; @@ -493,12 +521,14 @@ int HcsTestGetUint16ArrayFail(void) int HcsTestGetUint32AttrValueSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; uint32_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint32(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT32_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint32(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT32_MAX); if ((ret != HDF_SUCCESS) || (data != U8_DATA)) { HDF_LOGE("%s failed, line: %d, ret = %d, data = %u", __FUNCTION__, __LINE__, ret, data); return HDF_FAILURE; @@ -518,12 +548,14 @@ int HcsTestGetUint32AttrValueSuccess(void) int HcsTestGetUint32AttrValueFail(void) { + const struct DeviceResourceNode *audioNode = NULL; uint32_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint32(audioNode, INVALID_STRING, &data, DEFAULT_UINT32_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint32(audioNode, INVALID_STRING, &data, DEFAULT_UINT32_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT32_MAX)) { return HDF_FAILURE; } @@ -536,14 +568,16 @@ int HcsTestGetUint32AttrValueFail(void) int HcsTestGetUint32ArrayElemSuccess(void) { + const struct DeviceResourceNode *fingerNode = NULL; uint32_t data[DATA_TYPE_NUM_U32] = { 0 }; uint32_t testData[DATA_TYPE_NUM_U32] = { U8_DATA, U16_DATA, U32_DATA }; int32_t i; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); - int32_t count = g_devResInstance->GetElemNum(fingerNode, READ_U32_INDEX); + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + count = g_devResInstance->GetElemNum(fingerNode, READ_U32_INDEX); if (count != DATA_TYPE_NUM_U32) { return HDF_FAILURE; } @@ -558,12 +592,14 @@ int HcsTestGetUint32ArrayElemSuccess(void) int HcsTestGetUint32ArrayElemFail(void) { + const struct DeviceResourceNode *fingerNode = NULL; uint32_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); - int32_t ret = g_devResInstance->GetUint32ArrayElem(fingerNode, READ_U32_INDEX, DATA_TYPE_NUM_U32, &data, + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + ret = g_devResInstance->GetUint32ArrayElem(fingerNode, READ_U32_INDEX, DATA_TYPE_NUM_U32, &data, DEFAULT_UINT32_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT32_MAX)) { return HDF_FAILURE; @@ -574,10 +610,11 @@ int HcsTestGetUint32ArrayElemFail(void) int HcsTestGetUint32ArraySuccess(void) { uint32_t data[BOARDID_LENGTH] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - int32_t ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, BOARDID_LENGTH, DEFAULT_UINT32_MAX); + ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, BOARDID_LENGTH, DEFAULT_UINT32_MAX); // the 0, 1 represents the location in array. if ((ret != HDF_SUCCESS) || (data[0] != U32_DATA) || (data[1] != U16_DATA)) { return HDF_FAILURE; @@ -588,10 +625,11 @@ int HcsTestGetUint32ArraySuccess(void) int HcsTestGetUint32ArrayFail(void) { uint32_t data[DATA_TYPE_NUM_U32] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - int32_t ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, 0, DEFAULT_UINT32_MAX); + ret = g_devResInstance->GetUint32Array(g_testRoot, BOARD_ID, data, 0, DEFAULT_UINT32_MAX); // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; @@ -606,12 +644,14 @@ int HcsTestGetUint32ArrayFail(void) int HcsTestGetUint64AttrValueSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; uint64_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint64(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT32_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint64(audioNode, SMARTPA_NUM, &data, DEFAULT_UINT32_MAX); if ((ret != HDF_SUCCESS) || (data != U8_DATA)) { HDF_LOGE("%s failed, line: %d", __FUNCTION__, __LINE__); return HDF_FAILURE; @@ -636,12 +676,14 @@ int HcsTestGetUint64AttrValueSuccess(void) int HcsTestGetUint64AttrValueFail(void) { + const struct DeviceResourceNode *audioNode = NULL; uint64_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - int32_t ret = g_devResInstance->GetUint64(audioNode, INVALID_STRING, &data, DEFAULT_UINT64_MAX); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + ret = g_devResInstance->GetUint64(audioNode, INVALID_STRING, &data, DEFAULT_UINT64_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT64_MAX)) { return HDF_FAILURE; } @@ -654,14 +696,16 @@ int HcsTestGetUint64AttrValueFail(void) int HcsTestGetUint64ArrayElemSuccess(void) { + const struct DeviceResourceNode *dataType = NULL; uint64_t data[DATA_TYPE_NUM_U64] = { 0 }; uint64_t testData[DATA_TYPE_NUM_U64] = { U8_DATA, U16_DATA, U32_DATA, U64_DATA }; uint32_t i; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + count = g_devResInstance->GetElemNum(dataType, READ_FOUR_DATA_TYPE); if (count != DATA_TYPE_NUM_U64) { return HDF_FAILURE; } @@ -677,12 +721,14 @@ int HcsTestGetUint64ArrayElemSuccess(void) int HcsTestGetUint64ArrayElemFail(void) { + const struct DeviceResourceNode *dataType = NULL; uint64_t data; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint64ArrayElem(dataType, READ_FOUR_DATA_TYPE, DATA_TYPE_NUM_U64, &data, + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint64ArrayElem(dataType, READ_FOUR_DATA_TYPE, DATA_TYPE_NUM_U64, &data, DEFAULT_UINT64_MAX); if ((ret == HDF_SUCCESS) || (data != DEFAULT_UINT64_MAX)) { return HDF_FAILURE; @@ -692,12 +738,14 @@ int HcsTestGetUint64ArrayElemFail(void) int HcsTestGetUint64ArraySuccess(void) { + const struct DeviceResourceNode *dataType = NULL; uint64_t data[DATA_TYPE_NUM_U64] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64, + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, DATA_TYPE_NUM_U64, DEFAULT_UINT64_MAX); // the 0, 1, 2 represents the location in array. if ((ret != HDF_SUCCESS) || (data[0] != U8_DATA) || (data[1] != U16_DATA) || (data[2] != U32_DATA) || @@ -709,12 +757,14 @@ int HcsTestGetUint64ArraySuccess(void) int HcsTestGetUint64ArrayFail(void) { + const struct DeviceResourceNode *dataType = NULL; uint64_t data[DATA_TYPE_NUM_U64 + 1] = { 0 }; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); - int32_t ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT64_MAX); + dataType = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_DATA_TYPE_TEST); + ret = g_devResInstance->GetUint64Array(dataType, READ_FOUR_DATA_TYPE, data, 0, DEFAULT_UINT64_MAX); // the 0, 1, 2 represents the location in array, the 0 of second param is default value. if ((ret == HDF_SUCCESS) || (data[0] != 0) || (data[1] != 0) || (data[2] != 0)) { return HDF_FAILURE; @@ -731,14 +781,16 @@ int HcsTestGetUint64ArrayFail(void) int HcsTestGetElemNumSuccess(void) { + const struct DeviceResourceNode *fingerNode = NULL; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - int32_t count = g_devResInstance->GetElemNum(g_testRoot, BOARD_ID); + count = g_devResInstance->GetElemNum(g_testRoot, BOARD_ID); if (count != BOARDID_LENGTH) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); count = g_devResInstance->GetElemNum(fingerNode, READ_U32_INDEX); if (count != DATA_TYPE_NUM_U32) { return HDF_FAILURE; @@ -752,12 +804,14 @@ int HcsTestGetElemNumSuccess(void) int HcsTestGetElemNumFail(void) { + const struct DeviceResourceNode *fingerNode = NULL; + int32_t count; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); + fingerNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_FINGERPRINT_INFO); // the dual_fingerprint attr do not array, so the count is HDF_FAILURE. - int32_t count = g_devResInstance->GetElemNum(fingerNode, DUAL_FINGERPRINT); + count = g_devResInstance->GetElemNum(fingerNode, DUAL_FINGERPRINT); if (count != HDF_FAILURE) { return HDF_FAILURE; } @@ -771,18 +825,21 @@ int HcsTestGetElemNumFail(void) int HcsTestGetChildNodeSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; + const struct DeviceResourceNode *fingerprintNode = NULL; + const struct DeviceResourceNode *oneNode = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetChildNode(g_testRoot, AUDIO_INFO); + audioNode = g_devResInstance->GetChildNode(g_testRoot, AUDIO_INFO); if (audioNode == NULL) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); if (fingerprintNode == NULL) { return HDF_FAILURE; } - const struct DeviceResourceNode *oneNode = g_devResInstance->GetChildNode(fingerprintNode, "fingerprint_one"); + oneNode = g_devResInstance->GetChildNode(fingerprintNode, "fingerprint_one"); if (oneNode == NULL) { return HDF_FAILURE; } @@ -791,14 +848,16 @@ int HcsTestGetChildNodeSuccess(void) int HcsTestGetChildNodeFail(void) { + const struct DeviceResourceNode *twoNode = NULL; + const struct DeviceResourceNode *nullNode = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *twoNode = g_devResInstance->GetChildNode(g_testRoot, "fingerprint_two"); + twoNode = g_devResInstance->GetChildNode(g_testRoot, "fingerprint_two"); if (twoNode != NULL) { return HDF_FAILURE; } - const struct DeviceResourceNode *nullNode = g_devResInstance->GetChildNode(g_testRoot, INVALID_NODE); + nullNode = g_devResInstance->GetChildNode(g_testRoot, INVALID_NODE); if (nullNode != NULL) { return HDF_FAILURE; } @@ -815,14 +874,15 @@ int HcsTestGetChildNodeFail(void) int HcsTestTraverseAttrInNodeSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; + struct DeviceResourceAttr *pp = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetChildNode(g_testRoot, AUDIO_INFO); + audioNode = g_devResInstance->GetChildNode(g_testRoot, AUDIO_INFO); if (audioNode == NULL) { return HDF_FAILURE; } - struct DeviceResourceAttr *pp = NULL; DEV_RES_NODE_FOR_EACH_ATTR(audioNode, pp) { if ((pp == NULL) || (pp->name == NULL)) { break; @@ -841,14 +901,16 @@ int HcsTestTraverseAttrInNodeSuccess(void) int HcsTestTraverseAttrInNodeFail(void) { + const struct DeviceResourceNode *fingerprintNode = NULL; + struct DeviceResourceAttr *pp = NULL; + const struct DeviceResourceNode *childNode = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); if (fingerprintNode == NULL) { return HDF_FAILURE; } - struct DeviceResourceAttr *pp = NULL; DEV_RES_NODE_FOR_EACH_ATTR(fingerprintNode, pp) { if ((pp == NULL) || (pp->name == NULL)) { break; @@ -863,7 +925,6 @@ int HcsTestTraverseAttrInNodeFail(void) return HDF_FAILURE; } - const struct DeviceResourceNode *childNode = NULL; DEV_RES_NODE_FOR_EACH_CHILD_NODE(fingerprintNode, childNode) { if ((childNode == NULL) || (childNode->name == NULL)) { break; @@ -882,12 +943,14 @@ int HcsTestTraverseAttrInNodeFail(void) int HcsTestGetStringSuccess(void) { + const struct DeviceResourceNode *audioNode = NULL; + const char *type = NULL; + int32_t readString; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - const char *type = NULL; - int32_t readString = g_devResInstance->GetString(audioNode, "cust_name", &type, NULL); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + readString = g_devResInstance->GetString(audioNode, "cust_name", &type, NULL); if ((readString != HDF_SUCCESS) || (type == NULL) || (strcmp(type, "audio_custom_v2") != HDF_SUCCESS)) { return HDF_FAILURE; } @@ -896,12 +959,14 @@ int HcsTestGetStringSuccess(void) int HcsTestGetStringFail(void) { + const struct DeviceResourceNode *audioNode = NULL; + const char *type = NULL; + int32_t testReadString; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); - const char *type = NULL; - int32_t testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &type, STRING_ATTR_VALUE); + audioNode = g_devResInstance->GetNodeByMatchAttr(g_testRoot, HW_AUDIO_INFO); + testReadString = g_devResInstance->GetString(audioNode, INVALID_STRING, &type, STRING_ATTR_VALUE); if ((testReadString == HDF_SUCCESS) || (type == NULL) || (strcmp(type, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; } @@ -918,13 +983,15 @@ int HcsTestGetStringFail(void) int HcsTestGetStringArrayElemSuccess(void) { + const char *rawDataDts = NULL; + const struct DeviceResourceNode *fingerprintNode = NULL; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const char *rawDataDts = NULL; - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); // the third param(0) is the location in string_list_names array. - int32_t ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 0, &rawDataDts, NULL); + ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 0, &rawDataDts, NULL); if ((ret != HDF_SUCCESS) || (strcmp(rawDataDts, "first") != HDF_SUCCESS)) { return HDF_FAILURE; } @@ -943,14 +1010,15 @@ int HcsTestGetStringArrayElemSuccess(void) int HcsTestGetStringArrayElemFail(void) { + const char *rawDataDts = NULL; + const struct DeviceResourceNode *fingerprintNode = NULL; + int32_t ret; if (!TestGetRootNode()) { return HDF_FAILURE; } - const char *rawDataDts = NULL; - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); // the third param(3) is the location in string_list_names array. - int32_t ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 3, &rawDataDts, - STRING_ATTR_VALUE); + ret = g_devResInstance->GetStringArrayElem(fingerprintNode, STRING_LIST_NAMES, 3, &rawDataDts, STRING_ATTR_VALUE); if ((ret == HDF_SUCCESS) || (strcmp(rawDataDts, STRING_ATTR_VALUE) != HDF_SUCCESS)) { return HDF_FAILURE; } @@ -981,11 +1049,13 @@ int HcsTestGetStringArrayElemFail(void) int HcsTestGetNodeAttrRefSuccess(void) { + const struct DeviceResourceNode *fingerprintNode = NULL; + const struct DeviceResourceNode *ret = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); - const struct DeviceResourceNode *ret = g_devResInstance->GetNodeByRefAttr(fingerprintNode, FINGER_INFO); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + ret = g_devResInstance->GetNodeByRefAttr(fingerprintNode, FINGER_INFO); if (ret == NULL) { return HDF_FAILURE; } @@ -998,11 +1068,13 @@ int HcsTestGetNodeAttrRefSuccess(void) int HcsTestGetNodeAttrRefFail(void) { + const struct DeviceResourceNode *fingerprintNode = NULL; + const struct DeviceResourceNode *ret = NULL; if (!TestGetRootNode()) { return HDF_FAILURE; } - const struct DeviceResourceNode *fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); - const struct DeviceResourceNode *ret = g_devResInstance->GetNodeByRefAttr(fingerprintNode, DUAL_FINGERPRINT); + fingerprintNode = g_devResInstance->GetChildNode(g_testRoot, FINGERPRINT_INFO); + ret = g_devResInstance->GetNodeByRefAttr(fingerprintNode, DUAL_FINGERPRINT); if (ret != NULL) { return HDF_FAILURE; } -- Gitee From f59de3d3913d139451e58f74f4ee1a486845df82 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 8 Oct 2021 17:07:45 +0800 Subject: [PATCH 070/272] =?UTF-8?q?mipi=E6=A8=A1=E5=9D=97=20C90=E8=AD=A6?= =?UTF-8?q?=E5=91=8A=E6=B6=88=20=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- support/platform/src/mipi_csi_core.c | 4 +++- support/platform/src/mipi_dsi_core.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi_csi_core.c index e1d5d1732..fc09022b0 100755 --- a/support/platform/src/mipi_csi_core.c +++ b/support/platform/src/mipi_csi_core.c @@ -96,12 +96,14 @@ struct MipiCsiCntlr *MipiCsiCntlrGet(uint8_t number) void MipiCsiCntlrPut(const struct MipiCsiCntlr *cntlr) { + uint8_t number; + if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); return; } - uint8_t number = cntlr->devNo; + number = cntlr->devNo; if (number >= MAX_CNTLR_CNT) { HDF_LOGE("%s: invalid number.", __func__); return; diff --git a/support/platform/src/mipi_dsi_core.c b/support/platform/src/mipi_dsi_core.c index 51ec6d352..1178f766e 100644 --- a/support/platform/src/mipi_dsi_core.c +++ b/support/platform/src/mipi_dsi_core.c @@ -100,12 +100,14 @@ struct MipiDsiCntlr *MipiDsiCntlrOpen(uint8_t number) void MipiDsiCntlrClose(struct MipiDsiCntlr *cntlr) { + uint8_t number; + if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); return; } - uint8_t number = cntlr->devNo; + number = cntlr->devNo; if (number >= MAX_CNTLR_CNT) { HDF_LOGE("%s: invalid number.", __func__); return; -- Gitee From 31ac7aad0c27d131361dd188b45838168bb5baad Mon Sep 17 00:00:00 2001 From: JasonYujia Date: Sat, 9 Oct 2021 14:11:39 +0800 Subject: [PATCH 071/272] usb 1009 commit Signed-off-by: JasonYujia Change-Id: Id65344f02e5b51ab4f0ec95fd467555e6844278d --- .../include/usb_device_lite_cdcacm_test.h | 4 ++-- .../device/src/usb_device_lite_cdcacm_test.c | 13 ++++++---- .../device/src/usb_device_lite_sdk_if_test.c | 4 +--- .../device/src/usb_device_lite_sdk_io_test.c | 4 ++++ .../model/usb/host/include/usb_raw_test.h | 2 +- .../model/usb/host/include/usb_test.h | 2 +- .../model/usb/host/src/usb_raw_test.c | 24 +++++++++---------- test/unittest/model/usb/host/src/usb_test.c | 12 +++++----- 8 files changed, 35 insertions(+), 30 deletions(-) diff --git a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h index 95b004948..cb2b2f65f 100755 --- a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h +++ b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h @@ -31,9 +31,9 @@ #define WAIT_100MS 100 #define SYNC_5000MS 5000 #define CDC_ACM -#define QUEUE_SIZE 8 +#define QUEUE_SIZE 8 #define PORT_RATE 9600 -#define CHAR_FORMAT 8 +#define DATA_BIT 8 #define SS_MAX_PACKET_SIZE 1024 #define MAX_PACKET_SIZE 512 diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index 616660e89..d68c4e951 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -329,9 +329,9 @@ static struct Serial *SerialAlloc(void) DListHeadInit(&port->writePool); port->lineCoding.dwDTERate = CpuToLe32(PORT_RATE); - port->lineCoding.bCharFormat = CHAR_FORMAT; + port->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; port->lineCoding.bParityType = USB_CDC_NO_PARITY; - port->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + port->lineCoding.bDataBits = DATA_BIT; return port; } @@ -440,12 +440,12 @@ static int AllocCtrlRequests(struct AcmDevice *acmDevice) } static int32_t SendNotifyRequest(struct AcmDevice *acm, uint8_t type, - uint16_t value, void *data, uint32_t length) + uint16_t value, const uint16_t *data, uint32_t length) { struct UsbFnRequest *req = acm->notifyReq; struct UsbCdcNotification *notify = NULL; int ret; - if ((acm == NULL) || (req == NULL) || (req->buf == NULL) || (data == NULL)) { + if ((acm == NULL) || (acm->ctrlIface.fn == NULL) || (req == NULL) || (req->buf == NULL) || (data == NULL)) { return -1; } acm->notifyReq = NULL; @@ -458,7 +458,10 @@ static int32_t SendNotifyRequest(struct AcmDevice *acm, uint8_t type, notify->wValue = CpuToLe16(value); notify->wIndex = CpuToLe16(acm->ctrlIface.fn->info.index); notify->wLength = CpuToLe16(length); - memcpy_s((void *)(notify + 1), length, data, length); + ret = memcpy_s((void *)(notify + 1), length, data, length); + if (ret != EOK) { + HDF_LOGE("%s: memcpy_s fail, ret=%d", __func__, ret); + } ret = UsbFnSubmitRequestAsync(req); return ret; diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c index aa33cb215..e5a159437 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c @@ -17,11 +17,9 @@ #define HDF_LOG_TAG usb_device_sdk_test -static struct AcmDevice *g_acmDevice = NULL; +struct AcmDevice *g_acmDevice = NULL; extern struct UsbFnDeviceDesc g_acmFnDevice; -#include "usb_device_lite_sdk_io_test.c" - int32_t UsbFnDviceTestCreate(void) { dprintf("%s: start\n", __func__); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c index 7efc23b48..4bed92c13 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c @@ -12,6 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "usb_device_lite_cdcacm_test.h" + +#define HDF_LOG_TAG usb_device_sdk_test +extern struct AcmDevice *g_acmDevice; static void ReadComplete(uint8_t pipe, struct UsbFnRequest *req) { diff --git a/test/unittest/model/usb/host/include/usb_raw_test.h b/test/unittest/model/usb/host/include/usb_raw_test.h index de9c6ac37..d4871a7f8 100755 --- a/test/unittest/model/usb/host/include/usb_raw_test.h +++ b/test/unittest/model/usb/host/include/usb_raw_test.h @@ -161,7 +161,7 @@ enum UsbRawTestCmd { #define USB_CTRL_REQ_SIZE 256 #define DATARATE 9600 -#define CHARFORMAT 8 +#define DATA_BITS_LENGTH 8 #define ACM_NW 16 #define ACM_NR 16 #define READ_BUF_SIZE 8192 diff --git a/test/unittest/model/usb/host/include/usb_test.h b/test/unittest/model/usb/host/include/usb_test.h index d3188fad8..99da33d8b 100755 --- a/test/unittest/model/usb/host/include/usb_test.h +++ b/test/unittest/model/usb/host/include/usb_test.h @@ -120,7 +120,7 @@ enum UsbTestCmd { #define REQUEST_TYPE_MASK 0x3 #define DATARATE 9600 -#define CHARFORMAT 8 +#define DATA_BITS_LENGTH 8 #define ACM_NW 16 #define ACM_NR 16 #define READ_BUF_SIZE 8192 diff --git a/test/unittest/model/usb/host/src/usb_raw_test.c b/test/unittest/model/usb/host/src/usb_raw_test.c index 59cac2687..8f19fb97e 100755 --- a/test/unittest/model/usb/host/src/usb_raw_test.c +++ b/test/unittest/model/usb/host/src/usb_raw_test.c @@ -1269,9 +1269,9 @@ int32_t CheckRawSdkIfFillControlSetup001(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; @@ -1337,9 +1337,9 @@ int32_t CheckRawSdkIfFillControlSetup004(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; @@ -1377,9 +1377,9 @@ int32_t CheckRawSdkIfSendControlRequest001(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); @@ -1404,9 +1404,9 @@ int32_t CheckRawSdkIfSendControlRequest002(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); @@ -1444,9 +1444,9 @@ int32_t CheckRawSdkIfSendControlRequest004(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); @@ -1471,9 +1471,9 @@ int32_t CheckRawSdkIfSendControlRequest005(void) struct AcmRawDevice *rawAcm = UsbGetIoAcm(); rawAcm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - rawAcm->lineCoding.bCharFormat = CHARFORMAT; + rawAcm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; rawAcm->lineCoding.bParityType = USB_CDC_NO_PARITY; - rawAcm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + rawAcm->lineCoding.bDataBits = DATA_BITS_LENGTH; ctrlReq.requestType = USB_DDK_DIR_OUT | USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; ctrlReq.requestCmd = USB_DDK_CDC_REQ_SET_LINE_CODING; ctrlReq.value = CpuToLe16(0); diff --git a/test/unittest/model/usb/host/src/usb_test.c b/test/unittest/model/usb/host/src/usb_test.c index 60ffe422c..0963e1365 100755 --- a/test/unittest/model/usb/host/src/usb_test.c +++ b/test/unittest/model/usb/host/src/usb_test.c @@ -84,11 +84,11 @@ static void AcmWriteIsoCallback(struct UsbRequest *requestArg) printf("%s:%d status:%d\n", __func__, __LINE__, req->compInfo.status); } -static int AcmWriteBufAllocHandle(struct AcmDevice *acm) +static int AcmWriteBufAllocHandle(const struct AcmDevice *acm) { int i; struct AcmWb *wb; - for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { + for (wb = (struct AcmWb *)&acm->wb[0], i = 0; i < ACM_NW; i++, wb++) { wb->buf = (uint8_t *)OsalMemCalloc(acm->writeSize); if (!wb->buf) { while (i != 0) { @@ -1477,9 +1477,9 @@ static int32_t CheckHostSdkIfFillRequest004(void) parmas.requestType = USB_REQUEST_PARAMS_CTRL_TYPE; parmas.timeout = USB_CTRL_SET_TIMEOUT; g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; + g_acm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + g_acm->lineCoding.bDataBits = DATA_BITS_LENGTH; msgData.request = USB_DDK_CDC_REQ_SET_LINE_CODING; msgData.requestType = USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; msgData.value = value; @@ -1656,9 +1656,9 @@ static int32_t CheckHostSdkIfFillRequest008(void) parmas.requestType = USB_REQUEST_PARAMS_CTRL_TYPE; parmas.timeout = USB_CTRL_SET_TIMEOUT; g_acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - g_acm->lineCoding.bCharFormat = CHARFORMAT; + g_acm->lineCoding.bCharFormat = USB_CDC_1_STOP_BITS; g_acm->lineCoding.bParityType = USB_CDC_NO_PARITY; - g_acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; + g_acm->lineCoding.bDataBits = DATA_BITS_LENGTH; msgData.request = USB_DDK_CDC_REQ_SET_LINE_CODING; msgData.requestType = USB_DDK_TYPE_CLASS | USB_DDK_RECIP_INTERFACE; msgData.value = value; -- Gitee From e9f54fb3eff487abb8d056474325c5d9e831d361 Mon Sep 17 00:00:00 2001 From: huangkai Date: Mon, 11 Oct 2021 02:49:20 +0000 Subject: [PATCH 072/272] add hid device to hdf Signed-off-by: huangkai --- model/input/driver/hdf_hid_adapter.c | 42 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/model/input/driver/hdf_hid_adapter.c b/model/input/driver/hdf_hid_adapter.c index 3b2842822..91f95697c 100644 --- a/model/input/driver/hdf_hid_adapter.c +++ b/model/input/driver/hdf_hid_adapter.c @@ -114,31 +114,11 @@ static int32_t SetInputDevAbsAttr(InputDevice *inputDev, HidInfo *info) return HDF_SUCCESS; } -static int32_t GetInfoFromCache(InputDevice *inputDev, HidInfo **info) +static void GetInfoFromCache(InputDevice *inputDev, HidInfo *info) { - int32_t id = 0; - while (id < MAX_INPUT_DEV_NUM) { - if (g_cachedInfo[id] != NULL && !strcmp(inputDev->devName, g_cachedInfo[id]->devName)) { - *info = g_cachedInfo[id]; - break; - } - id++; - } - if (id == MAX_INPUT_DEV_NUM || info == NULL) { - HDF_LOGE("%s: match cached info failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -static void SetInputDevAbility(InputDevice *inputDev) -{ - HidInfo *info = NULL; uint32_t len; int32_t ret; - ret = GetInfoFromCache(inputDev, &info); - MEMCPY_CHECK_RETURN(ret); len = sizeof(unsigned long); ret = memcpy_s(inputDev->abilitySet.devProp, len * BITS_TO_LONG(INPUT_PROP_CNT), info->devProp, len * BITS_TO_LONG(INPUT_PROP_CNT)); @@ -176,6 +156,26 @@ static void SetInputDevAbility(InputDevice *inputDev) inputDev->attrSet.id.vendor = info->vendor; inputDev->attrSet.id.product = info->product; inputDev->attrSet.id.version = info->version; +} + +static void SetInputDevAbility(InputDevice *inputDev) +{ + HidInfo *info = NULL; + int32_t id = 0; + + while (id < MAX_INPUT_DEV_NUM) { + if (g_cachedInfo[id] != NULL && !strcmp(inputDev->devName, g_cachedInfo[id]->devName)) { + info = g_cachedInfo[id]; + break; + } + id++; + } + if (id == MAX_INPUT_DEV_NUM || info == NULL) { + HDF_LOGE("%s: match cached info failed", __func__); + return; + } + + GetInfoFromCache(inputDev, info); FreeCachedInfo(); } -- Gitee From f034872db952f6d7f7167a96784c7a21c682f00e Mon Sep 17 00:00:00 2001 From: JasonYujia Date: Mon, 11 Oct 2021 19:53:04 +0800 Subject: [PATCH 073/272] usb 1011 commit Signed-off-by: JasonYujia Change-Id: I220d7c3422b96f2898939478d98c78bbf80124d0 --- model/usb/src/usb_ddk_pnp_loader.c | 17 +- .../include/usb_device_lite_cdcacm_test.h | 2 + .../device/src/usb_device_lite_cdcacm_test.c | 11 +- .../device/src/usb_device_lite_sdk_if_test.c | 12 +- .../device/src/usb_device_lite_sdk_io_test.c | 185 ++++++++++-------- 5 files changed, 133 insertions(+), 94 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index 6fc3b7469..1ce3077cc 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -130,10 +130,11 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de { int32_t i; bool ret = true; + uint32_t offset; if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS) { - for (i = 0; i < id->interfaceClassLength; i++) { - if (!((uint32_t)(id->interfaceClassMask >> i) & 0x01)) { + for (i = 0, offset = 0; i < id->interfaceClassLength; i++, offset = i) { + if (!((id->interfaceClassMask >> offset) & 0x01)) { break; } } @@ -144,8 +145,8 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de } if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_SUBCLASS) { - for (i = 0; i < id->interfaceSubClassLength; i++) { - if (!((id->interfaceSubClassMask >> i) & 0x01)) { + for (i = 0, offset = 0; i < id->interfaceSubClassLength; i++, offset = i) { + if (!((id->interfaceSubClassMask >> offset) & 0x01)) { break; } } @@ -156,8 +157,8 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de } if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_PROTOCOL) { - for (i = 0; i < id->interfaceProtocolLength; i++) { - if (!((id->interfaceProtocolMask >> i) & 0x01)) { + for (i = 0, offset = 0; i < id->interfaceProtocolLength; i++, offset = i) { + if (!((id->interfaceProtocolMask >> offset) & 0x01)) { break; } } @@ -168,8 +169,8 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de } if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_NUMBER) { - for (i = 0; i < id->interfaceLength; i++) { - if (!((id->interfaceMask >> i) & 0x01)) { + for (i = 0, offset = 0; i < id->interfaceLength; i++, offset = i) { + if (!((id->interfaceMask >> offset) & 0x01)) { break; } } diff --git a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h index cb2b2f65f..a04d9c16d 100755 --- a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h +++ b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h @@ -52,6 +52,7 @@ #define ACM_DATA_IDX 2 #define ACM_IAD_IDX 3 +#define REQUEST_ALLOC_LENGTH ((uint32_t)(0x0800)) struct Serial { struct AcmDevice *acm; @@ -132,6 +133,7 @@ void AcmEventCallback(struct UsbFnEvent *event); void AcmDeviceRelease(struct AcmDevice *acmDevice); int remove_usb_device(void); +struct AcmDevice *UsbGetAcmDevice(void); int32_t UsbFnDviceTestCreate(void); int32_t UsbFnDviceTestCreate002(void); int32_t UsbFnDviceTestCreate003(void); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index d68c4e951..d2d6bbba5 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -442,10 +442,14 @@ static int AllocCtrlRequests(struct AcmDevice *acmDevice) static int32_t SendNotifyRequest(struct AcmDevice *acm, uint8_t type, uint16_t value, const uint16_t *data, uint32_t length) { - struct UsbFnRequest *req = acm->notifyReq; + struct UsbFnRequest *req = NULL; struct UsbCdcNotification *notify = NULL; int ret; - if ((acm == NULL) || (acm->ctrlIface.fn == NULL) || (req == NULL) || (req->buf == NULL) || (data == NULL)) { + if ((data == NULL) || (acm == NULL) || (acm->ctrlIface.fn == NULL)) { + return -1; + } + req = acm->notifyReq; + if ((req == NULL) || (req->buf == NULL)) { return -1; } acm->notifyReq = NULL; @@ -458,6 +462,9 @@ static int32_t SendNotifyRequest(struct AcmDevice *acm, uint8_t type, notify->wValue = CpuToLe16(value); notify->wIndex = CpuToLe16(acm->ctrlIface.fn->info.index); notify->wLength = CpuToLe16(length); + if (((void *)(notify + 1) == NULL) || (length == 0)) { + return HDF_FAILURE; + } ret = memcpy_s((void *)(notify + 1), length, data, length); if (ret != EOK) { HDF_LOGE("%s: memcpy_s fail, ret=%d", __func__, ret); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c index e5a159437..f5e8fc53e 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c @@ -20,6 +20,11 @@ struct AcmDevice *g_acmDevice = NULL; extern struct UsbFnDeviceDesc g_acmFnDevice; +struct AcmDevice *UsbGetAcmDevice(void) +{ + return g_acmDevice; +} + int32_t UsbFnDviceTestCreate(void) { dprintf("%s: start\n", __func__); @@ -1120,7 +1125,7 @@ int32_t UsbFnDviceTestAllocRequest005(void) HDF_LOGE("%s: ctrlIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->ctrlIface.handle, 0x20, 0x800); + req = UsbFnAllocRequest(g_acmDevice->ctrlIface.handle, 0x20, REQUEST_ALLOC_LENGTH); if (req != NULL) { HDF_LOGE("%s: alloc req success!!", __func__); ret = UsbFnFreeRequest(req); @@ -1181,12 +1186,13 @@ int32_t UsbFnDviceTestAllocRequest008(void) { int ret; struct UsbFnRequest *req = NULL; + uint32_t length; if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: ctrlIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, - 0x20, g_acmDevice->dataOutPipe.maxPacketSize); + length = g_acmDevice->dataOutPipe.maxPacketSize; + req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, 0x20, length); if (req != NULL) { HDF_LOGE("%s: alloc req success!!", __func__); ret = UsbFnFreeRequest(req); diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c index 4bed92c13..a2532a606 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_io_test.c @@ -15,11 +15,11 @@ #include "usb_device_lite_cdcacm_test.h" #define HDF_LOG_TAG usb_device_sdk_test -extern struct AcmDevice *g_acmDevice; static void ReadComplete(uint8_t pipe, struct UsbFnRequest *req) { - if (NULL == req) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if ((req == NULL) || (acmDevice == NULL)) { return; } if (req->actual) { @@ -28,10 +28,10 @@ static void ReadComplete(uint8_t pipe, struct UsbFnRequest *req) dprintf("receive [%d] bytes data: %s\n", req->actual, data); if (strcmp((const char *)data, "q") == 0 || \ strcmp((const char *)data, "q\n") == 0) { - g_acmDevice->submitExit = 1; + acmDevice->submitExit = 1; } } - g_acmDevice->submit = 1; + acmDevice->submit = 1; } int32_t UsbFnDviceTestRequestAsync(void) @@ -52,31 +52,32 @@ int32_t UsbFnDviceTestRequestAsync002(void) struct UsbFnRequest *req = NULL; int ret = HDF_SUCCESS; int ret1; - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("wait receiving data form host, please connect\n"); - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } req->complete = ReadComplete; - req->context = g_acmDevice; - while (g_acmDevice->connect == false) { + req->context = acmDevice; + while (acmDevice->connect == false) { OsalMSleep(WAIT_100MS); } while (1) { - g_acmDevice->submit = 0; + acmDevice->submit = 0; ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: async Request error", __func__); ret = HDF_FAILURE; break; } - while (g_acmDevice->submit == 0) { + while (acmDevice->submit == 0) { OsalMSleep(WAIT_100MS); } if (req->actual > 0) { @@ -96,32 +97,33 @@ int32_t UsbFnDviceTestRequestAsync003(void) struct UsbFnRequest *req = NULL; int ret = HDF_SUCCESS; int ret1; - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("wait receiving data form host, please connect\n"); - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } req->complete = ReadComplete; - req->context = g_acmDevice; - while (g_acmDevice->connect == false) { + req->context = acmDevice; + while (acmDevice->connect == false) { OsalMSleep(WAIT_100MS); } - g_acmDevice->submitExit = 0; - while (g_acmDevice->submitExit == 0) { - g_acmDevice->submit = 0; + acmDevice->submitExit = 0; + while (acmDevice->submitExit == 0) { + acmDevice->submit = 0; ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: async Request error", __func__); ret = HDF_FAILURE; break; } - while (g_acmDevice->submit == 0) { + while (acmDevice->submit == 0) { OsalMSleep(WAIT_100MS); } } @@ -135,37 +137,42 @@ int32_t UsbFnDviceTestRequestAsync003(void) static void WriteComplete(uint8_t pipe, struct UsbFnRequest *req) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL) { + return; + } dprintf("write data status = %d\n", req->status); - g_acmDevice->submit = 1; + acmDevice->submit = 1; } int32_t UsbFnDviceTestRequestAsync004(void) { struct UsbFnRequest *req = NULL; int ret; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } req->complete = WriteComplete; - req->context = g_acmDevice; - g_acmDevice->submit = 0; + req->context = acmDevice; + acmDevice->submit = 0; dprintf("------send \"abc\" to host------\n"); - if (g_acmDevice->dataInPipe.maxPacketSize < strlen("abc")) { + if (acmDevice->dataInPipe.maxPacketSize < strlen("abc")) { ret = UsbFnFreeRequest(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: free Request error", __func__); } return HDF_FAILURE; } - if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + if (memcpy_s(req->buf, acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); } req->length = strlen("abc"); @@ -174,10 +181,10 @@ int32_t UsbFnDviceTestRequestAsync004(void) HDF_LOGE("%s: async Request error", __func__); return HDF_FAILURE; } - while (g_acmDevice->submit == 0) { + while (acmDevice->submit == 0) { OsalMSleep(1); } - g_acmDevice->submit = 0; + acmDevice->submit = 0; ret = UsbFnFreeRequest(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: free Request error", __func__); @@ -191,23 +198,24 @@ int32_t UsbFnDviceTestRequestAsync005(void) struct UsbFnRequest *req = NULL; int loopTime = TEST_TIMES; int ret; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("------send \"xyz\" 10 times to host------\n"); while (loopTime--) { - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } req->complete = WriteComplete; - req->context = g_acmDevice; - g_acmDevice->submit = 0; - if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "xyz", strlen("xyz")) != EOK) { + req->context = acmDevice; + acmDevice->submit = 0; + if (memcpy_s(req->buf, acmDevice->dataInPipe.maxPacketSize, "xyz", strlen("xyz")) != EOK) { HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); } req->length = strlen("xyz"); @@ -216,10 +224,10 @@ int32_t UsbFnDviceTestRequestAsync005(void) HDF_LOGE("%s: async Request error", __func__); return HDF_FAILURE; } - while (g_acmDevice->submit == 0) { + while (acmDevice->submit == 0) { OsalMSleep(1); } - g_acmDevice->submit = 0; + acmDevice->submit = 0; ret = UsbFnFreeRequest(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: free Request error", __func__); @@ -251,13 +259,14 @@ int32_t UsbFnDviceTestRequestSync002(void) struct UsbFnRequest *req = NULL; int ret; uint8_t *data = NULL; - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("wait receiving data form host\n"); - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; @@ -284,13 +293,14 @@ int32_t UsbFnDviceTestRequestSync003(void) int ret; int submitExit = 0; uint8_t *data = NULL; - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("receive data until 'q' exit\n"); - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; @@ -321,19 +331,20 @@ int32_t UsbFnDviceTestRequestSync004(void) { struct UsbFnRequest *req = NULL; int ret; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } dprintf("------send \"abc\" to host------\n"); - if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + if (memcpy_s(req->buf, acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); } req->length = strlen("abc"); @@ -356,20 +367,21 @@ int32_t UsbFnDviceTestRequestSync005(void) struct UsbFnRequest *req = NULL; int loopTime = TEST_TIMES; int ret; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("------send \"abcdefg\" 10 times to host------\n"); while (loopTime--) { - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } - if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abcdefg", strlen("abcdefg")) != EOK) { + if (memcpy_s(req->buf, acmDevice->dataInPipe.maxPacketSize, "abcdefg", strlen("abcdefg")) != EOK) { HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); } req->length = strlen("abcdefg"); @@ -392,13 +404,14 @@ int32_t UsbFnDviceTestRequestSync006(void) { struct UsbFnRequest *req = NULL; int ret; - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.fn is invail", __func__); return HDF_FAILURE; } dprintf("test sync timeout 5s:\n"); - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; @@ -431,7 +444,12 @@ int32_t UsbFnDviceTestRequestSync007(void) static void TestCancelComplete(uint8_t pipe, struct UsbFnRequest *req) { - g_acmDevice->havedSubmit = true; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); + if (acmDevice == NULL) { + return; + } + + acmDevice->havedSubmit = true; } int32_t UsbFnDviceTestCancelRequest(void) @@ -450,12 +468,13 @@ int32_t UsbFnDviceTestCancelRequest002(void) { int ret; struct UsbFnRequest *req = NULL; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->ctrlIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->ctrlIface.handle == NULL) { HDF_LOGE("%s: CtrlIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocCtrlRequest(g_acmDevice->ctrlIface.handle, + req = UsbFnAllocCtrlRequest(acmDevice->ctrlIface.handle, sizeof(struct UsbCdcNotification)); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); @@ -483,13 +502,14 @@ int32_t UsbFnDviceTestCancelRequest003(void) { int ret; struct UsbFnRequest *req = NULL; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; @@ -516,13 +536,14 @@ int32_t UsbFnDviceTestCancelRequest004(void) { int ret; struct UsbFnRequest *req = NULL; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; @@ -549,22 +570,23 @@ int32_t UsbFnDviceTestCancelRequest005(void) { int ret; struct UsbFnRequest *req = NULL; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataInPipe.id, - g_acmDevice->dataInPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataInPipe.id, + acmDevice->dataInPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } - g_acmDevice->havedSubmit = false; + acmDevice->havedSubmit = false; req->complete = TestCancelComplete; - req->context = g_acmDevice; + req->context = acmDevice; dprintf("------send \"abc\" to host------\n"); - if (memcpy_s(req->buf, g_acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { + if (memcpy_s(req->buf, acmDevice->dataInPipe.maxPacketSize, "abc", strlen("abc")) != EOK) { HDF_LOGE("%s:%d memcpy_s fail", __func__, __LINE__); } req->length = strlen("abc"); @@ -573,7 +595,7 @@ int32_t UsbFnDviceTestCancelRequest005(void) HDF_LOGE("%s: request async error", __func__); return HDF_FAILURE; } - while (g_acmDevice->havedSubmit == 0) { + while (acmDevice->havedSubmit == 0) { OsalMSleep(1); } ret = UsbFnCancelRequest(req); @@ -581,7 +603,7 @@ int32_t UsbFnDviceTestCancelRequest005(void) dprintf("%s: cancel request error", __func__); return HDF_FAILURE; } - g_acmDevice->havedSubmit = false; + acmDevice->havedSubmit = false; ret = UsbFnFreeRequest(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: free Request error", __func__); @@ -626,30 +648,31 @@ int32_t UsbFnDviceTestCancelRequest006(void) int ret; struct UsbFnRequest *req = NULL; struct UsbFnRequest *req2 = NULL; + struct AcmDevice *acmDevice = UsbGetAcmDevice(); - if (g_acmDevice == NULL || g_acmDevice->dataIface.handle == NULL) { + if (acmDevice == NULL || acmDevice->dataIface.handle == NULL) { HDF_LOGE("%s: dataIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } - g_acmDevice->havedSubmit = false; + acmDevice->havedSubmit = false; req->complete = TestCancelComplete; - req->context = g_acmDevice; + req->context = acmDevice; - req2 = UsbFnAllocRequest(g_acmDevice->dataIface.handle, g_acmDevice->dataOutPipe.id, - g_acmDevice->dataOutPipe.maxPacketSize); + req2 = UsbFnAllocRequest(acmDevice->dataIface.handle, acmDevice->dataOutPipe.id, + acmDevice->dataOutPipe.maxPacketSize); if (req2 == NULL) { HDF_LOGE("%s: alloc req fail", __func__); return HDF_FAILURE; } - g_acmDevice->submit = false; + acmDevice->submit = false; req2->complete = ReadComplete; - req2->context = g_acmDevice; + req2->context = acmDevice; ret = UsbFnSubmitRequestAsync(req); if (HDF_SUCCESS != ret) { HDF_LOGE("%s: request async error", __func__); -- Gitee From 13b0437bcdb94168d3b3ee5eb32dafbef3f28770 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Tue, 12 Oct 2021 09:11:08 +0800 Subject: [PATCH 074/272] modify header file stability sorting Signed-off-by: sunxuejiao --- test/unittest/common/hdf_main_test.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index c803bd8c1..205ac2ded 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -6,10 +6,10 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_log.h" -#include "hdf_base.h" #include "hcs_parser_test.h" +#include "hdf_base.h" #include "hdf_device_desc.h" +#include "hdf_log.h" #include "hdf_main_test.h" #include "osal_test_entry.h" -- Gitee From 875c94efaefb08816982f87a32fa2430562f258d Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Tue, 12 Oct 2021 14:35:11 +0800 Subject: [PATCH 075/272] gpio user api support Signed-off-by: haizhouyang --- .../platform/include/{ => gpio}/gpio_core.h | 10 + support/platform/include/gpio/gpio_service.h | 31 ++ support/platform/src/{ => gpio}/gpio_core.c | 83 ++-- support/platform/src/gpio/gpio_if.c | 286 ++++++++++++++ support/platform/src/gpio/gpio_service.c | 213 ++++++++++ support/platform/src/gpio_if.c | 55 --- .../test/unittest/common/hdf_gpio_test.cpp | 36 +- .../platform/common/gpio_driver_test.c | 116 ++++++ test/unittest/platform/common/gpio_test.c | 364 +++++++++++------- test/unittest/platform/common/gpio_test.h | 23 +- test/unittest/platform/hdf_gpio_entry_test.c | 11 +- 11 files changed, 964 insertions(+), 264 deletions(-) rename support/platform/include/{ => gpio}/gpio_core.h (95%) create mode 100644 support/platform/include/gpio/gpio_service.h rename support/platform/src/{ => gpio}/gpio_core.c (87%) create mode 100644 support/platform/src/gpio/gpio_if.c create mode 100644 support/platform/src/gpio/gpio_service.c delete mode 100644 support/platform/src/gpio_if.c create mode 100644 test/unittest/platform/common/gpio_driver_test.c diff --git a/support/platform/include/gpio_core.h b/support/platform/include/gpio/gpio_core.h similarity index 95% rename from support/platform/include/gpio_core.h rename to support/platform/include/gpio/gpio_core.h index 4f8fbdd6f..823df7187 100644 --- a/support/platform/include/gpio_core.h +++ b/support/platform/include/gpio/gpio_core.h @@ -14,6 +14,7 @@ #include "hdf_dlist.h" #include "gpio_if.h" #include "osal_spinlock.h" +#include "platform_core.h" #ifdef __cplusplus #if __cplusplus @@ -149,6 +150,15 @@ static inline uint16_t GpioGetLocalNumber(struct GpioCntlr *cntlr, uint16_t gpio return (cntlr == NULL) ? gpio : (gpio - cntlr->start); } +struct GpioManager { + struct IDeviceIoService service; + struct PlatformDevice device; + struct PlatformManager manager; + struct DListHead cntlrList; +}; + +struct GpioManager *GpioManagerGet(void); + #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/include/gpio/gpio_service.h b/support/platform/include/gpio/gpio_service.h new file mode 100644 index 000000000..80e2b4dcf --- /dev/null +++ b/support/platform/include/gpio/gpio_service.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef GPIO_SERVICE_H +#define GPIO_SERVICE_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +enum GpioIoCmd { + GPIO_IO_READ = 0, + GPIO_IO_WRITE = 1, + GPIO_IO_GETDIR = 2, + GPIO_IO_SETDIR = 3, +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* GPIO_SERVICE_H */ diff --git a/support/platform/src/gpio_core.c b/support/platform/src/gpio/gpio_core.c similarity index 87% rename from support/platform/src/gpio_core.c rename to support/platform/src/gpio/gpio_core.c index f387a3475..dc9449adf 100644 --- a/support/platform/src/gpio_core.c +++ b/support/platform/src/gpio/gpio_core.c @@ -6,12 +6,13 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "gpio_core.h" +#include "gpio/gpio_core.h" #include "hdf_log.h" #include "osal_mem.h" #include "osal_sem.h" #include "osal_thread.h" #include "plat_log.h" +#include "platform_core.h" #include "securec.h" #define HDF_LOG_TAG gpio_core @@ -32,28 +33,25 @@ struct GpioIrqBridge { bool stop; }; -static struct DListHead g_cntlrList; -static OsalSpinlock g_listLock; -static uint32_t g_irqFlags; +static struct GpioManager g_gpioManager; -static struct DListHead *GpioCntlrListGet(void) +struct GpioManager *GpioManagerGet(void) { - static struct DListHead *list = NULL; - uint32_t flags; + static struct GpioManager *manager = NULL; + + if (manager == NULL) { + manager = &g_gpioManager; + + manager->manager.name = "PLATFORM_GPIO_MANAGER"; + OsalSpinInit(&manager->manager.spin); + DListHeadInit(&manager->manager.devices); - if (list == NULL) { - list = &g_cntlrList; - DListHeadInit(list); - OsalSpinInit(&g_listLock); + PlatformDeviceInit(&manager->device); + PlatformDeviceGet(&manager->device); + HDF_LOGI("%s: gpio manager init done", __func__); } - while (OsalSpinLockIrqSave(&g_listLock, &flags) != HDF_SUCCESS); - g_irqFlags = flags; - return list; -} -static void GpioCntlrListPut(void) -{ - (void)OsalSpinUnlockIrqRestore(&g_listLock, &g_irqFlags); + return manager; } static uint16_t GpioCntlrQueryStart(struct GpioCntlr *cntlr, struct DListHead *list) @@ -99,7 +97,7 @@ static uint16_t GpioCntlrQueryStart(struct GpioCntlr *cntlr, struct DListHead *l int32_t GpioCntlrAdd(struct GpioCntlr *cntlr) { uint16_t start; - struct DListHead *list = NULL; + struct GpioManager *gpioMgr = NULL; if (cntlr == NULL) { return HDF_ERR_INVALID_OBJECT; @@ -127,18 +125,23 @@ int32_t GpioCntlrAdd(struct GpioCntlr *cntlr) } } - OsalSpinInit(&cntlr->spin); - - list = GpioCntlrListGet(); - if ((start = GpioCntlrQueryStart(cntlr, list)) >= GPIO_NUM_MAX) { + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + HDF_LOGE("GpioCntlrAdd: get gpio manager failed"); + return HDF_PLT_ERR_DEV_GET; + } + (void)OsalSpinLock(&gpioMgr->manager.spin); + if ((start = GpioCntlrQueryStart(cntlr, &gpioMgr->manager.devices)) >= GPIO_NUM_MAX) { HDF_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start); - GpioCntlrListPut(); + (void)OsalSpinUnlock(&gpioMgr->manager.spin); return HDF_ERR_INVALID_PARAM; } + cntlr->start = start; + OsalSpinInit(&cntlr->spin); DListHeadInit(&cntlr->list); - DListInsertTail(&cntlr->list, list); - GpioCntlrListPut(); + DListInsertTail(&cntlr->list, &gpioMgr->manager.devices); + (void)OsalSpinUnlock(&gpioMgr->manager.spin); HDF_LOGI("GpioCntlrAdd: start:%u count:%u", cntlr->start, cntlr->count); return HDF_SUCCESS; @@ -146,6 +149,8 @@ int32_t GpioCntlrAdd(struct GpioCntlr *cntlr) void GpioCntlrRemove(struct GpioCntlr *cntlr) { + struct GpioManager *gpioMgr = NULL; + if (cntlr == NULL) { return; } @@ -155,10 +160,16 @@ void GpioCntlrRemove(struct GpioCntlr *cntlr) return; } + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + HDF_LOGE("GpioCntlrRemove: get gpio manager failed"); + return; + } + cntlr->device->service = NULL; - (void)GpioCntlrListGet(); + (void)OsalSpinLock(&gpioMgr->manager.spin); DListRemove(&cntlr->list); - GpioCntlrListPut(); + (void)OsalSpinUnlock(&gpioMgr->manager.spin); if (cntlr->ginfos != NULL) { OsalMemFree(cntlr->ginfos); cntlr->ginfos = NULL; @@ -168,18 +179,24 @@ void GpioCntlrRemove(struct GpioCntlr *cntlr) struct GpioCntlr *GpioGetCntlr(uint16_t gpio) { - struct DListHead *list = NULL; struct GpioCntlr *cntlr = NULL; struct GpioCntlr *tmp = NULL; + struct GpioManager *gpioMgr = NULL; + + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + HDF_LOGE("GpioCntlrRemove: get gpio manager failed"); + return NULL; + } - list = GpioCntlrListGet(); - DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct GpioCntlr, list) { + (void)OsalSpinLock(&gpioMgr->manager.spin); + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, &gpioMgr->manager.devices, struct GpioCntlr, list) { if (gpio >= cntlr->start && gpio < (cntlr->start + cntlr->count)) { - GpioCntlrListPut(); + (void)OsalSpinUnlock(&gpioMgr->manager.spin); return cntlr; } } - GpioCntlrListPut(); + (void)OsalSpinUnlock(&gpioMgr->manager.spin); HDF_LOGE("GpioGetCntlr: gpio %u not in any controllers!", gpio); return NULL; } diff --git a/support/platform/src/gpio/gpio_if.c b/support/platform/src/gpio/gpio_if.c new file mode 100644 index 000000000..d7c0205cd --- /dev/null +++ b/support/platform/src/gpio/gpio_if.c @@ -0,0 +1,286 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_if.h" + +#ifdef __USER__ +#include "gpio/gpio_service.h" +#include "hdf_io_service_if.h" +#include "platform_errno.h" +#else +#include "devsvc_manager_clnt.h" +#include "gpio/gpio_core.h" +#endif + +#include "hdf_base.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG gpio_if + +#ifdef __USER__ + +static void *GpioManagerServiceGet(void) +{ + static void *manager = NULL; + + if (manager != NULL) { + return manager; + } + manager = (void *)HdfIoServiceBind("HDF_PLATFORM_GPIO_MANAGER"); + if (manager == NULL) { + HDF_LOGE("%s: failed to get gpio manager service!", __func__); + } + return manager; +} + +int32_t GpioRead(uint16_t gpio, uint16_t *val) +{ + int32_t ret; + struct HdfIoService *service = NULL; + struct HdfSBuf *data = NULL; + struct HdfSBuf *reply = NULL; + + service = (struct HdfIoService *)GpioManagerServiceGet(); + if (service == NULL) { + return HDF_PLT_ERR_DEV_GET; + } + + data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + reply = HdfSBufObtainDefaultSize(); + if (reply == NULL) { + HdfSBufRecycle(data); + return HDF_ERR_MALLOC_FAIL; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { + HDF_LOGE("%s: write gpio number failed!", __func__); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_READ, data, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: service call failed:%d", __func__, ret); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return ret; + } + + if (!HdfSbufReadUint16(reply, val)) { + HDF_LOGE("%s: read sbuf failed", __func__); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_SUCCESS; +} + +int32_t GpioWrite(uint16_t gpio, uint16_t val) +{ + int32_t ret; + struct HdfIoService *service = NULL; + struct HdfSBuf *data = NULL; + + service = (struct HdfIoService *)GpioManagerServiceGet(); + if (service == NULL) { + return HDF_PLT_ERR_DEV_GET; + } + + data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { + HDF_LOGE("%s: write gpio number failed!", __func__); + HdfSBufRecycle(data); + return HDF_ERR_IO; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)val)) { + HDF_LOGE("%s: write gpio value failed!", __func__); + HdfSBufRecycle(data); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_WRITE, data, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: service call failed:%d", __func__, ret); + HdfSBufRecycle(data); + return ret; + } + + HdfSBufRecycle(data); + return HDF_SUCCESS; +} + +int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) +{ + int32_t ret; + struct HdfIoService *service = NULL; + struct HdfSBuf *data = NULL; + struct HdfSBuf *reply = NULL; + + service = (struct HdfIoService *)GpioManagerServiceGet(); + if (service == NULL) { + return HDF_PLT_ERR_DEV_GET; + } + + data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + reply = HdfSBufObtainDefaultSize(); + if (reply == NULL) { + HdfSBufRecycle(data); + return HDF_ERR_MALLOC_FAIL; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { + HDF_LOGE("%s: write gpio number failed!", __func__); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_GETDIR, data, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: service call failed:%d", __func__, ret); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return ret; + } + + if (!HdfSbufReadUint16(reply, dir)) { + HDF_LOGE("%s: read sbuf failed", __func__); + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return HDF_SUCCESS; +} + +int32_t GpioSetDir(uint16_t gpio, uint16_t dir) +{ + int32_t ret; + struct HdfIoService *service = NULL; + struct HdfSBuf *data = NULL; + + service = (struct HdfIoService *)GpioManagerServiceGet(); + if (service == NULL) { + return HDF_PLT_ERR_DEV_GET; + } + + data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { + HDF_LOGE("%s: write gpio number failed!", __func__); + HdfSBufRecycle(data); + return HDF_ERR_IO; + } + + if (!HdfSbufWriteUint16(data, (uint16_t)dir)) { + HDF_LOGE("%s: write gpio value failed!", __func__); + HdfSBufRecycle(data); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_SETDIR, data, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: service call failed:%d", __func__, ret); + HdfSBufRecycle(data); + return ret; + } + + HdfSBufRecycle(data); + return HDF_SUCCESS; +} + +int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg) +{ + (void)gpio; + (void)mode; + (void)func; + (void)arg; + return HDF_SUCCESS; +} + +int32_t GpioUnSetIrq(uint16_t gpio) +{ + (void)gpio; + return HDF_SUCCESS; +} + +int32_t GpioEnableIrq(uint16_t gpio) +{ + (void)gpio; + return HDF_SUCCESS; +} + +int32_t GpioDisableIrq(uint16_t gpio) +{ + (void)gpio; + return HDF_SUCCESS; +} + +#else +int32_t GpioRead(uint16_t gpio, uint16_t *val) +{ + return GpioCntlrRead(GpioGetCntlr(gpio), GpioToLocal(gpio), val); +} + +int32_t GpioWrite(uint16_t gpio, uint16_t val) +{ + return GpioCntlrWrite(GpioGetCntlr(gpio), GpioToLocal(gpio), val); +} + +int32_t GpioSetDir(uint16_t gpio, uint16_t dir) +{ + return GpioCntlrSetDir(GpioGetCntlr(gpio), GpioToLocal(gpio), dir); +} + +int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) +{ + return GpioCntlrGetDir(GpioGetCntlr(gpio), GpioToLocal(gpio), dir); +} + +int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg) +{ + return GpioCntlrSetIrq(GpioGetCntlr(gpio), GpioToLocal(gpio), mode, func, arg); +} + +int32_t GpioUnSetIrq(uint16_t gpio) +{ + return GpioCntlrUnsetIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); +} + +int32_t GpioEnableIrq(uint16_t gpio) +{ + return GpioCntlrEnableIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); +} + +int32_t GpioDisableIrq(uint16_t gpio) +{ + return GpioCntlrDisableIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); +} +#endif diff --git a/support/platform/src/gpio/gpio_service.c b/support/platform/src/gpio/gpio_service.c new file mode 100644 index 000000000..fe746026f --- /dev/null +++ b/support/platform/src/gpio/gpio_service.c @@ -0,0 +1,213 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_if.h" +#include "gpio/gpio_core.h" +#include "gpio/gpio_service.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "platform_core.h" + +#define HDF_LOG_TAG gpio_service + +static int32_t GpioManagerIoRead(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t value; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: read gpio number failed", __func__); + return HDF_ERR_IO; + } + + ret = GpioRead(gpio, &value); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read gpio failed:%d", __func__, ret); + return ret; + } + + if (!HdfSbufWriteUint16(reply, value)) { + HDF_LOGE("%s: write subf failed:%d", __func__, ret); + return ret; + } + + return ret; +} + +static int32_t GpioManagerIoWrite(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t value; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: read gpio number failed", __func__); + return HDF_ERR_IO; + } + + if (!HdfSbufReadUint16(data, &value)) { + HDF_LOGE("%s: read gpio value failed", __func__); + return HDF_ERR_IO; + } + + ret = GpioWrite(gpio, value); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: write gpio failed:%d", __func__, ret); + return ret; + } + + return ret; +} + +static int32_t GpioManagerIoGetDir(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t dir; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: read gpio number failed", __func__); + return HDF_ERR_IO; + } + + ret = GpioGetDir(gpio, &dir); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get gpio dir failed:%d", __func__, ret); + return ret; + } + + if (!HdfSbufWriteUint16(reply, dir)) { + HDF_LOGE("%s: write subf failed:%d", __func__, ret); + return ret; + } + + return ret; +} + +static int32_t GpioManagerIoSetDir(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t dir; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: read gpio number failed", __func__); + return HDF_ERR_IO; + } + + if (!HdfSbufReadUint16(data, &dir)) { + HDF_LOGE("%s: read gpio dir failed", __func__); + return HDF_ERR_IO; + } + + ret = GpioSetDir(gpio, dir); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: set gpio dir failed:%d", __func__, ret); + return ret; + } + + return ret; +} + +static int32_t GpioManagerDispatch(struct HdfDeviceIoClient *client, int cmd, + struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + + switch (cmd) { + case GPIO_IO_READ: + return GpioManagerIoRead(data, reply); + case GPIO_IO_WRITE: + return GpioManagerIoWrite(data, reply); + case GPIO_IO_GETDIR: + return GpioManagerIoGetDir(data, reply); + case GPIO_IO_SETDIR: + return GpioManagerIoSetDir(data, reply); + default: + ret = HDF_ERR_NOT_SUPPORT; + break; + } + return ret; +} + +static int32_t GpioManagerBind(struct HdfDeviceObject *device) +{ + struct GpioManager *gpioMgr = NULL; + + HDF_LOGI("GpioManagerBind: enter"); + if (device == NULL) { + HDF_LOGE("GpioManagerBind: device is NULL"); + return HDF_ERR_INVALID_OBJECT; + } + + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + HDF_LOGE("GpioManagerBind: get gpio manager failed"); + return HDF_PLT_ERR_DEV_GET; + } + + gpioMgr->device.hdfDev = device; + device->service = &gpioMgr->service; + device->service->Dispatch = GpioManagerDispatch; + HDF_LOGI("GpioManagerBind: success"); + return HDF_SUCCESS; +} + +static int32_t GpioManagerInit(struct HdfDeviceObject *device) +{ + (void)device; + return HDF_SUCCESS; +} + +static void GpioManagerRelease(struct HdfDeviceObject *device) +{ + struct GpioManager *gpioMgr = NULL; + + HDF_LOGI("GpioManagerRelease: enter"); + if (device == NULL) { + HDF_LOGI("GpioManagerRelease: device is null"); + return; + } + + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + HDF_LOGE("GpioManagerBind: get gpio manager failed"); + return; + } + + gpioMgr->device.hdfDev = NULL; + device->service = NULL; + device->service->Dispatch = NULL; + HDF_LOGI("GpioManagerRelease: done"); +} + +struct HdfDriverEntry g_gpioManagerEntry = { + .moduleVersion = 1, + .Bind = GpioManagerBind, + .Init = GpioManagerInit, + .Release = GpioManagerRelease, + .moduleName = "HDF_PLATFORM_GPIO_MANAGER", +}; +HDF_INIT(g_gpioManagerEntry); diff --git a/support/platform/src/gpio_if.c b/support/platform/src/gpio_if.c deleted file mode 100644 index eca819fc0..000000000 --- a/support/platform/src/gpio_if.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_if.h" -#include "devsvc_manager_clnt.h" -#include "gpio_core.h" -#include "hdf_base.h" -#include "hdf_log.h" - -#define HDF_LOG_TAG gpio_if - -int32_t GpioRead(uint16_t gpio, uint16_t *val) -{ - return GpioCntlrRead(GpioGetCntlr(gpio), GpioToLocal(gpio), val); -} - -int32_t GpioWrite(uint16_t gpio, uint16_t val) -{ - return GpioCntlrWrite(GpioGetCntlr(gpio), GpioToLocal(gpio), val); -} - -int32_t GpioSetDir(uint16_t gpio, uint16_t dir) -{ - return GpioCntlrSetDir(GpioGetCntlr(gpio), GpioToLocal(gpio), dir); -} - -int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) -{ - return GpioCntlrGetDir(GpioGetCntlr(gpio), GpioToLocal(gpio), dir); -} - -int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg) -{ - return GpioCntlrSetIrq(GpioGetCntlr(gpio), GpioToLocal(gpio), mode, func, arg); -} - -int32_t GpioUnSetIrq(uint16_t gpio) -{ - return GpioCntlrUnsetIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); -} - -int32_t GpioEnableIrq(uint16_t gpio) -{ - return GpioCntlrEnableIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); -} - -int32_t GpioDisableIrq(uint16_t gpio) -{ - return GpioCntlrDisableIrq(GpioGetCntlr(gpio), GpioToLocal(gpio)); -} diff --git a/support/platform/test/unittest/common/hdf_gpio_test.cpp b/support/platform/test/unittest/common/hdf_gpio_test.cpp index f6800ef96..a352b75d6 100644 --- a/support/platform/test/unittest/common/hdf_gpio_test.cpp +++ b/support/platform/test/unittest/common/hdf_gpio_test.cpp @@ -13,22 +13,12 @@ #include #include #include +#include "gpio_test.h" #include "hdf_uhdf_test.h" #include "hdf_io_service_if.h" using namespace testing::ext; -// pal gpio test case number -enum GpioTestCmd { - GPIO_TEST_SET_GET_DIR = 0, - GPIO_TEST_WRITE_READ = 1, - GPIO_TEST_IRQ_LEVEL = 2, - GPIO_TEST_IRQ_EDGE = 3, - GPIO_TEST_IRQ_THREAD = 4, - GPIO_TEST_RELIABILITY = 5, - GPIO_TEST_MAX = 6, -}; - class HdfLiteGpioTest : public testing::Test { public: static void SetUpTestCase(); @@ -65,6 +55,10 @@ HWTEST_F(HdfLiteGpioTest, GpioTestSetGetDir001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_SET_GET_DIR, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_SET_GET_DIR)); + printf("%s: exit!\n", __func__); } /** @@ -77,6 +71,10 @@ HWTEST_F(HdfLiteGpioTest, GpioTestWriteRead001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_WRITE_READ, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_WRITE_READ)); + printf("%s: exit!\n", __func__); } /** @@ -89,6 +87,10 @@ HWTEST_F(HdfLiteGpioTest, GpioTestIrqLevel001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_IRQ_LEVEL, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_IRQ_LEVEL)); + printf("%s: exit!\n", __func__); } /** @@ -101,6 +103,10 @@ HWTEST_F(HdfLiteGpioTest, GpioTestIrqEdge001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_IRQ_EDGE, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_IRQ_EDGE)); + printf("%s: exit!\n", __func__); } /** @@ -113,6 +119,10 @@ HWTEST_F(HdfLiteGpioTest, GpioTestIrqThread001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_IRQ_THREAD, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_IRQ_THREAD)); + printf("%s: exit!\n", __func__); } /** @@ -125,4 +135,8 @@ HWTEST_F(HdfLiteGpioTest, GpioTestReliability001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_PAL_GPIO_TYPE, GPIO_TEST_RELIABILITY, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); + printf("%s: kernel test done, then for user...\n", __func__); + + EXPECT_EQ(0, GpioTestExecute(GPIO_TEST_RELIABILITY)); + printf("%s: exit!\n", __func__); } diff --git a/test/unittest/platform/common/gpio_driver_test.c b/test/unittest/platform/common/gpio_driver_test.c new file mode 100644 index 000000000..e8adc017f --- /dev/null +++ b/test/unittest/platform/common/gpio_driver_test.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_test.h" +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" + +static struct GpioTestConfig g_config; + +static int32_t GpioTestDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + HDF_LOGD("%s: enter!", __func__); + + if (cmd == 0) { + if (reply == NULL) { + HDF_LOGE("%s: reply is null!", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufWriteBuffer(reply, &g_config, sizeof(g_config))) { + HDF_LOGE("%s: write reply failed", __func__); + return HDF_ERR_IO; + } + } else { + return HDF_ERR_NOT_SUPPORT; + } + + return HDF_SUCCESS; +} + +static int32_t GpioTestReadConfig(struct GpioTestConfig *config, const struct DeviceResourceNode *node) +{ + int32_t ret; + uint16_t tmp; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint16(node, "gpio", &tmp, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read gpio fail!", __func__); + return ret; + } + config->gpio = (uint16_t)tmp; + + ret = drsOps->GetUint16(node, "gpioIrq", &tmp, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read gpioIrq fail!", __func__); + return ret; + } + config->gpioIrq = (uint16_t)tmp; + + ret = drsOps->GetUint16(node, "testUserApi", &tmp, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGW("%s: read gpioIrq fail, using 0 as default", __func__); + config->testUserApi = 0; + } + config->testUserApi = (uint16_t)tmp; + + return HDF_SUCCESS; +} + +static int32_t GpioTestBind(struct HdfDeviceObject *device) +{ + int32_t ret; + static struct IDeviceIoService service; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or config is null!", __func__); + return HDF_ERR_IO; + } + + ret = GpioTestReadConfig(&g_config, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed", __func__); + return ret; + } + + service.Dispatch = GpioTestDispatch; + device->service = &service; + + return HDF_SUCCESS; +} + +static int32_t GpioTestInit(struct HdfDeviceObject *device) +{ + (void)device; + return HDF_SUCCESS; +} + +static void GpioTestRelease(struct HdfDeviceObject *device) +{ + if (device != NULL) { + device->service = NULL; + } + return; +} + +struct HdfDriverEntry g_gpioTestEntry = { + .moduleVersion = 1, + .Bind = GpioTestBind, + .Init = GpioTestInit, + .Release = GpioTestRelease, + .moduleName = "PLATFORM_GPIO_TEST", +}; +HDF_INIT(g_gpioTestEntry); diff --git a/test/unittest/platform/common/gpio_test.c b/test/unittest/platform/common/gpio_test.c index 92e5520ce..35b20cd94 100644 --- a/test/unittest/platform/common/gpio_test.c +++ b/test/unittest/platform/common/gpio_test.c @@ -7,31 +7,108 @@ */ #include "gpio_test.h" -#include "device_resource_if.h" #include "gpio_if.h" #include "hdf_base.h" -#include "hdf_device_desc.h" +#include "hdf_io_service_if.h" #include "hdf_log.h" #include "osal_irq.h" #include "osal_time.h" +#include "securec.h" #define HDF_LOG_TAG gpio_test #define GPIO_TEST_IRQ_TIMEOUT 1000 #define GPIO_TEST_IRQ_DELAY 200 -static int32_t GpioTestSetUp(struct GpioTester *tester) +static int32_t GpioTestGetConfig(struct GpioTestConfig *config) { int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = NULL; + const void *buf = NULL; + uint32_t len; + + HDF_LOGD("%s: enter!", __func__); + service = HdfIoServiceBind("GPIO_TEST"); + if (service == NULL) { + HDF_LOGE("%s: failed to bind gpio test server", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + reply = HdfSBufObtain(sizeof(*config) + sizeof(uint64_t)); + if (reply == NULL) { + HDF_LOGE("%s: failed to obtain reply", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = service->dispatcher->Dispatch(&service->object, 0, NULL, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: remote dispatch fail:%d", __func__, ret); + } + + if (!HdfSbufReadBuffer(reply, &buf, &len)) { + HDF_LOGE("%s: read buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (len != sizeof(*config)) { + HDF_LOGE("%s: config size:%u, but read size:%u!", __func__, sizeof(*config), len); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (memcpy_s(config, sizeof(*config), buf, sizeof(*config)) != EOK) { + HDF_LOGE("%s: memcpy buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + HdfSBufRecycle(reply); + HDF_LOGD("%s: exit", __func__); + HdfIoServiceRecycle(service); + return HDF_SUCCESS; +} + +static struct GpioTester *GpioTesterGet(void) +{ + int32_t ret; + static struct GpioTester tester; + static struct GpioTester *pTester; + + if (pTester != NULL) { + return pTester; + } + + ret = GpioTestGetConfig(&tester.cfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get config failed:%d", __func__, ret); + return NULL; + } + HDF_LOGI("%s: test cfg: gpio=%u, gpioIrq=%u, testUserApi=%u", __func__, + tester.cfg.gpio, tester.cfg.gpioIrq, tester.cfg.testUserApi); + + pTester = &tester; + return pTester; +} + +static int32_t GpioTestSetUp(void) +{ + int32_t ret; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); return HDF_ERR_INVALID_OBJECT; } - ret = GpioGetDir(tester->gpio, &tester->oldDir); + + ret = GpioGetDir(tester->cfg.gpio, &tester->oldDir); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get old dir fail! ret:%d", __func__, ret); return ret; } - ret = GpioRead(tester->gpio, &tester->oldVal); + ret = GpioRead(tester->cfg.gpio, &tester->oldVal); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: read old val fail! ret:%d", __func__, ret); return ret; @@ -43,13 +120,18 @@ static int32_t GpioTestSetUp(struct GpioTester *tester) return HDF_SUCCESS; } -static int32_t GpioTestTearDown(struct GpioTester *tester) +static int32_t GpioTestTearDown(void) { int ret; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); return HDF_ERR_INVALID_OBJECT; } - ret = GpioSetDir(tester->gpio, tester->oldDir); + + ret = GpioSetDir(tester->cfg.gpio, tester->oldDir); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set old dir fail! ret:%d", __func__, ret); return ret; @@ -57,7 +139,7 @@ static int32_t GpioTestTearDown(struct GpioTester *tester) if (tester->oldDir == GPIO_DIR_IN) { return HDF_SUCCESS; } - ret = GpioWrite(tester->gpio, tester->oldVal); + ret = GpioWrite(tester->cfg.gpio, tester->oldVal); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: write old val fail! ret:%d", __func__, ret); return ret; @@ -66,22 +148,29 @@ static int32_t GpioTestTearDown(struct GpioTester *tester) return HDF_SUCCESS; } -static int32_t TestCaseGpioSetGetDir(struct GpioTester *tester) +static int32_t GpioTestSetGetDir(void) { int32_t ret; uint16_t dirSet; uint16_t dirGet; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } dirSet = GPIO_DIR_OUT; dirGet = GPIO_DIR_IN; SET_GET_DIR: - ret = GpioSetDir(tester->gpio, dirSet); + ret = GpioSetDir(tester->cfg.gpio, dirSet); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set dir fail! ret:%d", __func__, ret); return ret; } - ret = GpioGetDir(tester->gpio, &dirGet); + ret = GpioGetDir(tester->cfg.gpio, &dirGet); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get dir fail! ret:%d", __func__, ret); return ret; @@ -99,13 +188,20 @@ SET_GET_DIR: return HDF_SUCCESS; } -static int32_t TestCaseGpioWriteRead(struct GpioTester *tester) +static int32_t GpioTestWriteRead(void) { int32_t ret; uint16_t valWrite; uint16_t valRead; + struct GpioTester *tester = NULL; - ret = GpioSetDir(tester->gpio, GPIO_DIR_OUT); + tester = GpioTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + ret = GpioSetDir(tester->cfg.gpio, GPIO_DIR_OUT); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set dir fail! ret:%d", __func__, ret); return ret; @@ -114,12 +210,12 @@ static int32_t TestCaseGpioWriteRead(struct GpioTester *tester) valRead = GPIO_VAL_HIGH; WRITE_READ_VAL: - ret = GpioWrite(tester->gpio, valWrite); + ret = GpioWrite(tester->cfg.gpio, valWrite); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: write val:%u fail! ret:%d", __func__, valWrite, ret); return ret; } - ret = GpioRead(tester->gpio, &valRead); + ret = GpioRead(tester->cfg.gpio, &valRead); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: read fail! ret:%d", __func__, ret); return ret; @@ -137,7 +233,7 @@ WRITE_READ_VAL: return HDF_SUCCESS; } -static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data) +static int32_t GpioTestIrqHandler(uint16_t gpio, void *data) { struct GpioTester *tester = (struct GpioTester *)data; @@ -149,7 +245,7 @@ static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data) return HDF_FAILURE; } -static inline void TestHelperGpioInverse(uint16_t gpio, uint16_t mode) +static inline void GpioTestHelperInversePin(uint16_t gpio, uint16_t mode) { uint16_t dir = 0; uint16_t valRead = 0; @@ -161,20 +257,20 @@ static inline void TestHelperGpioInverse(uint16_t gpio, uint16_t mode) HDF_LOGD("%s, gpio:%u, val:%u, dir:%u, mode:%x", __func__, gpio, valRead, dir, mode); } -static int32_t TestCaseGpioIrq(struct GpioTester *tester, uint16_t mode, bool inverse) +static int32_t GpioTestIrqSharedFunc(struct GpioTester *tester, uint16_t mode, bool inverse) { int32_t ret; uint32_t timeout; - ret = GpioSetIrq(tester->gpioIrq, mode, TestCaseGpioIrqHandler, (void *)tester); + ret = GpioSetIrq(tester->cfg.gpioIrq, mode, GpioTestIrqHandler, (void *)tester); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set irq fail! ret:%d", __func__, ret); return ret; } - ret = GpioEnableIrq(tester->gpioIrq); + ret = GpioEnableIrq(tester->cfg.gpioIrq); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: enable irq fail! ret:%d", __func__, ret); - (void)GpioUnSetIrq(tester->gpioIrq); + (void)GpioUnSetIrq(tester->cfg.gpioIrq); return ret; } @@ -182,11 +278,11 @@ static int32_t TestCaseGpioIrq(struct GpioTester *tester, uint16_t mode, bool in timeout += GPIO_TEST_IRQ_DELAY) { if (inverse) { // maybe can make a inverse ... - TestHelperGpioInverse(tester->gpioIrq, mode); + GpioTestHelperInversePin(tester->cfg.gpioIrq, mode); } OsalMSleep(GPIO_TEST_IRQ_DELAY); } - (void)GpioUnSetIrq(tester->gpioIrq); + (void)GpioUnSetIrq(tester->cfg.gpioIrq); #if defined(_LINUX_USER_) || defined(__KERNEL__) if (inverse) { @@ -195,69 +291,99 @@ static int32_t TestCaseGpioIrq(struct GpioTester *tester, uint16_t mode, bool in } #endif if (tester->irqCnt <= 0) { - HDF_LOGE("%s: set mode:%x on %u failed", __func__, mode, tester->gpioIrq); + HDF_LOGE("%s: set mode:%x on %u failed", __func__, mode, tester->cfg.gpioIrq); return HDF_FAILURE; } return HDF_SUCCESS; } -static int32_t TestCaseGpioIrqLevel(struct GpioTester *tester) +static int32_t GpioTestIrqLevel(void) { - (void)tester; return HDF_SUCCESS; } -static int32_t TestCaseGpioIrqEdge(struct GpioTester *tester) +static int32_t GpioTestIrqEdge(void) { +#if defined(_LINUX_USER_) || defined(__USER__) + (void)GpioTestIrqSharedFunc; + return HDF_SUCCESS; +#else uint16_t mode; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } /* set dir to out for self trigger on liteos */ #if defined(_LINUX_USER_) || defined(__KERNEL__) - (void)GpioSetDir(tester->gpioIrq, GPIO_DIR_IN); + (void)GpioSetDir(tester->cfg.gpioIrq, GPIO_DIR_IN); #else - (void)GpioSetDir(tester->gpioIrq, GPIO_DIR_OUT); + (void)GpioSetDir(tester->cfg.gpioIrq, GPIO_DIR_OUT); #endif mode = GPIO_IRQ_TRIGGER_FALLING | GPIO_IRQ_TRIGGER_RISING; - return TestCaseGpioIrq(tester, mode, true); + return GpioTestIrqSharedFunc(tester, mode, true); +#endif } -int32_t TestCaseGpioIrqThread(struct GpioTester *tester) +int32_t GpioTestIrqThread(void) { +#if defined(_LINUX_USER_) || defined(__USER__) + return HDF_SUCCESS; +#else uint16_t mode; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } + /* set dir to out for self trigger on liteos */ #if defined(_LINUX_USER_) || defined(__KERNEL__) - (void)GpioSetDir(tester->gpioIrq, GPIO_DIR_IN); + (void)GpioSetDir(tester->cfg.gpioIrq, GPIO_DIR_IN); #else - (void)GpioSetDir(tester->gpioIrq, GPIO_DIR_OUT); + (void)GpioSetDir(tester->cfg.gpioIrq, GPIO_DIR_OUT); #endif mode = GPIO_IRQ_TRIGGER_FALLING | GPIO_IRQ_TRIGGER_RISING | GPIO_IRQ_USING_THREAD; - return TestCaseGpioIrq(tester, mode, true); + return GpioTestIrqSharedFunc(tester, mode, true); +#endif } -static int32_t TestCaseGpioReliability(struct GpioTester *tester) +static int32_t GpioTestReliability(void) { uint16_t val = 0; + struct GpioTester *tester = NULL; + + tester = GpioTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } (void)GpioWrite(-1, val); /* invalid gpio number */ - (void)GpioWrite(tester->gpio, -1); /* invalid gpio value */ + (void)GpioWrite(tester->cfg.gpio, -1); /* invalid gpio value */ (void)GpioRead(-1, &val); /* invalid gpio number */ - (void)GpioRead(tester->gpio, NULL); /* invalid pointer */ + (void)GpioRead(tester->cfg.gpio, NULL); /* invalid pointer */ (void)GpioSetDir(-1, val); /* invalid gpio number */ - (void)GpioSetDir(tester->gpio, -1); /* invalid value */ + (void)GpioSetDir(tester->cfg.gpio, -1); /* invalid value */ (void)GpioGetDir(-1, &val); /* invalid gpio number */ - (void)GpioGetDir(tester->gpio, NULL); /* invalid pointer */ + (void)GpioGetDir(tester->cfg.gpio, NULL); /* invalid pointer */ /* invalid gpio number */ - (void)GpioSetIrq(-1, OSAL_IRQF_TRIGGER_RISING, TestCaseGpioIrqHandler, (void *)tester); + (void)GpioSetIrq(-1, OSAL_IRQF_TRIGGER_RISING, GpioTestIrqHandler, (void *)tester); /* invalid irq mode */ - (void)GpioSetIrq(tester->gpioIrq, -1, TestCaseGpioIrqHandler, (void *)tester); + (void)GpioSetIrq(tester->cfg.gpioIrq, -1, GpioTestIrqHandler, (void *)tester); /* invalid irq handler */ - (void)GpioSetIrq(tester->gpioIrq, OSAL_IRQF_TRIGGER_RISING, NULL, (void *)tester); + (void)GpioSetIrq(tester->cfg.gpioIrq, OSAL_IRQF_TRIGGER_RISING, NULL, (void *)tester); /* invalid irq data */ - (void)GpioSetIrq(tester->gpioIrq, OSAL_IRQF_TRIGGER_RISING, TestCaseGpioIrqHandler, NULL); + (void)GpioSetIrq(tester->cfg.gpioIrq, OSAL_IRQF_TRIGGER_RISING, GpioTestIrqHandler, NULL); (void)GpioUnSetIrq(-1); /* invalid gpio number */ @@ -268,129 +394,73 @@ static int32_t TestCaseGpioReliability(struct GpioTester *tester) return HDF_SUCCESS; } -static int32_t GpioTestByCmd(struct GpioTester *tester, int32_t cmd) -{ - int32_t i; - - if (cmd == GPIO_TEST_SET_GET_DIR) { - return TestCaseGpioSetGetDir(tester); - } else if (cmd == GPIO_TEST_WRITE_READ) { - return TestCaseGpioWriteRead(tester); - } else if (cmd == GPIO_TEST_IRQ_LEVEL) { - return TestCaseGpioIrqLevel(tester); - } else if (cmd == GPIO_TEST_IRQ_EDGE) { - return TestCaseGpioIrqEdge(tester); - } else if (cmd == GPIO_TEST_IRQ_THREAD) { - return TestCaseGpioIrqThread(tester); - } else if (cmd == GPIO_TEST_RELIABILITY) { - return TestCaseGpioReliability(tester); - } +struct GpioTestEntry { + int cmd; + int32_t (*func)(void); + const char *name; +}; - for (i = 0; i < GPIO_TEST_MAX; i++) { - if (GpioTestByCmd(tester, i) != HDF_SUCCESS) { - tester->fails++; - } - } - HDF_LOGE("%s: **********PASS:%u FAIL:%u**************\n\n", - __func__, tester->total - tester->fails, tester->fails); - return (tester->fails > 0) ? HDF_FAILURE : HDF_SUCCESS; -} +static struct GpioTestEntry g_entry[] = { + { GPIO_TEST_SET_GET_DIR, GpioTestSetGetDir, "GpioTestSetGetDir" }, + { GPIO_TEST_WRITE_READ, GpioTestWriteRead, "GpioTestWriteRead" }, + { GPIO_TEST_IRQ_LEVEL, GpioTestIrqLevel, "GpioTestIrqLevel" }, + { GPIO_TEST_IRQ_EDGE, GpioTestIrqEdge, "GpioTestIrqEdge" }, + { GPIO_TEST_IRQ_THREAD, GpioTestIrqThread, "GpioTestIrqThread" }, + { GPIO_TEST_RELIABILITY, GpioTestReliability, "GpioTestReliability" }, +}; -static int32_t GpioTestDoTest(struct GpioTester *tester, int32_t cmd) +int32_t GpioTestExecute(int cmd) { - int32_t ret; + uint32_t i; + int32_t ret = HDF_ERR_NOT_SUPPORT; +#if defined(_LINUX_USER_) || defined(__USER__) + struct GpioTester *tester = GpioTesterGet(); if (tester == NULL) { - return HDF_ERR_INVALID_OBJECT; + HDF_LOGI("%s: tester is null", __func__); + return HDF_SUCCESS; } - - ret = GpioTestSetUp(tester); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: setup fail!", __func__); - return ret; + if (tester->cfg.testUserApi == 0) { + HDF_LOGI("%s: do not test user api", __func__); + return HDF_SUCCESS; } +#endif - ret = GpioTestByCmd(tester, cmd); - - (void)GpioTestTearDown(tester); - return ret; -} - -static int32_t GpioTestReadConfig(struct GpioTester *tester, const struct DeviceResourceNode *node) -{ - int32_t ret; - uint32_t tmp; - struct DeviceResourceIface *drsOps = NULL; + for (i = 0; i < sizeof(g_entry) / sizeof(g_entry[0]); i++) { + if (g_entry[i].cmd != cmd || g_entry[i].func == NULL) { + continue; + } + ret = GpioTestSetUp(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: setup failed", __func__); + return ret; + } - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return HDF_FAILURE; - } + ret = g_entry[i].func(); - ret = drsOps->GetUint32(node, "gpio", &tmp, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read gpio fail!", __func__); - return ret; + (void)GpioTestTearDown(); + break; } - tester->gpio = (uint16_t)tmp; - ret = drsOps->GetUint32(node, "gpioIrq", &tmp, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read gpioIrq fail!", __func__); - return ret; + if (ret == HDF_ERR_NOT_SUPPORT) { + HDF_LOGE("%s: cmd:%d not supportted", __func__, cmd); } - tester->gpioIrq = (uint16_t)tmp; - tester->doTest = GpioTestDoTest; - return HDF_SUCCESS; + HDF_LOGI("[%s][======cmd:%d====ret:%d======]", __func__, cmd, ret); + return ret; } -static int32_t GpioTestBind(struct HdfDeviceObject *device) +void GpioTestExecuteAll(void) { + int32_t i; int32_t ret; - static struct GpioTester tester; + int32_t fails = 0; - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is null!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - - ret = GpioTestReadConfig(&tester, device->property); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read config fail!", __func__); - return ret; + for (i = 0; i < GPIO_TEST_MAX; i++) { + ret = GpioTestExecute(i); + fails += (ret != HDF_SUCCESS) ? 1 : 0; } - tester.total = GPIO_TEST_MAX; - device->service = &tester.service; - -#ifdef GPIO_TEST_ON_INIT - HDF_LOGE("%s: test on init!", __func__); - tester.doTest(&tester, -1); -#endif - return HDF_SUCCESS; -} - -static int32_t GpioTestInit(struct HdfDeviceObject *device) -{ - (void)device; - return HDF_SUCCESS; -} - -static void GpioTestRelease(struct HdfDeviceObject *device) -{ - if (device != NULL) { - device->service = NULL; - } - return; + HDF_LOGE("%s: **********PASS:%d FAIL:%d************\n\n", + __func__, GPIO_TEST_MAX - fails, fails); } - -struct HdfDriverEntry g_gpioTestEntry = { - .moduleVersion = 1, - .Bind = GpioTestBind, - .Init = GpioTestInit, - .Release = GpioTestRelease, - .moduleName = "PLATFORM_GPIO_TEST", -}; -HDF_INIT(g_gpioTestEntry); diff --git a/test/unittest/platform/common/gpio_test.h b/test/unittest/platform/common/gpio_test.h index 6d8b19406..f31f766c6 100644 --- a/test/unittest/platform/common/gpio_test.h +++ b/test/unittest/platform/common/gpio_test.h @@ -9,7 +9,13 @@ #ifndef GPIO_TEST_H #define GPIO_TEST_H -#include "hdf_device_desc.h" +#include "hdf_base.h" + +#ifdef __cplusplus +extern "C" { +#endif + +int32_t GpioTestExecute(int cmd); enum GpioTestCmd { GPIO_TEST_SET_GET_DIR = 0, @@ -21,12 +27,14 @@ enum GpioTestCmd { GPIO_TEST_MAX = 6, }; -struct GpioTester { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - int32_t (*doTest)(struct GpioTester *tester, int32_t cmd); +struct GpioTestConfig { uint16_t gpio; uint16_t gpioIrq; + uint16_t testUserApi; +}; + +struct GpioTester { + struct GpioTestConfig cfg; uint16_t oldDir; uint16_t oldVal; uint16_t irqCnt; @@ -35,9 +43,8 @@ struct GpioTester { uint32_t irqTimeout; }; -static inline struct GpioTester *GpioTesterGet(void) -{ - return (struct GpioTester *)DevSvcManagerClntGetService("GPIO_TEST"); +#ifdef __cplusplus } +#endif #endif /* GPIO_TEST_H */ diff --git a/test/unittest/platform/hdf_gpio_entry_test.c b/test/unittest/platform/hdf_gpio_entry_test.c index 9cd7adbbb..82952e171 100644 --- a/test/unittest/platform/hdf_gpio_entry_test.c +++ b/test/unittest/platform/hdf_gpio_entry_test.c @@ -15,19 +15,10 @@ int32_t HdfGpioTestEntry(HdfTestMsg *msg) { - struct GpioTester *tester = NULL; - if (msg == NULL) { return HDF_FAILURE; } - tester = GpioTesterGet(); - if (tester == NULL) { - HDF_LOGE("%s: tester is NULL!\n", __func__); - return HDF_FAILURE; - } - - msg->result = tester->doTest(tester, msg->subCmd); - + msg->result = GpioTestExecute(msg->subCmd); return HDF_SUCCESS; } -- Gitee From 1981b62cc7ee7a56e5ebc82cb663e60f674aedef Mon Sep 17 00:00:00 2001 From: JasonYujia Date: Wed, 13 Oct 2021 15:29:48 +0800 Subject: [PATCH 076/272] usb 1013 commit Signed-off-by: JasonYujia Change-Id: I362a4479ba87bc54d7bfa1d9fb39f93bb4534587 --- model/usb/src/usb_ddk_pnp_loader.c | 88 ++++++++++++++++++------------ 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index 1ce3077cc..65e39e7a7 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -39,27 +39,27 @@ static struct HdfSBuf *UsbDdkPnpLoaderBufCreate(const char *moduleName, if (!UsbPnpManagerWriteModuleName(pnpData, moduleName)) { HDF_LOGE("%s: write moduleName failed!", __func__); - goto out; + goto OUT; } if (!HdfSbufWriteString(pnpData, serviceName)) { HDF_LOGE("%s: write service name failed!", __func__); - goto out; + goto OUT; } if (!HdfSbufWriteString(pnpData, deviceMatchAttr)) { HDF_LOGE("%s: write deviceMatchAttr failed!", __func__); - goto out; + goto OUT; } if (!HdfSbufWriteBuffer(pnpData, (const void *)(&serviceInfo), serviceInfo.length)) { HDF_LOGE("%s: write privateData failed!", __func__); - goto out; + goto OUT; } return pnpData; -out: +OUT: HdfSBufRecycle(pnpData); return NULL; @@ -125,64 +125,84 @@ static void UsbDdkPnpLoaderMatchHandle(const struct UsbPnpNotifyMatchInfoTable * } } -static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *dev, - int8_t index, struct UsbPnpMatchIdTable *id, bool flag) +static bool UsbDdkPnpLoaderMatchFlagFirst(struct UsbPnpMatchIdTable *id) { int32_t i; bool ret = true; uint32_t offset; if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS) { - for (i = 0, offset = 0; i < id->interfaceClassLength; i++, offset = i) { + for (i = 0; i < id->interfaceClassLength; i++) { + offset = i; if (!((id->interfaceClassMask >> offset) & 0x01)) { break; } } if (i < id->interfaceClassLength) { ret = false; - goto out; + goto OUT; } } if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_SUBCLASS) { - for (i = 0, offset = 0; i < id->interfaceSubClassLength; i++, offset = i) { + for (i = 0; i < id->interfaceSubClassLength; i++) { + offset = i; if (!((id->interfaceSubClassMask >> offset) & 0x01)) { break; } } if (i < id->interfaceSubClassLength) { ret = false; - goto out; + goto OUT; } } + ret = true; + +OUT: + return ret; +} + +static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *dev, + int8_t index, struct UsbPnpMatchIdTable *id, bool flag) +{ + int32_t i; + bool ret = true; + uint32_t offset; + + if (UsbDdkPnpLoaderMatchFlagFirst(id) == false) { + goto OUT; + } + if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_PROTOCOL) { - for (i = 0, offset = 0; i < id->interfaceProtocolLength; i++, offset = i) { + for (i = 0; i < id->interfaceProtocolLength; i++) { + offset = i; if (!((id->interfaceProtocolMask >> offset) & 0x01)) { break; } } if (i < id->interfaceProtocolLength) { ret = false; - goto out; + goto OUT; } } if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_NUMBER) { - for (i = 0, offset = 0; i < id->interfaceLength; i++, offset = i) { + for (i = 0; i < id->interfaceLength; i++) { + offset = i; if (!((id->interfaceMask >> offset) & 0x01)) { break; } } if (i < id->interfaceLength) { ret = false; - goto out; + goto OUT; } } ret = true; -out: +OUT: UsbDdkPnpLoaderMatchHandle(dev, index, id, flag); return ret; @@ -454,26 +474,26 @@ static struct UsbPnpMatchIdTable **UsbDdkPnpLoaderParseTableList( idTable[count] = (struct UsbPnpMatchIdTable *)OsalMemCalloc(sizeof(struct UsbPnpMatchIdTable)); if (idTable[count] == NULL) { HDF_LOGE("%s: OsalMemCalloc failure!", __func__); - goto out; + goto OUT; } ret = devResIface->GetStringArrayElem(node, "idTableList", count, &idTableName, NULL); if (ret != HDF_SUCCESS) { - goto out; + goto OUT; } tableNode = devResIface->GetChildNode(node, idTableName); if (tableNode == NULL) { HDF_LOGE("%s: tableNode is NULL!", __func__); - goto out; + goto OUT; } if (UsbDdkPnpLoaderParseIdTable(tableNode, devResIface, idTable[count]) != HDF_SUCCESS) { HDF_LOGE("%s: UsbDdkPnpLoaderParseIdTable failure!", __func__); - goto out; + goto OUT; } } return idTable; -out: +OUT: while ((--count) >= 0) { OsalMemFree(idTable[count]); } @@ -691,7 +711,7 @@ static int UsbDdkPnpLoaderrAddPnpDevice(const struct IDevmgrService *devmgrSvc, if (pnpData == NULL) { ret = HDF_FAILURE; HDF_LOGE("%s: UsbDdkPnpLoaderBufCreate faile", __func__); - goto error; + goto ERROR; } ret = UsbDdkPnpLoaderDispatchPnpDevice(devmgrSvc, pnpData, true); @@ -703,18 +723,18 @@ static int UsbDdkPnpLoaderrAddPnpDevice(const struct IDevmgrService *devmgrSvc, if (deviceListTable == NULL) { ret = HDF_ERR_INVALID_OBJECT; HDF_LOGE("%s:%d UsbDdkPnpLoaderAddInterface faile", __func__, __LINE__); - goto error; + goto ERROR; } deviceListTable->status = USB_PNP_ADD_STATUS; } else { ret = UsbDdkPnpLoaderDeviceListAdd(infoTable, idTable); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:%d UsbDdkPnpLoaderDeviceListAdd faile", __func__, __LINE__); - goto error; + goto ERROR; } } } -error: +ERROR: HdfSBufRecycle(pnpData); return ret; } @@ -772,12 +792,12 @@ static int UsbDdkPnpLoaderRemoveHandle(const struct IDevmgrService *devmgrSvc, if (ret != HDF_SUCCESS) { HDF_LOGE("%s:%d UsbDdkPnpLoaderDispatchPnpDevice faile ret=%d", __func__, __LINE__, ret); - goto error; + goto ERROR; } deviceListTablePos->status = USB_PNP_REMOVE_STATUS; } -error: +ERROR: HdfSBufRecycle(pnpData); return ret; } @@ -891,30 +911,30 @@ static int UsbDdkPnpLoaderEventSend(const struct HdfIoService *serv, const char if (reply == NULL) { ret = HDF_DEV_ERR_NO_MEMORY; HDF_LOGE("%s: fail to obtain sbuf reply", __func__); - goto out; + goto OUT; } if (!HdfSbufWriteString(data, eventData)) { ret = HDF_FAILURE; HDF_LOGE("%s: fail to write sbuf", __func__); - goto out; + goto OUT; } ret = serv->dispatcher->Dispatch((struct HdfObject *)&serv->object, USB_PNP_NOTIFY_REPORT_INTERFACE, data, reply); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: fail to send serivice call, ret=%d", __func__, ret); - goto out; + goto OUT; } if (!HdfSbufReadInt32(reply, &replyData)) { ret = HDF_ERR_INVALID_OBJECT; HDF_LOGE("%s: fail to get service call reply", __func__); - goto out; + goto OUT; } HDF_LOGI("%s:%d get reply is 0x%x", __func__, __LINE__, replyData); -out: +OUT: HdfSBufRecycle(data); HdfSBufRecycle(reply); @@ -1003,10 +1023,10 @@ int UsbDdkPnpLoaderEventHandle(void) status = UsbDdkPnpLoaderEventSend(usbPnpServ, "USB PNP Handle Info"); if (status != HDF_SUCCESS) { HDF_LOGE("UsbDdkPnpLoaderEventSend faile status=%d", status); - goto error; + goto ERROR; } return status; -error: +ERROR: idTable = g_usbPnpMatchIdTable[0]; while (idTable != NULL) { tableCount++; -- Gitee From 976c681b6f66fe644d2c43d99a73c3bbc941445c Mon Sep 17 00:00:00 2001 From: lzl Date: Thu, 14 Oct 2021 11:43:47 +0000 Subject: [PATCH 077/272] HDMI Framework develop Signed-off-by: lzl --- include/platform/hdmi_if.h | 745 +++++++ support/platform/include/hdmi/hdmi_cec.h | 1712 +++++++++++++++++ support/platform/include/hdmi/hdmi_common.h | 348 ++++ support/platform/include/hdmi/hdmi_core.h | 388 ++++ support/platform/include/hdmi/hdmi_ddc.h | 77 + support/platform/include/hdmi/hdmi_dfm.h | 162 ++ support/platform/include/hdmi/hdmi_dispatch.h | 38 + support/platform/include/hdmi/hdmi_edid.h | 635 ++++++ support/platform/include/hdmi/hdmi_event.h | 51 + support/platform/include/hdmi/hdmi_frl.h | 212 ++ support/platform/include/hdmi/hdmi_hdcp.h | 214 +++ support/platform/include/hdmi/hdmi_hdr.h | 65 + .../platform/include/hdmi/hdmi_infoframe.h | 466 +++++ support/platform/include/hdmi/hdmi_ncts.h | 41 + support/platform/include/hdmi/hdmi_scdc.h | 321 ++++ support/platform/src/hdmi/hdmi_cec.c | 1649 ++++++++++++++++ support/platform/src/hdmi/hdmi_common.c | 345 ++++ support/platform/src/hdmi/hdmi_core.c | 1415 ++++++++++++++ support/platform/src/hdmi/hdmi_ddc.c | 45 + support/platform/src/hdmi/hdmi_dfm.c | 279 +++ support/platform/src/hdmi/hdmi_dispatch.c | 265 +++ support/platform/src/hdmi/hdmi_edid.c | 1320 +++++++++++++ support/platform/src/hdmi/hdmi_event.c | 266 +++ support/platform/src/hdmi/hdmi_frl.c | 869 +++++++++ support/platform/src/hdmi/hdmi_hdcp.c | 463 +++++ support/platform/src/hdmi/hdmi_hdr.c | 273 +++ support/platform/src/hdmi/hdmi_if.c | 494 +++++ support/platform/src/hdmi/hdmi_infoframe.c | 806 ++++++++ support/platform/src/hdmi/hdmi_ncts.c | 123 ++ support/platform/src/hdmi/hdmi_scdc.c | 384 ++++ 30 files changed, 14471 insertions(+) create mode 100644 include/platform/hdmi_if.h create mode 100644 support/platform/include/hdmi/hdmi_cec.h create mode 100644 support/platform/include/hdmi/hdmi_common.h create mode 100644 support/platform/include/hdmi/hdmi_core.h create mode 100644 support/platform/include/hdmi/hdmi_ddc.h create mode 100644 support/platform/include/hdmi/hdmi_dfm.h create mode 100644 support/platform/include/hdmi/hdmi_dispatch.h create mode 100644 support/platform/include/hdmi/hdmi_edid.h create mode 100644 support/platform/include/hdmi/hdmi_event.h create mode 100644 support/platform/include/hdmi/hdmi_frl.h create mode 100644 support/platform/include/hdmi/hdmi_hdcp.h create mode 100644 support/platform/include/hdmi/hdmi_hdr.h create mode 100644 support/platform/include/hdmi/hdmi_infoframe.h create mode 100644 support/platform/include/hdmi/hdmi_ncts.h create mode 100644 support/platform/include/hdmi/hdmi_scdc.h create mode 100644 support/platform/src/hdmi/hdmi_cec.c create mode 100644 support/platform/src/hdmi/hdmi_common.c create mode 100644 support/platform/src/hdmi/hdmi_core.c create mode 100644 support/platform/src/hdmi/hdmi_ddc.c create mode 100644 support/platform/src/hdmi/hdmi_dfm.c create mode 100644 support/platform/src/hdmi/hdmi_dispatch.c create mode 100644 support/platform/src/hdmi/hdmi_edid.c create mode 100644 support/platform/src/hdmi/hdmi_event.c create mode 100644 support/platform/src/hdmi/hdmi_frl.c create mode 100644 support/platform/src/hdmi/hdmi_hdcp.c create mode 100644 support/platform/src/hdmi/hdmi_hdr.c create mode 100644 support/platform/src/hdmi/hdmi_if.c create mode 100644 support/platform/src/hdmi/hdmi_infoframe.c create mode 100644 support/platform/src/hdmi/hdmi_ncts.c create mode 100644 support/platform/src/hdmi/hdmi_scdc.c diff --git a/include/platform/hdmi_if.h b/include/platform/hdmi_if.h new file mode 100644 index 000000000..88cf4f872 --- /dev/null +++ b/include/platform/hdmi_if.h @@ -0,0 +1,745 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +/** + * @addtogroup HDMI + * @{ + * + * @brief Declares standard APIs of basic High-Definition Multimedia Interface (HDMI) capabilities. + * + * You can use this module to access the HDMI and enable the driver to operate an HDMI sink device. + * These capabilities include start and stop tramnsfer on HDMI, setting some attributes, + * and read sink device's EDID data. + * + * @since 1.0 + */ + +/** + * @file hdmi_if.h + * + * @brief Declares the standard HDMI interface functions. + * + * @since 1.0 + */ + +#ifndef HDMI_IF_H +#define HDMI_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @brief Indicates that maximum length of an HDMI sink device's EDID is 512 bytes. + * + * @since 1.0 + */ +#define HDMI_EDID_MAX_LEN 512 + +/** + * @brief Enumerates deep color, + * see the section 6.2.4 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiDeepColor { + HDMI_DEEP_COLOR_24BITS = 0, + HDMI_DEEP_COLOR_30BITS = 1, + HDMI_DEEP_COLOR_36BITS = 2, + HDMI_DEEP_COLOR_48BITS = 3, + HDMI_DEEP_COLOR_OFF = 0xff, + HDMI_DEEP_COLOR_BUTT, +}; + +/** + * @brief Enumerates video bit depth + * see the section 6.6 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiVideoBitDepth { + HDMI_VIDEO_BIT_DEPTH_8 = 0, + HDMI_VIDEO_BIT_DEPTH_10 = 1, + HDMI_VIDEO_BIT_DEPTH_12 = 2, + HDMI_VIDEO_BIT_DEPTH_16 = 3, + HDMI_VIDEO_BIT_DEPTH_OFF, +}; + +/** + * @brief Enumerates color space, + * see the section 6 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiColorSpace { + HDMI_COLOR_SPACE_RGB = 0, + HDMI_COLOR_SPACE_YCBCR422 = 1, + HDMI_COLOR_SPACE_YCBCR444 = 2, + HDMI_COLOR_SPACE_YCBCR420 = 3, + HDMI_COLOR_SPACE_BUTT, +}; + +/** + * @brief Enumerates colorimetry, see the section 6.7 of HDMI Specification 1.4 and + * the section 7.2 of HDMI Specification 2.0 for details. + * + * @since 1.0 + */ +enum HdmiColorimetry { + HDMI_COLORIMETRY_NO_DATA = 0, + HDMI_COLORIMETRY_ITU601 = 1, + HDMI_COLORIMETRY_ITU709 = 2, + HDMI_COLORIMETRY_EXTENDED = 3, +}; + +/** + * @brief Enumerates extended colorimetry, see the section 6.7 of HDMI Specification 1.4 and + * the section 7.2 of HDMI Specification 2.0 for details. + * + * @since 1.0 + */ +enum HdmiExtendedColorimetry { + HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0, + HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1, + HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2, + HDMI_EXTENDED_COLORIMETRY_OPYCC_601 = 3, + HDMI_EXTENDED_COLORIMETRY_OPRGB = 4, + HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM = 5, + HDMI_EXTENDED_COLORIMETRY_BT2020 = 6, + HDMI_EXTENDED_COLORIMETRY_ADDITIONAL = 7, + HDMI_EXTENDED_COLORIMETRY_BUTT, +}; + +/** + * @brief Enumerates quantization range, see the section 6.6 of HDMI Specification 1.4 and + * the section 7.3 of HDMI Specification 2.0 for details. + * + * @since 1.0 + */ +enum HdmiQuantizationRange { + HDMI_QUANTIZATION_RANGE_DEFAULT = 0, + HDMI_QUANTIZATION_RANGE_LIMITED = 1, + HDMI_QUANTIZATION_RANGE_FULL = 2, + HDMI_QUANTIZATION_RANGE_BUTT, +}; + +/** + * @brief Enumerates YCC quantization range, see the section 6.6 of HDMI Specification 1.4 and + * the section 7.3 of HDMI Specification 2.0 for details. + * + * @since 1.0 + */ +enum HdmiYccQuantizationRange { + HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0, + HDMI_YCC_QUANTIZATION_RANGE_FULL = 1, + HDMI_YCC_QUANTIZATION_RANGE_BUTT, +}; + +/** + * @brief Enumerates video 3d structure, + * see the section 8.2.3 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiVideo3dStructure { + HDMI_VS_VIDEO_3D_FRAME_PACKING = 0, + HDMI_VS_VIDEO_3D_FIELD_ALTERNATIVE = 1, + HDMI_VS_VIDEO_3D_LINE_ALTERNATIVE = 2, + HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_FULL = 3, + HDMI_VS_VIDEO_3D_L_DEPTH = 4, + HDMI_VS_VIDEO_3D_L_DEPTH_GFX_GFX_DEPTH = 5, + HDMI_VS_VIDEO_3D_TOP_AND_BOTTOM = 6, + HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_HALF = 8, + HDMI_VS_VIDEO_3D_BUTT, +}; + +/** + * @brief Enumerates video timing, + * see the section 8.2.3 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiVideoTiming { + HDMI_VIDEO_TIMING_NONE = 0, + HDMI_VIDEO_TIMING_640X480P60 = 1, + HDMI_VIDEO_TIMING_720X480P60 = 2, + HDMI_VIDEO_TIMING_720X480P120 = 3, + HDMI_VIDEO_TIMING_720X480P240 = 4, + HDMI_VIDEO_TIMING_720X576P50 = 5, + HDMI_VIDEO_TIMING_720X576P100 = 6, + HDMI_VIDEO_TIMING_720X576P200 = 7, + HDMI_VIDEO_TIMING_1280X720P24 = 8, + HDMI_VIDEO_TIMING_1280X720P25 = 9, + HDMI_VIDEO_TIMING_1280X720P30 = 10, + HDMI_VIDEO_TIMING_1280X720P48 = 11, + HDMI_VIDEO_TIMING_1280X720P50 = 12, + HDMI_VIDEO_TIMING_1280X720P60 = 13, + HDMI_VIDEO_TIMING_1280X720P100 = 14, + HDMI_VIDEO_TIMING_1280X720P120 = 15, + HDMI_VIDEO_TIMING_1440X240P60 = 16, + HDMI_VIDEO_TIMING_1440X288P50 = 17, + HDMI_VIDEO_TIMING_1440X480I60 = 18, + HDMI_VIDEO_TIMING_1440X480P60 = 19, + HDMI_VIDEO_TIMING_1440X480I120 = 20, + HDMI_VIDEO_TIMING_1440X480I240 = 21, + HDMI_VIDEO_TIMING_1440X576I50 = 22, + HDMI_VIDEO_TIMING_1440X576P50 = 23, + HDMI_VIDEO_TIMING_1440X576I60 = 24, + HDMI_VIDEO_TIMING_1440X576I100 = 25, + HDMI_VIDEO_TIMING_1440X576I200 = 26, + HDMI_VIDEO_TIMING_2880X288P50 = 27, + HDMI_VIDEO_TIMING_2880X480I60 = 28, + HDMI_VIDEO_TIMING_2880X480P60 = 29, + HDMI_VIDEO_TIMING_2880X240I60 = 30, + HDMI_VIDEO_TIMING_2880X576I50 = 31, + HDMI_VIDEO_TIMING_2880X576P50 = 32, + HDMI_VIDEO_TIMING_1680X720P24 = 33, + HDMI_VIDEO_TIMING_1680X720P25 = 34, + HDMI_VIDEO_TIMING_1680X720P30 = 35, + HDMI_VIDEO_TIMING_1680X720P48 = 36, + HDMI_VIDEO_TIMING_1680X720P50 = 37, + HDMI_VIDEO_TIMING_1680X720P60 = 38, + HDMI_VIDEO_TIMING_1680X720P100 = 39, + HDMI_VIDEO_TIMING_1680X720P120 = 40, + HDMI_VIDEO_TIMING_2560X1080P24 = 41, + HDMI_VIDEO_TIMING_2560X1080P25 = 42, + HDMI_VIDEO_TIMING_2560X1080P30 = 43, + HDMI_VIDEO_TIMING_2560X1080P48 = 44, + HDMI_VIDEO_TIMING_2560X1080P50 = 45, + HDMI_VIDEO_TIMING_2560X1080P60 = 46, + HDMI_VIDEO_TIMING_2560X1080P100 = 47, + HDMI_VIDEO_TIMING_2560X1080P120 = 48, + HDMI_VIDEO_TIMING_1920X1080I60 = 49, + HDMI_VIDEO_TIMING_1920X1080P60 = 50, + HDMI_VIDEO_TIMING_1920X1080I50 = 51, + HDMI_VIDEO_TIMING_1920X1080P50 = 52, + HDMI_VIDEO_TIMING_1920X1080P24 = 53, + HDMI_VIDEO_TIMING_1920X1080P25 = 54, + HDMI_VIDEO_TIMING_1920X1080P30 = 55, + HDMI_VIDEO_TIMING_1920X1080P48 = 56, + HDMI_VIDEO_TIMING_1920X1080I100 = 57, + HDMI_VIDEO_TIMING_1920X1080I120 = 58, + HDMI_VIDEO_TIMING_1920X1080P120 = 59, + HDMI_VIDEO_TIMING_1920X1080P100 = 60, + HDMI_VIDEO_TIMING_3840X2160P24 = 61, + HDMI_VIDEO_TIMING_3840X2160P25 = 62, + HDMI_VIDEO_TIMING_3840X2160P30 = 63, + HDMI_VIDEO_TIMING_3840X2160P48 = 64, + HDMI_VIDEO_TIMING_3840X2160P50 = 65, + HDMI_VIDEO_TIMING_3840X2160P60 = 66, + HDMI_VIDEO_TIMING_3840X2160P100 = 67, + HDMI_VIDEO_TIMING_3840X2160P120 = 68, + HDMI_VIDEO_TIMING_4096X2160P24 = 69, + HDMI_VIDEO_TIMING_4096X2160P25 = 70, + HDMI_VIDEO_TIMING_4096X2160P30 = 71, + HDMI_VIDEO_TIMING_4096X2160P48 = 72, + HDMI_VIDEO_TIMING_4096X2160P50 = 73, + HDMI_VIDEO_TIMING_4096X2160P60 = 74, + HDMI_VIDEO_TIMING_4096X2160P100 = 75, + HDMI_VIDEO_TIMING_4096X2160P120 = 76, + HDMI_VIDEO_TIMING_5120X2160P24 = 77, + HDMI_VIDEO_TIMING_5120X2160P25 = 78, + HDMI_VIDEO_TIMING_5120X2160P30 = 79, + HDMI_VIDEO_TIMING_5120X2160P48 = 80, + HDMI_VIDEO_TIMING_5120X2160P50 = 81, + HDMI_VIDEO_TIMING_5120X2160P60 = 82, + HDMI_VIDEO_TIMING_5120X2160P100 = 83, + HDMI_VIDEO_TIMING_5120X2160P120 = 84, + HDMI_VIDEO_TIMING_7680X4320P24 = 85, + HDMI_VIDEO_TIMING_7680X4320P25 = 86, + HDMI_VIDEO_TIMING_7680X4320P30 = 87, + HDMI_VIDEO_TIMING_7680X4320P48 = 88, + HDMI_VIDEO_TIMING_7680X4320P50 = 89, + HDMI_VIDEO_TIMING_7680X4320P60 = 90, + HDMI_VIDEO_TIMING_7680X4320P100 = 91, + HDMI_VIDEO_TIMING_7680X4320P120 = 92, + HDMI_VIDEO_TIMING_10240X4320P24 = 93, + HDMI_VIDEO_TIMING_10240X4320P25 = 94, + HDMI_VIDEO_TIMING_10240X4320P30 = 95, + HDMI_VIDEO_TIMING_10240X4320P48 = 96, + HDMI_VIDEO_TIMING_10240X4320P50 = 97, + HDMI_VIDEO_TIMING_10240X4320P60 = 98, + HDMI_VIDEO_TIMING_10240X4320P100 = 99, + HDMI_VIDEO_TIMING_10240X4320P120 = 100, + HDMI_VIDEO_TIMING_VESA_DEFINE = 101, + HDMI_VIDEO_TIMING_VESA_800X600_60 = 102, + HDMI_VIDEO_TIMING_VESA_848X480_60 = 103, + HDMI_VIDEO_TIMING_VESA_1024X768_60 = 104, + HDMI_VIDEO_TIMING_VESA_1280X720_60 = 105, + HDMI_VIDEO_TIMING_VESA_1280X768_60 = 106, + HDMI_VIDEO_TIMING_VESA_1280X768_60_RB = 107, + HDMI_VIDEO_TIMING_VESA_1280X800_60 = 108, + HDMI_VIDEO_TIMING_VESA_1280X800_60_RB = 109, + HDMI_VIDEO_TIMING_VESA_1280X960_60 = 110, + HDMI_VIDEO_TIMING_VESA_1280X1024_60 = 111, + HDMI_VIDEO_TIMING_VESA_1360X768_60 = 112, + HDMI_VIDEO_TIMING_VESA_1366X768_60 = 113, + HDMI_VIDEO_TIMING_VESA_1400X1050_60 = 114, + HDMI_VIDEO_TIMING_VESA_1440X900_60 = 115, + HDMI_VIDEO_TIMING_VESA_1440X900_60_RB = 116, + HDMI_VIDEO_TIMING_VESA_1440X1050_60 = 117, + HDMI_VIDEO_TIMING_VESA_1440X1050_60_RB = 118, + HDMI_VIDEO_TIMING_VESA_1600X900_60_RB = 119, + HDMI_VIDEO_TIMING_VESA_1600X1200_60 = 120, + HDMI_VIDEO_TIMING_VESA_1680X1050_60 = 113, + HDMI_VIDEO_TIMING_VESA_1680X1050_60_RB = 114, + HDMI_VIDEO_TIMING_VESA_1792X1344_60 = 115, + HDMI_VIDEO_TIMING_VESA_1856X1392_60 = 116, + HDMI_VIDEO_TIMING_VESA_1920X1080_60 = 117, + HDMI_VIDEO_TIMING_VESA_1920X1200_60 = 118, + HDMI_VIDEO_TIMING_VESA_1920X1200_60_RB = 119, + HDMI_VIDEO_TIMING_VESA_1920X1440_60 = 120, + HDMI_VIDEO_TIMING_VESA_2048X1152_60 = 121, + HDMI_VIDEO_TIMING_VESA_2560X1440_60_RB = 122, + HDMI_VIDEO_TIMING_VESA_2560X1600_60 = 123, + HDMI_VIDEO_TIMING_VESA_2560X1600_60_RB = 124, + HDMI_VIDEO_TIMING_USER_DEFINE = 125, + HDMI_VIDEO_TIMING_USER_1920X2160_30 = 126, + HDMI_VIDEO_TIMING_USER_2560X1440_30 = 127, + HDMI_VIDEO_TIMING_USER_2560X1440_60 = 128, + HDMI_VIDEO_TIMING_USER_1280X720_60 = 129, + HDMI_VIDEO_TIMING_USER_1366X768_60 = 130, + HDMI_VIDEO_TIMING_USER_1600X900_60_RB = 131, + HDMI_VIDEO_TIMING_USER_1920X1080_60 = 132, + HDMI_VIDEO_TIMING_USER_2048X1152_60 = 133, + HDMI_VIDEO_TIMING_BUTT, +}; + +/** + * @brief Enumerates picture aspect ratio, + * see the section 8.2.1 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiPictureAspectRatio { + HDMI_PICTURE_ASPECT_NO_DATA = 0, + HDMI_PICTURE_ASPECT_4_3 = 1, + HDMI_PICTURE_ASPECT_16_9 = 2, + HDMI_PICTURE_ASPECT_64_27 = 3, + HDMI_PICTURE_ASPECT_256_135 = 4, + HDMI_PICTURE_ASPECT_BUTT = 5, +}; + +/** + * @brief Enumerates active format aspect ratio, + * see the section 8.2.1 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiActiveFormatAspectRatio { + HDMI_ACTIVE_FORMAT_ASPECT_16_9_TOP = 2, + HDMI_ACTIVE_FORMAT_ASPECT_14_9_TOP = 3, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_CENTER = 4, + HDMI_ACTIVE_FORMAT_ASPECT_PICTURE = 8, + HDMI_ACTIVE_FORMAT_ASPECT_4_3 = 9, + HDMI_ACTIVE_FORMAT_ASPECT_16_9 = 10, + HDMI_ACTIVE_FORMAT_ASPECT_14_9 = 11, + HDMI_ACTIVE_FORMAT_ASPECT_4_3_SP_14_9 = 13, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_SP_14_9 = 14, + HDMI_ACTIVE_FORMAT_ASPECT_16_9_SP_4_3 = 15, + HDMI_ACTIVE_FORMAT_ASPECT_BUTT, +}; + +/** + * @brief Enumerates Nups(non-uniform picture scaling), + * see the section 8.2.1 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiNups { + HDMI_NUPS_UNKNOWN = 0, /* No Known non-uniform scaling */ + HDMI_NUPS_HORIZONTAL = 1, /* Picture has been scaled horizontally */ + HDMI_NUPS_VERTICAL = 2, /* Picture has been scaled vertically */ + HDMI_NUPS_BOTH = 3, /* Picture has been scaled horizontally and vertically */ +}; + +struct HdmiVideoAttr { + uint32_t tmdsClock; /* unit: KHz */ + uint32_t pixelClock; /* unit: KHz */ + uint32_t pixelRepeat; + enum HdmiColorSpace colorSpace; + enum HdmiColorimetry colorimetry; + enum HdmiExtendedColorimetry extColorimetry; + enum HdmiQuantizationRange quantization; + enum HdmiYccQuantizationRange yccQuantization; + enum HdmiDeepColor deepColor; + enum HdmiVideo3dStructure _3dStruct; + enum HdmiVideoTiming timing; + enum HdmiPictureAspectRatio aspect; + enum HdmiActiveFormatAspectRatio activeAspect; + enum HdmiNups nups; + bool xvycc; +}; + +/** + * @brief Enumerates audio coding type, + * see the section 7 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiAudioCodingType { + HDMI_AUDIO_CODING_TYPE_STREAM = 0, + HDMI_AUDIO_CODING_TYPE_LPCM = 1, + HDMI_AUDIO_CODING_TYPE_AC3 = 2, + HDMI_AUDIO_CODING_TYPE_MPEG1 = 3, + HDMI_AUDIO_CODING_TYPE_MP3 = 4, + HDMI_AUDIO_CODING_TYPE_MPEG2 = 5, + HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, + HDMI_AUDIO_CODING_TYPE_DTS = 7, + HDMI_AUDIO_CODING_TYPE_ATRAC = 8, + HDMI_AUDIO_CODING_TYPE_OBA =9, + HDMI_AUDIO_CODING_TYPE_EAC3 = 10, + HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, + HDMI_AUDIO_CODING_TYPE_MLP = 12, + HDMI_AUDIO_CODING_TYPE_DST = 13, + HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14, + HDMI_AUDIO_CODING_TYPE_CXT = 15, +}; + +/** + * @brief Enumerates audio interface type. + * + * @since 1.0 + */ +enum HdmiAudioInterfaceType { + HDMI_AUDIO_IF_TYPE_I2S = 0, /* Inter-IC Sound */ + HDMI_AUDIO_IF_TYPE_SPDIF = 1, /* Sony/Philips Digital Interface */ + HDMI_AUDIO_IF_TYPE_OTHER, +}; + +/** + * @brief Enumerates audio bit depth, + * see the section 7 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiAudioBitDepth { + HDMI_ADIO_BIT_DEPTH_UNKNOWN, + HDMI_ADIO_BIT_DEPTH_8 = 8, + HDMI_ADIO_BIT_DEPTH_16 = 16, + HDMI_ADIO_BIT_DEPTH_18 = 18, + HDMI_ADIO_BIT_DEPTH_20 = 20, + HDMI_ADIO_BIT_DEPTH_24 = 24, + HDMI_ADIO_BIT_DEPTH_32 = 32, + HDMI_ADIO_BIT_DEPTH_BUTT, +}; + +/** + * @brief Enumerates sample rate used for audio, + * see the section 7.3 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiSampleRate { + HDMI_SAMPLE_RATE_UNKNOWN, + HDMI_SAMPLE_RATE_8K = 8000, + HDMI_SAMPLE_RATE_11K = 11025, + HDMI_SAMPLE_RATE_12K = 12000, + HDMI_SAMPLE_RATE_16K = 16000, + HDMI_SAMPLE_RATE_22K = 22050, + HDMI_SAMPLE_RATE_24K = 24000, + HDMI_SAMPLE_RATE_32K = 32000, + HDMI_SAMPLE_RATE_44K = 44100, + HDMI_SAMPLE_RATE_48K = 48000, + HDMI_SAMPLE_RATE_88K = 88200, + HDMI_SAMPLE_RATE_96K = 96000, + HDMI_SAMPLE_RATE_176K = 176400, + HDMI_SAMPLE_RATE_192K = 192000, + HDMI_SAMPLE_RATE_768K = 768000, + HDMI_SAMPLE_RATE_BUTT, +}; + +/** + * @brief Enumerates audio format channel, + * see the section 7 of HDMI Specification 1.4 for details. + * + * @since 1.0 + */ +enum HdmiAudioFormatChannel { + HDMI_AUDIO_FORMAT_CHANNEL_2 = 2, + HDMI_AUDIO_FORMAT_CHANNEL_3, + HDMI_AUDIO_FORMAT_CHANNEL_4, + HDMI_AUDIO_FORMAT_CHANNEL_5, + HDMI_AUDIO_FORMAT_CHANNEL_6, + HDMI_AUDIO_FORMAT_CHANNEL_7, + HDMI_AUDIO_FORMAT_CHANNEL_8, + HDMI_AUDIO_FORMAT_CHANNEL_BUTT, +}; + +/** + * @brief Defines the audio Attribute struct. + * + * @since 1.0 + */ +struct HdmiAudioAttr { + enum HdmiAudioCodingType codingType; + enum HdmiAudioInterfaceType ifType; + enum HdmiAudioBitDepth bitDepth; + enum HdmiSampleRate sampleRate; + bool downSample; + enum HdmiAudioFormatChannel channels; +}; + +/* Electro-Optical Transfer Function (EOTF) type define. */ +enum HdmiEotfType { + HDMI_DRM_EOTF_SDR_LUMIN = 0, /* Traditional gamma - SDR Luminance Range */ + HDMI_DRM_EOTF_HDR_LUMIN = 1, /* Traditional gamma - HDR Luminance Range */ + HDMI_DRM_EOTF_SMPTE_ST_2048 = 2, /* SMPTE ST 2048 */ + HDMI_DRM_EOTF_HLG = 3, /* Hybrid Log-Gamma (HLG) based on ITU-R BT.2100-0 */ + HDMI_DRM_EOTF_BUTT, +}; + +/** + * @brief Enumerates hdr colormetry, + * see HDMI Specification 2.1 for details. + * + * @since 1.0 + */ +enum HdmiHdrColormetry { + HDMI_HDR_COLORIMETRY_NONE, + HDMI_HDR_COLORIMETRY_ITU_601, + HDMI_HDR_COLORIMETRY_ITU_709, + HDMI_HDR_COLORIMETRY_EXTENDED, + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709, + HDMI_HDR_EXTENDED_COLORIMETRY_S_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_ADOBE_YCC_601, + HDMI_HDR_EXTENDED_COLORIMETRY_ADOBE_RGB, + HDMI_HDR_EXTENDED_COLORIMETRY_2020_CONST_LUMINOUS, /* BT2020 c_ycc */ + HDMI_HDR_EXTENDED_COLORIMETRY_2020_NON_CONST_LUMINOUW +}; + +/** + * @brief Enumerates hdr mode, + * see HDMI Specification 2.1 for details. + * + * @since 1.0 + */ +enum HdmiHdrMode { + HDMI_HDR_MODE_DISABLE, /* HDR & dolby mode disable */ + HDMI_HDR_MODE_DOLBY_NORMAL, /* dolby normal(ycbcr422-12bit) mode enable */ + HDMI_HDR_MODE_DOLBY_TUNNELING, /* dolby tunneling(RGB-8bit) mode enable */ + HDMI_HDR_MODE_CEA_861_3, /* HDR standard mode enable(according to ) */ + HDMI_HDR_MODE_CEA_861_3_AUTHEN, /* HDR authen mode */ + HDMI_HDR_MODE_BUTT +}; + +/** + * @brief Enumerates hdr user mode, + * see HDMI Specification 2.1 for details. + * + * @since 1.0 + */ +enum HdmiHdrUserMode { + HDMI_HDR_USERMODE_SDR, + HDMI_HDR_USERMODE_HDR10, + HDMI_HDR_USERMODE_DOLBY, + HDMI_HDR_USERMODE_BUTT +}; + +/** + * @brief Enumerates static metadata type, + * see the section 6.9 of CTA-861-G for details. + * + * @since 1.0 + */ +enum HdmiStaticMetadataType { + HDMI_DRM_STATIC_METADATA_TYPE_1 = 0, /* Static Metadata Type 1 */ + HDMI_DRM_STATIC_METADATA_BUTT, +}; + +/** + * @brief Enumerates static metadata descriptor1st, + * see the section 6.9 of CTA-861-G for details. + * + * @since 1.0 + */ +struct HdmiStaticMetadataDescriptor1st { + uint16_t displayPrimaries0X; /* display_primaries_x[0], in units of 0.00002 */ + uint16_t displayPrimaries0Y; /* display_primaries_y[0], in units of 0.00002 */ + uint16_t displayPrimaries1X; /* display_primaries_x[1], in units of 0.00002 */ + uint16_t displayPrimaries1Y; /* display_primaries_y[1], in units of 0.00002 */ + uint16_t displayPrimaries2X; /* display_primaries_x[2], in units of 0.00002 */ + uint16_t displayPrimaries2Y; /* display_primaries_y[2], in units of 0.00002 */ + uint16_t whitePointX; /* white_point_x, in units of 0.00002 */ + uint16_t whitePointY; /* white_point_y, in units of 0.00002 */ + uint16_t maxDisplayMasteringLuminance; /* max_display_mastering_luminance, in units of 1 cd/m^2 */ + uint16_t minDisplayMasteringLuminance; /* min_display_mastering_luminance, in units of 0.0001 cd/m^2 */ + uint16_t maxContentLightLevel; /* Maximum Content Light Level, in units of 1 cd/m^2 */ + uint16_t maxFrameAverageLightLevel; /* Maximum Frame-average Light Level, in units of 1 cd/m^2 */ +}; + +union HdmiStaticMetadataDescriptor { + struct HdmiStaticMetadataDescriptor1st type1; +}; + +struct HdmiHdrAttr { + enum HdmiHdrMode mode; + enum HdmiHdrUserMode userMode; + /* The following members are valid, when mode is HDMI_HDR_MODE_CEA_861_3. */ + enum HdmiEotfType eotfType; + enum HdmiStaticMetadataType metadataType; + union HdmiStaticMetadataDescriptor descriptor; + enum HdmiHdrColormetry colorimetry; +}; + +/** + * @brief Opens an HDMI controller with a specified bus number. + * + * Before using the HDMI interface, you can obtain the device handle of the HDMI controller + * by calling {@link HdmiOpen}. This function is used in pair with {@link HdmiClose}. + * + * @param busNum Indicates the bus number. + * + * @return Returns the device handle {@link DevHandle} of the HDMI controller if the operation is successful; + * returns NULL otherwise. + * + * @since 1.0 + */ +DevHandle HdmiOpen(uint16_t busNum); + +/** + * @brief HDMI transmission start. + * + * This function is used in pair with {@link HdmiStop}. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiStart(DevHandle handle); + +/** + * @brief HDMI transmission stop. + * + * This function is used in pair with {@link HdmiStart}. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiStop(DevHandle handle); + +/** + * @brief HDMI Avmute set. + * + * First put the display device into the black screen mute state, waitting for the HDMI output device switch, + * and then send a Clear AVMute signal, so that the display device to boot, so that the switching process of + * the screen will be shielded. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param enable Indicates whether to enable avmute. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiAvmuteSet(DevHandle handle, bool enable); + + +/** + * @brief HDMI deep color set. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param color Indicates the deep color to be set, see {@link HdmiDeepColor}. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiDeepColorSet(DevHandle handle, enum HdmiDeepColor color); + +/** + * @brief HDMI deep color get. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param color Indicates the pointer to the deep color to read, see {@link HdmiDeepColor}. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiDeepColorGet(DevHandle handle, enum HdmiDeepColor *color); + +/** + * @brief HDMI set video attribute. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param attr Indicates the pointer to the video attribute to set, see {@link HdmiVideoAttr}. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr); + +/** + * @brief HDMI set audio attribute. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param attr Indicates the pointer to the audio attribute to set, see {@link HdmiAudioAttr}. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr); + +/** + * @brief HDMI set hdr attribute. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param attr Indicates the pointer to the hdr attribute to set, see {@link HdmiHdrAttr}. + * + * @return Returns 0 if the operation is successful; returns a negative value if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr); + +/** + * @brief HDMI read sink device's raw EDID data. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param buffer Indicates the pointer to the data to read. + * @param len Indicates the length of the data to read. + * + * @return Returns the length of the data read if the operation is successful; + * returns a negative value or 0 if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len); + +/** + * @brief Closes an HDMI controller. + * + * After the HDMI interface is used, you can close the HDMI controller by calling {@link HdmiClose}. + * This function is used in pair with {@link HdmiOpen}. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * + * @since 1.0 + */ +void HdmiClose(DevHandle handle); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_IF_H */ diff --git a/support/platform/include/hdmi/hdmi_cec.h b/support/platform/include/hdmi/hdmi_cec.h new file mode 100644 index 000000000..70b8a0f35 --- /dev/null +++ b/support/platform/include/hdmi/hdmi_cec.h @@ -0,0 +1,1712 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_CEC_H +#define HDMI_CEC_H + +#include "hdf_base.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* + * CEC(Consumer Electronics Control). + * CEC is a protocol that provides high-level control functions between all of the various audiovisual products + * in a user's environment. + */ + +/* + * One Touch Play Feature/Routing Control Feature. + * Used by a new source to indicate that it has started to transmit a stream OR + * used in response to a . + * Param: [Physical Address], 2 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_ACTIVE_SOURCE 0x82 + +#define HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN 2 + +/* + * One Touch Play Feature. + * Sent by a source device to the TV whenever it enters the + * active state(alternatively it may send ). + * Param: None. + */ +#define HDMI_CEC_OPCODE_IMAGE_VIEW_ON 0x04 + +/* + * One Touch Play Feature. + * As , but should also remove any text, menus and PIP windows from the TV's display. + * Param: None. + */ +#define HDMI_CEC_OPCODE_TEXT_VIEW_ON 0x0D + +/* + * Routing Control Feature. + * Used by currently active source to inform the TV that it has no video to be presented to the user, + * or is going into the Standby state as the result of a local user command on the device. + * Param: [Physical Address], 2 bytes. + */ +#define HDMI_CEC_OPCODE_INACTIVE_SOURCE 0x9D + +#define HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN 2 + +/* + * Routing Control Feature. + * Used by a new device to discover the status of the system. + * Param: None. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE 0x85 + +/* + * Routing Control Feature. + * Sent By CEC Switch when it is manually switched to inform all other devices on the network that + * the active route below the switch has changed. + * Param: [Original(Physical) Address], 2 bytes. [New(Physical) Address], 2 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_ROUTING_CHANGE 0x80 + +#define HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN 4 + +/* + * Routing Control Feature. + * Sent By a CEC Switch to indicate the active route below the switch. + * Param: [Physical Address], 2 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_ROUTING_INFORMATION 0x81 + +#define HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN 2 + +/* + * Routing Control Feature. + * Used by the TV to request a streaming path from the specified Physical Address. + * Param: [Physical Address], 2 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_SET_STREAM_PATH 0x86 + +#define HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN 2 + +/* + * Routing Control Feature. + * Switches one or all devices into the Standby state. + * Can be used as a broadcast message or be addressed to a specific device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_STANDBY 0x36 + +/* + * One Touch Record Feature. + * Request a device stop a recording. + * Param: None. + */ +#define HDMI_CEC_OPCODE_RECORD_OFF 0x0B + +/* + * One Touch Record Feature. + * Attempt to record the specified source. + * Param: [Record Source], 1~8 bytes. + */ +#define HDMI_CEC_OPCODE_RECORD_ON 0x09 + +/* Record Source Type, 1 byte. */ +#define HDMI_CEC_RECORD_SOURCE_TYPE_LEN 1 +enum HdmiCecRecordSourceType { + HDMI_CEC_RECORD_SRC_OWN = 1, + HDMI_CEC_RECORD_SRC_DIGITAL = 2, + HDMI_CEC_RECORD_SRC_ANALOG = 3, + HDMI_CEC_RECORD_SRC_EXT_PLUG = 4, + HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR = 5, +}; + +/* + * Digital Service Identification. 7 bytes. + * [Service Identification Method] 1 bit + * [Digital Broadcast System] 7 bits + * [Service Identification] 6 bytes + */ +#define HDMI_CEC_DIGITAL_SERVICE_ID_LEN 7 +#define HDMI_CEC_SERVICE_ID_METHOD_BY_DIGITAL_IDS 0 +#define HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL 1 + +enum HdmiCecDigitalBroadcastSystem { + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN = 0x00, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN = 0x01, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN = 0x02, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS = 0x08, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS = 0x09, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T = 0x0A, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE = 0x10, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE = 0x11, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL = 0x12, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C = 0x18, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S = 0x19, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2 = 0x1A, + HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T = 0x1B, +}; + +/* + * Service Identification, 6 bytes. + * [ARIB Data] | [ATSC Data] | [DVB Data] | [Channel Data] + * Channel Data, 6 bytes. + * [Channel Identifier] 4 bytes, [Reserved] 2 bytes. + * Channel Identifier, 4 bytes. + * [Channel Number Format] 6 bits. + * [Major Channel Number] 10 bits. + * [Minor Channel Number] 16 bits + */ +#define HDMI_CEC_CHANNEL_NUMBER_FORMAT_1_PART 0x01 +#define HDMI_CEC_CHANNEL_NUMBER_FORMAT_2_PART 0x02 +#define HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT 2 + +struct HdmiCecDigitalServiceAribData { + uint16_t transportId; + uint16_t serviceId; + uint16_t orgNetworkId; +}; + +struct HdmiCecDigitalServiceAtscData { + uint16_t transportId; + uint16_t programNumber; +}; + +struct HdmiCecDigitalServiceDvbData { + uint16_t transportId; + uint16_t serviceId; + uint16_t orgNetworkId; +}; + +#define HDMI_CEC_CHANNEL_IDENTIFIER_LEN 4 +struct HdmiCecChannelIdentifier { + uint8_t format; + uint16_t major; + uint16_t minor; +}; + +#define HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT 7 + +struct HdmiCecDigitalServiceId { + uint8_t method; + uint8_t system; + union { + struct HdmiCecDigitalServiceAribData arib; + struct HdmiCecDigitalServiceAtscData atsc; + struct HdmiCecDigitalServiceDvbData dvb; + struct HdmiCecChannelIdentifier channel; + } systemData; +}; + +/* + * Record Source. + * {[Record Source Type]} | {[Record Source Type] [Digital Service Identification]} | + * {[Record Source Type] [Analogue Broadcast Type] [Analogue Frequency] [Broadcast System]} | + * {[Record Source Type] [External Plug]} | {[Record Source Type] [External Physical Address]} + */ +#define HDMI_CEC_ANALOGUE_BROADCAST_TYPE_LEN 1 +#define HDMI_CEC_ANALOGUE_FREQ_LEN 2 +#define HDMI_CEC_BROADCAST_SYSTEM_LEN 1 +#define HDMI_CEC_EXT_PLUG_LEN 1 +#define HDMI_CEC_EXT_PHY_ADDRESS_LEN 2 +#define HDMI_CEC_RECORD_ON_OWN_MSG_PARAM_LEN HDMI_CEC_RECORD_SOURCE_TYPE_LEN +#define HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN (HDMI_CEC_RECORD_SOURCE_TYPE_LEN + HDMI_CEC_DIGITAL_SERVICE_ID_LEN) +#define HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN (HDMI_CEC_RECORD_SOURCE_TYPE_LEN + \ + HDMI_CEC_ANALOGUE_BROADCAST_TYPE_LEN + HDMI_CEC_ANALOGUE_FREQ_LEN + HDMI_CEC_BROADCAST_SYSTEM_LEN) +#define HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN (HDMI_CEC_RECORD_SOURCE_TYPE_LEN + HDMI_CEC_EXT_PLUG_LEN) +#define HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN (HDMI_CEC_RECORD_SOURCE_TYPE_LEN + HDMI_CEC_EXT_PHY_ADDRESS_LEN) + +struct HdmiCecRecordSource { + uint8_t type; + union { + struct HdmiCecDigitalServiceId id; + struct { + uint8_t anaBcastType; + uint16_t anaFreq; + uint8_t bcstSystem; + } analog; + uint8_t extPlug; + uint16_t extPhyAddr; + } data; +}; + +/* + * One Touch Record Feature. + * Used by a Recording Device to inform the Initiator of the message about its status. + * Param: [Record Status Info], 1 byte. + */ +#define HDMI_CEC_OPCODE_RECORD_STATUS 0x0A + +#define HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN 1 + +/* Record Status Info */ +enum HdmiCecRecordStatusInfo { + HDMI_CEC_RECORD_STATUS_CUR_SRC = 0x01, + HDMI_CEC_RECORD_STATUS_DIG_SERVICE = 0x02, + HDMI_CEC_RECORD_STATUS_ANA_SERVICE = 0x03, + HDMI_CEC_RECORD_STATUS_EXT_INPUT = 0x04, + HDMI_CEC_RECORD_STATUS_NO_DIG_SERVICE = 0x05, + HDMI_CEC_RECORD_STATUS_NO_ANA_SERVICE = 0x06, + HDMI_CEC_RECORD_STATUS_NO_SERVICE = 0x07, + HDMI_CEC_RECORD_STATUS_INVALID_EXT_PLUG = 0x09, + HDMI_CEC_RECORD_STATUS_INVALID_EXT_PHYS_ADDR = 0x0A, + HDMI_CEC_RECORD_STATUS_UNSUP_CA = 0x0B, + HDMI_CEC_RECORD_STATUS_NO_CA_ENTITLEMENTS = 0x0C, + HDMI_CEC_RECORD_STATUS_NO_COPY_SRC = 0x0D, + HDMI_CEC_RECORD_STATUS_NO_MORE_COPIES = 0x0E, + HDMI_CEC_RECORD_STATUS_NO_MEDIA = 0x10, + HDMI_CEC_RECORD_STATUS_PLAYING = 0x11, + HDMI_CEC_RECORD_STATUS_ALREADY_RECORDING = 0x12, + HDMI_CEC_RECORD_STATUS_MEDIA_PROTECTED = 0x13, + HDMI_CEC_RECORD_STATUS_NO_SRC_SIGNAL = 0x14, + HDMI_CEC_RECORD_STATUS_MEDIA_PROBLEM = 0x15, + HDMI_CEC_RECORD_STATUS_NO_SPACE = 0x16, + HDMI_CEC_RECORD_STATUS_PARENTAL_LOCK = 0x17, + HDMI_CEC_RECORD_STATUS_TERMINATED_OK = 0x1A, + HDMI_CEC_RECORD_STATUS_ALREADY_TERMINATED = 0x1B, + HDMI_CEC_RECORD_STATUS_OTHER = 0x1F, +}; + +/* + * One Touch Record Feature. + * Request by The Recording Device to record the presently displayed source. + */ +#define HDMI_CEC_OPCODE_RECORD_TV_SCREEN 0x0F + +/* + * Timer Programming Feature. + * Used to clear an Analogue timer block of a device. + * Param: see param. + */ +#define HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER 0x33 + +/* + * Timer Programming Feature. + * Used to clear a Digital timer block of a device. + * Param: see param. + */ +#define HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER 0x99 + +/* + * Timer Programming Feature. + * Used to clear a External timer block of a device. + * Param: see param. + */ +#define HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER 0xA1 + +/* + * Timer Programming Feature. + * Used to set a single timer block on an Analogue Recording device. + * Param: [Day of Month], 1 byte; [Month of Year], 1 byte; [Start Time], 2 byte; [Duration], 2 byte; + * [Recording Sequence], 1 byte; [Analogue Broadcast Type], 1 byte; [Analogue Frequency], 2 byte; + * [Broadcast System], 1 byte. + */ +#define HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER 0x34 + +/* Analogue Broadcast Type, 1 byte. */ +enum HdmiCecAnalogueBroadcastType { + HDMI_CEC_ANALOGUE_BROADCAST_CABLE = 0, + HDMI_CEC_ANALOGUE_BROADCAST_SATELITE = 1, + HDMI_CEC_ANALOGUE_BROADCAST_TERRESTRIAL = 2, +}; + +/* Recording Sequence, 8 bits. */ +enum HdmiCecRecordingSequence { + HDMI_CEC_RECORDING_SEQ_ONCE_ONLY = 0x00, + HDMI_CEC_RECORDING_SEQ_SUNDAY = 0x01, + HDMI_CEC_RECORDING_SEQ_MONDAY = 0x02, + HDMI_CEC_RECORDING_SEQ_TUESDAY = 0x04, + HDMI_CEC_RECORDING_SEQ_WEDNESDAY = 0x08, + HDMI_CEC_RECORDING_SEQ_THURSDAY = 0x10, + HDMI_CEC_RECORDING_SEQ_FRIDAY = 0x20, + HDMI_CEC_RECORDING_SEQ_SATERDAY = 0x40, +}; + +#define HDMI_CEC_ANALOGUE_TIMER_INFO_LEN 11 +/* Hour and Minute are in BCD format. */ +#define HDMI_CEC_BCD_FORMAT_TIME(time) (((time / 10) << 4) | (time % 10)) + +#define HDMI_CEC_COMM_TIMER_INFO_LEN 7 +struct HdmiCecCommTimerInfo { + uint8_t data; + uint8_t month; + uint8_t startHour; + uint8_t startMinute; + uint8_t durationHour; + uint8_t durationMinute; + uint8_t recordingSeq; +}; + +struct HdmiCecAnalogueTimerInfo { + struct HdmiCecCommTimerInfo commInfo; + uint8_t anaBcastType; + uint16_t anaFreq; + uint8_t bcstSystem; +}; + +/* + * Timer Programming Feature. + * Used to set a single timer block on a Digital Recording device. + * Param: [Day of Month], 1 byte; [Month of Year], 1 byte; [Start Time], 2 byte; [Duration], 2 byte; + * [Recording Sequence], 1 byte; [Digtial Service Identification], 7 byte. + */ +#define HDMI_CEC_OPCODE_SET_DIGITAL_TIMER 0x97 + +#define HDMI_CEC_DIGITAL_TIMER_INFO_LEN 14 +struct HdmiCecDigitalTimerInfo { + struct HdmiCecCommTimerInfo commInfo; + struct HdmiCecDigitalServiceId id; +}; + +/* + * Timer Programming Feature. + * Used to set a single timer block to record from an External device. + * Param: [Day of Month], 1 byte; [Month of Year], 1 byte; [Start Time], 2 byte; [Duration], 2 byte; + * [Recording Sequence], 1 byte; [External Source Specifier], 1 byte; [External Plug], 1 byte; + * [External Physical address], 2 byte. + */ +#define HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER 0xA2 + +#define HDMI_CEC_EXTERNAL_TIMER_INFO_LEN 11 + +/* External Source Specifier */ +#define HDMI_CEC_EXT_PLUG 4 +#define HDMI_CEC_EXT_PHYS_ADDR 5 + +struct HdmiCecExternalTimerInfo { + struct HdmiCecCommTimerInfo commInfo; + uint8_t extSrcSpec; + uint8_t extPlug; + uint16_t extPhyAddr; +}; + +/* + * Timer Programming Feature. + * Used to set the name of a program associate with a timer block. + * Sent directly after sending a or message. + * The name is then associated with that timer block. + * Param: [Program Title String], 1~14 bytes. + */ +#define HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE 0x67 + +#define HDMI_CEC_PROGRAM_TITLE_STR_MIN_LEN 1 +#define HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN 14 + +/* + * Timer Programming Feature. + * Used to give the status of a , + * or message. + * Param: [Timer Cleared Status Data], 1 byte. + */ +#define HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS 0x43 + +#define HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN 1 + +/* Timer Cleared Status Data */ +enum HdmiCecTimerClearedStatus { + HDMI_CEC_TIMER_CLR_STAT_NO_CLEARED_RECORDING = 0x00, + HDMI_CEC_TIMER_CLR_STAT_NO_CLEARED_NO_MATCHING = 0x01, + HDMI_CEC_TIMER_CLR_STAT_NO_CLEARED_NO_INFO = 0x02, + HDMI_CEC_TIMER_CLR_STAT_CLEARED = 0x80, +}; + +/* + * Timer Programming Feature. + * Used to send timer status to the Initiator of a message. + * Param: [Timer Status Data], 1 byte or 3 bytes. + */ +#define HDMI_CEC_OPCODE_TIMER_STATUS 0x35 + +#define HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN 1 +#define HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN 3 + +/* + * Timer Status Data. 1 byte or 3 bytes. + * [Timer overlap warning] 1bit. + * [Media Info] 2 bits. + * [Timer Progremmed Info] 5 bits or 21 bits. + */ +#define HDMI_CEC_TIMER_OVERLAP_WARNING_NO_OVERLAP 0 +#define HDMI_CEC_TIMER_OVERLAP_WARNING_TIMER_BLOCK_OVERLAP 1 + +enum HdmiCecMediaInfo { + HDMI_CEC_MEDIA_PRESENT_NOT_POTECTED = 0, + HDMI_CEC_MEDIA_PRESENT_POTECTED = 1, + HDMI_CEC_MEDIA_NOT_PRESENT = 2, + HDMI_CEC_MEDIA_BUTT, +}; + +/* + * Timer Progremmed Info, 5 bits or 21 bits. + * [Progremmed Indicator], 1 bit. + * {[Progremmed Info], 4 bits. [Duration Available], 2bytes.} | + * {[Not Progremmed Error Info], 4 bits. [Duration Available], 2bytes.} + */ +/* Progremmed Indicator, 1 bit */ +#define HDMI_CEC_PROG_IND_NOT_PROGRAMMED 0 +#define HDMI_CEC_PROG_IND_PROGRAMMED 1 + +/* Progremmed Info, 4 bits */ +enum HdmiCecProgremmedInfo { + HDMI_CEC_PROGRAMMED_INFO_ENOUGH_SPAC = 0x08, + HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC = 0x09, + HDMI_CEC_PROGRAMMED_INFO_NO_MEDIA_INFO = 0x0A, + HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE = 0x0B, +}; + +/* Not Progremmed Error Info */ +enum HdmiCecNotProgremmedErrorInfo { + HDMI_CEC_NOT_PROG_ERR_NO_FREE_TIMER = 0x01, + HDMI_CEC_NOT_PROG_ERR_DATE_OUT_OF_RANGE = 0x02, + HDMI_CEC_NOT_PROG_ERR_RECORDING_SEQ_ERROR = 0x03, + HDMI_CEC_NOT_PROG_ERR_INVALID_EXT_PLUG = 0x04, + HDMI_CEC_NOT_PROG_ERR_INVALID_EXT_PHYS_ADDR = 0x05, + HDMI_CEC_NOT_PROG_ERR_CA_UNSUPP = 0x06, + HDMI_CEC_NOT_PROG_ERR_INSUF_CA_ENTITLEMENTS = 0x07, + HDMI_CEC_NOT_PROG_ERR_RESOLUTION_UNSUPP = 0x08, + HDMI_CEC_NOT_PROG_ERR_PARENTAL_LOCK = 0x09, + HDMI_CEC_NOT_PROG_ERR_CLOCK_FAILURE = 0x0A, + HDMI_CEC_NOT_PROG_ERR_DUPLICATE = 0x0E, +}; + +struct HdmiCecTimerProgremmedInfo { + uint8_t indicator; + uint8_t info; /* Progremmed Info/Not Progremmed Error Info */ + uint8_t durationHour; + uint8_t durationMinute; +}; + +struct HdmiCecTimerStatusData { + uint8_t timerOverlap; + uint8_t mediaInfo; + struct HdmiCecTimerProgremmedInfo progInfo; +}; + +/* + * System Information Feature/Vendor Specific Commands Feature. + * Used to indicate the version number of the CEC Specification which was used to design the device, + * in response to a . + * Param: [CEC Version], 1 byte. + */ +#define HDMI_CEC_OPCODE_CEC_VERSION 0x9E + +#define HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN 1 + +/* CEC Version */ +#define HDMI_CEC_VERSION_1_3A 4 +#define HDMI_CEC_VERSION_1_4 5 +#define HDMI_CEC_VERSION_2_0 6 + +/* + * System Information Feature/Vendor Specific Commands Feature. + * Used by a device to enquire which version number of the CEC Specification + * was used to design the Follwer device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GET_CEC_VERSION 0x9F + +/* + * System Information Feature. + * A request to a device return its Physical Address. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS 0x83 + +/* + * System Information Feature. + * Sent by a device capable of character generation(for OSD and Menus) to a TV in order to + * discover the currently selected Menu language on the TV. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GET_MENU_LANGUAGE 0x91 + +/* + * System Information Feature. + * Used to inform all other devices of the mapping between + * physical and Logical address of the Initiator. + * Param: [Physical Address], 2 bytes. [Device Type], 1 byte. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS 0x84 + +#define HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN 3 + +/* + * Device Type/Primary Device Type. + * The HDMI 1.4b operand [Device Type] has been extended as [Primary Device Type]. + */ +enum HdmiCecDeviceType { + HDMI_CEC_DEVICE_TYPE_TV = 0, + HDMI_CEC_DEVICE_TYPE_RECORDING_DEVICE = 1, + HDMI_CEC_DEVICE_TYPE_RESERVED = 2, + HDMI_CEC_DEVICE_TYPE_TUNER = 3, + HDMI_CEC_DEVICE_TYPE_PLAYBACK_DEVICE = 4, + HDMI_CEC_DEVICE_TYPE_AUDIO_SYSTEM = 5, + HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH = 6, + HDMI_CEC_DEVICE_TYPE_PROCESSOR = 7, +}; + +/* + * System Information Feature. + * Used by a TV to indicate its currently selected menu language. + * Param: [Language], 3 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_SET_MENU_LANGUAGE 0x32 + +#define HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN 3 + +/* + * System Information Feature. + * Used by a device to announce its version, features and device type. + * Param: [CEC Version], 1 byte. [All Device Types], 1 byte. [RC Profile], 1..N bytes. [Device Features], 1..N bytes. + */ +#define HDMI_CEC_OPCODE_REPORT_FEATURES 0xA6 + +#define HDMI_CEC_REPORT_FEATURES_MSG_PARAM_MIN_LEN 4 + +/* All Device Types */ +enum HdmiCecAllDevType { + HDMI_CEC_ALL_DEV_TYPE_CEC_SWITCH = 0x04, + HDMI_CEC_ALL_DEV_TYPE_AUDIO_SYSTEM = 0x08, + HDMI_CEC_ALL_DEV_TYPE_PLAYBACK = 0x10, + HDMI_CEC_ALL_DEV_TYPE_TUNER =0x20, + HDMI_CEC_ALL_DEV_TYPE_RECORD = 0x40, + HDMI_CEC_ALL_DEV_TYPE_TV = 0x80, +}; + +/* + * RC Profile, 1..N bytes. + * [RC Profile 1]; or [RC Profile 1]..[RC Profile N](where N >= 2) + * RC Profile 1, 1 byte. + * [RC Profile Externsion], bit 7 + * if bit6 is 0, [RC Profile TV] in bit5-0; if bit6 is 1, [RC Profile Source] in bit5-0. + */ +#define HDMI_CEC_RC_PROFILE_MAX_NUM 6 +#define HDMI_CEC_RC_PROFILE_EXTERNSION_MARK (1 << 7) +#define HDMI_CEC_RC_PROFILE_TV_OR_SOURCE_MARK (1 << 6) + +/* RC Profile Source, 6 bits. */ +#define HDMI_CEC_RC_PROFILE_SOURCE_ROOT_MENU (1 << 4) +#define HDMI_CEC_RC_PROFILE_SOURCE_SETUP_MENU (1 << 3) +#define HDMI_CEC_RC_PROFILE_SOURCE_CONTENTS_MENU (1 << 2) +#define HDMI_CEC_RC_PROFILE_SOURCE_MEDIA_TOP_MENU (1 << 1) +#define HDMI_CEC_RC_PROFILE_SOURCE_MEDIA_CONTEXT_SENSITIVE_MENU (1 << 0) + +/* + * RC Profile TV, 6 bits. + * [RC Profile ID], Bit3-0. + */ +enum HdmiCecRcProfileId { + HDMI_CEC_RC_PROFILE_NONE = 0x00, + HDMI_CEC_RC_PROFILE_1 = 0x02, + HDMI_CEC_RC_PROFILE_2 = 0x06, + HDMI_CEC_RC_PROFILE_3 = 0x0A, + HDMI_CEC_RC_PROFILE_4 = 0x0E, + HDMI_CEC_RC_PROFILE_BUTT, +}; + +/* + * Device Features, 1..N bytes. + * [Device Features 1], 1 byte. + */ +#define HDMI_CEC_DEVICE_FEATURES_MAX_NUM 6 +#define HDMI_CEC_DEVICE_FEATURES_EXTERNSION_MARK (1 << 7) /* 0 the last; 1 continues. */ +#define HDMI_CEC_DEVICE_FEATURES_TV_SUPP_RECORD_TV_SCREEN (1 << 6) +#define HDMI_CEC_DEVICE_FEATURES_TV_SUPP_SET_OSD_STRING (1 << 5) +#define HDMI_CEC_DEVICE_FEATURES_DECK_SUPP_CONTROL (1 << 4) +#define HDMI_CEC_DEVICE_FEATURES_SRC_SUPP_SET_AUDIO_RATE (1 << 3) +#define HDMI_CEC_DEVICE_FEATURES_SINK_SUPP_ARC_TX (1 << 2) +#define HDMI_CEC_DEVICE_FEATURES_SRC_SUPP_ARC_RX (1 << 1) + +/* + * System Information Feature. + * Used by a device to request another device's features. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_FEATURES 0xA5 + +/* + * Deck Control Feature. + * Used to control a device's media functions. + * Param: [Deck Control Mode], 1 byte. + */ +#define HDMI_CEC_OPCODE_DECK_CONTROL 0x42 + +#define HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN 1 + +/* Deck Control Mode */ +enum HdmiCecDeckControlMode { + HDMI_CEC_DECK_CONTROL_MODE_SKIP_FWD = 1, + HDMI_CEC_DECK_CONTROL_MODE_SKIP_REV = 2, + HDMI_CEC_DECK_CONTROL_MODE_STOP = 3, + HDMI_CEC_DECK_CONTROL_MODE_EJECT = 4, +}; + +/* + * Deck Control Feature. + * Used to provide a deck's status to the indicate of the message. + * Param: [Deck Info], 1 byte. + */ +#define HDMI_CEC_OPCODE_DECK_STATUS 0x1B + +#define HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN 1 + +/* Deck Info. Indicate the current status of a tape or disk deck. */ +enum HdmiCecDeckInfo { + HDMI_CEC_DECK_PLAY = 0x11, + HDMI_CEC_DECK_RECORD = 0x12, + HDMI_CEC_DECK_PLAY_REVERSE = 0x13, + HDMI_CEC_DECK_STILL = 0x14, + HDMI_CEC_DECK_SLOW = 0x15, + HDMI_CEC_DECK_SLOW_REVERSE = 0x16, + HDMI_CEC_DECK_FAST_FORWARD = 0x17, + HDMI_CEC_DECK_FAST_REVERSE = 0x18, + HDMI_CEC_DECK_NO_MEDIA = 0x19, + HDMI_CEC_DECK_STOP = 0x1A, + HDMI_CEC_DECK_SKIP_FORWARD = 0x1B, + HDMI_CEC_DECK_SKIP_REVERSE = 0x1C, + HDMI_CEC_DECK_INDEX_SEARCH_FORWARD = 0x1D, + HDMI_CEC_DECK_INDEX_SEARCH_REVERSE = 0x1E, + HDMI_CEC_DECK_OTHER_STATUS = 0x1F, +}; + +/* + * Deck Control Feature. + * Used to request the status of a device, + * regardless of whether or not it is the current active source. + * Param: [Status Request], 1 byte. + */ +#define HDMI_CEC_OPCODE_GIVE_DECK_STATUS 0x1A + +#define HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN 1 + +/* Status Request */ +enum HdmiCecStatusRequest { + HDMI_CEC_STATUS_REQUEST_ON = 1, + HDMI_CEC_STATUS_REQUEST_OFF = 2, + HDMI_CEC_STATUS_REQUEST_ONCE = 3, +}; + +/* + * Deck Control Feature. + * Used to control the playback bahavior of a source device. + * Param: [Play Mode], 1 byte. + */ +#define HDMI_CEC_OPCODE_PLAY 0x41 + +#define HDMI_CEC_PLAY_MSG_PARAM_LEN 1 + +/* Play Mode */ +enum HdmiCecPlayMode { + HDMI_CEC_PLAY_MODE_PLAY_FAST_FWD_MIN = 0x05, + HDMI_CEC_PLAY_MODE_PLAY_FAST_FWD_MED = 0x06, + HDMI_CEC_PLAY_MODE_PLAY_FAST_FWD_MAX = 0x07, + HDMI_CEC_PLAY_MODE_PLAY_FAST_REV_MIN = 0x09, + HDMI_CEC_PLAY_MODE_PLAY_FAST_REV_MED = 0x0A, + HDMI_CEC_PLAY_MODE_PLAY_FAST_REV_MAX = 0x0B, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_FWD_MIN = 0x15, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_FWD_MED = 0x16, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_FWD_MAX = 0x17, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_REV_MIN = 0x19, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_REV_MED = 0x1A, + HDMI_CEC_PLAY_MODE_PLAY_SLOW_REV_MAX = 0x1B, + HDMI_CEC_PLAY_MODE_PLAY_REV = 0x20, + HDMI_CEC_PLAY_MODE_PLAY_FWD = 0x24, + HDMI_CEC_PLAY_MODE_PLAY_STILL = 0x25, +}; + +/* + * Tuner Control Feature. + * Used to request the status of a tuner device. + * Param: [Status Request], 1 byte. + */ +#define HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS 0x08 + +#define HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN 1 + +/* + * Tuner Control Feature. + * Directly selects a Digital TV, Radio or Data Briadcast service. + * Param: [Digital Service Identification], 7 bytes. + */ +#define HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE 0x93 + +#define HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN HDMI_CEC_DIGITAL_SERVICE_ID_LEN + +/* + * Tuner Control Feature. + * Used by a tuner device to provide its status to the initiator of + * the message. + * Param: [Tuner Device Info], 5 bytes(analogue service), 8 bytes(digital service). + */ +#define HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS 0x07 + +#define HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN 5 +#define HDMI_CEC_TUNER_DEVICE_STATUS_MSG_DIG_PARAM_LEN 8 + +/* + * Tuner Device Info, 5 bytes(analogue service), 8 bytes(digital service). + * [Recording Flag], 1 bit. [Tuner Display Info], 7 bits. + * {[Analogue Broadcast Type], 1 byte. [Analogue Frequency], 2 bytes. [Broadcast System], 1 byte.} | + * {[Digital Service Identification], 7 bytes}. + */ +#define HDMI_CEC_RECORDING_FALG_NOT_USED 0 +#define HDMI_CEC_RECORDING_FALG_USED 1 + +enum HdmiCecTunerDisplayInfo { + HDMI_CEC_TUNER_DISP_DIGITAL = 0, + HDMI_CEC_TUNER_DISP_NOT_DISP = 1, + HDMI_CEC_TUNER_DISP_ANALOGUE = 2, +}; + +struct HdmiCecTunerDeviceInfo { + uint8_t recordingFlag; + uint8_t dispInfo; + bool isAnalogService; + union { + struct HdmiCecDigitalServiceId digital; + struct { + uint8_t anaBcastType; + uint16_t anaFreq; + uint8_t bcstSystem; + } analog; + } data; +}; + +/* + * Tuner Control Feature. + * Used to tune to next lowest service in a tuner's service list. Can used for PIP. + * Param: None. + */ +#define HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT 0x06 + +/* + * Tuner Control Feature. + * Used to tune to next highest service in a tuner's service list. Can used for PIP. + * Param: None. + */ +#define HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT 0x05 + +/* + * Vendor Specific Commands Feature. + * Reports the vendor ID of this device. + * Param: [Vendor ID], 3 bytes. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_DEVICE_VENDOR_ID 0x87 + +#define HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN 3 + +/* + * Indicates the vendor ID should be disabled. + */ +#define HDMI_CEC_VENDOR_ID_UNKNOWN 0xFFFFFFFF + +/* + * Vendor Specific Commands Feature. + * Requests the Vendor ID from a device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID 0x8C + +/* + * Vendor Specific Commands Feature. + * Allows vendor specific commands to be sent between two devices. + * Param: [Vendor Specific Data], <= 14 bytes. + */ +#define HDMI_CEC_OPCODE_VENDOR_COMMAND 0x89 + +#define HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN 14 + +/* + * Vendor Specific Commands Feature. + * Allows vendor specific commands to be sent between two devices or broadcast. + * Param: [Vendor ID], 3 bytes. [Vendor Specific Data], <= 11 bytes. + * Broadcast/Directly addressed message. + */ +#define HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID 0xA0 + +#define HDMI_CEC_VENDOR_ID_LEN 3 +#define HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN 11 + +/* + * Vendor Specific Commands Feature. + * Indicates that a remote control button has been depressed. + * Param: [Vendor Specific RC Code], <= 14 bytes. + * Broadcast/Directly addressed message. + */ +#define HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN 0x8A + +#define HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN 14 + +/* + * Vendor Specific Commands Feature. + * Indicates that a remote control button(the last button pressed indicated + * by the Vendor Remote Button Down message) has been released. + * Param: None. + * Broadcast/Directly addressed message. + */ +#define HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP 0x8B + +/* + * OSD Display Feature. + * Used to send a text massage to output on a TV. + * OSD(on-screen display). + * Param: [Display Control], 1 byte. [OSD String], 1-13 bits. + */ +#define HDMI_CEC_OPCODE_SET_OSD_STRING 0x64 + +#define HDMI_CEC_DISPLAY_CONTROL_LEN 1 +#define HDMI_CEC_OSD_STRING_MAX_LEN 13 + +/* Display Control */ +enum HdmiCecDisplayControl { + HDMI_CEC_DISPLAY_FOR_DEFAULT_TIME = 0x00, + HDMI_CEC_DISPLAY_UNTIL_CLEARED = 0x40, + HDMI_CEC_DISPLAY_CLEAR_PREVIOUS_MESSAGE = 0x80, + HDMI_CEC_DISPLAY_BUTT, +}; + +/* + * OSD Display Feature. + * Used to request the preferred OSD name of a device for use in menus associated with that device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_OSD_NAME 0x46 + +/* + * OSD Display Feature. + * Used to set the preferred OSD name of a device for use in menus associated with that device. + * Param: [OSD Name], 1-14 bytes. + */ +#define HDMI_CEC_OPCODE_SET_OSD_NAME 0x47 + +#define HDMI_CEC_OSD_NAME_MAX_LEN 14 + +/* + * Device Menu Control Feature. + * A request from the TV for a device to show/remove a menu or to + * query if a device is currently showing a menu. + * Param: [Menu Request Type], 1 byte. + */ +#define HDMI_CEC_OPCODE_MENU_REQUEST 0x8D + +#define HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN 1 + +/* Menu Request Type */ +enum HdmiCecMenuRequestType { + HDMI_CEC_MENU_REQUEST_ACTIVE = 0, + HDMI_CEC_MENU_REQUEST_DEACTIVE = 1, + HDMI_CEC_MENU_REQUEST_QUERY = 2, +}; + +/* + * Device Menu Control Feature. + * Used to indicate to the TV that the device is showing/has removed a menu and + * requests the remote control keys to be passed throuh. + * Param: [Menu State], 1 byte. + */ +#define HDMI_CEC_OPCODE_MENU_STATUS 0x8E + +#define HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN 1 + +/* Menu State */ +#define HDMI_CEC_MENU_STATE_ACTIVE 0 +#define HDMI_CEC_MENU_STATE_DEACTIVE 1 + +/* + * Device Menu Control Feature/Remote Contro Passthrough Feature/System Audio Control Feature. + * Used to indicate that the user pressed a remote control button or switched from + * one remote control button to another. Can also be used as a command that is not directly initiated by the user. + * Param: [UI Command], 1 byte. + * Note that some [UI Command] messages also have further operands. See CEC Table 6 and CEC Table 7. + */ +#define HDMI_CEC_OPCODE_USER_CONTROL_PRESSED 0x44 + +#define HDMI_CEC_UI_COMMAND_LEN 1 + +/* UI Command */ +enum HdmiCecUiCmdType { + HDMI_CEC_UI_CMD_SELECT = 0x00, + HDMI_CEC_UI_CMD_UP = 0x01, + HDMI_CEC_UI_CMD_DOWN = 0x02, + HDMI_CEC_UI_CMD_LEFT = 0x03, + HDMI_CEC_UI_CMD_RIGHT = 0x04, + HDMI_CEC_UI_CMD_RIGHT_UP = 0x05, + HDMI_CEC_UI_CMD_RIGHT_DOWN = 0x06, + HDMI_CEC_UI_CMD_LEFT_UP = 0x07, + HDMI_CEC_UI_CMD_LEFT_DOWN = 0x08, + HDMI_CEC_UI_CMD_DEVICE_ROOT_MENU = 0x09, + HDMI_CEC_UI_CMD_DEVICE_SETUP_MENU = 0x0a, + HDMI_CEC_UI_CMD_CONTENTS_MENU = 0x0b, + HDMI_CEC_UI_CMD_FAVORITE_MENU = 0x0c, + HDMI_CEC_UI_CMD_EXIT = 0x0d, + HDMI_CEC_UI_CMD_MEDIA_TOP_MENU = 0x10, + HDMI_CEC_UI_CMD_MEDIA_CONTEXT_SENSITIVE_MENU = 0x11, + HDMI_CEC_UI_CMD_NUMBER_ENTRY_MODE = 0x1d, + HDMI_CEC_UI_CMD_NUMBER_11 = 0x1e, + HDMI_CEC_UI_CMD_NUMBER_12 = 0x1f, + HDMI_CEC_UI_CMD_NUMBER_0_OR_NUMBER_10 = 0x20, + HDMI_CEC_UI_CMD_NUMBER_1 = 0x21, + HDMI_CEC_UI_CMD_NUMBER_2 = 0x22, + HDMI_CEC_UI_CMD_NUMBER_3 = 0x23, + HDMI_CEC_UI_CMD_NUMBER_4 = 0x24, + HDMI_CEC_UI_CMD_NUMBER_5 = 0x25, + HDMI_CEC_UI_CMD_NUMBER_6 = 0x26, + HDMI_CEC_UI_CMD_NUMBER_7 = 0x27, + HDMI_CEC_UI_CMD_NUMBER_8 = 0x28, + HDMI_CEC_UI_CMD_NUMBER_9 = 0x29, + HDMI_CEC_UI_CMD_DOT = 0x2a, + HDMI_CEC_UI_CMD_ENTER = 0x2b, + HDMI_CEC_UI_CMD_CLEAR = 0x2c, + HDMI_CEC_UI_CMD_NEXT_FAVORITE = 0x2f, + HDMI_CEC_UI_CMD_CHANNEL_UP = 0x30, + HDMI_CEC_UI_CMD_CHANNEL_DOWN = 0x31, + HDMI_CEC_UI_CMD_PREVIOUS_CHANNEL = 0x32, + HDMI_CEC_UI_CMD_SOUND_SELECT = 0x33, + HDMI_CEC_UI_CMD_INPUT_SELECT = 0x34, + HDMI_CEC_UI_CMD_DISPLAY_INFORMATION = 0x35, + HDMI_CEC_UI_CMD_HELP = 0x36, + HDMI_CEC_UI_CMD_PAGE_UP = 0x37, + HDMI_CEC_UI_CMD_PAGE_DOWN = 0x38, + HDMI_CEC_UI_CMD_POWER = 0x40, + HDMI_CEC_UI_CMD_VOLUME_UP = 0x41, + HDMI_CEC_UI_CMD_VOLUME_DOWN = 0x42, + HDMI_CEC_UI_CMD_MUTE = 0x43, + HDMI_CEC_UI_CMD_PLAY = 0x44, + HDMI_CEC_UI_CMD_STOP = 0x45, + HDMI_CEC_UI_CMD_PAUSE = 0x46, + HDMI_CEC_UI_CMD_RECORD = 0x47, + HDMI_CEC_UI_CMD_REWIND = 0x48, + HDMI_CEC_UI_CMD_FAST_FORWARD = 0x49, + HDMI_CEC_UI_CMD_EJECT = 0x4a, + HDMI_CEC_UI_CMD_SKIP_FORWARD = 0x4b, + HDMI_CEC_UI_CMD_SKIP_BACKWARD = 0x4c, + HDMI_CEC_UI_CMD_STOP_RECORD = 0x4d, + HDMI_CEC_UI_CMD_PAUSE_RECORD = 0x4e, + HDMI_CEC_UI_CMD_ANGLE = 0x50, + HDMI_CEC_UI_CMD_SUB_PICTURE = 0x51, + HDMI_CEC_UI_CMD_VIDEO_ON_DEMAND = 0x52, + HDMI_CEC_UI_CMD_ELECTRONIC_PROGRAM_GUIDE = 0x53, + HDMI_CEC_UI_CMD_TIMER_PROGRAMMING = 0x54, + HDMI_CEC_UI_CMD_INITIAL_CONFIGURATION = 0x55, + HDMI_CEC_UI_CMD_SELECT_BROADCAST_TYPE = 0x56, /* Additional Operands: [UI Broadcast Type] */ + HDMI_CEC_UI_CMD_SELECT_SOUND_PRESENTATION = 0x57, /* Additional Operands: [UI Sound Presentation Control] */ + HDMI_CEC_UI_CMD_AUDIO_DESCRIPTION = 0x58, + HDMI_CEC_UI_CMD_INTERNET = 0x59, + HDMI_CEC_UI_CMD_3D_MODE = 0x5a, + HDMI_CEC_UI_CMD_PLAY_FUNCTION = 0x60, /* Additional Operands: [Play Mode] */ + HDMI_CEC_UI_CMD_PAUSE_PLAY_FUNCTION = 0x61, + HDMI_CEC_UI_CMD_RECORD_FUNCTION = 0x62, + HDMI_CEC_UI_CMD_PAUSE_RECORD_FUNCTION = 0x63, + HDMI_CEC_UI_CMD_STOP_FUNCTION = 0x64, + HDMI_CEC_UI_CMD_MUTE_FUNCTION = 0x65, + HDMI_CEC_UI_CMD_RESTORE_VOLUME_FUNCTION = 0x66, + HDMI_CEC_UI_CMD_TUNE_FUNCTION = 0x67, /* Additional Operands: [Channel Identifier] */ + HDMI_CEC_UI_CMD_SELECT_MEDIA_FUNCTION = 0x68, /* Additional Operands: [UI Function Media] */ + HDMI_CEC_UI_CMD_SELECT_AV_INPUT_FUNCTION = 0x69, /* Additional Operands: [UI Function Select A/V Input] */ + HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION = 0x6a, /* Additional Operands: [UI Function Select Audio Input] */ + HDMI_CEC_UI_CMD_POWER_TOGGLE_FUNCTION = 0x6b, + HDMI_CEC_UI_CMD_POWER_OFF_FUNCTION = 0x6c, + HDMI_CEC_UI_CMD_POWER_ON_FUNCTION = 0x6d, + HDMI_CEC_UI_CMD_F1_BLUE = 0x71, + HDMI_CEC_UI_CMD_F2_RED = 0x72, + HDMI_CEC_UI_CMD_F3_GREEN = 0x73, + HDMI_CEC_UI_CMD_F4_YELLOW = 0x74, + HDMI_CEC_UI_CMD_F5 = 0x75, + HDMI_CEC_UI_CMD_DATA = 0x76, +}; + +enum HdmiCecUiBroadcastType { + HDMI_CEC_UI_BROADCAST_TYPE_TOGGLE_ALL = 0x00, + HDMI_CEC_UI_BROADCAST_TYPE_TOGGLE_DIG_ANA = 0x01, + HDMI_CEC_UI_BROADCAST_TYPE_ANA = 0x10, + HDMI_CEC_UI_BROADCAST_TYPE_ANA_TERRESTRIAL = 0x20, + HDMI_CEC_UI_BROADCAST_TYPE_ANA_CABLE = 0x30, + HDMI_CEC_UI_BROADCAST_TYPE_ANA_SATELLITE = 0x40, + HDMI_CEC_UI_BROADCAST_TYPE_DIG = 0x50, + HDMI_CEC_UI_BROADCAST_TYPE_DIG_TERRESTRIAL = 0x60, + HDMI_CEC_UI_BROADCAST_TYPE_DIG_CABLE = 0x70, + HDMI_CEC_UI_BROADCAST_TYPE_DIG_SATELLITE = 0x80, + HDMI_CEC_UI_BROADCAST_TYPE_DIG_COM_SATELLITE = 0x90, + HDMI_CEC_UI_BROADCAST_TYPE_DIG_COM_SATELLITE2 = 0x91, + HDMI_CEC_UI_BROADCAST_TYPE_IP = 0xA0, +}; + +/* UI Sound Presentation Control */ +enum HdmiCecUiSoundPresCtl { + HDMI_CEC_UI_SOUND_PRES_CTL_DUAL_MONO = 0x20, + HDMI_CEC_UI_SOUND_PRES_CTL_KARAOKE = 0x30, + HDMI_CEC_UI_SOUND_PRES_CTL_DOWNMIX = 0x80, + HDMI_CEC_UI_SOUND_PRES_CTL_REVERB_PROCESS = 0x90, + HDMI_CEC_UI_SOUND_PRES_CTL_EQUALIZER = 0xA0, + HDMI_CEC_UI_SOUND_PRES_CTL_BASS_STEP_UP = 0xB1, + HDMI_CEC_UI_SOUND_PRES_CTL_BASS_NEUTRAL = 0xB2, + HDMI_CEC_UI_SOUND_PRES_CTL_BASS_STEP_DOWN = 0xB3, + HDMI_CEC_UI_SOUND_PRES_CTL_TREBLE_STEP_UP = 0xC1, + HDMI_CEC_UI_SOUND_PRES_CTL_TREBLE_NEUTRAL = 0xC2, + HDMI_CEC_UI_SOUND_PRES_CTL_TREBLE_STEP_DOWN = 0xC3, +}; + +struct HdmiCecUiCmd { + uint8_t cmdType; + bool hasAddOp; + union { + uint8_t uiBroadcastType; + uint8_t uiSoundPresCtl; + uint8_t playMode; + uint8_t uiFunctionMedia; + uint8_t uiFunctionSelectAvInput; + uint8_t uiFunctionSelectAudioInput; + struct HdmiCecChannelIdentifier channel; + } addOperands; +}; + +/* + * Device Menu Control Feature/Remote Contro Passthrough Feature/System Audio Control Feature. + * Indicates that user released a remote control button(the last one indicated by the + * message). Also used after a command that is not directly initiated by the user. + * Param: None. + */ +#define HDMI_CEC_OPCODE_USER_CONTROL_RELEASED 0x45 + +/* + * Remote Contro Passthrough Feature. + * Used to determine the current power status of a target device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS 0x8F + +/* + * Remote Contro Passthrough Feature. + * Used to inform a requesting device of the current power status. + * Param: [Power Status], 1 byte. + * Broadcast(Hdmi Spec2.0)/Directly addressed message. + */ +#define HDMI_CEC_OPCODE_REPORT_POWER_STATUS 0x90 + +#define HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN 1 + +/* Power Status */ +enum HdmiCecPowerStatus { + HDMI_CEC_POWER_STATUS_ON = 0x00, + HDMI_CEC_POWER_STATUS_STANDBY = 0x01, + HDMI_CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON = 0x02, + HDMI_CEC_POWER_STATUS_IN_TRANSITION_ON_TO_STANDBY = 0x03, +}; + +/* + * General Protocol Messages. + * Used as a response to indicate that the device does not support the requested message type, + * or that is cannot execute it at the present time. + * Param: [Feature Opcode], 1 byte. [Abort Reason], 1 byte. + */ +#define HDMI_CEC_OPCODE_FEATURE_ABORT 0x00 + +#define HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN 2 + +/* Abort Reason */ +enum HdmiCecAbortReason { + HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE = 0, + HDMI_CEC_ABORT_NOT_IN_CORRECT_MODE_TO_RESPOND = 1, + HDMI_CEC_ABORT_CANNOT_PROVIDE_SOURCE = 2, + HDMI_CEC_ABORT_INVALID_OPERAND = 3, + HDMI_CEC_ABORT_REFUSED = 4, + HDMI_CEC_ABORT_UNABLE_TO_DETERMINE = 5, +}; + +/* + * General Protocol Messages. + * This message is reversed for testing purposes. + * Param: None. + */ +#define HDMI_CEC_OPCODE_ABORT 0xFF + +/* + * System Audio Control Feature. + * Requests an Amplifier to send its volume and mute status. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS 0x71 + +/* + * System Audio Control Feature. + * Requests the status of the System Audio Mode. + * Param: None. + */ +#define HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS 0x7D + +/* + * System Audio Control Feature. + * Reports an Amplifier's volume and mute status. + * Param: [Audio Status], 1 byte. + */ +#define HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS 0x7A + +#define HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN 1 + +/* + * Audio Status, 1 byte. + * [Audio Mute Status], Bit 7; [Audio Volume Status], Bits 6-0. + */ +#define HDMI_CEC_AUDIO_MUTE_STATUS_MARK 0x80 +#define HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT 7 +#define HDMI_CEC_AUDIO_VOLUME_STATUS_MARK 0x7F +/* Audio Mute Status */ +#define HDMI_CEC_AUDIO_MUTE_STATUS_OFF 0 +#define HDMI_CEC_AUDIO_MUTE_STATUS_ON 1 +/* Audio Volume Status, 0%~100% */ +#define HDMI_CEC_AUDIO_VOLUME_STATUS_MIN_VAL 0x00 +#define HDMI_CEC_AUDIO_VOLUME_STATUS_MAX_VAL 0x64 +#define HDMI_CEC_AUDIO_VOLUME_STATUS_UNKNOWN 0x7F + +/* + * System Audio Control Feature. + * Report Audio Capability. + * Param: [Short Audio Descriptor], 3 bytes. Up to 4 Short Audio Descriptor identifying supported audio formats. + */ +#define HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR 0xA3 + +#define HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN 3 +#define HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM 4 + +/* + * System Audio Control Feature. + * Report Audio Capability. + * Param: [Audio Format ID], 2 bits. [Audio Format Code], 6 bits. Up to 4 Audio Format ID and Audio Format Code. + */ +#define HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR 0xA4 + +#define HDMI_CEC_AUDIO_FORMAT_LEN 1 +#define HDMI_CEC_MAX_AUDIO_FORMAT_NUM 4 +#define HDMI_CEC_AUDIO_FORMAT_ID_SHIFT 6 +#define HDMI_CEC_AUDIO_FORMAT_CODE_MARK 0x3F + +/* + * System Audio Control Feature. + * Turns the System Audio Mode On or Off. + * Param: [System Audio Status], 1 byte. + * Broadcast/Directly addressed message. + */ +#define HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE 0x72 + +#define HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN 1 + +/* System Audio Status */ +#define HDMI_CEC_SYSTEM_AUDIO_STATUS_OFF 0 +#define HDMI_CEC_SYSTEM_AUDIO_STATUS_ON 1 + +/* + * System Audio Control Feature. + * A device implementing System Audio Control and which has volume control + * RC buttons(e.g. TV or STB) requests to use System Audio Mode to the Amplifier. + # Param: [Physical Address], 2 bytes. + */ +#define HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST 0x70 + +#define HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN 2 + +/* + * System Audio Control Feature. + * Reports the current status of the System Audio Mode. + * Param: [System Audio Status], 1 byte. + */ +#define HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS 0x7E + +/* + * Audio Rate Control Feature. + * Used to control audio rate from Source Device. + * Param: [Audio Rate], 1 byte. + */ +#define HDMI_CEC_OPCODE_SET_AUDIO_RATE 0x9A + +#define HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN 1 + +/* Audio Rate */ +enum HdmiCecAudioRate { + HDMI_CEC_AUDIO_RATE_OFF = 0, /* Rate Control Off */ + HDMI_CEC_AUDIO_RATE_WIDE_STD = 1, /* Standard Rate: 100% rate */ + HDMI_CEC_AUDIO_RATE_WIDE_FAST = 2, /* Fast Rate: Max 101% rate */ + HDMI_CEC_AUDIO_RATE_WIDE_SLOW = 3, /* Slow Rate: Min 99% rate */ + HDMI_CEC_AUDIO_RATE_NARROW_STD = 4, /* Standard Rate: 100.0% rate */ + HDMI_CEC_AUDIO_RATE_NARROW_FAST = 5, /* Fast Rate: Max 100.1% rate */ + HDMI_CEC_AUDIO_RATE_NARROW_SLOW = 6, /* Slow Rate: Min 99.9% rate */ +}; + +/* + * Audio Return Channel Control Feature. + * Used by an ARC RX device to active the ARC functionality in an ARC TX device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_INITIATE_ARC 0xC0 + +/* + * Audio Return Channel Control Feature. + * Used by an ARC RX device to indicate that its ARC functionality has been actived. + * Param: None. + */ +#define HDMI_CEC_OPCODE_REPORT_ARC_INITIATED 0xC1 + +/* + * Audio Return Channel Control Feature. + * Used by an ARC RX device to indicate that its ARC functionality has been deactived. + * Param: None. + */ +#define HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION 0xC2 + +/* + * Audio Return Channel Control Feature. + * Used by an ARC TX device to request an ARC RX device to + * active the ARC functionality in the ARC TX device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION 0xC3 + +/* + * Audio Return Channel Control Feature. + * Used by an ARC TX device to request an ARC RX device to + * deactive the ARC functionality in the ARC TX device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION 0xC4 + +/* + * Audio Return Channel Control Feature. + * Used by an ARC TX device to deactive the ARC functionality in the ARC TX device. + * Param: None. + */ +#define HDMI_CEC_OPCODE_TERMINATE_ARC 0xC5 + +/* + * Capability Discovery and Control Feature. + * Used for Capability Discovery and Control. + * Broadcast message. + */ +#define HDMI_CEC_OPCODE_CDC_MESSAGE 0xF8 + +/* + * Dynamic Auto Lispync Feature. + * Used by Amplifier(or other device) to request current latency values. + * Param: [Physical Address], 2 byte. + */ +#define HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY 0xA7 + +#define HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN 2 + +/* + * Dynamic Auto Lispync Feature. + * Used by TV(or other Initiator) to report updates of latency. + * Param: [Physical Address], 2 byte. [Video Latency], 1 byte. [Latency Flags], 1 byte. + * [Audio Output Delay], 1 byte, optional. + */ +#define HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY 0xA8 + +#define HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MAX_LEN 5 +#define HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN 4 + +/* + * Latency Flags, 1 byte. + * Bit 7..3 reversed; Bit 2 [Low Latency Mode]; Bit 1-0 [Audio Output Compensated]. + */ +#define HDMI_CEC_LOW_LATENCY_MODE_SHIFT 2 +#define HDMI_CEC_NORMAL_LATENCY_MODE 0 +#define HDMI_CEC_LOW_LATENCY_MODE 1 + +#define HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_NA 0 +#define HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_DELAY 1 +#define HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_NO_DELAY 2 +#define HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_PARTIAL_DELAY 3 + +struct HdmiCecLatencyInfo { + uint8_t videoLatency; + uint8_t lowLatencyMode; + uint8_t audioOutputCompensated; + uint8_t audioOutputDelay; +}; + + +/* Broadcast System, 0~31. See hdmi spec1.4, CEC Table 31. */ +enum HdmiCecBroadcastSystem { + HDMI_CEC_BROADCAST_SYSTEM_PAL_BG = 0, + HDMI_CEC_BROADCAST_SYSTEM_SECAM_LQ = 1, + HDMI_CEC_BROADCAST_SYSTEM_PAL_M = 2, + HDMI_CEC_BROADCAST_SYSTEM_NTSC_M = 3, + HDMI_CEC_BROADCAST_SYSTEM_PAL_I = 4, + HDMI_CEC_BROADCAST_SYSTEM_SECAM_DK = 5, + HDMI_CEC_BROADCAST_SYSTEM_SECAM_BG = 6, + HDMI_CEC_BROADCAST_SYSTEM_SECAM_L = 7, + HDMI_CEC_BROADCAST_SYSTEM_PAL_DK = 8, + HDMI_CEC_BROADCAST_SYSTEM_OTHER = 31, +}; + +/* CDC(Capability Discovery and Control) Message */ + +/* + * HDMI Ethernet Channel Feature. + * Used to inquire the state of an HDMI Ethernet Channel. + * Param: [Physical Address], 2 byte. [Physical Address], 2 byte. + */ +#define HDMI_CDC_HEC_INQUIRE_STATE 0x00 + +#define HDMI_CDC_HEC_INQUIRE_STATE_MSG_PARAM_LEN 4 + +/* + * HDMI Ethernet Channel Feature. + * Used to report capabilities and states of a device that supports functionality. + * Param: [Physical Address], 2 bytes. [HEC State], 1 byte. [HEC Support Field], 2 bytes. + * [HEC Activation Field], 2 bytes. + */ +#define HDMI_CDC_HEC_REPORT_STATE 0x01 + +#define HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MAX_LEN 5 +#define HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MIN_LEN 3 + +/* + * HEC State, 1 byte + * [HEC Functionality State], 2 bits. + * [Host Functionality State], 2 bits. + * [ENC Functionality State], 2 bits. + * [CDC Error Code], 2 bits. + */ +#define HDMI_CDC_HEC_FUNC_STATE_SHIFT 6 +#define HDMI_CDC_HOST_FUNC_STATE_SHIFT 4 +#define HDMI_CDC_ENC_FUNC_STATE_SHIFT 2 + +enum HdmiCdcHecFuncState { + HDMI_CDC_HEC_FUNC_STATE_NOT_SUPPORTED = 0, + HDMI_CDC_HEC_FUNC_STATE_INACTIVE = 1, + HDMI_CDC_HEC_FUNC_STATE_ACTIVE = 2, + HDMI_CDC_HEC_FUNC_STATE_ACTIVATION_FIELD = 3, +}; + +enum HdmiCdcHostFuncState { + HDMI_CDC_HOST_HEC_STATE_NOT_SUPPORTED = 0, + HDMI_CDC_HOST_HEC_STATE_NOT_INACTIVE = 1, + HDMI_CDC_HOST_HEC_STATE_NOT_ACTIVE = 2, +}; + +enum HdmiCdcEncFuncState { + HDMI_CDC_ENC_FUNC_STATE_EXT_CON_NOT_SUPPORTED = 0, + HDMI_CDC_ENC_FUNC_STATE_EXT_CON_INACTIVE = 1, + HDMI_CDC_ENC_FUNC_STATE_EXT_CON_ACTIVE = 2, +}; + +enum HdmiCdcErrCode { + HDMI_CDC_ERR_CODE_NO_ERROR = 0, + HDMI_CDC_ERR_CODE_CAP_UNSUPPORTED = 1, + HDMI_CDC_ERR_CODE_WRONG_STATE = 2, + HDMI_CDC_ERR_CODE_OTHER = 3, +}; + +/* + * HEC Support Field, 2 bytes. + * [HEC Support], Bit 14. {14[HEC Support]}, Bit 13-0. + */ +#define HDMI_CDC_HEC_SUPPORT_MAKR (1 << 14) +#define HDMI_CDC_HEC_NOT_SUPPORT 0 +#define HDMI_CDC_HEC_SUPPORT 1 + +/* + * HEC Activation Field, 2 bytes. + * [HEC Activation], Bit 14. {14[HEC Activation]}, Bit 13-0. + */ +#define HDMI_CDC_HEC_ACTIVATION_MAKR (1 << 14) +#define HDMI_CDC_HEC_INACTIVE 0 +#define HDMI_CDC_HEC_ACTIVE 1 + +struct HdmiCdcHecState { + uint8_t hecFuncState; + uint8_t hostFuncState; + uint8_t encFuncState; + uint8_t cdcErrCode; + bool haveHecField; + uint16_t hecField; +}; + +/* + * HDMI Ethernet Channel Feature. + * Used to active or de-active an HDMI Ethernet Channel to an adjacent device. + * Param: [Physical Address], 2 bytes. [HEC Set State], 1 byte. + */ +#define HDMI_CDC_HEC_SET_STATE_ADJACENT 0x02 + +#define HDMI_CDC_HEC_SET_STATE_ADJACENT_MSG_PARAM_LEN 3 + +/* HEC Set State, 1 byte. */ +#define HDMI_CDC_DEACTIVATE_HEC 0 +#define HDMI_CDC_ACTIVATE_HEC 1 + +/* + * HDMI Ethernet Channel Feature. + * Used to active or de-active an HDMI Ethernet Channel to an adjacent device. + * Param: [Physical Address], 2 bytes. [Physical Address], 2 bytes. [HEC Set State], 1 byte. + * [Physical Address], 2 bytes. [Physical Address], 2 bytes. [Physical Address], 2 bytes. + * The last three [PA] parameters shall not be incorporated if only one HEC shall activated. + */ +#define HDMI_CDC_HEC_SET_STATE 0x03 + +#define HDMI_CDC_HEC_SET_STATE_MSG_MIN_LEN 5 +#define HDMI_CDC_HEC_SET_STATE_MSG_OPTIONAL_PA_MAX_NUM 3 + +struct HemiCdcHecStateInfo { + uint16_t phyAddr1; + uint16_t phyAddr2; + uint8_t hecSetState; + uint16_t phyAddr[HDMI_CDC_HEC_SET_STATE_MSG_OPTIONAL_PA_MAX_NUM]; + uint32_t phyAddrLen; +}; + +/* + * HDMI Ethernet Channel Feature. + * Used to request the deactivation of an HDMI Ethernet Channel. + * Param: [Physical Address], 2 bytes. [Physical Address], 2 bytes. [Physical Address], 2 bytes. + */ +#define HDMI_CDC_HEC_REQUEST_DEACTIVATION 0x04 + +#define HDMI_CDC_HEC_REQUEST_DEACTIVATION_MSG_PHY_ADDR_NUM 3 +#define HDMI_CDC_HEC_REQUEST_DEACTIVATION_MSG_PARAM_LEN 6 + +/* + * HDMI Ethernet Channel Feature. + * Used to keep alive HDMI Ethernet Channels active. + */ +#define HDMI_CDC_HEC_NOTIFY_ALIVE 0x05 + +/* + * HDMI Ethernet Channel Feature. + * Used to discover all HEC capabilities of devices within the HDMI network. + */ +#define HDMI_CDC_HEC_DISCOVER 0x06 + +/* + * CDC HPD Feature. + * Used to substitute physical HPD pin signaling. + * Param: [Input port number], 4 bits. [HPD State], 4 bits. + */ +#define HDMI_CDC_HPD_SET_STATE 0x10 + +#define HDMI_CDC_HPD_SET_STATE_MSG_LEN 1 +#define HDMI_CDC_INPUT_PORT_NUMBER_SHIFT 4 + +enum HdmiCdcHpdState { + HDMI_CDC_HDP_STATE_CP_EDID_DISABLE = 0, + HDMI_CDC_HDP_STATE_CP_EDID_ENABLE = 1, + HDMI_CDC_HDP_STATE_CP_EDID_DISABLE_ENABLE = 2, + HDMI_CDC_HDP_STATE_EDID_DISABLE = 3, + HDMI_CDC_HDP_STATE_EDID_ENABLE = 4, + HDMI_CDC_HDP_STATE_EDID_DISABLE_ENABLE = 5, + HDMI_CDC_HDP_STATE_BUTT, +}; + +/* + * CDC HPD Feature. + * Used to report the state of a device using the CDC HPD signaling. + * Param: [HPD State], 4 bits. [CDC_HPD_Error_Code], 4 bits. + */ +#define CEC_MSG_CDC_HPD_REPORT_STATE 0x11 + +#define HDMI_CDC_HPD_REPORT_STATE_MSG_LEN 1 +#define HDMI_CDC_HPD_STATE_SHIFT 4 + +enum HdmiCdcHpdErrCode { + HDMI_CDC_HPD_NO_ERR = 0, + HDMI_CDC_HPD_ERR_INITIATOR_NOT_CAPABLE = 1, + HDMI_CDC_HPD_ERR_INITIATOR_WRONG_STATE = 2, + HDMI_CDC_HPD_ERR_OTHER = 3, + HDMI_CDC_HPD_NO_ERR_NO_VIDEO_STREAM = 4, + HDMI_CDC_HPD_ERR_BUTT, +}; + +/* + * CEC message frame. + * + * 1 block 1 block 0-14 blocks + * Start_Bit CEC_Header_Block CEC_Opcode_Block CEC_Operand_Blocks + * + * CDC message frame. + * + * 1 block 1 block 2 blocks 1 block 0~11 blocks + * Start_Bit CEC_Header_Block CEC_Opcode_Block(0xF8) Initiator_Phy_Address CDC_Opcode CDC_Parameters + * + * Header Block. + * high 4 bits low 4 bits + * Initiator Logic Address field Destination Logic Address field + * + */ +#define HDMI_CEC_MSG_MAX_LEN 20 /* Make sure it has enough space. */ +#define HDMI_CEC_HEADER_LEN 1 +#define HDMI_CEC_OPCODE_LEN 1 +#define HDMI_CEC_MSG_MIN_LEN (HDMI_CEC_HEADER_LEN + HDMI_CEC_OPCODE_LEN) +#define HDMI_POLLING_MSG_LEN 1 +#define HDMI_CEC_INITIATOR_PHY_ADDRESS_LEN 2 +#define HDMI_CEC_GET_MSG_LEN(len) (HDMI_CEC_HEADER_LEN + HDMI_CEC_OPCODE_LEN + len) +#define HDMI_CDC_OPCODE_LEN 1 +#define HDMI_CDC_GET_MSG_LEN(len) \ + (HDMI_CEC_HEADER_LEN + HDMI_CEC_OPCODE_LEN + HDMI_CEC_INITIATOR_PHY_ADDRESS_LEN + HDMI_CDC_OPCODE_LEN + len) + +#define HDMI_CEC_HEADER_BLOCK_INITIATOR_MARK 0xF0 +#define HDMI_CEC_HEADER_BLOCK_DESTINATION_MARK 0x0F +#define HDMI_CEC_HEADER_BLOCK_INITIATOR_SHIFT 4 + +#define HDMI_CEC_INVALID_PHY_ADDR 0xFFFF +#define HDMI_CEC_INVALID_LOGICAL_ADDR 0xFF + +enum HdmiCecLogicalAddr { + HDMI_CEC_LOG_ADDR_TV = 0, + HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_1 = 1, + HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_2 = 2, + HDMI_CEC_LOG_ADDR_TUNER_1 = 3, + HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_1 = 4, + HDMI_CEC_LOG_ADDR_AUDIO_SYSTEM = 5, + HDMI_CEC_LOG_ADDR_TUNER_2 = 6, + HDMI_CEC_LOG_ADDR_TUNER_3 = 7, + HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_2 = 8, + HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_3 = 9, + HDMI_CEC_LOG_ADDR_TUNER_4 = 10, + HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_3 = 11, + HDMI_CEC_LOG_ADDR_BACKUP_1 = 12, + HDMI_CEC_LOG_ADDR_BACKUP_2 = 13, + HDMI_CEC_LOG_ADDR_SPECIFIC_USE = 14, + HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST = 15, /* + * Unregistered(as initiator address); + * Broadcast(as destination address). + */ + HDMI_CEC_LOG_ADDR_BUTT, +}; + +enum HdmiCecLogicalAddrMark { + HDMI_CEC_LOG_ADDR_MASK_TV = (1 << HDMI_CEC_LOG_ADDR_TV), + HDMI_CEC_LOG_ADDR_MASK_RECORD = ((1 << HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_1) | + (1 << HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_2) | (1 << HDMI_CEC_LOG_ADDR_RECORDING_DEVICE_3)), + HDMI_CEC_LOG_ADDR_MASK_TUNER = ((1 << HDMI_CEC_LOG_ADDR_TUNER_1) | (1 << HDMI_CEC_LOG_ADDR_TUNER_2) | + (1 << HDMI_CEC_LOG_ADDR_TUNER_3) | (1 << HDMI_CEC_LOG_ADDR_TUNER_4)), + HDMI_CEC_LOG_ADDR_MASK_PLAYBACK = ((1 << HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_1) | + (1 << HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_2) | (1 << HDMI_CEC_LOG_ADDR_PLAYBACK_DEVICE_3)), + HDMI_CEC_LOG_ADDR_MASK_AUDIOSYSTEM = (1 << HDMI_CEC_LOG_ADDR_AUDIO_SYSTEM), + HDMI_CEC_LOG_ADDR_MASK_BACKUP = ((1 << HDMI_CEC_LOG_ADDR_BACKUP_1) | (1 << HDMI_CEC_LOG_ADDR_BACKUP_2)), + HDMI_CEC_LOG_ADDR_MASK_SPECIFIC = (1 << HDMI_CEC_LOG_ADDR_SPECIFIC_USE), + HDMI_CEC_LOG_ADDR_MASK_UNREGISTERED = (1 << HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST), +}; + +enum HdmiCecLogicalAddrType { + HDMI_CEC_LOG_ADDR_TYPE_TV = 0, + HDMI_CEC_LOG_ADDR_TYPE_RECORD = 1, + HDMI_CEC_LOG_ADDR_TYPE_TUNER = 2, + HDMI_CEC_LOG_ADDR_TYPE_PLAYBACK = 3, + HDMI_CEC_LOG_ADDR_TYPE_AUDIOSYSTEM = 4, + HDMI_CEC_LOG_ADDR_TYPE_SPECIFIC = 5, + HDMI_CEC_LOG_ADDR_TYPE_UNREGISTERED = 6, +}; + +enum HdmiCecMsgType { + HDMI_CEC_MSG_BROADCAST_1_4 = 0x01, + HDMI_CEC_MSG_BROADCAST_2_0 = 0x02, + HDMI_CEC_MSG_BROADCAST = 0x03, + HDMI_CEC_MSG_DIRECTED = 0x04, + HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_1_4 = 0x05, + HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_2_0 = 0x06, + HDMI_CEC_MSG_ALL = 0x07, +}; + +struct HdmiCecMsgLenInfo { + uint8_t opcode; + uint8_t minLen; + uint8_t type; +}; + +#define HDMI_CEC_WAIT_RESPONSE_MSG_MAX_TIME 1000 /* 1s */ +struct HdmiCecMsg { + uint32_t len; + uint8_t data[HDMI_CEC_MSG_MAX_LEN]; + uint8_t rspMsg; + bool response; + uint32_t timeout; /* Indicates the maximum time(in ms) for the peer to reply to a message. */ +}; + +struct HdmiCecInfo { + uint8_t logAddr; + uint8_t logAddrType; + uint16_t logAddrMask; + uint8_t primaryDeviceType; + uint8_t cecVersion; + uint16_t phyAddr; + uint32_t vendorId; + uint32_t flags; + uint8_t osdName[HDMI_CEC_OSD_NAME_MAX_LEN + 1]; + uint8_t osdNameLen; + uint8_t allDeviceType; + uint8_t rcProfile[HDMI_CEC_RC_PROFILE_MAX_NUM]; + uint8_t devFeatures[HDMI_CEC_DEVICE_FEATURES_MAX_NUM]; + bool isWaitingResponse; + uint8_t response; +}; + +struct HdmiCec { + struct HdmiCecInfo info; + void *priv; +}; + +static inline bool HdmiCecIsBroadcastMsg(struct HdmiCecMsg *msg) +{ + if ((msg->data[0] & HDMI_CEC_HEADER_BLOCK_DESTINATION_MARK) == + HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) { + return true; + } + return false; +} + +static inline uint8_t HdmiCecGetMsgInitiator(struct HdmiCecMsg *msg) +{ + return ((msg->data[0] & HDMI_CEC_HEADER_BLOCK_INITIATOR_MARK) >> HDMI_CEC_HEADER_BLOCK_INITIATOR_SHIFT); +} + +static inline uint8_t HdmiCecGetMsgDestination(struct HdmiCecMsg *msg) +{ + return (msg->data[0] & HDMI_CEC_HEADER_BLOCK_DESTINATION_MARK); +} + +static inline bool HdmiCecLogAddrValid(struct HdmiCec *cec, uint8_t logAddr) +{ + return (cec->info.logAddr & (1 << logAddr)); +} + +static inline bool HdmiCecIsCdcOnlyDevice(struct HdmiCec *cec) +{ + return ((cec->info.logAddr == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) && + (cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH)); +} + +static inline void HdmiCecFillMsgHeader(struct HdmiCecMsg *destMsg, struct HdmiCecMsg *srcMsg) +{ + destMsg->data[0] = (HdmiCecGetMsgDestination(srcMsg) << HDMI_CEC_HEADER_BLOCK_INITIATOR_SHIFT) | + HdmiCecGetMsgInitiator(srcMsg); +} + +int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_CEC_H */ diff --git a/support/platform/include/hdmi/hdmi_common.h b/support/platform/include/hdmi/hdmi_common.h new file mode 100644 index 000000000..1c2fa1fcc --- /dev/null +++ b/support/platform/include/hdmi/hdmi_common.h @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_COMMON_H +#define HDMI_COMMON_H + +#include "hdf_base.h" +#include "hdmi_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define HDMI_CEA_VIDEO_CODE_MAX 44 +#define HDMI_VESA_VIDEO_CODE_MAX 31 +#define HDMI_VIDEO_4K_CODES_MAX 4 + +#define HDMI_HDMI14_MAX_TMDS_RATE 340000 /* unit: KHz */ +#define HDMI_HDMI20_MAX_TMDS_RATE 600000 /* unit: KHz */ +#define HDMI_MULTIPLE_2P0(x) (2 * x) +#define HDMI_MULTIPLE_1P5(x) (((x) * 3) >> 1) +#define HDMI_MULTIPLE_1P25(x) (((x) * 5) >> 2) +#define HDMI_MULTIPLE_0P5(x) ((x) >> 1) + +enum HdmiTmdsModeType { + HDMI_TMDS_MODE_NULL = 0, + HDMI_TMDS_MODE_DVI = 1, + HDMI_TMDS_MODE_HDMI_1_4 = 2, + HDMI_TMDS_MODE_HDMI_2_0 = 3, + HDMI_TMDS_MODE_AUTO = 4, + HDMI_TMDS_MODE_HDMI_2_1 = 5, + HDMI_TMDS_MODE_BUTT, +}; + +/* + * Video Identification Code (VIC). + * see CTA-861-G, table 3. + */ +enum HdmiVic { + HDMI_VIC_NONE = 0, /* No Video Identification Code Avaiable(Used with AVI Infoframe only) */ + HDMI_VIC_640X480P60_4_3 = 1, + HDMI_VIC_720X480P60_4_3 = 2, + HDMI_VIC_720X480P60_16_9 = 3, + HDMI_VIC_1280X720P60_16_9 = 4, + HDMI_VIC_1920X1080I60_16_9 = 5, + HDMI_VIC_1440X480I60_4_3 = 6, + HDMI_VIC_1440X480I60_16_9 = 7, + HDMI_VIC_1440X240P60_4_3 = 8, + HDMI_VIC_1440X240P60_16_9 = 9, + HDMI_VIC_2880X480I60_4_3 = 10, + HDMI_VIC_2880X480I60_16_9 = 11, + HDMI_VIC_2880X240P60_4_3 = 12, + HDMI_VIC_2880X240P60_16_9 = 13, + HDMI_VIC_1440X480P60_4_3 = 14, + HDMI_VIC_1440X480P60_16_9 = 15, + HDMI_VIC_1920X1080P60_16_9 = 16, + HDMI_VIC_720X576P50_4_3 = 17, + HDMI_VIC_720X576P50_16_9 = 18, + HDMI_VIC_1280X720P50_16_9 = 19, + HDMI_VIC_1920X1080I50_16_9 = 20, + HDMI_VIC_1440X576I50_4_3 = 21, + HDMI_VIC_1440X576I50_16_9 = 22, + HDMI_VIC_1440X288P50_4_3 = 23, + HDMI_VIC_1440X288P50_16_9 = 24, + HDMI_VIC_2880X576I50_4_3 = 25, + HDMI_VIC_2880X576I50_16_9 = 26, + HDMI_VIC_2880X288P50_4_3 = 27, + HDMI_VIC_2880X288P50_16_9 = 28, + HDMI_VIC_1440X576P50_4_3 = 29, + HDMI_VIC_1440X576P50_16_9 = 30, + HDMI_VIC_1920X1080P50_16_9 = 31, + HDMI_VIC_1920X1080P24_16_9 = 32, + HDMI_VIC_1920X1080P25_16_9 = 33, + HDMI_VIC_1920X1080P30_16_9 = 34, + HDMI_VIC_2880X480P60_4_3 = 35, + HDMI_VIC_2880X480P60_16_9 = 36, + HDMI_VIC_2880X576P50_4_3 = 37, + HDMI_VIC_2880X576P50_16_9 = 38, + HDMI_VIC_1920X1080I50_1250_16_9 = 39, + HDMI_VIC_1920X1080I100_16_9 = 40, + HDMI_VIC_1280X720P100_16_9 = 41, + HDMI_VIC_720X576P100_4_3 = 42, + HDMI_VIC_720X576P100_16_9 = 43, + HDMI_VIC_1440X576I100_4_3 = 44, + HDMI_VIC_1440X576I100_16_9 = 45, + HDMI_VIC_1920X1080I120_16_9 = 46, + HDMI_VIC_1280X720P120_16_9 = 47, + HDMI_VIC_720X480P120_4_3 = 48, + HDMI_VIC_720X480P120_16_9 = 49, + HDMI_VIC_1440X480I120_4_3 = 50, + HDMI_VIC_1440X480I120_16_9 = 51, + HDMI_VIC_720X576P200_4_3 = 52, + HDMI_VIC_720X576P200_16_9 = 53, + HDMI_VIC_1440X576I120_4_3 = 54, + HDMI_VIC_1440X576I120_16_9 = 55, + HDMI_VIC_720X480P240_4_3 = 56, + HDMI_VIC_720X480P240_16_9 = 57, + HDMI_VIC_1440X480I240_4_3 = 58, + HDMI_VIC_1440X480I240_16_9 = 59, + HDMI_VIC_1280X720P24_16_9 = 60, + HDMI_VIC_1280X720P25_16_9 = 61, + HDMI_VIC_1280X720P30_16_9 = 62, + HDMI_VIC_1920X1080P120_16_9 = 63, + HDMI_VIC_1920X1080P100_16_9 = 64, + HDMI_VIC_1280X720P24_64_27 = 65, + HDMI_VIC_1280X720P25_64_27 = 66, + HDMI_VIC_1280X720P30_64_27 = 67, + HDMI_VIC_1280X720P50_64_27 = 68, + HDMI_VIC_1280X720P60_64_27 = 69, + HDMI_VIC_1280X720P100_64_27 = 70, + HDMI_VIC_1280X720P120_64_27 = 71, + HDMI_VIC_1920X1080P24_64_27 = 72, + HDMI_VIC_1920X1080P25_64_27 = 73, + HDMI_VIC_1920X1080P30_64_27 = 74, + HDMI_VIC_1920X1080P50_64_27 = 75, + HDMI_VIC_1920X1080P60_64_27 = 76, + HDMI_VIC_1920X1080P100_64_27 = 77, + HDMI_VIC_1920X1080P120_64_27 = 78, + HDMI_VIC_1680X720P24_64_27 = 79, + HDMI_VIC_1680X720P25_64_27 = 80, + HDMI_VIC_1680X720P30_64_27 = 81, + HDMI_VIC_1680X720P50_64_27 = 82, + HDMI_VIC_1680X720P60_64_27 = 83, + HDMI_VIC_1680X720P100_64_27 = 84, + HDMI_VIC_1680X720P120_64_27 = 85, + HDMI_VIC_2560X1080P24_64_27 = 86, + HDMI_VIC_2560X1080P25_64_27 = 87, + HDMI_VIC_2560X1080P30_64_27 = 88, + HDMI_VIC_2560X1080P50_64_27 = 89, + HDMI_VIC_2560X1080P60_64_27 = 90, + HDMI_VIC_2560X1080P100_64_27 = 91, + HDMI_VIC_2560X1080P120_64_27 = 92, + HDMI_VIC_3840X2160P24_16_9 = 93, + HDMI_VIC_3840X2160P25_16_9 = 94, + HDMI_VIC_3840X2160P30_16_9 = 95, + HDMI_VIC_3840X2160P50_16_9 = 96, + HDMI_VIC_3840X2160P60_16_9 = 97, + HDMI_VIC_4096X2160P24_256_135 = 98, + HDMI_VIC_4096X2160P25_256_135 = 99, + HDMI_VIC_4096X2160P30_256_135 = 100, + HDMI_VIC_4096X2160P50_256_135 = 101, + HDMI_VIC_4096X2160P60_256_135 = 102, + HDMI_VIC_3840X2160P24_64_27 = 103, + HDMI_VIC_3840X2160P25_64_27 = 104, + HDMI_VIC_3840X2160P30_64_27 = 105, + HDMI_VIC_3840X2160P50_64_27 = 106, + HDMI_VIC_3840X2160P60_64_27 = 107, + HDMI_VIC_1280X720P48_16_9 = 108, + HDMI_VIC_1280X720P48_64_27 = 109, + HDMI_VIC_1680X720P48_64_27 = 110, + HDMI_VIC_1920X1080P48_16_9 = 111, + HDMI_VIC_1920X1080P48_64_27 = 112, + HDMI_VIC_2560X1080P48_64_27 = 113, + HDMI_VIC_3840X2160P48_16_9 = 114, + HDMI_VIC_4096X2160P48_256_135 = 115, + HDMI_VIC_3840X2160P48_64_27 = 116, + HDMI_VIC_3840X2160P100_16_9 = 117, + HDMI_VIC_3840X2160P120_16_9 = 118, + HDMI_VIC_3840X2160P100_64_27 = 119, + HDMI_VIC_3840X2160P120_64_27 = 120, + HDMI_VIC_5120X2160P24_64_27 = 121, + HDMI_VIC_5120X2160P25_64_27 = 122, + HDMI_VIC_5120X2160P30_64_27 = 123, + HDMI_VIC_5120X2160P48_64_27 = 124, + HDMI_VIC_5120X2160P50_64_27 = 125, + HDMI_VIC_5120X2160P60_64_27 = 126, + HDMI_VIC_5120X2160P100_64_27 = 127, + HDMI_VIC_5120X2160P120_64_27 = 193, + HDMI_VIC_7680X4320P24_16_9 = 194, + HDMI_VIC_7680X4320P25_16_9 = 195, + HDMI_VIC_7680X4320P30_16_9 = 196, + HDMI_VIC_7680X4320P48_16_9 = 197, + HDMI_VIC_7680X4320P50_16_9 = 198, + HDMI_VIC_7680X4320P60_16_9 = 199, + HDMI_VIC_7680X4320P100_16_9 = 200, + HDMI_VIC_7680X4320P120_16_9 = 201, + HDMI_VIC_7680X4320P24_64_27 = 202, + HDMI_VIC_7680X4320P25_164_27 = 203, + HDMI_VIC_7680X4320P30_64_27 = 204, + HDMI_VIC_7680X4320P48_64_27 = 205, + HDMI_VIC_7680X4320P50_64_27 = 206, + HDMI_VIC_7680X4320P60_64_27 = 207, + HDMI_VIC_7680X4320P100_64_27 = 208, + HDMI_VIC_7680X4320P120_64_27 = 209, + HDMI_VIC_10240X4320P24_64_27 = 210, + HDMI_VIC_10240X4320P25_64_27 = 211, + HDMI_VIC_10240X4320P30_64_27 = 212, + HDMI_VIC_10240X4320P48_64_27 = 213, + HDMI_VIC_10240X4320P50_64_27 = 214, + HDMI_VIC_10240X4320P60_64_27 = 215, + HDMI_VIC_10240X4320P100_64_27 = 216, + HDMI_VIC_10240X4320P120_64_27 = 217, + HDMI_VIC_4096X2160P100_256_135 = 218, + HDMI_VIC_4096X2160P120_256_135 = 219, +}; + +enum HdmiVideoFormatType { + HDMI_VIDEO_FORMAT_NULL = 0, + HDMI_VIDEO_FORMAT_PROGRESSIVE = 1, + HDMI_VIDEO_FORMA_INTERLACE = 2, + HDMI_VIDEO_FORMA_BUTT, +}; + +enum HdmiColorDeep { + HDMI_COLOR_DEEP_8BITS = 8, + HDMI_COLOR_DEEP_10BITS = 10, + HDMI_COLOR_DEEP_12BITS = 12, + HDMI_COLOR_DEEP_16BITS = 16, + HDMI_COLOR_DEEP_BUTT, +}; + +enum HdmiPhyModeCfg { + HDMI_PHY_MODE_TMDS = 0, + HDMI_PHY_MODE_FRL = 1, + HDMI_PHY_MODE_TXFFE = 2, + HDMI_PHY_MODE_BUTT, +}; + +enum HdmiHdcpMode { + HDMI_HDCP_MODE_AUTO = 0, + HDMI_HDCP_MODE_1_4 = 1, + HDMI_HDCP_MODE_2_2 = 2, + HDMI_HDCP_MODE_BUTT +}; + +struct HdmiVideoDefInfo { + enum HdmiVic vic; + uint32_t pixclk; + uint32_t rate; + uint32_t hactive; + uint32_t vactive; + uint32_t hblank; + uint32_t vblank; + uint32_t hfront; + uint32_t hsync; + uint32_t hback; + uint32_t vfront; + uint32_t vsync; + uint32_t vback; + enum HdmiPictureAspectRatio aspect; + enum HdmiVideoTiming timing; + enum HdmiVideoFormatType formatType; +}; + +/* see hdmi spec2.0 table 10-2. */ +enum Hdmi4kVic { + HDMI_4K_VIC_3840X2160_30 = 1, + HDMI_4K_VIC_3840X2160_25, + HDMI_4K_VIC_3840X2160_24, + HDMI_4K_VIC_4096X2160_24 +}; + +struct HdmiVideo4kInfo { + enum Hdmi4kVic _4kVic; + enum HdmiVic vic; + uint32_t pixclk; + uint32_t rate; + uint32_t hactive; + uint32_t vactive; + enum HdmiPictureAspectRatio aspect; + enum HdmiVideoTiming timing; + enum HdmiVideoFormatType formatType; +}; + +struct HdmiCommonStatus { + bool hotplug; + bool avmute; + bool sinkPowerOn; + enum HdmiTmdsModeType tmdsMode; +}; + +struct HdmiAudioStatus { + bool mute; + bool enable; + bool downSample; + enum HdmiSampleRate sampleRate; + enum HdmiAudioInterfaceType interface; + enum HdmiAudioBitDepth bitDepth; + enum HdmiAudioFormatChannel channel; + uint32_t refN; + uint32_t regN; + uint32_t refCts; + uint32_t regCts; +}; + +struct HdmiVideoStatus { + bool mute; + bool ycbcr2Rgb; + bool rgb2Ycbcr; + bool ycbcr444422; + bool ycbcr422420; + bool ycbcr420422; + bool ycbcr422444; + bool in420Ydemux; + bool out420Ydemux; + bool vSyncPol; + bool hSyncPol; + bool syncPol; + bool dePol; + bool swapHsCs; + enum HdmiColorSpace inColorSpace; + enum HdmiColorSpace outColorSpace; + enum HdmiVideoBitDepth outBitDepth; + enum HdmiQuantizationRange quantization; +}; + +struct HdmiCommonAttr { + bool enableHdmi; + bool enableVideo; + bool enableAudio; + bool xvyccMode; + bool avi; + bool spd; + bool mpeg; + bool audio; + bool drm; + bool hdcpEnable; + bool vsifDolby; + enum HdmiColorSpace colorSpace; + enum HdmiQuantizationRange quantization; + enum HdmiDeepColor deepColor; + enum HdmiHdcpMode hdcpMode; +}; + +enum HdmiVideoBitDepth HdmiCommonDeepClolorConvertToColorDepth(enum HdmiDeepColor deepColor); +enum HdmiDeepColor HdmiCommonColorDepthConvertToDeepClolor(enum HdmiVideoBitDepth colorDepth); +enum HdmiVic HdmiCommonGetVic(enum HdmiVideoTiming timing, + enum HdmiPictureAspectRatio aspect, bool enable3d); +struct HdmiVideoDefInfo *HdmiCommonGetVideoDefInfo(enum HdmiVideoTiming timing, + enum HdmiPictureAspectRatio aspect, bool enable3d); +struct HdmiVideo4kInfo *HdmiCommonGetVideo4kInfo(uint32_t _4kVic); +enum HdmiVideoTiming HdmiCommonGetVideoTiming(enum HdmiVic vic, enum HdmiPictureAspectRatio aspect); +enum HdmiVideoTiming HdmiCommonGetVideo4kTiming(uint32_t _4kVic); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_COMMON_H */ diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h new file mode 100644 index 000000000..3ea46fdfa --- /dev/null +++ b/support/platform/include/hdmi/hdmi_core.h @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_CORE_H +#define HDMI_CORE_H + +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdmi_cec.h" +#include "hdmi_common.h" +#include "hdmi_ddc.h" +#include "hdmi_edid.h" +#include "hdmi_event.h" +#include "hdmi_frl.h" +#include "hdmi_hdcp.h" +#include "hdmi_hdr.h" +#include "hdmi_if.h" +#include "hdmi_infoframe.h" +#include "hdmi_scdc.h" +#include "osal_mutex.h" +#include "platform_core.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define HDMI_ONE_BYTE_MARK 0xFF +#define HDMI_ONE_BYTE_SHIFT 8 +#define HDMI_TWO_BYTES_SHIFT 16 + +struct HdmiPhyCfg { + uint32_t pixelClk; + uint32_t tmdsClk; /* TMDS colck, KHz */ + enum HdmiDeepColor deepColor; /* deep color(color depth) */ + enum HdmiPhyModeCfg modeCfg; /* TMDS/FRL/tx_ffe */ + enum HdmiColorSpace colorSpace; + enum HdmiFrlWorkMode rate; /* lane and rate */ + enum HdmiFrlTxffeMode txffe[4]; /* tx_ffe */ +}; + +struct HdmiTmdsConfig { + uint32_t pixelClk; + uint32_t tmdsClk; + enum HdmiPhyModeCfg mode; + enum HdmiDeepColor deepColor; +}; + +struct HdmiCntlr; + +union HdmiCap { + uint32_t data; + struct CapBitsData { + uint32_t scdc : 1; /* bit0: support scdc */ + uint32_t frl : 1; /* bit1: support frl */ + uint32_t hdr : 1; /* bit2: support hdr */ + uint32_t hdcp: 1; /* bit3: support hdcp */ + uint32_t cec : 1; /* bit4: support cec */ + uint32_t hdmi14 : 1; /* bit5: support hdmi1.4 spec */ + uint32_t hdmi20 : 1; /* bit6: support hdmi2.0 spec */ + uint32_t hdmi21 : 1; /* bit7: support hdmi2.1 spec */ + uint32_t hdcp14 : 1; /* bit8: support hdcp1.4 spec */ + uint32_t hdcp22 : 1; /* bit9: support hdcp2.2 spec */ + uint32_t rgb444 : 1; /* bit10: support rgb444 */ + uint32_t ycbcr444 : 1; /* bit11: support ycbcr444 */ + uint32_t ycbcr422 : 1; /* bit12: support ycbcr422 */ + uint32_t ycbcr420 : 1; /* bit13: support ycbcr420 */ + uint32_t deepColor10bits: 1; /* bit14: support deep color 10 bits */ + uint32_t deepColor12bits: 1; /* bit15: support deep color 12 bits */ + uint32_t deepColor16bits: 1; /* bit16: support deep color 16 bits */ + uint32_t scramble : 1; /* bit17: support scramble */ + uint32_t cecRc : 1; /* bit18: support CEC Remote Control */ + uint32_t rev : 13; /* bit21~31: reserved */ + } bits; +}; + +enum HdmiCapMark { + HDMI_CAP_SCDC_MARK = (1 << 0), + HDMI_CAP_FRL_MARK = (1 << 1), + HDMI_CAP_HDR_MARK = (1 << 2), + HDMI_CAP_HDCP_MARK = (1 << 3), + HDMI_CAP_CEC_MARK = (1 << 4), + HDMI_CAP_HDMI14_MARK = (1 << 5), + HDMI_CAP_HDMI20_MARK = (1 << 6), + HDMI_CAP_HDMI21_MARK = (1 << 7), + HDMI_CAP_HDCP14_MARK = (1 << 8), + HDMI_CAP_HDCP22_MARK = (1 << 9), + HDMI_CAP_RGB444_MARK = (1 << 10), + HDMI_CAP_YCBCR444_MARK = (1 << 11), + HDMI_CAP_YCBCR422_MARK = (1 << 12), + HDMI_CAP_YCBCR420_MARK = (1 << 13), + HDMI_CAP_DEEP_COLOR_10BITES_MARK = (1 << 14), + HDMI_CAP_DEEP_COLOR_12BITES_MARK = (1 << 15), + HDMI_CAP_DEEP_COLOR_16BITES_MARK = (1 << 16), + HDMI_CAP_SCRAMBLE_MARK = (1 << 17), +}; + +struct HdmiCntlrCap { + union HdmiCap baseCap; + uint32_t maxTmdsClock; + uint32_t defTmdsClock; /* unit: MHz */ + uint32_t maxFrlRate; + uint32_t videoTiming; + uint32_t quantization; + uint32_t colorSpace; + uint32_t colorimetry; + uint32_t audioIfType; + uint32_t audioBitDepth; + uint32_t audioSampleRate; + uint32_t audioChannels; + uint32_t hdrColorimetry; + uint32_t hdrUserMode; +}; + +struct HdmiHardwareStatus { + struct HdmiCommonStatus commonStatus; + struct HdmiAudioStatus audioStatus; + struct HdmiVideoStatus videoStatus; + struct HdmiInfoframeStatus infoframeStatus; + struct HdmiHdcpStatus hdcpstatus; +}; + +struct HdmiAudioConfigInfo { + bool enable; + bool downSample; + uint32_t tmdsClock; + uint32_t pixelRepeat; + enum HdmiAudioInterfaceType ifType; + enum HdmiAudioBitDepth bitDepth; + enum HdmiSampleRate sampleRate; + enum HdmiAudioFormatChannel channels; +}; + +struct HdmiCntlrOps { + void (*hardWareInit)(struct HdmiCntlr *cntlr); + void (*hardWareStatusGet)(struct HdmiCntlr *cntlr, struct HdmiHardwareStatus *status); + void (*controllerReset)(struct HdmiCntlr *cntlr); + bool (*hotPlugStateGet)(struct HdmiCntlr *cntlr); + bool (*hotPlugInterruptStateGet)(struct HdmiCntlr *cntlr); + void (*lowPowerSet)(struct HdmiCntlr *cntlr, bool enable); + void (*tmdsModeSet)(struct HdmiCntlr *cntlr, enum HdmiTmdsModeType mode); + int32_t (*tmdsConfigSet)(struct HdmiCntlr *cntlr, struct HdmiTmdsConfig mode); + void (*infoframeEnable)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoframeType, bool enable); + int32_t (*infoframeSend)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoframeType, uint8_t *data, uint32_t len); + int32_t (*infoframeDataSet)(struct HdmiCntlr *cntlr, uint32_t type, uint8_t *data, uint32_t len); + int32_t (*cecMsgSend)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg); + void (*audioPathEnable)(struct HdmiCntlr *cntlr, bool enable); + void (*audioPathSet)(struct HdmiCntlr *cntlr, struct HdmiAudioConfigInfo *config); + void (*phyOutputEnable)(struct HdmiCntlr *cntlr, bool enable); + void (*phyOutputSet)(struct HdmiCntlr *cntlr, struct HdmiPhyCfg *cfg); + void (*blackDataSet)(struct HdmiCntlr *cntlr, bool enable); + void (*videoMuteEnable)(struct HdmiCntlr *cntlr, bool enable); + void (*videoPathSet)(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr); + void (*audioMuteEnable)(struct HdmiCntlr *cntlr, bool enable); + void (*avmuteSet)(struct HdmiCntlr *cntlr, bool enable); + int32_t (*ddcTransfer)(struct HdmiCntlr *cntlr, struct HdmiDdcCfg *ddcCfg); + bool (*scdcSourceScrambleGet)(struct HdmiCntlr *cntlr); + int32_t (*scdcSourceScrambleSet)(struct HdmiCntlr *cntlr, bool enable); + void (*frlSet)(struct HdmiCntlr *cntlr); + int32_t (*frlEnable)(struct HdmiCntlr *cntlr, bool enable); + int32_t (*audioNctsSet)(struct HdmiCntlr *cntlr, struct HdmiFrlAudioNctsConfig *cfg); + void (*frlTrainingConfigSet)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainConfig *cfg); + void (*frlTrainingStart)(struct HdmiCntlr *cntlr); + void (*frlGetTriningRslt)(struct HdmiCntlr *cntlr, struct HdmiFrlTrainRslt *rslt); + void (*hdcpRegInit)(struct HdmiCntlr *cntlr); + int32_t (*hdcpGenerateAksvAndAn)(struct HdmiCntlr *cntlr); + int32_t (*hdcpOptReg)(struct HdmiCntlr *cntlr, enum HdmiHdcpRegOptType type, uint8_t *data, uint32_t len); + void (*hdrTimerSet)(struct HdmiCntlr *cntlr, struct HdmiHdrTimerConfig *config); +}; + +enum HdmiCntlrState { + HDMI_CNTLR_STATE_NONE = 0, + HDMI_CNTLR_STATE_OPEN = (1 << 0), + HDMI_CNTLR_STATE_START = (1 << 1), + HDMI_CNTLR_STATE_STOP = (1 << 2), + HDMI_CNTLR_STATE_CLOSE = (1 << 3), +}; + +struct HdmiDevice { + struct HdmiEdid edid; /* device cap */ + struct HdmiCntlr *cntlr; + void *priv; +}; + +struct HdmiAttr { + struct HdmiCommonAttr commAttr; + struct HdmiAudioAttr audioAttr; + struct HdmiVideoAttr videoAttr; + struct HdmiHdrAttr hdrAttr; +}; + +struct HdmiCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *hdfDevObj; + struct PlatformDevice device; + struct OsalMutex mutex; + struct PlatformQueue *msgQueue; + struct HdmiCntlrCap cap; + struct HdmiAttr attr; + struct HdmiCntlrOps *ops; + uint32_t deviceIndex; + uint32_t state; /* cntlr state. */ + enum HdmiTmdsModeType tmdsMode; + struct HdmiDevice *hdmi; + struct HdmiInfoframe infoframe; + struct HdmiScdc *scdc; + struct HdmiDdc ddc; + struct HdmiFrl *frl; + struct HdmiHdcp *hdcp; + struct HdmiCec *cec; + struct HdmiEvent event; + struct HdmiHdr *hdr; + void *priv; +}; + +static inline void HdmiCntlrLock(struct HdmiCntlr *cntlr) +{ + if (cntlr != NULL) { + (void)OsalMutexLock(&cntlr->mutex); + } +} + +static inline void HdmiCntlrUnlock(struct HdmiCntlr *cntlr) +{ + if (cntlr != NULL) { + (void)OsalMutexUnlock(&cntlr->mutex); + } +} + +static inline struct HdmiCntlr *HdmiCntlrGetByBusNum(uint16_t num) +{ + struct PlatformDevice *device = PlatformManagerGetDeviceByMagic(PlatformManagerGet(PLATFORM_MODULE_HDMI), num); + + if (device == NULL) { + return NULL; + } + return CONTAINER_OF(device, struct HdmiCntlr, device); +} + +static inline void HdmiCntlrLowPowerSet(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->lowPowerSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->lowPowerSet(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrHardWareInit(struct HdmiCntlr *cntlr) +{ + if (cntlr->ops != NULL && cntlr->ops->hardWareInit != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->hardWareInit(cntlr); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrAudioPathEnable(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->audioPathEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->audioPathEnable(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrAudioPathSet(struct HdmiCntlr *cntlr, struct HdmiAudioConfigInfo *config) +{ + if (cntlr->ops != NULL && cntlr->ops->audioPathSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->audioPathSet(cntlr, config); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrAudioMuteEnable(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->audioMuteEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->audioMuteEnable(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrVideoPathSet(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr) +{ + if (cntlr->ops != NULL && cntlr->ops->videoPathSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->videoPathSet(cntlr, attr); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrTmdsModeSet(struct HdmiCntlr *cntlr, enum HdmiTmdsModeType mode) +{ + if (cntlr->ops != NULL && cntlr->ops->tmdsModeSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->tmdsModeSet(cntlr, mode); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrReset(struct HdmiCntlr *cntlr) +{ + if (cntlr->ops != NULL && cntlr->ops->controllerReset != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->controllerReset(cntlr); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrBlackDataSet(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->blackDataSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->blackDataSet(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrPhyOutputEnablet(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrHdrTimerSet(struct HdmiCntlr *cntlr, struct HdmiHdrTimerConfig *config) +{ + if (cntlr->ops != NULL && cntlr->ops->hdrTimerSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->hdrTimerSet(cntlr, config); + HdmiCntlrUnlock(cntlr); + } +} + +static inline void HdmiCntlrAvmuteSet(struct HdmiCntlr *cntlr, bool enable) +{ + if (cntlr->ops != NULL && cntlr->ops->avmuteSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->avmuteSet(cntlr, enable); + HdmiCntlrUnlock(cntlr); + } +} + +int32_t HdmiCntlrParse(struct HdmiCntlr *cntlr, struct HdfDeviceObject *obj); +int32_t HdmiCntlrAdd(struct HdmiCntlr *cntlr); +void HdmiCntlrRemove(struct HdmiCntlr *cntlr); + +int32_t HdmiCntlrOpen(struct HdmiCntlr *cntlr); +int32_t HdmiCntlrGetSinkEdid(struct HdmiCntlr *cntlr, uint8_t *buffer, uint32_t len); +int32_t HdmiCntlrStart(struct HdmiCntlr *cntlr); +int32_t HdmiCntlrStop(struct HdmiCntlr *cntlr); +int32_t HdmiCntlrDeepColorSet(struct HdmiCntlr *cntlr, enum HdmiDeepColor color); +int32_t HdmiCntlrDeepColorGet(struct HdmiCntlr *cntlr, enum HdmiDeepColor *color); +int32_t HdmiCntlrSetVideoAttribute(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr); +int32_t HdmiCntlrSetAudioAttribute(struct HdmiCntlr *cntlr, struct HdmiAudioAttr *attr); +int32_t HdmiCntlrSetHdrAttribute(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *attr); +int32_t HdmiCntlrInfoframeGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); +int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); +void HdmiCntlrClose(struct HdmiCntlr *cntlr); + +bool HdmiHpdStatusDelayGet(struct HdmiCntlr *cntlr); +bool HdmiHpdStatusGet(struct HdmiCntlr *cntlr); +int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void *datat); +int32_t HdmiEventMsgHandleDefault(struct PlatformQueue *queue, struct PlatformMsg *msg); + +bool HdmiEdidSupportFrl(struct HdmiDevice *hdmi); +uint8_t HdmiEdidGetMaxFrlRate(struct HdmiDevice *hdmi); +bool HdmiEdidScdcSupport(struct HdmiDevice *hdmi); +int32_t HdmiCntlrAllocDev(struct HdmiCntlr *cntlr); +void HdmiCntlrFreeDev(struct HdmiCntlr *cntlr); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_CORE_H */ diff --git a/support/platform/include/hdmi/hdmi_ddc.h b/support/platform/include/hdmi/hdmi_ddc.h new file mode 100644 index 000000000..cdd9cf60c --- /dev/null +++ b/support/platform/include/hdmi/hdmi_ddc.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_DDC_H +#define HDMI_DDC_H + +#include "hdf_base.h" +#include "osal_mutex.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* + * DDC(Display Data Channel) + * The DDC channel is used by an HDMI Source to determine the capabilities and characteristics of + * the Sink by reading the E-EDID data structure. + * The DDC is also uesd to exchange point-to-point dynamic data between the Source and the Sink + * using a new DDC address for the HDMI Status and Control Data Channel(SCDC). + * In addition, The DDC is also uesd for HDCP to exchange key selection vector and other information. + */ +#define HDMI_DDC_EDID_DEV_ADDRESS 0xA0 +#define HDMI_DDC_SCDC_DEV_ADDRESS 0xA8 +#define HDMI_DDC_HDCP_DEV_ADDRESS 0x74 + +enum HdmiDdcDeviceType { + HDMI_DDC_DEV_EDID = 0, + HDMI_DDC_DEV_SCDC = 1, + HDMI_DDC_DEV_HDCP = 2, + HDMI_DDC_DEV_BUTT, +}; + +enum HdmiDdcMode { + HDMI_DDC_MODE_READ_SINGLE_NO_ACK = 0, + HDMI_DDC_MODE_READ_SINGLE_ACK = 1, + HDMI_DDC_MODE_READ_MUTIL_NO_ACK = 2, + HDMI_DDC_MODE_READ_MUTIL_ACK = 3, + HDMI_DDC_MODE_READ_SEGMENT_NO_ACK = 4, + HDMI_DDC_MODE_READ_SEGMENT_ACK = 5, + HDMI_DDC_MODE_WRITE_MUTIL_NO_ACK = 6, + HDMI_DDC_MODE_WRITE_MUTIL_ACK = 7, + HDMI_DDC_MODE_BUTT, +}; + +struct HdmiDdcCfg { + enum HdmiDdcDeviceType type; + enum HdmiDdcMode mode; + bool readFlag; + uint32_t devAddr; + uint8_t offset; + uint8_t segment; /* see VESA spec. 1 segment is 256 bytes. */ + uint32_t dataLen; + uint8_t *data; +}; + +struct HdmiDdc { + struct OsalMutex ddcMutex; + bool init; + void *priv; +}; + +int32_t HdmiDdcTransfer(struct HdmiDdc *ddc, struct HdmiDdcCfg *cfg); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_DDC_H */ diff --git a/support/platform/include/hdmi/hdmi_dfm.h b/support/platform/include/hdmi/hdmi_dfm.h new file mode 100644 index 000000000..a22aee86e --- /dev/null +++ b/support/platform/include/hdmi/hdmi_dfm.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_DFM_H +#define HDMI_DFM_H + +#include "hdmi_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* + * DFM(Data Flow Metering). + * During data transmission in FRL mode, there is a lot of bandwidth redundancy (blanking period) or slight bandwidth + * insufficiency (active video). In order for the link to tolerate these fluctuations, source and sink need to use + * buffers. To limit the size of the buffer required, the protocol adds the Data Flow Metering requirement. + */ +#define HDMI_DFM_FRL_CHAR_NUM_PER_CB 502 +#define HDMI_DFM_RS_NUM_PER_CB 8 +/* A FRL Character Block(CB) contains 502 FRL Characters and 8 RS check characters. */ +#define HDMI_DFM_CHAR_NUM_PER_CB (HDMI_DFM_FRL_CHAR_NUM_PER_CB + HDMI_DFM_RS_NUM_PER_CB) + +/* + * A FRL Super Block(SB) contains four FRL Character Blocks. + * Each FRL Super Block is preceded by a group of three or four Start Super Blocks (SSB) or a group of three or + * four Scrambler Reset (SR) characters. + */ +#define HDMI_DFM_FRL_CB_NUM_PER_SB 4 +#define HDMI_DFM_FRL_SB_LEN(lane) (HDMI_DFM_FRL_CB_NUM_PER_SB * HDMI_DFM_CHAR_NUM_PER_CB + lane) + +#define HDMI_DFM_FRL_PIXELCLK_TOLERANCE 5 /* 0.50% */ +#define HDMI_DFM_FRL_BITRATE_TOLERANCE 3 /* 300 */ +#define HDMI_DFM_FRL_AUDIOCLK_TOLERANCE 1 +#define HDMI_DFM_MAGNIFICATION_8 8 +#define HDMI_DFM_FRL_MAX_TB_BORROW 400 +#define HDMI_DFM_RATE_MAGNIFICATION 100000 +#define HDMI_DFM_OVERHEAD_SIZE 300 + +#define HDMI_AUDIO_CHANNEL_ALLOC_TYPE1 1 +#define HDMI_AUDIO_CHANNEL_ALLOC_TYPE2 2 +#define HDMI_AUDIO_CHANNEL_ALLOC_TYPE3 3 + +/* + * Packets per sample. + * This is the number of audio packets required to carry each sample. + * x100. + */ +#define HDMI_AUDIO_AP_SIZE_25 25 +#define HDMI_AUDIO_AP_SIZE_100 100 +#define HDMI_AUDIO_AP_SIZE_200 200 +#define HDMI_AUDIO_AP_SIZE_300 300 +#define HDMI_AUDIO_AP_SIZE_400 400 + +enum HdmiAudioPacketType { + HDMI_AUDIO_SAMPLE_PACKET = 0x02, + HDMI_ONE_BIT_AUDIO_SAMPLE_PACKET = 0x07, + HDMI_DTS_AUDIO_PACKET = 0x08, + HDMI_HBR_AUDIO_PACKET = 0x09, + HDMI_AUDIO_3D_SAMPLE_PACKET = 0x0B, + HDMI_ONE_BIT_AUDIO_3D_SAMPLE_PACKET = 0x0C, + HDMI_MULTI_STREAM_AUDIO_SAMPLE_PACKET = 0x0E, + HDMI_ONE_BIT_MULTI_STREAM_AUDIO_SAMPLE_PACKET = 0x0F, +}; + +enum HdmiDfmPixelFormatMode { + HDMI_DFM_PIXEL_FORMAT_MODE_0 = 0, + HDMI_DFM_PIXEL_FORMAT_MODE_1, + HDMI_DFM_PIXEL_FORMAT_MODE_2, + HDMI_DFM_PIXEL_FORMAT_MODE_3 +}; + +struct HdmiDfmInfo { + bool audioSupport; + bool videoSupport; + bool uncompressSupport; + bool isExtraMode; + bool canbeTrans; + uint32_t htotal; + uint32_t vtotal; + uint32_t bpp; /* Bits per Pixel */ + uint32_t cFrlSb; /* Total FRL Characters Per SuperBlock(include SSB/SR) */ + uint32_t overheadSb; + uint32_t overheadRs; + uint32_t overheadMap; + uint32_t overheadMin; + uint32_t overheadMax; + uint32_t lineMinTime; /* minimum Video Line period */ + uint32_t lineMaxTime; /* maximum Video Line period */ + uint32_t audioAp; /* the number of audio packets required to carry each sample */ + uint32_t audioRap; /* Average Audio Related Packet Rate */ + uint32_t avgAudioPacketsPerLine; /* Average Required Packets per line */ + uint32_t audioPacketsLine; /* Packets per Hblank that must be supportable. */ + uint32_t hblankAudioMin; /* */ + uint32_t cFrlFree; + uint32_t cFrlRcMargin; + uint32_t cFrlRcSavings; + uint32_t activeBytesPerLine; /* Video Bytes per line */ + uint32_t activeTbPerLine; /* Required Characters to carry Active Video per line */ + uint32_t hblankTbPerLine; /* Required Characters to carry H-Blank Video per line */ + uint32_t activeTimeRef; + uint32_t blankTimeRef; + uint32_t activeTimeMin; + uint32_t blankTimeMin; + int32_t tBorrow; + int32_t tbBorrow; + uint32_t cFrlActualPayload; + uint32_t utilization; + int32_t margin; + uint32_t avgTbRate; + uint64_t pixelClk; + uint64_t maxPixelClk; /* maximum legal pixel rate */ + uint64_t minPixelClk; /* minimum legal pixel rate */ + uint64_t maxBitRate; /* FRL max bit rate */ + uint64_t minBitRate; /* FRL min bit rate */ + uint64_t maxFrlCharRate; /* max FRL Character Rate */ + uint64_t minFrlCharRate; /* min FRL Character Rate */ + uint32_t maxFrlCharsPerLine; /* max FRL Characters per line Period */ + uint32_t minFrlCharsPerLine; /* min FRL Characters per line Period */ +}; + +struct HdmiDfmParam { + uint32_t hactive; + uint32_t vactive; + uint32_t hblank; + uint32_t vblank; + uint32_t hsync; + uint32_t hback; + uint32_t hfront; + uint32_t vsync; + uint32_t vback; + uint32_t vfront; + uint32_t vfreq; + uint32_t colorDepth; + uint32_t pixelFormat; /* 1:420, 2:422, 3:RGB444 */ + uint32_t laneNum; + uint32_t bitRate; + uint32_t audioRate; + uint32_t packetType; + uint32_t layout; + uint32_t acat; +}; + +uint32_t HdmiDfmGetPixelFormat(enum HdmiColorSpace colorSpace); +void HdmiDfmFillParam(struct HdmiDfmParam *param, struct HdmiVideoDefInfo *videoInfo, + struct HdmiAudioAttr *audioAttr, enum HdmiColorSpace colorSpace, enum HdmiDeepColor deepColor); +bool HdmiDfmFormatSupport(struct HdmiDfmParam *param); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_DFM_H */ diff --git a/support/platform/include/hdmi/hdmi_dispatch.h b/support/platform/include/hdmi/hdmi_dispatch.h new file mode 100644 index 000000000..c7292369c --- /dev/null +++ b/support/platform/include/hdmi/hdmi_dispatch.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_DISPATCH_H +#define HDMI_DISPATCH_H + +#include "hdf_base.h" + +#ifndef __USER__ +#include "devsvc_manager_clnt.h" +#endif + +#ifdef __USER__ +#include "hdf_io_service_if.h" +#endif + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#ifndef __USER__ +int32_t HdmiIoDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply); +#endif + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_NCTS_H */ diff --git a/support/platform/include/hdmi/hdmi_edid.h b/support/platform/include/hdmi/hdmi_edid.h new file mode 100644 index 000000000..0bc17dfaa --- /dev/null +++ b/support/platform/include/hdmi/hdmi_edid.h @@ -0,0 +1,635 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_EDID_H +#define HDMI_EDID_H + +#include "hdf_base.h" +#include "hdmi_ddc.h" +#include "hdmi_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* (EDID)Extended Display Identification Data */ +#define HDMI_EDID_SINGLE_BLOCK_SIZE 128 +#define HDMI_EDID_MAX_BLOCK_NUM 4 +#define HDMI_EDID_TOTAL_SIZE (HDMI_EDID_SINGLE_BLOCK_SIZE * HDMI_EDID_MAX_BLOCK_NUM) +#define HDMI_EDID_MAX_VIC_COUNT 128 + +#define HDMI_EDID_BIT0_MARK 0x01 +#define HDMI_EDID_BIT1_MARK 0x02 +#define HDMI_EDID_BIT2_MARK 0x04 +#define HDMI_EDID_BIT3_MARK 0x08 +#define HDMI_EDID_BIT4_MARK 0x10 +#define HDMI_EDID_BIT5_MARK 0x20 +#define HDMI_EDID_BIT6_MARK 0x40 +#define HDMI_EDID_BIT7_MARK 0x80 +#define HDMI_EDID_UPPER_NIBBLE_MARK 0xf0 +#define HDMI_EDID_LOWER_NIBBLE_MARK 0x0f +#define HDMI_EDID_BITS_OF_ONE_BYTE 8 +#define HDMI_EDID_ONE_BYTE_SHIFT 8 +#define HDMI_EDID_6_BITS_SHIFT 6 +#define HDMI_EDID_NIBBLE_SHIFT 4 +#define HDMI_EDID_2_BITS_SHIFT 2 + +#define HDMI_EDID_CHECK_SUM_MARK 0xff + +/* edid header */ +#define HDMI_EDID_BLOCK_HEADER_FIELD_LEN 8 + +/* edid vendor/product info */ +#define HDMI_EDID_MANUFACRURER_NAME_FIELD_LEN 2 +#define HDMI_EDID_MANUFACRURER_NAME_MAX_LEN 4 +#define HDMI_EDID_MANUFACRURER_NAME_CHAR_MARK 0x1F /* 5 bits */ +#define HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT 5 +#define HDMI_EDID_MANUFACRURER_NAME_LOW_INVALID 0 +#define HDMI_EDID_MANUFACRURER_NAME_HIGH_INVALID 27 +#define HDMI_EDID_MANUFACRURER_NAME_SHIFT 8 +#define HDMI_EDID_PRODUCT_CODE_FIELD_LEN 2 +#define HDMI_EDID_PRODUCT_CODE_SHIFT 8 +#define HDMI_EDID_SERIAL_NUMBER_FIELD_LEN 4 +#define HDMI_EDID_SERIAL_NUMBER_SHIFT 8 +#define HDMI_EDID_WEEK_LOW_VALID 1 +#define HDMI_EDID_WEEK_HIGH_VALID 53 +#define HDMI_EDID_YEAR_VALID 0xFF +#define HDMI_EDID_YEAR_BASE 1990 + +struct HdmiEdidVendorInfo { + char mfrName[HDMI_EDID_MANUFACRURER_NAME_MAX_LEN]; + uint16_t productCode; + uint32_t serialNumber; + uint8_t week; + uint8_t year; +}; + +#define HDMI_EDID_VERSION_NUM 1 +#define HDMI_EDID_REVISION_NUM 3 + +/* edid version info */ +struct HdmiEdidVersionInfo { + uint8_t version; + uint8_t revision; +}; + +/* edid basic display parameters and features */ +struct HdmiEdidBasicDispParamInfo { + uint8_t width; /* unit: cm */ + uint8_t height; /* unit: cm */ +}; + +/* edid color characteristics */ +#define HDMI_EDID_COLOR_LOW_BITS_MARK 0x03 +#define HDMI_EDID_COLOR_RED_X_LOW_OFFSET 6 +#define HDMI_EDID_COLOR_RED_Y_LOW_OFFSET 4 +#define HDMI_EDID_COLOR_GREEN_X_LOW_OFFSET 2 +#define HDMI_EDID_COLOR_BLUE_X_LOW_OFFSET 6 +#define HDMI_EDID_COLOR_BLUE_Y_LOW_OFFSET 4 +#define HDMI_EDID_COLOR_WHITE_X_LOW_OFFSET 2 +#define HDMI_EDID_COLOR_HIGH_OFFSET 2 + +struct HdmiEdidColorInfo { + uint16_t redX; + uint16_t redY; + uint16_t greenX; + uint16_t greenY; + uint16_t blueX; + uint16_t blueY; + uint16_t whiteX; + uint16_t whiteY; +}; + +/* edid established timings */ +#define HDMI_EDID_ESTABLISHED_TIMINGS_FIELD_LEN 3 + +enum HdmiEdidEstablishTiming { + HDMI_EDID_ESTABLISHED_TIMING_VESA_800X600_60 = 0, + HDMI_EDID_ESTABLISHED_TIMING_VESA_800X600_56 = 1, + HDMI_EDID_ESTABLISHED_TIMING_VESA_640X480_75 = 2, + HDMI_EDID_ESTABLISHED_TIMING_VESA_640X480_72 = 3, + HDMI_EDID_ESTABLISHED_TIMING_640X480_67 = 4, + HDMI_EDID_ESTABLISHED_TIMING_VGA_640X480_60 = 5, + HDMI_EDID_ESTABLISHED_TIMING_XGA_720X400_88 = 6, + HDMI_EDID_ESTABLISHED_TIMING_VGA_720X400_70 = 7, + HDMI_EDID_ESTABLISHED_TIMING_VESA_1280X1024_75 = 8, + HDMI_EDID_ESTABLISHED_TIMING_VESA_1024X768_75 = 9, + HDMI_EDID_ESTABLISHED_TIMING_VESA_1024X768_70 = 10, + HDMI_EDID_ESTABLISHED_TIMING_VESA_1024X768_60 = 11, + HDMI_EDID_ESTABLISHED_TIMING_1024X768_87 = 12, + HDMI_EDID_ESTABLISHED_TIMING_832X624_75 = 13, + HDMI_EDID_ESTABLISHED_TIMING_VESA_800X600_75 = 14, + HDMI_EDID_ESTABLISHED_TIMING_VESA_800X600_72 = 15, + HDMI_EDID_ESTABLISHED_TIMING_VESA_1152X870_75 = 16, + HDMI_EDID_ESTABLISHED_TIMING_BUTT, +}; + +struct HdmiEdidEstablishedTimingsInfo { + uint32_t estTimingsNum; + uint32_t estTimings[HDMI_EDID_ESTABLISHED_TIMING_BUTT]; +}; + +/* edid standard timing */ +#define HDMI_EDID_STANDARD_TIMING_FIELD_LEN 16 +#define HDMI_EDID_STANDARD_TIMING_COUNT 8 +#define HDMI_EDID_PER_STANDARD_TIMING_BYTE_NUM 2 +#define HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG 0x01 +#define HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE 31 +#define HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_FACTOR 8 +#define HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_BASE 60 +#define HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK 0x3F + +#define HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_MARK 0xC0 +#define HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_SHIFT 6 + +enum HdmiEdidStdTimingAspectRate { + HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_10 = 0, + HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_5_4 = 1, + HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_4_3 = 2, + HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_9 = 3, +}; + +struct HdmiEdidStdTimingInfo { + uint32_t horizPixel; + uint32_t vertPixel; + uint32_t refreshRate; +}; + +/* edid detailed timing descriptor */ +#define HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN 18 +#define HDMI_EDID_DETAILED_TIMING_PIXEL_CLK_FIELD_LEN 2 +#define HDMI_EDID_DETAILED_TIMING_PIXEL_CLK_KHZ_FACTOR 10 +#define HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK 0xF0 +#define HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK 0x0F +#define HDMI_EDID_DETAILED_TIMING_HS_OFFSET_MARK 0xC0 +#define HDMI_EDID_DETAILED_TIMING_HS_PULSE_WIDTH_MARK 0x30 +#define HDMI_EDID_DETAILED_TIMING_VS_OFFSET_MARK 0x0C +#define HDMI_EDID_DETAILED_TIMING_VS_PULSE_WIDTH_MARK 0x03 +#define HDMI_EDID_DETAILED_TIMING_STEREO_MARK 0x60 +#define HDMI_EDID_DETAILED_TIMING_STEREO_SEQUENTIAL_R 0x02 +#define HDMI_EDID_DETAILED_TIMING_STEREO_SEQUENTIAL_L 0x04 +#define HDMI_EDID_DETAILED_TIMING_STEREO_INTERLEAVED_2R 0x03 +#define HDMI_EDID_DETAILED_TIMING_STEREO_INTERLEAVED_2L 0x05 +#define HDMI_EDID_DETAILED_TIMING_STEREO_INTERLEAVED_4 0x06 +#define HDMI_EDID_DETAILED_TIMING_STEREO_INTERLEAVED_SBS 0x07 +#define HDMI_EDID_DETAILED_TIMING_SYNC_SIGNAL_TYPE_MARK 0x0E +#define HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_0 0x00 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_1 0x01 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_2 0x02 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_3 0x03 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HN_4 0x04 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HP_5 0x05 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HN_6 0x06 +#define HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HP_7 0x07 +#define HDMI_EDID_MAX_DETAILED_TIMING_COUNT 10 + +struct HdmiEdidDetailedTimingBlockInfo { + uint8_t pixelClk[HDMI_EDID_DETAILED_TIMING_PIXEL_CLK_FIELD_LEN]; + uint8_t hActive; + uint8_t hBlanking; + uint8_t hActiveBlanking; + uint8_t vActive; + uint8_t vBlanking; + uint8_t vActiveBlanking; + uint8_t hSyncOffset; + uint8_t hSyncPulseWidth; + uint8_t vsOffesetPulseWidth; + uint8_t hsOffsetVsOffset; + uint8_t hImageSize; + uint8_t vImageSize; + uint8_t hvImageSize; + uint8_t hBorder; + uint8_t vBorder; + uint8_t flags; +}; + +struct HdmiEdidPreferredTimingInfo { + uint32_t pixelClk; /* unit: KHz */ + uint32_t hActive; /* horizontal active area */ + uint32_t hBackBlank; /* horizontal back blank */ + uint32_t hFrontBlank; /* horizontal front blank */ + uint32_t hSyncPluseWidth; /* horizontal sync pluse width */ + uint32_t vActive; /* vertical active area */ + uint32_t vBackBlank; /* vertical back blank */ + uint32_t vFrontBlank; /* vertical front blank */ + uint32_t vSyncPluseWidth; /* vertical sync pluse width */ + uint32_t imageWidth; /* image width */ + uint32_t imageHeight; /* image height */ + bool interlaceFlag; /* interlace flag */ + bool idv; /* flag of data valid signal is needed flip */ + bool ihs; /* flag of horizontal sync pulse is needed flip */ + bool ivs; /* flag of vertical sync pulse is needed flip */ +}; + + +/* edid monitor descriptor */ +#define HDMI_EDID_MONITOR_FLAGS_FIELD_LEN 3 +#define HDMI_EDID_MONITOR_DATA_FIELD_LEN 13 +#define HDMI_EDID_MAX_SINK_NAME_COUNT 14 + +enum HdmiEdidMonitorDataType { + HDMI_EDID_MONITOR_DATA_NAME = 0xFC, + HDMI_EDID_MONITOR_DATA_RANGE_LIMIT = 0xFD, + HDMI_EDID_MONITOR_DATA_STRING = 0xFE, + HDMI_EDID_MONITOR_DATA_SERIAL_NUMBER = 0xFF, +}; + +struct HdmiEdidMonitorBlockInfo { + uint8_t flags[HDMI_EDID_MONITOR_FLAGS_FIELD_LEN]; + uint8_t dataTag; + uint8_t flag; + uint8_t data[HDMI_EDID_MONITOR_DATA_FIELD_LEN]; +}; + +/* edid extension flag and checksum */ +#define HDMI_EDID_EXTENSION_BLOCK_ADDR 0x7E +#define HDMI_EDID_CHECKSUM_ADDR 0x7F + +struct HdmiEdidFirstBlockInfo { + uint8_t header[HDMI_EDID_BLOCK_HEADER_FIELD_LEN]; + uint8_t vendorName[HDMI_EDID_MANUFACRURER_NAME_FIELD_LEN]; + uint8_t productCode[HDMI_EDID_PRODUCT_CODE_FIELD_LEN]; + uint8_t serialNumber[HDMI_EDID_SERIAL_NUMBER_FIELD_LEN]; + uint8_t week; /* + * The designated values for this field range from 1 to 53. If this field is unused, the value + * should be set to 0. If the next field is used for Model Year, then 0xFF should be set. + */ + uint8_t year; /* This value is determined by the actual year of production minus 1990. */ + uint8_t version; + uint8_t revision; + uint8_t videoInput; + uint8_t width; /* unit: cm */ + uint8_t height; /* unit: cm */ + uint8_t gamma; /* Display Transfer Characteristics */ + uint8_t features; + uint8_t redGreenLow; + uint8_t blueWhiteLow; + uint8_t redX; + uint8_t redY; + uint8_t greenX; + uint8_t greenY; + uint8_t blueX; + uint8_t blueY; + uint8_t whiteX; + uint8_t whiteY; + uint8_t estTimings[HDMI_EDID_ESTABLISHED_TIMINGS_FIELD_LEN]; + uint8_t stdTiming[HDMI_EDID_STANDARD_TIMING_FIELD_LEN]; + uint8_t detailedTiming1[HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN]; + uint8_t detailedTiming2[HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN]; + uint8_t detailedTiming3[HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN]; + uint8_t detailedTiming4[HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN]; + uint8_t extensionFlag; + uint8_t checksum; +}; + +/* edid extension block */ +#define HDMI_EDID_CTA_EXTENSION_TAG 0x02 +#define HDMI_EDID_CTA_EXTENSION3_REVISION 0x03 +#define HDMI_EDID_EXTENSION_DATA_BLOCK_LEN_MARK 0x1F +#define HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_MARK 0xE0 +#define HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_SHIFT 5 +#define HDMI_EDID_EXTENSION_BLOCK_OFFSET 4 +#define HDMI_EDID_EXTENSION_D_INVALID_MIN_VAL 4 + +enum HdmiEdidExtDataBlockType { + HDMI_EDID_NULL_DATA_BLOCK = 0, + HDMI_EDID_AUDIO_DATA_BLOCK = 1, + HDMI_EDID_VIDEO_DATA_BLOCK = 2, + HDMI_EDID_VENDOR_SPECIFIC_DATA_BLOCK = 3, + HDMI_EDID_SPEAKER_ALLOCATION_DATA_BLOCK = 4, + HDMI_EDID_VESA_DTC_DATA_BLOCK = 5, /* VESA Display Transfer Characteristic Data Block */ + HDMI_EDID_USE_EXT_DATA_BLOCK = 7, /* Use Extended Tag */ +}; + +struct HdmiEdidColorSpace { + bool rgb444; + bool ycbcr422; + bool ycbcr444; + bool ycbcr420; +}; + +/* edid extension block: Audio Data Block */ +#define HDMI_EDID_EXTENSION_SHORT_AUDIO_DESCRIPTOR_LEN 3 +#define HDMI_EDID_EXTENSION_MAX_SHORT_AUDIO_DESCRIPTOR_NUM 10 +#define HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_MARK 0x78 +#define HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_SHIFT 3 +#define HDMI_EDID_EXTENSION_AUDIO_MAX_CHANNEL_MARK 0x07 +#define HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM 8 +#define HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM 6 +#define HDMI_EDID_EXTENSION_AUDIO_BIT_RATE_FACTOR 8 +#define HDMI_EDID_EXTENSION_AUDIO_CAP_COUNT 16 + + +struct HdmiEdidAudioInfo { + enum HdmiAudioCodingType formatCode; + uint32_t sampleRateNum; + enum HdmiSampleRate sampleRate[HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM]; + uint32_t bitDepthNum; + enum HdmiAudioBitDepth bitDepth[HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM]; + uint8_t channels; + uint32_t maxBitRate; /* unit: KHz */ +}; + +/* edid extension block: Video Data Block */ +#define HDMI_EDID_EXTENSION_VIC_NATIVE_MAX 64 +#define HDMI_EDID_EXTENSION_VIC_LOWER7_MARK 0x7F +#define HDMI_EDID_EXTENSION_MAX_VIC_COUNT 128 +#define HDMI_EDID_EXTENSION_VIC_INVALID_LOW 128 +#define HDMI_EDID_EXTENSION_VIC_INVALID_HIGH 192 + +/* + * Each supported Video Format is represented by a Short Video Descriptor (SVD) containing + * a Video Identification Code (VIC) and, in the case of VICs 1 through 64, a Native Video Format indicator. + */ +struct HdmiEdidVideoInfo { + uint32_t vicNum; + uint32_t vic[HDMI_EDID_EXTENSION_MAX_VIC_COUNT]; + uint32_t nativeFormat; +}; + +/* edid extension block: (VSDB)Vendor-Specific Data Block */ +#define HDMI_EDID_EXTENSION_VSDB_LEN 3 +#define HDMI_EDID_EXTENSION_VSDB_IEEE_1ST 0x03 +#define HDMI_EDID_EXTENSION_VSDB_IEEE_2ND 0x0C +#define HDMI_EDID_EXTENSION_VSDB_IEEE_3RD 0x00 +#define HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR 0xF +#define HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE 340 /* unit: Mcsc */ +#define HDMI_EDID_EXTENSION_TMDS_FACTOR 5 /* unit: MHz */ +#define HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK 0x1F +#define HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK 0xE0 +#define HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT 5 +#define HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK 0x60 +#define HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT 5 +#define HDMI_EDID_EXTENSION_VSDB_3D_STR_INVALID_MARK 0x03 + +struct HdmiEdidVsdbCecAddr { + bool addrValid; + uint8_t phyAddrA; + uint8_t phyAddrB; + uint8_t phyAddrC; + uint8_t phyAddrD; +}; + +struct HdmiEdidDeepColor { + bool dcY444; + bool dc30bit; + bool dc36bit; + bool dc48bit; +}; + +struct HdmiEdidExtVsdbInfo { + struct HdmiEdidVsdbCecAddr cecAddr; + struct HdmiEdidDeepColor deepColor; + bool supportAi; + bool supportDviDual; + bool latencyFieldsPresent; + bool iLatencyFieldsPresent; + bool hdmiVideoPresent; + uint8_t videoLatency; + uint8_t audioLatency; + uint8_t interlacedVideoLatency; + uint8_t interlacedAudioLatency; + bool _3dPresent; + bool _3dMultiPresent; + bool support3dType[HDMI_VS_VIDEO_3D_BUTT]; +}; + +/* edid extension block: (HF-VSDB)HDMI Forum Vendor-Specific Data Block */ +#define HDMI_EDID_EXTENSION_HFVSDB_IEEE_1ST 0xD8 +#define HDMI_EDID_EXTENSION_HFVSDB_IEEE_2ND 0x5D +#define HDMI_EDID_EXTENSION_HFVSDB_IEEE_3RD 0xC4 +#define HDMI_EDID_EXTENSION_HFVSDB_VERSION 0x01 +#define HDMI_EDID_EXTENSION_HFVSDB_MIN_INVALID_LEN 7 +#define HDMI_EDID_EXTENSION_HFVSDB_MAX_INVALID_LEN 31 + +/* deep color Y420(4:2:0) */ +struct HdmiEdidExtHfVsdbDeepColor { + bool dc30bit; + bool dc36bit; + bool dc48bit; +}; + +/* dsc(Display Stream Compression ) */ +struct HdmiEdidExtHfVsdbDscInfo { + bool dsc1p2; + bool dscNative420; + bool dscAllBpp; + bool dsc10bpc; + bool dsc20bpc; + bool dsc16bpc; + uint8_t dscMaxSlices; + uint8_t dscMaxFrlRate; + uint8_t dscTotalChunkKBytes; +}; + +struct HdmiEdidExtHfVsdbInfo { + bool scdcPresent; + bool rrCapable; /* read request cap. */ + bool lte340McscScramble; + bool independentView; + bool dualView; + bool _3dOsdDisparity; + struct HdmiEdidExtHfVsdbDeepColor dc; + /* hdmi 2.1 */ + uint8_t maxFrlRate; + bool fapaStartLocation; + bool allm; + bool fva; + bool cnmVrr; + bool cinemaVrr; + bool mDelta; + uint8_t vrrMin; + uint16_t vrrMax; + struct HdmiEdidExtHfVsdbDscInfo dscInfo; +}; + +/* edid extension block: Speaker Allocation Data Block */ +#define HDMI_EDID_EXTENSION_SADB_MIN_INVALID_LEN 2 + +enum HdmiEdidAudioSpeaker { + HDMI_EDID_AUDIO_SPEAKER_FL_FR = 0, + HDMI_EDID_AUDIO_SPEAKER_LFE = 1, + HDMI_EDID_AUDIO_SPEAKER_FC = 2, + HDMI_EDID_AUDIO_SPEAKER_BL_BR = 3, + HDMI_EDID_AUDIO_SPEAKER_BC = 4, + HDMI_EDID_AUDIO_SPEAKER_FLC_FRC = 5, + HDMI_EDID_AUDIO_SPEAKER_RLC_RRC = 6, + HDMI_EDID_AUDIO_SPEAKER_FLW_FRW = 7, + HDMI_EDID_AUDIO_SPEAKER_TPFL_TPFH = 8, + HDMI_EDID_AUDIO_SPEAKER_TPC = 9, + HDMI_EDID_AUDIO_SPEAKER_TPFC = 10, + HDMI_EDID_AUDIO_SPEAKER_BUTT, +}; + +/* + * If the Tag Code is 7 (Use Extended Tag) then the second byte of the data block contains the Extended + * Tag Code, which indicates the actual type of the data block. + */ +enum HdmiEdidExtExtenedDataBlockType { + HDMI_EDID_EXT_VCDB = 0, /* Video Capability Data Block */ + HDMI_EDID_EXT_VSVDB = 1, /* Vendor-Specific Video Data Block */ + HDMI_EDID_EXT_VESA_DDDB = 2, /* VESA Display Device Data Block */ + HDMI_EDID_EXT_VESA_VTBE = 3, /* VESA Video Timing Block Extension */ + HDMI_EDID_EXT_CDB = 5, /* Colorimetry Data Block */ + HDMI_EDID_EXT_HDR_SMDB = 6, /* HDR Static Metadata Data Block */ + HDMI_EDID_EXT_HDR_DMDB = 7, /* HDR Dynamic Metadata Data Block */ + HDMI_EDID_EXT_VFPDB = 13, /* Video Format Preference Data Block */ + HDMI_EDID_EXT_YCBCR420_VDB = 14, /* YCBCR 4:2:0 Video Data Block */ + HDMI_EDID_EXT_YCBCR420_CMDB = 15, /* YCBCR 4:2:0 Capability Map Data Block */ + HDMI_EDID_EXT_VSADB = 17, /* Vendor-Specific Audio Data Block */ + HDMI_EDID_EXT_RCDB = 19, /* Room Configuration Data Block */ + HDMI_EDID_EXT_SLDB = 20, /* Speaker Location Data Block */ + HDMI_EDID_EXT_INFOFRAME_DB = 32, /* InfoFrame Data Block (includes one or more Short InfoFrame Descriptors) */ + HDMI_EDID_EXT_BUTT, +}; + +/* edid extension block: Colorimetry Data Block */ +#define HDMI_EDID_CDB_LEN 3 + +struct HdmiEdidColorimetry { + bool xvYcc601; + bool xvYcc709; + bool sYcc601; + bool opYcc601; + bool opRgb; + bool bt2020cYcc; + bool bt2020Ycc; + bool bt2020Rgb; + bool dciP3; + uint8_t md; +}; + +/* edid extension block: Vendor-Specific Video Data Block */ +#define HDMI_EDID_VSVDB_DOLBY_OUI 0x00D046 +#define HDMI_EDID_VSVDB_DOLBY_VERSION_0 0x00 +#define HDMI_EDID_VSVDB_DOLBY_VERSION_1 0x01 +#define HDMI_EDID_VSVDB_DOLBY_VERSION_0_LEN 27 +#define HDMI_EDID_VSVDB_DOLBY_VERSION_1_LEN 14 +#define HDMI_EDID_VSVDB_DOLBY_LOWER_2BIT_MARK 0x03 +#define HDMI_EDID_VSVDB_DOLBY_LOWER_3BIT_MARK 0x07 +#define HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK 0x7F +#define HDMI_EDID_VSVDB_DOLBY_VERSION_MARK 0xE0 +#define HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT 5 +#define HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK 0x1C +#define HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT 2 + + +struct HdmiEdidVsvdbDolbyCap { + uint32_t oui; + uint8_t version; + bool yuv422; + bool b2160p60; /* capable of processing a max timing 3840X2160p60. */ + bool globalDimming; + uint16_t redX; + uint16_t redY; + uint16_t greenX; + uint16_t greenY; + uint16_t blueX; + uint16_t blueY; + uint16_t whiteX; /* only version0 support */ + uint16_t whiteY; /* only version0 support */ + uint16_t minLuminance; + uint16_t maxLuminance; + uint8_t dMajorVer; /* only version0 support */ + uint8_t dMinorVer; /* only version0 support */ + bool colorimetry; /* only version1 support */ + uint8_t dmVer; /* only version1 support */ +}; + +/* edid extension block: Video Capability Data Block */ +#define HDMI_EDID_VCDB_LEN 2 + +struct HdmiEdidVideoCapability { + bool qy; /* Quantization Range(Applies to YCC only) */ + bool qs; /* Quantization Range Selectable(Applies to RGB only) */ +}; + +/* edid extension block: HDR Static Metadata Data Block */ +#define HDMI_EDID_HDR_SMDB_MIN_LEN 3 + +/* EOTF(Electro-Optical Transfer Functions) */ +struct HdmiEdidHdrSmdbEotf { + bool sdr; /* Traditional gamma - SDR Luminance Range */ + bool hdr; /* Traditional gamma - HDR Luminance Range */ + bool smpteSt2048; /* SMPTE ST 2084 */ + bool hlg; /* Hybrid Log-Gamma (HLG) based on Recommendation ITU-R BT.2100-0 */ +}; + +struct HdmiEdidHdrCap { + struct HdmiEdidHdrSmdbEotf eotf; + bool smType1; /* Static Metadata Type 1 */ + uint8_t maxLuminancedata; /* Desired Content Max Luminance data */ + uint8_t maxFrameAverageLuminanceData; /* Desired Content Max Frame-average Luminance data */ + uint8_t minLuminanceData; /* Desired Content Min Luminance data */ +}; + +/* edid extension block: YCBCR 4:2:0 Capability Map Data Block */ +struct HdmiEdidYcbcr420Cap { + uint32_t onlySupportY420VicNum; + uint32_t onlySupportY420Format[HDMI_EDID_EXTENSION_MAX_VIC_COUNT]; + uint32_t SupportY420VicNum; + uint32_t SupportY420Format[HDMI_EDID_EXTENSION_MAX_VIC_COUNT]; +}; + +/* sink device cap */ +struct HdmiSinkDeviceCapability { + uint8_t extBlockNum; + struct HdmiEdidVendorInfo vendorInfo; + struct HdmiEdidVersionInfo verInfo; + char sinkDeviceName[HDMI_EDID_MAX_SINK_NAME_COUNT]; + struct HdmiEdidBasicDispParamInfo disp; + struct HdmiEdidEstablishedTimingsInfo establishedTimingsInfo; + struct HdmiEdidStdTimingInfo stdTimingsInfo[HDMI_EDID_STANDARD_TIMING_COUNT]; + struct HdmiEdidColorInfo colorInfo; + struct HdmiEdidColorSpace colorSpace; + uint32_t preTimingCnt; + struct HdmiEdidPreferredTimingInfo preTimingInfo[HDMI_EDID_MAX_DETAILED_TIMING_COUNT]; + uint32_t audioInfoCnt; + struct HdmiEdidAudioInfo audioInfo[HDMI_EDID_EXTENSION_AUDIO_CAP_COUNT]; + struct HdmiEdidVideoInfo videoInfo; + uint32_t maxTmdsClk; + bool supportHdmi14; + bool supportHdmi20; + bool supportAudio; + struct HdmiEdidExtVsdbInfo vsdbInfo; + struct HdmiEdidExtHfVsdbInfo hfVsdbInfo; + bool supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BUTT]; + struct HdmiEdidColorimetry colorimetry; + struct HdmiEdidVideoCapability videoCap; + struct HdmiEdidYcbcr420Cap y420Cap; + struct HdmiEdidHdrCap hdrCap; + struct HdmiEdidVsvdbDolbyCap dolbyCap; +}; + +/* + * EDID(Extended Display Identification Data). + * The Source read the Sink's EDID in order to discover the Sink's configuration and/or capabilities. + */ +struct HdmiEdid { + bool edidPhase; + uint32_t rawLen; + uint8_t raw[HDMI_EDID_TOTAL_SIZE]; + struct HdmiSinkDeviceCapability sinkCap; +}; + +typedef int32_t (*HdmiEdidPhaseFunc)(struct HdmiEdid *edid); + +int32_t HdmiEdidReset(struct HdmiEdid *edid); +int32_t HdmiEdidPhase(struct HdmiEdid *edid); +int32_t HdmiEdidGetRaw(struct HdmiEdid *edid, uint8_t *raw, uint32_t len); +int32_t HdmiEdidRawDataRead(struct HdmiEdid *edid, struct HdmiDdc *ddc); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_EDID_H */ diff --git a/support/platform/include/hdmi/hdmi_event.h b/support/platform/include/hdmi/hdmi_event.h new file mode 100644 index 000000000..5a88a4543 --- /dev/null +++ b/support/platform/include/hdmi/hdmi_event.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_EVENT_H +#define HDMI_EVENT_H + +#include "hdf_base.h" +#include "platform_core.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* HPD(hot plug detect) */ +#define HDMI_READ_HPD_STATUS_DELAY 110 /* ms */ + +enum HdmiEventType { + HDMI_EVENT_HOTPLUG = 0, + HDMI_EVENT_HOTUNPLUG = 1, + HDMI_EVENT_DETECT_SINK = 2, + HDMI_EVENT_CEC_MSG = 3, + HDMI_EVENT_HDCP_MSG = 4, + HDMI_EVENT_ZERO_DRMIF_TIMEOUT = 5, + HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT = 6, + HDMI_EVENT_BUTT, +}; + +struct HdmiEventMsg { + struct PlatformMsg msg; + void *priv; +}; + +struct HdmiEvent { + bool plugged; + bool hpdDetected; +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_EVENT_H */ diff --git a/support/platform/include/hdmi/hdmi_frl.h b/support/platform/include/hdmi/hdmi_frl.h new file mode 100644 index 000000000..4d034629a --- /dev/null +++ b/support/platform/include/hdmi/hdmi_frl.h @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_FRL_H +#define HDMI_FRL_H + +#include "hdf_base.h" +#include "osal_time.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* FRL(Fix Rate Link) */ +enum HdmiFrlMode { + HDMI_FRL_MODE_TMDS = 0, + HDMI_FRL_MODE_FRL = 1, + HDMI_FRL_MODE_BUTT, +}; + +#define HDMI_FRL_3_LANES 3 +#define HDMI_FRL_4_LANES 4 + +enum HdmiFrlWorkMode { + HDMI_FRL_WORK_MODE_NONE = 0, + HDMI_FRL_WORK_MODE_3L3G = 1, /* 3 lanes, 3Gbps per lane */ + HDMI_FRL_WORK_MODE_3L6G = 2, /* 3 lanes, 6Gbps per lane */ + HDMI_FRL_WORK_MODE_4L6G = 3, /* 4 lanes, 6Gbps per lane */ + HDMI_FRL_WORK_MODE_4L8G = 4, /* 4 lanes, 8Gbps per lane */ + HDMI_FRL_WORK_MODE_4L10G = 5, /* 4 lanes, 10Gbps per lane */ + HDMI_FRL_WORK_MODE_4L12G = 6, /* 4 lanes, 12Gbps per lane */ + HDMI_FRL_WORK_MODE_BUTT, +}; + +enum HdmiFrlBitRate { + HDMI_FRL_BIT_RATE_3 = 3, + HDMI_FRL_BIT_RATE_6 = 6, + HDMI_FRL_BIT_RATE_8 = 8, + HDMI_FRL_BIT_RATE_10 = 10, + HDMI_FRL_BIT_RATE_12 = 12, + HDMI_FRL_BIT_RATE_BUTT, +}; + +enum HdmiFrlTrainPattern { + HDMI_FRL_TRAIN_PATTERN_NULL = 0, + HDMI_FRL_TRAIN_PATTERN_LP1 = 1, + HDMI_FRL_TRAIN_PATTERN_LP2 = 2, + HDMI_FRL_TRAIN_PATTERN_LP3 = 3, + HDMI_FRL_TRAIN_PATTERN_LP4 = 4, + HDMI_FRL_TRAIN_PATTERN_LP5 = 5, + HDMI_FRL_TRAIN_PATTERN_LP6 = 6, + HDMI_FRL_TRAIN_PATTERN_LP7 = 7, + HDMI_FRL_TRAIN_PATTERN_LP8 = 8, + HDMI_FRL_TRAIN_PATTERN_REV = 9, + HDMI_FRL_TRAIN_PATTERN_0E = 14, + HDMI_FRL_TRAIN_PATTERN_0F = 15, + HDMI_FRL_TRAIN_PATTERN_BUTT, +}; + +enum HdmiFrlTrainStatus { + HDMI_FRL_TRAIN_STATUS_NULL = 0, + HDMI_FRL_TRAIN_STATUS_FAIL = 1, + HDMI_FRL_TRAIN_STATUS_SUCC = 2, + HDMI_FRL_TRAIN_STATUS_BUSY = 3, + HDMI_FRL_TRAIN_STATUS_BUTT, +}; + +enum HdmiFrlTrainingFailReason { + HDMI_FRL_TRAIN_FAIL_NORMAL, + HDMI_FRL_TRAIN_FAIL_FLT_TIMEOUT, + HDMI_FRL_TRAIN_FAIL_FLT_STEP_TIMEOUT, + HDMI_FRL_TRAIN_FAIL_RATE_CHANGE, + HDMI_FRL_TRAIN_FAIL_FFE_CHANGE, + HDMI_FRL_TRAIN_FAIL_BUTT +}; + +enum HdmiFrlTrainStep { + HDMI_FRL_TRAIN_STEP_READR_CHECK = 0, + HDMI_FRL_TRAIN_STEP_TRAIN_START = 1, + HDMI_FRL_TRAIN_STEP_RESULT_CHECK = 2, + HDMI_FRL_TRAIN_STEP_RATE_CHANGE = 3, + HDMI_FRL_TRAIN_STEP_RESULT_HANDLE = 4, + HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK = 5, + HDMI_FRL_TRAIN_STEP_TRAIN_STOP = 6, + HDMI_FRL_TRAIN_STEP_BUTT, +}; + +enum HdmiFrlRateSelect { + HDMI_FRL_RATE_LITTLE = 0, + HDMI_FRL_RATE_BIG = 1, + HDMI_FRL_RATE_BUTT, +}; + +enum HdmiFrlPixelFormatMode { + HDMI_FRL_PIXEL_FORMAT_MODE_0 = 0, + HDMI_FRL_PIXEL_FORMAT_MODE_1 = 1, + HDMI_FRL_PIXEL_FORMAT_MODE_2 = 2, + HDMI_FRL_PIXEL_FORMAT_MODE_3 = 3, +}; + +enum HdmiFrlBypass { + HDMI_FRL_BYPASS_READ_CHECK = 0x01, + HDMI_FRL_BYPASS_RESULT_CHECK = 0x02, + HDMI_FRL_BYPASS_RETRAIN_CHECK = 0x04, +}; + +/* + * Feed Forward Equalizer(FFE) + * Tx terminal will use 0=TxFFE0 FFE in Link Training. If higher rate signal needs to be transmitted, + * Tx will decide higher FFE compensation through Link Training to ensure + * that video and audio data can be completely transmitted to the Sink terminal. + */ +enum HdmiFrlTxffeMode { + HDMI_FRL_TXFFE_MODE_0 = 0, + HDMI_FRL_TXFFE_MODE_1 = 1, + HDMI_FRL_TXFFE_MODE_2 = 2, + HDMI_FRL_TXFFE_MODE_3 = 3, + HDMI_FRL_TXFFE_MODE_BUTT, +}; + +enum HdmiFrlStrategyMode { + HDMI_FRL_STRATEGY_MODE_1, + HDMI_FRL_STRATEGY_MODE_2, + HDMI_FRL_STRATEGY_MODE_3, + HDMI_FRL_STRATEGY_MODE_BUTT +}; + +enum HdmiFrlStateMachineRunningState { + HDMI_FRL_STATE_MACHINE_NULL = 0, + HDMI_FRL_STATE_MACHINE_START = 1, + HDMI_FRL_STATE_MACHINE_STOP = 2, +}; + +struct HdmiFrlStateMachineInfo { + bool start; + enum HdmiFrlTrainStep trainingState; + enum HdmiFrlStateMachineRunningState machineState; + uint64_t startTime; /* ms */ + uint32_t waitReadyTime; /* ms */ + uint32_t waitHandleTime; /* ms */ + uint32_t waitRetrainTime; /* ms */ + uint32_t trainTimeout; /* ms */ + uint32_t timeoutCnt; +}; + +struct HdmiFrlInfo { + uint8_t curFrlRate; + uint8_t minFrlRate; + uint8_t maxFrlRate; + uint8_t preFrlRate; + uint32_t trainFailCnt; + uint32_t trainMaxFailTimes; + uint32_t tmdsClock; + enum HdmiFrlMode perMode; + enum HdmiFrlMode mode; + enum HdmiFrlStrategyMode strategy; + enum HdmiFrlRateSelect rateSelect; + bool scdc; + bool ctsMode; + bool start; + bool work; + struct HdmiFrlStateMachineInfo machineInfo; + uint32_t trainingFailCnt; + uint32_t trainingMaxFailTimes; +}; + +struct HdmiFrl { + struct HdmiFrlInfo info; + void *priv; +}; + +struct HdmiFrlAudioNctsConfig { + enum HdmiSampleRate sampleRate; + enum HdmiFrlMode mode; + uint8_t frlRate; + uint32_t pixelClk; + uint32_t n; + uint32_t cts; +}; + +struct HdmiFrlTrainConfig { + bool frlNoTimeout; + uint8_t frlRate; + uint8_t txffe; + uint32_t trainTimeout; +}; + +struct HdmiFrlTrainRslt { + enum HdmiFrlTrainStatus status; + enum HdmiFrlTrainPattern pattern[HDMI_FRL_4_LANES]; + enum HdmiFrlTrainingFailReason failReason; +}; + +void HdmiFrlEnable(struct HdmiFrl *frl, bool enable); +bool HdmiFrlSupport(struct HdmiFrl *frl); +int32_t HdmiFrlModeSelect(struct HdmiFrl *frl); +bool HdmiFrlModeChanged(struct HdmiFrl *frl); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_FRL_H */ diff --git a/support/platform/include/hdmi/hdmi_hdcp.h b/support/platform/include/hdmi/hdmi_hdcp.h new file mode 100644 index 000000000..9a7e743c7 --- /dev/null +++ b/support/platform/include/hdmi/hdmi_hdcp.h @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_HDCP_H +#define HDMI_HDCP_H + +#include "hdf_base.h" +#include "osal_mutex.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* HDCP(High-bandwidth Digital Content Protection) Sysytem. */ + +enum HdmiHdcpPortOffset { + /* HDCP 1.4 Spec */ + HDMI_HDCP_BKSV = 0x00, /* Rd, 5 bytes */ + HDMI_HDCP_RI = 0x08, /* Rd, 2 bytes */ + HDMI_HDCP_PJ = 0x0A, /* Rd, 1 byte */ + HDMI_HDCP_AKSV = 0x10, /* Wr, 5 bytes */ + HDMI_HDCP_AINFO = 0x15, /* Wr, 1 byte */ + HDMI_HDCP_AN = 0x18, /* Wr, 8 bytes */ + HDMI_HDCP_V_H0 = 0x20, /* Rd, 4 bytes */ + HDMI_HDCP_V_H1 = 0x24, /* Rd, 4 bytes */ + HDMI_HDCP_V_H2 = 0x28, /* Rd, 4 bytes */ + HDMI_HDCP_V_H3 = 0x2C, /* Rd, 4 bytes */ + HDMI_HDCP_V_H4 = 0x30, /* Rd, 4 bytes */ + HDMI_HDCP_BCAPS = 0x40, /* Rd, 1 byte */ + HDMI_HDCP_BSTATUS = 0x41, /* Rd, 2 bytes */ + HDMI_HDCP_KSV_FIFO = 0x43, /* Rd, 1 byte */ + + /* HDCP 2.2 Spec */ + HDMI_HDCP_HDCP2VERSION = 0x50, /* Rd, 1 byte */ + HDMI_HDCP_WRITE_MSG = 0x60, /* Wr, 1 byte */ + HDMI_HDCP_RXSTATUS = 0x70, /* Rd, 2 bytes */ + HDMI_HDCP_READ_MSG = 0x80, /* Rd, 1 byte */ +}; + +/* HDCP 2.2 Read/Write Message Id */ +enum HdmiHdcpMsgId { + HDMI_HDCP_MSG_AKE_INIT = 2, /* Write, 12 bytes */ + HDMI_HDCP_MSG_AKE_SEND_CERT = 3, /* Read, 534 bytes */ + HDMI_HDCP_MSG_AKE_NO_STORED_KM = 4, /* Write, 129 bytes */ + HDMI_HDCP_MSG_AKE_STORED_KM = 5, /* Write, 33 bytes */ + HDMI_HDCP_MSG_AKE_SEND_H_PRIME = 7, /* Read, 33 bytes */ + HDMI_HDCP_MSG_AKE_SEND_PAIRING_INFO = 8, /* Read, 17 bytes */ + HDMI_HDCP_MSG_LC_INIT = 9, /* Write, 9 bytes */ + HDMI_HDCP_MSG_LC_SEND_L_PRIME = 10, /* Read, 33 bytes */ + HDMI_HDCP_MSG_SKE_SEND_EKS = 11, /* Write, 25 bytes */ + HDMI_HDCP_MSG_REPEATER_AUTH_SEND_RCVID_LIST = 12, /* Read, 22 + 5 * device_count bytes */ + HDMI_HDCP_MSG_REPEATER_AUTH_SEND_ACK = 15, /* Write, 17 bytes */ + HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_MANAGE = 16, /* Write, 6 + 2 * k bytes */ + HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_READY = 17, /* Read, 33 bytes */ +}; + +enum HdmiHdcpRegOptType { + /* HDCP 1.4 Spec */ + HDMI_HDCP_OPT_WRITE_BKSV = 0x00, + HDMI_HDCP_OPT_WRITE_RI = 0x01, + HDMI_HDCP_OPT_WRITE_PJ = 0x02, + HDMI_HDCP_OPT_WRITE_V_H0 = 0x03, + HDMI_HDCP_OPT_WRITE_V_H1 = 0x04, + HDMI_HDCP_OPT_WRITE_V_H2 = 0x05, + HDMI_HDCP_OPT_WRITE_V_H3 = 0x06, + HDMI_HDCP_OPT_WRITE_V_H4 = 0x07, + HDMI_HDCP_OPT_WRITE_V_H_ALL = 0x08, + HDMI_HDCP_OPT_WRITE_BCAPS = 0x0C, + HDMI_HDCP_OPT_WRITE_BSTATUS = 0x0D, + HDMI_HDCP_OPT_WRITE_KSV_FIFO = 0x0E, + HDMI_HDCP_OPT_RESET_SHA = 0x0F, + HDMI_HDCP_OPT_CHECK_V = 0x10, + HDMI_HDCP_OPT_CHECK_R = 0x11, + HDMI_HDCP_OPT_AUTH_FAIL = 0x12, + HDMI_HDCP_OPT_AUTH_DONE = 0x13, + HDMI_HDCP_OPT_AUTH_CLOSE = 0x14, +}; + +#define HDMI_HDCP_MSG_BKSV_LEN 5 +#define HDMI_HDCP_MSG_RI_LEN 2 +#define HDMI_HDCP_MSG_PJ_LEN 1 +#define HDMI_HDCP_MSG_AKSV_LEN 5 +#define HDMI_HDCP_MSG_AINFO_LEN 1 +#define HDMI_HDCP_MSG_AN_LEN 8 +#define HDMI_HDCP_MSG_PER_VH_LEN 4 +#define HDMI_HDCP_MSG_ALL_VH_LEN 20 +#define HDMI_HDCP_MSG_BCAPS_LEN 1 +#define HDMI_HDCP_MSG_BSTATUS_LEN 2 +#define HDMI_HDCP_MSG_KSV_FIFO_LEN 1 +#define HDMI_HDCP_DEVICE_COUNT_MAX 127 +#define HDMI_HDCP_MSG_KSV_MAX_LEN (5 * HDMI_HDCP_DEVICE_COUNT_MAX) +#define HDMI_HDCP_GET_KSV_LEN(x) (5 * x) + +#define HDMI_HDCP_AKSV_ONE_NUM 20 +#define HDMI_HDCP_BCAPS_REPEATER_MARK 0x40 +#define HDMI_HDCP_BCAPS_KSV_FIFO_READY_MARK 0x20 +#define HDMI_HDCP_DEFAULT_READ_REG_TRY 100 +#define HDMI_HDCP_WAIT_KSV_LIST_TIMES 5000 /* 5s */ +#define HDMI_HDCP_WAIT_KSV_LIST_READ_REG_INTERVAL 20 /* 20ms */ +#define HDMI_HDCP_WAIT_KSV_LIST_READ_REG_CNT \ + (HDMI_HDCP_WAIT_KSV_LIST_TIMES / HDMI_HDCP_WAIT_KSV_LIST_READ_REG_INTERVAL) + +#define HDMI_HDCP_BSTATUS_DEVICE_COUNT_MARK 0x7F +#define HDMI_HDCP_BSTATUS_MAX_DEVS_EXCEEDED_MARK (1 << 7) +#define HDMI_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED_MARK (1 << 11) +#define HDMI_HDCP_BSTATUS_DEPTH_MARK 0x07 +#define HDMI_HDCP_BSTATUS_DEPTH_SHIFT 8 + + +#define HDMI_HDCP_MSG_HDCP2VERSION_LEN 1 +#define HDMI_HDCP_MSG_RXSTATUS_LEN 2 +#define HDMI_HDCP_MSG_AKE_INIT_LEN 12 +#define HDMI_HDCP_MSG_AKE_CERT_LEN 534 +#define HDMI_HDCP_MSG_AKE_NO_STORED_KM_LEN 129 +#define HDMI_HDCP_MSG_AKE_STORED_KM_LEN 33 +#define HDMI_HDCP_MSG_AKE_H_PRIME_LEN 33 +#define HDMI_HDCP_MSG_AKE_PAIRING_INFO 17 +#define HDMI_HDCP_MSG_LC_INIT_LEN 9 +#define HDMI_HDCP_MSG_LC_L_PRIME_LEN 33 +#define HDMI_HDCP_MSG_SKE_EKS_LEN 25 +#define HDMI_HDCP_MSG_AUTH_RCVID_LIST_LEN (22 + 5 * 31) +#define HDMI_HDCP_MSG_REPEATER_AUTH_ACK_LEN 17 +#define HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_MANAGE_LEN (6 + 2 * 31) +#define HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_READY_LEN 33 + +#define HDMI_HDCP_2_2_VERSION 2 +#define HDMI_HDCP_GET_AUTH_RCVID_LIST_LEN(x) (22 + 5 * x) + +struct HdmiHdcpMsg { + /* HDCP 1.4 message */ + uint8_t bksv[HDMI_HDCP_MSG_BKSV_LEN]; + uint8_t ri[HDMI_HDCP_MSG_RI_LEN]; + uint8_t pj; + uint8_t aksv[HDMI_HDCP_MSG_AKSV_LEN]; + uint8_t ainfo; + uint8_t an[HDMI_HDCP_MSG_AN_LEN]; + uint8_t vh[HDMI_HDCP_MSG_ALL_VH_LEN]; + uint8_t bcaps; + uint8_t bstatus[HDMI_HDCP_MSG_BSTATUS_LEN]; + uint8_t ksvList[HDMI_HDCP_MSG_KSV_MAX_LEN]; + uint32_t ksvLen; + + /* HDCP 2.2 Message */ + uint8_t Hdcp2Version; + uint8_t rxStatus[HDMI_HDCP_MSG_RXSTATUS_LEN]; + uint8_t akeInit[HDMI_HDCP_MSG_AKE_INIT_LEN]; + uint8_t akeCert[HDMI_HDCP_MSG_AKE_CERT_LEN]; + uint8_t akeNoStoredKm[HDMI_HDCP_MSG_AKE_NO_STORED_KM_LEN]; + uint8_t akeStoredKm[HDMI_HDCP_MSG_AKE_STORED_KM_LEN]; + uint8_t akeHPrime[HDMI_HDCP_MSG_AKE_H_PRIME_LEN]; + uint8_t akePairingInfo[HDMI_HDCP_MSG_AKE_PAIRING_INFO]; + uint8_t lcInit[HDMI_HDCP_MSG_LC_INIT_LEN]; + uint8_t lcLPrime[HDMI_HDCP_MSG_LC_L_PRIME_LEN]; + uint8_t skeEks[HDMI_HDCP_MSG_SKE_EKS_LEN]; + uint8_t rxIdList[HDMI_HDCP_MSG_AUTH_RCVID_LIST_LEN]; + uint32_t rxIdListLen; + uint8_t authAck[HDMI_HDCP_MSG_REPEATER_AUTH_ACK_LEN]; + uint8_t authStreamManage[HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_MANAGE_LEN]; + uint32_t authStreamManageLen; + uint8_t authStreamReady[HDMI_HDCP_MSG_REPEATER_AUTH_STREAM_READY_LEN]; +}; + +enum HdmiHdcpAuthState { + HDMI_HDCP_AUTH_INACTIVE = 0, + HDMI_HDCP_AUTH_AKSV_INVALID = 1, + HDMI_HDCP_AUTH_DOING = 2, + HDMI_HDCP_AUTH_DONE = 3, + HDMI_HDCP_AUTH_FAIL = 4, +}; + +#define HDMI_HDCP_AUTH_MAX_RETRY_CNT 10 +struct HdmiHdcp { + struct OsalMutex hdcpMutex; + enum HdmiHdcpAuthState state; + uint8_t authRetryCnt; + /* HDCP 1.4 */ + uint8_t aksv[HDMI_HDCP_MSG_AKSV_LEN]; /* need driver to generate */ + uint8_t an[HDMI_HDCP_MSG_AN_LEN]; /* need driver to generate */ + uint8_t bksv[HDMI_HDCP_MSG_BKSV_LEN]; + uint8_t bcaps; + uint8_t ri[HDMI_HDCP_MSG_RI_LEN]; + uint8_t bstatus[HDMI_HDCP_MSG_BSTATUS_LEN]; + uint8_t deviceCount; + uint8_t ksvList[HDMI_HDCP_MSG_KSV_MAX_LEN]; + uint32_t ksvLen; + uint8_t vh[HDMI_HDCP_MSG_ALL_VH_LEN]; + bool aksvValid; + void *priv; +}; + +struct HdmiHdcpStatus { + bool hdcp22; + bool hdcp14; + uint8_t bksv[HDMI_HDCP_MSG_BKSV_LEN]; + uint8_t aksv[HDMI_HDCP_MSG_AKSV_LEN]; +}; + +int32_t HdmiHdcpOpen(struct HdmiHdcp *hdcp); +void HdmiHdcpClose(struct HdmiHdcp *hdcp); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_HDCP_H */ diff --git a/support/platform/include/hdmi/hdmi_hdr.h b/support/platform/include/hdmi/hdmi_hdr.h new file mode 100644 index 000000000..7d8d83ff0 --- /dev/null +++ b/support/platform/include/hdmi/hdmi_hdr.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_HPR_H +#define HDMI_HPR_H + +#include "hdf_base.h" +#include "hdmi_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* HDR(High Dynamic Range) Sysytem. */ +#define HDMI_ZERO_DRMIF_SEND_TIME 2000 +#define HDMI_HDR_STATE_CHANGE_TIME 500 + +enum HdmiHdrTimerType { + HDMI_HDR_TIMER_ZERO_DRMIF, + HDMI_HDR_TIMER_SDR_TO_HDR10, + HDMI_HDR_TIMER_TYPE_BUTT +}; + +enum HdmiHdrState { + HDMI_HDR_STATE_NONE, /* HDR state change, SDR->HDR10 don't change anything */ + HDMI_HDR_STATE_OE, /* HDR state change, SDR->HDR10 output disable and enable */ + HDMI_HDR_STATE_AVMUTE, /* HDR state change, SDR->HDR10 send avmute */ + HDMI_HDR_STATE_BUTT +}; + +struct HdmiHdrTimerConfig { + enum HdmiHdrTimerType timerType; + bool start; + uint32_t time; +}; + +struct HdmiHdrInfo { + enum HdmiHdrState state; /* Make sure that switch smoothly from non-HDR10 to HDR10. */ + struct HdmiHdrTimerConfig zeroDrmIfTimer; /* Send zero DRM infoframe when the HDR mode from HDR10 to non-HDR10. */ + struct HdmiHdrTimerConfig stateChangeTimer; /* */ +}; + +struct HdmiHdr { + struct HdmiHdrInfo info; + void *priv; +}; + +int32_t HdmiHdrAttrHandle(struct HdmiHdr *hdr, struct HdmiHdrAttr *curAttr); +int32_t HdmiHdrDrmInfoframeStop(struct HdmiHdr *hdr); +int32_t HdmiHdrModeChangeTimeout(struct HdmiHdr *hdr); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_HPR_H */ diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h new file mode 100644 index 000000000..ae2bacc3f --- /dev/null +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -0,0 +1,466 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_INFOFRAME_H +#define HDMI_INFOFRAME_H + +#include "hdmi_common.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* + * An InfoFrame packet carries one InfoFrame. The InfoFrame provided by HDMI is limited to 30 + * bytes plus a checksum byte. HDMI Sources are required, in some cases, to use the AVI InfoFrame and Audio InfoFrame + * and recommended in other cases. Other InfoFrames specified in CEA-861 Spec are optional. + * + * TMDS is used to carry all audio and video data as well as auxiliary data, including AVI(Auxiliary Video information) + * and Audio InfoFrames that describe the active audio and video streams. + * + */ +#define HDMI_INFOFRAME_LEN 32 +#define HDMI_INFOFRAME_PACKET_HEADER_LEN 4 +#define HDMI_AVI_INFOFRAME_LEN 13 +#define HDMI_AUDIO_INFOFRAME_LEN 10 +#define HDMI_DRM_INFOFRAME_LEN 26 +#define HDMI_SPD_INFOFRAME_LEN 25 +#define HDMI_INFOFRAME_CHECKSUM 256 + +enum HdmiPacketType { + HDMI_PACKET_TYPE_NULL = 0x00, /* Null Packet */ + HDMI_PACKET_TYPE_AUDIO_CLOCK_REGENERATION = 0x01, /* Audio Clock Regeneration(N/CTS) */ + HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02, /* Audio Samlpe(L-PCM and IEC 61937 compressed formats) */ + HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03, /* General Control Packet */ + HDMI_PACKET_TYPE_ACP = 0x04, /* ACP(Audio Content Protection Packet) */ + HDMI_PACKET_TYPE_ISRC1 = 0x05, /* ISRC(International Standard Recording Code) */ + HDMI_PACKET_TYPE_ISRC2 = 0x06, + HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07, /* One Bit Audio Sample Packet */ + HDMI_PACKET_TYPE_DST_AUDIO = 0x08, /* DST(Diret Stream Transport) Audio Packet */ + HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09, /* HBR(High Bitrate) Audio Stream Packet */ + HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a, /* gamut metadata packet */ + /* infoframe type */ + HDMI_INFOFRAME_PACKET_TYPE_VS = 0x81, /* Verdor-Specific */ + HDMI_INFOFRAME_PACKET_TYPE_AVI = 0x82, /* Auxiliary Video Information */ + HDMI_INFOFRAME_PACKET_TYPE_SPD = 0x83, /* Source Product Description */ + HDMI_INFOFRAME_PACKET_TYPE_AUDIO = 0x84, /* Audio */ + HDMI_INFOFRAME_PACKET_TYPE_MPEG = 0x85, /* MPEG Source */ + HDMI_INFOFRAME_PACKET_TYPE_GBD = 0x86, /* gamut boundary description */ + HDMI_INFOFRAME_PACKET_TYPE_DRM = 0x87, /* Dynamic Range and Mastering */ + HDMI_PACKET_TYPE_BUTT, +}; + +struct HdmiInfoframeHeader { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; +}; + +/* Verdor-Specific infoframe details. */ +#define HDMI_VENDOR_1_4_MAX_3D_METADAT_LEN 20 +#define HDMI_VENDOR_USER_DATA_MAX_LEN 22 +#define HDMI_VENDOR_1_4_FORMAT_MARK 0x07 +#define HDMI_VENDOR_1_4_FORMAT_SHIFT 5 +#define HDMI_VENDOR_3D_STRUCTURE_MARK 0x0f +#define HDMI_VENDOR_3D_STRUCTURE_SHIFT 4 +#define HDMI_VENDOR_3D_EXT_DATA_MARK 0x0f +#define HDMI_VENDOR_3D_EXT_DATA_SHIFT 4 +#define HDMI_VSIF_VERSION 1 + +enum HdmiIeeeOui { + HDMI_IEEE_OUI_1_4 = 0x000c03, + HDMI_IEEE_OUI_2_0 = 0x045dd8, +}; + +enum HdmiVsVideoFormat { + HDMI_VS_VIDEO_FORMAT_NULL = 0, + HDMI_VS_VIDEO_FORMAT_4K = 1, + HDMI_VS_VIDEO_FORMAT_3D = 2, + HDMI_VS_VIDEO_FORMAT_BUTT, +}; + +enum HdmiVs3dExtData { + HDMI_3D_PICTURE_HORIZONTAL_ODD_LEFT_ODD_RIGHT = 0, + HDMI_3D_PICTURE_HORIZONTAL_ODD_LEFT_EVEN_RIGHT = 1, + HDMI_3D_PICTURE_HORIZONTAL_EVEN_LEFT_ODD_RIGHT = 2, + HDMI_3D_PICTURE_HORIZONTAL_EVEN_LEFT_EVEN_RIGHT = 3, + HDMI_3D_PICTURE_MATRIX_ODD_LEFT_ODD_RIGHT = 4, + HDMI_3D_PICTURE_MATRIX_ODD_LEFT_EVEN_RIGHT = 5, + HDMI_3D_PICTURE_MATRIX_EVEN_LEFT_ODD_RIGHT = 6, + HDMI_3D_PICTURE_MATRIX_EVEN_LEFT_EVEN_RIGHT = 7, + HDMI_3D_PICTURE_BUTT, +}; + +struct HdmiVs14VsifContent { + enum HdmiIeeeOui oui; + enum HdmiVsVideoFormat format; + enum Hdmi4kVic vic; + bool _3dMetaPresent; + enum HdmiVideo3dStructure _3dStruct; + enum HdmiVs3dExtData _3dExtData; + uint8_t _3dMetadataType; + uint8_t _3dMetadataLen; + uint8_t _3dMetadata[HDMI_VENDOR_1_4_MAX_3D_METADAT_LEN]; +}; + +struct HdmiVsUserVsifContent { + enum HdmiIeeeOui oui; + enum HdmiVsVideoFormat format; + enum Hdmi4kVic vic; + bool _3dMetaPresent; + enum HdmiVideo3dStructure _3dStruct; + uint8_t len; + uint8_t data[HDMI_VENDOR_USER_DATA_MAX_LEN]; +}; + +struct HdmiForumVsifContent { + enum HdmiIeeeOui oui; + uint8_t version; + bool _3dValid; + uint8_t _3dFStructure; + bool _3dAdditionalInfoPresent; + bool _3dDisparityDataPresent; + bool _3dMetaPresent; + uint8_t _3dFExtData; + uint8_t _3dDualView; + uint8_t _3dViewDependency; + uint8_t _3dPreferred2dView; + uint8_t _3dDisparityDataVersion; + uint8_t _3dDisparityDataLen; + uint8_t _3dDisparityData[10]; + uint8_t _3dMetadataType; + uint8_t _3dMetadataLen; + uint8_t _3dMetadata[10]; +}; + +struct HdmiVsInfoframe { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; + union { + struct HdmiVs14VsifContent _14Vsif; + struct HdmiVsUserVsifContent userVsif; + struct HdmiForumVsifContent forumVsif; + } vsifContent; +}; + +/* AVI infoframe details. */ +#define HDMI_AVI_COLOR_SPACE_MARK 0x03 +#define HDMI_AVI_SCAN_MODE_MARK 0x03 +#define HDMI_AVI_COLOR_SPACE_SHIFT 5 +#define HDMI_AVI_ACTIVE_INFORMATION_SHIFT 4 +#define HDMI_AVI_HORIZONTAL_BAR_SHIFT 3 +#define HDMI_AVI_VERTICAL_BAR_SHIFT 2 + +#define HDMI_AVI_COLORIMETRY_MARK 0x03 +#define HDMI_AVI_PICTURE_ASPECT_RATE_MARK 0x03 +#define HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK 0x0f +#define HDMI_AVI_COLORIMETRY_SHIFT 6 +#define HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT 4 + +#define HDMI_AVI_EXT_COLORIMETRY_MARK 0x07 +#define HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK 0x03 +#define HDMI_AVI_NUPS_RANGE_MARK 0x03 +#define HDMI_AVI_IT_CONTENT_SHIFT 7 +#define HDMI_AVI_EXT_COLORIMETRY_SHIFT 4 +#define HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT 2 + +#define HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK 0x03 +#define HDMI_AVI_IT_CONTENT_TYPE_MARK 0x03 +#define HDMI_AVI_PIXEL_REPETION_FACTOR_MARK 0x0f +#define HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT 6 +#define HDMI_AVI_IT_CONTENT_TYPE_SHIFT 4 + +#define HDMI_AVI_BAR_MODE_MARK 0xff +#define HDMI_AVI_BAR_MODE_SHIFT 8 + +#define HDMI_AVI_VERSION2 2 +#define HDMI_AVI_VERSION3 3 +#define HDMI_AVI_VERSION4 4 +#define HDMI_AVI_Y2_MASK (0x1 << 2) + +enum HdmiScanMode { + HDMI_SCAN_MODE_NO_DATA = 0, + HDMI_SCAN_MODE_OVERSCAN = 1, + HDMI_SCAN_MODE_UNDERSCAN = 2, + HDMI_SCAN_MODE_FUTURE = 3, +}; + +enum HdmiItContentType { + HDMI_IT_CONTENT_TYPE_GRAPHICS = 0, + HDMI_IT_CONTENT_TYPE_PHOTO = 1, + HDMI_IT_CONTENT_TYPE_CINEMA = 2, + HDMI_IT_CONTENT_TYPE_GAME = 3, +}; + +struct HdmiAviInfoframe { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; + enum HdmiScanMode scanMode; + bool vertBarInfoPresent; + bool horizBarInfoPresent; + bool activeFormatInformationPresent; + enum HdmiColorSpace colorSpace; + enum HdmiActiveFormatAspectRatio activeAspect; + enum HdmiPictureAspectRatio pictureAspect; + enum HdmiColorimetry colorimetry; + enum HdmiNups nups; + enum HdmiQuantizationRange range; + enum HdmiExtendedColorimetry extColorimetry; + bool itc; /* IT content */ + uint8_t vic; + uint8_t pixelRepetitionFactor; + enum HdmiItContentType itcType; + enum HdmiYccQuantizationRange yccRange; + uint16_t topBar; + uint16_t bottomBar; + uint16_t leftBar; + uint16_t rightBar; +}; + +/* Audio infoframe details. */ +#define HDMI_AUDIO_INFOFRAME_VERSION 1 +#define HDMI_AUDIO_CODING_TYPE_MARK 0x0f +#define HDMI_AUDIO_CHANNEL_COUNT_MARK 0x07 +#define HDMI_AUDIO_CODING_TYPE_SHIFT 4 + +#define HDMI_AUDIO_SAMPLE_FREQUENCY_MARK 0x07 +#define HDMI_AUDIO_SAMPLE_SIZE_MARK 0x03 +#define HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT 2 + +#define HDMI_AUDIO_CXT_MARK 0x1f + +#define HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK 0x0f +#define HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK 0x03 +#define HDMI_AUDIO_DM_INH_SHIFT 7 +#define HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT 3 + +enum HdmiAudioSampleSize { + HDMI_AUDIO_SAMPLE_SIZE_STREAM = 0, + HDMI_AUDIO_SAMPLE_SIZE_16_BIT = 1, + HDMI_AUDIO_SAMPLE_SIZE_20_BIT = 2, + HDMI_AUDIO_SAMPLE_SIZE_24_BIT = 3, +}; + +enum HdmiAudioSampleFrequency { + HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0, + HDMI_AUDIO_SAMPLE_FREQUENCY_32K = 1, + HDMI_AUDIO_SAMPLE_FREQUENCY_44_1K = 2, + HDMI_AUDIO_SAMPLE_FREQUENCY_48K = 3, + HDMI_AUDIO_SAMPLE_FREQUENCY_88_2K = 4, + HDMI_AUDIO_SAMPLE_FREQUENCY_96K = 5, + HDMI_AUDIO_SAMPLE_FREQUENCY_176_4K = 6, + HDMI_AUDIO_SAMPLE_FREQUENCY_192K = 7, +}; + +enum HdmiAudioCodingExtType { + /* Refer to Audio Coding Type (CT) field in Data Byte 1 */ + HDMI_AUDIO_CODING_EXT_TYPET_CT = 0, + + /* + * The next three CXT values are defined in CEA-861-E only. + * They do not exist in older versions, and in CEA-861-F they are + * defined as 'Not in use'. + */ + HDMI_AUDIO_CODING_EXT_TYPET_HE_AAC = 1, + HDMI_AUDIO_CODING_EXT_TYPET_HE_AAC_V2 = 2, + HDMI_AUDIO_CODING_EXT_TYPET_MPEG_SURROUND = 3, + + HDMI_AUDIO_CODING_EXT_TYPET_MPEG4_HE_AAC = 4, + HDMI_AUDIO_CODING_EXT_TYPET_MPEG4_HE_AAC_V2 = 5, + HDMI_AUDIO_CODING_EXT_TYPET_MPEG4_AAC_LC = 6, + HDMI_AUDIO_CODING_EXT_TYPET_DRA = 7, + HDMI_AUDIO_CODING_EXT_TYPET_MPEG4_HE_AAC_SURROUND = 8, + HDMI_AUDIO_CODING_EXT_TYPET_RESERVED = 9, + HDMI_AUDIO_CODING_EXT_TYPET_MPEG4_AAC_LC_SURROUND = 10, + + HDMI_AUDIO_CODING_EXT_TYPET_MPEGH_3D_AUDIO = 11, + HDMI_AUDIO_CODING_EXT_TYPET_AC4 = 12, + HDMI_AUDIO_CODING_EXT_TYPET_LPCM_3D_AUDIO = 13, + HDMI_AUDIO_CODING_EXT_TYPET_BUTT, +}; + +/* LEF(Low Frequency Effects) playback level. */ +enum HdmiAudioLfePlaybackLevel { + HDMI_AUDIO_LFE_PLAYBACK_NULL = 0, + HDMI_AUDIO_LFE_PLAYBACK_0DB = 1, + HDMI_AUDIO_LFE_PLAYBACK_10DB = 2, + HDMI_AUDIO_LFE_PLAYBAC_BUTT, +}; + +struct HdmiAudioInfoframe { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; + uint8_t channelCount; + enum HdmiAudioCodingType codingType; + enum HdmiAudioSampleSize sampleSize; + enum HdmiAudioSampleFrequency sampleFreq; + enum HdmiAudioCodingExtType codingExtType; + uint8_t channelAllocation; + enum HdmiAudioLfePlaybackLevel playBackLevel; + uint8_t levelShiftValue; + bool dmInh; /* Down-mix Inhibit Flag */ +}; + +/* Source Product Description infoframe details. */ +#define HDMI_SPD_VENDOR_NAME_LEN 8 +#define HDMI_SPD_PRODUCT_DESCRIPTION_LEN 16 +#define HDMI_SPD_VERSION 1 + +/* SDI(Source Device Information) */ +enum HdmiSpdSdi { + HDMI_SPD_SDI_NULL = 0, + HDMI_SPD_SDI_DIGITAL_STB = 1, + HDMI_SPD_SDI_DVD_PLAYER = 2, + HDMI_SPD_SDI_D_VHS = 3, + HDMI_SPD_SDI_HDD_VIDEORECORDER = 4, + HDMI_SPD_SDI_DVC = 5, + HDMI_SPD_SDI_DSC = 6, + HDMI_SPD_SDI_VIDEO_CD = 7, + HDMI_SPD_SDI_GAME = 8, + HDMI_SPD_SDI_PC_GENERAL = 9, + HDMI_SPD_SDI_BLU_RAY_DIS = 10, + HDMI_SPD_SDI_SUPER_AUDIO_CD = 11, + HDMI_SPD_SDI_HDDVD = 12, + HDMI_SPD_SDI_PMP = 13, + HDMI_SPD_SDI_BUTT, +}; + +struct HdmiSpdInfoframe { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; + char vendorName[HDMI_SPD_VENDOR_NAME_LEN]; + char productDescription[HDMI_SPD_PRODUCT_DESCRIPTION_LEN]; + enum HdmiSpdSdi sdi; +}; + +/* Dynamic Range and Mastering infoframe details. */ +#define HDMI_DRM_METADATA_MARK 0xff +#define HDMI_DRM_METADATA_SHIFT 8 +#define HDMI_DRM_INFOFRAME_VERSION 1 + +struct HdmiDrmInfoframe { + enum HdmiPacketType type; + uint8_t verNum; + uint8_t len; + enum HdmiEotfType eotfType; + enum HdmiStaticMetadataType metadataType; + union HdmiStaticMetadataDescriptor des; +}; + +/* GBD(gamut boundary description) */ +union HdmiGbdHb1{ + struct { + uint8_t affectedGamutSeqNum : 4; /* [0:3] */ + uint8_t gbdProfil : 3; /* [4:5] */ + uint8_t reseverd: 1; /* [6] */ + uint8_t noCrntGbd : 1; /* [7] */ + } bits; + uint8_t val; +}; + +union HdmiGbdHb2{ + struct { + uint8_t currentGamutSeqNum : 4; /* [0:3] */ + uint8_t packetSeq : 2; /* [4:5] */ + uint8_t nextField : 1; /* [7] */ + } bits; + uint8_t val; +}; + +union HdmiGbdRangeData0 { + struct { + uint8_t gbdColorSpace : 3; /* [0:2] */ + uint8_t gbdColorPercision : 2; /* [3:4] */ + uint8_t rsvd: 2; /* [5:6] */ + uint8_t formatFlag : 1; /* [7] */ + } bits; + uint8_t val; +}; + +struct HdmiGbdPacket { + uint8_t hb0; + union HdmiGbdHb1 hb1; + union HdmiGbdHb2 hb2; + union HdmiGbdRangeData0 data0; + uint8_t minRedDataH; + uint8_t midRedData; /* Min_Red_Data_L | Max_Red_Data_H */ + uint8_t maxRedDataL; + uint8_t minGreenDataH; + uint8_t midGreenData; /* Min_Green_Data_L | Max_Green_Data_H */ + uint8_t maxGreenDataL; + uint8_t minBlueDataH; + uint8_t midBlueData; /* Min_Blue_Data_L | Max_Blue_Data_H */ + uint8_t maxBlueDataL; +}; + +union HdmiInfoframeInfo { + struct HdmiInfoframeHeader header; + struct HdmiVsInfoframe vs; + struct HdmiAviInfoframe avi; + struct HdmiAudioInfoframe audio; + struct HdmiSpdInfoframe spd; + struct HdmiDrmInfoframe drm; + struct HdmiGbdPacket gbd; +}; + +/* + * Infoframe: A data structure defined in CEA-861-D that is designed to carry a variety of auxiliary data items + * regarding the audio or video streams or the source device and is carried from Source to Sink across HDMI. + */ +struct HdmiInfoframe { + enum HdmiPacketType infoframeType; + bool hdrSupport; + struct HdmiVsInfoframe vs; + struct HdmiAviInfoframe avi; + struct HdmiAudioInfoframe audio; + struct HdmiSpdInfoframe spd; + struct HdmiDrmInfoframe drm; + struct HdmiGbdPacket gbd; + struct HdmiVsUserVsifContent userVsif; + void *priv; +}; + +struct HdmiInfoframeStatus { + bool vsifEnable; + bool aviEnable; + bool audioEnable; + bool spdEnable; + bool drmEnable; + bool gdbEnable; + uint8_t avi[HDMI_INFOFRAME_LEN]; + uint8_t audio[HDMI_INFOFRAME_LEN]; + uint8_t vsif[HDMI_INFOFRAME_LEN]; + uint8_t spd[HDMI_INFOFRAME_LEN]; + uint8_t drm[HDMI_INFOFRAME_LEN]; + uint8_t gdb[HDMI_INFOFRAME_LEN]; +}; + +int32_t HdmiAudioInfoframeSend(struct HdmiInfoframe *frame, bool enable); +int32_t HdmiAviInfoframeSend(struct HdmiInfoframe *frame, bool enable); +int32_t HdmiDrmInfoframeSend(struct HdmiInfoframe *frame, bool enable); +int32_t HdmiVsInfoframeSend(struct HdmiInfoframe *frame, bool enable, bool dolbyEnable); +int32_t HdmiSpdInfoframeSend(struct HdmiInfoframe *frame, bool enable, + char *vendorName, char *productName, enum HdmiSpdSdi sdi); +int32_t HdmiInfoframeGetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, + union HdmiInfoframeInfo *infoframe); +int32_t HdmiInfoframeSetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, + union HdmiInfoframeInfo *infoframe); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_INFOFRAME_H */ diff --git a/support/platform/include/hdmi/hdmi_ncts.h b/support/platform/include/hdmi/hdmi_ncts.h new file mode 100644 index 000000000..97923b71d --- /dev/null +++ b/support/platform/include/hdmi/hdmi_ncts.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_NCTS_H +#define HDMI_NCTS_H + +#include "hdf_base.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* N/CTS(Cycle Time Stamp), see hdmi1.4 spec section 7.2. */ +#define HDMI_NCTS_FACTOR 128 +#define HDMI_NCTS_N_DEFAULT 6144 +#define HDMI_NCTS_TMDS_DEVIATION 20 + +struct HdmiAudioNCts { + uint32_t sampleRate; /* audio sample rate(fs) */ + uint32_t tmdsClock; + uint32_t n; + uint32_t cts; +}; + +uint32_t HdmiGetN(uint32_t sampleRate, uint32_t tmdsClock); +uint32_t HdmiGetCts(uint32_t sampleRate, uint32_t tmdsClock); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_NCTS_H */ diff --git a/support/platform/include/hdmi/hdmi_scdc.h b/support/platform/include/hdmi/hdmi_scdc.h new file mode 100644 index 000000000..532d446c4 --- /dev/null +++ b/support/platform/include/hdmi/hdmi_scdc.h @@ -0,0 +1,321 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_SCDC_H +#define HDMI_SCDC_H + +#include "hdf_base.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* SCDC(Status and Control Data Channel) */ +#define HDMI_SCDC_HDMI20_VERSION 1 +#define HDMI_SCDC_DEFAULT_SCRAMBLE_TIMEOUT 200 /* ms */ + +/* + * SCDCS(Status and Control Data Channel Structure). + * see hdmi2.0 spec table 10-15. + */ +enum HdmiScdcsOffset { + HDMI_SCDCS_OFFSET_SINK_VERSION = 0x01, + HDMI_SCDCS_OFFSET_SOURCE_VERSION = 0x02, + HDMI_SCDCS_OFFSET_UPDATE_0 = 0x10, + HDMI_SCDCS_OFFSET_UPDATE_1 = 0x11, + HDMI_SCDCS_OFFSET_TMDS_CONFIG = 0x20, + HDMI_SCDCS_OFFSET_SCRAMBLER_STATUS = 0x21, + HDMI_SCDCS_OFFSET_CONFIG_0 = 0x30, + HDMI_SCDCS_OFFSET_CONFIG_1 = 0x31, + HDMI_SCDCS_OFFSET_TEST_CONFIG_1 = 0x35, + HDMI_SCDCS_OFFSET_STASTUS_FLAG_0 = 0x40, + HDMI_SCDCS_OFFSET_STASTUS_FLAG_1 = 0x41, + HDMI_SCDCS_OFFSET_STASTUS_FLAG_2 = 0x42, + HDMI_SCDCS_OFFSET_ERR_DET_0_L = 0x50, + HDMI_SCDCS_OFFSET_ERR_DET_0_H = 0x51, + HDMI_SCDCS_OFFSET_ERR_DET_1_L = 0x52, + HDMI_SCDCS_OFFSET_ERR_DET_1_H = 0x53, + HDMI_SCDCS_OFFSET_ERR_DET_2_L = 0x54, + HDMI_SCDCS_OFFSET_ERR_DET_2_H = 0x55, + HDMI_SCDCS_OFFSET_ERR_DET_CHECKSUM = 0x56, + HDMI_SCDCS_OFFSET_TEST_CONFIG_0 = 0xC0, + HDMI_SCDCS_OFFSET_IEEE_OUI_3TH = 0xD0, + HDMI_SCDCS_OFFSET_IEEE_OUI_2ND = 0xD1, + HDMI_SCDCS_OFFSET_IEEE_OUI_1ST = 0xD2, + HDMI_SCDCS_OFFSET_DEVICE_ID_START = 0xD3, + HDMI_SCDCS_OFFSET_DEVICE_ID_END = 0xDD, + HDMI_SCDCS_OFFSET_SPECIFIC_START = 0xDE, + HDMI_SCDCS_OFFSET_SPECIFIC_END = 0xFF, +}; + +/* + * see HDMI2.1 section 10.4.1.3. + * All update flags are readable and writable. + * The purpose of these flags is to provide a mechanism for the sink device to efficiently inform the source device + * that additional source device action may be required. + */ +union HdmiScdcsUpdateFlag0 { + uint8_t data; + struct { + uint8_t statusUpdate : 1; /* The sink shall set this bit when value is changed in the Status Flag register. */ + uint8_t cedUpdate : 1; /* ced(character error detection) register. */ + uint8_t rrTest : 1; /* rr(Read Request) */ + uint8_t srcTestUpdate : 1; + uint8_t frlStart : 1; + uint8_t fltUpdate : 1; + uint8_t rsedUpdate : 1; + uint8_t reserved : 1; + } bits; +}; + +#define HDMI_SCDC_STATUS_UPDATE_MARK (1 << 0) +#define HDMI_SCDC_CED_UPDATE_MARK (1 << 1) +#define HDMI_SCDC_RR_TEST_MARK (1 << 2) +#define HDMI_SCDC_SRC_TEST_UPDATE_MARK (1 << 3) +#define HDMI_SCDC_FRL_START_MARK (1 << 4) +#define HDMI_SCDC_FLT_UPDATE_MARK (1 << 5) +#define HDMI_SCDC_RSED_UPDATE_MARK (1 << 6) + +/* + * see HDMI2.1 section 10.4.1.4. + * All Configuration fields are readable and writable. + */ +union HdmiScdcsTmdsConfig { + uint8_t data; + struct { + uint8_t scramblingEnable : 1; + uint8_t tmdsBitClockRatio: 1; /* + * 0: TMDS_Bit_Period/TMDS_Clock_Period is 1/10; + * 1: TMDS_Bit_Period/TMDS_Clock_Period is 1/40. + */ + uint8_t reserved : 6; + } bits; +}; + +/* + * see HDMI2.1 section 10.4.1.5. + * The Status Flags are all Read Only. + */ +union HdmiScdcsScramblerStatus { + uint8_t data; + struct { + uint8_t scramblingStatus : 1; + uint8_t reserved : 7; + } bits; +}; + +/* + * see hdmi2.0 spec table 10-21. + * All Configuration fields are readable and writable. + */ +union HdmiScdcsConfig0 { + uint8_t data; + struct { + uint8_t rrEnable : 1; /* + * The source set this bit when the source supports Read Request. + * The sink shall reset this bit when SCDC of the sink goes from the disabled to enabled. + */ + uint8_t fltNoRetrain : 1; + uint8_t reserved : 6; + } bits; +}; + +/* + * see HDMI2.1 section 10.4.1.6. + */ +union HdmiScdcsConfig1 { + uint8_t data; + struct { + uint8_t frlRate : 4; /* + * Source select the FRL rate and Lane count by writing into this register. + * This field is written by the Source during the Link Training protocol. + */ + uint8_t ffeLevels : 4; + } bits; +}; + +/* + * see HDMI2.1 section 10.4.1.6. + */ +union HdmiScdcsTestConfig1 { + uint8_t data; + struct { + uint8_t reserved0 : 1; + uint8_t preShootIOnly : 1; + uint8_t deEmphasisOnly : 1; + uint8_t noFfe : 1; + uint8_t reserved1 : 1; + uint8_t fltNoTimeout : 1; + uint8_t dscFrlMax : 1; + uint8_t frlMax : 1; + } bits; +}; + +#define HDMI_SCDC_PRE_SHOOT_ONLY_MARK (1 << 1) +#define HDMI_SCDC_DE_EMPHASIS_ONLY_MARK (1 << 2) +#define HDMI_SCDC_NO_FFE_MARK (1 << 3) +#define HDMI_SCDC_FLT_NO_TIMEOUT_MARK (1 << 5) +#define HDMI_SCDC_DSC_FRL_MAX_MARK (1 << 6) +#define HDMI_SCDC_FRL_MAX_MARK (1 << 7) + +/* + * see HDMI2.1 section 10.4.1.7. + * The Status Flags are all Read Only. + */ +union HdmiScdcsStatusFlag0 { + uint8_t data; + struct { + uint8_t clockDetected : 1; /* This bit shall be set by the sink when the sink detects a valid clock signal. */ + uint8_t ch0Locked : 1; /* + * This bit shall be set by the sink when the sink is successfully decoding + * data on HDMI Channel 0. + */ + uint8_t ch1Locked : 1; /* + * This bit shall be set by the sink when the sink is successfully decoding + * data on HDMI Channel 1. + */ + uint8_t ch2Locked : 1; /* + * This bit shall be set by the sink when the sink is successfully decoding + * data on HDMI Channel 2. + */ + uint8_t ch3Locked : 1; + uint8_t reserved : 1; + uint8_t fltReady : 1; + uint8_t dscDecodeFail : 1; + } bits; +}; + +#define HDMI_SCDC_CLOCK_DETECTED_MARK (1 << 0) +#define HDMI_SCDC_CH0_LOCKED_MARK (1 << 1) +#define HDMI_SCDC_CH1_LOCKED_MARK (1 << 2) +#define HDMI_SCDC_CH2_LOCKED_MARK (1 << 3) +#define HDMI_SCDC_CH3_LOCKED_MARK (1 << 4) +#define HDMI_SCDC_FLT_READY_MARK (1 << 6) +#define HDMI_SCDC_DSC_DECODE_FAIL_MARK (1 << 7) + +/* + * see HDMI2.1 section 10.4.1.7. + * The Status Flags are all Read Only. + */ +union HdmiScdcsStatusFlag1 { + uint8_t data; + struct { + uint8_t ln0LtpReq : 4; + uint8_t ln1LtpReq : 4; + } bits; +}; + +/* + * see HDMI2.1 section 10.4.1.7. + * The Status Flags are all Read Only. + */ +union HdmiScdcsStatusFlag2 { + uint8_t data; + struct { + uint8_t ln2LtpReq : 4; + uint8_t ln3LtpReq : 4; + } bits; +}; + +/* + * see hdmi2.0 spec table 10-23. Offeset 0x50~0x55. + * The Character Error Detection counters are not writable by the source and are cleared on read by the source. + */ +union HdmiScdcsCharacterErrorDetection { + uint16_t data; + struct { + uint16_t chErrCntLower : 8; /* Channel 0/1/2 Erroe Count bits 7->0 */ + uint16_t chErrCntUpper : 7; /* Channel 0/1/2 Erroe Count bits 14->8 */ + uint16_t chValid : 1; /* Channel 0/1/2 valid flag */ + } bits; +}; + +/* + * see hdmi2.0 spec table 10-24. + * The Test Configuration registers are privided to facilitate compliance testing. + */ +union HdmiScdcsTestConfig0 { + uint8_t data; + struct { + uint8_t testReadRequestDelay : 7; + uint8_t testReadRequest : 1; /* Read/Write */ + } bits; +}; + +struct HdmiScdcsRegStatus { + uint8_t sinkVersion; + uint8_t sourceVersion; /* R/W */ + union HdmiScdcsUpdateFlag0 upfate0; /* R/W */ + union HdmiScdcsTmdsConfig tmdsCfg; /* R/W */ + union HdmiScdcsScramblerStatus scramblerStatus; + union HdmiScdcsConfig0 cfg0; /* R/W */ + union HdmiScdcsStatusFlag0 statusFlag0; + union HdmiScdcsCharacterErrorDetection errDet0; + union HdmiScdcsCharacterErrorDetection errDet1; + union HdmiScdcsCharacterErrorDetection errDet2; + uint8_t errDetChecksum; + union HdmiScdcsTestConfig0 testCfg0; /* R/W */ + uint8_t ieeeOui[HDMI_SCDCS_OFFSET_IEEE_OUI_1ST - HDMI_SCDCS_OFFSET_IEEE_OUI_3TH + 1]; + uint8_t deviceId[HDMI_SCDCS_OFFSET_DEVICE_ID_END - HDMI_SCDCS_OFFSET_DEVICE_ID_START + 1]; +}; + +struct HdmiScdcScrambleCap { + bool sinkScramble; + bool sourceScramble; + bool tmdsBitClockRatio40; +}; + +struct HdmiScdcAttribute { + bool sinkReadRequest; + bool srcScramble; + bool sinkScramble; + bool tmdsBitClockRatio40; + uint32_t ScrambleTimeOut; + uint32_t ScrambleInterval; +}; + +struct HdmiScdc { + struct HdmiScdcsRegStatus status; + struct HdmiScdcAttribute attr; + void *priv; +}; + +/* used for frl. */ +enum HdmiScdcOptMsg { + HDMI_SCDC_OPT_SET_SOURCE_VER = 0, + HDMI_SCDC_OPT_GET_SOURCE_VER = 1, + HDMI_SCDC_OPT_GET_SINK_VER = 2, + HDMI_SCDC_OPT_SET_FLT_UPDATE = 3, + HDMI_SCDC_OPT_GET_FLT_UPDATE = 4, + HDMI_SCDC_OPT_SET_FRL_START = 5, + HDMI_SCDC_OPT_GET_FRL_START = 6, + HDMI_SCDC_OPT_SET_CONFIG1 = 7, + HDMI_SCDC_OPT_GET_CONFIG1 = 8, + HDMI_SCDC_OPT_GET_TEST_CONFIG_1 = 9, + HDMI_SCDC_OPT_GET_FLT_READY = 10, + HDMI_SCDC_OPT_GET_LTP_REQ = 11, + HDMI_SCDC_OPT_BUTT, +}; + +int32_t HdmiScdcScrambleSet(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble); +int32_t HdmiScdcScrambleGet(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble); +bool HdmiScdcSinkSupport(struct HdmiScdc *scdc); +void HdmiScdcReset(struct HdmiScdc *scdc); +int32_t HdmiScdcOptMsgHandle(struct HdmiScdc *scdc, enum HdmiScdcOptMsg msg, uint8_t *buffer, uint32_t len); +int32_t HdmiScdcFillScrambleCap(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble, + enum HdmiTmdsModeType *tmdsMode); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HDMI_SCDC_H */ diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c new file mode 100644 index 000000000..da013387a --- /dev/null +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -0,0 +1,1649 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" +#include "securec.h" + +#define HDF_LOG_TAG hdmi_cec_c + +#define HDMI_CEC_PHY_ADDR_PHASE(addr) \ + ((addr) >> 12), ((addr) >> 8) & 0xf, ((addr) >> 4) & 0xf, (addr) & 0xf + +typedef void (*HdmiCecHandleMsgFunc)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *oldMsg, struct HdmiCecMsg *newMsg); + +struct HdmiCecHandleMsgFuncMap { + uint8_t opcode; + HdmiCecHandleMsgFunc func; +}; + +struct HdmiCecMsgLenInfo g_cecMsg[] = { + { HDMI_CEC_OPCODE_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_IMAGE_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TEXT_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_INACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_ROUTING_CHANGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_ROUTING_INFORMATION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_SET_STREAM_PATH, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_STANDBY, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_RECORD_OFF, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_RECORD_ON, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_RECORD_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_RECORD_TV_SCREEN, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TIMER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GET_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_SET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_REPORT_FEATURES, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_FEATURES_MSG_PARAM_MIN_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_GIVE_FEATURES, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_DECK_CONTROL, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_PLAY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_VENDOR_COMMAND, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN), HDMI_CEC_MSG_ALL }, + { HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_ALL }, + { HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_ALL }, + { HDMI_CEC_OPCODE_SET_OSD_STRING, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DISPLAY_CONTROL_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_MENU_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_MENU_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_USER_CONTROL_PRESSED, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_USER_CONTROL_RELEASED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN), + HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_2_0 }, + { HDMI_CEC_OPCODE_FEATURE_ABORT, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_ABORT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_SET_AUDIO_RATE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN), + HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_INITIATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_ARC_INITIATED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_TERMINATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, + { HDMI_CEC_OPCODE_CDC_MESSAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN), + HDMI_CEC_MSG_BROADCAST }, + { HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN), + HDMI_CEC_MSG_BROADCAST } +}; + +static struct HdmiCecMsgLenInfo *HdmiCecGetMsgLenInfo(uint8_t opcode) +{ + uint32_t i, len; + + len = sizeof(g_cecMsg) / sizeof(g_cecMsg[0]); + for (i = 0; i < len; i++) { + if (opcode == g_cecMsg[i].opcode) { + return (&g_cecMsg[i]); + } + } + return NULL; +} + +static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) +{ + uint8_t info = (msg->data[2] & 0xf); /* Progremmed Info or Not Progremmed Error Info. */ + + /* Progremmed Indicator Check. */ + if ((msg->data[2] & 0x10) > 0) { + if ((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC || + info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE) && + msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN)) { + HDF_LOGD("check Timer_Status(Indicator) Msg fail."); + return false; + } + } else if (info == HDMI_CEC_NOT_PROG_ERR_DUPLICATE) { + if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN)) { + HDF_LOGD("check Timer_Status Msg fail."); + return false; + } + } + return true; +} + +static bool HdmiCecCheckRecordOnMsgLen(struct HdmiCecMsg *msg) +{ + switch (msg->data[2]) { + case HDMI_CEC_RECORD_SRC_OWN: + break; + case HDMI_CEC_RECORD_SRC_DIGITAL: + if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN)) { + HDF_LOGD("check Record_On(DIGITAL) Msg fail."); + return false; + } + break; + case HDMI_CEC_RECORD_SRC_ANALOG: + if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN)) { + HDF_LOGD("check Record_On(ANALOG) Msg fail."); + return false; + } + break; + case HDMI_CEC_RECORD_SRC_EXT_PLUG: + if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN)) { + HDF_LOGD("check Record_On(EXT_PLUG) Msg fail."); + return false; + } + break; + case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR: + if (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN)) { + HDF_LOGD("check Record_On(EXT_PHY_ADDR) Msg fail."); + return false; + } + break; + default : + break; + } + return true; +} + +static bool HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg *msg, uint8_t opcode) +{ + bool ret = true; + + switch (opcode) { + case HDMI_CEC_OPCODE_TIMER_STATUS : + ret = HdmiCecCheckTimerStatusMsgLen(msg); + break; + case HDMI_CEC_OPCODE_RECORD_ON : + ret = HdmiCecCheckRecordOnMsgLen(msg); + default : + break; + } + return ret; +} + +static bool HdmiCecCheckMsgLen(struct HdmiCec *cec, struct HdmiCecMsg *msg, uint8_t opcode) +{ + struct HdmiCecMsgLenInfo *info = NULL; + + info = HdmiCecGetMsgLenInfo(opcode); + if (info == NULL) { + HDF_LOGD("have no this cec msg"); + return false; + } + + if (msg->len < info->minLen) { + HDF_LOGD("this cec msg is invalid, opcode = 0x%x, len = %d.", opcode, msg->len); + return false; + } + if (HdmiCecIsBroadcastMsg(msg) == true && + (info->type & HDMI_CEC_MSG_BROADCAST) == 0) { + HDF_LOGD("this cec msg,check broadcast msg fail."); + return false; + } + if (HdmiCecIsBroadcastMsg(msg) == false && + (info->type & HDMI_CEC_MSG_BROADCAST) > 0) { + HDF_LOGD("this cec msg,check directed msg fail."); + return false; + } + if (HdmiCecIsBroadcastMsg(msg) == true && + (info->type & HDMI_CEC_MSG_BROADCAST_1_4) > 0 && + cec->info.cecVersion < HDMI_CEC_VERSION_2_0) { + HDF_LOGD("this cec msg,check broadcast msg version fail."); + return false; + } + return HdmiCecCheckSomeSpecialfMsgLen(msg, opcode); +} + +/* message encoding/decoding functions. */ +void HdmiCecEncodingActiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_ACTIVE_SOURCE; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingImageViewOnMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_IMAGE_VIEW_ON; +} + +void HdmiCecEncodingTextViewOnMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_TEXT_VIEW_ON; +} + +void HdmiCecEncodingInactiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_INACTIVE_SOURCE; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingRequestActiveSourceMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_ACTIVE_SOURCE; + } +} + +void HdmiCecEncodingRoutingChangeMsg(struct HdmiCecMsg *msg, uint16_t orgAddr, uint16_t newAddr, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_ROUTING_CHANGE; + msg->data[2] = (orgAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (orgAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = (newAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[5] = (newAddr & HDMI_ONE_BYTE_MARK); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_ROUTING_INFORMATION; + } +} + +void HdmiCecEncodingRoutingInfomationMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_ROUTING_INFORMATION; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingSetStreamPathMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_SET_STREAM_PATH; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingStandbyMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_STANDBY; +} + +void HdmiCecEncodingRecordOffMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_OFF; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_RECORD_STATUS; + } +} + +static void HdmiCecEncodingRecordOnOwn(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[2] = HDMI_CEC_RECORD_SRC_OWN; +} + +static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct HdmiCecDigitalServiceId *digital) +{ + if (len < HDMI_CEC_DIGITAL_SERVICE_ID_LEN) { + return; + } + + data[0] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | (digital->system); + if (digital->method == HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL) { + data[1] = (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); + data[2] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK; + data[3] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT; + data[4] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK; + return; + } + switch (digital->system) { + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T : + data[1] = digital->systemData.arib.transportId >> HDMI_ONE_BYTE_SHIFT; + data[2] = digital->systemData.arib.transportId & HDMI_ONE_BYTE_MARK; + data[3] = digital->systemData.arib.serviceId >> HDMI_ONE_BYTE_SHIFT; + data[4] = digital->systemData.arib.serviceId & HDMI_ONE_BYTE_MARK; + data[5] = digital->systemData.arib.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; + data[6] = digital->systemData.arib.orgNetworkId & HDMI_ONE_BYTE_MARK; + break; + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL : + data[1] = digital->systemData.atsc.transportId >> HDMI_ONE_BYTE_SHIFT; + data[2] = digital->systemData.atsc.transportId & HDMI_ONE_BYTE_MARK; + data[3] = digital->systemData.atsc.programNumber >> HDMI_ONE_BYTE_SHIFT; + data[4] = digital->systemData.atsc.programNumber & HDMI_ONE_BYTE_MARK; + break; + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2 : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T : + data[1] = digital->systemData.dvb.transportId >> HDMI_ONE_BYTE_SHIFT; + data[2] = digital->systemData.dvb.transportId & HDMI_ONE_BYTE_MARK; + data[3] = digital->systemData.dvb.serviceId >> HDMI_ONE_BYTE_SHIFT; + data[4] = digital->systemData.dvb.serviceId & HDMI_ONE_BYTE_MARK; + data[5] = digital->systemData.dvb.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; + data[6] = digital->systemData.dvb.orgNetworkId & HDMI_ONE_BYTE_MARK; + break; + default : + HDF_LOGE("digital system 0x%x is invalid", digital->system); + } +} + +static void HdmiCecEncodingRecordOnDigital(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[2] = HDMI_CEC_RECORD_SRC_DIGITAL; + HdmiCecEncodingDigitalServiceId(&(msg->data[3]), HDMI_CEC_DIGITAL_SERVICE_ID_LEN, digital); +} + +static void HdmiCecEncodingRecordOnAnalog(struct HdmiCecMsg *msg, + uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[2] = HDMI_CEC_RECORD_SRC_ANALOG; + msg->data[3] = anaBcastType; + msg->data[4] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[5] = (anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[6] = bcstSystem; +} + +static void HdmiCecEncodingRecordOnExtPlug(struct HdmiCecMsg *msg, uint8_t extPlug) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[2] = HDMI_CEC_RECORD_SRC_EXT_PLUG; + msg->data[3] = extPlug; +} + +static void HdmiCecEncodingRecordOnExtPhyAddr(struct HdmiCecMsg *msg, uint16_t extPhyAddr) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[2] = HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR; + msg->data[3] = (extPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[4] = (extPhyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSource *src, bool response) +{ + switch (src->type) { + case HDMI_CEC_RECORD_SRC_OWN : + HdmiCecEncodingRecordOnOwn(msg); + break; + case HDMI_CEC_RECORD_SRC_DIGITAL : + HdmiCecEncodingRecordOnDigital(msg, &(src->data.id)); + break; + case HDMI_CEC_RECORD_SRC_ANALOG : + HdmiCecEncodingRecordOnAnalog(msg, src->data.analog.anaBcastType, + src->data.analog.anaFreq, src->data.analog.bcstSystem); + break; + case HDMI_CEC_RECORD_SRC_EXT_PLUG : + HdmiCecEncodingRecordOnExtPlug(msg, src->data.extPlug); + break; + case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR : + HdmiCecEncodingRecordOnExtPhyAddr(msg, src->data.extPhyAddr); + break; + default : + HDF_LOGE("cec record on: type %d unknow", src->type); + } + + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_RECORD_STATUS; + } +} + +void HdmiCecEncodingRecordStatusMsg(struct HdmiCecMsg *msg, uint8_t recordStatusInfo) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_STATUS; + msg->data[2] = recordStatusInfo; +} + +void HdmiCecEncodingRecordTvScreenMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_RECORD_TV_SCREEN; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_RECORD_ON; + } +} + +static void HdmiCecEncodingCommTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecCommTimerInfo *info) +{ + if (len < HDMI_CEC_COMM_TIMER_INFO_LEN) { + return; + } + data[0] = info->data; + data[1] = info->month; + data[2] = HDMI_CEC_BCD_FORMAT_TIME(info->startHour); + data[3] = HDMI_CEC_BCD_FORMAT_TIME(info->startMinute); + data[4] = HDMI_CEC_BCD_FORMAT_TIME(info->durationHour); + data[5] = HDMI_CEC_BCD_FORMAT_TIME(info->durationMinute); + data[6] = info->recordingSeq; +} + +static void HdmiCecEncodingAnalogueTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecAnalogueTimerInfo *info) +{ + if (len < HDMI_CEC_ANALOGUE_TIMER_INFO_LEN) { + return; + } + HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); + data[7] = info->anaBcastType; + data[8] = (info->anaFreq >> HDMI_ONE_BYTE_SHIFT); + data[9] = (info->anaFreq & HDMI_ONE_BYTE_MARK); + data[10] = info->bcstSystem; +} + +void HdmiCecEncodingClearAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER; + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[2]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; + } +} + +static void HdmiCecEncodingDigitalTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecDigitalTimerInfo *info) +{ + if (len < HDMI_CEC_DIGITAL_TIMER_INFO_LEN) { + return; + } + HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); + HdmiCecEncodingDigitalServiceId(&data[7], len - HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->id)); +} + +void HdmiCecEncodingClearDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER; + HdmiCecEncodingDigitalTimerInfo(&(msg->data[2]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; + } +} + +static void HdmiCecEncodingExternalTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecExternalTimerInfo *info) +{ + if (len < HDMI_CEC_EXTERNAL_TIMER_INFO_LEN) { + return; + } + HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); + data[7] = info->extSrcSpec; + data[8] = info->extPlug; + data[9] = (info->extPhyAddr >> HDMI_ONE_BYTE_SHIFT); + data[10] = (info->extPhyAddr & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER; + HdmiCecEncodingExternalTimerInfo(&(msg->data[2]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; + } +} + +void HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER; + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[2]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; + } +} + +void HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_DIGITAL_TIMER; + HdmiCecEncodingDigitalTimerInfo(&(msg->data[2]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; + } +} + +void HdmiCecEncodingSetExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER; + HdmiCecEncodingExternalTimerInfo(&(msg->data[2]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; + } +} + +void HdmiCecEncodingSetTimerProgramTitleMsg(struct HdmiCecMsg *msg, uint8_t *title, uint32_t len) +{ + uint32_t length; + + if (title == NULL || len < HDMI_CEC_PROGRAM_TITLE_STR_MIN_LEN) { + HDF_LOGE("encoding set timer program title, input param invalid."); + return; + } + length = ((len <= HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN) ? len : HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN); + msg->len = HDMI_CEC_GET_MSG_LEN(length); + msg->data[1] = HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE; + if (memcpy_s(&(msg->data[2]), (msg->len - 2), title, length) != EOK) { + HDF_LOGE("encoding set timer program title, memcpy_s fail."); + } +} + +void HdmiCecEncodingTimerClearedStatusMsg(struct HdmiCecMsg *msg, uint8_t status) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; + msg->data[2] = status; +} + +void HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTimerStatusData *status) +{ + bool duration = false; + + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN); + msg->data[1] = HDMI_CEC_OPCODE_TIMER_STATUS; + msg->data[2] |= (status->timerOverlap << 7); + msg->data[2] |= (status->mediaInfo << 5); + msg->data[2] |= (status->progInfo.indicator << 4); + msg->data[2] |= (status->progInfo.info); + if (status->progInfo.indicator > 0) { + /* Progremmed Info */ + if (status->progInfo.info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC || + status->progInfo.info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE) { + duration = true; + } + } else { + /* Not Progremmed Error Info */ + if (status->progInfo.info == HDMI_CEC_NOT_PROG_ERR_DUPLICATE) { + duration = true; + } + } + if (duration == true) { + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN); + msg->data[3] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationHour); + msg->data[4] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationMinute); + } +} + +void HdmiCecEncodingCecVersionMsg(struct HdmiCecMsg *msg, uint8_t version) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_CEC_VERSION; + msg->data[2] = version; +} + +void HdmiCecEncodingGetCecVersionMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GET_CEC_VERSION; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_CEC_VERSION; + } +} + +void HdmiCecEncodingGetPhyAddressMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS; + } +} + +void HdmiCecEncodingGetMenuLanguageMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GET_MENU_LANGUAGE; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; + } +} + +void HdmiCecEncodingReportPhyAddressMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, uint8_t deviceType) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = deviceType; +} + +void HdmiCecEncodingSetMenuLanguageMsg(struct HdmiCecMsg *msg, uint8_t *language, uint32_t len) +{ + if (language == NULL || len != HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN) { + HDF_LOGE("encoding set menu language, input param invalid."); + return; + } + + msg->len = HDMI_CEC_GET_MSG_LEN(len); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; + if (memcpy_s(&(msg->data[2]), (msg->len - 2), language, len) != EOK) { + HDF_LOGE("encoding set menu language, memcpy_s fail."); + } +} + +void HdmiCecEncodingReportFeaturesMsg(struct HdmiCecMsg *msg, struct HdmiCecInfo *info) +{ + uint32_t i; + + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_REPORT_FEATURES; + msg->data[2] = info->cecVersion; + msg->len++; + msg->data[3] = info->allDeviceType; + msg->len++; + /* fill RC Profile. */ + for (i = 0; i < HDMI_CEC_RC_PROFILE_MAX_NUM; i++) { + msg->data[msg->len] = info->rcProfile[i]; + msg->len++; + if ((info->rcProfile[i] & HDMI_CEC_RC_PROFILE_EXTERNSION_MARK) == 0) { + break; + } + } + /* fill Device Features. */ + for (i = 0; i < HDMI_CEC_DEVICE_FEATURES_MAX_NUM; i++) { + msg->data[msg->len] = info->devFeatures[i]; + msg->len++; + if ((info->devFeatures[i] & HDMI_CEC_DEVICE_FEATURES_EXTERNSION_MARK) == 0) { + break; + } + } +} + +void HdmiCecEncodingGiveFeaturesMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_FEATURES; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; + } +} + + +void HdmiCecEncodingDeckControlMsg(struct HdmiCecMsg *msg, uint8_t mode) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_DECK_CONTROL; + msg->data[2] = mode; +} + +void HdmiCecEncodingDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t info) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_DECK_STATUS; + msg->data[2] = info; +} + +void HdmiCecEncodingGiveDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_DECK_STATUS; + msg->data[2] = statusReq; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_DECK_STATUS; + } +} + +void HdmiCecEncodingPlayMsg(struct HdmiCecMsg *msg, uint8_t playMode) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_PLAY; + msg->data[2] = playMode; +} + +void HdmiCecEncodingGiveTunerDeviceStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS; + msg->data[2] = statusReq; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS; + } +} + +void HdmiCecEncodingSelectAnalogueServiceMsg(struct HdmiCecMsg *msg, + uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE; + msg->data[2] = anaBcastType; + msg->data[3] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[4] = (anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[5] = bcstSystem; +} + +void HdmiCecEncodingSelectDigitalServiceMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE; + HdmiCecEncodingDigitalServiceId(&(msg->data[2]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, digital); +} + +void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTunerDeviceInfo *info) +{ + msg->data[1] = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS; + msg->data[2] = (info->recordingFlag << 7) | (info->dispInfo); + if (info->isAnalogService == true) { + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN); + msg->data[3] = info->data.analog.anaBcastType; + msg->data[4] = (info->data.analog.anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[5] = (info->data.analog.anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[6] = info->data.analog.bcstSystem; + } else { + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_DIG_PARAM_LEN); + HdmiCecEncodingDigitalServiceId(&(msg->data[3]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, + &(info->data.digital)); + } +} + +void HdmiCecEncodingTunerStepDecrementMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT; +} + +void HdmiCecEncodingTunerStepIncrementMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT; +} + +void HdmiCecEncodingDeviceVendorIdMsg(struct HdmiCecMsg *msg, uint32_t devVendorId) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID; + msg->data[2] = (devVendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[3] = (devVendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[4] = (devVendorId & HDMI_ONE_BYTE_MARK); +} + +void HdmiCecEncodingGiveDeviceVendorIdMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID; + } +} + +void HdmiCecEncodingVendorCommandMsg(struct HdmiCecMsg *msg, uint8_t *data, uint32_t len) +{ + uint32_t length; + + if (data == NULL || len == 0) { + HDF_LOGE("encoding vendor cmd, input param invalid."); + return; + } + length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN : len; + msg->len = HDMI_CEC_GET_MSG_LEN(length); + msg->data[1] = HDMI_CEC_OPCODE_VENDOR_COMMAND; + if (memcpy_s(&(msg->data[2]), (msg->len - 2), data, length) != EOK) { + HDF_LOGE("encoding vendor cmd, memcpy_s fail."); + } +} + +void HdmiCecEncodingVendorCommandWithIdMsg(struct HdmiCecMsg *msg, uint32_t vendorId, uint8_t *data, uint32_t len) +{ + uint32_t length; + + if (data == NULL || len == 0) { + HDF_LOGE("encoding vendor cmd with id, input param invalid."); + return; + } + length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN) ? + HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN : len; + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN + length); + msg->data[1] = HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID; + msg->data[2] = (vendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[3] = (vendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[4] = (vendorId & HDMI_ONE_BYTE_MARK); + if (memcpy_s(&(msg->data[5]), (msg->len - 5), data, length) != EOK) { + HDF_LOGE("encoding vendor cmd with id, memcpy_s fail."); + } +} + +void HdmiCecEncodingVendorRemoteButtonDownMsg(struct HdmiCecMsg *msg, uint8_t *rcCode, uint32_t len) +{ + uint32_t length; + + if (rcCode == NULL || len == 0) { + HDF_LOGE("encoding vendor remote button down, input param invalid."); + return; + } + length = (len > HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN : len; + msg->len = HDMI_CEC_GET_MSG_LEN(length); + msg->data[1] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN; + if (memcpy_s(&(msg->data[2]), (msg->len - 2), rcCode, length) != EOK) { + HDF_LOGE("encoding vendor remote button down, memcpy_s fail."); + } +} + +void HdmiCecEncodingVendorRemoteButtonUpMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP; +} + +void HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg *msg, uint8_t dispControl, uint8_t *str, uint32_t len) +{ + uint32_t length; + + if (str == NULL || len == 0) { + HDF_LOGE("encoding set OSD string, input param invalid."); + return; + } + length = (len > HDMI_CEC_OSD_STRING_MAX_LEN) ? HDMI_CEC_OSD_STRING_MAX_LEN : len; + msg->len = HDMI_CEC_GET_MSG_LEN(length + HDMI_CEC_DISPLAY_CONTROL_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_OSD_STRING; + msg->data[2] = dispControl; + if (memcpy_s(&(msg->data[3]), (msg->len - 3), str, length) != EOK) { + HDF_LOGE("encoding set OSD string, memcpy_s fail."); + } +} + +void HdmiCecEncodingGiveOsdNameMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_OSD_NAME; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_SET_OSD_NAME; + } +} + +void HdmiCecEncodingSetOsdNameMsg(struct HdmiCecMsg *msg, uint8_t *name, uint32_t len) +{ + uint32_t length; + + if (name == NULL || len == 0) { + HDF_LOGE("encoding set OSD name, input param invalid."); + return; + } + length = (len > HDMI_CEC_OSD_NAME_MAX_LEN) ? HDMI_CEC_OSD_NAME_MAX_LEN : len; + msg->len = HDMI_CEC_GET_MSG_LEN(length); + msg->data[1] = HDMI_CEC_OPCODE_SET_OSD_NAME; + if (memcpy_s(&(msg->data[2]), (msg->len - 2), name, length) != EOK) { + HDF_LOGE("encoding set OSD name, memcpy_s fail."); + } +} + +void HdmiCecEncodingMenuRequestMsg(struct HdmiCecMsg *msg, uint8_t menuReq, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_MENU_REQUEST; + msg->data[2] = menuReq; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_MENU_STATUS; + } +} + +void HdmiCecEncodingMenuStatusMsg(struct HdmiCecMsg *msg, uint8_t menuStatus) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_MENU_STATUS; + msg->data[2] = menuStatus; +} + +void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCecUiCmd *cmd) +{ + if (cmd == NULL) { + return; + } + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN); + msg->data[1] = HDMI_CEC_OPCODE_USER_CONTROL_PRESSED; + msg->data[2] = cmd->cmdType; + if (cmd->hasAddOp == false) { + return; + } + switch (cmd->cmdType) { + case HDMI_CEC_UI_CMD_SELECT_BROADCAST_TYPE : + case HDMI_CEC_UI_CMD_SELECT_SOUND_PRESENTATION : + case HDMI_CEC_UI_CMD_PLAY_FUNCTION : + case HDMI_CEC_UI_CMD_SELECT_MEDIA_FUNCTION : + case HDMI_CEC_UI_CMD_SELECT_AV_INPUT_FUNCTION : + case HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION : + (msg->len)++; + /* The additional operand is one byte for all these UI commands */ + msg->data[3] = cmd->addOperands.uiBroadcastType; + break; + case HDMI_CEC_UI_CMD_TUNE_FUNCTION : + msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN; + msg->data[3] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); + msg->data[4] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK); + msg->data[5] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); + msg->data[6] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); + break; + default : + HDF_LOGI("UI type %d have no additional operands.", cmd->cmdType); + break; + } +} + +void HdmiCecEncodingUserControlReleasedMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_USER_CONTROL_RELEASED; +} + +void HdmiCecEncodingGiveDevicePowerStatusMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_POWER_STATUS; + } +} + +void HdmiCecEncodingReportDevicePowerStatusMsg(struct HdmiCecMsg *msg, uint8_t powerStatus) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN); + msg->data[1] = HDMI_CEC_OPCODE_REPORT_POWER_STATUS; + msg->data[2] = powerStatus; +} + +void HdmiCecEncodingFeatureAbortMsg(struct HdmiCecMsg *msg, uint8_t opcode, uint8_t reason) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN); + msg->data[1] = HDMI_CEC_OPCODE_FEATURE_ABORT; + msg->data[2] = opcode; + msg->data[3] = reason; +} + +void HdmiCecEncodingAbortMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_ABORT; +} + +void HdmiCecEncodingGiveAudioStatusMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; + } +} + +void HdmiCecEncodingGiveSystemAudioModeMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS; + } +} + +void HdmiCecEncodingReportAudioStatusMsg(struct HdmiCecMsg *msg, uint8_t audioMuteStatus, uint8_t audioVolumeStatus) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; + msg->data[2] = (audioMuteStatus << HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT) | + (audioVolumeStatus & HDMI_CEC_AUDIO_VOLUME_STATUS_MARK); +} + +void HdmiCecEncodingRequestShortAudioDescriptorMsg(struct HdmiCecMsg *msg, + uint8_t *id, uint8_t *code, uint32_t len, bool response) +{ + uint32_t num, i; + + if (id == NULL || code == NULL || len == 0) { + HDF_LOGE("encoding request short audio descriptor, input param invalid."); + return; + } + num = (len > HDMI_CEC_MAX_AUDIO_FORMAT_NUM) ? HDMI_CEC_MAX_AUDIO_FORMAT_NUM : len; + msg->len = HDMI_CEC_GET_MSG_LEN(num * HDMI_CEC_AUDIO_FORMAT_LEN); + msg->data[1] = HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR; + for (i = 0; i < num; i++) { + msg->data[2 + i] = (id[i] << HDMI_CEC_AUDIO_FORMAT_ID_SHIFT) | (code[i] & HDMI_CEC_AUDIO_FORMAT_CODE_MARK); + } + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR; + } +} + +void HdmiCecEncodingReportShortAudioDescriptorMsg(struct HdmiCecMsg *msg, uint32_t *descriptor, uint32_t len) +{ + uint32_t num, i; + + if (descriptor == NULL || len == 0) { + HDF_LOGE("encoding report short audio descriptor, input param invalid."); + return; + } + num = (len > HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM) ? HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM : len; + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN * num); + msg->data[1] = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR; + for (i = 0; i < num; i++) { + msg->data[2 + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] = + (descriptor[i] >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[3 + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] = + (descriptor[i] >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[4 + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] = descriptor[i] & HDMI_ONE_BYTE_MARK; + } +} + +void HdmiCecEncodingSetSystemAudioModeMsg(struct HdmiCecMsg *msg, uint8_t status) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE; + msg->data[2] = status; +} + +void HdmiCecEncodingSystemAudioModeRequestMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE; + } +} + +void HdmiCecEncodingSystemAudioModeStatusMsg(struct HdmiCecMsg *msg, uint8_t status) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS; + msg->data[2] = status; +} + +void HdmiCecEncodingSetAudioRateMsg(struct HdmiCecMsg *msg, uint8_t rate) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN); + msg->data[1] = HDMI_CEC_OPCODE_SET_AUDIO_RATE; + msg->data[2] = rate; +} + +void HdmiCecEncodingInitiateArcMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_INITIATE_ARC; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED; + } +} + +void HdmiCecEncodingReportArcInitiatedMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED; +} + +void HdmiCecEncodingReportArcTerminationMsg(struct HdmiCecMsg *msg) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION; +} + +void HdmiCecEncodingRequestArcInitiationMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_INITIATE_ARC; + } +} + +void HdmiCecEncodingRequestArcTerminationMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_TERMINATE_ARC; + } +} + +void HdmiCecEncodingTerminateArcMsg(struct HdmiCecMsg *msg, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(0); + msg->data[1] = HDMI_CEC_OPCODE_TERMINATE_ARC; + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION; + } +} + +void HdmiCecEncodingRequestCurrentLatencyMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + if (response == true) { + msg->rspMsg = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY; + } +} + +void HdmiCecEncodingReportCurrentLatencyMsg(struct HdmiCecMsg *msg, + uint16_t phyAddr, struct HdmiCecLatencyInfo *info) +{ + msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY; + msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = info->videoLatency; + msg->data[5] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) | (info->audioOutputCompensated); + /* Operand[Audio Output Delay] is only present when [Audio Output Compensated] is 3. */ + if (info->audioOutputCompensated == HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_PARTIAL_DELAY) { + msg->len++; + msg->data[6] = info->audioOutputDelay; + } +} + +/* CDC Message Encoding. */ +void HdmiCdcEncodingHecInquireStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint16_t phyAddr1, uint16_t phyAddr2, bool response) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_INQUIRE_STATE_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_INQUIRE_STATE; + msg->data[5] = (phyAddr1 >> HDMI_ONE_BYTE_SHIFT); + msg->data[6] = (phyAddr1 & HDMI_ONE_BYTE_MARK); + msg->data[7] = (phyAddr2 >> HDMI_ONE_BYTE_SHIFT); + msg->data[8] = (phyAddr2 & HDMI_ONE_BYTE_MARK); + if (response == true) { + msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; + } +} + +void HdmiCdcEncodingHecReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint16_t phyAddr, struct HdmiCdcHecState *state) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MIN_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_REPORT_STATE; + msg->data[5] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[6] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[7] = (state->hecFuncState << HDMI_CDC_HEC_FUNC_STATE_SHIFT) | + (state->hostFuncState << HDMI_CDC_HOST_FUNC_STATE_SHIFT) | + (state->encFuncState << HDMI_CDC_ENC_FUNC_STATE_SHIFT) | + (state->cdcErrCode); + if (state->haveHecField == true) { + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MAX_LEN); + msg->data[8] = (state->hecField >> HDMI_ONE_BYTE_SHIFT); + msg->data[9] = (state->hecField & HDMI_ONE_BYTE_MARK); + } +} + +void HdmiCdcEncodingHecSetStateAdjacentMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint16_t phyAddr, uint8_t hecSetState, bool response) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_ADJACENT_MSG_PARAM_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_SET_STATE_ADJACENT; + msg->data[5] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[6] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[7] = hecSetState; + if (response == true) { + msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; + } +} + +void HdmiCdcEncodingHecSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + struct HemiCdcHecStateInfo *info, bool response) +{ + uint32_t i; + + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_MSG_MIN_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_SET_STATE; + msg->data[5] = (info->phyAddr1 >> HDMI_ONE_BYTE_SHIFT); + msg->data[6] = (info->phyAddr1 & HDMI_ONE_BYTE_MARK); + msg->data[7] = (info->phyAddr2 >> HDMI_ONE_BYTE_SHIFT); + msg->data[8] = (info->phyAddr2 & HDMI_ONE_BYTE_MARK); + msg->data[9] = info->hecSetState; + for (i = 0; (i < info->phyAddrLen) && (i < HDMI_CDC_HEC_SET_STATE_MSG_OPTIONAL_PA_MAX_NUM); i++) { + if (info->phyAddr[i] == HDMI_CEC_INVALID_PHY_ADDR) { + break; + } + msg->data[msg->len] = (info->phyAddr[i] >> HDMI_ONE_BYTE_SHIFT); + (msg->len)++; + msg->data[msg->len] = (info->phyAddr[i] & HDMI_ONE_BYTE_MARK); + (msg->len)++; + } + if (response == true) { + msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; + } +} + +void HdmiCdcEncodingHecRequestDeactivationMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint16_t *phyAddr, uint32_t len, bool response) +{ + uint32_t i; + + if (phyAddr == NULL || len != HDMI_CDC_HEC_REQUEST_DEACTIVATION_MSG_PHY_ADDR_NUM) { + return; + } + msg->len = HDMI_CDC_GET_MSG_LEN(0); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_REQUEST_DEACTIVATION; + for (i = 0; i < len; i++) { + msg->data[msg->len] = (phyAddr[i] >> HDMI_ONE_BYTE_SHIFT); + (msg->len)++; + msg->data[msg->len] = (phyAddr[i] & HDMI_ONE_BYTE_MARK); + (msg->len)++; + } + if (response == true) { + msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; + } +} + +void HdmiCdcEncodingHecNotifyAliveMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(0); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_NOTIFY_ALIVE; +} + +void HdmiCdcEncodingHecDiscoverMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, bool response) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(0); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HEC_DISCOVER; + if (response == true) { + msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; + } +} + +void HdmiCdcEncodingHpdSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint8_t portNum, uint8_t hpdState, bool response) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_SET_STATE_MSG_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = HDMI_CDC_HPD_SET_STATE; + msg->data[5] = (portNum << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | hpdState; + if (response == true) { + msg->rspMsg = CEC_MSG_CDC_HPD_REPORT_STATE; + } +} + +void HdmiCdcEncodingHpdReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, + uint8_t hpdState, uint8_t errCode) +{ + msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_REPORT_STATE_MSG_LEN); + msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[4] = CEC_MSG_CDC_HPD_REPORT_STATE; + msg->data[5] = (hpdState << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | errCode; +} + +static int32_t HdmiCecSendMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) +{ + int32_t ret; + + if (cntlr->ops == NULL || cntlr->ops->cecMsgSend == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + if (msg->response == true) { + msg->timeout = HDMI_CEC_WAIT_RESPONSE_MSG_MAX_TIME; + } + + HdmiCntlrLock(cntlr); + ret = cntlr->ops->cecMsgSend(cntlr, msg); + HdmiCntlrUnlock(cntlr); + return ret; +} + +static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast) +{ + switch (opcode) { + case HDMI_CEC_OPCODE_GET_CEC_VERSION : + case HDMI_CEC_OPCODE_ABORT : + case HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS : + case HDMI_CEC_OPCODE_GIVE_OSD_NAME : + /* Ignore if initiator is Unregistered, because these messages should reply with a directed message. */ + if (unregistered == true) { + return true; + } + /* fallthrough */ + case HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID : + case HDMI_CEC_OPCODE_GIVE_FEATURES : + case HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS : + /* Ignore if addressing is wrong */ + if (broadcast == true) { + return true; + } + break; + case HDMI_CEC_OPCODE_USER_CONTROL_PRESSED : + case HDMI_CEC_OPCODE_USER_CONTROL_RELEASED : + if (unregistered == true || broadcast == true) { + return true; + } + break; + case HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS : + if (broadcast == false) { + return true; + } + break; + default : + break; + } + return false; +} + +static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + uint16_t phyAddr = ((msg->data[2] << HDMI_ONE_BYTE_SHIFT) | msg->data[3]); + (void)cntlr; + (void)txMsg; + + HDF_LOGD("reported phy address is %x.%x.%x.%x, logical address is %d", + HDMI_CEC_PHY_ADDR_PHASE(phyAddr), HdmiCecGetMsgInitiator(msg)); +} + +static void HdmiCecHandleUserControlPrtessedMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + /* Not support CEC Remote Control. */ + if (cntlr->cap.baseCap.bits.cecRc == 0) { + return; + } + + /* TODO */ +} + +static void HdmiCecHandleUserControlReleasedMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + /* Not support CEC Remote Control. */ + if (cntlr->cap.baseCap.bits.cecRc == 0) { + return; + } + /* TODO */ +} + +static void HdmiCecHandleGetCecVersionMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + HdmiCecEncodingCecVersionMsg(txMsg, cntlr->cec->info.cecVersion); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + /* Ignore for CEC switches using addr 15. */ + if (cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH && + HdmiCecGetMsgDestination(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) { + return; + } + + HdmiCecEncodingReportPhyAddressMsg(txMsg, cntlr->cec->info.phyAddr, cntlr->cec->info.primaryDeviceType); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + if (cntlr->cec->info.vendorId == HDMI_CEC_VENDOR_ID_UNKNOWN) { + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecSendMsg(cntlr, txMsg); + return; + } + HdmiCecEncodingDeviceVendorIdMsg(txMsg, cntlr->cec->info.vendorId); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecHandleAbortMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + /* Ignore for CEC switches. */ + if (cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH) { + return; + } + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_REFUSED); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + if (cntlr->cec->info.osdName[0] == 0) { + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecSendMsg(cntlr, txMsg); + return; + } + + HdmiCecEncodingSetOsdNameMsg(txMsg, cntlr->cec->info.osdName, cntlr->cec->info.osdNameLen); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + if (cntlr->cec->info.cecVersion < HDMI_CEC_VERSION_2_0) { + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecSendMsg(cntlr, txMsg); + return; + } + + HdmiCecEncodingReportFeaturesMsg(txMsg, &(cntlr->cec->info)); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecMsgDefaultHandle(struct HdmiCntlr *cntlr, + struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) +{ + bool broadcast = HdmiCecIsBroadcastMsg(msg); + uint8_t opcode = msg->data[1]; + bool isResponse = (cntlr->cec->info.isWaitingResponse == true && cntlr->cec->info.response == opcode); + + if (broadcast == true || isResponse == true) { + return; + } + if (opcode != HDMI_CEC_OPCODE_FEATURE_ABORT) { + return; + } + + HdmiCecEncodingFeatureAbortMsg(txMsg, opcode, HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecSendMsg(cntlr, txMsg); +} + +static void HdmiCecMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, + struct HdmiCecMsg *txMsg, uint8_t opcode) +{ + uint32_t i, len; + + struct HdmiCecHandleMsgFuncMap funcMap[] = { + { HDMI_CEC_OPCODE_GET_CEC_VERSION, HdmiCecHandleGetCecVersionMsg }, + { HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS, HdmiCecHandleReportPhyAddressMsg }, + { HDMI_CEC_OPCODE_USER_CONTROL_PRESSED, HdmiCecHandleUserControlPrtessedMsg }, + { HDMI_CEC_OPCODE_USER_CONTROL_RELEASED, HdmiCecHandleUserControlReleasedMsg }, + { HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS, HdmiCecHandleGivePhyAddressMsg }, + { HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID, HdmiCecHandleGiveDeviceVendorIdMsg }, + { HDMI_CEC_OPCODE_ABORT, HdmiCecHandleAbortMsg }, + { HDMI_CEC_OPCODE_GIVE_OSD_NAME, HdmiCecHandleGiveOsdNameMsg }, + { HDMI_CEC_OPCODE_GIVE_FEATURES, HdmiCecHandleGiveFeaturesMsg } + }; + + len = sizeof(funcMap) / sizeof(funcMap[0]); + for (i = 0; i < len; i++) { + if (opcode == funcMap[i].opcode) { + funcMap[i].func(cntlr, msg, txMsg); + return; + } + } + HdmiCecMsgDefaultHandle(cntlr, msg, txMsg); +} + +static void HdmiCecUpdateResponseFlag(struct HdmiCec *cec, uint8_t opcode) +{ + /* receive response msg. */ + if (cec->info.isWaitingResponse == true && cec->info.response == opcode) { + cec->info.isWaitingResponse = false; + cec->info.response = 0; + } +} + +static void HdmiCecReceivedMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) +{ + uint8_t opcode = msg->data[1]; + bool broadcast = HdmiCecIsBroadcastMsg(msg); + bool unregistered = (HdmiCecGetMsgInitiator(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST); + struct HdmiCecMsg txMsg = {0}; + + if (HdmiCecMsgIgnore(opcode, unregistered, broadcast) == true) { + HdmiCecUpdateResponseFlag(cntlr->cec, opcode); + return; + } + + HdmiCecFillMsgHeader(&txMsg, msg); + HdmiCecMsgHandle(cntlr, msg, &txMsg, opcode); + HdmiCecUpdateResponseFlag(cntlr->cec, opcode); +} + +int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg) +{ + struct HdmiCntlr *cntlr = NULL; + uint8_t opcode, initiator, destination; + + if (cec == NULL || cec->priv == NULL || msg == NULL) { + HDF_LOGE("cec receive msg, input param invalid."); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)cec->priv; + if (cntlr->cap.baseCap.bits.cec == 0) { + HDF_LOGD("not support cec."); + return HDF_ERR_NOT_SUPPORT; + } + + if (msg->len < HDMI_CEC_MSG_MIN_LEN) { + HDF_LOGE("cec receive msg, len is error."); + return HDF_ERR_INVALID_PARAM; + } + + initiator = HdmiCecGetMsgInitiator(msg); + destination = HdmiCecGetMsgDestination(msg); + opcode = msg->data[1]; + /* Check if this message is for us. */ + if (initiator != HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST && + HdmiCecLogAddrValid(cntlr->cec, initiator) == true) { + return HDF_ERR_INVALID_PARAM; + } + if (HdmiCecIsBroadcastMsg(msg) == false && + HdmiCecLogAddrValid(cec, destination) == false) { + HDF_LOGD("this cec msg is not for us!"); + return HDF_ERR_INVALID_PARAM; + } + + if (cntlr->cec->info.logAddrMask == 0) { + return HDF_ERR_NOT_SUPPORT; + } + + /* CDC Only devices should ignore non-CDC messages. */ + if (HdmiCecIsCdcOnlyDevice(cec) == true && + opcode != HDMI_CEC_OPCODE_CDC_MESSAGE) { + HDF_LOGD("this cec msg is not cdc msg."); + return HDF_ERR_NOT_SUPPORT; + } + if (HdmiCecCheckMsgLen(cec, msg, opcode) == false) { + return HDF_ERR_INVALID_PARAM; + } + + HdmiCecReceivedMsgHandle(cntlr, msg); + return HDF_SUCCESS; +} diff --git a/support/platform/src/hdmi/hdmi_common.c b/support/platform/src/hdmi/hdmi_common.c new file mode 100644 index 000000000..031d40beb --- /dev/null +++ b/support/platform/src/hdmi/hdmi_common.c @@ -0,0 +1,345 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_common.h" + +#define HDF_LOG_TAG hdmi_common_c + +/* + * vic, pixel clk, vfreq, hactive, vactive, hblank, vblank, hfront, hsync, hback, vfront, vsync, vback, aspect, + * timing, I/P + */ +struct HdmiVideoDefInfo g_ceaVideoDefInfoMap[HDMI_CEA_VIDEO_CODE_MAX] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + HDMI_PICTURE_ASPECT_NO_DATA, HDMI_VIDEO_TIMING_NONE, HDMI_VIDEO_FORMAT_NULL }, + { HDMI_VIC_640X480P60_4_3, 25175, 59940, 640, 480, 160, 45, 16, 96, 48, 10, 2, 33, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_640X480P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_720X480P60_4_3, 27000, 59940, 720, 480, 138, 45, 16, 62, 60, 9, 6, 30, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_720X480P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_720X480P60_16_9, 27000, 59940, 720, 480, 138, 45, 16, 62, 60, 9, 6, 30, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_720X480P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1280X720P60_16_9, 74250, 60000, 1280, 720, 370, 30, 110, 40, 220, 5, 5, 20, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1280X720P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080I60_16_9, 74250, 60000, 1920, 1080, 280, 22, 88, 44, 148, 2, 5, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080I60, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X480I60_4_3, 27000, 59940, 1440, 480, 276, 22, 38, 124, 114, 4, 3, 15, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_1440X480I60, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X480I60_16_9, 27000, 59940, 1440, 480, 276, 22, 38, 124, 114, 4, 3, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1440X480I60, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X240P60_4_3, 27000, 60054, 1440, 240, 276, 22, 38, 124, 114, 4, 3, 15, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_1440X240P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1440X240P60_16_9, 27000, 60054, 1440, 240, 276, 22, 38, 124, 114, 4, 3, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1440X240P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_2880X480I60_4_3, 54000, 59940, 2880, 480, 552, 22, 76, 248, 228, 4, 3, 15, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_2880X480I60, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_2880X480I60_16_9, 54000, 59940, 2880, 480, 552, 22, 76, 248, 228, 4, 3, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_2880X480I60, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_2880X240P60_4_3, 54000, 60054, 2880, 240, 552, 22, 76, 248, 228, 4, 3, 15, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_2880X240I60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_2880X240P60_16_9, 54000, 60054, 2880, 240, 552, 23, 76, 248, 228, 4, 3, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_2880X240I60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1440X480P60_4_3, 54000, 59940, 1440, 480, 276, 45, 32, 124, 120, 9, 6, 30, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_1440X480P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1440X480P60_16_9, 54000, 59940, 1440, 480, 276, 45, 32, 124, 120, 9, 6, 30, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1440X480P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080P60_16_9, 148500, 60000, 1920, 1080, 280, 45, 88, 44, 148, 4, 5, 36, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_720X576P50_4_3, 27000, 50000, 720, 576, 144, 49, 12, 64, 68, 5, 5, 39, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_720X576P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_720X576P50_16_9, 27000, 50000, 720, 576, 144, 49, 12, 64, 68, 5, 5, 39, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_720X576P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1280X720P50_16_9, 74250, 50000, 1280, 720, 700, 30, 440, 40, 220, 5, 5, 20, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1280X720P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080I50_16_9, 74250, 50000, 1920, 1080, 720, 24, 528, 44, 148, 2, 5, 15, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080I50, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X576I50_4_3, 27000, 50000, 1440, 576, 288, 24, 24, 126, 138, 2, 3, 19, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_1440X576I50, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X576I50_16_9, 27000, 50000, 1440, 576, 288, 24, 24, 126, 138, 2, 3, 19, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1440X576I50, HDMI_VIDEO_FORMA_INTERLACE }, + { HDMI_VIC_1440X576P50_4_3, 54000, 50000, 1440, 576, 288, 49, 24, 128, 136, 5, 5, 39, + HDMI_PICTURE_ASPECT_4_3, HDMI_VIDEO_TIMING_1440X576P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1440X576P50_16_9, 54000, 50000, 1440, 576, 288, 49, 24, 128, 136, 5, 5, 39, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1440X576P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080P50_16_9, 148500, 50000, 1920, 1080, 720, 45, 528, 44, 148, 4, 5, 36, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080P24_16_9, 742500, 24000, 1920, 1080, 830, 45, 638, 44, 148, 4, 5, 36, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080P24, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080P25_16_9, 742500, 25000, 1920, 1080, 720, 45, 528, 44, 148, 4, 5, 36, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080P25, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_1920X1080P30_16_9, 742500, 30000, 1920, 1080, 280, 45, 88, 44, 148, 4, 5, 36, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_1920X1080P30, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P24_16_9, 297000, 24000, 3840, 2160, 1660, 90, 1276, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P24, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P25_16_9, 297000, 25000, 3840, 2160, 1440, 90, 1056, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P25, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P30_16_9, 297000, 30000, 3840, 2160, 560, 90, 176, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P30, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P50_16_9, 594000, 50000, 3840, 2160, 1440, 90, 1056, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P60_16_9, 594000, 60000, 3840, 2160, 560, 90, 176, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P24_256_135, 297000, 24000, 4096, 2160, 1404, 90, 1020, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P24, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P25_256_135, 297000, 25000, 4096, 2160, 1184, 90, 968, 88, 128, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P25, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P30_256_135, 297000, 30000, 4096, 2160, 304, 90, 88, 88, 128, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P30, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P50_256_135, 594000, 50000, 4096, 2160, 1184, 90, 968, 88, 128, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P50, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P60_256_135, 594000, 60000, 4096, 2160, 304, 90, 88, 88, 128, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_3840X2160P120_16_9, 1188000, 120000, 3840, 2160, 560, 90, 176, 88, 296, 8, 10, 72, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P120, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_7680X4320P24_16_9, 1188000, 24000, 7680, 4320, 3320, 180, 2552, 176, 592, 16, 20, 144, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_7680X4320P24, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_7680X4320P25_16_9, 1188000, 25000, 7680, 4320, 3120, 80, 2352, 176, 592, 16, 20, 44, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_7680X4320P25, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_7680X4320P30_16_9, 1188000, 30000, 7680, 4320, 1320, 80, 552, 176, 592, 16, 20, 44, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_7680X4320P30, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_VIC_4096X2160P120_256_135, 1188000, 120000, 4096, 2160, 304, 90, 88, 88, 128, 8, 10, 72, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P120, HDMI_VIDEO_FORMAT_PROGRESSIVE } +}; + +struct HdmiVideoDefInfo g_vesaVideoDefInfoMap[HDMI_VESA_VIDEO_CODE_MAX] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, HDMI_PICTURE_ASPECT_NO_DATA, + HDMI_VIDEO_TIMING_NONE, HDMI_VIDEO_FORMAT_NULL }, + { 0, 40000, 60317, 800, 600, 256, 28, 40, 128, 88, 1, 4, 23, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_800X600_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 33750, 60000, 848, 480, 240, 37, 16, 112, 112, 6, 8, 23, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_848X480_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 65000, 60004, 1024, 768, 320, 38, 24, 136, 160, 3, 6, 29, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1024X768_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 74250, 60000, 1280, 720, 370, 30, 110, 40, 220, 5, 5, 20, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X720_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 68250, 59995, 1280, 768, 160, 22, 48, 32, 80, 3, 7, 12, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X768_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 79500, 59870, 1280, 768, 384, 30, 64, 128, 192, 3, 7, 20, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X768_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 71001, 59910, 1280, 800, 160, 23, 48, 32, 80, 3, 6, 14, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X800_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 83500, 59810, 1280, 800, 400, 31, 72, 128, 200, 3, 6, 22, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X800_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 108000, 60000, 1280, 960, 520, 40, 96, 112, 312, 1, 3, 36, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X960_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 108000, 60020, 1280, 1024, 408, 42, 48, 112, 248, 1, 3, 38, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1280X1024_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 85500, 60015, 1360, 768, 432, 27, 64, 112, 256, 3, 6, 18, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1360X768_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 85501, 59790, 1366, 768, 426, 30, 70, 143, 213, 3, 3, 24, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1366X768_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 121749, 59978, 1400, 1050, 464, 39, 88, 144, 232, 3, 4, 32, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1400X1050_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 88749, 59901, 1440, 900, 160, 26, 48, 32, 80, 3, 6, 17, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1440X900_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 106499, 59887, 1440, 900, 464, 34, 80, 152, 232, 3, 6, 25, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1440X900_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 108000, 60000, 1440, 1050, 144, 49, 12, 64, 68, 3, 6, 25, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1440X1050_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 108000, 60000, 1440, 1050, 144, 49, 12, 64, 68, 3, 6, 25, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1440X1050_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 108000, 60000, 1600, 900, 200, 100, 24, 80, 96, 1, 3, 96, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1600X900_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 162000, 60000, 1600, 1200, 560, 50, 64, 192, 304, 1, 3, 46, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1600X1200_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 118999, 59883, 1680, 1050, 160, 30, 48, 32, 80, 3, 6, 21, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1680X1050_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 146249, 59954, 1680, 1050, 560, 39, 104, 176, 280, 3, 6, 30, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1680X1050_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 204751, 60000, 1792, 1344, 656, 50, 128, 200, 328, 1, 3, 46, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1792X1344_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 218249, 59995, 1856, 1392, 672, 47, 96, 224, 352, 1, 3, 43, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1856X1392_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 148500, 60000, 1920, 1080, 280, 45, 88, 44, 148, 4, 5, 36, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1920X1080_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 154000, 59950, 1920, 1200, 160, 35, 48, 32, 80, 3, 6, 26, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1920X1200_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 193251, 59885, 1920, 1200, 672, 45, 136, 200, 336, 3, 6, 36, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1920X1200_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 234000, 60000, 1920, 1440, 680, 60, 128, 208, 344, 1, 3, 56, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_1920X1440_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 162000, 60000, 2048, 1152, 202, 48, 26, 80, 96, 1, 3, 44, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_2048X1152_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 82500, 50000, 2560, 1440, 520, 30, 260, 40, 220, 3, 3, 24, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_2560X1440_60_RB, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { 0, 348502, 59987, 2560, 1600, 944, 58, 192, 280, 472, 3, 6, 49, HDMI_PICTURE_ASPECT_16_9, + HDMI_VIDEO_TIMING_VESA_2560X1600_60, HDMI_VIDEO_FORMAT_PROGRESSIVE }, +}; + +struct HdmiVideo4kInfo g_video4kInfoMap[HDMI_VIDEO_4K_CODES_MAX] = { + { HDMI_4K_VIC_3840X2160_30, HDMI_VIC_3840X2160P30_16_9, 296703, 30, 3840, 2160, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P30, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_4K_VIC_3840X2160_25, HDMI_VIC_3840X2160P25_16_9, 297000, 25, 3840, 2160, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P25, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_4K_VIC_3840X2160_24, HDMI_VIC_3840X2160P24_16_9, 296703, 24, 3840, 2160, + HDMI_PICTURE_ASPECT_16_9, HDMI_VIDEO_TIMING_3840X2160P24, HDMI_VIDEO_FORMAT_PROGRESSIVE }, + { HDMI_4K_VIC_4096X2160_24, HDMI_VIC_4096X2160P24_256_135, 297000, 24, 4096, 2160, + HDMI_PICTURE_ASPECT_256_135, HDMI_VIDEO_TIMING_4096X2160P24, HDMI_VIDEO_FORMAT_PROGRESSIVE } +}; + +enum HdmiVideoBitDepth HdmiCommonDeepClolorConvertToColorDepth(enum HdmiDeepColor deepColor) +{ + enum HdmiVideoBitDepth colorDepth; + + switch (deepColor) { + case HDMI_DEEP_COLOR_24BITS : + colorDepth = HDMI_VIDEO_BIT_DEPTH_8; + break; + case HDMI_DEEP_COLOR_30BITS : + colorDepth = HDMI_VIDEO_BIT_DEPTH_10; + break; + case HDMI_DEEP_COLOR_36BITS : + colorDepth = HDMI_VIDEO_BIT_DEPTH_12; + break; + case HDMI_DEEP_COLOR_48BITS : + colorDepth = HDMI_VIDEO_BIT_DEPTH_16; + break; + default : + HDF_LOGD("deep color %d is not support, use default value.", deepColor); + colorDepth = HDMI_VIDEO_BIT_DEPTH_8; + break; + } + return colorDepth; +} + +enum HdmiDeepColor HdmiCommonColorDepthConvertToDeepClolor(enum HdmiVideoBitDepth colorDepth) +{ + enum HdmiDeepColor deepColor; + + switch (colorDepth) { + case HDMI_VIDEO_BIT_DEPTH_8 : + deepColor = HDMI_DEEP_COLOR_24BITS; + break; + case HDMI_VIDEO_BIT_DEPTH_10 : + deepColor = HDMI_DEEP_COLOR_30BITS; + break; + case HDMI_VIDEO_BIT_DEPTH_12 : + deepColor = HDMI_DEEP_COLOR_36BITS; + break; + case HDMI_VIDEO_BIT_DEPTH_16 : + deepColor = HDMI_DEEP_COLOR_48BITS; + break; + case HDMI_VIDEO_BIT_DEPTH_OFF : + deepColor = HDMI_DEEP_COLOR_OFF; + break; + default : + deepColor = HDMI_DEEP_COLOR_BUTT; + break; + } + return deepColor; +} + +enum HdmiVic HdmiCommonGetVic(enum HdmiVideoTiming timing, + enum HdmiPictureAspectRatio aspect, bool enable3d) +{ + uint32_t i, len; + enum HdmiVic vic = 0; + + len = sizeof(g_ceaVideoDefInfoMap) / sizeof(g_ceaVideoDefInfoMap[0]); + for (i = 0; i < len; i++) { + if (timing == g_ceaVideoDefInfoMap[i].timing && aspect == g_ceaVideoDefInfoMap[i].aspect) { + vic = g_ceaVideoDefInfoMap[i].vic; + break; + } + } + + if (enable3d == true) { + /* see hdmi spec 10.2. */ + if (vic == HDMI_VIC_3840X2160P24_16_9 || vic == HDMI_VIC_3840X2160P25_16_9 || + vic == HDMI_VIC_3840X2160P30_16_9 || vic == HDMI_VIC_4096X2160P24_256_135) { + HDF_LOGI("4k x 2k 2D vic:%d.", vic); + vic = HDMI_VIC_NONE; + } + } + return vic; +} + +static struct HdmiVideoDefInfo *HdmiCommonGetCommFormatInfo(enum HdmiVic vic) +{ + uint32_t i, len; + + len = sizeof(g_ceaVideoDefInfoMap) / sizeof(g_ceaVideoDefInfoMap[0]); + for (i = 0; i < len; i++) { + if (vic == g_ceaVideoDefInfoMap[i].vic) { + return &g_ceaVideoDefInfoMap[i]; + } + } + return NULL; +} + +static struct HdmiVideoDefInfo *HdmiCommonGetVesaFormatInfo(enum HdmiVideoTiming timing) +{ + uint32_t i, len; + + len = sizeof(g_vesaVideoDefInfoMap) / sizeof(g_vesaVideoDefInfoMap[0]); + for (i = 0; i < len; i++) { + if (timing == g_vesaVideoDefInfoMap[i].timing) { + return &g_vesaVideoDefInfoMap[i]; + } + } + return NULL; +} + +struct HdmiVideoDefInfo *HdmiCommonGetVideoDefInfo(enum HdmiVideoTiming timing, + enum HdmiPictureAspectRatio aspect, bool enable3d) +{ + enum HdmiVic vic; + struct HdmiVideoDefInfo *info = NULL; + + if (timing < HDMI_VIDEO_TIMING_VESA_DEFINE) { + vic = HdmiCommonGetVic(timing, aspect, enable3d); + info = HdmiCommonGetCommFormatInfo(vic); + } else if (timing < HDMI_VIDEO_TIMING_USER_DEFINE) { + info = HdmiCommonGetVesaFormatInfo(timing); + } + return info; +} + +enum HdmiVideoTiming HdmiCommonGetVideoTiming(enum HdmiVic vic, enum HdmiPictureAspectRatio aspect) +{ + uint32_t i, len; + enum HdmiVideoTiming timing = HDMI_VIDEO_TIMING_NONE; + + len = sizeof(g_ceaVideoDefInfoMap) / sizeof(g_ceaVideoDefInfoMap[0]); + for (i = 0; i < len; i++) { + if (vic == g_ceaVideoDefInfoMap[i].vic && aspect == g_ceaVideoDefInfoMap[i].aspect) { + timing = g_ceaVideoDefInfoMap[i].timing; + break; + } + } + return timing; +} + +struct HdmiVideo4kInfo *HdmiCommonGetVideo4kInfo(uint32_t _4kVic) +{ + uint32_t i, len; + + len = sizeof(g_video4kInfoMap) / sizeof(g_video4kInfoMap[0]); + for (i = 0; i < len; i++) { + if (_4kVic == g_video4kInfoMap[i]._4kVic) { + return &g_video4kInfoMap[i]; + } + } + HDF_LOGD("4k not support vic = %u", _4kVic); + return NULL; +} + +enum HdmiVideoTiming HdmiCommonGetVideo4kTiming(uint32_t _4kVic) +{ + uint32_t i, len; + enum HdmiVideoTiming timing = HDMI_VIDEO_TIMING_NONE; + + len = sizeof(g_video4kInfoMap) / sizeof(g_video4kInfoMap[0]); + for (i = 0; i < len; i++) { + if (_4kVic == g_video4kInfoMap[i]._4kVic) { + timing = g_video4kInfoMap[i].timing; + break; + } + } + return timing; +} diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c new file mode 100644 index 000000000..7f3396a8c --- /dev/null +++ b/support/platform/src/hdmi/hdmi_core.c @@ -0,0 +1,1415 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "device_resource_if.h" +#include "hdf_log.h" +#include "hdmi_core.h" +#include "hdmi_dispatch.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "securec.h" + +#define HDF_LOG_TAG hdmi_core_c + +int32_t HdmiCntlrAllocDev(struct HdmiCntlr *cntlr) +{ + struct HdmiDevice *dev = (struct HdmiDevice *)OsalMemCalloc(sizeof(struct HdmiDevice)); + + if (dev == NULL) { + HDF_LOGE("Hdmi alloc dev fail"); + return HDF_ERR_MALLOC_FAIL; + } + + dev->cntlr = cntlr; + cntlr->hdmi = dev; + return HDF_SUCCESS; +} + +void HdmiCntlrFreeDev(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->hdmi == NULL) { + return; + } + + OsalMemFree(cntlr->hdmi); + cntlr->hdmi = NULL; +} + +static void HdmiCecInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->cap.baseCap.bits.cec == 0) { + HDF_LOGD("not support cec"); + return; + } + + if (cntlr->cec == NULL) { + cntlr->cec = (struct HdmiCec *)OsalMemCalloc(sizeof(struct HdmiCec)); + if (cntlr->scdc == NULL) { + HDF_LOGE("cec malloc fail"); + return; + } + } + HDF_LOGE("HdmiCecInit, success."); + cntlr->cec->priv = (void *)cntlr; +} + +static void HdmiCecDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->cec != NULL) { + OsalMemFree(cntlr->cec); + cntlr->cec = NULL; + } +} + +static void HdmiDdcInit(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("ddc init: param is invalid"); + return; + } + cntlr->ddc.priv = (void *)cntlr; + if (cntlr->ddc.init == true) { + return; + } + ret = OsalMutexInit(&(cntlr->ddc.ddcMutex)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiDdcInit: mutex init fail!"); + return; + } + HDF_LOGE("HdmiDdcInit, success."); + cntlr->ddc.init = true; +} + +static void HdmiDdcDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + HDF_LOGE("ddc init: param is invalid"); + return; + } + + (void)OsalMutexDestroy(&(cntlr->ddc.ddcMutex)); + if (memset_s(&(cntlr->ddc), sizeof(struct HdmiDdc), 0, sizeof(struct HdmiDdc)) != EOK) { + HDF_LOGE("deinit ddc, memset_s fail."); + } + cntlr->ddc.priv = NULL; + cntlr->ddc.init = false; +} + +static void HdmiFrlInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->cap.baseCap.bits.frl == 0) { + HDF_LOGD("not support frl"); + return; + } + + if (cntlr->frl == NULL) { + cntlr->frl = (struct HdmiFrl *)OsalMemCalloc(sizeof(struct HdmiFrl)); + if (cntlr->frl == NULL) { + HDF_LOGE("frl malloc fail"); + return; + } + } + HDF_LOGE("HdmiFrlInit, success."); + cntlr->frl->priv = (void *)cntlr; +} + +static void HdmiFrlDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->frl != NULL) { + OsalMemFree(cntlr->frl); + cntlr->frl = NULL; + } +} + +static void HdmiHdcpInit(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return; + } + if (cntlr->cap.baseCap.bits.hdcp == 0) { + HDF_LOGD("not support hdcp"); + return; + } + + if (cntlr->hdcp == NULL) { + cntlr->hdcp = (struct HdmiHdcp *)OsalMemCalloc(sizeof(struct HdmiHdcp)); + if (cntlr->hdcp == NULL) { + HDF_LOGE("hdcp malloc fail"); + return; + } + ret = OsalMutexInit(&(cntlr->hdcp->hdcpMutex)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiHdcpInit: mutex init fail!"); + return; + } + } + HDF_LOGE("HdmiHdcpInit, success."); + cntlr->hdcp->priv = (void *)cntlr; +} + +static void HdmiHdcpDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->hdcp != NULL) { + HdmiHdcpClose(cntlr->hdcp); + OsalMemFree(cntlr->hdcp); + cntlr->hdcp = NULL; + } +} + +static void HdmiHdrInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->cap.baseCap.bits.hdr == 0) { + HDF_LOGD("not support hdr"); + return; + } + + if (cntlr->hdr == NULL) { + cntlr->hdr = (struct HdmiHdr *)OsalMemCalloc(sizeof(struct HdmiHdr)); + if (cntlr->hdr == NULL) { + HDF_LOGE("hdr malloc fail"); + return; + } + } + HDF_LOGE("HdmiHdrInit, success."); + cntlr->hdr->priv = (void *)cntlr; +} + +static void HdmiHdrDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->hdr != NULL) { + OsalMemFree(cntlr->hdr); + cntlr->hdr = NULL; + } +} + +static void HdmiInfoframeInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + HDF_LOGE("HdmiInfoframeInit, success."); + cntlr->infoframe.priv = (void *)cntlr; +} + +static void HdmiInfoframeDeInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + + if (memset_s(&(cntlr->infoframe), sizeof(struct HdmiInfoframe), 0, sizeof(struct HdmiInfoframe)) != EOK) { + HDF_LOGE("deinit infoframe, memset_s fail."); + } + cntlr->infoframe.priv = NULL; +} + +static void HdmiScdcInit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->cap.baseCap.bits.scdc == 0) { + HDF_LOGD("not support scdc"); + return; + } + + if (cntlr->scdc == NULL) { + cntlr->scdc = (struct HdmiScdc *)OsalMemCalloc(sizeof(struct HdmiScdc)); + if (cntlr->scdc == NULL) { + HDF_LOGE("scdc malloc fail"); + return; + } + } + HDF_LOGE("HdmiScdcInit, success."); + cntlr->scdc->priv = (void *)cntlr; +} + +static void HdmiScdcDeinit(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->scdc != NULL) { + OsalMemFree(cntlr->scdc); + cntlr->scdc = NULL; + } +} + +static int32_t HdmiCntlrInit(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->hdfDevObj == NULL) { + HDF_LOGE("HdmiCntlrInit: no HdfDeviceObject attached!"); + return HDF_ERR_INVALID_OBJECT; + } + + ret = OsalMutexInit(&cntlr->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrInit: mutex init fail!"); + return ret; + } + + cntlr->msgQueue = PlatformQueueCreate(HdmiEventMsgHandleDefault, "PlatformHdmiWorkerThread", cntlr); + if (cntlr->msgQueue == NULL) { + HDF_LOGE("HdmiCntlrInit: failed to create msg queue!"); + return HDF_PLT_ERR_OS_API; + } + ret = PlatformQueueStart(cntlr->msgQueue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrInit: failed to start msg queue!"); + PlatformQueueDestroy(cntlr->msgQueue); + return ret; + } + + cntlr->service.Dispatch = HdmiIoDispatch; + cntlr->hdfDevObj->service = &(cntlr->service); + cntlr->device.magic = cntlr->deviceIndex; + cntlr->device.hdfDev = cntlr->hdfDevObj; + HdmiInfoframeInit(cntlr); + HdmiDdcInit(cntlr); + return HDF_SUCCESS; +} + +static void HdmiCntlrUninit(struct HdmiCntlr *cntlr) +{ + if (cntlr != NULL) { + HdmiInfoframeDeInit(cntlr); + HdmiScdcDeinit(cntlr); + HdmiDdcDeinit(cntlr); + HdmiCecDeinit(cntlr); + HdmiFrlDeinit(cntlr); + HdmiHdcpDeinit(cntlr); + HdmiCntlrFreeDev(cntlr); + (void)OsalMutexDestroy(&cntlr->mutex); + } +} + +int32_t HdmiCntlrAdd(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + ret = HdmiCntlrInit(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + + cntlr->device.manager = PlatformManagerGet(PLATFORM_MODULE_HDMI); + ret = PlatformDeviceAdd(&cntlr->device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrAdd: device add fail!"); + HdmiCntlrUninit(cntlr); + return ret; + } + return HDF_SUCCESS; +} + +void HdmiCntlrRemove(struct HdmiCntlr *cntlr) +{ + if (cntlr != NULL) { + HdmiCntlrUninit(cntlr); + PlatformDeviceDel(&cntlr->device); + } +} + +static int32_t HdmiCntlrParseVideoCaps(struct HdmiCntlr *cntlr, struct DeviceResourceIface *drsOps, + const struct DeviceResourceNode *node) +{ + int32_t ret; + + ret = drsOps->GetUint32(node, "maxTmdsClock", &(cntlr->cap.maxTmdsClock), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read maxTmdsClock fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "defTmdsClock", &(cntlr->cap.defTmdsClock), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read defTmdsClock fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "maxFrlRate", &(cntlr->cap.maxFrlRate), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read maxFrlRate fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "videoTiming", &(cntlr->cap.videoTiming), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read videoTiming fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "quantization", &(cntlr->cap.quantization), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read quantization fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "colorSpace", &(cntlr->cap.colorSpace), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read colorSpace fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "colorimetry", &(cntlr->cap.colorimetry), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseVideoCaps: read colorimetry fail!"); + return ret; + } + return HDF_SUCCESS; +} + +static int32_t HdmiCntlrParseAudioCaps(struct HdmiCntlr *cntlr, struct DeviceResourceIface *drsOps, + const struct DeviceResourceNode *node) +{ + int32_t ret; + + ret = drsOps->GetUint32(node, "audioIfType", &(cntlr->cap.audioIfType), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read audioIfType fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: audioIfType = %d", cntlr->cap.audioIfType); + + ret = drsOps->GetUint32(node, "audioBitDepth", &(cntlr->cap.audioBitDepth), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read audioBitDepth fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: audioBitDepth = %d", cntlr->cap.audioBitDepth); + + ret = drsOps->GetUint32(node, "audioSampleRate", &(cntlr->cap.audioSampleRate), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read audioSampleRate fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: audioSampleRate = %d", cntlr->cap.audioSampleRate); + + ret = drsOps->GetUint32(node, "audioChannels", &(cntlr->cap.audioChannels), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read audioChannels fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: audioChannels = %d", cntlr->cap.audioChannels); + return HDF_SUCCESS; +} + +static int32_t HdmiCntlrParseHdrCaps(struct HdmiCntlr *cntlr, struct DeviceResourceIface *drsOps, + const struct DeviceResourceNode *node) +{ + int32_t ret; + + ret = drsOps->GetUint32(node, "hdrColorimetry", &(cntlr->cap.hdrColorimetry), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read hdrColorimetry fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: hdrColorimetry = %d", cntlr->cap.hdrColorimetry); + + ret = drsOps->GetUint32(node, "hdrUserMode", &(cntlr->cap.hdrUserMode), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParseAudioCaps: read hdrUserMode fail!"); + return ret; + } + HDF_LOGD("HdmiCntlrParseAudioCaps: hdrUserMode = %d", cntlr->cap.hdrUserMode); + return HDF_SUCCESS; +} + +int32_t HdmiCntlrParse(struct HdmiCntlr *cntlr, struct HdfDeviceObject *obj) +{ + const struct DeviceResourceNode *node = NULL; + struct DeviceResourceIface *drsOps = NULL; + int32_t ret; + + if (obj == NULL || cntlr == NULL) { + HDF_LOGE("HdmiCntlrParse: input param is NULL."); + return HDF_FAILURE; + } + + node = obj->property; + if (node == NULL) { + HDF_LOGE("HdmiCntlrParse: drs node is NULL."); + return HDF_FAILURE; + } + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("HdmiCntlrParse: invalid drs ops fail!"); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "index", &(cntlr->deviceIndex), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParse: read hostId fail!"); + return ret; + } + + ret = drsOps->GetUint32(node, "cap", &(cntlr->cap.baseCap.data), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParse: read baseCap fail!"); + return ret; + } + + ret = HdmiCntlrParseVideoCaps(cntlr, drsOps, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParse: read video caps fail!"); + return ret; + } + + ret = HdmiCntlrParseAudioCaps(cntlr, drsOps, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParse: read audio caps fail!"); + return ret; + } + + ret = HdmiCntlrParseHdrCaps(cntlr, drsOps, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiCntlrParse: read hdr caps fail!"); + return ret; + } + return HDF_SUCCESS; +} + +static struct HdmiSinkDeviceCapability *HdmiGetSinkCapability(struct HdmiDevice *hdmi) +{ + if (hdmi == NULL) { + return NULL; + } + + if (hdmi->edid.edidPhase == false) { + return NULL; + } + return &(hdmi->edid.sinkCap); +} + +int32_t HdmiCntlrGetSinkEdid(struct HdmiCntlr *cntlr, uint8_t *buffer, uint32_t len) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (HdmiHpdStatusDelayGet(cntlr) == false) { + HDF_LOGE("no hdmi sink device"); + HdmiCntlrFreeDev(cntlr); + return HDF_DEV_ERR_NO_DEVICE; + } + if (cntlr->hdmi != NULL) { + return HdmiEdidGetRaw(&(cntlr->hdmi->edid), buffer, len); + } + + ret = HdmiCntlrAllocDev(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + + ret = HdmiEdidRawDataRead(&(cntlr->hdmi->edid), &(cntlr->ddc)); + if (ret != HDF_SUCCESS) { + HdmiCntlrFreeDev(cntlr); + return ret; + } + + if (cntlr->hdmi->edid.edidPhase != true) { + (void)HdmiEdidPhase(&(cntlr->hdmi->edid)); + cntlr->hdmi->edid.edidPhase = true; + } + return HdmiEdidGetRaw(&(cntlr->hdmi->edid), buffer, len); +} + +static void HdmiCntlrModeSelect(struct HdmiCntlr *cntlr) +{ + enum HdmiTmdsModeType tmdsMode; + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + struct HdmiScdcScrambleCap scramble = {0}; + struct HdmiScdcScrambleCap curScramble = {0}; + int32_t ret; + + /* support FRL. */ + if (HdmiFrlSupport(cntlr->frl) == true && + cntlr->cap.baseCap.bits.frl > 0) { + return; + } + + if (cntlr->cap.baseCap.bits.scdc > 0) { + ret = HdmiScdcFillScrambleCap(cntlr->scdc, &scramble, &tmdsMode); + if (ret != HDF_SUCCESS) { + return; + } + } else { + tmdsMode = (commAttr->enableHdmi == true) ? HDMI_TMDS_MODE_HDMI_1_4 : HDMI_TMDS_MODE_DVI; + } + + cntlr->tmdsMode = tmdsMode; + HdmiCntlrTmdsModeSet(cntlr, tmdsMode); + HdmiCntlrReset(cntlr); + + if (cntlr->cap.baseCap.bits.scdc > 0 && + HdmiEdidScdcSupport(cntlr->hdmi) == true) { + ret = HdmiScdcScrambleGet(cntlr->scdc, &curScramble); + if (ret != HDF_SUCCESS) { + return; + } + if (scramble.sinkScramble != curScramble.sinkScramble || + scramble.sourceScramble != curScramble.sourceScramble || + scramble.tmdsBitClockRatio40 != curScramble.tmdsBitClockRatio40) { + (void)HdmiScdcScrambleSet(cntlr->scdc, &scramble); + } + } +} + +static void HdmiCommonAttrInit(struct HdmiCntlr *cntlr) +{ + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + + commAttr->enableHdmi = true; + commAttr->enableVideo = true; + commAttr->enableAudio = true; + commAttr->audio = true; + commAttr->avi = true; + commAttr->hdcpMode = HDMI_HDCP_MODE_1_4; + commAttr->colorSpace = (enum HdmiColorSpace)cntlr->cap.colorSpace; + commAttr->quantization = (enum HdmiQuantizationRange)cntlr->cap.quantization; +} + +static void HdmiVideoAttrInit(struct HdmiCntlr *cntlr) +{ + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + bool colorimetry601; + + videoAttr->colorSpace = (enum HdmiColorSpace)cntlr->cap.colorSpace; + videoAttr->colorimetry = (enum HdmiColorimetry)cntlr->cap.colorimetry; + videoAttr->timing = (enum HdmiVideoTiming)cntlr->cap.videoTiming; + colorimetry601 = ((videoAttr->timing == HDMI_VIDEO_TIMING_720X480P60) || + (videoAttr->timing == HDMI_VIDEO_TIMING_720X576P50) || + (videoAttr->timing == HDMI_VIDEO_TIMING_1440X240P60) || + (videoAttr->timing == HDMI_VIDEO_TIMING_1440X480I60) || + (videoAttr->timing == HDMI_VIDEO_TIMING_1440X576I50) || + (videoAttr->timing == HDMI_VIDEO_TIMING_1440X576P50) || + (videoAttr->timing == HDMI_VIDEO_TIMING_1440X576I60)); + + if (videoAttr->timing == HDMI_VIDEO_TIMING_640X480P60) { + videoAttr->colorimetry = HDMI_COLORIMETRY_ITU709; + videoAttr->aspect = HDMI_PICTURE_ASPECT_4_3; + } else if (colorimetry601 == true) { + videoAttr->colorimetry = HDMI_COLORIMETRY_ITU601; + videoAttr->aspect = HDMI_PICTURE_ASPECT_4_3; + } else if (videoAttr->timing <= HDMI_VIDEO_TIMING_4096X2160P120 && + videoAttr->timing >= HDMI_VIDEO_TIMING_4096X2160P24) { + videoAttr->colorimetry = HDMI_COLORIMETRY_ITU709; + videoAttr->aspect = HDMI_PICTURE_ASPECT_256_135; + } else { + videoAttr->colorimetry = HDMI_COLORIMETRY_ITU709; + videoAttr->aspect = HDMI_PICTURE_ASPECT_16_9; + } + + videoAttr->pixelRepeat = 1; + if (videoAttr->timing == HDMI_VIDEO_TIMING_1440X480I60 || + videoAttr->timing == HDMI_VIDEO_TIMING_1440X576I50) { + videoAttr->pixelRepeat = 2; + } + + if (videoAttr->timing <= HDMI_VIDEO_TIMING_640X480P60) { + videoAttr->quantization = HDMI_QUANTIZATION_RANGE_DEFAULT; + } else { + videoAttr->yccQuantization = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; + } + + if (videoAttr->timing != HDMI_VIDEO_TIMING_NONE && + videoAttr->timing != HDMI_VIDEO_TIMING_640X480P60) { + videoAttr->colorSpace = HDMI_COLOR_SPACE_YCBCR444; + } else { + videoAttr->colorSpace = HDMI_COLOR_SPACE_RGB; + } + + videoAttr->_3dStruct = HDMI_VS_VIDEO_3D_BUTT; + videoAttr->activeAspect = HDMI_ACTIVE_FORMAT_ASPECT_PICTURE; +} + +static void HdmiAudioAttrInit(struct HdmiCntlr *cntlr) +{ + struct HdmiAudioAttr *audioAttr = &(cntlr->attr.audioAttr); + + audioAttr->ifType = (enum HdmiAudioInterfaceType)cntlr->cap.audioIfType; + audioAttr->bitDepth = (enum HdmiAudioBitDepth)cntlr->cap.audioBitDepth; + audioAttr->sampleRate = (enum HdmiSampleRate)cntlr->cap.audioSampleRate; + audioAttr->channels = (enum HdmiAudioFormatChannel)cntlr->cap.audioChannels; +} + +static void HdmiHdrAttrInit(struct HdmiCntlr *cntlr) +{ + struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); + + hdrAttr->userMode = (enum HdmiHdrUserMode)cntlr->cap.hdrUserMode; + hdrAttr->colorimetry = (enum HdmiHdrColormetry)cntlr->cap.hdrColorimetry; +} + +static void HdmiAttrInit(struct HdmiCntlr *cntlr) +{ + HdmiCommonAttrInit(cntlr); + HdmiVideoAttrInit(cntlr); + HdmiAudioAttrInit(cntlr); + HdmiHdrAttrInit(cntlr); +} + +int32_t HdmiCntlrOpen(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + HdmiInfoframeInit(cntlr); + HdmiDdcInit(cntlr); + HdmiScdcInit(cntlr); + HdmiFrlInit(cntlr); + HdmiHdcpInit(cntlr); + HdmiCecInit(cntlr); + HdmiHdrInit(cntlr); + HdmiAttrInit(cntlr); + HdmiCntlrHardWareInit(cntlr); + /* HDCP on. */ + if ((cntlr->cap.baseCap.data & HDMI_CAP_HDCP_MARK) > 0) { + ret = HdmiHdcpOpen(cntlr->hdcp); + if (ret != HDF_SUCCESS) { + HdmiHdcpClose(cntlr->hdcp); + } + } + cntlr->state |= HDMI_CNTLR_STATE_OPEN; + return HDF_SUCCESS; +} + +int32_t HdmiCntlrStart(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + HdmiCntlrLowPowerSet(cntlr, false); + /* select mode */ + HdmiCntlrModeSelect(cntlr); + HdmiCntlrAvmuteSet(cntlr, false); + + if (cntlr->cap.baseCap.bits.hdr > 0 && + cntlr->cap.baseCap.bits.frl > 0) { + HdmiFrlEnable(cntlr->frl, true); + } else { + /* TMDS Transfer. */ + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, true); + HdmiCntlrUnlock(cntlr); + } + } + + HdmiCntlrAudioPathEnable(cntlr, true); + HdmiCntlrBlackDataSet(cntlr, false); + + cntlr->state |= HDMI_CNTLR_STATE_START; + return HDF_SUCCESS; +} + +int32_t HdmiCntlrStop(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + HdmiCntlrLock(cntlr); + if (cntlr->ops->audioPathEnable != NULL) { + cntlr->ops->audioPathEnable(cntlr, false); + } + if (cntlr->ops->avmuteSet != NULL) { + cntlr->ops->avmuteSet(cntlr, true); + } + if (cntlr->ops->blackDataSet != NULL) { + cntlr->ops->blackDataSet(cntlr, true); + } + HdmiFrlEnable(cntlr->frl, false); + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, false); + } + HdmiCntlrUnlock(cntlr); + + HdmiCntlrLowPowerSet(cntlr, true); + cntlr->state = HDMI_CNTLR_STATE_STOP; + return HDF_SUCCESS; +} + +static void HdmiTmdsClockUpdate(struct HdmiVideoAttr *videoAttr, struct HdmiCommonAttr *commAttr) +{ + /* + * Video at the default 24-bit color depth is carried at a TMDS clock rate equal to the pixel clock rate. + * YCBCB 4:2:0 video is carried at a TMDS clock rate equal to the 1/2 pixel clock rate. + */ + if (commAttr->colorSpace == HDMI_COLOR_SPACE_YCBCR420) { + videoAttr->tmdsClock = HDMI_MULTIPLE_0P5(videoAttr->pixelClock); + return; + } + + /* + * The TMDS clock rate is ibcreased by the ratio of the pixel size to 24-bits: + * 24-bit mode: TMDS clock is 1.0 X pixel clock; + * 30-bit mode: TMDS clock is 1.25 X pixel clock; + * 36-bit mode: TMDS clock is 1.5 X pixel clock; + * 48-bit mode: TMDS clock is 2.0 X pixel clock; + */ + videoAttr->tmdsClock = videoAttr->pixelClock; + if (commAttr->colorSpace != HDMI_COLOR_SPACE_YCBCR422) { + if (commAttr->deepColor == HDMI_DEEP_COLOR_30BITS) { + videoAttr->tmdsClock = HDMI_MULTIPLE_1P25(videoAttr->pixelClock); + } else if (commAttr->deepColor == HDMI_DEEP_COLOR_36BITS) { + videoAttr->tmdsClock = HDMI_MULTIPLE_1P5(videoAttr->pixelClock); + } else if (commAttr->deepColor == HDMI_DEEP_COLOR_48BITS) { + videoAttr->tmdsClock = HDMI_MULTIPLE_2P0(videoAttr->pixelClock); + } + } else { + if ((commAttr->deepColor != HDMI_DEEP_COLOR_OFF) && + (commAttr->deepColor != HDMI_DEEP_COLOR_24BITS)) { + HDF_LOGD("Y422 foce deepcolor 8bit"); + commAttr->deepColor = HDMI_DEEP_COLOR_24BITS; + } + if (videoAttr->timing == HDMI_VIDEO_TIMING_1440X480I60 || + videoAttr->timing == HDMI_VIDEO_TIMING_1440X576I50) { + HDF_LOGD("Y422 is not support at pal and ntsc, force adapt to rgb!"); + commAttr->colorSpace = HDMI_COLOR_SPACE_RGB; + } + } +} + +static bool HdmiYcbcr420FormatCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiVideoAttr *videoAttr) +{ + uint32_t i; + enum HdmiVic vic; + + vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, false); + if (vic == HDMI_VIC_NONE) { + HDF_LOGD("Y420 not have supported vic."); + return false; + } + + for (i = 0; i < sinkCap->y420Cap.SupportY420VicNum; i++) { + if (vic == sinkCap->y420Cap.SupportY420Format[i]) { + HDF_LOGD("Y420 supported vic is %d.", vic); + return true; + } + } + + for (i = 0; i < sinkCap->y420Cap.onlySupportY420VicNum; i++) { + if (vic == sinkCap->y420Cap.onlySupportY420Format[i]) { + HDF_LOGD("Y420 supported vic is %d.", vic); + return true; + } + } + + HDF_LOGD("Y420 have no supported vic."); + return false; +} + +static int32_t HdmiColorSpaceCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDeviceCapability *sinkCap, + uint32_t maxTmdsClk) +{ + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + union HdmiCap *cap = &(cntlr->cap.baseCap); + bool supportColorSpace = false; + + if (videoAttr->pixelClock > maxTmdsClk && + commAttr->colorSpace != HDMI_COLOR_SPACE_YCBCR420) { + return HDF_ERR_INVALID_PARAM; + } + + switch (commAttr->colorSpace) { + case HDMI_COLOR_SPACE_RGB : + supportColorSpace = true; + if ((sinkCap->colorSpace.rgb444 && cap->bits.rgb444) == false) { + HDF_LOGD("sink or source not support RGB!"); + } + break; + case HDMI_COLOR_SPACE_YCBCR422: + supportColorSpace = sinkCap->colorSpace.ycbcr422 && cap->bits.ycbcr422; + break; + case HDMI_COLOR_SPACE_YCBCR444: + supportColorSpace = sinkCap->colorSpace.ycbcr444 && cap->bits.ycbcr444; + break; + case HDMI_COLOR_SPACE_YCBCR420: + supportColorSpace = cap->bits.ycbcr420 && HdmiYcbcr420FormatCheck(sinkCap, videoAttr); + break; + default: + HDF_LOGE("unknow color_space = %u!\n", commAttr->colorSpace); + break; + } + + if (supportColorSpace != true) { + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} + +static void hdmiDeepColor10bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, + union HdmiCap *cap, uint32_t *tmdsClock, bool *supportDeepColor) +{ + uint32_t tmpTmdsClk = *tmdsClock; + + switch (commAttr->colorSpace) { + case HDMI_COLOR_SPACE_RGB: + tmpTmdsClk = HDMI_MULTIPLE_1P25(tmpTmdsClk); + *supportDeepColor = (sinkCap->vsdbInfo.deepColor.dc30bit && cap->bits.deepColor10bits) ? true : false; + break; + case HDMI_COLOR_SPACE_YCBCR444: + tmpTmdsClk = HDMI_MULTIPLE_1P25(tmpTmdsClk); + *supportDeepColor = (sinkCap->vsdbInfo.deepColor.dc30bit && cap->bits.deepColor10bits && + sinkCap->vsdbInfo.deepColor.dcY444) ? true : false; + break; + case HDMI_COLOR_SPACE_YCBCR420: + tmpTmdsClk = HDMI_MULTIPLE_1P25(tmpTmdsClk); + *supportDeepColor = (sinkCap->hfVsdbInfo.dc.dc30bit && cap->bits.deepColor10bits) ? true : false; + break; + default: + /* Y422, ignore deepclr */ + *supportDeepColor = true; + break; + } + *tmdsClock = tmpTmdsClk; +} + +static void hdmiDeepColor12bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, + union HdmiCap *cap, uint32_t *tmdsClock, bool *supportDeepColor) +{ + uint32_t tmpTmdsClk = *tmdsClock; + + switch (commAttr->colorSpace) { + case HDMI_COLOR_SPACE_RGB: + tmpTmdsClk = HDMI_MULTIPLE_1P5(tmpTmdsClk); + *supportDeepColor = (sinkCap->vsdbInfo.deepColor.dc36bit && cap->bits.deepColor12bits) ? true : false; + break; + case HDMI_COLOR_SPACE_YCBCR444: + tmpTmdsClk = HDMI_MULTIPLE_1P5(tmpTmdsClk); + *supportDeepColor = (sinkCap->vsdbInfo.deepColor.dc36bit && cap->bits.deepColor12bits && + sinkCap->vsdbInfo.deepColor.dcY444) ? true : false; + break; + case HDMI_COLOR_SPACE_YCBCR420: + tmpTmdsClk = HDMI_MULTIPLE_1P5(tmpTmdsClk); + *supportDeepColor = (sinkCap->hfVsdbInfo.dc.dc36bit && cap->bits.deepColor12bits) ? true : false; + break; + default: + /* Y422, ignore deepclr */ + *supportDeepColor = true; + break; + } + *tmdsClock = tmpTmdsClk; +} + +static int32_t hdmiDeepColorCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDeviceCapability *sinkCap, + uint32_t maxTmdsClk) +{ + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + union HdmiCap *cap = &(cntlr->cap.baseCap); + uint32_t tmdsClock = videoAttr->pixelClock; + bool supportDeepColor = false; + + if (commAttr->colorSpace == HDMI_COLOR_SPACE_YCBCR420) { + tmdsClock = HDMI_MULTIPLE_0P5(tmdsClock); + } + + switch (commAttr->deepColor) { + case HDMI_DEEP_COLOR_30BITS: + hdmiDeepColor10bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); + break; + case HDMI_DEEP_COLOR_36BITS: + hdmiDeepColor12bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); + break; + default: + commAttr->deepColor = HDMI_DEEP_COLOR_24BITS; + supportDeepColor = true; + break; + } + + if (supportDeepColor == false || tmdsClock > maxTmdsClk) { + return HDF_ERR_INVALID_PARAM; + } + videoAttr->tmdsClock = tmdsClock; + /* Y422 default 12bit output, deep_color force adapt to 8bit(24bit). */ + if (commAttr->colorSpace == HDMI_COLOR_SPACE_YCBCR422) { + if (videoAttr->timing == HDMI_VIDEO_TIMING_1440X480I60 || + videoAttr->timing == HDMI_VIDEO_TIMING_1440X576I50) { + HDF_LOGD("force change colorspace to RGB!"); + commAttr->colorSpace = HDMI_COLOR_SPACE_RGB; + } + if ((videoAttr->deepColor != HDMI_DEEP_COLOR_24BITS) && + (videoAttr->deepColor != HDMI_DEEP_COLOR_OFF)) { + videoAttr->deepColor = HDMI_DEEP_COLOR_OFF; + HDF_LOGD("when Y422, deep_color not support 10/12bit!"); + } + } + return HDF_SUCCESS; +} + +static int32_t HdmiColorBitSelect(struct HdmiCntlr *cntlr) +{ + struct HdmiSinkDeviceCapability *sinkCap = NULL; + uint32_t maxTmdsClk = 0; + + /* DVI mode, must set RGB and DEEP_COLOR_OFF */ + if (cntlr->attr.commAttr.enableHdmi == false) { + if (cntlr->attr.commAttr.colorSpace != HDMI_COLOR_SPACE_RGB) { + HDF_LOGE("DVI mode, the color space is not RGB!"); + return HDF_ERR_INVALID_PARAM; + } + cntlr->attr.commAttr.deepColor = HDMI_DEEP_COLOR_OFF; + cntlr->attr.videoAttr.tmdsClock = cntlr->attr.videoAttr.pixelClock; + return HDF_SUCCESS; + } + + /* FRL mode. */ + if (cntlr->cap.baseCap.bits.hdr > 0) { + HdmiTmdsClockUpdate(&(cntlr->attr.videoAttr), &(cntlr->attr.commAttr)); + if (cntlr->attr.videoAttr.tmdsClock > HDMI_HDMI20_MAX_TMDS_RATE) { + HDF_LOGD("HDMI2.1, tmds clock exceed max."); + return HDF_SUCCESS; + } + } + + sinkCap = HdmiGetSinkCapability(cntlr->hdmi); + if (sinkCap == NULL) { + HdmiTmdsClockUpdate(&(cntlr->attr.videoAttr), &(cntlr->attr.commAttr)); + return HDF_SUCCESS; + } + + if (sinkCap->maxTmdsClk == 0) { + /* use default clock. */ + maxTmdsClk = cntlr->cap.defTmdsClock; + } else { + maxTmdsClk = (sinkCap->maxTmdsClk < cntlr->cap.maxTmdsClock) ? + sinkCap->maxTmdsClk : cntlr->cap.maxTmdsClock; + } + /* MHz is converted to KHz */ + maxTmdsClk *= 1000; + + if (HdmiColorSpaceCheck(cntlr, sinkCap, maxTmdsClk) != HDF_SUCCESS) { + return HDF_ERR_INVALID_PARAM; + } + if (hdmiDeepColorCheck(cntlr, sinkCap, maxTmdsClk) != HDF_SUCCESS) { + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} + +static int32_t HdmiAudioAttrHandle(struct HdmiCntlr *cntlr) +{ + struct HdmiAudioConfigInfo audioCfg = {0}; + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + struct HdmiAudioAttr *audioAttr = &(cntlr->attr.audioAttr); + int32_t ret; + + audioCfg.downSample = audioAttr->downSample; + audioCfg.channels = audioAttr->channels; + audioCfg.bitDepth = audioAttr->bitDepth; + audioCfg.sampleRate = audioAttr->sampleRate; + audioCfg.ifType = audioAttr->ifType; + audioCfg.enable = (commAttr->enableAudio) && (commAttr->enableHdmi); + audioCfg.tmdsClock = videoAttr->tmdsClock; + audioCfg.pixelRepeat = videoAttr->pixelRepeat; + + HdmiCntlrAudioPathEnable(cntlr, false); + HdmiCntlrAudioPathSet(cntlr, &audioCfg); + ret = HdmiAudioInfoframeSend(&(cntlr->infoframe), ((commAttr->enableAudio) && (commAttr->audio))); + HdmiCntlrAudioPathEnable(cntlr, true); + return ret; +} + +static void HdmiHdrModeCheck(struct HdmiCommonAttr *commAttr, + struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *hdrAttr) +{ + switch (hdrAttr->userMode) { + case HDMI_HDR_USERMODE_DOLBY: + videoAttr->yccQuantization = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; + commAttr->colorSpace = HDMI_COLOR_SPACE_YCBCR444; + videoAttr->tmdsClock = videoAttr->pixelClock; + commAttr->deepColor = HDMI_DEEP_COLOR_24BITS; + videoAttr->quantization = HDMI_QUANTIZATION_RANGE_DEFAULT; + break; + case HDMI_HDR_USERMODE_HDR10: + if (hdrAttr->mode == HDMI_HDR_MODE_CEA_861_3) { + if (hdrAttr->colorimetry > HDMI_HDR_COLORIMETRY_EXTENDED) { + videoAttr->colorimetry = HDMI_COLORIMETRY_EXTENDED; + videoAttr->extColorimetry = (enum HdmiExtendedColorimetry)(hdrAttr->colorimetry - + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_601); + } else { + videoAttr->colorimetry = (enum HdmiColorimetry)(hdrAttr->colorimetry); + videoAttr->extColorimetry = HDMI_EXTENDED_COLORIMETRY_BUTT; + } + commAttr->xvyccMode = false; + } + break; + default: + break; + } +} + +static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, + struct HdmiHardwareStatus *hwStatus, struct HdmiCommonAttr *commAttr) +{ + bool rgb; + bool aspectIs256; + uint8_t vic; + enum HdmiVsVideoFormat format; + enum Hdmi4kVic vic4k; + + rgb = ((hwStatus->videoStatus.rgb2Ycbcr) || + ((!hwStatus->videoStatus.ycbcr2Rgb) && (hwStatus->videoStatus.outColorSpace == HDMI_COLOR_SPACE_RGB))); + videoAttr->colorSpace = (rgb == true) ? HDMI_COLOR_SPACE_RGB : HDMI_COLOR_SPACE_YCBCR444; + + if (hwStatus->infoframeStatus.aviEnable) { + vic = hwStatus->infoframeStatus.avi[7]; + /* + * when the timing is 4096*2160, the aspect ratio in AVI infoframe is 0 + * (but the real aspect ratio is 256:135<0x04>, the video_code is 0) + */ + aspectIs256 = (((vic == 0) && (hwStatus->infoframeStatus.vsif[8] == 0x04)) || + ((vic >= HDMI_VIC_4096X2160P25_256_135) && (vic <= HDMI_VIC_4096X2160P60_256_135))); + videoAttr->aspect = (aspectIs256 == true) ? HDMI_PICTURE_ASPECT_256_135 : + ((hwStatus->infoframeStatus.avi[5] >> 4) & 0x3); /* 4'b, BIT[2:1] */ + videoAttr->activeAspect = hwStatus->infoframeStatus.avi[5] & 0xf; + videoAttr->colorimetry = (hwStatus->infoframeStatus.avi[5] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->quantization = (hwStatus->infoframeStatus.avi[6] >> 2) & 0x3; /* 2'b, BIT[2:1] */ + videoAttr->extColorimetry = (hwStatus->infoframeStatus.avi[6] >> 4) & 0x07; /* 4'b, BIT[3:1] */ + videoAttr->yccQuantization = (hwStatus->infoframeStatus.avi[8] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->pixelRepeat = (hwStatus->infoframeStatus.avi[8] & 0xf) + 1; + videoAttr->timing = HdmiCommonGetVideoTiming(vic, videoAttr->aspect); + if ((!hwStatus->infoframeStatus.vsifEnable) && (!vic)) { + videoAttr->timing = HDMI_VIDEO_TIMING_NONE; + } + commAttr->quantization = (commAttr->colorSpace == HDMI_COLOR_SPACE_RGB) ? + videoAttr->quantization : (videoAttr->yccQuantization + 1); + } + + videoAttr->_3dStruct = HDMI_VS_VIDEO_3D_BUTT; + if (hwStatus->infoframeStatus.vsifEnable) { + format = (hwStatus->infoframeStatus.vsif[7] >> 5) & 0x3; /* 5'b, BIT[2:1] */ + if (format == HDMI_VS_VIDEO_FORMAT_4K) { + vic4k = hwStatus->infoframeStatus.vsif[8]; + videoAttr->timing = HdmiCommonGetVideo4kTiming(vic4k); + } else if (format == HDMI_VS_VIDEO_FORMAT_3D) { + videoAttr->_3dStruct = (hwStatus->infoframeStatus.vsif[8] >> 4) & 0xf; /* 4'b, BIT[4:1] */ + } + } +} + +static void HdmiFillCommonAttrFromHardwareStatus(struct HdmiCommonAttr *commAttr, + struct HdmiHardwareStatus *hwStatus, struct HdmiAttr *attr) +{ + bool dolby; + + switch (hwStatus->commonStatus.tmdsMode) { + case HDMI_TMDS_MODE_HDMI_1_4 : + case HDMI_TMDS_MODE_HDMI_2_0 : + commAttr->enableHdmi = true; + commAttr->enableVideo = true; + break; + case HDMI_TMDS_MODE_DVI : + commAttr->enableHdmi = false; + commAttr->enableVideo = true; + break; + default: + commAttr->enableHdmi = false; + commAttr->enableVideo = false; + break; + } + + commAttr->enableAudio = (hwStatus->audioStatus.enable && hwStatus->infoframeStatus.audioEnable); + commAttr->avi = hwStatus->infoframeStatus.aviEnable; + commAttr->audio = hwStatus->infoframeStatus.audioEnable; + commAttr->xvyccMode = hwStatus->infoframeStatus.gdbEnable; + commAttr->deepColor = HdmiCommonColorDepthConvertToDeepClolor(hwStatus->videoStatus.outBitDepth); + + /* color space is ycbcr444 when the hdr mode is dolby. */ + dolby = ((attr->hdrAttr.userMode == HDMI_HDR_USERMODE_DOLBY) && + (!hwStatus->videoStatus.rgb2Ycbcr) && + (!hwStatus->videoStatus.ycbcr2Rgb) && + (!hwStatus->videoStatus.ycbcr444422) && + (!hwStatus->videoStatus.ycbcr422420) && + (!hwStatus->videoStatus.ycbcr422444) && + (!hwStatus->videoStatus.ycbcr420422)); + commAttr->colorSpace = (dolby == true) ? HDMI_COLOR_SPACE_YCBCR444 : hwStatus->videoStatus.outColorSpace; +} + +static bool HdmiCommonAttrChanged(struct HdmiCommonAttr *curCommAttr, struct HdmiCommonAttr *commAttr) +{ + bool change; + + change = (commAttr->enableHdmi != curCommAttr->enableHdmi) || + (commAttr->colorSpace != curCommAttr->colorSpace) || + (commAttr->xvyccMode != curCommAttr->xvyccMode) || + (commAttr->avi != curCommAttr->avi) || + (commAttr->quantization != curCommAttr->quantization); + + if (change == true) { + return true; + } + + if (((commAttr->deepColor == HDMI_DEEP_COLOR_OFF) || + (commAttr->deepColor == HDMI_DEEP_COLOR_24BITS)) && + ((curCommAttr->deepColor == HDMI_DEEP_COLOR_OFF) || + (curCommAttr->deepColor == HDMI_DEEP_COLOR_24BITS))) { + HDF_LOGI("deep color not change: %u", curCommAttr->deepColor); + } else if (commAttr->deepColor != curCommAttr->deepColor) { + return true; + } + return false; +} + +static bool HdmiVideoAttrChanged(struct HdmiVideoAttr *curVideoAttr, struct HdmiVideoAttr *videoAttr) +{ + bool change; + + change = (videoAttr->timing != curVideoAttr->timing) || + (videoAttr->colorSpace != curVideoAttr->colorSpace) || + (videoAttr->_3dStruct != curVideoAttr->_3dStruct) || + (videoAttr->pixelRepeat != curVideoAttr->pixelRepeat) || + (videoAttr->colorimetry != curVideoAttr->colorimetry) || + (videoAttr->extColorimetry != curVideoAttr->extColorimetry) || + (videoAttr->quantization != curVideoAttr->quantization) || + (videoAttr->yccQuantization != curVideoAttr->yccQuantization) || + (videoAttr->aspect != curVideoAttr->aspect); + return change; +} + +static int32_t HdmiVedioAttrHandle(struct HdmiCntlr *cntlr, struct HdmiHardwareStatus *hwStatus) +{ + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + struct HdmiCommonAttr curCommAttr = {0}; + struct HdmiVideoAttr curVideoAttr = {0}; + int32_t ret; + + /* support HDR. */ + if (cntlr->cap.baseCap.bits.hdr > 0) { + HdmiHdrModeCheck(commAttr, videoAttr, &(cntlr->attr.hdrAttr)); + } + + /* support FRL. */ + if (cntlr->cap.baseCap.bits.frl > 0) { + ret = HdmiFrlModeSelect(cntlr->frl); + if (ret != HDF_SUCCESS) { + return ret; + } + } + + HdmiFillCommonAttrFromHardwareStatus(&curCommAttr, hwStatus, &(cntlr->attr)); + HdmiFillVideoAttrFromHardwareStatus(&curVideoAttr, hwStatus, &curCommAttr); + if (HdmiCommonAttrChanged(&curCommAttr, commAttr) == false && + HdmiVideoAttrChanged(&curVideoAttr, videoAttr) == false && + HdmiFrlModeChanged(cntlr->frl) == false) { + HDF_LOGI("video and common attr is not changed."); + return HDF_SUCCESS; + } + + if (commAttr->enableVideo == true) { + HdmiCntlrVideoPathSet(cntlr, videoAttr); + } + + (void)HdmiAviInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->avi)); + (void)HdmiVsInfoframeSend(&(cntlr->infoframe), commAttr->enableHdmi, commAttr->vsifDolby); + /* the drm infoframe is stop because software was reset in videopath, so re-enable it if the mode is HDR10. */ + if (cntlr->cap.baseCap.bits.hdr > 0) { + if (cntlr->attr.hdrAttr.mode == HDMI_HDR_MODE_CEA_861_3) { + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), false); + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), true); + } + } + return HDF_SUCCESS; +} + +static void HdmiAttrUpdate(struct HdmiCntlr *cntlr) +{ + struct HdmiHardwareStatus hwStatus = {0}; + + if (HdmiColorBitSelect(cntlr) != HDF_SUCCESS) { + HDF_LOGD("attr update: color bit select fail."); + return; + } + + if (cntlr->ops->hardWareStatusGet == NULL) { + return; + } + + HdmiCntlrLock(cntlr); + cntlr->ops->hardWareStatusGet(cntlr, &hwStatus); + HdmiCntlrUnlock(cntlr); + + if (HdmiAudioAttrHandle(cntlr) != HDF_SUCCESS) { + HDF_LOGD("audio attr check fail"); + return; + } + if (HdmiVedioAttrHandle(cntlr, &hwStatus) != HDF_SUCCESS) { + HDF_LOGD("vedio attr check fail"); + } +} + +int32_t HdmiCntlrDeepColorSet(struct HdmiCntlr *cntlr, enum HdmiDeepColor color) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->attr.commAttr.colorSpace == HDMI_COLOR_SPACE_YCBCR422) { + if (color != HDMI_DEEP_COLOR_24BITS && color != HDMI_DEEP_COLOR_OFF) { + HDF_LOGE("not support deepcolor %u when colorspace is ycbcr422.", color); + return HDF_ERR_INVALID_PARAM; + } + } + + /* if the current hdmi mode is dolby, deep color set is invalid. */ + if (cntlr->attr.hdrAttr.mode == HDMI_HDR_MODE_DOLBY_NORMAL || + cntlr->attr.hdrAttr.mode == HDMI_HDR_MODE_DOLBY_TUNNELING) { + HDF_LOGD("don't change deepcolor when dolby mode is %u.", cntlr->attr.hdrAttr.mode); + return HDF_ERR_NOT_SUPPORT; + } + + cntlr->attr.commAttr.deepColor = color; + HdmiCntlrAvmuteSet(cntlr, true); + HdmiAttrUpdate(cntlr); + HdmiCntlrAvmuteSet(cntlr, false); + return HDF_SUCCESS; +} + +int32_t HdmiCntlrDeepColorGet(struct HdmiCntlr *cntlr, enum HdmiDeepColor *color) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (color == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + *color = cntlr->attr.commAttr.deepColor; + return HDF_SUCCESS; +} + +int32_t HdmiCntlrSetVideoAttribute(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr) +{ + struct HdmiHardwareStatus hwStatus = {0}; + + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (attr == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr->attr.videoAttr = *attr; + + if (cntlr->ops->hardWareStatusGet == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + HdmiCntlrLock(cntlr); + cntlr->ops->hardWareStatusGet(cntlr, &hwStatus); + HdmiCntlrUnlock(cntlr); + return HdmiVedioAttrHandle(cntlr, &hwStatus); +} + +int32_t HdmiCntlrSetAudioAttribute(struct HdmiCntlr *cntlr, struct HdmiAudioAttr *attr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (attr == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr->attr.audioAttr = *attr; + return HdmiAudioAttrHandle(cntlr); +} + +int32_t HdmiCntlrSetHdrAttribute(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *attr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (attr == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + return HdmiHdrAttrHandle(cntlr->hdr, attr); +} + +int32_t HdmiCntlrInfoframeGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame) +{ + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return HdmiInfoframeGetInfo(&(cntlr->infoframe), type, frame); +} + +int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (frame == NULL) { + return HDF_ERR_INVALID_PARAM; + } + return HdmiInfoframeSetInfo(&(cntlr->infoframe), type, frame); +} + +void HdmiCntlrClose(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + return; + } + + if ((cntlr->state & HDMI_CNTLR_STATE_START) > 0) { + HdmiCntlrStop(cntlr); + } + + HdmiInfoframeDeInit(cntlr); + HdmiDdcDeinit(cntlr); + HdmiScdcDeinit(cntlr); + HdmiFrlDeinit(cntlr); + HdmiHdcpDeinit(cntlr); + HdmiCecDeinit(cntlr); + HdmiHdrDeinit(cntlr); + cntlr->state = HDMI_CNTLR_STATE_CLOSE; +} diff --git a/support/platform/src/hdmi/hdmi_ddc.c b/support/platform/src/hdmi/hdmi_ddc.c new file mode 100644 index 000000000..8fd4b2392 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_ddc.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdmi_core.h" + +#define HDF_LOG_TAG hdmi_ddc_c + +int32_t HdmiCntlrDdcTransfer(struct HdmiCntlr *cntlr, struct HdmiDdcCfg *ddcCfg) +{ + int32_t ret; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->ddcTransfer == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (ddcCfg == NULL) { + return HDF_ERR_INVALID_PARAM; + } + HdmiCntlrLock(cntlr); + ret = cntlr->ops->ddcTransfer(cntlr, ddcCfg); + HdmiCntlrUnlock(cntlr); + return ret; +} + +int32_t HdmiDdcTransfer(struct HdmiDdc *ddc, struct HdmiDdcCfg *cfg) +{ + int32_t ret; + + if (ddc == NULL || cfg == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (cfg->mode >= HDMI_DDC_MODE_BUTT) { + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalMutexLock(&(ddc->ddcMutex)); + ret = HdmiCntlrDdcTransfer(ddc->priv, cfg); + (void)OsalMutexUnlock(&(ddc->ddcMutex)); + return ret; +} diff --git a/support/platform/src/hdmi/hdmi_dfm.c b/support/platform/src/hdmi/hdmi_dfm.c new file mode 100644 index 000000000..eddff1b70 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_dfm.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_common.h" +#include "hdmi_dfm.h" + +#define HDF_LOG_TAG hdmi_dfm_c + +#define HDMI_DFM_THOUSAND 1000 +#define HDMI_DFM_INVALID_VAL (-1) + +uint32_t HdmiDfmGetPixelFormat(enum HdmiColorSpace colorSpace) +{ + uint32_t pixelFormat; + + switch (colorSpace) { + case HDMI_COLOR_SPACE_RGB : + pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_0; + break; + case HDMI_COLOR_SPACE_YCBCR420 : + pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_1; + break; + case HDMI_COLOR_SPACE_YCBCR422 : + pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_2; + break; + case HDMI_COLOR_SPACE_YCBCR444 : + pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_3; + break; + default : + pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_0; + break; + } + return pixelFormat; +} + +void HdmiDfmFillParam(struct HdmiDfmParam *param, struct HdmiVideoDefInfo *videoInfo, + struct HdmiAudioAttr *audioAttr, enum HdmiColorSpace colorSpace, enum HdmiDeepColor deepColor) +{ + if (param == NULL || videoInfo == NULL || audioAttr == NULL) { + return; + } + param->hactive = videoInfo->hactive; + param->vactive = videoInfo->vactive; + param->hblank = videoInfo->hblank; + param->vblank = videoInfo->vblank; + param->hsync = videoInfo->hsync; + param->hback = videoInfo->hback; + param->hfront = videoInfo->hfront; + param->vsync = videoInfo->vsync; + param->vback = videoInfo->vback; + param->vfront = videoInfo->vfront; + param->vfreq = videoInfo->rate; + param->colorDepth = HdmiCommonDeepClolorConvertToColorDepth(deepColor); + param->pixelFormat = HdmiDfmGetPixelFormat(colorSpace); + param->audioRate = (uint32_t)audioAttr->sampleRate; + param->layout = (audioAttr->channels > HDMI_AUDIO_FORMAT_CHANNEL_2) ? true : false; + /* ACAT packet_type */ + param->acat = HDMI_AUDIO_CHANNEL_ALLOC_TYPE3; + param->packetType = HDMI_AUDIO_SAMPLE_PACKET; +} + +static void HdmiDfmBaseInfoInit(struct HdmiDfmInfo *info, struct HdmiDfmParam *param) +{ + info->htotal = param->hactive + param->hblank; + info->vtotal = param->vactive + param->vblank; + info->pixelClk = (uint64_t)(info->htotal) * info->vtotal * param->vfreq / HDMI_DFM_THOUSAND; + + /* 1. Determine the maximum legal pixel rate. */ + info->maxPixelClk = info->pixelClk * (HDMI_DFM_THOUSAND + HDMI_DFM_FRL_PIXELCLK_TOLERANCE) / HDMI_DFM_THOUSAND; + info->minPixelClk = info->pixelClk * (HDMI_DFM_THOUSAND - HDMI_DFM_FRL_PIXELCLK_TOLERANCE) / HDMI_DFM_THOUSAND; + if (info->maxPixelClk == 0 || info->minPixelClk == 0) { + HDF_LOGE("max or min pixel clock is 0!"); + return; + } + + /* 2. Determine the minimum Video Line period. */ + info->lineMinTime = (uint64_t)info->htotal * 1000000000000 / info->maxPixelClk; + info->lineMaxTime = (uint64_t)info->htotal * 1000000000000 / info->minPixelClk; + + /* 3. Determine the Worst Case Slow Bit Rate. x10000 */ + info->minBitRate = (uint64_t)param->bitRate * 1000000000 * (10000 - HDMI_DFM_FRL_BITRATE_TOLERANCE) / 10000; + info->maxBitRate = (uint64_t)param->bitRate * 1000000000 * (10000 + HDMI_DFM_FRL_BITRATE_TOLERANCE) / 10000; + + /* 4. Determine the FRL Character Rate */ + info->minFrlCharRate = info->minBitRate / 18; + info->maxFrlCharRate = info->maxBitRate / 18; + + /* 5. Determine the Total FRL Characters per line Period. */ + info->minFrlCharsPerLine = (uint32_t)(info->lineMinTime * info->minFrlCharRate * param->laneNum / 1000000000000); + info->maxFrlCharsPerLine = (uint32_t)(info->lineMaxTime * info->maxFrlCharRate * param->laneNum / 1000000000000); + + info->cFrlSb = HDMI_DFM_FRL_SB_LEN(param->laneNum); + info->overheadSb = param->laneNum * 100000 / info->cFrlSb; + info->overheadRs = HDMI_DFM_RS_NUM_PER_CB * HDMI_DFM_FRL_CB_NUM_PER_SB * 100000 / info->cFrlSb; + info->overheadMap = 25 * 10000 / info->cFrlSb; /* FRL map chars per blk. */ + info->overheadMin = info->overheadSb + info->overheadRs + info->overheadMap; + info->overheadMax = info->overheadMin + HDMI_DFM_OVERHEAD_SIZE; +} + +static uint32_t HdmiDfmGetAudioPackets(struct HdmiDfmParam *param) +{ + uint32_t ap = 0; + + switch (param->packetType) { + case HDMI_AUDIO_SAMPLE_PACKET : + case HDMI_ONE_BIT_AUDIO_SAMPLE_PACKET : + ap = HDMI_AUDIO_AP_SIZE_100; + if (param->layout == false) { + ap = HDMI_AUDIO_AP_SIZE_25; + } + break; + case HDMI_DTS_AUDIO_PACKET : + case HDMI_HBR_AUDIO_PACKET : + case HDMI_MULTI_STREAM_AUDIO_SAMPLE_PACKET : + case HDMI_ONE_BIT_MULTI_STREAM_AUDIO_SAMPLE_PACKET : + ap = HDMI_AUDIO_AP_SIZE_100; + break; + case HDMI_AUDIO_3D_SAMPLE_PACKET : + case HDMI_ONE_BIT_AUDIO_3D_SAMPLE_PACKET : + if (param->acat == HDMI_AUDIO_CHANNEL_ALLOC_TYPE1) { + ap = HDMI_AUDIO_AP_SIZE_200; + } else if (param->acat == HDMI_AUDIO_CHANNEL_ALLOC_TYPE2) { + ap = HDMI_AUDIO_AP_SIZE_300; + } else if (param->acat == HDMI_AUDIO_CHANNEL_ALLOC_TYPE3) { + ap = HDMI_AUDIO_AP_SIZE_400; + } + break; + default : + HDF_LOGE("audio packet type 0x%x, is not support.", param->packetType); + break; + } + + return ap; +} + +static void HdmiDfmCaculateAudioInfo(struct HdmiDfmInfo *info, struct HdmiDfmParam *param) +{ + /* 1. Determine the number of audio packets required to carry each sample. */ + info->audioAp = HdmiDfmGetAudioPackets(param); + + /* 2. Determine Average Audio Related Packet Rate. */ + info->audioRap = (uint32_t)((uint64_t)param->audioRate * (1000 + HDMI_DFM_FRL_AUDIOCLK_TOLERANCE) * + info->audioAp / 100000); + + /* 3. Determine Average Required Packets per line. */ + info->avgAudioPacketsPerLine = (uint32_t)((uint64_t)info->audioRap * info->lineMinTime / 1000000000); + + /* 4. Determine the Packets per Hblank that must be supportable. */ + info->audioPacketsLine = (info->avgAudioPacketsPerLine + HDMI_DFM_THOUSAND - 1) / HDMI_DFM_THOUSAND; + + /* + * 5. Determine The c_frl_blank_min(64(guard bands, two 12-character control periods, c_frl_active_extra) + * and 32 audio_packets). + */ + info->hblankAudioMin = 64 + 32 * info->audioPacketsLine; +} + +static void HdmiDfmCaculateVideoBorrowInfo(struct HdmiDfmInfo *info) +{ + if (info->activeTimeRef >= info->activeTimeMin && info->blankTimeRef >= info->blankTimeMin) { + info->tBorrow = 0; + } else if (info->activeTimeRef < info->activeTimeMin && info->blankTimeRef >= info->blankTimeMin) { + info->tBorrow = info->activeTimeMin - info->activeTimeRef; + } else { + info->tBorrow = HDMI_DFM_INVALID_VAL; + } + if (info->tBorrow == HDMI_DFM_INVALID_VAL) { + info->tbBorrow = HDMI_DFM_INVALID_VAL; + } else { + info->tbBorrow = ((int32_t)(info->tBorrow * info->avgTbRate / 100000000000) + 10 - 1) / 10; + } +} + +static void HdmiDfmCaculateVideoInfo(struct HdmiDfmInfo *info, struct HdmiDfmParam *param) +{ + uint32_t kcd, k420; + + /* + * 1. if 4:2:2 pixels, kcd is 1. Otherwise, kcd is CD / 8. + * if 4:2:0 pixels, k420 is 2. Otherwise, k420 is 1. + */ + kcd = (param->pixelFormat == 2) ? HDMI_DFM_MAGNIFICATION_8 : param->colorDepth; + k420 = (param->pixelFormat == 1) ? 2 : 1; + + /* 2. Determine Bits per Pixel */ + info->bpp = ((24 * kcd) / k420) / HDMI_DFM_MAGNIFICATION_8; + + /* 3. Determine Video Bytes per line. */ + info->activeBytesPerLine = info->bpp * param->hactive / HDMI_DFM_MAGNIFICATION_8; + + /* + * 4. Determine Required Characters to carry Active Video per line. + * 3 is means active_bytes_per_line need 3 characters. + */ + info->activeTbPerLine = (info->activeBytesPerLine + 3 - 1) / 3; + + /* 5. Determine Required Characters to carry H-Blank Video per line. */ + info->hblankTbPerLine = (param->hblank * kcd / k420 + HDMI_DFM_MAGNIFICATION_8 - 1) / HDMI_DFM_MAGNIFICATION_8; + + /* 6. 32 is FRL characters each packet, 7 is guard bands island(4 FRL char) + video(3 FRL char) */ + if (((param->hblank * kcd) / k420) / HDMI_DFM_MAGNIFICATION_8 > 32 * (1 + info->audioPacketsLine) + 7) { + info->cFrlFree = ((param->hblank * kcd) / k420) / HDMI_DFM_MAGNIFICATION_8 - + 32 * (1 + info->audioPacketsLine) - 7; + } + + /* 7. add 1 character each for RC break caused by 4 */ + info->cFrlRcMargin = 4; + /* 8. RC compression transmit control characters reduce 7/8th total characters. */ + if (7 * info->cFrlFree / HDMI_DFM_MAGNIFICATION_8 > info->cFrlRcMargin) { + info->cFrlRcSavings = 7 * info->cFrlFree / HDMI_DFM_MAGNIFICATION_8 - info->cFrlRcMargin; + } + + if (info->htotal == 0) { + HDF_LOGE("htotal is 0!"); + return; + } + info->avgTbRate = info->maxPixelClk * (info->activeTbPerLine + info->hblankTbPerLine) / info->htotal; + info->activeTimeRef = (uint64_t)info->lineMinTime * param->hactive / info->htotal; + info->blankTimeRef = (uint64_t)info->lineMinTime * param->hblank / info->htotal; + + /* 9. (3 / 2) is active_tb coefficient in protocol */ + info->activeTimeMin = (uint64_t)info->activeTbPerLine * 3 * 100000000000000 / + (2 * param->laneNum * info->minFrlCharRate * (HDMI_DFM_RATE_MAGNIFICATION - info->overheadMax) / + HDMI_DFM_THOUSAND); + info->blankTimeMin = (uint64_t)info->hblankTbPerLine * 100000000000000 / + (param->laneNum * info->minFrlCharRate * (HDMI_DFM_RATE_MAGNIFICATION - info->overheadMax) / + HDMI_DFM_THOUSAND); + + /* 10. Determine Borrow Info */ + HdmiDfmCaculateVideoBorrowInfo(info); + + /* 11. (3 / 2) is active_tb coefficient in protocol */ + info->cFrlActualPayload = + (3 * info->activeTbPerLine + 2 - 1) / 2 + info->hblankTbPerLine - info->cFrlRcSavings; + + if (info->minFrlCharsPerLine == 0) { + HDF_LOGE("min FRL Characters per line is 0!"); + return; + } + info->utilization = (uint64_t)info->cFrlActualPayload * 100000 / (uint64_t)info->minFrlCharsPerLine; + info->margin = 100000 - (info->utilization + info->overheadMax); +} + +static void HdmiDfmFillInfo(struct HdmiDfmInfo *info, struct HdmiDfmParam *param) +{ + HdmiDfmBaseInfoInit(info, param); + HdmiDfmCaculateAudioInfo(info, param); + HdmiDfmCaculateVideoInfo(info, param); + + /* Check Audio Cap. */ + info->audioSupport = (info->hblankTbPerLine >= info->hblankAudioMin) ? true : false; + /* Check Video Cap. */ + if (info->tbBorrow == HDMI_DFM_INVALID_VAL) { + info->videoSupport = false; + } else { + info->videoSupport = (info->tbBorrow <= HDMI_DFM_FRL_MAX_TB_BORROW) ? true : false; + } + + info->uncompressSupport = (info->margin >= 0) ? true : false; + info->canbeTrans = (info->audioSupport && info->videoSupport && info->uncompressSupport) ? true : false; + info->isExtraMode = (info->canbeTrans && (info->tbBorrow > 0)) ? true : false; +} + +bool HdmiDfmFormatSupport(struct HdmiDfmParam *param) +{ + struct HdmiDfmInfo info = {0}; + + HdmiDfmFillInfo(&info, param); + if (info.audioSupport == true && info.videoSupport == true && info.uncompressSupport == true) { + return true; + } + return false; +} diff --git a/support/platform/src/hdmi/hdmi_dispatch.c b/support/platform/src/hdmi/hdmi_dispatch.c new file mode 100644 index 000000000..c1a3f130d --- /dev/null +++ b/support/platform/src/hdmi/hdmi_dispatch.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_dispatch.h" +#include "hdmi_core.h" +#include "hdmi_if.h" + +#define HDF_LOG_TAG hdmi_dispatch_c + +enum HdmiIoCmd { + HDMI_CMD_OPEN, + HDMI_CMD_CLOSE, + HDMI_CMD_START, + HDMI_CMD_STOP, + HDMI_CMD_AVMUTE_SET, + HDMI_CMD_DEEP_COLOR_SET, + HDMI_CMD_DEEP_COLOR_GET, + HDMI_CMD_VIDEO_ATTR_SET, + HDMI_CMD_AUDIO_ATTR_SET, + HDMI_CMD_HDR_ATTR_SET, + HDMI_CMD_READ_SINK_EDID, + HDMI_CMD_INFOFRAME_SET, + HDMI_CMD_INFOFRAME_GET, + HDMI_CMD_BUTT, +}; + +struct HdmiDispatchFunc { + int32_t cmd; + int32_t (*func)(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply); +}; + +static int32_t HdmiCmdOpen(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + + return HdmiCntlrOpen(cntlr); +} + +static int32_t HdmiCmdClose(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + + HdmiCntlrClose(cntlr); + return HDF_SUCCESS; +} + +static int32_t HdmiCmdStart(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + + return HdmiCntlrStart(cntlr); +} + +static int32_t HdmiCmdStop(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + + return HdmiCntlrStop(cntlr); +} + +static int32_t HdmiCmdAvmuteSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + bool *enable = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&enable, &size)) { + HDF_LOGE("HdmiCmdAvmuteSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + HdmiCntlrAvmuteSet(cntlr, *enable); + return HDF_SUCCESS; +} + +static int32_t HdmiCmdDeepColorSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + enum HdmiDeepColor *color = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&color, &size)) { + HDF_LOGE("HdmiCmdDeepColorSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrDeepColorSet(cntlr, *color); +} + +static int32_t HdmiCmdDeepColorGet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + enum HdmiDeepColor color; + (void)data; + + if (reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiCntlrDeepColorGet(cntlr, &color); + if (ret != HDF_SUCCESS) { + return ret; + } + + if (HdfSbufWriteBuffer(reply, &color, sizeof(color)) == false) { + HDF_LOGE("HdmiCmdDeepColorGet: write back color fail!"); + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +static int32_t HdmiCmdVideoAttrSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct HdmiVideoAttr *attr = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&attr, &size)) { + HDF_LOGE("HdmiCmdVideoAttrSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrSetVideoAttribute(cntlr, attr); +} + +static int32_t HdmiCmdAudioAttrSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct HdmiAudioAttr *attr = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&attr, &size)) { + HDF_LOGE("HdmiCmdAudioAttrSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrSetAudioAttribute(cntlr, attr); +} + +static int32_t HdmiCmdHdrAttrSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct HdmiHdrAttr *attr = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&attr, &size)) { + HDF_LOGE("HdmiCmdHdrAttrSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrSetHdrAttribute(cntlr, attr); +} + +static int32_t HdmiCmdReadSinkEdid(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint8_t edid[HDMI_EDID_TOTAL_SIZE] = {0}; + (void)data; + + if (reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiCntlrGetSinkEdid(cntlr, edid, HDMI_EDID_TOTAL_SIZE); + if (ret != HDF_SUCCESS) { + return ret; + } + + if (HdfSbufWriteBuffer(reply, edid, HDMI_EDID_TOTAL_SIZE) == false) { + HDF_LOGE("HdmiCmdReadSinkEdid: write back edid fail!"); + return HDF_ERR_IO; + } + + return HDF_SUCCESS; +} + +static int32_t HdmiCmdInfoframeSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + enum HdmiPacketType type; + union HdmiInfoframeInfo *frame = NULL; + size_t size; + + if (!HdfSbufReadUint16(data, (uint16_t *)&type)) { + HDF_LOGE("HdmiCmdInfoframeSet: sbuf read uint16 failed"); + return HDF_ERR_IO; + } + + if (!HdfSbufReadBuffer(data, (const void **)&frame, &size)) { + HDF_LOGE("HdmiCmdInfoframeSet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrInfoframeSet(cntlr, type, frame); +} + +static int32_t HdmiCmdInfoframeGet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + size_t size; + int32_t ret; + enum HdmiPacketType *type = NULL; + union HdmiInfoframeInfo frame = {0}; + + if (!HdfSbufReadBuffer(data, (const void **)&type, &size)) { + HDF_LOGE("HdmiCmdInfoframeGet: sbuf read buffer failed"); + return HDF_ERR_IO; + } + + ret = HdmiCntlrInfoframeGet(cntlr, *type, &frame); + if (ret != HDF_SUCCESS) { + return ret; + } + + if (HdfSbufWriteBuffer(reply, &frame, sizeof(frame)) == false) { + HDF_LOGE("HdmiCmdInfoframeGet: write back frame fail!"); + return HDF_ERR_IO; + } + + return HDF_SUCCESS; +} + +int32_t HdmiIoDispatch(struct HdfDeviceIoClient *client, int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct HdmiCntlr *cntlr = NULL; + uint32_t i, len; + struct HdmiDispatchFunc dispatchFunc[] = { + { HDMI_CMD_OPEN, HdmiCmdOpen }, + { HDMI_CMD_CLOSE, HdmiCmdClose }, + { HDMI_CMD_START, HdmiCmdStart }, + { HDMI_CMD_STOP, HdmiCmdStop }, + { HDMI_CMD_AVMUTE_SET, HdmiCmdAvmuteSet }, + { HDMI_CMD_DEEP_COLOR_SET, HdmiCmdDeepColorSet }, + { HDMI_CMD_DEEP_COLOR_GET, HdmiCmdDeepColorGet }, + { HDMI_CMD_VIDEO_ATTR_SET, HdmiCmdVideoAttrSet }, + { HDMI_CMD_AUDIO_ATTR_SET, HdmiCmdAudioAttrSet }, + { HDMI_CMD_HDR_ATTR_SET, HdmiCmdHdrAttrSet }, + { HDMI_CMD_READ_SINK_EDID, HdmiCmdReadSinkEdid }, + { HDMI_CMD_INFOFRAME_SET, HdmiCmdInfoframeSet }, + { HDMI_CMD_INFOFRAME_GET, HdmiCmdInfoframeGet }, + }; + + if (client == NULL || client->device == NULL) { + HDF_LOGE("HdmiIoDispatch: client or hdf dev obj is NULL"); + return HDF_ERR_INVALID_OBJECT; + } + + cntlr = (struct HdmiCntlr *)client->device->service; + if (cntlr == NULL) { + HDF_LOGE("HdmiIoDispatch: service is NULL"); + return HDF_ERR_INVALID_OBJECT; + } + + len = sizeof(dispatchFunc) / sizeof(dispatchFunc[0]); + for (i = 0; i < len; i++) { + if (dispatchFunc[i].cmd == cmd) { + return dispatchFunc[i].func(cntlr, data, reply); + } + } + + HDF_LOGE("HdmiIoDispatch: cmd %d is not support", cmd); + return HDF_ERR_NOT_SUPPORT; +} diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c new file mode 100644 index 000000000..e619f425a --- /dev/null +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -0,0 +1,1320 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" +#include "securec.h" + +#define HDF_LOG_TAG hdmi_edid_c + +/* + * Address locations 0x00 and 0x07 contain data values 0x00 and locations 0x01 through 0x06 contain 0xFF as data + * values. CTA-861 requires this data. This header is used to determine the beginning of an EDID structure in a Sink. + */ +uint8_t g_edidHeader[HDMI_EDID_BLOCK_HEADER_FIELD_LEN] = { 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 }; + +int32_t HdmiEdidReset(struct HdmiEdid *edid) +{ + if (edid == NULL) { + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(edid, sizeof(struct HdmiEdid), 0, sizeof(struct HdmiEdid)) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +int32_t HdmiEdidGetRaw(struct HdmiEdid *edid, uint8_t *raw, uint32_t len) +{ + uint32_t length; + + if (edid == NULL || raw == NULL || len == 0) { + return HDF_ERR_INVALID_PARAM; + } + + length = ((len < edid->rawLen) ? len : edid->rawLen); + if (memcpy_s(raw, len, edid->raw, length) != EOK) { + HDF_LOGE("memcpy_s fail."); + return HDF_ERR_IO; + } + return (int32_t)length; +} + +static int32_t HdmiEdidHeaderPhase(struct HdmiEdid *edid) +{ + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + uint32_t i; + + for (i = 0; i < HDMI_EDID_BLOCK_HEADER_FIELD_LEN; i++) { + if (block->header[i] != g_edidHeader[i]) { + HDF_LOGE("header[%d] = 0x%x, is error.", i, block->header[i]); + return HDF_ERR_INVALID_PARAM; + } + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidBlockCheckSum(uint8_t *data) +{ + uint32_t i; + uint32_t checkSum = 0; + + HDF_LOGI("check sum is 0x%x", data[HDMI_EDID_CHECKSUM_ADDR]); + for (i = 0; i < HDMI_EDID_SINGLE_BLOCK_SIZE; i++) { + checkSum += data[i]; + } + if ((checkSum & HDMI_EDID_CHECK_SUM_MARK) == 0) { + return HDF_SUCCESS; + } + HDF_LOGE("checksum = 0x%x, is invalid.", checkSum); + return HDF_FAILURE; +} + +static int32_t HdmiEdidVendorInfoPhase(struct HdmiEdid *edid) +{ + uint16_t data, i, tmpData; + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + /* Manufacturer Name */ + data = (block->vendorName[0] << HDMI_EDID_MANUFACRURER_NAME_SHIFT) | (block->vendorName[1]); + for (i = 0; i < HDMI_EDID_MANUFACRURER_NAME_MAX_LEN - 1; i++) { + tmpData = (data & (HDMI_EDID_MANUFACRURER_NAME_CHAR_MARK << (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i))); + tmpData = (tmpData >> (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i)); + if (tmpData > HDMI_EDID_MANUFACRURER_NAME_LOW_INVALID && + tmpData < HDMI_EDID_MANUFACRURER_NAME_HIGH_INVALID) { + sinkCap->vendorInfo.mfrName[2 - i] = (char)('A' + tmpData - 1); + } + } + + /* Product Code */ + data = (block->productCode[1] << HDMI_EDID_PRODUCT_CODE_SHIFT) | (block->productCode[0]); + sinkCap->vendorInfo.productCode = data; + + /* Serial Number */ + for (i = 0; i < HDMI_EDID_SERIAL_NUMBER_FIELD_LEN; i++) { + sinkCap->vendorInfo.serialNumber |= (block->serialNumber[i] << (HDMI_EDID_SERIAL_NUMBER_SHIFT * i)); + } + sinkCap->vendorInfo.week = block->week; + sinkCap->vendorInfo.year = block->year + HDMI_EDID_YEAR_BASE; + return HDF_SUCCESS; +} + +static int32_t HdmiEdidVersionInfoPhase(struct HdmiEdid *edid) +{ + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + sinkCap->verInfo.version = block->version; + sinkCap->verInfo.revision = block->revision; + if (sinkCap->verInfo.version != HDMI_EDID_VERSION_NUM) { + HDF_LOGW("edid version is %d", sinkCap->verInfo.version); + } + if (sinkCap->verInfo.revision != HDMI_EDID_REVISION_NUM) { + HDF_LOGW("edid revision is %d", sinkCap->verInfo.revision); + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidBasicDispPhase(struct HdmiEdid *edid) +{ + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + sinkCap->disp.width = block->width; + sinkCap->disp.height = block->height; + HDF_LOGI("width = %d, height = %d", block->width, block->height); + return HDF_SUCCESS; +} + +static int32_t HdmiEdidColorFeaturePhase(struct HdmiEdid *edid) +{ + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + /* red color phase */ + sinkCap->colorInfo.redX = (block->redX << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->redGreenLow >> HDMI_EDID_COLOR_RED_X_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + sinkCap->colorInfo.redY = (block->redY << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->redGreenLow >> HDMI_EDID_COLOR_RED_Y_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + /* green color phase */ + sinkCap->colorInfo.greenX = (block->greenX << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->redGreenLow >> HDMI_EDID_COLOR_GREEN_X_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + sinkCap->colorInfo.greenY = (block->greenY << HDMI_EDID_COLOR_HIGH_OFFSET) | + (block->redGreenLow & HDMI_EDID_COLOR_LOW_BITS_MARK); + /* blue color phase */ + sinkCap->colorInfo.blueX = (block->blueX << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->blueWhiteLow >> HDMI_EDID_COLOR_BLUE_X_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + sinkCap->colorInfo.blueY = (block->blueY << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->blueWhiteLow >> HDMI_EDID_COLOR_BLUE_Y_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + /* white color phase */ + sinkCap->colorInfo.whiteX = (block->whiteX << HDMI_EDID_COLOR_HIGH_OFFSET) | + ((block->blueWhiteLow >> HDMI_EDID_COLOR_WHITE_X_LOW_OFFSET) & HDMI_EDID_COLOR_LOW_BITS_MARK); + sinkCap->colorInfo.whiteY = (block->whiteY << HDMI_EDID_COLOR_HIGH_OFFSET) | + (block->blueWhiteLow & HDMI_EDID_COLOR_LOW_BITS_MARK); + return HDF_SUCCESS; +} + +static int32_t HdmiEdidEstablisedTimingPhase(struct HdmiEdid *edid) +{ + uint32_t i; + uint32_t data = 0; + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + for (i = 0; i < HDMI_EDID_ESTABLISHED_TIMINGS_FIELD_LEN; i++) { + data |= (block->estTimings[i] << (i * HDMI_EDID_ONE_BYTE_SHIFT)); + } + + /* + * The established timing block is a field of one-bit flags, which are used to inducate support for established + * VESA and other common timing in a very compact form. A bit set to "1" indicate support for that timing. + */ + for (i = 0; i < HDMI_EDID_ESTABLISHED_TIMING_BUTT; i++) { + if ((data & (1 << i)) > 0) { + sinkCap->establishedTimingsInfo.estTimings[i] = i; + sinkCap->establishedTimingsInfo.estTimingsNum++; + } + } + return HDF_SUCCESS; +} + +static uint32_t HdmiEdidGetStandardTimingVertPixel(uint32_t aspectRatio, uint32_t horizPixel) +{ + uint32_t vertPixel = 0; + + switch (aspectRatio) { + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_10 : + vertPixel = horizPixel * 10 / 16; + break; + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_5_4 : + vertPixel = horizPixel * 4 / 5; + break; + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_4_3 : + vertPixel = horizPixel * 3 / 4; + break; + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_9 : + vertPixel = horizPixel * 9 / 16; + break; + default : + HDF_LOGE("aspectRatio %d is invalid.", aspectRatio); + break; + } + return vertPixel; +} + +static int32_t HdmiEdidStandardTimingPhase(struct HdmiEdid *edid) +{ + uint32_t i, aspectRatio; + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + uint8_t *data = block->stdTiming; + + /* + * A 2-byte timing identifier identifies each timing mode. + * Unused fields in this section shall be set to 01h, 01h. + */ + for (i = 0; i < HDMI_EDID_STANDARD_TIMING_COUNT; i++) { + if (data[0] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG || data[1] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG) { + sinkCap->stdTimingsInfo[i].horizPixel = (data[0] + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE) * + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_FACTOR; + sinkCap->stdTimingsInfo[i].refreshRate = (data[1] & HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK) + + HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_BASE; + aspectRatio = (data[1] & HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_MARK) >> + HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_SHIFT; + sinkCap->stdTimingsInfo[i].vertPixel = + HdmiEdidGetStandardTimingVertPixel(aspectRatio, sinkCap->stdTimingsInfo[i].horizPixel); + } + data += HDMI_EDID_PER_STANDARD_TIMING_BYTE_NUM; + } + return HDF_SUCCESS; +} + +static void HdmiEdidMonitorDescriptorPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint32_t len) +{ + struct HdmiEdidMonitorBlockInfo *block = (struct HdmiEdidMonitorBlockInfo *)data; + + if (block->dataTag != HDMI_EDID_MONITOR_DATA_NAME) { + return; + } + if (memcpy_s(sinkCap->sinkDeviceName, HDMI_EDID_MAX_SINK_NAME_COUNT, + block->data, HDMI_EDID_MONITOR_DATA_FIELD_LEN) != EOK) { + HDF_LOGE("memcpy_s sink name fail"); + } +} + +static void HdmiEdidDigitalSyncSignal(struct HdmiEdidPreferredTimingInfo *perTiming, uint8_t flags) +{ + /* bit3/bit2/bit1 */ + switch ((flags & HDMI_EDID_DETAILED_TIMING_SYNC_SIGNAL_TYPE_MARK) >> 1) { + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_0 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_1 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_2 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_3 : + perTiming->ihs = false; + perTiming->ivs = false; + break; + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HN_4 : + perTiming->ihs = false; + perTiming->ivs = false; + break; + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HP_5 : + perTiming->ihs = true; + perTiming->ivs = false; + break; + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HN_6 : + perTiming->ihs = false; + perTiming->ivs = true; + break; + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HP_7 : + perTiming->ihs = true; + perTiming->ivs = true; + break; + default : + break; + } +} + +static void HdmiEdidDetailedTimingDescriptorPhase(struct HdmiSinkDeviceCapability *cap, uint8_t *data, uint32_t len) +{ + struct HdmiEdidDetailedTimingBlockInfo *block = (struct HdmiEdidDetailedTimingBlockInfo *)data; + struct HdmiEdidPreferredTimingInfo *perTiming = NULL; + uint32_t pixelClock; + + if (cap->preTimingCnt >= HDMI_EDID_MAX_DETAILED_TIMING_COUNT) { + HDF_LOGE("preTimingCnt reach the maximum"); + return; + } + + perTiming = &cap->preTimingInfo[cap->preTimingCnt]; + pixelClock = (block->pixelClk[1] << HDMI_EDID_ONE_BYTE_SHIFT) | (block->pixelClk[0]); + if (pixelClock == 0) { + HDF_LOGD(" pixel clock is 0. preTimingCnt = %d", cap->preTimingCnt); + return; + } + + perTiming->pixelClk = pixelClock * HDMI_EDID_DETAILED_TIMING_PIXEL_CLK_KHZ_FACTOR; + perTiming->hActive = (block->hActive) | + ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + perTiming->hBackBlank = (block->hBlanking) | + ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); + perTiming->hFrontBlank = (block->hSyncOffset) | + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_OFFSET_MARK) << HDMI_EDID_2_BITS_SHIFT); + perTiming->hSyncPluseWidth = (block->hSyncPulseWidth) | + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_PULSE_WIDTH_MARK) << HDMI_EDID_NIBBLE_SHIFT); + + perTiming->vActive = (block->vActive) | + ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + perTiming->vBackBlank = (block->vBlanking) | + ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); + perTiming->vFrontBlank = + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_OFFSET_MARK) << HDMI_EDID_2_BITS_SHIFT) | + ((block->vsOffesetPulseWidth & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) >> HDMI_EDID_NIBBLE_SHIFT); + perTiming->vSyncPluseWidth = + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_PULSE_WIDTH_MARK) << HDMI_EDID_NIBBLE_SHIFT) | + (block->vsOffesetPulseWidth & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK); + + perTiming->imageWidth = (block->hImageSize) | + ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + perTiming->imageHeight = (block->vImageSize) | + ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); + perTiming->interlaceFlag = (block->flags & HDMI_EDID_BIT7_MARK) ? true : false; + /* Digital composite/separate */ + if ((block->flags & HDMI_EDID_BIT4_MARK) != 0) { + HdmiEdidDigitalSyncSignal(perTiming, block->flags); + } + cap->preTimingCnt++; +} + +static void HdmiEdidDetailedTiming(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint32_t len) +{ + /* + * Monitor Descriptor flag: data0/data1/data2 is 0x00. + */ + if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00) { + HdmiEdidMonitorDescriptorPhase(sinkCap, data, len); + return; + } + + /* + * Those 18-byte blocks not used for Monitor Descriptors shall be used for detailed timings. + */ + HdmiEdidDetailedTimingDescriptorPhase(sinkCap, data, len); +} + +static int32_t HdmiEdidDetailedTimingPhase(struct HdmiEdid *edid) +{ + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; + + /* + * The detailed timing section is divided into four descriptor blocks, which are 18 bytes each. + * The first descriptor block shall be used to indicate the display's preferred timing mode. + * A Monitor Name Descriptor must be provided. + */ + HdmiEdidDetailedTiming(sinkCap, block->detailedTiming1, HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN); + HdmiEdidDetailedTiming(sinkCap, block->detailedTiming2, HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN); + HdmiEdidDetailedTiming(sinkCap, block->detailedTiming3, HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN); + HdmiEdidDetailedTiming(sinkCap, block->detailedTiming4, HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN); + return HDF_SUCCESS; +} + +static int32_t HdmiEdidExtBlockNumPhase(struct HdmiEdid *edid) +{ + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + + sinkCap->extBlockNum = edid->raw[HDMI_EDID_EXTENSION_BLOCK_ADDR]; + if (sinkCap->extBlockNum > (HDMI_EDID_MAX_BLOCK_NUM - 1)) { + HDF_LOGW("ext block number %d is invallid.", sinkCap->extBlockNum); + sinkCap->extBlockNum = HDMI_EDID_MAX_BLOCK_NUM - 1; + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidFirstBlockPhase(struct HdmiEdid *edid) +{ + uint32_t i, len; + int32_t ret; + HdmiEdidPhaseFunc func[] = { HdmiEdidHeaderPhase, + HdmiEdidVendorInfoPhase, + HdmiEdidVersionInfoPhase, + HdmiEdidBasicDispPhase, + HdmiEdidColorFeaturePhase, + HdmiEdidEstablisedTimingPhase, + HdmiEdidStandardTimingPhase, + HdmiEdidDetailedTimingPhase, + HdmiEdidExtBlockNumPhase }; + + ret = HdmiEdidBlockCheckSum(edid->raw); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid block0 check sum fail."); + return ret; + } + + len = sizeof(func) / sizeof(func[0]); + for (i = 0; i < len; i++) { + if (func[i] == NULL) { + continue; + } + ret = (func[i])(edid); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func[%d] exe fail.", i); + return ret; + } + } + return HDF_SUCCESS; +} + +static void HdmiEdidExtAdbSampleRatePhase(struct HdmiEdidAudioInfo *audio, uint8_t data, uint8_t formatCode) +{ + if ((data & HDMI_EDID_BIT0_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_32K; + audio->sampleRateNum++; + } + if ((data & HDMI_EDID_BIT1_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_44K; + audio->sampleRateNum++; + } + if ((data & HDMI_EDID_BIT2_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_48K; + audio->sampleRateNum++; + } + if ((data & HDMI_EDID_BIT3_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_88K; + audio->sampleRateNum++; + } + if ((data & HDMI_EDID_BIT4_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_96K; + audio->sampleRateNum++; + } + + if (formatCode >= HDMI_AUDIO_CODING_TYPE_LPCM && formatCode <= HDMI_AUDIO_CODING_TYPE_WMA_PRO) { + if ((data & HDMI_EDID_BIT5_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_176K; + audio->sampleRateNum++; + } + if ((data & HDMI_EDID_BIT6_MARK) > 0 && + audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { + audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_192K; + audio->sampleRateNum++; + } + } +} + +static void HdmiEdidExtAdbDepthAndMaxRatePhase(struct HdmiEdidAudioInfo *audio, uint8_t data, uint8_t formatCode) +{ + /* + * Audio Format Code is 1, bit[2:0] bit depth; + * Audio Format Codes 2 to 8, Maximum bit rate divided by 8 kHz. + */ + if (formatCode == HDMI_AUDIO_CODING_TYPE_LPCM) { + if ((data & HDMI_EDID_BIT0_MARK) > 0 && + audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { + audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_16; + audio->bitDepthNum++; + } + if ((data & HDMI_EDID_BIT1_MARK) > 0 && + audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { + audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_20; + audio->bitDepthNum++; + } + if ((data & HDMI_EDID_BIT2_MARK) > 0 && + audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { + audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_24; + audio->bitDepthNum++; + } + } else if (formatCode >= HDMI_AUDIO_CODING_TYPE_AC3 && formatCode <= HDMI_AUDIO_CODING_TYPE_ATRAC) { + audio->maxBitRate = data * HDMI_EDID_EXTENSION_AUDIO_BIT_RATE_FACTOR; + } else { + HDF_LOGI("formatCode %d reserved or not care", formatCode); + } +} + +static int32_t HdmiEdidExtAudioDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + uint8_t i, formatCode; + + /* + * Each Short Audio Descriptor is 3-bytes long. There can be up to 31 bytes following any tag, + * therefore there may be up to 10 Short Audio Descriptors in the Audio Data Block (ADB). + */ + if (len > (HDMI_EDID_EXTENSION_SHORT_AUDIO_DESCRIPTOR_LEN * HDMI_EDID_EXTENSION_MAX_SHORT_AUDIO_DESCRIPTOR_NUM)) { + HDF_LOGE("ADB: len %d is invalid", len); + return HDF_ERR_INVALID_PARAM; + } + + for (i = 0; i < (len / HDMI_EDID_EXTENSION_SHORT_AUDIO_DESCRIPTOR_LEN); i++) { + if (sinkCap->audioInfoCnt >= HDMI_EDID_EXTENSION_AUDIO_CAP_COUNT) { + HDF_LOGE("ADB: info cnt reach the maximum"); + break; + } + data += (i * HDMI_EDID_EXTENSION_SHORT_AUDIO_DESCRIPTOR_LEN); + /* byte0: bit[6:3] Audio Format Code; bit[2:0] Max Number of channels - 1 */ + formatCode = (data[0] & HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_MARK) >> + HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_SHIFT; + sinkCap->audioInfo[sinkCap->audioInfoCnt].formatCode = (enum HdmiAudioCodingType)formatCode; + sinkCap->audioInfo[sinkCap->audioInfoCnt].channels = + (data[0] & HDMI_EDID_EXTENSION_AUDIO_MAX_CHANNEL_MARK) + 1; + /* byte1: Sample Rate */ + HdmiEdidExtAdbSampleRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[1], formatCode); + /* byte2: bit depth or maximum bit rate */ + HdmiEdidExtAdbDepthAndMaxRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[2], formatCode); + sinkCap->audioInfoCnt++; + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + uint8_t i; + uint32_t vicAll = 0; + uint32_t vicLower = 0; + uint32_t implicitNative = 0; + + for (i = 0; i < len; i++) { + if (sinkCap->videoInfo.vicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { + HDF_LOGD("VDB: vicNum reach the maximum"); + break; + } + vicAll = data[i]; + vicLower = (vicAll & HDMI_EDID_EXTENSION_VIC_LOWER7_MARK); + if (vicAll == 0) { + continue; + } + /* + * For VICs 1 through 64, the lower 7-bits are an index associated with the Video Format supported. + * The most significant bit declares whether the format is a Native Video Format of the + * display (native =1, not native = 0). Typically, there is a single SVD, with its native bit set. + */ + if ((vicAll & HDMI_EDID_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { + if (sinkCap->videoInfo.nativeFormat == 0) { + sinkCap->videoInfo.nativeFormat = vicLower; + } + } + /* set the first valid vic as implicit native */ + if (implicitNative == 0) { + implicitNative = vicAll; + } + if ((vicAll & HDMI_EDID_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { + sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = vicLower; + } else { + sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = vicAll; + } + sinkCap->videoInfo.vicNum++; + } + + if (sinkCap->videoInfo.nativeFormat == 0) { + sinkCap->videoInfo.nativeFormat = implicitNative; + } + return HDF_SUCCESS; +} + +static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (len >= 5) { + sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[3] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[3] & HDMI_EDID_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[4] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[4] & HDMI_EDID_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.addrValid = + (sinkCap->vsdbInfo.cecAddr.phyAddrA != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && + (sinkCap->vsdbInfo.cecAddr.phyAddrB != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && + (sinkCap->vsdbInfo.cecAddr.phyAddrC != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && + (sinkCap->vsdbInfo.cecAddr.phyAddrD != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR); + } +} + +static void HdmiEdidVsdbColorDepthPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (len >= 6) { + sinkCap->vsdbInfo.supportAi = (data[5] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.supportDviDual = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dcY444 = (data[5] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc30bit = (data[5] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc36bit = (data[5] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc48bit = (data[5] & HDMI_EDID_BIT6_MARK) ? true : false; + } +} + +static void HdmiEdidVsdbMaxTmdsClockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + /* + * This field shall be set cprrectly and non-zero if the sink support TMDS clock frequencies above 165MHz or + * supports ant Deep Color mode or supports DVI dual-link. A value of zeor means that no clock rate is indicated. + */ + if (len >= 7) { + sinkCap->maxTmdsClk = data[6] * HDMI_EDID_EXTENSION_TMDS_FACTOR; + sinkCap->supportHdmi20 = (sinkCap->maxTmdsClk > HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE) ? true : false; + } +} + +static void HdmiEdidVsdbSinkPresentPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (len >= 8) { + sinkCap->vsdbInfo.latencyFieldsPresent = (data[7] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.iLatencyFieldsPresent = (data[7] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->vsdbInfo.hdmiVideoPresent = (data[7] & HDMI_EDID_BIT5_MARK) ? true : false; + } +} + +static void HdmiEdidVsdbSinkLatencyPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (sinkCap->vsdbInfo.latencyFieldsPresent == true) { + if (len >= 9) { + sinkCap->vsdbInfo.videoLatency = data[8]; + } + if (len >= 10) { + sinkCap->vsdbInfo.videoLatency = data[9]; + } + } + if (sinkCap->vsdbInfo.iLatencyFieldsPresent == true) { + if (len >= 11) { + sinkCap->vsdbInfo.interlacedVideoLatency = data[10]; + } + if (len >= 12) { + sinkCap->vsdbInfo.interlacedAudioLatency = data[11]; + } + } +} + +static void HdmiEdidVsdbVicInfoPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t vicLen, uint8_t *offset) +{ + uint8_t i, index; + /* see hdmi spec 1.4 table 8-13. */ + uint32_t hdmi4kVic[] = { 0, + HDMI_VIC_3840X2160P30_16_9, + HDMI_VIC_3840X2160P25_16_9, + HDMI_VIC_3840X2160P24_16_9, + HDMI_VIC_4096X2160P24_256_135 }; + + for (i = 0; i < vicLen; i++) { + if (sinkCap->videoInfo.vicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { + break; + } + index = data[(*offset)]; + if (index != 0 && index < sizeof(hdmi4kVic) / sizeof(hdmi4kVic[0])) { + sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = hdmi4kVic[index]; + sinkCap->videoInfo.vicNum++; + } + (*offset)++; + } +} + +static void HdmiEdidVsdb3dStructureInfoPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len, uint8_t *offset) +{ + /* + * If 3D_Multi_present is 1 or 2, 3D_Struct_ALL_15...0 is present and assigns 3D formats to + * all of the VICs listed in the first 16 entries in the EDID. + */ + if ((sinkCap->vsdbInfo._3dMultiPresent & HDMI_EDID_EXTENSION_VSDB_3D_STR_INVALID_MARK) == 0) { + return; + } + /* see hdmi spec 1.4 table H-8. */ + if ((*offset) <= len) { + /* + * bit[15:9]: reserved. + * bit8: sinks support "Side-by-side(half) with all sub-sampling methods" 3D formats. + */ + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_HALF] = + (data[(*offset)] & HDMI_EDID_BIT0_MARK) ? true : false; + (*offset)++; + } + + if ((*offset) <= len) { + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_FRAME_PACKING] = + (data[(*offset)] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_FIELD_ALTERNATIVE] = + (data[(*offset)] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_LINE_ALTERNATIVE] = + (data[(*offset)] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_FULL] = + (data[(*offset)] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_L_DEPTH] = + (data[(*offset)] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_L_DEPTH_GFX_GFX_DEPTH] = + (data[(*offset)] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_TOP_AND_BOTTOM] = + (data[(*offset)] & HDMI_EDID_BIT6_MARK) ? true : false; + (*offset)++; + } +} + +static void HdmiEdidVsdbVicAnd3dInfoPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + uint8_t hdmiVicLen = 0; + uint8_t hdmi3dLen = 0; + uint8_t offset; + + if (len < 13) { + HDF_LOGD("vsdb: these is no vic/3d field."); + return; + } + sinkCap->vsdbInfo._3dPresent = (data[12] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo._3dMultiPresent = + (data[12] & HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; + + if (len >= 14) { + hdmiVicLen = (data[13] & HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; + hdmi3dLen = (data[13] & HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK); + } + + /* byte14~byteN: Vic info/3D info */ + offset = 14; + if (hdmiVicLen > 0 && (hdmiVicLen + offset + 1) <= len) { + HdmiEdidVsdbVicInfoPhase(sinkCap, data, hdmiVicLen, &offset); + } + + if (hdmi3dLen > 0 && + sinkCap->vsdbInfo._3dPresent == true && + (hdmi3dLen + offset + 1) <= len) { + HdmiEdidVsdb3dStructureInfoPhase(sinkCap, data, len, &offset); + } +} + +static int32_t HdmiEdidVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + /* byte3 byte4: cec addr */ + if (len < 5) { + HDF_LOGD("vsdb: len = %d, too short.", len); + return HDF_SUCCESS; + } + HdmiEdidVsdbCecPhyAddrPhase(sinkCap, data, len); + /* byte 5: color depth flags */ + HdmiEdidVsdbColorDepthPhase(sinkCap, data, len); + /* byte 6: max tmds clock. */ + HdmiEdidVsdbMaxTmdsClockPhase(sinkCap, data, len); + /* byte7: some sink present */ + HdmiEdidVsdbSinkPresentPhase(sinkCap, data, len); + /* + * byte8: Video_Latency + * byte9: Audio_Latency + * byte10: Interlaced_Video_Latency + * byte11: Interlaced_Audio_Latency + */ + HdmiEdidVsdbSinkLatencyPhase(sinkCap, data, len); + /* + * byte12: 3D_Present, 3D_Multi_present + * byte13: HDMI_VIC_LEN/HDMI_3D_LEN + * byte14~byteN: Vic info/3D info + */ + HdmiEdidVsdbVicAnd3dInfoPhase(sinkCap, data, len); + return HDF_SUCCESS; +} + +static void HdmiEdidHfVsdb21Phase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + sinkCap->hfVsdbInfo.maxFrlRate = (data[6] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + + sinkCap->hfVsdbInfo.fapaStartLocation = (data[7] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.allm = (data[7] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.fva = (data[7] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.cnmVrr = (data[7] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.cinemaVrr = (data[7] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->hfVsdbInfo.mDelta = (data[7] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->hfVsdbInfo.vrrMin = (data[8] & 0x3F); + sinkCap->hfVsdbInfo.vrrMax = ((data[8] & 0xC0) << 2) | data[9]; + + sinkCap->hfVsdbInfo.dscInfo.dsc1p2 = (data[10] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscNative420 = (data[10] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscAllBpp = (data[10] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc10bpc = (data[10] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[10] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[10] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[11] & HDMI_EDID_LOWER_NIBBLE_MARK); + sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[11] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + sinkCap->hfVsdbInfo.dscInfo.dscTotalChunkKBytes = (data[12] & 0x3F); +} + +static int32_t HdmiEdidHfVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (len < HDMI_EDID_EXTENSION_HFVSDB_MIN_INVALID_LEN) { + HDF_LOGD("vsdb: data len %d is too short.", len); + return HDF_SUCCESS; + } + + /* byte3: Version */ + if (data[3] != HDMI_EDID_EXTENSION_HFVSDB_VERSION) { + HDF_LOGD("vsdb: verdion %d is invalid.", data[3]); + } + /* byte4: Max_TMDS_Character_Rate */ + sinkCap->maxTmdsClk = data[4] * HDMI_EDID_EXTENSION_TMDS_FACTOR; + sinkCap->supportHdmi20 = (sinkCap->maxTmdsClk > HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE) ? true : false; + /* byte5: several sink present */ + sinkCap->hfVsdbInfo.scdcPresent = (data[5] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.rrCapable = (data[5] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.lte340McscScramble = (data[5] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.independentView = (data[5] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dualView = (data[5] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo._3dOsdDisparity = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; + /* byte6: deep color */ + sinkCap->hfVsdbInfo.dc.dc30bit = (data[6] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc36bit = (data[6] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc48bit = (data[6] & HDMI_EDID_BIT2_MARK) ? true : false; + if (len > HDMI_EDID_EXTENSION_HFVSDB_MIN_INVALID_LEN && + len <= HDMI_EDID_EXTENSION_HFVSDB_MAX_INVALID_LEN) { + HdmiEdidHfVsdb21Phase(sinkCap, data, len); + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidExtVsDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + int32_t ret = HDF_SUCCESS; + bool vsdb = false; + bool hfVsdb = false; + + if (len >= HDMI_EDID_EXTENSION_VSDB_LEN && + data[0] == HDMI_EDID_EXTENSION_VSDB_IEEE_1ST && + data[1] == HDMI_EDID_EXTENSION_VSDB_IEEE_2ND && + data[2] == HDMI_EDID_EXTENSION_VSDB_IEEE_3RD) { + vsdb = true; + } + + if (len >= HDMI_EDID_EXTENSION_VSDB_LEN && + data[0] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_1ST && + data[1] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_2ND && + data[2] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_3RD) { + hfVsdb = true; + } + + if (vsdb == true) { + sinkCap->supportHdmi14 = true; + ret = HdmiEdidVsdbPhase(sinkCap, data, len); + } else if (hfVsdb == true) { + ret = HdmiEdidHfVsdbPhase(sinkCap, data, len); + } + return ret; +} + +static int32_t HdmiEdidExtSpeakerDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + if (len < HDMI_EDID_EXTENSION_SADB_MIN_INVALID_LEN) { + HDF_LOGD("SADB: len %d is too short", len); + return HDF_SUCCESS; + } + + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FL_FR] = + (data[0] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_LFE] = + (data[0] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FC] = + (data[0] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BL_BR] = + (data[0] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BC] = + (data[0] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLC_FRC] = + (data[0] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_RLC_RRC] = + (data[0] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLW_FRW] = + (data[0] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFL_TPFH] = + (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPC] = + (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFC] = + (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; + return HDF_SUCCESS; +} + +static void HdmiEdidExtUseExtDataBlockVcdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + if (len < HDMI_EDID_VCDB_LEN) { + HDF_LOGD("VCDB: len is too short"); + return; + } + + sinkCap->videoCap.qy = (data[1] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->videoCap.qs = (data[1] & HDMI_EDID_BIT6_MARK) ? true : false; +} + +static void HdmiEdidExtUseExtDataBlockCdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + if (len < HDMI_EDID_CDB_LEN) { + HDF_LOGD("CDB: len is too short"); + return; + } + + sinkCap->colorimetry.xvYcc601 = (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->colorimetry.xvYcc709 = (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->colorimetry.sYcc601 = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->colorimetry.opYcc601 = (data[1] & HDMI_EDID_BIT3_MARK) ? true : false; + sinkCap->colorimetry.opRgb = (data[1] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->colorimetry.bt2020cYcc = (data[1] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->colorimetry.bt2020Ycc = (data[1] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->colorimetry.bt2020Rgb = (data[1] & HDMI_EDID_BIT7_MARK) ? true : false; + + sinkCap->colorimetry.dciP3 = (data[2] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->colorimetry.md = (data[2] & HDMI_EDID_LOWER_NIBBLE_MARK); +} + +static void HdmiEdidExtUseExtDataBlockY420VdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + uint8_t i; + uint32_t vic; + + for (i = 1; i < len; i++) { + if (sinkCap->y420Cap.onlySupportY420VicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { + HDF_LOGD("Y420Vdb: vic num reach to max."); + break; + } + vic = data[i]; + if (vic == 0 || + (vic >= HDMI_EDID_EXTENSION_VIC_INVALID_LOW && vic <= HDMI_EDID_EXTENSION_VIC_INVALID_HIGH)) { + continue; + } + sinkCap->y420Cap.onlySupportY420Format[sinkCap->y420Cap.onlySupportY420VicNum] = vic; + sinkCap->y420Cap.onlySupportY420VicNum++; + sinkCap->colorSpace.ycbcr420 = true; + } +} + +static void HdmiEdidExtUseExtDataBlockY420CmdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + uint32_t i, loop; + + /* + * When the Length field is set to 1, the Y420CMDB does not include a YCBCR 4:2:0 Capability Bit Map and + * all the SVDs in the regular Video Data Block(s) support YCBCR 4:2:0 sampling mode. + */ + if (len == 1) { + for (i = 0; (i < sinkCap->videoInfo.vicNum) && (i < HDMI_EDID_EXTENSION_MAX_VIC_COUNT); i++) { + if (sinkCap->y420Cap.SupportY420VicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { + break; + } + sinkCap->y420Cap.SupportY420Format[sinkCap->y420Cap.SupportY420VicNum] = sinkCap->videoInfo.vic[i]; + sinkCap->y420Cap.SupportY420VicNum++; + sinkCap->colorSpace.ycbcr420 = true; + } + return; + } + + /* + * Bit 0 of data byte 3 is associated with the first sequential SVD listed in the regular Video Data Block(s) + * of the EDID, bit 1 the second SVD, bit 2 the third, and so on. + */ + loop = len * HDMI_EDID_BITS_OF_ONE_BYTE; + loop = (loop > HDMI_EDID_EXTENSION_MAX_VIC_COUNT) ? HDMI_EDID_EXTENSION_MAX_VIC_COUNT : loop; + data++; + for (i = 0; (i < loop) && (i < sinkCap->videoInfo.vicNum); i++) { + if (sinkCap->y420Cap.SupportY420VicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { + break; + } + if ((data[i / HDMI_EDID_BITS_OF_ONE_BYTE] & (0x01 << (i % HDMI_EDID_BITS_OF_ONE_BYTE))) > 0) { + sinkCap->y420Cap.SupportY420Format[sinkCap->y420Cap.SupportY420VicNum] = sinkCap->videoInfo.vic[i]; + sinkCap->y420Cap.SupportY420VicNum++; + sinkCap->colorSpace.ycbcr420 = true; + } + } +} + +static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + if (len < HDMI_EDID_HDR_SMDB_MIN_LEN) { + HDF_LOGD("Hdr SMDB: len is too short"); + return; + } + + sinkCap->hdrCap.eotf.sdr = (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hdrCap.eotf.hdr = (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->hdrCap.eotf.smpteSt2048 = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hdrCap.eotf.hlg = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hdrCap.smType1 = (data[2] & HDMI_EDID_BIT0_MARK) ? true : false; + + /* + * The length of the data block, n, in Byte 1 indicates which of the Bytes 5 to 7 are present. Bytes 5 to 7 are + * optional to declare. When n is 3, Bytes 5 to 7 are not present. When n is 4, Byte 5 is present; when n is 5, + * Bytes 5 and 6 are present; and when n is 6, Bytes 5 to 7 are present. + */ + if (len >= 4) { + sinkCap->hdrCap.maxLuminancedata = data[3]; + } + if (len >= 5) { + sinkCap->hdrCap.maxFrameAverageLuminanceData = data[4]; + } + if (len >= 6) { + sinkCap->hdrCap.maxFrameAverageLuminanceData = data[5]; + } +} + +static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len) +{ + uint32_t oui; + + if (len != HDMI_EDID_VSVDB_DOLBY_VERSION_0_LEN && + len != HDMI_EDID_VSVDB_DOLBY_VERSION_1_LEN) { + HDF_LOGD("Vsvdb: invalid dolby len"); + return; + } + + oui = (data[1]) | (data[2] << 8) | (data[3] << 16); + if (oui != HDMI_EDID_VSVDB_DOLBY_OUI) { + return; + } + sinkCap->dolbyCap.oui = oui; + sinkCap->dolbyCap.version = (data[4] & HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; + sinkCap->dolbyCap.yuv422 = (data[4] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.b2160p60 = (data[4] & HDMI_EDID_BIT1_MARK) ? true : false; + if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_0) { + sinkCap->dolbyCap.globalDimming = (data[4] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->dolbyCap.redX = ((data[5] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | + (data[6] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.redY = (data[5] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[7] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenX = ((data[8] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | + (data[9] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenY = (data[8] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[10] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueX = ((data[11] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | + (data[12] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueY = (data[11] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[13] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteX = ((data[14] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | + (data[15] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteY = (data[14] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[16] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.minLuminance = ((data[17] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | + (data[18] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.maxLuminance = + (data[17] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[19] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.dMajorVer = (data[20] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + sinkCap->dolbyCap.dMinorVer = (data[20] & HDMI_EDID_LOWER_NIBBLE_MARK); + return; + } + if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_1) { + sinkCap->dolbyCap.dmVer = (data[4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; + sinkCap->dolbyCap.globalDimming = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.maxLuminance = ((data[5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.colorimetry = (data[6] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.minLuminance = ((data[6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.redX = data[8]; + sinkCap->dolbyCap.redY = data[9]; + sinkCap->dolbyCap.greenX = data[10]; + sinkCap->dolbyCap.greenY = data[11]; + sinkCap->dolbyCap.blueX = data[12]; + sinkCap->dolbyCap.blueY = data[13]; + } +} + +static int32_t HdmiEdidExtUseExtDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) +{ + uint8_t extTagCode = data[0]; + + switch (extTagCode) { + case HDMI_EDID_EXT_VCDB : + HdmiEdidExtUseExtDataBlockVcdbPhase(sinkCap, data, len); + break; + case HDMI_EDID_EXT_VSVDB : + HdmiEdidExtUseExtDataBlockVsvdbPhase(sinkCap, data, len); + break; + case HDMI_EDID_EXT_CDB : + HdmiEdidExtUseExtDataBlockCdbPhase(sinkCap, data, len); + break; + case HDMI_EDID_EXT_HDR_SMDB : + HdmiEdidExtUseExtDataBlockHdrSmdbPhase(sinkCap, data, len); + break; + case HDMI_EDID_EXT_YCBCR420_VDB : + HdmiEdidExtUseExtDataBlockY420VdbPhase(sinkCap, data, len); + break; + case HDMI_EDID_EXT_YCBCR420_CMDB : + HdmiEdidExtUseExtDataBlockY420CmdbPhase(sinkCap, data, len); + break; + default : + HDF_LOGD("ext use ext DB: tag code %d unphase", extTagCode); + break; + } + return HDF_SUCCESS; +} + +static int32_t HdmiEdidExtDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, + uint8_t *data, uint8_t len, uint8_t tag) +{ + int32_t ret = HDF_SUCCESS; + + if (len == 0) { + HDF_LOGD("ext DB: len is 0"); + return ret; + } + + switch (tag) { + case HDMI_EDID_AUDIO_DATA_BLOCK : + /* Audio Data Block (includes one or more Short Audio Descriptors) */ + ret = HdmiEdidExtAudioDataBlockPhase(sinkCap, data, len); + break; + case HDMI_EDID_VIDEO_DATA_BLOCK : + /* Video Data Block (includes one or more Short Video Descriptors) */ + ret = HdmiEdidExtVideoDataBlockPhase(sinkCap, data, len); + break; + case HDMI_EDID_VENDOR_SPECIFIC_DATA_BLOCK : + ret = HdmiEdidExtVsDataBlockPhase(sinkCap, data, len); + break; + case HDMI_EDID_SPEAKER_ALLOCATION_DATA_BLOCK : + ret = HdmiEdidExtSpeakerDataBlockPhase(sinkCap, data, len); + break; + case HDMI_EDID_USE_EXT_DATA_BLOCK : + ret = HdmiEdidExtUseExtDataBlockPhase(sinkCap, data, len); + break; + default : + HDF_LOGD("tag = %d is reserved or unphase block", tag); + break; + } + return ret; +} + +static void HdmiEdidExtSeveralDataBlockPhase(struct HdmiEdid *edid, uint8_t blockNum) +{ + uint8_t *data = edid->raw + (blockNum * HDMI_EDID_SINGLE_BLOCK_SIZE); + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + uint8_t blkOffset = HDMI_EDID_EXTENSION_BLOCK_OFFSET; + uint8_t dtdOffset = data[2]; + uint8_t dbTagCode, blkLen; + int32_t ret; + + data += blkOffset; + /* phase data block */ + for (blkLen = 0; (blkOffset < dtdOffset) && (data != NULL); blkOffset += (blkLen + 1)) { + data += blkLen; + blkLen = (data[0] & HDMI_EDID_EXTENSION_DATA_BLOCK_LEN_MARK); + dbTagCode = (data[0] & HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_MARK) >> + HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_SHIFT; + data++; + ret = HdmiEdidExtDataBlockPhase(sinkCap, data, blkLen, dbTagCode); + if (ret != HDF_SUCCESS) { + HDF_LOGE("data block %d phase fail", dbTagCode); + return; + } + } + + data += blkLen; + /* phase detialed timing descriptors */ + while ((HDMI_EDID_SINGLE_BLOCK_SIZE - 1 - blkOffset) >= HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN) { + HdmiEdidDetailedTiming(sinkCap, data, HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN); + blkOffset += HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN; + data += HDMI_EDID_DETAILED_TIMING_DESCRIPTOR_FIELD_LEN; + } +} + +static int32_t HdmiEdidExtBlockPhase(struct HdmiEdid *edid, uint8_t blockNum) +{ + uint8_t *data = edid->raw; + struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); + int32_t ret; + + if (blockNum >= HDMI_EDID_MAX_BLOCK_NUM) { + HDF_LOGE("blockNum %d is invalid", blockNum); + return HDF_ERR_INVALID_PARAM; + } + + data += (blockNum * HDMI_EDID_SINGLE_BLOCK_SIZE); + ret = HdmiEdidBlockCheckSum(data); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid block%d check sum fail.", blockNum); + return ret; + } + + /* byte0: Extension Tag */ + if (data[0] != HDMI_EDID_CTA_EXTENSION_TAG) { + HDF_LOGD("ext tag is %d", data[0]); + } + /* byte1: Extension Revision Number */ + if (data[1] != HDMI_EDID_CTA_EXTENSION3_REVISION) { + HDF_LOGD("revision number is %d", data[1]); + } + /* + * byte2: Byte number offset d where 18-byte descriptors begin (typically Detailed Timing Descriptors). + * If no data is provided in the reserved data block, then d is 4. If d is 0, then no detailed timing + * descriptors are provided and no data is provided in the reserved data block collection. + */ + if (data[2] < HDMI_EDID_EXTENSION_D_INVALID_MIN_VAL) { + HDF_LOGD("ext block%d no dtd", blockNum); + return HDF_SUCCESS; + } + /* byte3: indication of underscan support, audio support, support of YCBCR and total number of native DTDs. */ + sinkCap->colorSpace.rgb444 = true; + sinkCap->colorSpace.ycbcr422 = (data[3] & HDMI_EDID_BIT4_MARK) ? true : false; + sinkCap->colorSpace.ycbcr444 = (data[3] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->supportAudio = (data[3] & HDMI_EDID_BIT6_MARK) ? true : false; + /* + * Video Data Block, Audio Data Block, Speaker Allocation Data Block, + * Vendor Specific Data Block and Video Capability Data Block phase. + */ + HdmiEdidExtSeveralDataBlockPhase(edid, blockNum); + return HDF_SUCCESS; +} + +int32_t HdmiEdidPhase(struct HdmiEdid *edid) +{ + uint8_t blockNum; + int32_t ret; + struct HdmiSinkDeviceCapability *sinkCap = NULL; + + if (edid == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiEdidFirstBlockPhase(edid); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid first block phase fail."); + return ret; + } + + sinkCap = &(edid->sinkCap); + for (blockNum = 1; blockNum < sinkCap->extBlockNum; blockNum++) { + ret = HdmiEdidExtBlockPhase(edid, blockNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid ext block%d phase fail.", blockNum); + return ret; + } + } + return HDF_SUCCESS; +} + +int32_t HdmiEdidRawDataRead(struct HdmiEdid *edid, struct HdmiDdc *ddc) +{ + struct HdmiDdcCfg cfg = {0}; + int32_t ret; + uint8_t extBlkNum; + + if (edid == NULL || ddc == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + /* read block0 */ + cfg.type = HDMI_DDC_DEV_EDID; + cfg.mode = HDMI_DDC_MODE_READ_MUTIL_NO_ACK; + cfg.data = edid->raw; + cfg.dataLen = HDMI_EDID_SINGLE_BLOCK_SIZE; + cfg.readFlag = true; + cfg.devAddr = HDMI_DDC_EDID_DEV_ADDRESS; + ret = HdmiDdcTransfer(ddc, &cfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid block0 read fail"); + return ret; + } + edid->rawLen += HDMI_EDID_SINGLE_BLOCK_SIZE; + + extBlkNum = edid->raw[HDMI_EDID_EXTENSION_BLOCK_ADDR]; + if (extBlkNum > (HDMI_EDID_MAX_BLOCK_NUM - 1)) { + extBlkNum = (HDMI_EDID_MAX_BLOCK_NUM - 1); + HDF_LOGD("extBlkNum > max, use max."); + } + if (extBlkNum == 0) { + HDF_LOGD("edid only has block0"); + return HDF_SUCCESS; + } + + /* read block1 */ + cfg.data += HDMI_EDID_SINGLE_BLOCK_SIZE; + ret = HdmiDdcTransfer(ddc, &cfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid block1 read fail"); + return ret; + } + edid->rawLen += HDMI_EDID_SINGLE_BLOCK_SIZE; + + if (extBlkNum == 1) { + HDF_LOGD("edid only has block0~1"); + return HDF_SUCCESS; + } + /* read block2~3 */ + cfg.data += HDMI_EDID_SINGLE_BLOCK_SIZE; + cfg.dataLen = (extBlkNum - 1) * HDMI_EDID_SINGLE_BLOCK_SIZE; + cfg.mode = HDMI_DDC_MODE_READ_SEGMENT_NO_ACK; + cfg.segment = 1; + ret = HdmiDdcTransfer(ddc, &cfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("edid block2~3 read fail"); + return ret; + } + edid->rawLen += (extBlkNum - 1) * HDMI_EDID_SINGLE_BLOCK_SIZE; + return HDF_SUCCESS; +} + +bool HdmiEdidSupportFrl(struct HdmiDevice *hdmi) +{ + if (hdmi == NULL) { + HDF_LOGD("no hdmi sink."); + return false; + } + + if (hdmi->edid.sinkCap.hfVsdbInfo.scdcPresent == true && + hdmi->edid.sinkCap.hfVsdbInfo.maxFrlRate > 0) { + return true; + } + return false; +} + +uint8_t HdmiEdidGetMaxFrlRate(struct HdmiDevice *hdmi) +{ + if (hdmi == NULL) { + HDF_LOGD("no hdmi sink."); + return 0; + } + return hdmi->edid.sinkCap.hfVsdbInfo.maxFrlRate; +} + +bool HdmiEdidScdcSupport(struct HdmiDevice *hdmi) +{ + if (hdmi == NULL) { + HDF_LOGD("no hdmi sink."); + return false; + } + return hdmi->edid.sinkCap.hfVsdbInfo.scdcPresent; +} diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c new file mode 100644 index 000000000..19e222659 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_event.c @@ -0,0 +1,266 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" +#include "osal_mem.h" + +#define HDF_LOG_TAG hdmi_event_c + +static int32_t HdmiEventPostMsg(struct HdmiCntlr *cntlr, struct HdmiEventMsg *event) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (event == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + PlatformQueueAddMsg(cntlr->msgQueue, &event->msg); + ret = PlatformMsgWait(&event->msg); + if (event->msg.block == true) { + (void)OsalSemDestroy(&event->msg.sem); + OsalMemFree(event); + } + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiEventPostMsg: wait hdmi event msg fail!"); + return ret; + } + return HDF_SUCCESS; +} + +bool HdmiHpdStatusGet(struct HdmiCntlr *cntlr) +{ + bool ret; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->hotPlugStateGet == NULL) { + return false; + } + + HdmiCntlrLock(cntlr); + ret = cntlr->ops->hotPlugStateGet(cntlr); + HdmiCntlrUnlock(cntlr); + return ret; +} + +bool HdmiHpdStatusDelayGet(struct HdmiCntlr *cntlr) +{ + uint32_t i; + + /* + * An HDMI Sink shall indicate any change to the contents of the EDID by driving a low voltage level pulse + * on the Hot Plug Detect pin. This pluse shall be at least 100 msec. + */ + for (i = 0; i < HDMI_READ_HPD_STATUS_DELAY; i++) { + if (HdmiHpdStatusGet(cntlr) == true) { + return true; + } + OsalMSleep(1); + } + return false; +} + +int32_t HdmiAddEventMsgToQueue(struct HdmiCntlr *cntlr, int32_t code, bool block, void *data) +{ + struct HdmiEventMsg *event = NULL; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + event = (struct HdmiEventMsg *)OsalMemCalloc(sizeof(struct HdmiEventMsg)); + if (event == NULL) { + HDF_LOGE("HdmiAddEventMsgToQueue: OsalMemCalloc fail!n"); + return HDF_ERR_MALLOC_FAIL; + } + event->msg.code = code; + event->msg.data = (void *)cntlr; + event->msg.block = block; + event->priv = data; + return HdmiEventPostMsg(cntlr, event); +} + +static int32_t HdmiEventHotPlugHandleComm(struct HdmiCntlr *cntlr) +{ + int32_t ret; + + cntlr->event.plugged = true; + if (cntlr->hdmi == NULL) { + ret = HdmiCntlrAllocDev(cntlr); + if (ret != HDF_SUCCESS) { + goto __END; + } + HDF_LOGE("HdmiEventHotPlugHandleComm HdmiCntlrAllocDev success."); + } + + /* Update EDID. */ + if (memset_s(cntlr->hdmi, sizeof(struct HdmiDevice), 0, sizeof(struct HdmiDevice)) != EOK) { + HDF_LOGE("memcpy_s fail."); + ret = HDF_ERR_IO; + goto __END; + } + ret = HdmiEdidRawDataRead(&(cntlr->hdmi->edid), &(cntlr->ddc)); + if (ret != HDF_SUCCESS) { + goto __END; + } + ret = HdmiEdidPhase(&(cntlr->hdmi->edid)); + if (ret != HDF_SUCCESS) { + goto __END; + } + +__END: + if (ret != HDF_SUCCESS) { + cntlr->event.plugged = false; + cntlr->event.hpdDetected = false; + return ret; + } + cntlr->event.hpdDetected = true; + return HDF_SUCCESS; +} + +static int32_t HdmiEventHotPlugHandle(struct HdmiCntlr *cntlr) +{ + if (HdmiHpdStatusDelayGet(cntlr) == false) { + HDF_LOGD("not detect HPD."); + return HDF_ERR_IO; + } + + if (cntlr->event.plugged == true) { + HDF_LOGD("hdp state not change"); + return HDF_SUCCESS; + } + return HdmiEventHotPlugHandleComm(cntlr); +} + +static int32_t HdmiEventHotUnplugHandle(struct HdmiCntlr *cntlr) +{ + if (cntlr->event.plugged == false) { + HDF_LOGD("plug state not change"); + return HDF_SUCCESS; + } + + HdmiCntlrClose(cntlr); + HdmiCntlrFreeDev(cntlr); + cntlr->event.plugged = false; + cntlr->event.hpdDetected = false; + return HDF_SUCCESS; +} + +static int32_t HdmiEventDetectSinkHandle(struct HdmiCntlr *cntlr) +{ + if (HdmiHpdStatusDelayGet(cntlr) == false) { + HDF_LOGD("not detect HPD."); + return HDF_SUCCESS; + } + return HdmiEventHotPlugHandleComm(cntlr); +} + +static int32_t HdmiEventCecMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) +{ + if (msg == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + return HdmiCecReceivedMsg(cntlr->cec, msg); +} + +static int32_t HdmiEventHdrZeroDrmIfTimeout(struct HdmiCntlr *cntlr) +{ + return HdmiHdrDrmInfoframeStop(cntlr->hdr); +} + +static int32_t HdmiEventSwitchToHdrModeTimeout(struct HdmiCntlr *cntlr) +{ + return HdmiHdrModeChangeTimeout(cntlr->hdr); +} + +int32_t HdmiEventMsgHandleDefault(struct PlatformQueue *queue, struct PlatformMsg *msg) +{ + int32_t ret; + struct HdmiCntlr *cntlr = NULL; + struct HdmiEventMsg *event = NULL; + + if (queue == NULL || msg == NULL) { + HDF_LOGE("HdmiEventMsgHandleDefault: msg or queue is null!"); + return HDF_ERR_INVALID_OBJECT; + } + + cntlr = (struct HdmiCntlr *)queue->data; + if (cntlr == NULL) { + HDF_LOGE("HdmiEventMsgHandleDefault: cntlr is null!"); + return HDF_ERR_INVALID_OBJECT; + } + event = (struct HdmiEventMsg *)msg; + switch (msg->code) { + case HDMI_EVENT_HOTPLUG : + ret = HdmiEventHotPlugHandle(cntlr); + break; + case HDMI_EVENT_HOTUNPLUG : + ret = HdmiEventHotUnplugHandle(cntlr); + break; + case HDMI_EVENT_DETECT_SINK : + ret = HdmiEventDetectSinkHandle(cntlr); + break; + case HDMI_EVENT_CEC_MSG: + ret = HdmiEventCecMsgHandle(cntlr, event->priv); + break; + case HDMI_EVENT_ZERO_DRMIF_TIMEOUT : + ret = HdmiEventHdrZeroDrmIfTimeout(cntlr); + break; + case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT : + ret = HdmiEventSwitchToHdrModeTimeout(cntlr); + break; + default: + ret = HDF_ERR_NOT_SUPPORT; + break; + } + + if (event->msg.block == false) { + OsalMemFree(event); + } + return ret; +} + +int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void *data) +{ + int32_t ret = HDF_SUCCESS; + + if (cntlr == NULL) { + HDF_LOGE("HdmiEventHandleIrq: cntlr is null!"); + return HDF_ERR_INVALID_OBJECT; + } + switch (event) { + case HDMI_EVENT_HOTPLUG : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HOTPLUG, false, data); + break; + case HDMI_EVENT_HOTUNPLUG : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HOTUNPLUG, false, data); + break; + case HDMI_EVENT_DETECT_SINK : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_DETECT_SINK, false, data); + break; + case HDMI_EVENT_CEC_MSG : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_CEC_MSG, false, data); + break; + case HDMI_EVENT_HDCP_MSG : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HDCP_MSG, false, data); + break; + case HDMI_EVENT_ZERO_DRMIF_TIMEOUT : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_ZERO_DRMIF_TIMEOUT, false, data); + break; + case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT : + ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT, false, data); + break; + default : + HDF_LOGE("event %d is not support", event); + break; + } + return ret; +} diff --git a/support/platform/src/hdmi/hdmi_frl.c b/support/platform/src/hdmi/hdmi_frl.c new file mode 100644 index 000000000..58eb823c1 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_frl.c @@ -0,0 +1,869 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" +#include "hdmi_common.h" +#include "hdmi_dfm.h" +#include "hdmi_ncts.h" + +#define HDF_LOG_TAG hdmi_frl_c + +static uint8_t HdmiFrlGetSinkVersion(struct HdmiScdc *scdc) +{ + uint8_t version = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_SINK_VER, &version, sizeof(version)) != HDF_SUCCESS) { + HDF_LOGD("frl get sink version fail"); + return 0; + } + return version; +} + +static bool HdmiFrlGetFltUpdate(struct HdmiScdc *scdc) +{ + bool fltUpdate = false; + uint8_t flag = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl get flt update fail"); + return fltUpdate; + } + + fltUpdate = (flag & HDMI_SCDC_FLT_UPDATE_MARK) ? true : false; + return fltUpdate; +} + +static bool HdmiFrlGetFrlStart(struct HdmiScdc *scdc) +{ + bool frlStart = false; + uint8_t flag = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl get frl start fail"); + return frlStart; + } + + frlStart = (flag & HDMI_SCDC_FRL_START_MARK) ? true : false; + return frlStart; +} + +static bool HdmiFrlGetFltReady(struct HdmiScdc *scdc) +{ + bool fltReady = false; + uint8_t flag = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_READY, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl get flt ready fail"); + return fltReady; + } + + fltReady = (flag & HDMI_SCDC_FLT_READY_MARK) ? true : false; + return fltReady; +} + +static uint8_t HdmiFrlGetTestConfig1(struct HdmiScdc *scdc) +{ + uint8_t cfg = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_TEST_CONFIG_1, &cfg, sizeof(cfg)) != HDF_SUCCESS) { + HDF_LOGD("frl get test cfg1 fail"); + return 0; + } + return cfg; +} + +static void HdmiFrlSetFltUpdate(struct HdmiScdc *scdc, bool fltUpdate) +{ + uint8_t flag = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl get flt update fail"); + return; + } + + if (fltUpdate == true) { + flag |= HDMI_SCDC_FLT_UPDATE_MARK; + } else { + flag &= (~HDMI_SCDC_FLT_UPDATE_MARK); + } + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_SET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl set flt update fail"); + } +} + +static void HdmiFrlSetFrlStart(struct HdmiScdc *scdc, bool frlStart) +{ + uint8_t flag = 0; + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl get frl start fail"); + return; + } + + if (frlStart == true) { + flag |= HDMI_SCDC_FRL_START_MARK; + } else { + flag &= (~HDMI_SCDC_FRL_START_MARK); + } + + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_GET_FLT_UPDATE, &flag, sizeof(flag)) != HDF_SUCCESS) { + HDF_LOGD("frl set frl start fail"); + } +} + +static void HdmiFrlSetConfig1(struct HdmiScdc *scdc, uint8_t *data) +{ + if (HdmiScdcOptMsgHandle(scdc, HDMI_SCDC_OPT_SET_CONFIG1, data, sizeof(*data)) != HDF_SUCCESS) { + HDF_LOGD("frl set cfg1 fail"); + } +} + +static void HdmiFrlSetTrainRate(struct HdmiFrl *frl) +{ + union HdmiScdcsConfig1 cfg = {0}; + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr == NULL) { + HDF_LOGE("frl set train rate fail"); + return; + } + + if (frl->info.mode == HDMI_FRL_MODE_FRL) { + cfg.bits.frlRate = frl->info.curFrlRate; + cfg.bits.ffeLevels = HDMI_FRL_TXFFE_MODE_0; + } + HdmiFrlSetConfig1(cntlr->scdc, &(cfg.data)); +} + +static bool HdmiFrlCheckFrlCapability(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + uint8_t sinkScdcVerion; + uint8_t sinkMaxFrlRate; + + sinkScdcVerion = HdmiFrlGetSinkVersion(cntlr->scdc); + if (HdmiEdidSupportFrl(cntlr->hdmi) != true || + cntlr->cap.baseCap.bits.hdmi21 == 0 || + cntlr->cap.baseCap.bits.frl == 0 || + sinkScdcVerion == 0) { + frl->info.maxFrlRate = 0; + return HDF_ERR_NOT_SUPPORT; + } + sinkMaxFrlRate = HdmiEdidGetMaxFrlRate(cntlr->hdmi); + frl->info.maxFrlRate = (sinkMaxFrlRate > cntlr->cap.maxFrlRate) ? cntlr->cap.maxFrlRate : sinkMaxFrlRate; + return HDF_SUCCESS; +} + +static bool HdmiFrlCheckFrlStrategy(enum HdmiFrlStrategyMode strategy, uint32_t pixelClock, + uint32_t tmdsClock, enum HdmiVideoFormatType formatType) +{ + bool support = true; + + switch (strategy) { + case HDMI_FRL_STRATEGY_MODE_1 : + if (pixelClock <= HDMI_HDMI20_MAX_TMDS_RATE && tmdsClock <= HDMI_HDMI20_MAX_TMDS_RATE) { + support = false; + } + break; + case HDMI_FRL_STRATEGY_MODE_2 : + if (tmdsClock <= HDMI_HDMI14_MAX_TMDS_RATE) { + support = false; + } + break; + case HDMI_FRL_STRATEGY_MODE_3 : + if (formatType == HDMI_VIDEO_FORMA_INTERLACE) { + support = false; + } + break; + default : + HDF_LOGE("strategy %d is not support", strategy); + break; + } + return support; +} + +static void HdmiFrlFillRateInfo(uint32_t *frlBitRate, uint32_t *frlLaneNum, uint32_t frlRate) +{ + *frlLaneNum = HDMI_FRL_4_LANES; + if (frlRate <= HDMI_FRL_WORK_MODE_3L6G) { + *frlLaneNum = HDMI_FRL_3_LANES; + } + + switch (frlRate) { + case HDMI_FRL_WORK_MODE_3L3G : + *frlBitRate = HDMI_FRL_BIT_RATE_3; + break; + case HDMI_FRL_WORK_MODE_3L6G : + case HDMI_FRL_WORK_MODE_4L6G : + *frlBitRate = HDMI_FRL_BIT_RATE_6; + break; + case HDMI_FRL_WORK_MODE_4L8G : + *frlBitRate = HDMI_FRL_BIT_RATE_8; + break; + case HDMI_FRL_WORK_MODE_4L10G : + *frlBitRate = HDMI_FRL_BIT_RATE_10; + break; + case HDMI_FRL_WORK_MODE_4L12G : + *frlBitRate = HDMI_FRL_BIT_RATE_12; + break; + default : + break; + } +} + +static bool HdnmiFrlCheckFrlMode(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiVideoDefInfo *videoInfo = NULL; + struct HdmiDfmParam param = {0}; + bool enable3d; + uint32_t i; + + enable3d = (cntlr->attr.videoAttr._3dStruct >= HDMI_VS_VIDEO_3D_BUTT) ? false : true; + videoInfo = HdmiCommonGetVideoDefInfo(cntlr->attr.videoAttr.timing, cntlr->attr.videoAttr.aspect, enable3d); + if (videoInfo == NULL) { + HDF_LOGD("have no this video param, use tmds to transmit."); + return false; + } + HDF_LOGD("use frl to transmit, vic is %d.", videoInfo->vic); + + frl->info.tmdsClock = cntlr->attr.videoAttr.tmdsClock; + if (HdmiFrlCheckFrlStrategy(frl->info.strategy, cntlr->attr.videoAttr.pixelClock, + frl->info.tmdsClock, videoInfo->formatType) == false) { + return false; + } + + if (frl->info.maxFrlRate > HDMI_FRL_WORK_MODE_4L12G) { + HDF_LOGD("max frl rate is wrong(%u)", frl->info.maxFrlRate); + frl->info.maxFrlRate = HDMI_FRL_WORK_MODE_4L12G; + return true; + } + + /* Check whether a particular video format can be transmitted in a particular FRL configuration. */ + HdmiDfmFillParam(¶m, videoInfo, &(cntlr->attr.audioAttr), cntlr->attr.commAttr.colorSpace, + cntlr->attr.commAttr.deepColor); + for (i = frl->info.maxFrlRate; i > 0; i--) { + HdmiFrlFillRateInfo(&(param.bitRate), &(param.laneNum), i); + if (HdmiDfmFormatSupport(¶m) == true) { + frl->info.minFrlRate = i; + HDF_LOGD("min_rate: %d", i); + } else { + break; + } + } + if (i == frl->info.maxFrlRate) { + return false; + } + return true; +} + +static bool HdmiFrlIsCtsMode(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + union HdmiScdcsTestConfig1 cfg = {0}; + + cfg.data = HdmiFrlGetTestConfig1(cntlr->scdc); + if ((cfg.bits.frlMax > 0 && cfg.bits.dscFrlMax == 0) || + (cfg.bits.frlMax == 0 && cfg.bits.dscFrlMax > 0)) { + return true; + } + return false; +} + +static int32_t HdmiFrlGetCurRate(struct HdmiFrl *frl) +{ + uint8_t curFrlrate = frl->info.curFrlRate; + + if (frl->info.ctsMode == true) { + frl->info.preFrlRate = curFrlrate; + curFrlrate = frl->info.maxFrlRate; + } else { + if (frl->info.preFrlRate != 0) { + curFrlrate = frl->info.preFrlRate; + frl->info.preFrlRate = 0; + } else { + if (frl->info.rateSelect == HDMI_FRL_RATE_BIG) { + curFrlrate--; + } else { + curFrlrate++; + } + } + } + + if ((curFrlrate > frl->info.maxFrlRate) || + (curFrlrate < frl->info.minFrlRate)) { + return HDF_FAILURE; + } + frl->info.curFrlRate = curFrlrate; + return HDF_SUCCESS; +} + +static void HdmiFrlAudioNctsSet(struct HdmiFrl *frl) +{ + struct HdmiFrlAudioNctsConfig cfg = {0}; + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->audioNctsSet == NULL) { + HDF_LOGD("not support set frl audio ncts."); + return; + } + + cfg.mode = frl->info.mode; + cfg.sampleRate = cntlr->attr.audioAttr.sampleRate; + if (cfg.mode == HDMI_FRL_MODE_FRL) { + cfg.frlRate = frl->info.curFrlRate; + } else { + cfg.pixelClk = cntlr->attr.videoAttr.pixelClock; + cfg.n = HdmiGetN(cfg.sampleRate, cfg.pixelClk); + cfg.cts = HdmiGetCts(cfg.sampleRate, cfg.pixelClk); + } + HdmiCntlrLock(cntlr); + cntlr->ops->audioNctsSet(cntlr, &cfg); + HdmiCntlrUnlock(cntlr); +} + +static void HdmiFrlTxffeSet(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiPhyCfg cfg = {0}; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->phyOutputSet == NULL) { + HDF_LOGD("not support phy output set."); + return; + } + + cfg.modeCfg = HDMI_PHY_MODE_TXFFE; + cfg.rate = (enum HdmiFrlWorkMode)frl->info.curFrlRate; + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputSet(cntlr, &cfg); + HdmiCntlrUnlock(cntlr); +} + +static void HdmiFrlphyConfigSet(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiPhyCfg cfg = {0}; + + if (cntlr == NULL || cntlr->ops == NULL) { + return; + } + + cfg.tmdsClk = cntlr->attr.videoAttr.tmdsClock; + cfg.pixelClk = cntlr->attr.videoAttr.pixelClock; + cfg.deepColor = cntlr->attr.videoAttr.deepColor; + cfg.colorSpace = cntlr->attr.commAttr.colorSpace; + if (frl->info.mode == HDMI_FRL_MODE_FRL) { + cfg.modeCfg = HDMI_PHY_MODE_FRL; + cfg.rate = (enum HdmiFrlWorkMode)frl->info.curFrlRate; + } + + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, false); + HdmiCntlrUnlock(cntlr); + } + if (cntlr->ops->phyOutputSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputSet(cntlr, &cfg); + HdmiCntlrUnlock(cntlr); + } + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, true); + HdmiCntlrUnlock(cntlr); + } +} + +static void HdmiFrlStateMachineChangeState(struct HdmiFrl *frl, enum HdmiFrlTrainStep state) +{ + /* change state machine's state */ + frl->info.machineInfo.trainingState = state; + /* restart timer */ + frl->info.machineInfo.startTime = OsalGetSysTimeMs(); +} + +static void HdmiFrlTrainingReadyCheck(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (HdmiFrlGetFltReady(cntlr->scdc) == true) { + HDF_LOGD("step, ready chack pass, start training."); + HdmiFrlphyConfigSet(frl); + HdmiFrlSetTrainRate(frl); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + } +} + +static void HdmiFrlConfigAndStartTraining(struct HdmiFrl *frl) +{ + struct HdmiFrlTrainConfig cfg = {0}; + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + union HdmiScdcsTestConfig1 testCfg = {0}; + + if (cntlr == NULL || cntlr->ops == NULL) { + return; + } + + cfg.frlRate = frl->info.curFrlRate; + cfg.txffe = HDMI_FRL_TXFFE_MODE_0; + testCfg.data = HdmiFrlGetTestConfig1(cntlr->scdc); + if (testCfg.bits.fltNoTimeout > 0) { + cfg.frlNoTimeout = true; + } + cfg.trainTimeout = frl->info.machineInfo.trainTimeout; + + if (cntlr->ops->frlTrainingConfigSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->frlTrainingConfigSet(cntlr, &cfg); + HdmiCntlrUnlock(cntlr); + } + if (cntlr->ops->frlEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->frlEnable(cntlr, false); + HdmiCntlrUnlock(cntlr); + } + if (cntlr->ops->frlTrainingStart != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->frlTrainingStart(cntlr); + HdmiCntlrUnlock(cntlr); + } + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RESULT_CHECK); + return; +} + +static void HdmiFrlTrainingResultCheck(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiFrlTrainRslt rslt = {0}; + + if (cntlr != NULL && cntlr->ops != NULL && cntlr->ops->frlGetTriningRslt != NULL) { + cntlr->ops->frlGetTriningRslt(cntlr, &rslt); + } + + if (rslt.status == HDMI_FRL_TRAIN_STATUS_SUCC) { + frl->info.trainingFailCnt = 0; + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RESULT_HANDLE); + } else if (rslt.failReason == HDMI_FRL_TRAIN_FAIL_FFE_CHANGE) { + frl->info.trainingFailCnt = 0; + HdmiFrlTxffeSet(frl); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + } else if (rslt.failReason == HDMI_FRL_TRAIN_FAIL_RATE_CHANGE) { + frl->info.trainingFailCnt = 0; + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RATE_CHANGE); + } else { + (frl->info.trainingFailCnt)++; + } +} + +static void HdmiFrlTrainingException(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiPhyCfg cfg = {0}; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, false); + } + + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_STOP); + frl->info.start = false; + /* TMDS config. */ + cfg.pixelClk = cntlr->attr.videoAttr.pixelClock; + cfg.tmdsClk = cntlr->attr.videoAttr.tmdsClock; + cfg.deepColor = cntlr->attr.videoAttr.deepColor; + cfg.modeCfg = HDMI_PHY_MODE_TMDS; + cfg.colorSpace = cntlr->attr.commAttr.colorSpace; + HDF_LOGD("FRL change to TMDS."); + if (cfg.tmdsClk > HDMI_HDMI20_MAX_TMDS_RATE) { + HDF_LOGE("TMDS clk > 600M. can't work TMDS mode."); + return; + } + frl->info.mode = HDMI_FRL_MODE_TMDS; + HdmiFrlSetTrainRate(frl); + HdmiFrlAudioNctsSet(frl); + + if (cntlr->ops->phyOutputSet != NULL) { + cntlr->ops->phyOutputSet(cntlr, &cfg); + } + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, true); + } +} + +static void HdmiFrlTrainingRateChange(struct HdmiFrl *frl) +{ + frl->info.ctsMode = HdmiFrlIsCtsMode(frl); + if (HdmiFrlGetCurRate(frl) != HDF_SUCCESS) { + HDF_LOGE("FRL rate %u get failed!\n", frl->info.curFrlRate); + HdmiFrlTrainingException(frl); + return; + } + /* FRL rate change */ + HdmiFrlphyConfigSet(frl); + HdmiFrlSetTrainRate(frl); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); +} + +static void HdmiFrlTrainingPassedCheck(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + + if (frl->info.start == false || + HdmiFrlGetFrlStart(cntlr->scdc) == false) { + return; + } + + HDF_LOGD("FRL training passed."); + frl->info.work = true; + /* n/cts config */ + HdmiFrlAudioNctsSet(frl); + OsalMSleep(1); + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); + HdmiCntlrUnlock(cntlr); + } + OsalMSleep(1); + HdmiFrlSetFrlStart(cntlr->scdc, true); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK); +} + +static void HdmiFrlRetrainingCheck(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + if (HdmiFrlGetFltUpdate(cntlr->scdc) == false) { + return; + } + + HDF_LOGD("FRL retraining flt_update get OK"); + HdmiFrlSetFltUpdate(cntlr->scdc, true); + frl->info.work = false; + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); + HdmiCntlrUnlock(cntlr); + } + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); +} + +static void HdmiFrlTrainingStop(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + + frl->info.work = false; + if (cntlr->ops->phyOutputEnable != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); + HdmiCntlrUnlock(cntlr); + } + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_BUTT); +} + +void HdmiFrlTrainingStateMachineHandle(struct HdmiFrl *frl) +{ + if (frl == NULL) { + HDF_LOGE("FRL trining, not support FRL."); + return; + } + + switch (frl->info.machineInfo.trainingState) { + case HDMI_FRL_TRAIN_STEP_READR_CHECK : + HdmiFrlTrainingReadyCheck(frl); + break; + case HDMI_FRL_TRAIN_STEP_TRAIN_START : + HdmiFrlConfigAndStartTraining(frl); + break; + case HDMI_FRL_TRAIN_STEP_RESULT_CHECK : + HdmiFrlTrainingResultCheck(frl); + break; + case HDMI_FRL_TRAIN_STEP_RATE_CHANGE : + HdmiFrlTrainingRateChange(frl); + break; + case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE : + HdmiFrlTrainingPassedCheck(frl); + break; + case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK : + HdmiFrlRetrainingCheck(frl); + break; + case HDMI_FRL_TRAIN_STEP_TRAIN_STOP : + HdmiFrlTrainingStop(frl); + break; + default : + break; + } +} + +static void HdmiFrlTrainingReadyCheckTimeout(struct HdmiFrl *frl) +{ + uint64_t curTime = OsalGetSysTimeMs(); + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if ((curTime - frl->info.machineInfo.startTime) > frl->info.machineInfo.waitReadyTime) { + if (HdmiFrlGetFltReady(cntlr->scdc) == true) { + HDF_LOGD("step, ready chack pass, start training."); + frl->info.machineInfo.timeoutCnt = 0; + HdmiFrlphyConfigSet(frl); + HdmiFrlSetTrainRate(frl); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + } else { + (frl->info.machineInfo.timeoutCnt)++; + /* */ + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_READR_CHECK); + } + } else { + /* wait for a maximum of 10 times, (wait_ready_ms * 10) ms */ + if (frl->info.machineInfo.timeoutCnt < 10) { + return; + } + HDF_LOGD("FRL training READY_CHECK exception."); + frl->info.machineInfo.timeoutCnt = 0; + HdmiFrlTrainingException(frl); + } +} + +static void HdmiFrlTrainingResultCheckTimeout(struct HdmiFrl *frl) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + struct HdmiFrlTrainRslt rslt = {0}; + + if (cntlr != NULL && cntlr->ops != NULL && cntlr->ops->frlGetTriningRslt != NULL) { + cntlr->ops->frlGetTriningRslt(cntlr, &rslt); + } + + if (rslt.status == HDMI_FRL_TRAIN_STATUS_SUCC) { + frl->info.trainingFailCnt = 0; + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RESULT_HANDLE); + } else if (rslt.failReason == HDMI_FRL_TRAIN_FAIL_FFE_CHANGE) { + frl->info.trainingFailCnt = 0; + HdmiFrlTxffeSet(frl); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + } else if (rslt.failReason == HDMI_FRL_TRAIN_FAIL_RATE_CHANGE) { + frl->info.trainingFailCnt = 0; + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RATE_CHANGE); + } else { + (frl->info.trainingFailCnt)++; + if (frl->info.trainingFailCnt > frl->info.trainingMaxFailTimes) { + frl->info.trainingFailCnt = 0; + HdmiFrlTrainingException(frl); + } else { + /* not reach max fail times, re-training. */ + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + } + } +} + +static void HdmiFrlTrainingResultHandleTimeout(struct HdmiFrl *frl) +{ + uint64_t curTime; + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + + do { + if (HdmiFrlGetFrlStart(cntlr->scdc) == true) { + if (frl->info.start == true) { + frl->info.work = true; + /* n/cts config */ + HdmiFrlAudioNctsSet(frl); + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); + } + HdmiFrlSetFrlStart(cntlr->scdc, true); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK); + break; + } + } else if (HdmiFrlGetFltUpdate(cntlr->scdc) == true) { + HdmiFrlSetFltUpdate(cntlr->scdc, true); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); + break; + } + + curTime = OsalGetSysTimeMs(); + if ((curTime - frl->info.machineInfo.startTime) > frl->info.machineInfo.waitHandleTime) { + (frl->info.machineInfo.timeoutCnt)++; + break; + } + /* check the sink's status every 2ms required by protocol */ + OsalUDelay(2000); + } while (true); + + if (frl->info.machineInfo.timeoutCnt >= 3) { + HDF_LOGE("FRL training timeout."); + frl->info.machineInfo.timeoutCnt = 0; + HdmiFrlTrainingException(frl); + } +} + +static void HdmiFrlRetrainingCheckTimeout(struct HdmiFrl *frl) +{ + uint64_t curTime = OsalGetSysTimeMs(); + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; + + if (cntlr != NULL || cntlr->ops != NULL) { + return; + } + if ((curTime - frl->info.machineInfo.startTime) <= frl->info.machineInfo.waitRetrainTime) { + return; + } + if (HdmiFrlGetFltUpdate(cntlr->scdc) != true) { + return; + } + + HdmiFrlSetFltUpdate(cntlr->scdc, true); + frl->info.work = true; + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); + } + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); +} + +void HdmiFrlTrainingStateMachineTimeoutHandle(struct HdmiFrl *frl) +{ + if (frl == NULL || frl->priv == NULL) { + HDF_LOGE("FRL trining, not support FRL."); + return; + } + + switch (frl->info.machineInfo.trainingState) { + case HDMI_FRL_TRAIN_STEP_READR_CHECK : + HdmiFrlTrainingReadyCheckTimeout(frl); + break; + case HDMI_FRL_TRAIN_STEP_TRAIN_START : + HdmiFrlConfigAndStartTraining(frl); + break; + case HDMI_FRL_TRAIN_STEP_RESULT_CHECK : + HdmiFrlTrainingResultCheckTimeout(frl); + break; + case HDMI_FRL_TRAIN_STEP_RATE_CHANGE : + HdmiFrlTrainingRateChange(frl); + break; + case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE : + HdmiFrlTrainingResultHandleTimeout(frl); + break; + case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK : + HdmiFrlRetrainingCheckTimeout(frl); + break; + case HDMI_FRL_TRAIN_STEP_TRAIN_STOP : + HdmiFrlTrainingStop(frl); + break; + default : + break; + } +} + +void HdmiFrlEnable(struct HdmiFrl *frl, bool enable) +{ + if (frl == NULL || frl->priv == NULL) { + return; + } + + frl->info.start = enable; + frl->info.machineInfo.start = enable; + frl->info.machineInfo.machineState = (enable == true) ? HDMI_FRL_STATE_MACHINE_START : HDMI_FRL_STATE_MACHINE_STOP; + frl->info.ctsMode = HdmiFrlIsCtsMode(frl); + if (frl->info.ctsMode == true) { + HdmiFrlGetCurRate(frl); + HDF_LOGD("frl cur rate %d", frl->info.curFrlRate); + } + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_READR_CHECK); +} + +int32_t HdmiFrlModeSelect(struct HdmiFrl *frl) +{ + int32_t ret; + struct HdmiCntlr *cntlr = NULL; + struct HdmiVideoAttr *videoAttr = NULL; + + if (frl == NULL || frl->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiFrlCheckFrlCapability(frl); + if (ret == HDF_FAILURE) { + return ret; + } else if (ret != HDF_SUCCESS) { + HDF_LOGD("frl check capability fail, change to TMDS."); + frl->info.mode = HDMI_FRL_MODE_TMDS; + } else { + if (HdnmiFrlCheckFrlMode(frl) == true) { + HDF_LOGD("frl check frl mode succ."); + frl->info.mode = HDMI_FRL_MODE_FRL; + } else { + HDF_LOGD("frl check frl mode fail, change to TMDS."); + frl->info.mode = HDMI_FRL_MODE_TMDS; + } + } + + cntlr = (struct HdmiCntlr *)frl->priv; + videoAttr = &(cntlr->attr.videoAttr); + if (frl->info.mode == HDMI_FRL_MODE_TMDS) { + if (videoAttr->tmdsClock > HDMI_HDMI20_MAX_TMDS_RATE) { + HDF_LOGE("FRL mode select, tmds Clock exceed max."); + return HDF_FAILURE; + } + if (HdmiEdidScdcSupport(cntlr->hdmi) == true) { + HdmiFrlSetTrainRate(frl); + } + return HDF_SUCCESS; + } + + /* FRL mode. */ + frl->info.curFrlRate = (frl->info.rateSelect == HDMI_FRL_RATE_BIG) ? + frl->info.maxFrlRate : frl->info.minFrlRate; + cntlr->tmdsMode = HDMI_TMDS_MODE_HDMI_2_0; + if (cntlr->ops != NULL && cntlr->ops->tmdsModeSet != NULL) { + HdmiCntlrLock(cntlr); + cntlr->ops->tmdsModeSet(cntlr, cntlr->tmdsMode); + HdmiCntlrUnlock(cntlr); + } + frl->info.ctsMode = false; + return HDF_SUCCESS; +} + +bool HdmiFrlModeChanged(struct HdmiFrl *frl) +{ + if (frl == NULL) { + return false; + } + + if (frl->info.perMode != frl->info.mode) { + frl->info.perMode = frl->info.mode; + return true; + } + return false; +} + +bool HdmiFrlSupport(struct HdmiFrl *frl) +{ + if (frl == NULL) { + return false; + } + + if (frl->info.mode == HDMI_FRL_MODE_FRL) { + return true; + } + return false; +} diff --git a/support/platform/src/hdmi/hdmi_hdcp.c b/support/platform/src/hdmi/hdmi_hdcp.c new file mode 100644 index 000000000..b642d47d6 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_hdcp.c @@ -0,0 +1,463 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" + +#define HDF_LOG_TAG hdmi_hdcp_c + +static int32_t HdmiHdcpRead(struct HdmiHdcp *hdcp, enum HdmiHdcpPortOffset offset, uint8_t *buffer, uint32_t len) +{ + struct HdmiDdcCfg cfg = {0}; + struct HdmiCntlr *cntlr = NULL; + + if (hdcp == NULL || hdcp->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)hdcp->priv; + cfg.type = HDMI_DDC_DEV_HDCP; + cfg.readFlag = true; + cfg.devAddr = HDMI_DDC_HDCP_DEV_ADDRESS; + cfg.data = buffer; + cfg.dataLen = len; + cfg.offset = offset; + cfg.mode = HDMI_DDC_MODE_READ_MUTIL_NO_ACK; + return HdmiDdcTransfer(&(cntlr->ddc), &cfg); +} + +static int32_t HdmiHdcpWrite(struct HdmiHdcp *hdcp, enum HdmiHdcpPortOffset offset, uint8_t *buffer, uint32_t len) +{ + struct HdmiDdcCfg cfg = {0}; + struct HdmiCntlr *cntlr = NULL; + + if (hdcp == NULL || hdcp->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)hdcp->priv; + cfg.type = HDMI_DDC_DEV_HDCP; + cfg.readFlag = false; + cfg.devAddr = HDMI_DDC_HDCP_DEV_ADDRESS; + cfg.data = buffer; + cfg.dataLen = len; + cfg.offset = offset; + cfg.mode = HDMI_DDC_MODE_WRITE_MUTIL_ACK; + return HdmiDdcTransfer(&(cntlr->ddc), &cfg); +} + +static bool HdmiHdcpCheckKvs(uint8_t *ksv, uint32_t len) +{ + uint32_t i, j; + uint32_t cnt = 0; + + for (i = 0; i < len; i++) { + for (j = 0; j < HDMI_ONE_BYTE_SHIFT; j++) { + if (((ksv[i] >> j) & 0x01) > 0) { + cnt++; + } + } + } + /* KSV contains 20 ones and 20 zeros. */ + if (cnt != HDMI_HDCP_AKSV_ONE_NUM) { + HDF_LOGE("HdmiHdcpCheckKvs: cnt = %d.", cnt); + return false; + } + return true; +} + +static int32_t HdmiHdcpWriteMsgToReg(struct HdmiHdcp *hdcp, enum HdmiHdcpRegOptType type, uint8_t *data, uint32_t len) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)hdcp->priv; + + if (cntlr->ops == NULL || cntlr->ops->hdcpOptReg == NULL) { + HDF_LOGD("not support hdcp write reg."); + return HDF_ERR_INVALID_PARAM; + } + return cntlr->ops->hdcpOptReg(cntlr, type, data, len); +} + +static int32_t HdmiHdcpReadMsgBksv(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_BKSV, hdcp->bksv, sizeof(hdcp->bksv)); + if (ret != HDF_SUCCESS) { + return ret; + } + if (HdmiHdcpCheckKvs(hdcp->bksv, sizeof(hdcp->bksv)) == false) { + HDF_LOGE("auth part I: bksv check fail."); + return HDF_ERR_INVALID_PARAM; + } + return HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BKSV, hdcp->bksv, sizeof(hdcp->bksv)); +} + +static int32_t HdmiHdcpReadMsgRi(struct HdmiHdcp *hdcp) +{ + int32_t ret; + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_RI, hdcp->ri, sizeof(hdcp->ri)); + if (ret != HDF_SUCCESS) { + return ret; + } + return HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_RI, hdcp->ri, sizeof(hdcp->ri)); +} + +static int32_t HdmiHdcpWriteMsgAksv(struct HdmiHdcp *hdcp) +{ + if (HdmiHdcpCheckKvs(hdcp->aksv, sizeof(hdcp->aksv)) == false) { + HDF_LOGE("auth part I: aksv check fail."); + return HDF_ERR_INVALID_PARAM; + } + return HdmiHdcpWrite(hdcp, HDMI_HDCP_AN, hdcp->aksv, sizeof(hdcp->aksv)); +} + +static int32_t HdmiHdcpWriteMsgAn(struct HdmiHdcp *hdcp) +{ + return HdmiHdcpWrite(hdcp, HDMI_HDCP_AN, hdcp->an, sizeof(hdcp->an)); +} + +static int32_t HdmiHdcpReadMsgHv(struct HdmiHdcp *hdcp) +{ + uint8_t offset, i; + uint8_t vhNum = HDMI_HDCP_MSG_ALL_VH_LEN / HDMI_HDCP_MSG_PER_VH_LEN; + int32_t ret; + + if (hdcp == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + for (i = 0; i < vhNum; i++) { + offset = HDMI_HDCP_V_H0 + i * HDMI_HDCP_MSG_PER_VH_LEN; + ret = HdmiHdcpRead(hdcp, offset, &(hdcp->vh[i]), HDMI_HDCP_MSG_PER_VH_LEN); + if (ret != HDF_SUCCESS) { + return ret; + } + } + return HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_V_H_ALL, hdcp->vh, sizeof(hdcp->vh)); +} + +static int32_t HdmiHdcpReadMsgBcaps(struct HdmiHdcp *hdcp) +{ + int32_t ret; + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); + if (ret != HDF_SUCCESS) { + return ret; + } + return HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); +} + +static int32_t HdmiHdcpAuthenticationGenerateAksvAn(struct HdmiHdcp *hdcp) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)hdcp->priv; + + if (cntlr->ops == NULL || cntlr->ops->hdcpGenerateAksvAndAn == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + return cntlr->ops->hdcpGenerateAksvAndAn(cntlr); +} + +static void HdmiHdcpRegPrepare(struct HdmiHdcp *hdcp) +{ + struct HdmiCntlr *cntlr = (struct HdmiCntlr *)hdcp->priv; + + if (cntlr->ops == NULL || cntlr->ops->hdcpRegInit == NULL) { + return; + } + cntlr->ops->hdcpRegInit(cntlr); +} + +static int32_t HdmiHdcpAuthenticationPrepare(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + HdmiHdcpRegPrepare(hdcp); + if (hdcp->aksvValid == false) { + ret = HdmiHdcpAuthenticationGenerateAksvAn(hdcp); + if (ret != HDF_SUCCESS) { + hdcp->state = HDMI_HDCP_AUTH_AKSV_INVALID; + return ret; + } + } + hdcp->aksvValid = true; + return HDF_SUCCESS; +} + +static int32_t HdmiHdcpAuthenticationFirstPart(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + hdcp->state = HDMI_HDCP_AUTH_DOING; + /* + * Authentication is initiated by the HDCP Transmitter by sendind an initiation massage containing its KSV(aksv) + * and a 64-bit pseudo-random value(An) generated by the HDCP Cipher function hdcpRngCipher to the HDCP Reciever. + */ + ret = HdmiHdcpWriteMsgAksv(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + ret = HdmiHdcpWriteMsgAn(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + + /* + * The HDCP Reciever responds by sending a response message containing the receiver's KSV(bksv) and + * the REPEATER bit, which indicates if the reciever is an HDCP Repeater. + */ + ret = HdmiHdcpReadMsgBksv(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + ret = HdmiHdcpReadMsgBcaps(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + + /* + * The HDCP Transmitter must not read the R0' value sooner than 100ms after writing Aksv. + */ + OsalMSleep(120); + /* Read R0' */ + ret = HdmiHdcpReadMsgRi(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + + /* Verify R0/R0' matched or not */ + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_CHECK_R, NULL, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("hdcp auth, check V fail."); + return ret; + } + return HDF_SUCCESS; +} + +static int32_t HdmiHdcpAuthenticationCheckBstatus(struct HdmiHdcp *hdcp) +{ + int32_t ret; + uint16_t bstatus; + bool maxDevExceeded, maxCascadeExceeded; + + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_BSTATUS, hdcp->bstatus, sizeof(hdcp->bstatus)); + if (ret != HDF_SUCCESS) { + return ret; + } + + /* phase bstatus. */ + bstatus = (hdcp->bstatus[1] << 8) | hdcp->bstatus[0]; + hdcp->deviceCount = bstatus & HDMI_HDCP_BSTATUS_DEVICE_COUNT_MARK; + maxDevExceeded = (bstatus & HDMI_HDCP_BSTATUS_MAX_DEVS_EXCEEDED_MARK) ? true : false; + maxCascadeExceeded = (bstatus & HDMI_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED_MARK) ? true : false; + if (hdcp->deviceCount == 0) { + HDF_LOGE("hdcp auth, check bstatus, no device attached to the repeater."); + return HDF_DEV_ERR_NO_DEVICE; + } + if (maxDevExceeded == true) { + HDF_LOGE("hdcp auth, check bstatus, exceeds max allowed connected devices."); + return HDF_ERR_IO; + } + if (maxCascadeExceeded == true) { + HDF_LOGE("hdcp auth, check bstatus, exceeds max allowed cascade."); + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +static int32_t HdmiHdcpAuthenticationWaitKsvListReady(struct HdmiHdcp *hdcp) +{ + uint32_t i; + int32_t ret; + bool ready = false; + + /* Set up 5s timer, poll for KSV list ready. Fail if timer expires prior to ready. */ + for (i = 0; i < HDMI_HDCP_WAIT_KSV_LIST_READ_REG_CNT; i++) { + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); + if (ret != HDF_SUCCESS) { + return ret; + } + if ((hdcp->bcaps & HDMI_HDCP_BCAPS_KSV_FIFO_READY_MARK) > 0) { + ready = true; + break; + } + OsalMSleep(HDMI_HDCP_WAIT_KSV_LIST_READ_REG_INTERVAL); + } + if (ready == false) { + return HDF_ERR_TIMEOUT; + } + /* */ + ret = HdmiHdcpAuthenticationCheckBstatus(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BSTATUS, hdcp->bstatus, sizeof(hdcp->bstatus)); + return HDF_SUCCESS; +} + +static int32_t HdmiHdcpAuthenticationReadKsvList(struct HdmiHdcp *hdcp) +{ + int32_t ret; + uint32_t try = HDMI_HDCP_DEFAULT_READ_REG_TRY; + + hdcp->ksvLen = HDMI_HDCP_GET_KSV_LEN(hdcp->deviceCount); + do { + ret = HdmiHdcpRead(hdcp, HDMI_HDCP_KSV_FIFO, hdcp->ksvList, hdcp->ksvLen); + if (ret == HDF_SUCCESS) { + break; + } + OsalMSleep(HDMI_HDCP_WAIT_KSV_LIST_READ_REG_INTERVAL); + try--; + } while (try > 0); + + ret = HdmiHdcpReadMsgHv(hdcp); + if (ret != HDF_SUCCESS) { + return ret; + } + /* We may need to reset SHA before write ksv list. */ + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_RESET_SHA, NULL, 0); + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_KSV_FIFO, hdcp->ksvList, hdcp->ksvLen); + return HDF_SUCCESS; +} + +static int32_t HdmiHdcpAuthenticationSecondPart(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + /* Poll: KSV list ready. */ + ret = HdmiHdcpAuthenticationWaitKsvListReady(hdcp); + if (ret != HDF_SUCCESS) { + HDF_LOGE("hdcp auth, wait ksv list ready fail."); + return ret; + } + + /* Read KSV list */ + ret = HdmiHdcpAuthenticationReadKsvList(hdcp); + if (ret != HDF_SUCCESS) { + HDF_LOGE("hdcp auth, read ksv list fail."); + return ret; + } + + /* Verify V/V' matched or not */ + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_CHECK_V, NULL, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("hdcp auth, check V fail."); + return ret; + } + return HDF_SUCCESS; +} + +static void HdmiHdcpAuthenticationSucc(struct HdmiHdcp *hdcp) +{ + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_DONE, NULL, 0); + hdcp->state = HDMI_HDCP_AUTH_DONE; + hdcp->authRetryCnt = 0; +} + +static void HdmiHdcpAuthenticationFail(struct HdmiHdcp *hdcp) +{ + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_FAIL, NULL, 0); + hdcp->state = HDMI_HDCP_AUTH_FAIL; +} + +static int32_t HdmiHdcpAuthentication(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + if (hdcp == NULL || hdcp->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + /* auth prepare, get aksv and driver clear registers. */ + ret = HdmiHdcpAuthenticationPrepare(hdcp); + if (ret != HDF_SUCCESS) { + goto _END; + } + + /* + * First part of the authentication exchange. + */ + ret = HdmiHdcpAuthenticationFirstPart(hdcp); + if (ret != HDF_SUCCESS) { + goto _END; + } + HDF_LOGD("hdcp auth Part I success."); + /* receiver (0), repeater (1) */ + if ((hdcp->bcaps & HDMI_HDCP_BCAPS_REPEATER_MARK) == 0) { + goto _END; + } + + /* + * The second part of the authentication protocol is required if the HDCP Reciever is an HDCP Repeater. + */ + ret = HdmiHdcpAuthenticationSecondPart(hdcp); + if (ret != HDF_SUCCESS) { + goto _END; + } + +_END: + if (ret == HDF_SUCCESS) { + HdmiHdcpAuthenticationSucc(hdcp); + } else { + HdmiHdcpAuthenticationFail(hdcp); + } + return ret; +} + +static int32_t HdmiHdcpAuthenticationRetry(struct HdmiHdcp *hdcp) +{ + if (hdcp == NULL || hdcp->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (hdcp->authRetryCnt > HDMI_HDCP_AUTH_MAX_RETRY_CNT) { + HDF_LOGE("hdcp auth reach to max cnt, auth fail"); + return HDF_FAILURE; + } + return HdmiHdcpAuthentication(hdcp); +} + +int32_t HdmiHdcpOpen(struct HdmiHdcp *hdcp) +{ + int32_t ret; + + (void)OsalMutexLock(&(hdcp->hdcpMutex)); + hdcp->state = HDMI_HDCP_AUTH_INACTIVE; + hdcp->authRetryCnt = 0; + ret = HdmiHdcpAuthentication(hdcp); + if (ret == HDF_SUCCESS) { + HDF_LOGD("hdcp Authentication success!"); + goto __END; + } + + while (hdcp->authRetryCnt <= HDMI_HDCP_AUTH_MAX_RETRY_CNT) { + ret = HdmiHdcpAuthenticationRetry(hdcp); + if (ret == HDF_SUCCESS) { + goto __END; + } + hdcp->authRetryCnt++; + } + __END : + (void)OsalMutexUnlock(&(hdcp->hdcpMutex)); + return ret; +} + +void HdmiHdcpClose(struct HdmiHdcp *hdcp) +{ + if (hdcp == NULL) { + return; + } + + if (hdcp->state == HDMI_HDCP_AUTH_INACTIVE || + hdcp->state == HDMI_HDCP_AUTH_AKSV_INVALID) { + return; + } + + (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_CLOSE, NULL, 0); + hdcp->state = HDMI_HDCP_AUTH_INACTIVE; + hdcp->authRetryCnt = 0; +} diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c new file mode 100644 index 000000000..fdfa29de1 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" + +#define HDF_LOG_TAG hdmi_hdr_c + +static bool HdmiHdrAttrChange(struct HdmiHdrAttr *curAttr, struct HdmiHdrAttr *oldAttr) +{ + if (memcmp(curAttr, oldAttr, sizeof(struct HdmiHdrAttr)) == 0) { + return false; + } + return true; +} + +static void HdmiHdrColorimetryUpdate(struct HdmiVideoAttr *videoAttr, enum HdmiHdrColormetry colorimetry) +{ + if (colorimetry >= HDMI_HDR_COLORIMETRY_EXTENDED) { + videoAttr->colorimetry = HDMI_COLORIMETRY_EXTENDED; + videoAttr->extColorimetry = (enum HdmiExtendedColorimetry)(colorimetry - + HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_601); + } else { + videoAttr->colorimetry = (enum HdmiColorimetry)colorimetry; + videoAttr->extColorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601; + } +} + +static void HdmiHdrZeroDrmInfoframeTimerSet(struct HdmiCntlr *cntlr, bool start) +{ + struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); + struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); + + hdrInfo->zeroDrmIfTimer.start = false; + hdrInfo->zeroDrmIfTimer.timerType = HDMI_HDR_TIMER_ZERO_DRMIF; + hdrInfo->zeroDrmIfTimer.time = HDMI_ZERO_DRMIF_SEND_TIME; + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->zeroDrmIfTimer)); + if (start == false) { + return; + } + + hdrAttr->eotfType = HDMI_DRM_EOTF_SDR_LUMIN; + hdrAttr->metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1; + if (memset_s(&(hdrAttr->descriptor), sizeof(hdrAttr->descriptor), 0, sizeof(hdrAttr->descriptor)) != EOK) { + HDF_LOGE("memset_s fail"); + return; + } + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), true); + + hdrInfo->zeroDrmIfTimer.start = true; + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->zeroDrmIfTimer)); +} + +static void HdmiHdrModeChangeTimerSet(struct HdmiCntlr *cntlr, bool start) +{ + struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); + + hdrInfo->stateChangeTimer.start = false; + hdrInfo->stateChangeTimer.timerType = HDMI_HDR_TIMER_SDR_TO_HDR10; + hdrInfo->stateChangeTimer.time = HDMI_HDR_STATE_CHANGE_TIME; + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->stateChangeTimer)); + if (start == false) { + return; + } + + hdrInfo->stateChangeTimer.start = true; + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->stateChangeTimer)); +} + +static int32_t HdmiDisableHdr(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *curAttr) +{ + int32_t ret = HDF_SUCCESS; + struct HdmiHdrAttr *oldAttr = &(cntlr->attr.hdrAttr); + struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); + + switch (oldAttr->mode) { + case HDMI_HDR_MODE_DISABLE: + break; + case HDMI_HDR_MODE_CEA_861_3: + *oldAttr = *curAttr; + if (hdrInfo->state != HDMI_HDR_STATE_NONE) { + /* to solve the problem of some TV can not switch smoothly from HDR10 to non-HDR10. */ + if (hdrInfo->state == HDMI_HDR_STATE_OE) { + HdmiCntlrAudioMuteEnable(cntlr, false); + HdmiCntlrBlackDataSet(cntlr, true); + } + HdmiCntlrAvmuteSet(cntlr, true); + if (hdrInfo->state == HDMI_HDR_STATE_OE) { + HdmiCntlrPhyOutputEnablet(cntlr, false); + } + HdmiHdrModeChangeTimerSet(cntlr, true); + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->stateChangeTimer)); + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), false); + } else { + /* start timer, send zero DRMIF and stop after 2 seconds. */ + HdmiHdrZeroDrmInfoframeTimerSet(cntlr, true); + } + break; + case HDMI_HDR_MODE_CEA_861_3_AUTHEN: + case HDMI_HDR_MODE_DOLBY_NORMAL: + case HDMI_HDR_MODE_DOLBY_TUNNELING: + if (oldAttr->mode != HDMI_HDR_MODE_DOLBY_NORMAL) { + commAttr->colorSpace = HDMI_COLOR_SPACE_YCBCR444; + } + videoAttr->quantization = HDMI_QUANTIZATION_RANGE_DEFAULT; + videoAttr->yccQuantization = HDMI_YCC_QUANTIZATION_RANGE_LIMITED; + break; + default: + ret = HDF_FAILURE; + break; + } + return ret; +} + +static void HdmiChangeToHdr(struct HdmiCntlr *cntlr, struct HdmiCommonAttr *commAttr) +{ + struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); + struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); + + HdmiHdrZeroDrmInfoframeTimerSet(cntlr,false); + if (hdrAttr->userMode != HDMI_HDR_USERMODE_HDR10) { + HDF_LOGE("usermode is not HDR10/HLG."); + return; + } + commAttr->drm = true; + + if (hdrInfo->state != HDMI_HDR_STATE_NONE) { + /* to solve the problem of some TV can not switch smoothly from non-HDR10 to HDR10. */ + if (hdrInfo->state == HDMI_HDR_STATE_OE) { + HdmiCntlrAudioMuteEnable(cntlr, false); + HdmiCntlrBlackDataSet(cntlr, true); + } + HdmiCntlrAvmuteSet(cntlr, true); + if (hdrInfo->state == HDMI_HDR_STATE_OE) { + HdmiCntlrPhyOutputEnablet(cntlr, false); + } + hdrInfo->stateChangeTimer.start = true; + hdrInfo->stateChangeTimer.timerType = HDMI_HDR_TIMER_SDR_TO_HDR10; + hdrInfo->stateChangeTimer.time = HDMI_HDR_STATE_CHANGE_TIME; + HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->stateChangeTimer)); + } +} + +static int32_t HdmiHdrModeSelect(struct HdmiCntlr *cntlr) +{ + struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); + struct HdmiCommonAttr *commAttr = &(cntlr->attr.commAttr); + + switch (hdrAttr->mode) { + case HDMI_HDR_MODE_CEA_861_3: + HdmiChangeToHdr(cntlr, commAttr); + commAttr->vsifDolby = false; + break; + case HDMI_HDR_MODE_CEA_861_3_AUTHEN: + /* HDR10 authen mode, HDMI must bypass. */ + if (hdrAttr->userMode != HDMI_HDR_USERMODE_DOLBY) { + HDF_LOGE("user mode is not dolby"); + return HDF_FAILURE; + } + commAttr->drm = true; + commAttr->vsifDolby = false; + break; + case HDMI_HDR_MODE_DOLBY_NORMAL: + case HDMI_HDR_MODE_DOLBY_TUNNELING: + if (hdrAttr->userMode != HDMI_HDR_USERMODE_DOLBY) { + HDF_LOGE("user mode is not dolby"); + return HDF_FAILURE; + } + commAttr->drm = false; + commAttr->vsifDolby = true; + break; + default: + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t HdmiHdrAttrHandle(struct HdmiHdr *hdr, struct HdmiHdrAttr *curAttr) +{ + struct HdmiHdrAttr *oldAttr = NULL; + struct HdmiCommonAttr *commAttr = NULL; + struct HdmiCntlr *cntlr = NULL; + int32_t ret = HDF_FAILURE; + + if (hdr == NULL || hdr->priv == NULL) { + HDF_LOGE("hdr attr handle, input param invalid."); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)hdr->priv; + oldAttr = &(cntlr->attr.hdrAttr); + commAttr = &(cntlr->attr.commAttr); + if (HdmiHdrAttrChange(curAttr, oldAttr) == false) { + HDF_LOGD("hdr attr not change"); + return HDF_SUCCESS; + } + + if (oldAttr->colorimetry != curAttr->colorimetry) { + HdmiHdrColorimetryUpdate(&(cntlr->attr.videoAttr), curAttr->colorimetry); + } + + /* change to SDR */ + if (curAttr->mode == HDMI_HDR_MODE_DISABLE) { + if (HdmiDisableHdr(cntlr, curAttr) == HDF_SUCCESS) { + commAttr->vsifDolby = false; + cntlr->attr.hdrAttr = *curAttr; + goto _SEND_INFOFRAME; + } else { + return HDF_FAILURE; + } + } + + /* change to HDR */ + cntlr->attr.hdrAttr = *curAttr; + ret = HdmiHdrModeSelect(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi & commAttr->drm)); + +_SEND_INFOFRAME: + (void)HdmiAviInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->avi)); + (void)HdmiVsInfoframeSend(&(cntlr->infoframe), commAttr->enableHdmi, commAttr->vsifDolby); + HdmiCntlrVideoPathSet(cntlr, &(cntlr->attr.videoAttr)); + return ret; +} + +int32_t HdmiHdrDrmInfoframeStop(struct HdmiHdr *hdr) +{ + struct HdmiCntlr *cntlr = NULL; + + HDF_LOGD("zero DRM infoframe send timeout."); + if (hdr == NULL || hdr->priv == NULL) { + HDF_LOGE("hdr stop drm, input param invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)hdr->priv; + + if (cntlr->attr.hdrAttr.mode != HDMI_HDR_MODE_CEA_861_3) { + return HdmiDrmInfoframeSend(&(cntlr->infoframe), false); + } + return HDF_SUCCESS; +} + +int32_t HdmiHdrModeChangeTimeout(struct HdmiHdr *hdr) +{ + struct HdmiCntlr *cntlr = NULL; + + HDF_LOGD("hdr mode change timeout."); + if (hdr == NULL || hdr->priv == NULL) { + HDF_LOGE("hdr mode change timeout, input param invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)hdr->priv; + + if (hdr->info.state == HDMI_HDR_STATE_OE) { + HdmiCntlrPhyOutputEnablet(cntlr, true); + } + HdmiCntlrAvmuteSet(cntlr, false); + if (hdr->info.state == HDMI_HDR_STATE_OE) { + HdmiCntlrBlackDataSet(cntlr, false); + HdmiCntlrAudioMuteEnable(cntlr, true); + } + return HDF_SUCCESS; +} diff --git a/support/platform/src/hdmi/hdmi_if.c b/support/platform/src/hdmi/hdmi_if.c new file mode 100644 index 000000000..c6b960a87 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_if.c @@ -0,0 +1,494 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdmi_if.h" +#ifndef __USER__ +#include "hdmi_core.h" +#endif +#include "hdf_base.h" +#include "hdf_log.h" +#include "osal_mem.h" +#ifdef __USER__ +#include "hdf_io_service_if.h" +#include "securec.h" +#endif + +#define HDF_LOG_TAG hdmi_if_c + +#define HDMI_SERVICE_NAME_LEN 32 + +#ifdef __USER__ + +enum HdmiIoCmd { + HDMI_CMD_OPEN, + HDMI_CMD_CLOSE, + HDMI_CMD_START, + HDMI_CMD_STOP, + HDMI_CMD_AVMUTE_SET, + HDMI_CMD_DEEP_COLOR_SET, + HDMI_CMD_DEEP_COLOR_GET, + HDMI_CMD_VIDEO_ATTR_SET, + HDMI_CMD_AUDIO_ATTR_SET, + HDMI_CMD_HDR_ATTR_SET, + HDMI_CMD_READ_SINK_EDID, + HDMI_CMD_INFOFRAME_SET, + HDMI_CMD_INFOFRAME_GET, + HDMI_CMD_BUTT, +}; + +static int32_t HdmiGetDataFromReply(struct HdfSBuf *reply, uint8_t *data, uint32_t size) +{ + uint32_t rLen; + const void *rBuf = NULL; + + if (HdfSbufReadBuffer(reply, &rBuf, &rLen) == false) { + HDF_LOGE("HdmiGetDataFromReply: read rBuf fail!"); + return HDF_ERR_IO; + } + if (size != rLen) { + HDF_LOGE("HdmiGetDataFromReply: err len:%u, rLen:%u", size, rLen); + if (rLen > size) { + rLen = size; + } + } + + if (memcpy_s(data, size, rBuf, rLen) != EOK) { + HDF_LOGE("HdmiGetDataFromReply: memcpy rBuf fail!"); + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +static void HdmiUserClose(DevHandle handle) +{ + struct HdfIoService *service = (struct HdfIoService *)handle; + int32_t ret; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserClose: service is invalid"); + return; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_CLOSE, NULL, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserClose: failed to send service call:%d", ret); + } +} + +static int32_t HdmiUserStart(DevHandle handle) +{ + struct HdfIoService *service = (struct HdfIoService *)handle; + int32_t ret; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserStart: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_START, NULL, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserStart: failed to send service call:%d", ret); + return ret; + } + return HDF_SUCCESS; +} + +static int32_t HdmiUserStop(DevHandle handle) +{ + struct HdfIoService *service = (struct HdfIoService *)handle; + int32_t ret; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserStop: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_STOP, NULL, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserStop: failed to send service call:%d", ret); + return ret; + } + return HDF_SUCCESS; +} + +static int32_t HdmiUserAvmuteSet(DevHandle handle, bool enable) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserAvmuteSet: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(enable)); + if (buf == NULL) { + HDF_LOGE("HdmiUserAvmuteSet: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, &enable, sizeof(enable))) { + HDF_LOGE("HdmiUserAvmuteSet: sbuf write buffer failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_AVMUTE_SET, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserAvmuteSet: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserDeepColorSet(DevHandle handle, enum HdmiDeepColor color) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserDeepColorSet: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(color)); + if (buf == NULL) { + HDF_LOGE("HdmiUserDeepColorSet: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, &color, sizeof(color))) { + HDF_LOGE("HdmiUserDeepColorSet: sbuf write color failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_DEEP_COLOR_SET, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserDeepColorSet: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserSetVideoAttribute: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (attr == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(struct HdmiVideoAttr)); + if (buf == NULL) { + HDF_LOGE("HdmiUserSetVideoAttribute: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, attr, sizeof(struct HdmiVideoAttr))) { + HDF_LOGE("HdmiUserSetVideoAttribute: sbuf write attr failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_VIDEO_ATTR_SET, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserSetVideoAttribute: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserSetAudioAttribute: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (attr == NULL) { + HDF_LOGE("HdmiUserSetAudioAttribute: attr is NULL"); + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(struct HdmiAudioAttr)); + if (buf == NULL) { + HDF_LOGE("HdmiUserSetAudioAttribute: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, attr, sizeof(struct HdmiAudioAttr))) { + HDF_LOGE("HdmiUserSetAudioAttribute: sbuf write attr failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_AUDIO_ATTR_SET, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserSetAudioAttribute: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserSetHdrAttribute: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (attr == NULL) { + HDF_LOGE("HdmiUserSetHdrAttribute: attr is NULL"); + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(struct HdmiHdrAttr)); + if (buf == NULL) { + HDF_LOGE("HdmiUserSetHdrAttribute: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, attr, sizeof(struct HdmiHdrAttr))) { + HDF_LOGE("HdmiUserSetHdrAttribute: sbuf write attr failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_HDR_ATTR_SET, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserSetAudioAttribute: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserDeepColorGet(DevHandle handle, enum HdmiDeepColor *color) +{ + int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserDeepColorGet: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (color == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + /* Four bytes are used to store the buffer length, and four bytes are used to align the memory. */ + reply = HdfSBufObtain(sizeof(*color) + sizeof(uint64_t)); + if (reply == NULL) { + HDF_LOGE("HdmiUserDeepColorGet: failed to obtain reply"); + ret = HDF_ERR_MALLOC_FAIL; + goto __EXIT; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_DEEP_COLOR_GET, NULL, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserDeepColorGet: failed to write, ret %d", ret); + } else { + ret = HdmiGetDataFromReply(reply, (uint8_t *)color, sizeof(*color)); + } + +__EXIT : + if (reply != NULL) { + HdfSBufRecycle(reply); + } + return ret; +} + +static int32_t HdmiUserGetSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len) +{ + int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserGetSinkEdid: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (buffer == NULL || len == 0) { + return HDF_ERR_INVALID_PARAM; + } + + reply = HdfSBufObtain(len); + if (reply == NULL) { + HDF_LOGE("HdmiUserGetSinkEdid: failed to obtain reply"); + ret = HDF_ERR_MALLOC_FAIL; + goto __EXIT; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_READ_SINK_EDID, NULL, reply); + if (ret <= 0) { + HDF_LOGE("HdmiUserGetSinkEdid: failed to write, ret %d", ret); + } else { + ret = HdmiGetDataFromReply(reply, buffer, len); + } + +__EXIT : + if (reply != NULL) { + HdfSBufRecycle(reply); + } + return ret; +} +#endif + +static void *HdmiCntlrObjGet(uint16_t busNum) +{ + char *serviceName = NULL; + void *obj = NULL; + + serviceName = (char *)OsalMemCalloc(HDMI_SERVICE_NAME_LEN + 1); + if (serviceName == NULL) { + HDF_LOGE("HDMI service name malloc fail."); + return NULL; + } + if (snprintf_s(serviceName, (HDMI_SERVICE_NAME_LEN + 1), + HDMI_SERVICE_NAME_LEN, "HDF_PLATFORM_HDMI_%d", busNum) < 0) { + HDF_LOGE("get HDMI service name fail."); + goto __ERR; + } +#ifdef __USER__ + obj = (void *)HdfIoServiceBind(serviceName); +#else + obj = (void *)HdmiCntlrGetByBusNum(busNum); +#endif +__ERR: + OsalMemFree(serviceName); + return obj; +} + +DevHandle HdmiOpen(uint16_t busNum) +{ + DevHandle *obj = (DevHandle *)HdmiCntlrObjGet(busNum); + int32_t ret; + + if (obj == NULL) { + return NULL; + } +#ifdef __USER__ + struct HdfIoService *service = (struct HdfIoService *)obj; + if (service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiOpen: dispatcher or Dispatch is NULL!"); + return NULL; + } + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_OPEN, NULL, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiOpen: failed to send service call:%d", ret); + return NULL; + } +#else + ret = HdmiCntlrOpen((struct HdmiCntlr *)obj); + if (ret != HDF_SUCCESS) { + return NULL; + } +#endif + return obj; +} + +int32_t HdmiStart(DevHandle handle) +{ +#ifdef __USER__ + return HdmiUserStart(handle); +#else + return HdmiCntlrStart((struct HdmiCntlr *)handle); +#endif +} + +int32_t HdmiStop(DevHandle handle) +{ +#ifdef __USER__ + return HdmiUserStop(handle); +#else + return HdmiCntlrStop((struct HdmiCntlr *)handle); +#endif +} + +int32_t HdmiAvmuteSet(DevHandle handle, bool enable) +{ +#ifdef __USER__ + return HdmiUserAvmuteSet(handle, enable); +#else + HdmiCntlrAvmuteSet((struct HdmiCntlr *)handle, enable); + return HDF_SUCCESS; +#endif +} + +int32_t HdmiDeepColorSet(DevHandle handle, enum HdmiDeepColor color) +{ +#ifdef __USER__ + return HdmiUserDeepColorSet(handle, color); +#else + return HdmiCntlrDeepColorSet((struct HdmiCntlr *)handle, color); +#endif +} + +int32_t HdmiDeepColorGet(DevHandle handle, enum HdmiDeepColor *color) +{ +#ifdef __USER__ + return HdmiUserDeepColorGet(handle, color); +#else + return HdmiCntlrDeepColorGet((struct HdmiCntlr *)handle, color); +#endif +} + +int32_t HdmiSetVideoAttribute(DevHandle handle, struct HdmiVideoAttr *attr) +{ +#ifdef __USER__ + return HdmiUserSetVideoAttribute(handle, attr); +#else + return HdmiCntlrSetVideoAttribute((struct HdmiCntlr *)handle, attr); +#endif +} + +int32_t HdmiSetAudioAttribute(DevHandle handle, struct HdmiAudioAttr *attr) +{ +#ifdef __USER__ + return HdmiUserSetAudioAttribute(handle, attr); +#else + return HdmiCntlrSetAudioAttribute((struct HdmiCntlr *)handle, attr); +#endif +} + +int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr) +{ +#ifdef __USER__ + return HdmiUserSetHdrAttribute(handle, attr); +#else + return HdmiCntlrSetHdrAttribute((struct HdmiCntlr *)handle, attr); +#endif +} + +int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len) +{ +#ifdef __USER__ + return HdmiUserGetSinkEdid(handle, buffer, len); +#else + return HdmiCntlrGetSinkEdid((struct HdmiCntlr *)handle, buffer, len); +#endif +} + +void HdmiClose(DevHandle handle) +{ +#ifdef __USER__ + HdmiUserClose(handle); +#else + HdmiCntlrClose((struct HdmiCntlr *)handle); +#endif +} diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c new file mode 100644 index 000000000..34e67ac43 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -0,0 +1,806 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" +#include "securec.h" + +#define HDF_LOG_TAG hdmi_infoframe_c + +#define HDMI_IEEE_OUI_1_4_1ST 0x03 +#define HDMI_IEEE_OUI_1_4_2ND 0x0C +#define HDMI_IEEE_OUI_1_4_3RD 0x00 + +static void HdmiInfoframeFillCheckSum(uint8_t *data, uint32_t len) +{ + uint32_t i; + uint8_t checkSum = 0; + + for (i = 0; i < len; i++) { + checkSum += data[i]; + } + if (checkSum > 0) { + /* + * The checksum shall be calculated such that a byte-wide sum of all three bytes of the Packet Header and + * all valid bytes of the InfoFrame Packet contents(determined by InfoFrame_length), plus the checksum itself, + * equals zero. + */ + data[3] = HDMI_INFOFRAME_CHECKSUM - checkSum; + } +} + +static void HdmiInfoframeFillHeader(struct HdmiInfoframeHeader *header, uint8_t *data, uint32_t len) +{ + if (len < HDMI_INFOFRAME_PACKET_HEADER_LEN) { + HDF_LOGE("len = %d, val is too small.", len); + return; + } + data[0] = header->type; + data[1] = header->verNum; + data[2] = header->len; +} + +static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +{ + uint32_t lenght; + struct HdmiVs14VsifContent *vsifContent = NULL; + struct HdmiVsUserVsifContent *userContent = NULL; + struct HdmiVsInfoframe *vs = &(infoframe->vs); + + lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + vs->len; + if (len < lenght) { + HDF_LOGE("len = %d, val is too small.", len); + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(data, len, 0, len) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + + HdmiInfoframeFillHeader(&(infoframe->header), data, len); + if (vs->vsifContent._14Vsif.oui == HDMI_IEEE_OUI_1_4) { + data[4] = HDMI_IEEE_OUI_1_4_1ST; + data[5] = HDMI_IEEE_OUI_1_4_2ND; + data[6] = HDMI_IEEE_OUI_1_4_3RD; + vsifContent = &(vs->vsifContent._14Vsif); + userContent = &(vs->vsifContent.userVsif); + data[7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; + if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_4K) { + data[8] = vsifContent->vic; + return HDF_SUCCESS; + } else if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_3D) { + data[8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; + } + data[9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << HDMI_VENDOR_3D_EXT_DATA_SHIFT; + if (vsifContent->_3dMetaPresent == false) { + if (userContent->len == 0 || (userContent->len + lenght) > len) { + return HDF_SUCCESS; + } + if (memcpy_s(&data[lenght], (len - lenght), userContent->data, userContent->len) != EOK) { + HDF_LOGE("memcpy_s fail."); + return HDF_ERR_IO; + } + lenght += userContent->len; + } + } + HdmiInfoframeFillCheckSum(data, lenght); + return HDF_SUCCESS; +} + +static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +{ + uint32_t lenght; + uint8_t *buff = data; + struct HdmiAviInfoframe *avi = &(infoframe->avi); + + lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + avi->len; + if (len < lenght) { + HDF_LOGE("len = %d, val is too small.", len); + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(buff, len, 0, len) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + + HdmiInfoframeFillHeader(&(infoframe->header), data, len); + buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; + /* PB1 */ + buff[0] |= (avi->colorSpace & HDMI_AVI_COLOR_SPACE_MARK) << HDMI_AVI_COLOR_SPACE_SHIFT; + buff[0] |= (avi->scanMode & HDMI_AVI_SCAN_MODE_MARK); + if (avi->activeFormatInformationPresent == true) { + buff[0] |= (1 << HDMI_AVI_ACTIVE_INFORMATION_SHIFT); + } + if (avi->horizBarInfoPresent == true) { + buff[0] |= (1 << HDMI_AVI_HORIZONTAL_BAR_SHIFT); + } + if (avi->vertBarInfoPresent == true) { + buff[0] |= (1 << HDMI_AVI_VERTICAL_BAR_SHIFT); + } + /* PB2 */ + buff[1] |= (avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; + buff[1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; + buff[1] |= (avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); + /* PB3 */ + buff[2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << HDMI_AVI_EXT_COLORIMETRY_SHIFT; + buff[2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; + buff[2] |= (avi->nups & HDMI_AVI_NUPS_RANGE_MARK); + if (avi->itc == true) { + buff[2] |= (1 << HDMI_AVI_IT_CONTENT_SHIFT); + } + /* PB4 */ + buff[3] = avi->vic; + /* PB5 */ + buff[4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; + buff[4] |= (avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; + buff[4] |= (avi->pixelRepetitionFactor & HDMI_AVI_PIXEL_REPETION_FACTOR_MARK); + /* PB6 */ + buff[5] = (uint8_t)(avi->topBar & HDMI_AVI_BAR_MODE_MARK); + /* PB7 */ + buff[6] = (uint8_t)((avi->topBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + /* PB8 */ + buff[7] = (uint8_t)(avi->bottomBar & HDMI_AVI_BAR_MODE_MARK); + /* PB9 */ + buff[8] = (uint8_t)((avi->bottomBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + /* PB10 */ + buff[9] = (uint8_t)(avi->leftBar & HDMI_AVI_BAR_MODE_MARK); + /* PB11 */ + buff[10] = (uint8_t)((avi->leftBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + /* PB12 */ + buff[11] = (uint8_t)(avi->rightBar & HDMI_AVI_BAR_MODE_MARK); + /* PB13 */ + buff[12] = (uint8_t)((avi->rightBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + HdmiInfoframeFillCheckSum(data, lenght); + return HDF_SUCCESS; +} + +static int32_t HdmiInfoframePacketSpdEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +{ + uint32_t lenght; + uint8_t *buff = data; + struct HdmiSpdInfoframe *spd = &(infoframe->spd); + + lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + spd->len; + if (len < lenght) { + HDF_LOGE("len = %d, val is too small.", len); + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(buff, len, 0, len) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + + buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; + /* PB1~PB8 */ + if (memcpy_s(buff, (len - HDMI_INFOFRAME_PACKET_HEADER_LEN), spd->vendorName, sizeof(spd->vendorName)) != EOK) { + HDF_LOGE("memcpy_s fail."); + return HDF_ERR_IO; + } + buff += HDMI_SPD_VENDOR_NAME_LEN; + /* PB9~PB24 */ + if (memcpy_s(buff, (len - HDMI_INFOFRAME_PACKET_HEADER_LEN - HDMI_SPD_VENDOR_NAME_LEN), + spd->productDescription, sizeof(spd->productDescription)) != EOK) { + HDF_LOGE("memcpy_s fail."); + return HDF_ERR_IO; + } + buff += HDMI_SPD_PRODUCT_DESCRIPTION_LEN; + /* PB25 */ + buff[0] = spd->sdi; + HdmiInfoframeFillCheckSum(data, lenght); + return HDF_SUCCESS; +} + +static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +{ + uint32_t lenght; + uint8_t *buff = data; + struct HdmiAudioInfoframe *audio = &(infoframe->audio); + + lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + audio->len; + if (len < lenght) { + HDF_LOGE("len = %d, val is too small.", len); + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(buff, len, 0, len) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + + HdmiInfoframeFillHeader(&(infoframe->header), data, len); + buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; + /* PB1 */ + buff[0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; + buff[0] |= (audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); + /* PB2 */ + buff[1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; + buff[1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); + /* PB3 */ + buff[2] |= (audio->codingExtType & HDMI_AUDIO_CXT_MARK); + /* PB4 */ + buff[3] |= audio->channelAllocation; + /* PB5 */ + buff[4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; + buff[4] |= (audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); + if (audio->dmInh == true) { + buff[4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); + } + HdmiInfoframeFillCheckSum(data, lenght); + return HDF_SUCCESS; +} + +static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +{ + uint32_t lenght; + uint8_t *buff = data; + struct HdmiDrmInfoframe *drm = &(infoframe->drm); + struct HdmiStaticMetadataDescriptor1st *des = &(drm->des.type1); + + lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + drm->len; + if (len < lenght) { + HDF_LOGE("len = %d, val is too small.", len); + return HDF_ERR_INVALID_PARAM; + } + if (memset_s(buff, len, 0, len) != EOK) { + HDF_LOGE("memset_s fail."); + return HDF_ERR_IO; + } + + HdmiInfoframeFillHeader(&(infoframe->header), data, len); + buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; + /* PB1 */ + buff[0] = drm->eotfType; + /* PB2 */ + buff[1] = drm->metadataType; + /* PB3 */ + buff[2] = (uint8_t)(des->displayPrimaries0X & HDMI_DRM_METADATA_MARK); + /* PB4 */ + buff[3] = (uint8_t)((des->displayPrimaries0X >> HDMI_DRM_METADATA_SHIFT) & HDMI_DRM_METADATA_MARK); + /* PB5 */ + buff[4] = (uint8_t)(des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK); + /* PB6 */ + buff[5] = (uint8_t)((des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB7 */ + buff[6] = (uint8_t)(des->displayPrimaries1X & HDMI_DRM_METADATA_MARK); + /* PB8 */ + buff[7] = (uint8_t)((des->displayPrimaries1X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB9 */ + buff[8] = (uint8_t)(des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK); + /* PB10 */ + buff[9] = (uint8_t)((des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB11 */ + buff[10] = (uint8_t)(des->displayPrimaries2X & HDMI_DRM_METADATA_MARK); + /* PB12 */ + buff[11] = (uint8_t)((des->displayPrimaries2X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB13 */ + buff[12] = (uint8_t)(des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK); + /* PB14 */ + buff[13] = (uint8_t)((des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB15 */ + buff[14] = (uint8_t)(des->whitePointX & HDMI_DRM_METADATA_MARK); + /* PB16 */ + buff[15] = (uint8_t)((des->whitePointX & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB17 */ + buff[16] = (uint8_t)(des->whitePointY & HDMI_DRM_METADATA_MARK); + /* PB18 */ + buff[17] = (uint8_t)((des->whitePointY & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB19 */ + buff[18] = (uint8_t)(des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); + /* PB20 */ + buff[19] = (uint8_t)((des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB21 */ + buff[20] = (uint8_t)(des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); + /* PB22 */ + buff[21] = (uint8_t)((des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB23 */ + buff[22] = (uint8_t)(des->maxContentLightLevel & HDMI_DRM_METADATA_MARK); + /* PB24 */ + buff[23] = (uint8_t)((des->maxContentLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + /* PB25 */ + buff[24] = (uint8_t)(des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK); + /* PB26 */ + buff[25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + HdmiInfoframeFillCheckSum(data, lenght); + return HDF_SUCCESS; +} + +static int32_t HdmiInfoframePacketEncoding(union HdmiInfoframeInfo *infoframe, + enum HdmiPacketType type, uint8_t *data, uint32_t len) +{ + int32_t ret; + + if (infoframe == NULL || data == NULL) { + HDF_LOGE("input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + switch (type) { + case HDMI_INFOFRAME_PACKET_TYPE_VS: + ret = HdmiInfoframePacketVsEncoding(infoframe, data, len); + break; + case HDMI_INFOFRAME_PACKET_TYPE_AVI: + ret = HdmiInfoframePacketAviEncoding(infoframe, data, len); + break; + case HDMI_INFOFRAME_PACKET_TYPE_SPD: + ret = HdmiInfoframePacketSpdEncoding(infoframe, data, len); + break; + case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: + ret = HdmiInfoframePacketAudioEncoding(infoframe, data, len); + break; + case HDMI_INFOFRAME_PACKET_TYPE_DRM: + ret = HdmiInfoframePacketDrmEncoding(infoframe, data, len); + break; + default: + HDF_LOGD("type %d not support.", type); + ret = HDF_ERR_NOT_SUPPORT; + } + return ret; +} + +static int32_t HdmiInfoframeSend(struct HdmiInfoframe *frame, union HdmiInfoframeInfo *infoframe) +{ + uint8_t buffer[HDMI_INFOFRAME_LEN] = {0}; + struct HdmiCntlr *cntlr = NULL; + int32_t ret; + + if (frame == NULL || frame->priv == NULL || infoframe == NULL) { + HDF_LOGE("HdmiInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeSend == NULL || cntlr->ops->infoframeEnable == NULL) { + HDF_LOGD("HdmiInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + ret = HdmiInfoframePacketEncoding(infoframe, infoframe->header.type, buffer, HDMI_INFOFRAME_LEN); + if (ret != HDF_SUCCESS) { + HDF_LOGE("encding infoframe %d fail", infoframe->header.type); + return ret; + } + + HdmiCntlrLock(cntlr); + cntlr->ops->infoframeEnable(cntlr, infoframe->header.type, false); + ret = cntlr->ops->infoframeSend(cntlr, infoframe->header.type, buffer, HDMI_INFOFRAME_LEN); + if (ret != HDF_SUCCESS) { + HDF_LOGE("send infoframe %d fail", infoframe->header.type); + HdmiCntlrUnlock(cntlr); + return ret; + } + cntlr->ops->infoframeEnable(cntlr, infoframe->header.type, true); + HdmiCntlrUnlock(cntlr); + return HDF_SUCCESS; +} + +static void HdmiFillAviHdrInfoframe(struct HdmiAviInfoframe *avi, + struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *HdrAttr, struct HdmiCommonAttr *commAttr) +{ + switch (HdrAttr->mode) { + case HDMI_HDR_MODE_CEA_861_3: + case HDMI_HDR_MODE_CEA_861_3_AUTHEN: + avi->colorimetry = videoAttr->colorimetry; + avi->extColorimetry = videoAttr->extColorimetry; + avi->colorSpace = commAttr->colorSpace; + if (HdrAttr->mode == HDMI_HDR_MODE_CEA_861_3_AUTHEN) { + avi->colorSpace = HDMI_COLOR_SPACE_YCBCR422; + } + avi->range = videoAttr->quantization; + avi->yccRange = videoAttr->yccQuantization; + break; + case HDMI_HDR_MODE_DOLBY_NORMAL: + avi->colorSpace = HDMI_COLOR_SPACE_YCBCR422; + avi->colorimetry = (videoAttr->xvycc == true) ? HDMI_COLORIMETRY_EXTENDED : videoAttr->colorimetry; + avi->extColorimetry = videoAttr->extColorimetry; + avi->range = videoAttr->quantization; + avi->yccRange = HDMI_YCC_QUANTIZATION_RANGE_FULL; + break; + case HDMI_HDR_MODE_DOLBY_TUNNELING: + avi->colorSpace = HDMI_COLOR_SPACE_RGB; + avi->colorimetry = (videoAttr->xvycc == true) ? HDMI_COLORIMETRY_EXTENDED : videoAttr->colorimetry; + avi->extColorimetry = videoAttr->extColorimetry; + avi->range = HDMI_QUANTIZATION_RANGE_FULL; + avi->yccRange = videoAttr->yccQuantization; + break; + default: + avi->colorSpace = commAttr->colorSpace; + avi->colorimetry = (videoAttr->xvycc == true) ? HDMI_COLORIMETRY_EXTENDED : videoAttr->colorimetry; + avi->extColorimetry = videoAttr->extColorimetry; + avi->range = videoAttr->quantization; + avi->yccRange = videoAttr->yccQuantization; + break; + } +} + +static void HdmiFillAviInfoframeVersion(struct HdmiAviInfoframe *avi) +{ + /* + * see hdmi spec2.0 10.1. + * The Y2 and VIC7 bits are simply set to zero in a Version 2 AVI InfoFrame and might not be decoded by + * some Sinks. A Version 3 AVI InfoFrame shall be used and the Version field set to 0x03 (indicating that + * the Sink shall decode the additional most-significant bits) whenever either of the most-significant bits + * Y2 or VIC7 are set to '1'. If both Y2 and VIC7 are set to '0', then a Version 2 AVI InfoFrame shall be used + * and the Version field shall be set to 0x02 (indicating that the Sink does not have to decode the additional + * most-significant bits). + */ + avi->verNum = HDMI_AVI_VERSION2; + if (((uint32_t)avi->colorSpace & HDMI_AVI_Y2_MASK) > 0 || + (avi->vic > HDMI_VIC_5120X2160P100_64_27)) { + avi->verNum = HDMI_AVI_VERSION3; + } else if (avi->colorimetry == HDMI_COLORIMETRY_EXTENDED && + avi->extColorimetry == HDMI_EXTENDED_COLORIMETRY_ADDITIONAL) { + /* + * (C1,C0) is (1,1) and (EC2,EC1,EC0) is (1,1,1), version shall be 4. + * All fields of the Version 4 AVI InfoFrame are the same as Version 3 AVI InfoFrame, + * except for the InfoFrame Version Number, Length of AVI InfoFrame, and additional Data Byte 14. + */ + avi->verNum = HDMI_AVI_VERSION4; + (avi->len)++; + } +} + +static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, + struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *HdrAttr, struct HdmiCommonAttr *commAttr) +{ + bool enable3d; + + if (memset_s(avi, sizeof(struct HdmiAviInfoframe), 0, sizeof(struct HdmiAviInfoframe)) != EOK) { + HDF_LOGE("fill vsif, memset_s fail."); + return; + } + avi->type = HDMI_INFOFRAME_PACKET_TYPE_AVI; + avi->len = HDMI_AVI_INFOFRAME_LEN; + + avi->activeFormatInformationPresent = true; + avi->colorSpace = commAttr->colorSpace; + avi->activeAspect = videoAttr->activeAspect; + avi->pictureAspect = videoAttr->aspect; + avi->colorimetry = (videoAttr->xvycc == true) ? HDMI_COLORIMETRY_EXTENDED : videoAttr->colorimetry; + avi->nups = videoAttr->nups; + + avi->range = videoAttr->quantization; + avi->extColorimetry = videoAttr->extColorimetry; + enable3d = (videoAttr->_3dStruct >= HDMI_VS_VIDEO_3D_BUTT) ? false : true; + avi->vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, enable3d); + avi->pixelRepetitionFactor = (uint8_t)videoAttr->pixelRepeat; + avi->yccRange = videoAttr->yccQuantization; + HdmiFillAviHdrInfoframe(avi, videoAttr, HdrAttr, commAttr); + HdmiFillAviInfoframeVersion(avi); +} + +int32_t HdmiAviInfoframeSend(struct HdmiInfoframe *frame, bool enable) +{ + struct HdmiCntlr *cntlr = NULL; + union HdmiInfoframeInfo infoframe = {0}; + + if (frame == NULL || frame->priv == NULL) { + HDF_LOGE("HdmiAviInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL || cntlr->ops->infoframeSend == NULL) { + HDF_LOGD("HdmiAviInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + if (enable == false) { + cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AVI, false); + return HDF_SUCCESS; + } + HdmiFillAviInfoframe(&(frame->avi), &(cntlr->attr.videoAttr), &(cntlr->attr.hdrAttr), &(cntlr->attr.commAttr)); + infoframe.avi = frame->avi; + return HdmiInfoframeSend(frame, &infoframe); +} + +void HdmiFillAudioInfoframe(struct HdmiAudioInfoframe *audio, struct HdmiAudioAttr *audioAttr) +{ + if (memset_s(audio, sizeof(struct HdmiAudioInfoframe), 0, sizeof(struct HdmiAudioInfoframe)) != EOK) { + HDF_LOGE("fill vsif, memset_s fail."); + return; + } + audio->type = HDMI_INFOFRAME_PACKET_TYPE_AUDIO; + audio->len = HDMI_AUDIO_INFOFRAME_LEN; + audio->verNum = HDMI_AUDIO_INFOFRAME_VERSION; + + /* fill channels. */ + if (audioAttr->ifType != HDMI_AUDIO_IF_TYPE_I2S) { + HDF_LOGI("audio channel refer to stream."); + } else { + HDF_LOGI("audio channel %u \n", audioAttr->channels); + audio->channelCount = (audioAttr->channels >= 2) ? (audioAttr->channels - 1) : 0; + } + + /* fill coding type. */ + if (audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_AC3 || audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS || + audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_EAC3 || audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS_HD) { + audio->codingType = audioAttr->codingType; + } else { + audio->codingType = HDMI_AUDIO_CODING_TYPE_STREAM; + } + + /* fill CA field. see CEA-861-D table 20. */ + switch (audioAttr->channels) { + case HDMI_AUDIO_FORMAT_CHANNEL_3: + audio->channelAllocation = 0x01; /* 1 channel */ + break; + case HDMI_AUDIO_FORMAT_CHANNEL_6: + audio->channelAllocation = 0x0b; /* 3, 4 channel */ + break; + case HDMI_AUDIO_FORMAT_CHANNEL_8: + audio->channelAllocation = 0x13; /* 1, 2, 5 channel */ + break; + default: + audio->channelAllocation = 0x00; /* 0 channel */ + break; + } +} + +int32_t HdmiAudioInfoframeSend(struct HdmiInfoframe *frame, bool enable) +{ + struct HdmiCntlr *cntlr = NULL; + union HdmiInfoframeInfo infoframe = {0}; + + if (frame == NULL || frame->priv == NULL) { + HDF_LOGE("HdmiAudioInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { + HDF_LOGD("HdmiAudioInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + if (enable == false) { + HdmiCntlrLock(cntlr); + cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AUDIO, false); + HdmiCntlrUnlock(cntlr); + return HDF_SUCCESS; + } + HdmiFillAudioInfoframe(&(frame->audio), &(cntlr->attr.audioAttr)); + infoframe.audio = frame->audio; + return HdmiInfoframeSend(frame, &infoframe); +} + +static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAttr *HdrAttr) +{ + if (memset_s(drm, sizeof(struct HdmiDrmInfoframe), 0, sizeof(struct HdmiDrmInfoframe)) != EOK) { + HDF_LOGE("fill vsif, memset_s fail."); + return; + } + drm->type = HDMI_INFOFRAME_PACKET_TYPE_DRM; + drm->len = HDMI_DRM_INFOFRAME_LEN; + drm->verNum = HDMI_DRM_INFOFRAME_VERSION; + drm->eotfType = HdrAttr->eotfType; + drm->metadataType = HdrAttr->metadataType; + drm->des = HdrAttr->descriptor; +} + +int32_t HdmiDrmInfoframeSend(struct HdmiInfoframe *frame, bool enable) +{ + struct HdmiCntlr *cntlr = NULL; + union HdmiInfoframeInfo infoframe = {0}; + + if (frame == NULL || frame->priv == NULL) { + HDF_LOGE("HdmiDrmInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { + HDF_LOGD("HdmiDrmInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + if (enable == false) { + cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_DRM, false); + return HDF_SUCCESS; + } + HdmiFillDrmInfoframe(&(frame->drm), &(cntlr->attr.hdrAttr)); + infoframe.drm = frame->drm; + return HdmiInfoframeSend(frame, &infoframe); +} + +static uint8_t HdmiGetVsifLength(struct HdmiVs14VsifContent *_14Vsif, bool dolbyEnable, bool hdrSupport) +{ + uint8_t length = 0x07; + + if (hdrSupport == true) { + if (dolbyEnable == true) { + length = 0x18; + } else if (_14Vsif->format == HDMI_VS_VIDEO_FORMAT_4K) { + length = 0x05; + } else if (_14Vsif->format == HDMI_VS_VIDEO_FORMAT_3D) { + length = 0x07; + } else { + length = 0x04; + } + } + return length; +} + +static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *videoAttr) +{ + struct HdmiVideo4kInfo *_4kInfo = NULL; + struct HdmiVs14VsifContent *_14Vsif = &(vs->vsifContent._14Vsif); + enum HdmiVic vic; + uint32_t cnt; + + _14Vsif->oui = HDMI_IEEE_OUI_1_4; + vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, false); + if ((vic == HDMI_VIC_3840X2160P24_16_9 || vic == HDMI_VIC_3840X2160P25_16_9 || + vic == HDMI_VIC_3840X2160P30_16_9 || vic == HDMI_VIC_4096X2160P24_256_135) && + videoAttr->_3dStruct == HDMI_VS_VIDEO_3D_BUTT) { + _14Vsif->format = HDMI_VS_VIDEO_FORMAT_4K; + for (cnt = 0; cnt <= HDMI_VIDEO_4K_CODES_MAX; cnt++) { + _4kInfo = HdmiCommonGetVideo4kInfo(cnt); + if (_4kInfo != NULL && _4kInfo->timing == videoAttr->timing) { + _14Vsif->vic = _4kInfo->_4kVic; + break; + } + } + } else if (videoAttr->_3dStruct < HDMI_VS_VIDEO_3D_BUTT) { // common 3D + _14Vsif->format = HDMI_VS_VIDEO_FORMAT_3D; + _14Vsif->_3dStruct = videoAttr->_3dStruct; + } else { + _14Vsif->format = HDMI_VS_VIDEO_FORMAT_NULL; + _14Vsif->_3dStruct = videoAttr->_3dStruct; + } +} + +static void HdmiFillVsInfoframe(struct HdmiInfoframe *frame, struct HdmiVideoAttr *videoAttr, + bool dolbyEnable, bool hdrSupport) +{ + struct HdmiVsInfoframe *vs = &(frame->vs); + int32_t ret; + + ret = memset_s(vs, sizeof(struct HdmiVsInfoframe), 0, sizeof(struct HdmiVsInfoframe)); + if (ret != EOK) { + HDF_LOGE("fill vsif, memset_s fail."); + return; + } + vs->type = HDMI_INFOFRAME_PACKET_TYPE_VS; + vs->verNum = HDMI_VSIF_VERSION; + HdmiFill14Vsif(vs, videoAttr); + vs->len = HdmiGetVsifLength(&(vs->vsifContent._14Vsif), dolbyEnable, hdrSupport); + /* fill user vendor data */ + vs->vsifContent.userVsif.len = frame->userVsif.len; + ret = memcpy_s(vs->vsifContent.userVsif.data, HDMI_VENDOR_USER_DATA_MAX_LEN, + frame->userVsif.data, frame->userVsif.len); + if (ret != EOK) { + HDF_LOGE("fill vsif, memcpy_s fail."); + } +} + +int32_t HdmiVsInfoframeSend(struct HdmiInfoframe *frame, bool enable, bool dolbyEnable) +{ + struct HdmiCntlr *cntlr = NULL; + union HdmiInfoframeInfo infoframe = {0}; + + if (frame == NULL || frame->priv == NULL) { + HDF_LOGE("HdmiVsInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { + HDF_LOGD("HdmiVsInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + if (enable == false) { + cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_VS, false); + return HDF_SUCCESS; + } + HdmiFillVsInfoframe(frame, &(cntlr->attr.videoAttr), dolbyEnable, frame->hdrSupport); + infoframe.vs = frame->vs; + return HdmiInfoframeSend(frame, &infoframe); +} + +static void HdmiFillSpdInfoframe(struct HdmiSpdInfoframe *spd, char *vendorName, + char *productName, enum HdmiSpdSdi sdi) +{ + uint32_t len, length; + + if (memset_s(spd, sizeof(struct HdmiSpdInfoframe), 0, sizeof(struct HdmiSpdInfoframe)) != EOK) { + HDF_LOGE("fill spd infoframe, memset_s fail."); + return; + } + spd->type = HDMI_INFOFRAME_PACKET_TYPE_SPD; + spd->len = HDMI_SPD_INFOFRAME_LEN; + spd->verNum = HDMI_SPD_VERSION; + spd->sdi = sdi; + + len = (uint32_t)strlen(vendorName); + length = (uint32_t)sizeof(spd->vendorName); + length = (length > len) ? len : length; + if (memcpy_s(spd->vendorName, length, vendorName, length) != EOK) { + HDF_LOGE("fill spd infoframe vendor name, memcpy_s fail."); + } + + len = (uint32_t)strlen(productName); + length = (uint32_t)sizeof(spd->productDescription); + length = (length > len) ? len : length; + if (memcpy_s(spd->productDescription, length, productName, length) != EOK) { + HDF_LOGE("fill spd infoframe product name, memcpy_s fail."); + } +} + +int32_t HdmiSpdInfoframeSend(struct HdmiInfoframe *frame, bool enable, + char *vendorName, char *productName, enum HdmiSpdSdi sdi) +{ + struct HdmiCntlr *cntlr = NULL; + union HdmiInfoframeInfo infoframe = {0}; + + if (frame == NULL || frame->priv == NULL) { + HDF_LOGE("HdmiSpdInfoframeSend: input param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + cntlr = (struct HdmiCntlr *)frame->priv; + if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { + HDF_LOGD("HdmiSpdInfoframeSend not support."); + return HDF_ERR_NOT_SUPPORT; + } + + if (enable == false) { + cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_SPD, false); + return HDF_SUCCESS; + } + HdmiFillSpdInfoframe(&(frame->spd), vendorName, productName, sdi); + infoframe.spd = frame->spd; + return HdmiInfoframeSend(frame, &infoframe); +} + +int32_t HdmiInfoframeGetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, + union HdmiInfoframeInfo *infoframe) +{ + if (frame == NULL || infoframe == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + switch (type) { + case HDMI_INFOFRAME_PACKET_TYPE_VS : + infoframe->vs = frame->vs; + break; + case HDMI_INFOFRAME_PACKET_TYPE_AVI : + infoframe->avi = frame->avi; + break; + case HDMI_INFOFRAME_PACKET_TYPE_AUDIO : + infoframe->audio = frame->audio; + break; + case HDMI_INFOFRAME_PACKET_TYPE_DRM : + infoframe->drm = frame->drm; + break; + default : + HDF_LOGD("infoframe %d not support get", type); + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} + +int32_t HdmiInfoframeSetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, + union HdmiInfoframeInfo *infoframe) +{ + if (frame == NULL || infoframe == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + switch (type) { + case HDMI_INFOFRAME_PACKET_TYPE_VS : + frame->vs = infoframe->vs; + break; + case HDMI_INFOFRAME_PACKET_TYPE_AVI : + frame->avi = infoframe->avi; + break; + case HDMI_INFOFRAME_PACKET_TYPE_AUDIO : + frame->audio = infoframe->audio; + break; + case HDMI_INFOFRAME_PACKET_TYPE_DRM : + frame->drm = infoframe->drm; + break; + default : + HDF_LOGD("infoframe %d not support set", type); + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/support/platform/src/hdmi/hdmi_ncts.c b/support/platform/src/hdmi/hdmi_ncts.c new file mode 100644 index 000000000..78a050785 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_ncts.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdmi_ncts.h" + +#define HDF_LOG_TAG hdmi_ncts_c + +#define HDMI_NCTS_INVALID_VALUE 0xffffffff + +/* + * see hdmi1.4 table 7-17-27-3. + * The exact relationship: 128 * fs = tmdsClock * N / CTS. + */ +static struct HdmiAudioNCts g_audioNctsMap[] = { + { 32000, 25174, 4576, 28125 }, + { 32000, 25200, 4096, 25200 }, + { 32000, 27000, 4096, 27000 }, + { 32000, 27027, 4096, 27027 }, + { 32000, 54000, 4096, 54000 }, + { 32000, 54054, 4096, 54054 }, + { 32000, 74175, 11648, 210937}, + { 32000, 74250, 4096, 74250 }, + { 32000, 148351, 11648, 421875 }, + { 32000, 148500, 4096, 148500 }, + { 32000, 296703, 5824, 421875 }, + { 32000, 297000, 3072, 222750 }, + { 32000, 593406, 5824, 843750 }, + { 32000, 594000, 3072, 445500 }, + { 32000, 0, 4096, 0 }, + { 44100, 25174, 7007, 31250 }, + { 44100, 25200, 6272, 28000 }, + { 44100, 27000, 6272, 30000 }, + { 44100, 27027, 6272, 30030 }, + { 44100, 54000, 6272, 60000 }, + { 44100, 54054, 6272, 60060 }, + { 44100, 74175, 17836, 234375 }, + { 44100, 74250, 6272, 82500 }, + { 44100, 148351, 8918, 234375 }, + { 44100, 148500, 6272, 165000 }, + { 44100, 296703, 4459, 234375 }, + { 44100, 297000, 4704, 247500 }, + { 44100, 593406, 8918, 937500 }, + { 44100, 594000, 9408, 990000 }, + { 44100, 0, 6272, 0 }, + { 48000, 25174, 6864, 28125 }, + { 48000, 25200, 6144, 25200 }, + { 48000, 27000, 6144, 27000 }, + { 48000, 27027, 6144, 27027 }, + { 48000, 54000, 6144, 54000 }, + { 48000, 54054, 6144, 54054 }, + { 48000, 74175, 11648, 140625 }, + { 48000, 74250, 6144, 74250 }, + { 48000, 148351, 5824, 140625 }, + { 48000, 148500, 6144, 148500 }, + { 48000, 296703, 5824, 281250 }, + { 48000, 297000, 5120, 247500 }, + { 48000, 593406, 5824, 562500 }, + { 48000, 594000, 6144, 594000 }, + { 48000, 0, 6144, 0 } + }; + +uint32_t HdmiGetN(uint32_t sampleRate, uint32_t tmdsClock) +{ + uint32_t i; + + for (i = 0;i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock == tmdsClock) { + return g_audioNctsMap[i].n; + } + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock >= (tmdsClock - HDMI_NCTS_TMDS_DEVIATION) && + g_audioNctsMap[i].tmdsClock <= (tmdsClock + HDMI_NCTS_TMDS_DEVIATION)) { + return g_audioNctsMap[i].n; + } + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock == 0) { + return g_audioNctsMap[i].n; + } + } + return HDMI_NCTS_N_DEFAULT; +} + +uint32_t HdmiGetCts(uint32_t sampleRate, uint32_t tmdsClock) +{ + uint32_t i; + uint32_t tmpN = HDMI_NCTS_INVALID_VALUE; + uint32_t tmpCts = HDMI_NCTS_INVALID_VALUE; + + for (i = 0;i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock == tmdsClock) { + tmpN = g_audioNctsMap[i].n; + tmpCts = g_audioNctsMap[i].cts; + break; + } + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock >= (tmdsClock - HDMI_NCTS_TMDS_DEVIATION) && + g_audioNctsMap[i].tmdsClock <= (tmdsClock + HDMI_NCTS_TMDS_DEVIATION)) { + tmpN = g_audioNctsMap[i].n; + tmpCts = g_audioNctsMap[i].cts; + break; + } + if (g_audioNctsMap[i].sampleRate == sampleRate && + g_audioNctsMap[i].tmdsClock == 0) { + tmpN = g_audioNctsMap[i].n; + tmpCts = g_audioNctsMap[i].cts; + break; + } + } + + if (tmpCts == 0 && sampleRate >= 1000) { + tmpCts = (tmpN / HDMI_NCTS_FACTOR) * tmdsClock * 10 / (sampleRate / 1000); + } else if (tmpCts == HDMI_NCTS_INVALID_VALUE && sampleRate >= 1000) { + tmpCts = (HDMI_NCTS_N_DEFAULT / HDMI_NCTS_FACTOR) * tmdsClock * 10 / (sampleRate / 1000); + } + return tmpCts; +} diff --git a/support/platform/src/hdmi/hdmi_scdc.c b/support/platform/src/hdmi/hdmi_scdc.c new file mode 100644 index 000000000..2b74f9204 --- /dev/null +++ b/support/platform/src/hdmi/hdmi_scdc.c @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdmi_core.h" + +#define HDF_LOG_TAG hdmi_scdc_c + +#define HDMI_SCDC_READ_SOURCE_VERSION_TIMES 2 + +int32_t HdmiScdcRead(struct HdmiScdc *scdc, enum HdmiScdcsOffset offset, uint8_t *buffer, uint32_t len) +{ + struct HdmiDdcCfg cfg = {0}; + struct HdmiCntlr *cntlr = NULL; + + if (scdc == NULL || scdc->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)scdc->priv; + cfg.type = HDMI_DDC_DEV_SCDC; + cfg.readFlag = true; + cfg.devAddr = HDMI_DDC_SCDC_DEV_ADDRESS; + cfg.data = buffer; + cfg.dataLen = len; + cfg.offset = offset; + cfg.mode = HDMI_DDC_MODE_READ_MUTIL_NO_ACK; + return HdmiDdcTransfer(&(cntlr->ddc), &cfg); +} + +int32_t HdmiScdcWrite(struct HdmiScdc *scdc, enum HdmiScdcsOffset offset, uint8_t *buffer, uint32_t len) +{ + struct HdmiDdcCfg cfg = {0}; + struct HdmiCntlr *cntlr = NULL; + + if (scdc == NULL || scdc->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)scdc->priv; + cfg.type = HDMI_DDC_DEV_SCDC; + cfg.readFlag = false; + cfg.devAddr = HDMI_DDC_SCDC_DEV_ADDRESS; + cfg.data = buffer; + cfg.dataLen = len; + cfg.offset = offset; + cfg.mode = HDMI_DDC_MODE_WRITE_MUTIL_ACK; + return HdmiDdcTransfer(&(cntlr->ddc), &cfg); +} + +int32_t HdmiScdcReadByte(struct HdmiScdc *scdc, enum HdmiScdcsOffset offset, uint8_t *byte) +{ + return HdmiScdcRead(scdc, offset, byte, sizeof(*byte)); +} + +int32_t HdmiScdcWriteByte(struct HdmiScdc *scdc, enum HdmiScdcsOffset offset, uint8_t *byte) +{ + return HdmiScdcWrite(scdc, offset, byte, sizeof(*byte)); +} + +/* read opt */ +int32_t HdmiScdcReadSinkVersion(struct HdmiScdc *scdc, uint8_t *sinkVer) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_SINK_VERSION, sinkVer); +} + +int32_t HdmiScdcReadSourceVersion(struct HdmiScdc *scdc, uint8_t *srcVer) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_SOURCE_VERSION, srcVer); +} + +int32_t HdmiScdcReadUpdate0(struct HdmiScdc *scdc, uint8_t *flag) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_UPDATE_0, flag); +} + +int32_t HdmiScdcReadScramblerStatus(struct HdmiScdc *scdc, uint8_t *status) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_SCRAMBLER_STATUS, status); +} + +int32_t HdmiScdcReadTmdsConfig(struct HdmiScdc *scdc, uint8_t *tmdsCfg) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_TMDS_CONFIG, tmdsCfg); +} + +int32_t HdmiScdcReadConfig0(struct HdmiScdc *scdc, uint8_t *cfg) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_CONFIG_0, cfg); +} + +int32_t HdmiScdcReadConfig1(struct HdmiScdc *scdc, uint8_t *cfg) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_CONFIG_1, cfg); +} + +int32_t HdmiScdcReadTestConfig0(struct HdmiScdc *scdc, uint8_t *testCfg) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_TEST_CONFIG_0, testCfg); +} + +int32_t HdmiScdcReadTestConfig1(struct HdmiScdc *scdc, uint8_t *testCfg) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_TEST_CONFIG_1, testCfg); +} + +int32_t HdmiScdcReadStatusFlag0(struct HdmiScdc *scdc, uint8_t *flag) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_STASTUS_FLAG_0, flag); +} + +int32_t HdmiScdcReadStatusFlag1(struct HdmiScdc *scdc, uint8_t *flag) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_STASTUS_FLAG_1, flag); +} + +int32_t HdmiScdcReadStatusFlag2(struct HdmiScdc *scdc, uint8_t *flag) +{ + return HdmiScdcReadByte(scdc, HDMI_SCDCS_OFFSET_STASTUS_FLAG_2, flag); +} + +/* write opt */ +int32_t HdmiScdcWriteSourceVersion(struct HdmiScdc *scdc, uint8_t *srcVer) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_SOURCE_VERSION, srcVer); +} + +int32_t HdmiScdcWriteUpdate0(struct HdmiScdc *scdc, uint8_t *flag) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_UPDATE_0, flag); +} + +int32_t HdmiScdcWriteTmdsConfig(struct HdmiScdc *scdc, uint8_t *tmdsCfg) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_TMDS_CONFIG, tmdsCfg); +} + +int32_t HdmiScdcWriteConfig0(struct HdmiScdc *scdc, uint8_t *cfg) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_CONFIG_0, cfg); +} + +int32_t HdmiScdcWriteConfig1(struct HdmiScdc *scdc, uint8_t *cfg) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_CONFIG_1, cfg); +} + +int32_t HdmiScdcWriteTestConfig0(struct HdmiScdc *scdc, uint8_t *testCfg) +{ + return HdmiScdcWriteByte(scdc, HDMI_SCDCS_OFFSET_TEST_CONFIG_0, testCfg); +} + +/* cntlr ops */ +bool HdmiCntlrScdcSourceScrambleGet(struct HdmiCntlr *cntlr) +{ + bool ret; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->scdcSourceScrambleGet == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + HdmiCntlrLock(cntlr); + ret = cntlr->ops->scdcSourceScrambleGet(cntlr); + HdmiCntlrUnlock(cntlr); + return ret; +} + +int32_t HdmiCntlrScdcSourceScrambleSet(struct HdmiCntlr *cntlr, bool enable) +{ + int32_t ret; + + if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->scdcSourceScrambleSet == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + HdmiCntlrLock(cntlr); + ret = cntlr->ops->scdcSourceScrambleSet(cntlr, enable); + HdmiCntlrUnlock(cntlr); + return ret; +} + +/* scdc opt */ +int32_t HdmiScdcRrDisable(struct HdmiScdc *scdc) +{ + union HdmiScdcsConfig0 cfg = {0}; + union HdmiScdcsTestConfig0 testCfg = {0}; + int32_t ret; + + if (scdc == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiScdcWriteConfig0(scdc, &(cfg.data)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc write config0 fail"); + return ret; + } + scdc->status.cfg0 = cfg; + + ret = HdmiScdcWriteTestConfig0(scdc, &(testCfg.data)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc write test config0 fail"); + return ret; + } + scdc->status.testCfg0 = testCfg; + return HDF_SUCCESS; +} + +int32_t HdmiScdcScrambleSet(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble) +{ + union HdmiScdcsTmdsConfig cfg = {0}; + int32_t ret; + + if (scdc == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiCntlrScdcSourceScrambleSet((struct HdmiCntlr *)scdc->priv, scramble->sourceScramble); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc source scrambler set fail"); + return ret; + } + + if (scramble->sinkScramble == true) { + cfg.bits.scramblingEnable = 1; + } + if (scramble->tmdsBitClockRatio40 == true) { + cfg.bits.tmdsBitClockRatio = 1; + } + ret = HdmiScdcWriteTmdsConfig(scdc, &(cfg.data)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc write tmds config fail"); + return ret; + } + return HDF_SUCCESS; +} + +int32_t HdmiScdcScrambleGet(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble) +{ + union HdmiScdcsScramblerStatus status = {0}; + union HdmiScdcsTmdsConfig cfg = {0}; + int32_t ret; + + if (scdc == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + ret = HdmiScdcReadScramblerStatus(scdc, &(status.data)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc read scrambler status fail"); + return ret; + } + scramble->sinkScramble = (status.bits.scramblingStatus ? true : false); + + ret = HdmiScdcReadTmdsConfig(scdc, &(cfg.data)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc read tmds config fail"); + return ret; + } + scramble->tmdsBitClockRatio40 = (cfg.bits.tmdsBitClockRatio ? true : false); + scramble->sourceScramble = HdmiCntlrScdcSourceScrambleGet(scdc->priv); + + scdc->status.tmdsCfg = cfg; + scdc->status.scramblerStatus = status; + return HDF_SUCCESS; +} + +bool HdmiScdcSinkSupport(struct HdmiScdc *scdc) +{ + uint8_t srcVer, i; + int32_t ret; + + if (scdc == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + for (i = 0; i < HDMI_SCDC_READ_SOURCE_VERSION_TIMES; i++) { + srcVer = HDMI_SCDC_HDMI20_VERSION; + ret = HdmiScdcWriteSourceVersion(scdc, &srcVer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc write source version fail"); + return false; + } + ret = HdmiScdcReadSourceVersion(scdc, &srcVer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("scdc read source version fail"); + return false; + } + } + scdc->status.sourceVersion = HDMI_SCDC_HDMI20_VERSION; + return true; +} + +int32_t HdmiScdcOptMsgHandle(struct HdmiScdc *scdc, enum HdmiScdcOptMsg msg, uint8_t *buffer, uint32_t len) +{ + int32_t ret; + + if (scdc == NULL || buffer == NULL || len == 0) { + return HDF_ERR_INVALID_PARAM; + } + + switch (msg) { + case HDMI_SCDC_OPT_SET_SOURCE_VER : + ret = HdmiScdcWriteSourceVersion(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_SOURCE_VER : + ret = HdmiScdcReadSourceVersion(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_SINK_VER : + ret = HdmiScdcReadSinkVersion(scdc, buffer); + break; + case HDMI_SCDC_OPT_SET_FLT_UPDATE : + case HDMI_SCDC_OPT_SET_FRL_START : + ret = HdmiScdcWriteUpdate0(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_FLT_UPDATE : + case HDMI_SCDC_OPT_GET_FRL_START : + ret = HdmiScdcReadUpdate0(scdc, buffer); + break; + case HDMI_SCDC_OPT_SET_CONFIG1 : + ret = HdmiScdcWriteConfig1(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_CONFIG1 : + ret = HdmiScdcReadConfig1(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_TEST_CONFIG_1 : + ret = HdmiScdcReadTestConfig1(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_FLT_READY : + ret = HdmiScdcReadStatusFlag0(scdc, buffer); + break; + case HDMI_SCDC_OPT_GET_LTP_REQ : + ret = HdmiScdcRead(scdc, HDMI_SCDCS_OFFSET_STASTUS_FLAG_1, buffer, len); + break; + default : + HDF_LOGE("scdc msg handle, msg %d not support.", msg); + ret = HDF_ERR_NOT_SUPPORT; + break; + } + + return ret; +} + +int32_t HdmiScdcFillScrambleCap(struct HdmiScdc *scdc, struct HdmiScdcScrambleCap *scramble, + enum HdmiTmdsModeType *tmdsMode) +{ + struct HdmiCntlr *cntlr = NULL; + struct HdmiCommonAttr *commAttr = NULL; + struct HdmiVideoAttr *videoAttr = NULL; + + if (scdc == NULL || scdc->priv == NULL || scramble == NULL || tmdsMode == NULL) { + HDF_LOGD("scdc fill scramble cap: param is null"); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = (struct HdmiCntlr *)scdc->priv; + commAttr = &(cntlr->attr.commAttr); + videoAttr = &(cntlr->attr.videoAttr); + if (commAttr->enableHdmi == false) { + /* DVI mode */ + *tmdsMode = HDMI_TMDS_MODE_DVI; + scramble->sinkScramble = false; + scramble->sourceScramble = false; + scramble->tmdsBitClockRatio40 = false; + if (videoAttr->tmdsClock > HDMI_HDMI14_MAX_TMDS_RATE) { + HDF_LOGE("tmds clock %u can't support in DVI mode.", videoAttr->tmdsClock); + return HDF_ERR_INVALID_PARAM; + } + } else if (videoAttr->tmdsClock > HDMI_HDMI14_MAX_TMDS_RATE) { + *tmdsMode = HDMI_TMDS_MODE_HDMI_2_0; + scramble->sinkScramble = true; + scramble->sourceScramble = true; + scramble->tmdsBitClockRatio40 = true; + } else { + *tmdsMode = HDMI_TMDS_MODE_HDMI_1_4; + scramble->sinkScramble = false; + scramble->sourceScramble = false; + scramble->tmdsBitClockRatio40 = false; + } + return HDF_SUCCESS; +} -- Gitee From c16c74d48da2244901cbdbf6ac211802f81f48ae Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 14 Oct 2021 20:20:00 +0800 Subject: [PATCH 078/272] Optimized vibrator Signed-off-by: YOUR_NAME --- .../vibrator/driver/src/vibrator_haptic.c | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/model/misc/vibrator/driver/src/vibrator_haptic.c b/model/misc/vibrator/driver/src/vibrator_haptic.c index 2fba10f7a..fe31bc8c5 100644 --- a/model/misc/vibrator/driver/src/vibrator_haptic.c +++ b/model/misc/vibrator/driver/src/vibrator_haptic.c @@ -60,21 +60,21 @@ static int32_t ParserHapticEffect(struct DeviceResourceIface *parser, const stru int32_t ret; int32_t count; struct VibratorEffectNode *effectNode = NULL; - const struct DeviceResourceAttr *hapticAttr = NULL; + const struct DeviceResourceNode *childNode = NULL; struct VibratorHapticData *hapticData = GetHapticData(); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(hapticData, HDF_FAILURE); (void)OsalMutexLock(&hapticData->mutex); - DEV_RES_NODE_FOR_EACH_ATTR(hapticNode, hapticAttr) { - if ((hapticAttr == NULL) || (hapticAttr->name == NULL)) { + DEV_RES_NODE_FOR_EACH_CHILD_NODE(hapticNode, childNode) { + if ((childNode == NULL) || (childNode->name == NULL)) { + HDF_LOGI("%s:childNode is NULL", __func__); break; } - count = parser->GetElemNum(hapticNode, hapticAttr->name); - // Minimum of two elements, including the type and sequence. + count = parser->GetElemNum(childNode, "seq"); if (count <= 1 || count > VIBRATOR_HAPTIC_SEQ_MAX) { - HDF_LOGE("%s: haptic [%s] parser seq count fail", __func__, hapticAttr->name); + HDF_LOGE("%s: haptic [%s] parser seq count fail", __func__, childNode->name); continue; } @@ -83,10 +83,11 @@ static int32_t ParserHapticEffect(struct DeviceResourceIface *parser, const stru HDF_LOGE("%s: malloc effect effectNode fail", __func__); continue; } - effectNode->effect = hapticAttr->name; - ret = parser->GetUint32Array(hapticNode, hapticAttr->name, effectNode->seq, count, 0); - CHECK_VIBRATOR_PARSER_RESULT_RETURN_VALUE(ret, hapticAttr->name); effectNode->num = count; + ret = parser->GetString(childNode, "effectName", &effectNode->effect, NULL); + ret = parser->GetUint32(childNode, "type", &effectNode->type, 0); + ret = parser->GetUint32Array(childNode, "seq", effectNode->seq, count, 0); + DListInsertTail(&effectNode->node, &hapticData->effectSeqHead); } (void)OsalMutexUnlock(&hapticData->mutex); @@ -249,9 +250,10 @@ static int32_t GetHapticSeqByEffect(struct VibratorEffectCfg *effectCfg) if ((effectCfg->cfgMode == VIBRATOR_MODE_PRESET) && (effectCfg->effect != NULL)) { DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &hapticData->effectSeqHead, struct VibratorEffectNode, node) { if (strcmp(effectCfg->effect, pos->effect) == 0 && pos->seq != NULL) { - hapticData->effectType = pos->seq[0]; - hapticData->seqCount = pos->num - 1; - hapticData->currentEffectSeq = &(pos->seq[1]); + hapticData->effectType = pos->type; + HDF_LOGE("%s: pos_num = %d", __func__, pos->num); + hapticData->seqCount = pos->num; + hapticData->currentEffectSeq = &(pos->seq[0]); break; } } -- Gitee From 02c22428823383489a5f059afd5525a51c374a15 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 14 Oct 2021 20:26:30 +0800 Subject: [PATCH 079/272] Optimized vibrator Signed-off-by: YOUR_NAME --- model/misc/vibrator/driver/src/vibrator_haptic.c | 1 - 1 file changed, 1 deletion(-) diff --git a/model/misc/vibrator/driver/src/vibrator_haptic.c b/model/misc/vibrator/driver/src/vibrator_haptic.c index fe31bc8c5..a41771064 100644 --- a/model/misc/vibrator/driver/src/vibrator_haptic.c +++ b/model/misc/vibrator/driver/src/vibrator_haptic.c @@ -68,7 +68,6 @@ static int32_t ParserHapticEffect(struct DeviceResourceIface *parser, const stru (void)OsalMutexLock(&hapticData->mutex); DEV_RES_NODE_FOR_EACH_CHILD_NODE(hapticNode, childNode) { if ((childNode == NULL) || (childNode->name == NULL)) { - HDF_LOGI("%s:childNode is NULL", __func__); break; } -- Gitee From 62192bf7c86f21ff7b1772961c188a663ddb7cec Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 14 Oct 2021 16:26:35 +0800 Subject: [PATCH 080/272] clear the warings of reviewbot Signed-off-by: YOUR_NAME --- utils/src/hdf_object_alloc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/utils/src/hdf_object_alloc.c b/utils/src/hdf_object_alloc.c index c923d4936..1d310b326 100644 --- a/utils/src/hdf_object_alloc.c +++ b/utils/src/hdf_object_alloc.c @@ -6,7 +6,6 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_base.h" #include "hdf_object_alloc.h" #include "hdf_slist.h" #include "osal_mutex.h" -- Gitee From d7a500aa584e649127130229fb07e4d56bb72b33 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 15 Oct 2021 09:47:01 +0800 Subject: [PATCH 081/272] Optimized vibrator Signed-off-by: YOUR_NAME --- model/misc/vibrator/driver/include/vibrator_haptic.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/misc/vibrator/driver/include/vibrator_haptic.h b/model/misc/vibrator/driver/include/vibrator_haptic.h index c6f4b1062..ec1d93d67 100644 --- a/model/misc/vibrator/driver/include/vibrator_haptic.h +++ b/model/misc/vibrator/driver/include/vibrator_haptic.h @@ -32,7 +32,8 @@ enum VibratorTimeSeqIndex { struct VibratorEffectNode { const char *effect; int32_t num; - uint32_t *seq; // The first element of seq is preset type referring to enum VibratorEffectType + uint32_t type; // preset type + uint32_t *seq; struct DListHead node; }; -- Gitee From c8a69d02e25ee88c63247caa02a266da3bd08e29 Mon Sep 17 00:00:00 2001 From: lzl Date: Fri, 15 Oct 2021 02:03:56 +0000 Subject: [PATCH 082/272] HDMI Framework code Signed-off-by: lzl --- include/platform/hdmi_if.h | 35 ++- support/platform/include/hdmi/hdmi_common.h | 16 + support/platform/include/hdmi/hdmi_edid.h | 22 -- support/platform/src/hdmi/hdmi_cec.c | 78 ++--- support/platform/src/hdmi/hdmi_common.c | 22 +- support/platform/src/hdmi/hdmi_core.c | 14 +- support/platform/src/hdmi/hdmi_dfm.c | 28 +- support/platform/src/hdmi/hdmi_edid.c | 310 ++++++++++---------- support/platform/src/hdmi/hdmi_event.c | 34 +-- support/platform/src/hdmi/hdmi_frl.c | 54 ++-- support/platform/src/hdmi/hdmi_hdcp.c | 7 +- support/platform/src/hdmi/hdmi_hdr.c | 2 +- support/platform/src/hdmi/hdmi_infoframe.c | 26 +- support/platform/src/hdmi/hdmi_scdc.c | 30 +- 14 files changed, 346 insertions(+), 332 deletions(-) diff --git a/include/platform/hdmi_if.h b/include/platform/hdmi_if.h index 88cf4f872..0241713c0 100644 --- a/include/platform/hdmi_if.h +++ b/include/platform/hdmi_if.h @@ -362,6 +362,11 @@ enum HdmiNups { HDMI_NUPS_BOTH = 3, /* Picture has been scaled horizontally and vertically */ }; +/** + * @brief Defines the video attribute struct. + * + * @since 1.0 + */ struct HdmiVideoAttr { uint32_t tmdsClock; /* unit: KHz */ uint32_t pixelClock; /* unit: KHz */ @@ -476,7 +481,7 @@ enum HdmiAudioFormatChannel { }; /** - * @brief Defines the audio Attribute struct. + * @brief Defines the audio attribute struct. * * @since 1.0 */ @@ -489,13 +494,18 @@ struct HdmiAudioAttr { enum HdmiAudioFormatChannel channels; }; -/* Electro-Optical Transfer Function (EOTF) type define. */ +/** + * @brief Enumerates Electro-Optical Transfer Function (EOTF), + * see the section 6.9 of CTA-861-G for details. + * + * @since 1.0 + */ enum HdmiEotfType { - HDMI_DRM_EOTF_SDR_LUMIN = 0, /* Traditional gamma - SDR Luminance Range */ - HDMI_DRM_EOTF_HDR_LUMIN = 1, /* Traditional gamma - HDR Luminance Range */ - HDMI_DRM_EOTF_SMPTE_ST_2048 = 2, /* SMPTE ST 2048 */ - HDMI_DRM_EOTF_HLG = 3, /* Hybrid Log-Gamma (HLG) based on ITU-R BT.2100-0 */ - HDMI_DRM_EOTF_BUTT, + HDMI_EOTF_SDR_LUMIN = 0, /* Traditional gamma - SDR Luminance Range */ + HDMI_EOTF_HDR_LUMIN = 1, /* Traditional gamma - HDR Luminance Range */ + HDMI_EOTF_SMPTE_ST_2048 = 2, /* SMPTE ST 2048 */ + HDMI_EOTF_HLG = 3, /* Hybrid Log-Gamma (HLG) based on ITU-R BT.2100-0 */ + HDMI_EOTF_BUTT, }; /** @@ -578,10 +588,21 @@ struct HdmiStaticMetadataDescriptor1st { uint16_t maxFrameAverageLightLevel; /* Maximum Frame-average Light Level, in units of 1 cd/m^2 */ }; +/** + * @brief Defines the static metadata descriptor, + * see the section 6.9 of CTA-861-G for details. + * + * @since 1.0 + */ union HdmiStaticMetadataDescriptor { struct HdmiStaticMetadataDescriptor1st type1; }; +/** + * @brief Defines the hdr attribute struct. + * + * @since 1.0 + */ struct HdmiHdrAttr { enum HdmiHdrMode mode; enum HdmiHdrUserMode userMode; diff --git a/support/platform/include/hdmi/hdmi_common.h b/support/platform/include/hdmi/hdmi_common.h index 1c2fa1fcc..0552e60b8 100644 --- a/support/platform/include/hdmi/hdmi_common.h +++ b/support/platform/include/hdmi/hdmi_common.h @@ -22,6 +22,22 @@ extern "C" { #define HDMI_VESA_VIDEO_CODE_MAX 31 #define HDMI_VIDEO_4K_CODES_MAX 4 +#define HDMI_BIT0_MARK 0x01 +#define HDMI_BIT1_MARK 0x02 +#define HDMI_BIT2_MARK 0x04 +#define HDMI_BIT3_MARK 0x08 +#define HDMI_BIT4_MARK 0x10 +#define HDMI_BIT5_MARK 0x20 +#define HDMI_BIT6_MARK 0x40 +#define HDMI_BIT7_MARK 0x80 +#define HDMI_UPPER_NIBBLE_MARK 0xf0 +#define HDMI_LOWER_NIBBLE_MARK 0x0f +#define HDMI_BITS_OF_ONE_BYTE 8 +#define HDMI_ONE_BYTE_SHIFT 8 +#define HDMI_6_BITS_SHIFT 6 +#define HDMI_NIBBLE_SHIFT 4 +#define HDMI_2_BITS_SHIFT 2 + #define HDMI_HDMI14_MAX_TMDS_RATE 340000 /* unit: KHz */ #define HDMI_HDMI20_MAX_TMDS_RATE 600000 /* unit: KHz */ #define HDMI_MULTIPLE_2P0(x) (2 * x) diff --git a/support/platform/include/hdmi/hdmi_edid.h b/support/platform/include/hdmi/hdmi_edid.h index 0bc17dfaa..edeba2c03 100644 --- a/support/platform/include/hdmi/hdmi_edid.h +++ b/support/platform/include/hdmi/hdmi_edid.h @@ -24,23 +24,6 @@ extern "C" { #define HDMI_EDID_MAX_BLOCK_NUM 4 #define HDMI_EDID_TOTAL_SIZE (HDMI_EDID_SINGLE_BLOCK_SIZE * HDMI_EDID_MAX_BLOCK_NUM) #define HDMI_EDID_MAX_VIC_COUNT 128 - -#define HDMI_EDID_BIT0_MARK 0x01 -#define HDMI_EDID_BIT1_MARK 0x02 -#define HDMI_EDID_BIT2_MARK 0x04 -#define HDMI_EDID_BIT3_MARK 0x08 -#define HDMI_EDID_BIT4_MARK 0x10 -#define HDMI_EDID_BIT5_MARK 0x20 -#define HDMI_EDID_BIT6_MARK 0x40 -#define HDMI_EDID_BIT7_MARK 0x80 -#define HDMI_EDID_UPPER_NIBBLE_MARK 0xf0 -#define HDMI_EDID_LOWER_NIBBLE_MARK 0x0f -#define HDMI_EDID_BITS_OF_ONE_BYTE 8 -#define HDMI_EDID_ONE_BYTE_SHIFT 8 -#define HDMI_EDID_6_BITS_SHIFT 6 -#define HDMI_EDID_NIBBLE_SHIFT 4 -#define HDMI_EDID_2_BITS_SHIFT 2 - #define HDMI_EDID_CHECK_SUM_MARK 0xff /* edid header */ @@ -58,9 +41,6 @@ extern "C" { #define HDMI_EDID_PRODUCT_CODE_SHIFT 8 #define HDMI_EDID_SERIAL_NUMBER_FIELD_LEN 4 #define HDMI_EDID_SERIAL_NUMBER_SHIFT 8 -#define HDMI_EDID_WEEK_LOW_VALID 1 -#define HDMI_EDID_WEEK_HIGH_VALID 53 -#define HDMI_EDID_YEAR_VALID 0xFF #define HDMI_EDID_YEAR_BASE 1990 struct HdmiEdidVendorInfo { @@ -326,7 +306,6 @@ struct HdmiEdidColorSpace { #define HDMI_EDID_EXTENSION_AUDIO_BIT_RATE_FACTOR 8 #define HDMI_EDID_EXTENSION_AUDIO_CAP_COUNT 16 - struct HdmiEdidAudioInfo { enum HdmiAudioCodingType formatCode; uint32_t sampleRateNum; @@ -520,7 +499,6 @@ struct HdmiEdidColorimetry { #define HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK 0x1C #define HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT 2 - struct HdmiEdidVsvdbDolbyCap { uint32_t oui; uint8_t version; diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index da013387a..39b195275 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -206,10 +206,10 @@ static bool HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg *msg, uint8_t opcod bool ret = true; switch (opcode) { - case HDMI_CEC_OPCODE_TIMER_STATUS : + case HDMI_CEC_OPCODE_TIMER_STATUS: ret = HdmiCecCheckTimerStatusMsgLen(msg); break; - case HDMI_CEC_OPCODE_RECORD_ON : + case HDMI_CEC_OPCODE_RECORD_ON: ret = HdmiCecCheckRecordOnMsgLen(msg); default : break; @@ -360,10 +360,10 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H return; } switch (digital->system) { - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T: data[1] = digital->systemData.arib.transportId >> HDMI_ONE_BYTE_SHIFT; data[2] = digital->systemData.arib.transportId & HDMI_ONE_BYTE_MARK; data[3] = digital->systemData.arib.serviceId >> HDMI_ONE_BYTE_SHIFT; @@ -371,20 +371,20 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H data[5] = digital->systemData.arib.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; data[6] = digital->systemData.arib.orgNetworkId & HDMI_ONE_BYTE_MARK; break; - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL: data[1] = digital->systemData.atsc.transportId >> HDMI_ONE_BYTE_SHIFT; data[2] = digital->systemData.atsc.transportId & HDMI_ONE_BYTE_MARK; data[3] = digital->systemData.atsc.programNumber >> HDMI_ONE_BYTE_SHIFT; data[4] = digital->systemData.atsc.programNumber & HDMI_ONE_BYTE_MARK; break; - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2 : - case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T : + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2: + case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T: data[1] = digital->systemData.dvb.transportId >> HDMI_ONE_BYTE_SHIFT; data[2] = digital->systemData.dvb.transportId & HDMI_ONE_BYTE_MARK; data[3] = digital->systemData.dvb.serviceId >> HDMI_ONE_BYTE_SHIFT; @@ -437,20 +437,20 @@ static void HdmiCecEncodingRecordOnExtPhyAddr(struct HdmiCecMsg *msg, uint16_t e void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSource *src, bool response) { switch (src->type) { - case HDMI_CEC_RECORD_SRC_OWN : + case HDMI_CEC_RECORD_SRC_OWN: HdmiCecEncodingRecordOnOwn(msg); break; - case HDMI_CEC_RECORD_SRC_DIGITAL : + case HDMI_CEC_RECORD_SRC_DIGITAL: HdmiCecEncodingRecordOnDigital(msg, &(src->data.id)); break; - case HDMI_CEC_RECORD_SRC_ANALOG : + case HDMI_CEC_RECORD_SRC_ANALOG: HdmiCecEncodingRecordOnAnalog(msg, src->data.analog.anaBcastType, src->data.analog.anaFreq, src->data.analog.bcstSystem); break; - case HDMI_CEC_RECORD_SRC_EXT_PLUG : + case HDMI_CEC_RECORD_SRC_EXT_PLUG: HdmiCecEncodingRecordOnExtPlug(msg, src->data.extPlug); break; - case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR : + case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR: HdmiCecEncodingRecordOnExtPhyAddr(msg, src->data.extPhyAddr); break; default : @@ -970,17 +970,17 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe return; } switch (cmd->cmdType) { - case HDMI_CEC_UI_CMD_SELECT_BROADCAST_TYPE : - case HDMI_CEC_UI_CMD_SELECT_SOUND_PRESENTATION : - case HDMI_CEC_UI_CMD_PLAY_FUNCTION : - case HDMI_CEC_UI_CMD_SELECT_MEDIA_FUNCTION : - case HDMI_CEC_UI_CMD_SELECT_AV_INPUT_FUNCTION : - case HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION : + case HDMI_CEC_UI_CMD_SELECT_BROADCAST_TYPE: + case HDMI_CEC_UI_CMD_SELECT_SOUND_PRESENTATION: + case HDMI_CEC_UI_CMD_PLAY_FUNCTION: + case HDMI_CEC_UI_CMD_SELECT_MEDIA_FUNCTION: + case HDMI_CEC_UI_CMD_SELECT_AV_INPUT_FUNCTION: + case HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION: (msg->len)++; /* The additional operand is one byte for all these UI commands */ msg->data[3] = cmd->addOperands.uiBroadcastType; break; - case HDMI_CEC_UI_CMD_TUNE_FUNCTION : + case HDMI_CEC_UI_CMD_TUNE_FUNCTION: msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN; msg->data[3] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); @@ -988,7 +988,7 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe msg->data[5] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); msg->data[6] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); break; - default : + default: HDF_LOGI("UI type %d have no additional operands.", cmd->cmdType); break; } @@ -1389,35 +1389,35 @@ static int32_t HdmiCecSendMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast) { switch (opcode) { - case HDMI_CEC_OPCODE_GET_CEC_VERSION : - case HDMI_CEC_OPCODE_ABORT : - case HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS : - case HDMI_CEC_OPCODE_GIVE_OSD_NAME : + case HDMI_CEC_OPCODE_GET_CEC_VERSION: + case HDMI_CEC_OPCODE_ABORT: + case HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: + case HDMI_CEC_OPCODE_GIVE_OSD_NAME: /* Ignore if initiator is Unregistered, because these messages should reply with a directed message. */ if (unregistered == true) { return true; } /* fallthrough */ - case HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID : - case HDMI_CEC_OPCODE_GIVE_FEATURES : - case HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS : + case HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID: + case HDMI_CEC_OPCODE_GIVE_FEATURES: + case HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: /* Ignore if addressing is wrong */ if (broadcast == true) { return true; } break; - case HDMI_CEC_OPCODE_USER_CONTROL_PRESSED : - case HDMI_CEC_OPCODE_USER_CONTROL_RELEASED : + case HDMI_CEC_OPCODE_USER_CONTROL_PRESSED: + case HDMI_CEC_OPCODE_USER_CONTROL_RELEASED: if (unregistered == true || broadcast == true) { return true; } break; - case HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS : + case HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS: if (broadcast == false) { return true; } break; - default : + default: break; } return false; diff --git a/support/platform/src/hdmi/hdmi_common.c b/support/platform/src/hdmi/hdmi_common.c index 031d40beb..ced9501ee 100644 --- a/support/platform/src/hdmi/hdmi_common.c +++ b/support/platform/src/hdmi/hdmi_common.c @@ -187,19 +187,19 @@ enum HdmiVideoBitDepth HdmiCommonDeepClolorConvertToColorDepth(enum HdmiDeepColo enum HdmiVideoBitDepth colorDepth; switch (deepColor) { - case HDMI_DEEP_COLOR_24BITS : + case HDMI_DEEP_COLOR_24BITS: colorDepth = HDMI_VIDEO_BIT_DEPTH_8; break; - case HDMI_DEEP_COLOR_30BITS : + case HDMI_DEEP_COLOR_30BITS: colorDepth = HDMI_VIDEO_BIT_DEPTH_10; break; - case HDMI_DEEP_COLOR_36BITS : + case HDMI_DEEP_COLOR_36BITS: colorDepth = HDMI_VIDEO_BIT_DEPTH_12; break; - case HDMI_DEEP_COLOR_48BITS : + case HDMI_DEEP_COLOR_48BITS: colorDepth = HDMI_VIDEO_BIT_DEPTH_16; break; - default : + default: HDF_LOGD("deep color %d is not support, use default value.", deepColor); colorDepth = HDMI_VIDEO_BIT_DEPTH_8; break; @@ -212,22 +212,22 @@ enum HdmiDeepColor HdmiCommonColorDepthConvertToDeepClolor(enum HdmiVideoBitDept enum HdmiDeepColor deepColor; switch (colorDepth) { - case HDMI_VIDEO_BIT_DEPTH_8 : + case HDMI_VIDEO_BIT_DEPTH_8: deepColor = HDMI_DEEP_COLOR_24BITS; break; - case HDMI_VIDEO_BIT_DEPTH_10 : + case HDMI_VIDEO_BIT_DEPTH_10: deepColor = HDMI_DEEP_COLOR_30BITS; break; - case HDMI_VIDEO_BIT_DEPTH_12 : + case HDMI_VIDEO_BIT_DEPTH_12: deepColor = HDMI_DEEP_COLOR_36BITS; break; - case HDMI_VIDEO_BIT_DEPTH_16 : + case HDMI_VIDEO_BIT_DEPTH_16: deepColor = HDMI_DEEP_COLOR_48BITS; break; - case HDMI_VIDEO_BIT_DEPTH_OFF : + case HDMI_VIDEO_BIT_DEPTH_OFF: deepColor = HDMI_DEEP_COLOR_OFF; break; - default : + default: deepColor = HDMI_DEEP_COLOR_BUTT; break; } diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index 7f3396a8c..1fa7308cf 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -858,7 +858,7 @@ static int32_t HdmiColorSpaceCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDevic } switch (commAttr->colorSpace) { - case HDMI_COLOR_SPACE_RGB : + case HDMI_COLOR_SPACE_RGB: supportColorSpace = true; if ((sinkCap->colorSpace.rgb444 && cap->bits.rgb444) == false) { HDF_LOGD("sink or source not support RGB!"); @@ -1090,8 +1090,8 @@ static void HdmiHdrModeCheck(struct HdmiCommonAttr *commAttr, static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, struct HdmiHardwareStatus *hwStatus, struct HdmiCommonAttr *commAttr) { - bool rgb; - bool aspectIs256; + bool rgb = false; + bool aspectIs256 = false; uint8_t vic; enum HdmiVsVideoFormat format; enum Hdmi4kVic vic4k; @@ -1139,15 +1139,15 @@ static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, static void HdmiFillCommonAttrFromHardwareStatus(struct HdmiCommonAttr *commAttr, struct HdmiHardwareStatus *hwStatus, struct HdmiAttr *attr) { - bool dolby; + bool dolby = false; switch (hwStatus->commonStatus.tmdsMode) { - case HDMI_TMDS_MODE_HDMI_1_4 : - case HDMI_TMDS_MODE_HDMI_2_0 : + case HDMI_TMDS_MODE_HDMI_1_4: + case HDMI_TMDS_MODE_HDMI_2_0: commAttr->enableHdmi = true; commAttr->enableVideo = true; break; - case HDMI_TMDS_MODE_DVI : + case HDMI_TMDS_MODE_DVI: commAttr->enableHdmi = false; commAttr->enableVideo = true; break; diff --git a/support/platform/src/hdmi/hdmi_dfm.c b/support/platform/src/hdmi/hdmi_dfm.c index eddff1b70..2475025cc 100644 --- a/support/platform/src/hdmi/hdmi_dfm.c +++ b/support/platform/src/hdmi/hdmi_dfm.c @@ -20,19 +20,19 @@ uint32_t HdmiDfmGetPixelFormat(enum HdmiColorSpace colorSpace) uint32_t pixelFormat; switch (colorSpace) { - case HDMI_COLOR_SPACE_RGB : + case HDMI_COLOR_SPACE_RGB: pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_0; break; - case HDMI_COLOR_SPACE_YCBCR420 : + case HDMI_COLOR_SPACE_YCBCR420: pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_1; break; - case HDMI_COLOR_SPACE_YCBCR422 : + case HDMI_COLOR_SPACE_YCBCR422: pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_2; break; - case HDMI_COLOR_SPACE_YCBCR444 : + case HDMI_COLOR_SPACE_YCBCR444: pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_3; break; - default : + default: pixelFormat = HDMI_DFM_PIXEL_FORMAT_MODE_0; break; } @@ -108,21 +108,21 @@ static uint32_t HdmiDfmGetAudioPackets(struct HdmiDfmParam *param) uint32_t ap = 0; switch (param->packetType) { - case HDMI_AUDIO_SAMPLE_PACKET : - case HDMI_ONE_BIT_AUDIO_SAMPLE_PACKET : + case HDMI_AUDIO_SAMPLE_PACKET: + case HDMI_ONE_BIT_AUDIO_SAMPLE_PACKET: ap = HDMI_AUDIO_AP_SIZE_100; if (param->layout == false) { ap = HDMI_AUDIO_AP_SIZE_25; } break; - case HDMI_DTS_AUDIO_PACKET : - case HDMI_HBR_AUDIO_PACKET : - case HDMI_MULTI_STREAM_AUDIO_SAMPLE_PACKET : - case HDMI_ONE_BIT_MULTI_STREAM_AUDIO_SAMPLE_PACKET : + case HDMI_DTS_AUDIO_PACKET: + case HDMI_HBR_AUDIO_PACKET: + case HDMI_MULTI_STREAM_AUDIO_SAMPLE_PACKET: + case HDMI_ONE_BIT_MULTI_STREAM_AUDIO_SAMPLE_PACKET: ap = HDMI_AUDIO_AP_SIZE_100; break; - case HDMI_AUDIO_3D_SAMPLE_PACKET : - case HDMI_ONE_BIT_AUDIO_3D_SAMPLE_PACKET : + case HDMI_AUDIO_3D_SAMPLE_PACKET: + case HDMI_ONE_BIT_AUDIO_3D_SAMPLE_PACKET: if (param->acat == HDMI_AUDIO_CHANNEL_ALLOC_TYPE1) { ap = HDMI_AUDIO_AP_SIZE_200; } else if (param->acat == HDMI_AUDIO_CHANNEL_ALLOC_TYPE2) { @@ -131,7 +131,7 @@ static uint32_t HdmiDfmGetAudioPackets(struct HdmiDfmParam *param) ap = HDMI_AUDIO_AP_SIZE_400; } break; - default : + default: HDF_LOGE("audio packet type 0x%x, is not support.", param->packetType); break; } diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index e619f425a..f142a5ec1 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -169,7 +169,7 @@ static int32_t HdmiEdidEstablisedTimingPhase(struct HdmiEdid *edid) struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; for (i = 0; i < HDMI_EDID_ESTABLISHED_TIMINGS_FIELD_LEN; i++) { - data |= (block->estTimings[i] << (i * HDMI_EDID_ONE_BYTE_SHIFT)); + data |= (block->estTimings[i] << (i * HDMI_ONE_BYTE_SHIFT)); } /* @@ -190,19 +190,19 @@ static uint32_t HdmiEdidGetStandardTimingVertPixel(uint32_t aspectRatio, uint32_ uint32_t vertPixel = 0; switch (aspectRatio) { - case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_10 : + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_10: vertPixel = horizPixel * 10 / 16; break; - case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_5_4 : + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_5_4: vertPixel = horizPixel * 4 / 5; break; - case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_4_3 : + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_4_3: vertPixel = horizPixel * 3 / 4; break; - case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_9 : + case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_9: vertPixel = horizPixel * 9 / 16; break; - default : + default: HDF_LOGE("aspectRatio %d is invalid.", aspectRatio); break; } @@ -253,30 +253,30 @@ static void HdmiEdidDigitalSyncSignal(struct HdmiEdidPreferredTimingInfo *perTim { /* bit3/bit2/bit1 */ switch ((flags & HDMI_EDID_DETAILED_TIMING_SYNC_SIGNAL_TYPE_MARK) >> 1) { - case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_0 : - case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_1 : - case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_2 : - case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_3 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_0: + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_WS_1: + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_2: + case HDMI_EDID_DETAILED_TIMING_SYNC_DCS_DS_3: perTiming->ihs = false; perTiming->ivs = false; break; - case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HN_4 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HN_4: perTiming->ihs = false; perTiming->ivs = false; break; - case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HP_5 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VN_HP_5: perTiming->ihs = true; perTiming->ivs = false; break; - case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HN_6 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HN_6: perTiming->ihs = false; perTiming->ivs = true; break; - case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HP_7 : + case HDMI_EDID_DETAILED_TIMING_SYNC_DSS_VP_HP_7: perTiming->ihs = true; perTiming->ivs = true; break; - default : + default: break; } } @@ -293,7 +293,7 @@ static void HdmiEdidDetailedTimingDescriptorPhase(struct HdmiSinkDeviceCapabilit } perTiming = &cap->preTimingInfo[cap->preTimingCnt]; - pixelClock = (block->pixelClk[1] << HDMI_EDID_ONE_BYTE_SHIFT) | (block->pixelClk[0]); + pixelClock = (block->pixelClk[1] << HDMI_ONE_BYTE_SHIFT) | (block->pixelClk[0]); if (pixelClock == 0) { HDF_LOGD(" pixel clock is 0. preTimingCnt = %d", cap->preTimingCnt); return; @@ -301,32 +301,32 @@ static void HdmiEdidDetailedTimingDescriptorPhase(struct HdmiSinkDeviceCapabilit perTiming->pixelClk = pixelClock * HDMI_EDID_DETAILED_TIMING_PIXEL_CLK_KHZ_FACTOR; perTiming->hActive = (block->hActive) | - ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_NIBBLE_SHIFT); perTiming->hBackBlank = (block->hBlanking) | - ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); + ((block->hActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_ONE_BYTE_SHIFT); perTiming->hFrontBlank = (block->hSyncOffset) | - ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_OFFSET_MARK) << HDMI_EDID_2_BITS_SHIFT); + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_OFFSET_MARK) << HDMI_2_BITS_SHIFT); perTiming->hSyncPluseWidth = (block->hSyncPulseWidth) | - ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_PULSE_WIDTH_MARK) << HDMI_EDID_NIBBLE_SHIFT); + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_HS_PULSE_WIDTH_MARK) << HDMI_NIBBLE_SHIFT); perTiming->vActive = (block->vActive) | - ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_NIBBLE_SHIFT); perTiming->vBackBlank = (block->vBlanking) | - ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); + ((block->vActiveBlanking & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_ONE_BYTE_SHIFT); perTiming->vFrontBlank = - ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_OFFSET_MARK) << HDMI_EDID_2_BITS_SHIFT) | - ((block->vsOffesetPulseWidth & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) >> HDMI_EDID_NIBBLE_SHIFT); + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_OFFSET_MARK) << HDMI_2_BITS_SHIFT) | + ((block->vsOffesetPulseWidth & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) >> HDMI_NIBBLE_SHIFT); perTiming->vSyncPluseWidth = - ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_PULSE_WIDTH_MARK) << HDMI_EDID_NIBBLE_SHIFT) | + ((block->hsOffsetVsOffset & HDMI_EDID_DETAILED_TIMING_VS_PULSE_WIDTH_MARK) << HDMI_NIBBLE_SHIFT) | (block->vsOffesetPulseWidth & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK); perTiming->imageWidth = (block->hImageSize) | - ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_EDID_NIBBLE_SHIFT); + ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_UPPER_4BITS_MARK) << HDMI_NIBBLE_SHIFT); perTiming->imageHeight = (block->vImageSize) | - ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_EDID_ONE_BYTE_SHIFT); - perTiming->interlaceFlag = (block->flags & HDMI_EDID_BIT7_MARK) ? true : false; + ((block->hvImageSize & HDMI_EDID_DETAILED_TIMING_LOWER_4BITS_MARK) << HDMI_ONE_BYTE_SHIFT); + perTiming->interlaceFlag = (block->flags & HDMI_BIT7_MARK) ? true : false; /* Digital composite/separate */ - if ((block->flags & HDMI_EDID_BIT4_MARK) != 0) { + if ((block->flags & HDMI_BIT4_MARK) != 0) { HdmiEdidDigitalSyncSignal(perTiming, block->flags); } cap->preTimingCnt++; @@ -413,39 +413,39 @@ static int32_t HdmiEdidFirstBlockPhase(struct HdmiEdid *edid) static void HdmiEdidExtAdbSampleRatePhase(struct HdmiEdidAudioInfo *audio, uint8_t data, uint8_t formatCode) { - if ((data & HDMI_EDID_BIT0_MARK) > 0 && + if ((data & HDMI_BIT0_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_32K; audio->sampleRateNum++; } - if ((data & HDMI_EDID_BIT1_MARK) > 0 && + if ((data & HDMI_BIT1_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_44K; audio->sampleRateNum++; } - if ((data & HDMI_EDID_BIT2_MARK) > 0 && + if ((data & HDMI_BIT2_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_48K; audio->sampleRateNum++; } - if ((data & HDMI_EDID_BIT3_MARK) > 0 && + if ((data & HDMI_BIT3_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_88K; audio->sampleRateNum++; } - if ((data & HDMI_EDID_BIT4_MARK) > 0 && + if ((data & HDMI_BIT4_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_96K; audio->sampleRateNum++; } if (formatCode >= HDMI_AUDIO_CODING_TYPE_LPCM && formatCode <= HDMI_AUDIO_CODING_TYPE_WMA_PRO) { - if ((data & HDMI_EDID_BIT5_MARK) > 0 && + if ((data & HDMI_BIT5_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_176K; audio->sampleRateNum++; } - if ((data & HDMI_EDID_BIT6_MARK) > 0 && + if ((data & HDMI_BIT6_MARK) > 0 && audio->sampleRateNum < HDMI_EDID_EXTENSION_AUDIO_MAX_SAMPLE_RATE_NUM) { audio->sampleRate[audio->sampleRateNum] = HDMI_SAMPLE_RATE_192K; audio->sampleRateNum++; @@ -460,17 +460,17 @@ static void HdmiEdidExtAdbDepthAndMaxRatePhase(struct HdmiEdidAudioInfo *audio, * Audio Format Codes 2 to 8, Maximum bit rate divided by 8 kHz. */ if (formatCode == HDMI_AUDIO_CODING_TYPE_LPCM) { - if ((data & HDMI_EDID_BIT0_MARK) > 0 && + if ((data & HDMI_BIT0_MARK) > 0 && audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_16; audio->bitDepthNum++; } - if ((data & HDMI_EDID_BIT1_MARK) > 0 && + if ((data & HDMI_BIT1_MARK) > 0 && audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_20; audio->bitDepthNum++; } - if ((data & HDMI_EDID_BIT2_MARK) > 0 && + if ((data & HDMI_BIT2_MARK) > 0 && audio->bitDepthNum < HDMI_EDID_EXTENSION_AUDIO_MAX_BIT_DEPTH_NUM) { audio->bitDepth[audio->bitDepthNum] = HDMI_ADIO_BIT_DEPTH_24; audio->bitDepthNum++; @@ -538,7 +538,7 @@ static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *s * The most significant bit declares whether the format is a Native Video Format of the * display (native =1, not native = 0). Typically, there is a single SVD, with its native bit set. */ - if ((vicAll & HDMI_EDID_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { + if ((vicAll & HDMI_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { if (sinkCap->videoInfo.nativeFormat == 0) { sinkCap->videoInfo.nativeFormat = vicLower; } @@ -547,7 +547,7 @@ static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *s if (implicitNative == 0) { implicitNative = vicAll; } - if ((vicAll & HDMI_EDID_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { + if ((vicAll & HDMI_BIT7_MARK) > 0 && vicLower < HDMI_EDID_EXTENSION_VIC_NATIVE_MAX) { sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = vicLower; } else { sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = vicAll; @@ -564,10 +564,10 @@ static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *s static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 5) { - sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[3] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; - sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[3] & HDMI_EDID_LOWER_NIBBLE_MARK); - sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[4] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; - sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[4] & HDMI_EDID_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[3] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[3] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[4] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[4] & HDMI_LOWER_NIBBLE_MARK); sinkCap->vsdbInfo.cecAddr.addrValid = (sinkCap->vsdbInfo.cecAddr.phyAddrA != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && (sinkCap->vsdbInfo.cecAddr.phyAddrB != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && @@ -579,12 +579,12 @@ static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap static void HdmiEdidVsdbColorDepthPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 6) { - sinkCap->vsdbInfo.supportAi = (data[5] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->vsdbInfo.supportDviDual = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dcY444 = (data[5] & HDMI_EDID_BIT3_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc30bit = (data[5] & HDMI_EDID_BIT4_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc36bit = (data[5] & HDMI_EDID_BIT5_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc48bit = (data[5] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->vsdbInfo.supportAi = (data[5] & HDMI_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.supportDviDual = (data[5] & HDMI_BIT0_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dcY444 = (data[5] & HDMI_BIT3_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc30bit = (data[5] & HDMI_BIT4_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc36bit = (data[5] & HDMI_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc48bit = (data[5] & HDMI_BIT6_MARK) ? true : false; } } @@ -603,9 +603,9 @@ static void HdmiEdidVsdbMaxTmdsClockPhase(struct HdmiSinkDeviceCapability *sinkC static void HdmiEdidVsdbSinkPresentPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 8) { - sinkCap->vsdbInfo.latencyFieldsPresent = (data[7] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->vsdbInfo.iLatencyFieldsPresent = (data[7] & HDMI_EDID_BIT6_MARK) ? true : false; - sinkCap->vsdbInfo.hdmiVideoPresent = (data[7] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.latencyFieldsPresent = (data[7] & HDMI_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.iLatencyFieldsPresent = (data[7] & HDMI_BIT6_MARK) ? true : false; + sinkCap->vsdbInfo.hdmiVideoPresent = (data[7] & HDMI_BIT5_MARK) ? true : false; } } @@ -670,25 +670,25 @@ static void HdmiEdidVsdb3dStructureInfoPhase(struct HdmiSinkDeviceCapability *si * bit8: sinks support "Side-by-side(half) with all sub-sampling methods" 3D formats. */ sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_HALF] = - (data[(*offset)] & HDMI_EDID_BIT0_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT0_MARK) ? true : false; (*offset)++; } if ((*offset) <= len) { sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_FRAME_PACKING] = - (data[(*offset)] & HDMI_EDID_BIT0_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT0_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_FIELD_ALTERNATIVE] = - (data[(*offset)] & HDMI_EDID_BIT1_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT1_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_LINE_ALTERNATIVE] = - (data[(*offset)] & HDMI_EDID_BIT2_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT2_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_SIDE_BY_SIDE_FULL] = - (data[(*offset)] & HDMI_EDID_BIT3_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT3_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_L_DEPTH] = - (data[(*offset)] & HDMI_EDID_BIT4_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT4_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_L_DEPTH_GFX_GFX_DEPTH] = - (data[(*offset)] & HDMI_EDID_BIT5_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT5_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_TOP_AND_BOTTOM] = - (data[(*offset)] & HDMI_EDID_BIT6_MARK) ? true : false; + (data[(*offset)] & HDMI_BIT6_MARK) ? true : false; (*offset)++; } } @@ -703,7 +703,7 @@ static void HdmiEdidVsdbVicAnd3dInfoPhase(struct HdmiSinkDeviceCapability *sinkC HDF_LOGD("vsdb: these is no vic/3d field."); return; } - sinkCap->vsdbInfo._3dPresent = (data[12] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo._3dPresent = (data[12] & HDMI_BIT7_MARK) ? true : false; sinkCap->vsdbInfo._3dMultiPresent = (data[12] & HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; @@ -757,25 +757,25 @@ static int32_t HdmiEdidVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8 static void HdmiEdidHfVsdb21Phase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { - sinkCap->hfVsdbInfo.maxFrlRate = (data[6] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; - - sinkCap->hfVsdbInfo.fapaStartLocation = (data[7] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.allm = (data[7] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.fva = (data[7] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.cnmVrr = (data[7] & HDMI_EDID_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.cinemaVrr = (data[7] & HDMI_EDID_BIT4_MARK) ? true : false; - sinkCap->hfVsdbInfo.mDelta = (data[7] & HDMI_EDID_BIT5_MARK) ? true : false; + sinkCap->hfVsdbInfo.maxFrlRate = (data[6] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + + sinkCap->hfVsdbInfo.fapaStartLocation = (data[7] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.allm = (data[7] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.fva = (data[7] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.cnmVrr = (data[7] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.cinemaVrr = (data[7] & HDMI_BIT4_MARK) ? true : false; + sinkCap->hfVsdbInfo.mDelta = (data[7] & HDMI_BIT5_MARK) ? true : false; sinkCap->hfVsdbInfo.vrrMin = (data[8] & 0x3F); sinkCap->hfVsdbInfo.vrrMax = ((data[8] & 0xC0) << 2) | data[9]; - sinkCap->hfVsdbInfo.dscInfo.dsc1p2 = (data[10] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscNative420 = (data[10] & HDMI_EDID_BIT6_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscAllBpp = (data[10] & HDMI_EDID_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc10bpc = (data[10] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[10] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[10] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[11] & HDMI_EDID_LOWER_NIBBLE_MARK); - sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[11] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; + sinkCap->hfVsdbInfo.dscInfo.dsc1p2 = (data[10] & HDMI_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscNative420 = (data[10] & HDMI_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscAllBpp = (data[10] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc10bpc = (data[10] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[10] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[10] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[11] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; sinkCap->hfVsdbInfo.dscInfo.dscTotalChunkKBytes = (data[12] & 0x3F); } @@ -794,16 +794,16 @@ static int32_t HdmiEdidHfVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uin sinkCap->maxTmdsClk = data[4] * HDMI_EDID_EXTENSION_TMDS_FACTOR; sinkCap->supportHdmi20 = (sinkCap->maxTmdsClk > HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE) ? true : false; /* byte5: several sink present */ - sinkCap->hfVsdbInfo.scdcPresent = (data[5] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->hfVsdbInfo.rrCapable = (data[5] & HDMI_EDID_BIT6_MARK) ? true : false; - sinkCap->hfVsdbInfo.lte340McscScramble = (data[5] & HDMI_EDID_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.independentView = (data[5] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.dualView = (data[5] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo._3dOsdDisparity = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.scdcPresent = (data[5] & HDMI_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.rrCapable = (data[5] & HDMI_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.lte340McscScramble = (data[5] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.independentView = (data[5] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dualView = (data[5] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo._3dOsdDisparity = (data[5] & HDMI_BIT0_MARK) ? true : false; /* byte6: deep color */ - sinkCap->hfVsdbInfo.dc.dc30bit = (data[6] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.dc.dc36bit = (data[6] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.dc.dc48bit = (data[6] & HDMI_EDID_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc30bit = (data[6] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc36bit = (data[6] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc48bit = (data[6] & HDMI_BIT2_MARK) ? true : false; if (len > HDMI_EDID_EXTENSION_HFVSDB_MIN_INVALID_LEN && len <= HDMI_EDID_EXTENSION_HFVSDB_MAX_INVALID_LEN) { HdmiEdidHfVsdb21Phase(sinkCap, data, len); @@ -848,27 +848,27 @@ static int32_t HdmiEdidExtSpeakerDataBlockPhase(struct HdmiSinkDeviceCapability } sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FL_FR] = - (data[0] & HDMI_EDID_BIT0_MARK) ? true : false; + (data[0] & HDMI_BIT0_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_LFE] = - (data[0] & HDMI_EDID_BIT1_MARK) ? true : false; + (data[0] & HDMI_BIT1_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FC] = - (data[0] & HDMI_EDID_BIT2_MARK) ? true : false; + (data[0] & HDMI_BIT2_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BL_BR] = - (data[0] & HDMI_EDID_BIT3_MARK) ? true : false; + (data[0] & HDMI_BIT3_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BC] = - (data[0] & HDMI_EDID_BIT4_MARK) ? true : false; + (data[0] & HDMI_BIT4_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLC_FRC] = - (data[0] & HDMI_EDID_BIT5_MARK) ? true : false; + (data[0] & HDMI_BIT5_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_RLC_RRC] = - (data[0] & HDMI_EDID_BIT6_MARK) ? true : false; + (data[0] & HDMI_BIT6_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLW_FRW] = - (data[0] & HDMI_EDID_BIT7_MARK) ? true : false; + (data[0] & HDMI_BIT7_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFL_TPFH] = - (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; + (data[1] & HDMI_BIT0_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPC] = - (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; + (data[1] & HDMI_BIT1_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFC] = - (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; + (data[1] & HDMI_BIT2_MARK) ? true : false; return HDF_SUCCESS; } @@ -880,8 +880,8 @@ static void HdmiEdidExtUseExtDataBlockVcdbPhase(struct HdmiSinkDeviceCapability return; } - sinkCap->videoCap.qy = (data[1] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->videoCap.qs = (data[1] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->videoCap.qy = (data[1] & HDMI_BIT7_MARK) ? true : false; + sinkCap->videoCap.qs = (data[1] & HDMI_BIT6_MARK) ? true : false; } static void HdmiEdidExtUseExtDataBlockCdbPhase(struct HdmiSinkDeviceCapability *sinkCap, @@ -892,17 +892,17 @@ static void HdmiEdidExtUseExtDataBlockCdbPhase(struct HdmiSinkDeviceCapability * return; } - sinkCap->colorimetry.xvYcc601 = (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->colorimetry.xvYcc709 = (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->colorimetry.sYcc601 = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->colorimetry.opYcc601 = (data[1] & HDMI_EDID_BIT3_MARK) ? true : false; - sinkCap->colorimetry.opRgb = (data[1] & HDMI_EDID_BIT4_MARK) ? true : false; - sinkCap->colorimetry.bt2020cYcc = (data[1] & HDMI_EDID_BIT5_MARK) ? true : false; - sinkCap->colorimetry.bt2020Ycc = (data[1] & HDMI_EDID_BIT6_MARK) ? true : false; - sinkCap->colorimetry.bt2020Rgb = (data[1] & HDMI_EDID_BIT7_MARK) ? true : false; + sinkCap->colorimetry.xvYcc601 = (data[1] & HDMI_BIT0_MARK) ? true : false; + sinkCap->colorimetry.xvYcc709 = (data[1] & HDMI_BIT1_MARK) ? true : false; + sinkCap->colorimetry.sYcc601 = (data[1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->colorimetry.opYcc601 = (data[1] & HDMI_BIT3_MARK) ? true : false; + sinkCap->colorimetry.opRgb = (data[1] & HDMI_BIT4_MARK) ? true : false; + sinkCap->colorimetry.bt2020cYcc = (data[1] & HDMI_BIT5_MARK) ? true : false; + sinkCap->colorimetry.bt2020Ycc = (data[1] & HDMI_BIT6_MARK) ? true : false; + sinkCap->colorimetry.bt2020Rgb = (data[1] & HDMI_BIT7_MARK) ? true : false; - sinkCap->colorimetry.dciP3 = (data[2] & HDMI_EDID_BIT7_MARK) ? true : false; - sinkCap->colorimetry.md = (data[2] & HDMI_EDID_LOWER_NIBBLE_MARK); + sinkCap->colorimetry.dciP3 = (data[2] & HDMI_BIT7_MARK) ? true : false; + sinkCap->colorimetry.md = (data[2] & HDMI_LOWER_NIBBLE_MARK); } static void HdmiEdidExtUseExtDataBlockY420VdbPhase(struct HdmiSinkDeviceCapability *sinkCap, @@ -952,14 +952,14 @@ static void HdmiEdidExtUseExtDataBlockY420CmdbPhase(struct HdmiSinkDeviceCapabil * Bit 0 of data byte 3 is associated with the first sequential SVD listed in the regular Video Data Block(s) * of the EDID, bit 1 the second SVD, bit 2 the third, and so on. */ - loop = len * HDMI_EDID_BITS_OF_ONE_BYTE; + loop = len * HDMI_BITS_OF_ONE_BYTE; loop = (loop > HDMI_EDID_EXTENSION_MAX_VIC_COUNT) ? HDMI_EDID_EXTENSION_MAX_VIC_COUNT : loop; data++; for (i = 0; (i < loop) && (i < sinkCap->videoInfo.vicNum); i++) { if (sinkCap->y420Cap.SupportY420VicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { break; } - if ((data[i / HDMI_EDID_BITS_OF_ONE_BYTE] & (0x01 << (i % HDMI_EDID_BITS_OF_ONE_BYTE))) > 0) { + if ((data[i / HDMI_BITS_OF_ONE_BYTE] & (0x01 << (i % HDMI_BITS_OF_ONE_BYTE))) > 0) { sinkCap->y420Cap.SupportY420Format[sinkCap->y420Cap.SupportY420VicNum] = sinkCap->videoInfo.vic[i]; sinkCap->y420Cap.SupportY420VicNum++; sinkCap->colorSpace.ycbcr420 = true; @@ -975,11 +975,11 @@ static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapabili return; } - sinkCap->hdrCap.eotf.sdr = (data[1] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->hdrCap.eotf.hdr = (data[1] & HDMI_EDID_BIT1_MARK) ? true : false; - sinkCap->hdrCap.eotf.smpteSt2048 = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->hdrCap.eotf.hlg = (data[1] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->hdrCap.smType1 = (data[2] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->hdrCap.eotf.sdr = (data[1] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hdrCap.eotf.hdr = (data[1] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hdrCap.eotf.smpteSt2048 = (data[1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hdrCap.eotf.hlg = (data[1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hdrCap.smType1 = (data[2] & HDMI_BIT0_MARK) ? true : false; /* * The length of the data block, n, in Byte 1 indicates which of the Bytes 5 to 7 are present. Bytes 5 to 7 are @@ -1014,35 +1014,35 @@ static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability } sinkCap->dolbyCap.oui = oui; sinkCap->dolbyCap.version = (data[4] & HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; - sinkCap->dolbyCap.yuv422 = (data[4] & HDMI_EDID_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.b2160p60 = (data[4] & HDMI_EDID_BIT1_MARK) ? true : false; + sinkCap->dolbyCap.yuv422 = (data[4] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.b2160p60 = (data[4] & HDMI_BIT1_MARK) ? true : false; if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_0) { - sinkCap->dolbyCap.globalDimming = (data[4] & HDMI_EDID_BIT2_MARK) ? true : false; - sinkCap->dolbyCap.redX = ((data[5] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | - (data[6] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.redY = (data[5] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[7] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenX = ((data[8] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | - (data[9] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenY = (data[8] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[10] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueX = ((data[11] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | - (data[12] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueY = (data[11] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[13] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteX = ((data[14] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | - (data[15] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteY = (data[14] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[16] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.minLuminance = ((data[17] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT) | - (data[18] << HDMI_EDID_NIBBLE_SHIFT); + sinkCap->dolbyCap.globalDimming = (data[4] & HDMI_BIT2_MARK) ? true : false; + sinkCap->dolbyCap.redX = ((data[5] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[6] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.redY = (data[5] & HDMI_LOWER_NIBBLE_MARK) | (data[7] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenX = ((data[8] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[9] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenY = (data[8] & HDMI_LOWER_NIBBLE_MARK) | (data[10] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueX = ((data[11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[12] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueY = (data[11] & HDMI_LOWER_NIBBLE_MARK) | (data[13] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteX = ((data[14] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[15] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteY = (data[14] & HDMI_LOWER_NIBBLE_MARK) | (data[16] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.minLuminance = ((data[17] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[18] << HDMI_NIBBLE_SHIFT); sinkCap->dolbyCap.maxLuminance = - (data[17] & HDMI_EDID_LOWER_NIBBLE_MARK) | (data[19] << HDMI_EDID_NIBBLE_SHIFT); - sinkCap->dolbyCap.dMajorVer = (data[20] & HDMI_EDID_UPPER_NIBBLE_MARK) >> HDMI_EDID_NIBBLE_SHIFT; - sinkCap->dolbyCap.dMinorVer = (data[20] & HDMI_EDID_LOWER_NIBBLE_MARK); + (data[17] & HDMI_LOWER_NIBBLE_MARK) | (data[19] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.dMajorVer = (data[20] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->dolbyCap.dMinorVer = (data[20] & HDMI_LOWER_NIBBLE_MARK); return; } if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_1) { sinkCap->dolbyCap.dmVer = (data[4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; - sinkCap->dolbyCap.globalDimming = (data[5] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.globalDimming = (data[5] & HDMI_BIT0_MARK) ? true : false; sinkCap->dolbyCap.maxLuminance = ((data[5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); - sinkCap->dolbyCap.colorimetry = (data[6] & HDMI_EDID_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.colorimetry = (data[6] & HDMI_BIT0_MARK) ? true : false; sinkCap->dolbyCap.minLuminance = ((data[6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); sinkCap->dolbyCap.redX = data[8]; sinkCap->dolbyCap.redY = data[9]; @@ -1058,22 +1058,22 @@ static int32_t HdmiEdidExtUseExtDataBlockPhase(struct HdmiSinkDeviceCapability * uint8_t extTagCode = data[0]; switch (extTagCode) { - case HDMI_EDID_EXT_VCDB : + case HDMI_EDID_EXT_VCDB: HdmiEdidExtUseExtDataBlockVcdbPhase(sinkCap, data, len); break; - case HDMI_EDID_EXT_VSVDB : + case HDMI_EDID_EXT_VSVDB: HdmiEdidExtUseExtDataBlockVsvdbPhase(sinkCap, data, len); break; - case HDMI_EDID_EXT_CDB : + case HDMI_EDID_EXT_CDB: HdmiEdidExtUseExtDataBlockCdbPhase(sinkCap, data, len); break; - case HDMI_EDID_EXT_HDR_SMDB : + case HDMI_EDID_EXT_HDR_SMDB: HdmiEdidExtUseExtDataBlockHdrSmdbPhase(sinkCap, data, len); break; - case HDMI_EDID_EXT_YCBCR420_VDB : + case HDMI_EDID_EXT_YCBCR420_VDB: HdmiEdidExtUseExtDataBlockY420VdbPhase(sinkCap, data, len); break; - case HDMI_EDID_EXT_YCBCR420_CMDB : + case HDMI_EDID_EXT_YCBCR420_CMDB: HdmiEdidExtUseExtDataBlockY420CmdbPhase(sinkCap, data, len); break; default : @@ -1094,24 +1094,24 @@ static int32_t HdmiEdidExtDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCa } switch (tag) { - case HDMI_EDID_AUDIO_DATA_BLOCK : + case HDMI_EDID_AUDIO_DATA_BLOCK: /* Audio Data Block (includes one or more Short Audio Descriptors) */ ret = HdmiEdidExtAudioDataBlockPhase(sinkCap, data, len); break; - case HDMI_EDID_VIDEO_DATA_BLOCK : + case HDMI_EDID_VIDEO_DATA_BLOCK: /* Video Data Block (includes one or more Short Video Descriptors) */ ret = HdmiEdidExtVideoDataBlockPhase(sinkCap, data, len); break; - case HDMI_EDID_VENDOR_SPECIFIC_DATA_BLOCK : + case HDMI_EDID_VENDOR_SPECIFIC_DATA_BLOCK: ret = HdmiEdidExtVsDataBlockPhase(sinkCap, data, len); break; - case HDMI_EDID_SPEAKER_ALLOCATION_DATA_BLOCK : + case HDMI_EDID_SPEAKER_ALLOCATION_DATA_BLOCK: ret = HdmiEdidExtSpeakerDataBlockPhase(sinkCap, data, len); break; - case HDMI_EDID_USE_EXT_DATA_BLOCK : + case HDMI_EDID_USE_EXT_DATA_BLOCK: ret = HdmiEdidExtUseExtDataBlockPhase(sinkCap, data, len); break; - default : + default: HDF_LOGD("tag = %d is reserved or unphase block", tag); break; } @@ -1188,9 +1188,9 @@ static int32_t HdmiEdidExtBlockPhase(struct HdmiEdid *edid, uint8_t blockNum) } /* byte3: indication of underscan support, audio support, support of YCBCR and total number of native DTDs. */ sinkCap->colorSpace.rgb444 = true; - sinkCap->colorSpace.ycbcr422 = (data[3] & HDMI_EDID_BIT4_MARK) ? true : false; - sinkCap->colorSpace.ycbcr444 = (data[3] & HDMI_EDID_BIT5_MARK) ? true : false; - sinkCap->supportAudio = (data[3] & HDMI_EDID_BIT6_MARK) ? true : false; + sinkCap->colorSpace.ycbcr422 = (data[3] & HDMI_BIT4_MARK) ? true : false; + sinkCap->colorSpace.ycbcr444 = (data[3] & HDMI_BIT5_MARK) ? true : false; + sinkCap->supportAudio = (data[3] & HDMI_BIT6_MARK) ? true : false; /* * Video Data Block, Audio Data Block, Speaker Allocation Data Block, * Vendor Specific Data Block and Video Capability Data Block phase. diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 19e222659..5d9ecaf0c 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -38,10 +38,10 @@ static int32_t HdmiEventPostMsg(struct HdmiCntlr *cntlr, struct HdmiEventMsg *ev bool HdmiHpdStatusGet(struct HdmiCntlr *cntlr) { - bool ret; + bool ret = false; if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->hotPlugStateGet == NULL) { - return false; + return ret; } HdmiCntlrLock(cntlr); @@ -101,8 +101,8 @@ static int32_t HdmiEventHotPlugHandleComm(struct HdmiCntlr *cntlr) } /* Update EDID. */ - if (memset_s(cntlr->hdmi, sizeof(struct HdmiDevice), 0, sizeof(struct HdmiDevice)) != EOK) { - HDF_LOGE("memcpy_s fail."); + if (HdmiEdidReset(&(cntlr->hdmi->edid)) != HDF_SUCCESS) { + HDF_LOGE("edid reset fail."); ret = HDF_ERR_IO; goto __END; } @@ -199,22 +199,22 @@ int32_t HdmiEventMsgHandleDefault(struct PlatformQueue *queue, struct PlatformMs } event = (struct HdmiEventMsg *)msg; switch (msg->code) { - case HDMI_EVENT_HOTPLUG : + case HDMI_EVENT_HOTPLUG: ret = HdmiEventHotPlugHandle(cntlr); break; - case HDMI_EVENT_HOTUNPLUG : + case HDMI_EVENT_HOTUNPLUG: ret = HdmiEventHotUnplugHandle(cntlr); break; - case HDMI_EVENT_DETECT_SINK : + case HDMI_EVENT_DETECT_SINK: ret = HdmiEventDetectSinkHandle(cntlr); break; case HDMI_EVENT_CEC_MSG: ret = HdmiEventCecMsgHandle(cntlr, event->priv); break; - case HDMI_EVENT_ZERO_DRMIF_TIMEOUT : + case HDMI_EVENT_ZERO_DRMIF_TIMEOUT: ret = HdmiEventHdrZeroDrmIfTimeout(cntlr); break; - case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT : + case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT: ret = HdmiEventSwitchToHdrModeTimeout(cntlr); break; default: @@ -237,28 +237,28 @@ int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void return HDF_ERR_INVALID_OBJECT; } switch (event) { - case HDMI_EVENT_HOTPLUG : + case HDMI_EVENT_HOTPLUG: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HOTPLUG, false, data); break; - case HDMI_EVENT_HOTUNPLUG : + case HDMI_EVENT_HOTUNPLUG: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HOTUNPLUG, false, data); break; - case HDMI_EVENT_DETECT_SINK : + case HDMI_EVENT_DETECT_SINK: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_DETECT_SINK, false, data); break; - case HDMI_EVENT_CEC_MSG : + case HDMI_EVENT_CEC_MSG: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_CEC_MSG, false, data); break; - case HDMI_EVENT_HDCP_MSG : + case HDMI_EVENT_HDCP_MSG: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_HDCP_MSG, false, data); break; - case HDMI_EVENT_ZERO_DRMIF_TIMEOUT : + case HDMI_EVENT_ZERO_DRMIF_TIMEOUT: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_ZERO_DRMIF_TIMEOUT, false, data); break; - case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT : + case HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT: ret = HdmiAddEventMsgToQueue(cntlr, HDMI_EVENT_SWITCH_TO_HDRMODE_TIMEOUT, false, data); break; - default : + default: HDF_LOGE("event %d is not support", event); break; } diff --git a/support/platform/src/hdmi/hdmi_frl.c b/support/platform/src/hdmi/hdmi_frl.c index 58eb823c1..2eb0dc866 100644 --- a/support/platform/src/hdmi/hdmi_frl.c +++ b/support/platform/src/hdmi/hdmi_frl.c @@ -166,22 +166,22 @@ static bool HdmiFrlCheckFrlStrategy(enum HdmiFrlStrategyMode strategy, uint32_t bool support = true; switch (strategy) { - case HDMI_FRL_STRATEGY_MODE_1 : + case HDMI_FRL_STRATEGY_MODE_1: if (pixelClock <= HDMI_HDMI20_MAX_TMDS_RATE && tmdsClock <= HDMI_HDMI20_MAX_TMDS_RATE) { support = false; } break; - case HDMI_FRL_STRATEGY_MODE_2 : + case HDMI_FRL_STRATEGY_MODE_2: if (tmdsClock <= HDMI_HDMI14_MAX_TMDS_RATE) { support = false; } break; - case HDMI_FRL_STRATEGY_MODE_3 : + case HDMI_FRL_STRATEGY_MODE_3: if (formatType == HDMI_VIDEO_FORMA_INTERLACE) { support = false; } break; - default : + default: HDF_LOGE("strategy %d is not support", strategy); break; } @@ -196,23 +196,23 @@ static void HdmiFrlFillRateInfo(uint32_t *frlBitRate, uint32_t *frlLaneNum, uint } switch (frlRate) { - case HDMI_FRL_WORK_MODE_3L3G : + case HDMI_FRL_WORK_MODE_3L3G: *frlBitRate = HDMI_FRL_BIT_RATE_3; break; - case HDMI_FRL_WORK_MODE_3L6G : - case HDMI_FRL_WORK_MODE_4L6G : + case HDMI_FRL_WORK_MODE_3L6G: + case HDMI_FRL_WORK_MODE_4L6G: *frlBitRate = HDMI_FRL_BIT_RATE_6; break; - case HDMI_FRL_WORK_MODE_4L8G : + case HDMI_FRL_WORK_MODE_4L8G: *frlBitRate = HDMI_FRL_BIT_RATE_8; break; - case HDMI_FRL_WORK_MODE_4L10G : + case HDMI_FRL_WORK_MODE_4L10G: *frlBitRate = HDMI_FRL_BIT_RATE_10; break; - case HDMI_FRL_WORK_MODE_4L12G : + case HDMI_FRL_WORK_MODE_4L12G: *frlBitRate = HDMI_FRL_BIT_RATE_12; break; - default : + default: break; } } @@ -588,28 +588,28 @@ void HdmiFrlTrainingStateMachineHandle(struct HdmiFrl *frl) } switch (frl->info.machineInfo.trainingState) { - case HDMI_FRL_TRAIN_STEP_READR_CHECK : + case HDMI_FRL_TRAIN_STEP_READR_CHECK: HdmiFrlTrainingReadyCheck(frl); break; - case HDMI_FRL_TRAIN_STEP_TRAIN_START : + case HDMI_FRL_TRAIN_STEP_TRAIN_START: HdmiFrlConfigAndStartTraining(frl); break; - case HDMI_FRL_TRAIN_STEP_RESULT_CHECK : + case HDMI_FRL_TRAIN_STEP_RESULT_CHECK: HdmiFrlTrainingResultCheck(frl); break; - case HDMI_FRL_TRAIN_STEP_RATE_CHANGE : + case HDMI_FRL_TRAIN_STEP_RATE_CHANGE: HdmiFrlTrainingRateChange(frl); break; - case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE : + case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE: HdmiFrlTrainingPassedCheck(frl); break; - case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK : + case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK: HdmiFrlRetrainingCheck(frl); break; - case HDMI_FRL_TRAIN_STEP_TRAIN_STOP : + case HDMI_FRL_TRAIN_STEP_TRAIN_STOP: HdmiFrlTrainingStop(frl); break; - default : + default: break; } } @@ -748,28 +748,28 @@ void HdmiFrlTrainingStateMachineTimeoutHandle(struct HdmiFrl *frl) } switch (frl->info.machineInfo.trainingState) { - case HDMI_FRL_TRAIN_STEP_READR_CHECK : + case HDMI_FRL_TRAIN_STEP_READR_CHECK: HdmiFrlTrainingReadyCheckTimeout(frl); break; - case HDMI_FRL_TRAIN_STEP_TRAIN_START : + case HDMI_FRL_TRAIN_STEP_TRAIN_START: HdmiFrlConfigAndStartTraining(frl); break; - case HDMI_FRL_TRAIN_STEP_RESULT_CHECK : + case HDMI_FRL_TRAIN_STEP_RESULT_CHECK: HdmiFrlTrainingResultCheckTimeout(frl); break; - case HDMI_FRL_TRAIN_STEP_RATE_CHANGE : + case HDMI_FRL_TRAIN_STEP_RATE_CHANGE: HdmiFrlTrainingRateChange(frl); break; - case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE : + case HDMI_FRL_TRAIN_STEP_RESULT_HANDLE: HdmiFrlTrainingResultHandleTimeout(frl); break; - case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK : + case HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK: HdmiFrlRetrainingCheckTimeout(frl); break; - case HDMI_FRL_TRAIN_STEP_TRAIN_STOP : + case HDMI_FRL_TRAIN_STEP_TRAIN_STOP: HdmiFrlTrainingStop(frl); break; - default : + default: break; } } diff --git a/support/platform/src/hdmi/hdmi_hdcp.c b/support/platform/src/hdmi/hdmi_hdcp.c index b642d47d6..4c21b75b4 100644 --- a/support/platform/src/hdmi/hdmi_hdcp.c +++ b/support/platform/src/hdmi/hdmi_hdcp.c @@ -241,7 +241,6 @@ static int32_t HdmiHdcpAuthenticationCheckBstatus(struct HdmiHdcp *hdcp) { int32_t ret; uint16_t bstatus; - bool maxDevExceeded, maxCascadeExceeded; ret = HdmiHdcpRead(hdcp, HDMI_HDCP_BSTATUS, hdcp->bstatus, sizeof(hdcp->bstatus)); if (ret != HDF_SUCCESS) { @@ -251,17 +250,15 @@ static int32_t HdmiHdcpAuthenticationCheckBstatus(struct HdmiHdcp *hdcp) /* phase bstatus. */ bstatus = (hdcp->bstatus[1] << 8) | hdcp->bstatus[0]; hdcp->deviceCount = bstatus & HDMI_HDCP_BSTATUS_DEVICE_COUNT_MARK; - maxDevExceeded = (bstatus & HDMI_HDCP_BSTATUS_MAX_DEVS_EXCEEDED_MARK) ? true : false; - maxCascadeExceeded = (bstatus & HDMI_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED_MARK) ? true : false; if (hdcp->deviceCount == 0) { HDF_LOGE("hdcp auth, check bstatus, no device attached to the repeater."); return HDF_DEV_ERR_NO_DEVICE; } - if (maxDevExceeded == true) { + if ((bstatus & HDMI_HDCP_BSTATUS_MAX_DEVS_EXCEEDED_MARK) > 0) { HDF_LOGE("hdcp auth, check bstatus, exceeds max allowed connected devices."); return HDF_ERR_IO; } - if (maxCascadeExceeded == true) { + if ((bstatus & HDMI_HDCP_BSTATUS_MAX_CASCADE_EXCEEDED_MARK) > 0) { HDF_LOGE("hdcp auth, check bstatus, exceeds max allowed cascade."); return HDF_ERR_IO; } diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c index fdfa29de1..613b60119 100644 --- a/support/platform/src/hdmi/hdmi_hdr.c +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -44,7 +44,7 @@ static void HdmiHdrZeroDrmInfoframeTimerSet(struct HdmiCntlr *cntlr, bool start) return; } - hdrAttr->eotfType = HDMI_DRM_EOTF_SDR_LUMIN; + hdrAttr->eotfType = HDMI_EOTF_SDR_LUMIN; hdrAttr->metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1; if (memset_s(&(hdrAttr->descriptor), sizeof(hdrAttr->descriptor), 0, sizeof(hdrAttr->descriptor)) != EOK) { HDF_LOGE("memset_s fail"); diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 34e67ac43..98b519007 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -445,7 +445,7 @@ static void HdmiFillAviInfoframeVersion(struct HdmiAviInfoframe *avi) static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *HdrAttr, struct HdmiCommonAttr *commAttr) { - bool enable3d; + bool enable3d = true; if (memset_s(avi, sizeof(struct HdmiAviInfoframe), 0, sizeof(struct HdmiAviInfoframe)) != EOK) { HDF_LOGE("fill vsif, memset_s fail."); @@ -463,7 +463,9 @@ static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, avi->range = videoAttr->quantization; avi->extColorimetry = videoAttr->extColorimetry; - enable3d = (videoAttr->_3dStruct >= HDMI_VS_VIDEO_3D_BUTT) ? false : true; + if (videoAttr->_3dStruct >= HDMI_VS_VIDEO_3D_BUTT) { + enable3d = false; + } avi->vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, enable3d); avi->pixelRepetitionFactor = (uint8_t)videoAttr->pixelRepeat; avi->yccRange = videoAttr->yccQuantization; @@ -759,19 +761,19 @@ int32_t HdmiInfoframeGetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType ty } switch (type) { - case HDMI_INFOFRAME_PACKET_TYPE_VS : + case HDMI_INFOFRAME_PACKET_TYPE_VS: infoframe->vs = frame->vs; break; - case HDMI_INFOFRAME_PACKET_TYPE_AVI : + case HDMI_INFOFRAME_PACKET_TYPE_AVI: infoframe->avi = frame->avi; break; - case HDMI_INFOFRAME_PACKET_TYPE_AUDIO : + case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: infoframe->audio = frame->audio; break; - case HDMI_INFOFRAME_PACKET_TYPE_DRM : + case HDMI_INFOFRAME_PACKET_TYPE_DRM: infoframe->drm = frame->drm; break; - default : + default: HDF_LOGD("infoframe %d not support get", type); return HDF_ERR_INVALID_PARAM; } @@ -786,19 +788,19 @@ int32_t HdmiInfoframeSetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType ty } switch (type) { - case HDMI_INFOFRAME_PACKET_TYPE_VS : + case HDMI_INFOFRAME_PACKET_TYPE_VS: frame->vs = infoframe->vs; break; - case HDMI_INFOFRAME_PACKET_TYPE_AVI : + case HDMI_INFOFRAME_PACKET_TYPE_AVI: frame->avi = infoframe->avi; break; - case HDMI_INFOFRAME_PACKET_TYPE_AUDIO : + case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: frame->audio = infoframe->audio; break; - case HDMI_INFOFRAME_PACKET_TYPE_DRM : + case HDMI_INFOFRAME_PACKET_TYPE_DRM: frame->drm = infoframe->drm; break; - default : + default: HDF_LOGD("infoframe %d not support set", type); return HDF_ERR_INVALID_PARAM; } diff --git a/support/platform/src/hdmi/hdmi_scdc.c b/support/platform/src/hdmi/hdmi_scdc.c index 2b74f9204..29afc76d9 100644 --- a/support/platform/src/hdmi/hdmi_scdc.c +++ b/support/platform/src/hdmi/hdmi_scdc.c @@ -158,10 +158,10 @@ int32_t HdmiScdcWriteTestConfig0(struct HdmiScdc *scdc, uint8_t *testCfg) /* cntlr ops */ bool HdmiCntlrScdcSourceScrambleGet(struct HdmiCntlr *cntlr) { - bool ret; + bool ret = false; if (cntlr == NULL || cntlr->ops == NULL || cntlr->ops->scdcSourceScrambleGet == NULL) { - return HDF_ERR_INVALID_OBJECT; + return ret; } HdmiCntlrLock(cntlr); ret = cntlr->ops->scdcSourceScrambleGet(cntlr); @@ -303,39 +303,39 @@ int32_t HdmiScdcOptMsgHandle(struct HdmiScdc *scdc, enum HdmiScdcOptMsg msg, uin } switch (msg) { - case HDMI_SCDC_OPT_SET_SOURCE_VER : + case HDMI_SCDC_OPT_SET_SOURCE_VER: ret = HdmiScdcWriteSourceVersion(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_SOURCE_VER : + case HDMI_SCDC_OPT_GET_SOURCE_VER: ret = HdmiScdcReadSourceVersion(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_SINK_VER : + case HDMI_SCDC_OPT_GET_SINK_VER: ret = HdmiScdcReadSinkVersion(scdc, buffer); break; - case HDMI_SCDC_OPT_SET_FLT_UPDATE : - case HDMI_SCDC_OPT_SET_FRL_START : + case HDMI_SCDC_OPT_SET_FLT_UPDATE: + case HDMI_SCDC_OPT_SET_FRL_START: ret = HdmiScdcWriteUpdate0(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_FLT_UPDATE : - case HDMI_SCDC_OPT_GET_FRL_START : + case HDMI_SCDC_OPT_GET_FLT_UPDATE: + case HDMI_SCDC_OPT_GET_FRL_START: ret = HdmiScdcReadUpdate0(scdc, buffer); break; - case HDMI_SCDC_OPT_SET_CONFIG1 : + case HDMI_SCDC_OPT_SET_CONFIG1: ret = HdmiScdcWriteConfig1(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_CONFIG1 : + case HDMI_SCDC_OPT_GET_CONFIG1: ret = HdmiScdcReadConfig1(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_TEST_CONFIG_1 : + case HDMI_SCDC_OPT_GET_TEST_CONFIG_1: ret = HdmiScdcReadTestConfig1(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_FLT_READY : + case HDMI_SCDC_OPT_GET_FLT_READY: ret = HdmiScdcReadStatusFlag0(scdc, buffer); break; - case HDMI_SCDC_OPT_GET_LTP_REQ : + case HDMI_SCDC_OPT_GET_LTP_REQ: ret = HdmiScdcRead(scdc, HDMI_SCDCS_OFFSET_STASTUS_FLAG_1, buffer, len); break; - default : + default: HDF_LOGE("scdc msg handle, msg %d not support.", msg); ret = HDF_ERR_NOT_SUPPORT; break; -- Gitee From 16a70506b2cc97dfc02d03161ff8a547cfd6c315 Mon Sep 17 00:00:00 2001 From: lzl Date: Fri, 15 Oct 2021 03:22:30 +0000 Subject: [PATCH 083/272] hdmi framework code Signed-off-by: lzl --- include/platform/hdmi_if.h | 2 +- support/platform/include/hdmi/hdmi_cec.h | 2 +- support/platform/include/hdmi/hdmi_common.h | 2 + support/platform/include/hdmi/hdmi_core.h | 40 ++++++------- .../platform/include/hdmi/hdmi_infoframe.h | 6 +- support/platform/include/hdmi/hdmi_scdc.h | 8 +-- support/platform/src/hdmi/hdmi_cec.c | 59 +++++++++++++------ support/platform/src/hdmi/hdmi_core.c | 36 +++++------ support/platform/src/hdmi/hdmi_edid.c | 43 +++++++------- support/platform/src/hdmi/hdmi_frl.c | 24 ++++---- support/platform/src/hdmi/hdmi_hdcp.c | 32 +++++++--- support/platform/src/hdmi/hdmi_hdr.c | 2 +- support/platform/src/hdmi/hdmi_infoframe.c | 16 ++--- support/platform/src/hdmi/hdmi_ncts.c | 4 +- 14 files changed, 163 insertions(+), 113 deletions(-) diff --git a/include/platform/hdmi_if.h b/include/platform/hdmi_if.h index 0241713c0..f48ddae93 100644 --- a/include/platform/hdmi_if.h +++ b/include/platform/hdmi_if.h @@ -401,7 +401,7 @@ enum HdmiAudioCodingType { HDMI_AUDIO_CODING_TYPE_AAC_LC = 6, HDMI_AUDIO_CODING_TYPE_DTS = 7, HDMI_AUDIO_CODING_TYPE_ATRAC = 8, - HDMI_AUDIO_CODING_TYPE_OBA =9, + HDMI_AUDIO_CODING_TYPE_OBA = 9, HDMI_AUDIO_CODING_TYPE_EAC3 = 10, HDMI_AUDIO_CODING_TYPE_DTS_HD = 11, HDMI_AUDIO_CODING_TYPE_MLP = 12, diff --git a/support/platform/include/hdmi/hdmi_cec.h b/support/platform/include/hdmi/hdmi_cec.h index 70b8a0f35..7ce934acf 100644 --- a/support/platform/include/hdmi/hdmi_cec.h +++ b/support/platform/include/hdmi/hdmi_cec.h @@ -579,7 +579,7 @@ enum HdmiCecAllDevType { HDMI_CEC_ALL_DEV_TYPE_CEC_SWITCH = 0x04, HDMI_CEC_ALL_DEV_TYPE_AUDIO_SYSTEM = 0x08, HDMI_CEC_ALL_DEV_TYPE_PLAYBACK = 0x10, - HDMI_CEC_ALL_DEV_TYPE_TUNER =0x20, + HDMI_CEC_ALL_DEV_TYPE_TUNER = 0x20, HDMI_CEC_ALL_DEV_TYPE_RECORD = 0x40, HDMI_CEC_ALL_DEV_TYPE_TV = 0x80, }; diff --git a/support/platform/include/hdmi/hdmi_common.h b/support/platform/include/hdmi/hdmi_common.h index 0552e60b8..4be3b1efe 100644 --- a/support/platform/include/hdmi/hdmi_common.h +++ b/support/platform/include/hdmi/hdmi_common.h @@ -37,6 +37,8 @@ extern "C" { #define HDMI_6_BITS_SHIFT 6 #define HDMI_NIBBLE_SHIFT 4 #define HDMI_2_BITS_SHIFT 2 +#define HDMI_ONE_BYTE_MARK 0xFF +#define HDMI_TWO_BYTES_SHIFT 16 #define HDMI_HDMI14_MAX_TMDS_RATE 340000 /* unit: KHz */ #define HDMI_HDMI20_MAX_TMDS_RATE 600000 /* unit: KHz */ diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h index 3ea46fdfa..55e8d5a36 100644 --- a/support/platform/include/hdmi/hdmi_core.h +++ b/support/platform/include/hdmi/hdmi_core.h @@ -57,26 +57,26 @@ struct HdmiCntlr; union HdmiCap { uint32_t data; struct CapBitsData { - uint32_t scdc : 1; /* bit0: support scdc */ - uint32_t frl : 1; /* bit1: support frl */ - uint32_t hdr : 1; /* bit2: support hdr */ - uint32_t hdcp: 1; /* bit3: support hdcp */ - uint32_t cec : 1; /* bit4: support cec */ - uint32_t hdmi14 : 1; /* bit5: support hdmi1.4 spec */ - uint32_t hdmi20 : 1; /* bit6: support hdmi2.0 spec */ - uint32_t hdmi21 : 1; /* bit7: support hdmi2.1 spec */ - uint32_t hdcp14 : 1; /* bit8: support hdcp1.4 spec */ - uint32_t hdcp22 : 1; /* bit9: support hdcp2.2 spec */ - uint32_t rgb444 : 1; /* bit10: support rgb444 */ - uint32_t ycbcr444 : 1; /* bit11: support ycbcr444 */ - uint32_t ycbcr422 : 1; /* bit12: support ycbcr422 */ - uint32_t ycbcr420 : 1; /* bit13: support ycbcr420 */ - uint32_t deepColor10bits: 1; /* bit14: support deep color 10 bits */ - uint32_t deepColor12bits: 1; /* bit15: support deep color 12 bits */ - uint32_t deepColor16bits: 1; /* bit16: support deep color 16 bits */ - uint32_t scramble : 1; /* bit17: support scramble */ - uint32_t cecRc : 1; /* bit18: support CEC Remote Control */ - uint32_t rev : 13; /* bit21~31: reserved */ + uint32_t scdc : 1; /* bit0: support scdc */ + uint32_t frl : 1; /* bit1: support frl */ + uint32_t hdr : 1; /* bit2: support hdr */ + uint32_t hdcp : 1; /* bit3: support hdcp */ + uint32_t cec : 1; /* bit4: support cec */ + uint32_t hdmi14 : 1; /* bit5: support hdmi1.4 spec */ + uint32_t hdmi20 : 1; /* bit6: support hdmi2.0 spec */ + uint32_t hdmi21 : 1; /* bit7: support hdmi2.1 spec */ + uint32_t hdcp14 : 1; /* bit8: support hdcp1.4 spec */ + uint32_t hdcp22 : 1; /* bit9: support hdcp2.2 spec */ + uint32_t rgb444 : 1; /* bit10: support rgb444 */ + uint32_t ycbcr444 : 1; /* bit11: support ycbcr444 */ + uint32_t ycbcr422 : 1; /* bit12: support ycbcr422 */ + uint32_t ycbcr420 : 1; /* bit13: support ycbcr420 */ + uint32_t deepColor10bits : 1; /* bit14: support deep color 10 bits */ + uint32_t deepColor12bits : 1; /* bit15: support deep color 12 bits */ + uint32_t deepColor16bits : 1; /* bit16: support deep color 16 bits */ + uint32_t scramble : 1; /* bit17: support scramble */ + uint32_t cecRc : 1; /* bit18: support CEC Remote Control */ + uint32_t rev : 13; /* bit21~31: reserved */ } bits; }; diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index ae2bacc3f..e2ba5e318 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -359,17 +359,17 @@ struct HdmiDrmInfoframe { }; /* GBD(gamut boundary description) */ -union HdmiGbdHb1{ +union HdmiGbdHb1 { struct { uint8_t affectedGamutSeqNum : 4; /* [0:3] */ uint8_t gbdProfil : 3; /* [4:5] */ - uint8_t reseverd: 1; /* [6] */ + uint8_t reseverd : 1; /* [6] */ uint8_t noCrntGbd : 1; /* [7] */ } bits; uint8_t val; }; -union HdmiGbdHb2{ +union HdmiGbdHb2 { struct { uint8_t currentGamutSeqNum : 4; /* [0:3] */ uint8_t packetSeq : 2; /* [4:5] */ diff --git a/support/platform/include/hdmi/hdmi_scdc.h b/support/platform/include/hdmi/hdmi_scdc.h index 532d446c4..7c0f9bbe3 100644 --- a/support/platform/include/hdmi/hdmi_scdc.h +++ b/support/platform/include/hdmi/hdmi_scdc.h @@ -91,10 +91,10 @@ union HdmiScdcsTmdsConfig { uint8_t data; struct { uint8_t scramblingEnable : 1; - uint8_t tmdsBitClockRatio: 1; /* - * 0: TMDS_Bit_Period/TMDS_Clock_Period is 1/10; - * 1: TMDS_Bit_Period/TMDS_Clock_Period is 1/40. - */ + uint8_t tmdsBitClockRatio : 1; /* + * 0: TMDS_Bit_Period/TMDS_Clock_Period is 1/10; + * 1: TMDS_Bit_Period/TMDS_Clock_Period is 1/40. + */ uint8_t reserved : 6; } bits; }; diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index 39b195275..b91093f33 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -195,7 +195,7 @@ static bool HdmiCecCheckRecordOnMsgLen(struct HdmiCecMsg *msg) return false; } break; - default : + default: break; } return true; @@ -211,7 +211,7 @@ static bool HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg *msg, uint8_t opcod break; case HDMI_CEC_OPCODE_RECORD_ON: ret = HdmiCecCheckRecordOnMsgLen(msg); - default : + default: break; } return ret; @@ -392,7 +392,7 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H data[5] = digital->systemData.dvb.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; data[6] = digital->systemData.dvb.orgNetworkId & HDMI_ONE_BYTE_MARK; break; - default : + default: HDF_LOGE("digital system 0x%x is invalid", digital->system); } } @@ -453,7 +453,7 @@ void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSour case HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR: HdmiCecEncodingRecordOnExtPhyAddr(msg, src->data.extPhyAddr); break; - default : + default: HDF_LOGE("cec record on: type %d unknow", src->type); } @@ -1437,29 +1437,36 @@ static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr, static void HdmiCecHandleUserControlPrtessedMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { + (void)msg; + (void)txMsg; + /* Not support CEC Remote Control. */ if (cntlr->cap.baseCap.bits.cecRc == 0) { return; } - - /* TODO */ + HDF_LOGD("Now User Control Prtessed not support."); } static void HdmiCecHandleUserControlReleasedMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { + (void)msg; + (void)txMsg; + /* Not support CEC Remote Control. */ if (cntlr->cap.baseCap.bits.cecRc == 0) { return; } - /* TODO */ + HDF_LOGD("Now User Control Released not support."); } static void HdmiCecHandleGetCecVersionMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { HdmiCecEncodingCecVersionMsg(txMsg, cntlr->cec->info.cecVersion); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("get cec version msg send fail"); + } } static void HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr *cntlr, @@ -1472,7 +1479,9 @@ static void HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr *cntlr, } HdmiCecEncodingReportPhyAddressMsg(txMsg, cntlr->cec->info.phyAddr, cntlr->cec->info.primaryDeviceType); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("give phy address msg send fail"); + } } static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr, @@ -1480,11 +1489,15 @@ static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr, { if (cntlr->cec->info.vendorId == HDMI_CEC_VENDOR_ID_UNKNOWN) { HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("feature abort msg send fail"); + } return; } HdmiCecEncodingDeviceVendorIdMsg(txMsg, cntlr->cec->info.vendorId); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("give device vendor id msg send fail"); + } } static void HdmiCecHandleAbortMsg(struct HdmiCntlr *cntlr, @@ -1495,7 +1508,9 @@ static void HdmiCecHandleAbortMsg(struct HdmiCntlr *cntlr, return; } HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_REFUSED); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("feature abort msg send fail"); + } } static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr, @@ -1503,12 +1518,16 @@ static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr, { if (cntlr->cec->info.osdName[0] == 0) { HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("feature abort msg send fail"); + } return; } HdmiCecEncodingSetOsdNameMsg(txMsg, cntlr->cec->info.osdName, cntlr->cec->info.osdNameLen); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("set osd name msg send fail"); + } } static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr, @@ -1516,12 +1535,16 @@ static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr, { if (cntlr->cec->info.cecVersion < HDMI_CEC_VERSION_2_0) { HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("feature abort msg send fail"); + } return; } HdmiCecEncodingReportFeaturesMsg(txMsg, &(cntlr->cec->info)); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("report feature msg send fail"); + } } static void HdmiCecMsgDefaultHandle(struct HdmiCntlr *cntlr, @@ -1539,7 +1562,9 @@ static void HdmiCecMsgDefaultHandle(struct HdmiCntlr *cntlr, } HdmiCecEncodingFeatureAbortMsg(txMsg, opcode, HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); - HdmiCecSendMsg(cntlr, txMsg); + if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { + HDF_LOGE("feature abort msg send fail"); + } } static void HdmiCecMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index 1fa7308cf..f78b516ba 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -884,7 +884,7 @@ static int32_t HdmiColorSpaceCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDevic return HDF_SUCCESS; } -static void hdmiDeepColor10bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, +static void HdmiDeepColor10bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, union HdmiCap *cap, uint32_t *tmdsClock, bool *supportDeepColor) { uint32_t tmpTmdsClk = *tmdsClock; @@ -911,7 +911,7 @@ static void hdmiDeepColor10bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, s *tmdsClock = tmpTmdsClk; } -static void hdmiDeepColor12bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, +static void HdmiDeepColor12bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, struct HdmiCommonAttr *commAttr, union HdmiCap *cap, uint32_t *tmdsClock, bool *supportDeepColor) { uint32_t tmpTmdsClk = *tmdsClock; @@ -938,7 +938,7 @@ static void hdmiDeepColor12bitsCheck(struct HdmiSinkDeviceCapability *sinkCap, s *tmdsClock = tmpTmdsClk; } -static int32_t hdmiDeepColorCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDeviceCapability *sinkCap, +static int32_t HdmiDeepColorCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDeviceCapability *sinkCap, uint32_t maxTmdsClk) { struct HdmiVideoAttr *videoAttr = &(cntlr->attr.videoAttr); @@ -953,10 +953,10 @@ static int32_t hdmiDeepColorCheck(struct HdmiCntlr *cntlr, struct HdmiSinkDevice switch (commAttr->deepColor) { case HDMI_DEEP_COLOR_30BITS: - hdmiDeepColor10bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); + HdmiDeepColor10bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); break; case HDMI_DEEP_COLOR_36BITS: - hdmiDeepColor12bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); + HdmiDeepColor12bitsCheck(sinkCap, commAttr, cap, &tmdsClock, &supportDeepColor); break; default: commAttr->deepColor = HDMI_DEEP_COLOR_24BITS; @@ -1028,7 +1028,7 @@ static int32_t HdmiColorBitSelect(struct HdmiCntlr *cntlr) if (HdmiColorSpaceCheck(cntlr, sinkCap, maxTmdsClk) != HDF_SUCCESS) { return HDF_ERR_INVALID_PARAM; } - if (hdmiDeepColorCheck(cntlr, sinkCap, maxTmdsClk) != HDF_SUCCESS) { + if (HdmiDeepColorCheck(cntlr, sinkCap, maxTmdsClk) != HDF_SUCCESS) { return HDF_ERR_INVALID_PARAM; } return HDF_SUCCESS; @@ -1106,21 +1106,21 @@ static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, * when the timing is 4096*2160, the aspect ratio in AVI infoframe is 0 * (but the real aspect ratio is 256:135<0x04>, the video_code is 0) */ - aspectIs256 = (((vic == 0) && (hwStatus->infoframeStatus.vsif[8] == 0x04)) || + aspectIs256 = (((vic == 0) && (hwStatus->infoframeStatus.vsif[8] == 0x04)) || ((vic >= HDMI_VIC_4096X2160P25_256_135) && (vic <= HDMI_VIC_4096X2160P60_256_135))); - videoAttr->aspect = (aspectIs256 == true) ? HDMI_PICTURE_ASPECT_256_135 : + videoAttr->aspect = (aspectIs256 == true) ? HDMI_PICTURE_ASPECT_256_135 : ((hwStatus->infoframeStatus.avi[5] >> 4) & 0x3); /* 4'b, BIT[2:1] */ - videoAttr->activeAspect = hwStatus->infoframeStatus.avi[5] & 0xf; - videoAttr->colorimetry = (hwStatus->infoframeStatus.avi[5] >> 6) & 0x3; /* 6'b, BIT[2:1] */ - videoAttr->quantization = (hwStatus->infoframeStatus.avi[6] >> 2) & 0x3; /* 2'b, BIT[2:1] */ - videoAttr->extColorimetry = (hwStatus->infoframeStatus.avi[6] >> 4) & 0x07; /* 4'b, BIT[3:1] */ - videoAttr->yccQuantization = (hwStatus->infoframeStatus.avi[8] >> 6) & 0x3; /* 6'b, BIT[2:1] */ - videoAttr->pixelRepeat = (hwStatus->infoframeStatus.avi[8] & 0xf) + 1; - videoAttr->timing = HdmiCommonGetVideoTiming(vic, videoAttr->aspect); - if ((!hwStatus->infoframeStatus.vsifEnable) && (!vic)) { + videoAttr->activeAspect = hwStatus->infoframeStatus.avi[5] & 0xf; + videoAttr->colorimetry = (hwStatus->infoframeStatus.avi[5] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->quantization = (hwStatus->infoframeStatus.avi[6] >> 2) & 0x3; /* 2'b, BIT[2:1] */ + videoAttr->extColorimetry = (hwStatus->infoframeStatus.avi[6] >> 4) & 0x07; /* 4'b, BIT[3:1] */ + videoAttr->yccQuantization = (hwStatus->infoframeStatus.avi[8] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->pixelRepeat = (hwStatus->infoframeStatus.avi[8] & 0xf) + 1; + videoAttr->timing = HdmiCommonGetVideoTiming(vic, videoAttr->aspect); + if ((!hwStatus->infoframeStatus.vsifEnable) && (!vic)) { videoAttr->timing = HDMI_VIDEO_TIMING_NONE; - } - commAttr->quantization = (commAttr->colorSpace == HDMI_COLOR_SPACE_RGB) ? + } + commAttr->quantization = (commAttr->colorSpace == HDMI_COLOR_SPACE_RGB) ? videoAttr->quantization : (videoAttr->yccQuantization + 1); } diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index f142a5ec1..54c34d3f2 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -176,13 +176,13 @@ static int32_t HdmiEdidEstablisedTimingPhase(struct HdmiEdid *edid) * The established timing block is a field of one-bit flags, which are used to inducate support for established * VESA and other common timing in a very compact form. A bit set to "1" indicate support for that timing. */ - for (i = 0; i < HDMI_EDID_ESTABLISHED_TIMING_BUTT; i++) { + for (i = 0; i < HDMI_EDID_ESTABLISHED_TIMING_BUTT; i++) { if ((data & (1 << i)) > 0) { sinkCap->establishedTimingsInfo.estTimings[i] = i; sinkCap->establishedTimingsInfo.estTimingsNum++; } - } - return HDF_SUCCESS; + } + return HDF_SUCCESS; } static uint32_t HdmiEdidGetStandardTimingVertPixel(uint32_t aspectRatio, uint32_t horizPixel) @@ -381,15 +381,17 @@ static int32_t HdmiEdidFirstBlockPhase(struct HdmiEdid *edid) { uint32_t i, len; int32_t ret; - HdmiEdidPhaseFunc func[] = { HdmiEdidHeaderPhase, - HdmiEdidVendorInfoPhase, - HdmiEdidVersionInfoPhase, - HdmiEdidBasicDispPhase, - HdmiEdidColorFeaturePhase, - HdmiEdidEstablisedTimingPhase, - HdmiEdidStandardTimingPhase, - HdmiEdidDetailedTimingPhase, - HdmiEdidExtBlockNumPhase }; + HdmiEdidPhaseFunc func[] = { + HdmiEdidHeaderPhase, + HdmiEdidVendorInfoPhase, + HdmiEdidVersionInfoPhase, + HdmiEdidBasicDispPhase, + HdmiEdidColorFeaturePhase, + HdmiEdidEstablisedTimingPhase, + HdmiEdidStandardTimingPhase, + HdmiEdidDetailedTimingPhase, + HdmiEdidExtBlockNumPhase + }; ret = HdmiEdidBlockCheckSum(edid->raw); if (ret != HDF_SUCCESS) { @@ -519,8 +521,7 @@ static int32_t HdmiEdidExtAudioDataBlockPhase(struct HdmiSinkDeviceCapability *s static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { uint8_t i; - uint32_t vicAll = 0; - uint32_t vicLower = 0; + uint32_t vicAll, vicLower; uint32_t implicitNative = 0; for (i = 0; i < len; i++) { @@ -634,11 +635,13 @@ static void HdmiEdidVsdbVicInfoPhase(struct HdmiSinkDeviceCapability *sinkCap, { uint8_t i, index; /* see hdmi spec 1.4 table 8-13. */ - uint32_t hdmi4kVic[] = { 0, - HDMI_VIC_3840X2160P30_16_9, - HDMI_VIC_3840X2160P25_16_9, - HDMI_VIC_3840X2160P24_16_9, - HDMI_VIC_4096X2160P24_256_135 }; + uint32_t hdmi4kVic[] = { + 0, + HDMI_VIC_3840X2160P30_16_9, + HDMI_VIC_3840X2160P25_16_9, + HDMI_VIC_3840X2160P24_16_9, + HDMI_VIC_4096X2160P24_256_135 + }; for (i = 0; i < vicLen; i++) { if (sinkCap->videoInfo.vicNum >= HDMI_EDID_EXTENSION_MAX_VIC_COUNT) { @@ -1076,7 +1079,7 @@ static int32_t HdmiEdidExtUseExtDataBlockPhase(struct HdmiSinkDeviceCapability * case HDMI_EDID_EXT_YCBCR420_CMDB: HdmiEdidExtUseExtDataBlockY420CmdbPhase(sinkCap, data, len); break; - default : + default: HDF_LOGD("ext use ext DB: tag code %d unphase", extTagCode); break; } diff --git a/support/platform/src/hdmi/hdmi_frl.c b/support/platform/src/hdmi/hdmi_frl.c index 2eb0dc866..6db3e397e 100644 --- a/support/platform/src/hdmi/hdmi_frl.c +++ b/support/platform/src/hdmi/hdmi_frl.c @@ -676,6 +676,7 @@ static void HdmiFrlTrainingResultCheckTimeout(struct HdmiFrl *frl) static void HdmiFrlTrainingResultHandleTimeout(struct HdmiFrl *frl) { uint64_t curTime; + bool frlStart = false; struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; if (cntlr != NULL || cntlr->ops != NULL) { @@ -683,19 +684,18 @@ static void HdmiFrlTrainingResultHandleTimeout(struct HdmiFrl *frl) } do { - if (HdmiFrlGetFrlStart(cntlr->scdc) == true) { - if (frl->info.start == true) { - frl->info.work = true; - /* n/cts config */ - HdmiFrlAudioNctsSet(frl); - if (cntlr->ops->phyOutputEnable != NULL) { - cntlr->ops->phyOutputEnable(cntlr, frl->info.work); - } - HdmiFrlSetFrlStart(cntlr->scdc, true); - HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK); - break; + frlStart = HdmiFrlGetFrlStart(cntlr->scdc); + if (frlStart == true && frl->info.start == true) { + frl->info.work = true; + /* n/cts config */ + HdmiFrlAudioNctsSet(frl); + if (cntlr->ops->phyOutputEnable != NULL) { + cntlr->ops->phyOutputEnable(cntlr, frl->info.work); } - } else if (HdmiFrlGetFltUpdate(cntlr->scdc) == true) { + HdmiFrlSetFrlStart(cntlr->scdc, true); + HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_RETRAIN_CHECK); + break; + } else if (frlStart == false && HdmiFrlGetFltUpdate(cntlr->scdc) == true) { HdmiFrlSetFltUpdate(cntlr->scdc, true); HdmiFrlStateMachineChangeState(frl, HDMI_FRL_TRAIN_STEP_TRAIN_START); break; diff --git a/support/platform/src/hdmi/hdmi_hdcp.c b/support/platform/src/hdmi/hdmi_hdcp.c index 4c21b75b4..2e4389b06 100644 --- a/support/platform/src/hdmi/hdmi_hdcp.c +++ b/support/platform/src/hdmi/hdmi_hdcp.c @@ -291,8 +291,14 @@ static int32_t HdmiHdcpAuthenticationWaitKsvListReady(struct HdmiHdcp *hdcp) if (ret != HDF_SUCCESS) { return ret; } - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BSTATUS, hdcp->bstatus, sizeof(hdcp->bstatus)); + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BCAPS, &(hdcp->bcaps), sizeof(hdcp->bcaps)); + if (ret != HDF_SUCCESS) { + HDF_LOGD("hdcp auth wait ksv list ready, WRITE_BCAPS fail"); + } + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_BSTATUS, hdcp->bstatus, sizeof(hdcp->bstatus)); + if (ret != HDF_SUCCESS) { + HDF_LOGD("hdcp auth wait ksv list ready, WRITE_BSTATUS fail"); + } return HDF_SUCCESS; } @@ -316,8 +322,14 @@ static int32_t HdmiHdcpAuthenticationReadKsvList(struct HdmiHdcp *hdcp) return ret; } /* We may need to reset SHA before write ksv list. */ - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_RESET_SHA, NULL, 0); - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_KSV_FIFO, hdcp->ksvList, hdcp->ksvLen); + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_RESET_SHA, NULL, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGD("hdcp auth read ksv list, RESET_SHA fail"); + } + ret = HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_WRITE_KSV_FIFO, hdcp->ksvList, hdcp->ksvLen); + if (ret != HDF_SUCCESS) { + HDF_LOGD("hdcp auth read ksv list, WRITE_KSV_FIFO fail"); + } return HDF_SUCCESS; } @@ -350,14 +362,18 @@ static int32_t HdmiHdcpAuthenticationSecondPart(struct HdmiHdcp *hdcp) static void HdmiHdcpAuthenticationSucc(struct HdmiHdcp *hdcp) { - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_DONE, NULL, 0); + if (HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_DONE, NULL, 0) != HDF_SUCCESS) { + HDF_LOGE("hdcp auth succ, AUTH_DONE fail."); + } hdcp->state = HDMI_HDCP_AUTH_DONE; hdcp->authRetryCnt = 0; } static void HdmiHdcpAuthenticationFail(struct HdmiHdcp *hdcp) { - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_FAIL, NULL, 0); + if (HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_FAIL, NULL, 0) != HDF_SUCCESS) { + HDF_LOGE("hdcp auth fail, AUTH_FAIL fail."); + } hdcp->state = HDMI_HDCP_AUTH_FAIL; } @@ -454,7 +470,9 @@ void HdmiHdcpClose(struct HdmiHdcp *hdcp) return; } - (void)HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_CLOSE, NULL, 0); + if (HdmiHdcpWriteMsgToReg(hdcp, HDMI_HDCP_OPT_AUTH_CLOSE, NULL, 0) != HDF_SUCCESS) { + HDF_LOGD("hdcp close, AUTH_CLOSE fail"); + } hdcp->state = HDMI_HDCP_AUTH_INACTIVE; hdcp->authRetryCnt = 0; } diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c index 613b60119..838ae2bd6 100644 --- a/support/platform/src/hdmi/hdmi_hdr.c +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -124,7 +124,7 @@ static void HdmiChangeToHdr(struct HdmiCntlr *cntlr, struct HdmiCommonAttr *comm struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); - HdmiHdrZeroDrmInfoframeTimerSet(cntlr,false); + HdmiHdrZeroDrmInfoframeTimerSet(cntlr, false); if (hdrAttr->userMode != HDMI_HDR_USERMODE_HDR10) { HDF_LOGE("usermode is not HDR10/HLG."); return; diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 98b519007..5ae9719fb 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -377,15 +377,15 @@ static int32_t HdmiInfoframeSend(struct HdmiInfoframe *frame, union HdmiInfofram } static void HdmiFillAviHdrInfoframe(struct HdmiAviInfoframe *avi, - struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *HdrAttr, struct HdmiCommonAttr *commAttr) + struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *hdrAttr, struct HdmiCommonAttr *commAttr) { - switch (HdrAttr->mode) { + switch (hdrAttr->mode) { case HDMI_HDR_MODE_CEA_861_3: case HDMI_HDR_MODE_CEA_861_3_AUTHEN: avi->colorimetry = videoAttr->colorimetry; avi->extColorimetry = videoAttr->extColorimetry; avi->colorSpace = commAttr->colorSpace; - if (HdrAttr->mode == HDMI_HDR_MODE_CEA_861_3_AUTHEN) { + if (hdrAttr->mode == HDMI_HDR_MODE_CEA_861_3_AUTHEN) { avi->colorSpace = HDMI_COLOR_SPACE_YCBCR422; } avi->range = videoAttr->quantization; @@ -443,7 +443,7 @@ static void HdmiFillAviInfoframeVersion(struct HdmiAviInfoframe *avi) } static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, - struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *HdrAttr, struct HdmiCommonAttr *commAttr) + struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *hdrAttr, struct HdmiCommonAttr *commAttr) { bool enable3d = true; @@ -469,7 +469,7 @@ static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, avi->vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, enable3d); avi->pixelRepetitionFactor = (uint8_t)videoAttr->pixelRepeat; avi->yccRange = videoAttr->yccQuantization; - HdmiFillAviHdrInfoframe(avi, videoAttr, HdrAttr, commAttr); + HdmiFillAviHdrInfoframe(avi, videoAttr, hdrAttr, commAttr); HdmiFillAviInfoframeVersion(avi); } @@ -516,8 +516,10 @@ void HdmiFillAudioInfoframe(struct HdmiAudioInfoframe *audio, struct HdmiAudioAt } /* fill coding type. */ - if (audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_AC3 || audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS || - audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_EAC3 || audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS_HD) { + if (audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_AC3 || + audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS || + audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_EAC3 || + audioAttr->codingType == HDMI_AUDIO_CODING_TYPE_DTS_HD) { audio->codingType = audioAttr->codingType; } else { audio->codingType = HDMI_AUDIO_CODING_TYPE_STREAM; diff --git a/support/platform/src/hdmi/hdmi_ncts.c b/support/platform/src/hdmi/hdmi_ncts.c index 78a050785..c90000aa5 100644 --- a/support/platform/src/hdmi/hdmi_ncts.c +++ b/support/platform/src/hdmi/hdmi_ncts.c @@ -68,7 +68,7 @@ uint32_t HdmiGetN(uint32_t sampleRate, uint32_t tmdsClock) { uint32_t i; - for (i = 0;i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { + for (i = 0; i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { if (g_audioNctsMap[i].sampleRate == sampleRate && g_audioNctsMap[i].tmdsClock == tmdsClock) { return g_audioNctsMap[i].n; @@ -92,7 +92,7 @@ uint32_t HdmiGetCts(uint32_t sampleRate, uint32_t tmdsClock) uint32_t tmpN = HDMI_NCTS_INVALID_VALUE; uint32_t tmpCts = HDMI_NCTS_INVALID_VALUE; - for (i = 0;i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { + for (i = 0; i < sizeof(g_audioNctsMap) / sizeof(g_audioNctsMap[0]); i++) { if (g_audioNctsMap[i].sampleRate == sampleRate && g_audioNctsMap[i].tmdsClock == tmdsClock) { tmpN = g_audioNctsMap[i].n; -- Gitee From 075990e79ce7d3f5956aa330457c76ab6786ad83 Mon Sep 17 00:00:00 2001 From: yafeng_wang Date: Thu, 14 Oct 2021 10:20:26 +0800 Subject: [PATCH 084/272] Feature: Add I3C framework source codes. Signed-off-by: yafeng_wang --- include/platform/i3c_if.h | 166 +++++++ support/platform/include/i3c_ccc.h | 84 ++++ support/platform/include/i3c_core.h | 199 ++++++++ support/platform/src/i3c_core.c | 712 ++++++++++++++++++++++++++++ support/platform/src/i3c_if.c | 78 +++ 5 files changed, 1239 insertions(+) create mode 100644 include/platform/i3c_if.h create mode 100755 support/platform/include/i3c_ccc.h create mode 100755 support/platform/include/i3c_core.h create mode 100755 support/platform/src/i3c_core.c create mode 100755 support/platform/src/i3c_if.c diff --git a/include/platform/i3c_if.h b/include/platform/i3c_if.h new file mode 100644 index 000000000..595576b25 --- /dev/null +++ b/include/platform/i3c_if.h @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +/** + * @addtogroup I3C + * @{ + * + * @brief Provides Improved Inter-Integrated Circuit (I3C) interfaces. + * + * This module allows a driver to perform operations on an I3C controller for accessing devices on the I3C bus, + * including creating and destroying I3C controller handles as well as reading and writing data. + * + * @since 1.0 + */ + +/** + * @file i3c_if.h + * + * @brief Declares the standard I3C interface functions. + * + * @since 1.0 + */ + +#ifndef I3C_IF_H +#define I3C_IF_H + +#include "hdf_platform.h" +#include "i3c_core.h" +#include "i3c_ccc.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +enum TransMode { + I2C_MODE = 0, + I3C_MODE, + HDR_MODE, + CCC_CMD_MODE, +}; + +struct I3cMsg { + struct CccCmd *cmd; + uint16_t addr; + uint8_t *buf; + uint16_t len; + uint16_t flags; + enum TransMode mode; + struct I3cCccCmd ccc; + uint16_t err; +}; + +enum I3cFlag { + /** Read flag. The value 1 indicates the read operation, and 0 indicates the write operation. */ + I3C_FLAG_READ = (0x1 << 0), + /** Non-ACK read flag. The value 1 indicates that no ACK signal is sent during the read process. */ + I3C_FLAG_READ_NO_ACK = (0x1 << 11), + /** Ignoring no-ACK flag. The value 1 indicates that the non-ACK signal is ignored. */ + I3C_FLAG_IGNORE_NO_ACK = (0x1 << 12), + /** + * No START condition flag. The value 1 indicates that there is no START condition for the message + * transfer. + */ + I3C_FLAG_NO_START = (0x1 << 14), + /** STOP condition flag. The value 1 indicates that the current transfer ends with a STOP condition. */ + I3C_FLAG_STOP = (0x1 << 15), +}; + +typedef int32_t (*I3cIbiFunc)(uint16_t addr, void *data); + +/** + * @brief Obtains the handle of an I3C controller. + * + * You must call this function before accessing the I3C bus. + * + * @param number Indicates the I3C controller ID. + * + * @return Returns the pointer to the {@link DevHandle} of the I3C controller if the operation is successful; + * returns NULL otherwise. + * @since 1.0 + */ +DevHandle I3cOpen(int16_t number); + + /** + * @brief Releases the handle of an I3C controller. + * + * If you no longer need to access the I3C controller, you should call this function to close its handle so as + * to release unused memory resources. + * + * @param handle Indicates the pointer to the device handle of the I3C controller. + * + * @since 1.0 + */ +void I3cClose(DevHandle handle); + + /** + * @brief Launches an transfer to an I3C device or a compatible I2C device, + * or send a CCC (common command code) to an I3C device which is supported. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * @param msgs Indicates the pointer to the I3C transfer message structure array. + * @param count Indicates the length of the message structure array. + * + * @return Returns the number of transferred message structures if the operation is successful; + * returns a negative value otherwise. + * @see I3cMsg + * @attention This function does not limit the number of message structures specified by count or the data + * length of each message structure. The specific I3C controller determines the maximum number and data length allowed. + * + * @since 1.0 + */ +int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msg, int16_t count, enum TransMode mode); + /** + * @brief Launches an transfer to an I3C device or a compatible I2C device, + * or send a CCC (common command code) to an I3C device which is supported. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t I3cDaa(DevHandle handle); + /** + * @brief Launches an transfer to an I3C device or a compatible I2C device, + * or send a CCC (Common Command Code) to an I3C device which is supported. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * @param addr Indicates the address of device to requeset IBI(In-Band Interrupt). + * @param func Indicates the call back function of the IBI. + * @param payload Indicates the length of payload data, in bytes. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload); + + /** + * @brief Launches an transfer to an I3C device or a compatible I2C device, + * or send a CCC (Common Command Code) to an I3C device which is supported. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * @param addr Indicates the address of device to free IBI. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t I3cFreeIbi(DevHandle handle, uint16_t addr); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* I3C_IF_H */ +/** @} */ diff --git a/support/platform/include/i3c_ccc.h b/support/platform/include/i3c_ccc.h new file mode 100755 index 000000000..3f2f3fc40 --- /dev/null +++ b/support/platform/include/i3c_ccc.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef I3C_CCC_H +#define I3C_CCC_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct I3cCccCmd; + +#define I3C_BROADCAST_ADDR 0x7e; + +/* Broatcast commands */ +#define I3C_CCC_ENEC_B 0x00 +#define I3C_CCC_DISEC_B 0x01 +#define I3C_CCC_ENTAS0_B 0x02 +#define I3C_CCC_ENTAS1_B 0x03 +#define I3C_CCC_ENTAS2_B 0x04 +#define I3C_CCC_ENTAS3_B 0x05 +#define I3C_CCC_RSTDAA_B 0x06 +#define I3C_CCC_ENTDAA 0x07 +#define I3C_CCC_DEFSLVS 0x08 +#define I3C_CCC_SETMWL_B 0x09 +#define I3C_CCC_SETMRL_B 0x0a +#define I3C_CCC_ENTTM 0x0b +#define I3C_CCC_ENDXFER 0X12 +#define I3C_CCC_ENTHDR0 0x20 +#define I3C_CCC_ENTHDR1 0x21 +#define I3C_CCC_ENTHDR2 0x22 +#define I3C_CCC_ENTHDR3 0x23 +#define I3C_CCC_ENTHDR4 0x24 +#define I3C_CCC_ENTHDR5 0x25 +#define I3C_CCC_ENTHDR6 0x26 +#define I3C_CCC_ENTHDR7 0x27 +#define I3C_CCC_SETXTIME_B 0x28 +#define I3C_CCC_SETAASA 0X29 +#define I3C_CCC_VENDOR_B 0x61 +/* Driect commands */ +#define I3C_CCC_ENEC_D 0x80 +#define I3C_CCC_DISEC_D 0x81 +#define I3C_CCC_ENTAS0_D 0x82 +#define I3C_CCC_ENTAS1_D 0x83 +#define I3C_CCC_ENTAS2_D 0x84 +#define I3C_CCC_ENTAS3_D 0x85 +#define I3C_CCC_RSTDAA_D 0x86 +#define I3C_CCC_SETDASA 0x87 +#define I3C_CCC_SETNEWDA 0x88 +#define I3C_CCC_SETMWL_D 0x89 +#define I3C_CCC_SETMRL_D 0x8a +#define I3C_CCC_GETMWL 0x8b +#define I3C_CCC_GETMRL 0x8c +#define I3C_CCC_GETPID 0x8d +#define I3C_CCC_GETBCR 0x8e +#define I3C_CCC_GETDCR 0x8f +#define I3C_CCC_GETSTATUS 0x90 +#define I3C_CCC_GETACCMST 0x91 +#define I3C_CCC_SETBRGTGT 0x93 +#define I3C_CCC_GETMXDS 0x94 +#define I3C_CCC_GETHDRCAP 0x95 +#define I3C_CCC_SETXTIME_D 0x98 +#define I3C_CCC_GETXTIME 0x99 +#define I3C_CCC_VENDOR_D 0xe0 + +struct I3cCccCmd { + uint8_t cmd; + uint16_t dest; +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* I3C_CORE_H */ diff --git a/support/platform/include/i3c_core.h b/support/platform/include/i3c_core.h new file mode 100755 index 000000000..7b7c88677 --- /dev/null +++ b/support/platform/include/i3c_core.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef I3C_CORE_H +#define I3C_CORE_H + +#include "i3c_if.h" +#include "i3c_ccc.h" +#include "hdf_base.h" +#include "hdf_dlist.h" +#include "osal_spinlock.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define I3C_BUS_MAX 16 +#define I3C_ADDR_MAX 127 +#define I3C_IBI_MAX 10 +#define ADDRS_STATUS_BITS 2 +#define BITS_PER_UINT16 16 +#define ADDRS_PER_UINT16 8 + +#define ADDR_STATUS_BIT0_MASK 0x1 +#define ADDR_STATUS_BIT1_MASK 0x2 +#define ADDR_STATUS_MASK 0x3 + +struct I3cCntlr; +struct I3cMethod; +struct I3cLockMethod; +struct I3cDevice; +struct I3cVendor; +struct I3cConfig; + +enum I3cBusMode { + I3C_BUS_SDR_MODE = 0, + I3C_BUS_HDR_MODE, +}; + +enum I3cDeviceType { + I3C_CNTLR_I2C_DEVICE = 0, + I3C_CNTLR_I3C_CONV_DEVICE, + I3C_CNTLR_I3C_SM_DEVICE, // secondary master I3C device +}; + +struct I3cConfig { + enum I3cBusMode busMode; + struct I3cDevice *curMaster; +}; + +struct I3cCntlr { + OsalSpinlock lock; + void *owner; + int16_t busId; + struct I3cConfig config; + uint16_t addrSlot[(I3C_ADDR_MAX + 1) / ADDRS_PER_UINT16]; + struct I3cIbiInfo *ibiSlot[I3C_IBI_MAX]; + const struct I3cMethod *ops; + const struct I3cLockMethod *lockOps; + void *priv; +}; + +struct I3cVendor { + uint32_t vendor_mipi_id; + uint32_t vendor_version_id; + uint32_t vendor_product_id; +}; + +struct I3cIbiInfo { + I3cIbiFunc irqFunc; + int32_t payload; + void *irqData; +}; + +struct I3cDevice { + struct DListHead list; + struct I3cCntlr *cntlr; + uint16_t bcr; + uint16_t dcr; + uint64_t pid; + uint16_t addr; + enum I3cDeviceType type; + uint16_t dynaAddr; + uint16_t supportIbi; + struct I3cIbiInfo *ibi; + struct I3cVendor vendor; + void *devPriv; +}; + +struct I3cMethod { + int32_t (*doDaa)(struct I3cCntlr cntlr); + + int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd ccc); + + int32_t (*Transfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); + + int32_t (*i2cTransfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); + + int32_t (*requestIbi)(struct I3cDevice *dev, I3cIbiFunc func, uint32_t payload); + + void (*freeIbi)(struct I3cDevice *dev); +}; + +struct I3cLockMethod { + /** + * @brief Get exclusive access to an I3C controller. + * + * @param cntlr Indicates the I3C controller to access. + * + * @return Returns 0 on success; returns a negative value otherwise. + * @since 1.0 + */ + int32_t (*lock)(struct I3cCntlr *cntlr); + /** + * @brief Release exclusive access to an I3C controller. + * + * @param cntlr Indicates the I3C controller to release. + * + * @since 1.0 + */ + void (*unlock)(struct I3cCntlr *cntlr); +}; + +enum I3C_ERROR_CODE { + I3C_ERROR_UNKNOWN = 0, + I3C_ERROR_M0, + I3C_ERROR_M1, + I3C_ERROR_M2, + I3C_ERROR_S0, + I3C_ERROR_S1, + I3C_ERROR_S2, + I3C_ERROR_S3, + I3C_ERROR_S4, + I3C_ERROR_S5, + I3C_ERROR_S6, +}; + +enum I3cAddrStatus { + I3C_ADDR_FREE = 0, + I3C_ADDR_RESERVED, + I3C_ADDR_I2C_DEVICE, + I3C_ADDR_I3C_DEVICE, +}; + +int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config); + +int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config); + +int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc func, uint32_t payload); + +int32_t I3cCntlrFreeIbi(struct I3cCntlr *cntlr, uint16_t addr); + +int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd ccc); + +int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); + +int32_t I3cCntlrTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); + +int32_t I3cCntlrDaa(struct I3cCntlr *cntlr); + +int32_t I3cDeviceAdd(struct I3cDevice *device); + +void I3cDeviceRemove(struct I3cDevice *device); + +struct I3cCntlr *I3cCntlrGet(int16_t number); + +void I3cCntlrPut(struct I3cCntlr *cntlr); + +int32_t I3cCntlrAdd(struct I3cCntlr *cntlr); + +void I3cCntlrRemove(struct I3cCntlr *cntlr); + +void I3cCntlrIrqCallback(struct I3cCntlr *cntlr, uint16_t addr); + +enum I3cIoCmd { + I3c_Io_I2cTransfer = 0, + I3C_IO_PRIV_TRANSFER, + I3C_IO_OPEN, + I3C_IO_CLOSE, + I3C_IO_GET_CONFIG, + I3C_IO_SET_CONFIG, + I3C_IO_REQUEST_IBI, + I3C_IO_FREE_IBI, +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* I3C_CORE_H */ diff --git a/support/platform/src/i3c_core.c b/support/platform/src/i3c_core.c new file mode 100755 index 000000000..7be51c852 --- /dev/null +++ b/support/platform/src/i3c_core.c @@ -0,0 +1,712 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "i3c_core.h" +#include "i3c_ccc.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_mutex.h" + +#define I3C_SERVICE_NAME "HDF_PLATFORM_I3C_MANAGER" +#define I3C_CNTLR_MAX 16 + +#define I3C_RESERVED_ADDR_7H00 0x00 +#define I3C_RESERVED_ADDR_7H01 0x01 +#define I3C_RESERVED_ADDR_7H02 0x02 +#define I3C_RESERVED_ADDR_7H3E 0x3e +#define I3C_RESERVED_ADDR_7H5E 0x5e +#define I3C_RESERVED_ADDR_7H6E 0x6e +#define I3C_RESERVED_ADDR_7H76 0x76 +#define I3C_RESERVED_ADDR_7H78 0x78 +#define I3C_RESERVED_ADDR_7H79 0x79 +#define I3C_RESERVED_ADDR_7H7A 0x7a +#define I3C_RESERVED_ADDR_7H7B 0x7b +#define I3C_RESERVED_ADDR_7H7C 0x7c +#define I3C_RESERVED_ADDR_7H7D 0x7d +#define I3C_RESERVED_ADDR_7H7E 0x7e +#define I3C_RESERVED_ADDR_7H7F 0x7f + +#define CHECK_RESERVED_ADDR(addr) \ + ({((addr == I3C_RESERVED_ADDR_7H00) || (addr == I3C_RESERVED_ADDR_7H01) || \ + (addr == I3C_RESERVED_ADDR_7H02) || (addr == I3C_RESERVED_ADDR_7H3E) || \ + (addr == I3C_RESERVED_ADDR_7H5E) || (addr == I3C_RESERVED_ADDR_7H6E) || \ + (addr == I3C_RESERVED_ADDR_7H76) || (addr == I3C_RESERVED_ADDR_7H78) || \ + (addr == I3C_RESERVED_ADDR_7H79) || (addr == I3C_RESERVED_ADDR_7H7A) || \ + (addr == I3C_RESERVED_ADDR_7H7B) || (addr == I3C_RESERVED_ADDR_7H7C) || \ + (addr == I3C_RESERVED_ADDR_7H7D) || (addr == I3C_RESERVED_ADDR_7H7D) || \ + (addr == I3C_RESERVED_ADDR_7H7F)) ? I3C_ADDR_RESERVED : I3C_ADDR_FREE;}) \ + +struct I3cManager { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct I3cCntlr *cntlrs[I3C_CNTLR_MAX]; + struct OsalMutex lock; +}; + +static struct I3cManager *g_i3cManager = NULL; +static struct DListHead g_i3cDeviceList; +static OsalSpinlock g_listLock; + +static inline int32_t I3cCntlrLockDefault(struct I3cCntlr *cntlr) +{ + if (cntlr == NULL) { + return HDF_ERR_DEVICE_BUSY; + } + return OsalSpinLock(&cntlr->lock); +} + +static inline void I3cCntlrUnlockDefault(struct I3cCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + (void)OsalSpinUnlock(&cntlr->lock); +} + +static const struct I3cLockMethod g_i3cLockOpsDefault = { + .lock = I3cCntlrLockDefault, + .unlock = I3cCntlrUnlockDefault, +}; + +static inline int32_t I3cCntlrLock(struct I3cCntlr *cntlr) +{ + if (cntlr->lockOps == NULL || cntlr->lockOps->lock == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + return cntlr->lockOps->lock(cntlr); +} + +static inline void I3cCntlrUnlock(struct I3cCntlr *cntlr) +{ + if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { + cntlr->lockOps->unlock(cntlr); + } +} + +static struct DListHead *I3cDeviceListGet(void) +{ + static struct DListHead *head = NULL; + + head = &g_i3cDeviceList; + DListHeadInit(head); + OsalSpinInit(&g_listLock); + while (OsalSpinLock(&g_listLock)); + + return head; +} + +static void I3cDeviceListPut(void) +{ + (void)OsalSpinUnlock(&g_listLock); +} + +static int32_t GetAddrStatus(struct I3cCntlr *cntlr, uint16_t addr) +{ + int32_t status; + + if (addr > I3C_ADDR_MAX) { + HDF_LOGE("%s: The address 0x%x exceeds the maximum address", __func__, addr); + return HDF_ERR_INVALID_PARAM; + } + + status = ADDR_STATUS_MASK & ((cntlr->addrSlot[addr / ADDRS_PER_UINT16]) \ + >> ((addr % ADDRS_PER_UINT16) * ADDRS_PER_UINT16)); + + return status; +} + +static int32_t SetAddrStatus(struct I3cCntlr *cntlr, uint16_t addr, enum I3cAddrStatus status) +{ + uint16_t temp; + uint32_t ret; + uint16_t statusMask; + + if (addr > I3C_ADDR_MAX) { + HDF_LOGE("%s: The address 0x%x exceeds the maximum address", __func__, addr); + return HDF_ERR_INVALID_PARAM; + } + + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ret = I3cCntlrLock(cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Lock cntlr failed!", __func__); + return ret; + } + + statusMask = ADDR_STATUS_MASK << (addr % ADDRS_PER_UINT16); + temp = (cntlr->addrSlot[addr / ADDRS_PER_UINT16]) | statusMask; + temp &= ((uint16_t)status) << (addr % ADDRS_PER_UINT16); + cntlr->addrSlot[addr / ADDRS_PER_UINT16] = temp; + + I3cCntlrUnlock(cntlr); + + return HDF_SUCCESS; +} + +void inline I3cInitAddrStatus(struct I3cCntlr *cntlr) +{ + uint16_t addr; + + for (addr = 0; addr <= I3C_ADDR_MAX; addr++) { + if (CHECK_RESERVED_ADDR(addr) == I3C_ADDR_RESERVED) { + (void)SetAddrStatus(cntlr, addr, I3C_ADDR_RESERVED); + } + } +} + +static int32_t GetFreeAddr(struct I3cCntlr *cntlr) +{ + enum I3cAddrStatus status; + int16_t count; + + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + for (count = 0; count <= I3C_ADDR_MAX; count++) { + status = (enum I3cAddrStatus)GetAddrStatus(cntlr, count); + if (status == I3C_ADDR_FREE) { + return (int32_t)count; + } + } + + HDF_LOGE("%s: No free addresses left!", __func__); + + return HDF_FAILURE; +} + +int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd ccc) +{ + int32_t ret; + + if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { + cntlr->lockOps->unlock(cntlr); + } + + if (cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) { + HDF_LOGE("%s: ops or sendCccCmd is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = cntlr->ops->sendCccCmd(cntlr, ccc); + I3cCntlrUnlock(cntlr); + + return ret; +} + +static struct I3cDevice *GetDeviceByAddr(struct I3cCntlr *cntlr, uint16_t addr) +{ + struct DListHead *head = NULL; + struct I3cDevice *pos = NULL; + struct I3cDevice *tmp = NULL; + enum I3cAddrStatus addrStatus; + + if (addr > I3C_ADDR_MAX) { + HDF_LOGE("%s: The address 0x%x exceeds the maximum address", __func__, addr); + return NULL; + } + addrStatus = GetAddrStatus(cntlr, addr); + if (addrStatus == I3C_ADDR_FREE || addrStatus == I3C_ADDR_RESERVED) { + HDF_LOGE("%s: The addr 0x%x is unavailable", __func__, addr); + return NULL; + } + + if (addrStatus == I3C_ADDR_I2C_DEVICE || addrStatus == I3C_ADDR_I3C_DEVICE) { + head = I3cDeviceListGet(); + DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct I3cDevice, list) { + if ((pos->dynaAddr == addr) && (pos->cntlr == cntlr)) { + I3cDeviceListPut(); + return pos; + } else if ((!pos->dynaAddr) && (pos->addr == addr) && (pos->cntlr == cntlr)) { + I3cDeviceListPut(); + return pos; + } + } + } + HDF_LOGE("%s: No such device found! addr: 0x%x", __func__, addr); + I3cDeviceListPut(); + + return NULL; +} + +int32_t I3cDeviceAdd(struct I3cDevice *device) +{ + struct DListHead *head = NULL; + struct I3cDevice *pos = NULL; + struct I3cDevice *tmp = NULL; + struct I3cCccCmd ccc; + int32_t ret; + int32_t addr; + + if ((device == NULL) || (GetAddrStatus(device->cntlr, device->addr) != I3C_ADDR_FREE)) { + return HDF_ERR_INVALID_OBJECT; + } + ret = I3cCntlrLock(device->cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Lock cntlr failed!", __func__); + return ret; + } + if (device->type == I3C_CNTLR_I2C_DEVICE) { + ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_I2C_DEVICE); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Add I2C device failed!", __func__); + return ret; + } + } else { + ccc.cmd = I3C_CCC_SETDASA; + ccc.dest = device->addr; + ret = I3cCntlrSendCccCmd(device->cntlr, ccc); + if (device->type == I3C_CNTLR_I2C_DEVICE) { + ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_I3C_DEVICE); + if (ret != HDF_SUCCESS) { + addr = GetFreeAddr(device->cntlr); + if (addr <= 0) { + HDF_LOGE("%s: No free addresses left!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + ret = SetAddrStatus(device->cntlr, addr, I3C_ADDR_I3C_DEVICE); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Add I3C device failed!", __func__); + return ret; + } + } + } + } + head = I3cDeviceListGet(); + DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct I3cDevice, list) { + if ((pos->pid == device->pid) && (pos->cntlr == device->cntlr)) { + I3cDeviceListPut(); + HDF_LOGE("%s: device already existed!: 0x%llx", __func__, device->pid); + (void)SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_RESERVED); + return HDF_ERR_IO; + } + } + DListHeadInit(&device->list); + DListInsertTail(&device->list, head); + I3cDeviceListPut(); + I3cCntlrUnlock(device->cntlr); + + return HDF_SUCCESS; +} + +void I3cDeviceRemove(struct I3cDevice *device) +{ + int32_t ret; + if (device == NULL) { + return; + } + + ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_RESERVED); + if (ret != HDF_SUCCESS) { + return; + } + (void)I3cDeviceListGet(); + DListRemove(&device->list); + I3cDeviceListPut(); +} + +static int32_t I3cManagerAddCntlr(struct I3cCntlr *cntlr) +{ + int32_t ret; + struct I3cManager *manager = g_i3cManager; + + if (cntlr->busId >= I3C_BUS_MAX) { + HDF_LOGE("%s: busId:%d exceed!", __func__, cntlr->busId); + return HDF_ERR_INVALID_PARAM; + } + + if (manager == NULL) { + HDF_LOGE("%s: get i3c manager fail!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("%s: lock i3c manager fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + if (manager->cntlrs[cntlr->busId] != NULL) { + HDF_LOGE("%s: cntlr of bus:%d already exits!", __func__, cntlr->busId); + ret = HDF_FAILURE; + } else { + manager->cntlrs[cntlr->busId] = cntlr; + ret = HDF_SUCCESS; + } + (void)OsalMutexUnlock(&manager->lock); + + return ret; +} + +static void I3cManagerRemoveCntlr(struct I3cCntlr *cntlr) +{ + struct I3cManager *manager = g_i3cManager; + + if (cntlr->busId < 0 || cntlr->busId >= I3C_BUS_MAX) { + HDF_LOGE("%s: invalid busId:%d!", __func__, cntlr->busId); + return; + } + + if (manager == NULL) { + HDF_LOGE("%s: get i3c manager fail!", __func__); + return; + } + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("%s: lock i3c manager fail!", __func__); + return; + } + + if (manager->cntlrs[cntlr->busId] != cntlr) { + HDF_LOGE("%s: cntlr(%d) not in manager!", __func__, cntlr->busId); + } else { + manager->cntlrs[cntlr->busId] = NULL; + } + + (void)OsalMutexUnlock(&manager->lock); +} + +struct I3cCntlr *I3cCntlrGet(int16_t number) +{ + struct I3cCntlr *cntlr = NULL; + struct I3cManager *manager = g_i3cManager; + + if (number < 0 || number >= I3C_BUS_MAX) { + HDF_LOGE("%s: invalid busId:%d!", __func__, number); + return NULL; + } + + if (manager == NULL) { + HDF_LOGE("%s: get i3c manager fail!", __func__); + return NULL; + } + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("%s: lock i3c manager fail!", __func__); + return NULL; + } + cntlr = manager->cntlrs[number]; + (void)OsalMutexUnlock(&manager->lock); + + return cntlr; +} + +void I3cCntlrPut(struct I3cCntlr *cntlr) +{ + (void)cntlr; +} + +int32_t I3cCntlrAdd(struct I3cCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->ops == NULL) { + HDF_LOGE("%s: no ops supplied!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->lockOps == NULL) { + HDF_LOGI("%s: use default lock methods!", __func__); + cntlr->lockOps = &g_i3cLockOpsDefault; + } + + if (OsalSpinInit(&cntlr->lock) != HDF_SUCCESS) { + HDF_LOGE("%s: init lock fail!", __func__); + return HDF_FAILURE; + } + + I3cInitAddrStatus(cntlr); + ret = I3cManagerAddCntlr(cntlr); + if (ret != HDF_SUCCESS) { + (void)OsalSpinDestroy(&cntlr->lock); + return ret; + } + + return HDF_SUCCESS; +} + +void I3cCntlrRemove(struct I3cCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + I3cManagerRemoveCntlr(cntlr); + (void)OsalSpinDestroy(&cntlr->lock); +} + +int32_t I3cCntlrTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count) +{ + int32_t ret; + + if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { + cntlr->lockOps->unlock(cntlr); + } + + if (cntlr->ops == NULL || cntlr->ops->Transfer == NULL) { + HDF_LOGE("%s: ops or i3transfer is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = cntlr->ops->Transfer(cntlr, msgs, count); + I3cCntlrUnlock(cntlr); + + return ret; +} + +int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count) +{ + int32_t ret; + + if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { + cntlr->lockOps->unlock(cntlr); + } + + if (cntlr->ops == NULL || cntlr->ops->i2cTransfer == NULL) { + HDF_LOGE("%s: ops or i2ctransfer is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + ret = cntlr->ops->i2cTransfer(cntlr, msgs, count); + I3cCntlrUnlock(cntlr); + + return ret; +} + +int32_t I3cCntlrDaa(struct I3cCntlr *cntlr) +{ + int32_t ret; + struct I3cCccCmd ccc; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) { + HDF_LOGE("%s: ops or sendCccCmd is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + ccc.cmd = I3C_CCC_ENTDAA; + ccc.dest = I3C_BROADCAST_ADDR; + ret = cntlr->ops->sendCccCmd(cntlr, ccc); + I3cCntlrUnlock(cntlr); + + return ret; +} + +int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (config == NULL) { + HDF_LOGE("%s: config is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr->config = *config; + return HDF_SUCCESS; +} + +int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) +{ + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + config = &cntlr->config; + return HDF_SUCCESS; +} + +int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc func, uint32_t payload) +{ + struct I3cDevice *device = NULL; + struct I3cIbiInfo *ibi = NULL; + uint16_t ptr; + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if ((cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) || (!device->supportIbi)) { + HDF_LOGE("%s: Not support!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if ((func == NULL) || (addr >= I3C_ADDR_MAX)) { + HDF_LOGE("%s: invalid func or addr!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + device = GetDeviceByAddr(cntlr, addr); + if (device == NULL) { + HDF_LOGE("%s: Get device failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + for (ptr = 0; ptr < I3C_IBI_MAX; ptr++) { + if (cntlr->ibiSlot[ptr] == NULL) { + cntlr->ibiSlot[ptr] = device->ibi; + ibi = (struct I3cIbiInfo *)OsalMemCalloc(sizeof(*ibi)); + ibi->irqFunc = func; + ibi->payload = payload; + device->ibi = ibi; + ret = cntlr->ops->requestIbi(device, func, payload); + return ret; + } + } + + return HDF_ERR_DEVICE_BUSY; +} + +int32_t I3cCntlrFreeIbi(struct I3cCntlr *cntlr, uint16_t addr) +{ + struct I3cDevice *device = NULL; + uint16_t ptr; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (addr >= I3C_ADDR_MAX) { + HDF_LOGE("%s: Invalid addr: %x", __func__, addr); + return HDF_ERR_INVALID_PARAM; + } + + device = GetDeviceByAddr(cntlr, addr); + if (device == NULL) { + HDF_LOGE("%s: Get device failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + for (ptr = 0; ptr < I3C_IBI_MAX; ptr++) { + if (cntlr->ibiSlot[ptr] == device->ibi) { + cntlr->ibiSlot[ptr] = NULL; + OsalMemFree(device->ibi); + } + } + + return HDF_SUCCESS; +} + +void I3cCntlrIrqCallback(struct I3cCntlr *cntlr, uint16_t addr) +{ + struct I3cIbiInfo *info = NULL; + struct I3cDevice *device = NULL; + + if (cntlr != NULL && addr <= I3C_ADDR_MAX) { + device = GetDeviceByAddr(cntlr, addr); + info = device->ibi; + if (info != NULL && info->irqFunc != NULL) { + (void)info->irqFunc(addr, info->irqData); + } else { + HDF_LOGW("%s: info or irqFunc is NULL!", __func__); + } + } else { + HDF_LOGW("%s: invalid cntlr(info) or addr:%u!", __func__, addr); + } +} + +static int32_t I3cManagerBind(struct HdfDeviceObject *device) +{ + (void)device; + HDF_LOGE("%s:success!", __func__); + return HDF_SUCCESS; +} + +static int32_t I3cManagerInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct I3cManager *manager = NULL; + + HDF_LOGI("%s: Enter!", __func__); + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + manager = (struct I3cManager *)OsalMemCalloc(sizeof(*manager)); + if (manager == NULL) { + HDF_LOGE("%s: malloc manager fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = OsalMutexInit(&manager->lock); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: mutex init fail:%d", __func__, ret); + OsalMemFree(manager); + return HDF_FAILURE; + } + manager->device = device; + g_i3cManager = manager; + HDF_LOGE("%s:success!", __func__); + + return HDF_SUCCESS; +} + +static void I3cManagerRelease(struct HdfDeviceObject *device) +{ + struct I3cManager *manager = NULL; + + HDF_LOGI("%s: enter", __func__); + if (device == NULL) { + HDF_LOGI("%s: device is null", __func__); + return; + } + manager = (struct I3cManager *)device->service; + if (manager == NULL) { + HDF_LOGI("%s: no service binded!", __func__); + return; + } + g_i3cManager = NULL; + OsalMemFree(manager); + HDF_LOGE("%s:success!", __func__); +} + +struct HdfDriverEntry g_i3cManagerEntry = { + .moduleVersion = 1, + .Bind = I3cManagerBind, + .Init = I3cManagerInit, + .Release = I3cManagerRelease, + .moduleName = "HDF_PLATFORM_I3C_MANAGER", +}; +HDF_INIT(g_i3cManagerEntry); diff --git a/support/platform/src/i3c_if.c b/support/platform/src/i3c_if.c new file mode 100755 index 000000000..8945d7300 --- /dev/null +++ b/support/platform/src/i3c_if.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "i3c_core.h" +#include "i3c_if.h" +#include "hdf_log.h" +#define HDF_LOG_TAG adc_if_c + +DevHandle I3cOpen(int16_t number) +{ + return (DevHandle)I3cCntlrGet(number); +} + +void I3cClose(DevHandle handle) +{ + I3cCntlrPut((struct I3cCntlr *)handle); +} + +int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msgs, int16_t count, enum TransMode mode) +{ + int32_t ret = HDF_SUCCESS; + + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (msgs == NULL || count <= 0) { + HDF_LOGE("I3cTransfer: err params! msgs:%s, count:%d", + (msgs == NULL) ? "0" : "x", count); + return HDF_ERR_INVALID_PARAM; + } + + switch (mode) { + case I2C_MODE: + ret = I3cCntlrI2cTransfer((struct I3cCntlr *)handle, msgs, count); + break; + case I3C_MODE: + ret = I3cCntlrTransfer((struct I3cCntlr *)handle, msgs, count); + break; + case CCC_CMD_MODE: + ret = I3cCntlrSendCccCmd((struct I3cCntlr *)handle, msgs->ccc); + break; + default: + break; + } + + return ret; +} + +int32_t I3cDaa(DevHandle handle) +{ + return I3cCntlrDaa((struct I3cCntlr *)handle); +} + +int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config) +{ + return I3cCntlrSetConfig((struct I3cCntlr *)handle, config); +} + +int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config) +{ + return I3cCntlrGetConfig((struct I3cCntlr *)handle, config); +} + +int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload) +{ + return I3cCntlrRequestIbi((struct I3cCntlr *)handle, addr, func, payload); +} + +int32_t I3cFreeIbi(DevHandle handle, uint16_t addr) +{ + return I3cCntlrFreeIbi((struct I3cCntlr *)handle, addr); +} -- Gitee From 822a2550ce2b10d999b04a228830122f492b2873 Mon Sep 17 00:00:00 2001 From: lzl Date: Fri, 15 Oct 2021 07:41:45 +0000 Subject: [PATCH 085/272] hdmi framework code Signed-off-by: lzl --- support/platform/src/hdmi/hdmi_edid.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 54c34d3f2..969f3b955 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -370,6 +370,7 @@ static int32_t HdmiEdidExtBlockNumPhase(struct HdmiEdid *edid) struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); sinkCap->extBlockNum = edid->raw[HDMI_EDID_EXTENSION_BLOCK_ADDR]; + HDF_LOGD("edid extBlockNum = %d.", sinkCap->extBlockNum); if (sinkCap->extBlockNum > (HDMI_EDID_MAX_BLOCK_NUM - 1)) { HDF_LOGW("ext block number %d is invallid.", sinkCap->extBlockNum); sinkCap->extBlockNum = HDMI_EDID_MAX_BLOCK_NUM - 1; @@ -1219,7 +1220,7 @@ int32_t HdmiEdidPhase(struct HdmiEdid *edid) } sinkCap = &(edid->sinkCap); - for (blockNum = 1; blockNum < sinkCap->extBlockNum; blockNum++) { + for (blockNum = 1; blockNum <= sinkCap->extBlockNum; blockNum++) { ret = HdmiEdidExtBlockPhase(edid, blockNum); if (ret != HDF_SUCCESS) { HDF_LOGE("edid ext block%d phase fail.", blockNum); -- Gitee From f5a2d92414e805268b898baa17f1cc03c878511c Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Fri, 15 Oct 2021 16:59:12 +0800 Subject: [PATCH 086/272] =?UTF-8?q?driver=5Fframework=201015reviewbot?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/src/gpio/gpio_core.c | 4 ---- support/platform/src/gpio/gpio_if.c | 2 -- 2 files changed, 6 deletions(-) diff --git a/support/platform/src/gpio/gpio_core.c b/support/platform/src/gpio/gpio_core.c index dc9449adf..61ad2c016 100644 --- a/support/platform/src/gpio/gpio_core.c +++ b/support/platform/src/gpio/gpio_core.c @@ -9,11 +9,7 @@ #include "gpio/gpio_core.h" #include "hdf_log.h" #include "osal_mem.h" -#include "osal_sem.h" -#include "osal_thread.h" #include "plat_log.h" -#include "platform_core.h" -#include "securec.h" #define HDF_LOG_TAG gpio_core diff --git a/support/platform/src/gpio/gpio_if.c b/support/platform/src/gpio/gpio_if.c index d7c0205cd..d466a2299 100644 --- a/support/platform/src/gpio/gpio_if.c +++ b/support/platform/src/gpio/gpio_if.c @@ -13,11 +13,9 @@ #include "hdf_io_service_if.h" #include "platform_errno.h" #else -#include "devsvc_manager_clnt.h" #include "gpio/gpio_core.h" #endif -#include "hdf_base.h" #include "hdf_log.h" #define HDF_LOG_TAG gpio_if -- Gitee From 66808977943f8cc4ade52b90bac3b2a2628e3bb4 Mon Sep 17 00:00:00 2001 From: lzl Date: Sun, 17 Oct 2021 02:31:36 +0000 Subject: [PATCH 087/272] hdmi framwork code Signed-off-by: lzl --- include/platform/hdmi_if.h | 35 +++++++++++ support/platform/src/hdmi/hdmi_core.c | 24 ++++++++ support/platform/src/hdmi/hdmi_dispatch.c | 25 ++++++++ support/platform/src/hdmi/hdmi_edid.c | 2 +- support/platform/src/hdmi/hdmi_event.c | 13 +++- support/platform/src/hdmi/hdmi_if.c | 72 +++++++++++++++++++++++ 6 files changed, 167 insertions(+), 4 deletions(-) diff --git a/include/platform/hdmi_if.h b/include/platform/hdmi_if.h index f48ddae93..9be1da370 100644 --- a/include/platform/hdmi_if.h +++ b/include/platform/hdmi_if.h @@ -613,6 +613,16 @@ struct HdmiHdrAttr { enum HdmiHdrColormetry colorimetry; }; +/** + * @brief Defines the hdmi HPD(Hot Plug Detect) callback info. + * + * @since 1.0 + */ +struct HdmiHpdCallbackInfo { + void *data; + void (*callbackFunc)(void *data, bool hdp); +}; + /** * @brief Opens an HDMI controller with a specified bus number. * @@ -745,6 +755,31 @@ int32_t HdmiSetHdrAttribute(DevHandle handle, struct HdmiHdrAttr *attr); */ int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len); +/** + * @brief HDMI register HPD(Hot Plug Detect) callback function. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * @param callback Indicates the pointer to the callback info. + * + * @return Returns the length of the data read if the operation is successful; + * returns a negative value or 0 if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback); + +/** + * @brief HDMI unregister HPD(Hot Plug Detect) callback function. + * + * @param handle Indicates the pointer to the device handle of the HDMI controller. + * + * @return Returns the length of the data read if the operation is successful; + * returns a negative value or 0 if the operation fails. + * + * @since 1.0 + */ +int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle); + /** * @brief Closes an HDMI controller. * diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index f78b516ba..4a4fe58ea 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -1394,6 +1394,30 @@ int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, return HdmiInfoframeSetInfo(&(cntlr->infoframe), type, frame); } +int32_t HdmiCntlrRegisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdmiHpdCallbackInfo *callback) +{ + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (callback == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + cntlr->event.callback.data = callback->data; + cntlr->event.callback.callbackFunc = callback->callbackFunc; + return HDF_SUCCESS; +} + +int32_t HdmiCntlrUnregisterHpdCallbackFunc(struct HdmiCntlr *cntlr) +{ + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + cntlr->event.callback.data = NULL; + cntlr->event.callback.callbackFunc = NULL; + return HDF_SUCCESS; +} + void HdmiCntlrClose(struct HdmiCntlr *cntlr) { if (cntlr == NULL || cntlr->ops == NULL) { diff --git a/support/platform/src/hdmi/hdmi_dispatch.c b/support/platform/src/hdmi/hdmi_dispatch.c index c1a3f130d..c3f2e34f0 100644 --- a/support/platform/src/hdmi/hdmi_dispatch.c +++ b/support/platform/src/hdmi/hdmi_dispatch.c @@ -27,6 +27,8 @@ enum HdmiIoCmd { HDMI_CMD_READ_SINK_EDID, HDMI_CMD_INFOFRAME_SET, HDMI_CMD_INFOFRAME_GET, + HDMI_CMD_REGISTER_HPD_CALLBACK_FUNC, + HDMI_CMD_UNREGISTER_HPD_CALLBACK_FUNC, HDMI_CMD_BUTT, }; @@ -222,6 +224,27 @@ static int32_t HdmiCmdInfoframeGet(struct HdmiCntlr *cntlr, struct HdfSBuf *data return HDF_SUCCESS; } +static int32_t HdmiCmdRegisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + uint32_t *addr = NULL; + size_t size; + (void)reply; + + if (!HdfSbufReadBuffer(data, (const void **)&addr, &size)) { + HDF_LOGE("HdmiCmdRegisterHpdCallbackFunc: sbuf read buffer failed"); + return HDF_ERR_IO; + } + return HdmiCntlrRegisterHpdCallbackFunc(cntlr, (struct HdmiHpdCallbackInfo *)(uintptr_t)(*addr)); +} + +static int32_t HdmiCmdUnregisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + + return HdmiCntlrUnregisterHpdCallbackFunc(cntlr); +} + int32_t HdmiIoDispatch(struct HdfDeviceIoClient *client, int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) { struct HdmiCntlr *cntlr = NULL; @@ -240,6 +263,8 @@ int32_t HdmiIoDispatch(struct HdfDeviceIoClient *client, int32_t cmd, struct Hdf { HDMI_CMD_READ_SINK_EDID, HdmiCmdReadSinkEdid }, { HDMI_CMD_INFOFRAME_SET, HdmiCmdInfoframeSet }, { HDMI_CMD_INFOFRAME_GET, HdmiCmdInfoframeGet }, + { HDMI_CMD_REGISTER_HPD_CALLBACK_FUNC, HdmiCmdRegisterHpdCallbackFunc }, + { HDMI_CMD_UNREGISTER_HPD_CALLBACK_FUNC, HdmiCmdUnregisterHpdCallbackFunc }, }; if (client == NULL || client->device == NULL) { diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 969f3b955..44d591238 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -65,7 +65,7 @@ static int32_t HdmiEdidBlockCheckSum(uint8_t *data) uint32_t i; uint32_t checkSum = 0; - HDF_LOGI("check sum is 0x%x", data[HDMI_EDID_CHECKSUM_ADDR]); + HDF_LOGD("check sum is 0x%x", data[HDMI_EDID_CHECKSUM_ADDR]); for (i = 0; i < HDMI_EDID_SINGLE_BLOCK_SIZE; i++) { checkSum += data[i]; } diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 5d9ecaf0c..07c815f8e 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -92,6 +92,7 @@ static int32_t HdmiEventHotPlugHandleComm(struct HdmiCntlr *cntlr) int32_t ret; cntlr->event.plugged = true; + HDF_LOGD("Hdmi sink device plugged!"); if (cntlr->hdmi == NULL) { ret = HdmiCntlrAllocDev(cntlr); if (ret != HDF_SUCCESS) { @@ -122,6 +123,9 @@ __END: return ret; } cntlr->event.hpdDetected = true; + if (cntlr->event.callback.callbackFunc != NULL) { + cntlr->event.callback.callbackFunc(cntlr->event.callback.data, true); + } return HDF_SUCCESS; } @@ -133,7 +137,7 @@ static int32_t HdmiEventHotPlugHandle(struct HdmiCntlr *cntlr) } if (cntlr->event.plugged == true) { - HDF_LOGD("hdp state not change"); + HDF_LOGD("HdmiEventHotPlugHandle: hdp state not change"); return HDF_SUCCESS; } return HdmiEventHotPlugHandleComm(cntlr); @@ -142,7 +146,7 @@ static int32_t HdmiEventHotPlugHandle(struct HdmiCntlr *cntlr) static int32_t HdmiEventHotUnplugHandle(struct HdmiCntlr *cntlr) { if (cntlr->event.plugged == false) { - HDF_LOGD("plug state not change"); + HDF_LOGD("HdmiEventHotUnplugHandle: plug state not change"); return HDF_SUCCESS; } @@ -150,6 +154,9 @@ static int32_t HdmiEventHotUnplugHandle(struct HdmiCntlr *cntlr) HdmiCntlrFreeDev(cntlr); cntlr->event.plugged = false; cntlr->event.hpdDetected = false; + if (cntlr->event.callback.callbackFunc != NULL) { + cntlr->event.callback.callbackFunc(cntlr->event.callback.data, true); + } return HDF_SUCCESS; } @@ -263,4 +270,4 @@ int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void break; } return ret; -} +} \ No newline at end of file diff --git a/support/platform/src/hdmi/hdmi_if.c b/support/platform/src/hdmi/hdmi_if.c index c6b960a87..a3a9b791d 100644 --- a/support/platform/src/hdmi/hdmi_if.c +++ b/support/platform/src/hdmi/hdmi_if.c @@ -38,6 +38,8 @@ enum HdmiIoCmd { HDMI_CMD_READ_SINK_EDID, HDMI_CMD_INFOFRAME_SET, HDMI_CMD_INFOFRAME_GET, + HDMI_CMD_REGISTER_HPD_CALLBACK_FUNC, + HDMI_CMD_UNREGISTER_HPD_CALLBACK_FUNC, HDMI_CMD_BUTT, }; @@ -347,6 +349,58 @@ __EXIT : } return ret; } + +static int32_t HdmiUserRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback) +{ + int32_t ret; + struct HdfSBuf *buf = NULL; + struct HdfIoService *service = (struct HdfIoService *)handle; + uint32_t addr = (uint32_t)(uintptr_t)callback; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserRegisterHpdCallbackFunc: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + if (callback == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + buf = HdfSBufObtain(sizeof(uint32_t)); + if (buf == NULL) { + HDF_LOGE("HdmiUserRegisterHpdCallbackFunc: failed to obtain buf"); + return HDF_ERR_MALLOC_FAIL; + } + if (!HdfSbufWriteBuffer(buf, (void *)&addr, sizeof(uint32_t))) { + HDF_LOGE("HdmiUserRegisterHpdCallbackFunc: sbuf write attr failed"); + HdfSBufRecycle(buf); + return HDF_ERR_IO; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_REGISTER_HPD_CALLBACK_FUNC, buf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserRegisterHpdCallbackFunc: failed to write, ret %d", ret); + } + HdfSBufRecycle(buf); + return ret; +} + +static int32_t HdmiUserUnregisterHpdCallbackFunc(DevHandle handle) +{ + struct HdfIoService *service = (struct HdfIoService *)handle; + int32_t ret; + + if (service == NULL || service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("HdmiUserUnregisterHpdCallbackFunc: service is invalid"); + return HDF_ERR_INVALID_PARAM; + } + + ret = service->dispatcher->Dispatch(&service->object, HDMI_CMD_UNREGISTER_HPD_CALLBACK_FUNC, NULL, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdmiUserUnregisterHpdCallbackFunc: failed to send service call:%d", ret); + return ret; + } + return HDF_SUCCESS; +} #endif static void *HdmiCntlrObjGet(uint16_t busNum) @@ -484,6 +538,24 @@ int32_t HdmiReadSinkEdid(DevHandle handle, uint8_t *buffer, uint32_t len) #endif } +int32_t HdmiRegisterHpdCallbackFunc(DevHandle handle, struct HdmiHpdCallbackInfo *callback) +{ +#ifdef __USER__ + return HdmiUserRegisterHpdCallbackFunc(handle, callback); +#else + return HdmiCntlrRegisterHpdCallbackFunc((struct HdmiCntlr *)handle, callback); +#endif +} + +int32_t HdmiUnregisterHpdCallbackFunc(DevHandle handle) +{ +#ifdef __USER__ + return HdmiUserUnregisterHpdCallbackFunc(handle); +#else + return HdmiCntlrUnregisterHpdCallbackFunc((struct HdmiCntlr *)handle); +#endif +} + void HdmiClose(DevHandle handle) { #ifdef __USER__ -- Gitee From 7f568e301a8bf0d18b4b79ebeba663065c68c2bd Mon Sep 17 00:00:00 2001 From: lzl Date: Sun, 17 Oct 2021 03:21:21 +0000 Subject: [PATCH 088/272] hdmi framework code Signed-off-by: lzl --- support/platform/include/hdmi/hdmi_core.h | 4 +++- support/platform/include/hdmi/hdmi_event.h | 2 ++ support/platform/src/hdmi/hdmi_event.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h index 55e8d5a36..e3d1ee12b 100644 --- a/support/platform/include/hdmi/hdmi_core.h +++ b/support/platform/include/hdmi/hdmi_core.h @@ -366,11 +366,13 @@ int32_t HdmiCntlrSetAudioAttribute(struct HdmiCntlr *cntlr, struct HdmiAudioAttr int32_t HdmiCntlrSetHdrAttribute(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *attr); int32_t HdmiCntlrInfoframeGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); +int32_t HdmiCntlrRegisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdmiHpdCallbackInfo *callback); +int32_t HdmiCntlrUnregisterHpdCallbackFunc(struct HdmiCntlr *cntlr); void HdmiCntlrClose(struct HdmiCntlr *cntlr); bool HdmiHpdStatusDelayGet(struct HdmiCntlr *cntlr); bool HdmiHpdStatusGet(struct HdmiCntlr *cntlr); -int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void *datat); +int32_t HdmiEventHandle(struct HdmiCntlr *cntlr, enum HdmiEventType event, void *data); int32_t HdmiEventMsgHandleDefault(struct PlatformQueue *queue, struct PlatformMsg *msg); bool HdmiEdidSupportFrl(struct HdmiDevice *hdmi); diff --git a/support/platform/include/hdmi/hdmi_event.h b/support/platform/include/hdmi/hdmi_event.h index 5a88a4543..2a7fae951 100644 --- a/support/platform/include/hdmi/hdmi_event.h +++ b/support/platform/include/hdmi/hdmi_event.h @@ -10,6 +10,7 @@ #define HDMI_EVENT_H #include "hdf_base.h" +#include "hdmi_if.h" #include "platform_core.h" #ifdef __cplusplus @@ -40,6 +41,7 @@ struct HdmiEventMsg { struct HdmiEvent { bool plugged; bool hpdDetected; + struct HdmiHpdCallbackInfo callback; }; #ifdef __cplusplus diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 07c815f8e..97ff983d3 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -155,7 +155,7 @@ static int32_t HdmiEventHotUnplugHandle(struct HdmiCntlr *cntlr) cntlr->event.plugged = false; cntlr->event.hpdDetected = false; if (cntlr->event.callback.callbackFunc != NULL) { - cntlr->event.callback.callbackFunc(cntlr->event.callback.data, true); + cntlr->event.callback.callbackFunc(cntlr->event.callback.data, false); } return HDF_SUCCESS; } -- Gitee From cc96bf9a70623a127f233f8b57e0a88305fc0b8f Mon Sep 17 00:00:00 2001 From: chenpan0560 Date: Sat, 16 Oct 2021 13:11:16 +0800 Subject: [PATCH 089/272] hdf_dev_eco_tool Resubmit code Signed-off-by: chenpan0560 --- .../hdf_dev_eco_tool/command_line/__init__.py | 0 .../command_line/hdf_add_handler.py | 333 ++++++++++++++++ .../command_line/hdf_command_error_code.py | 41 ++ .../command_line/hdf_command_handler_base.py | 99 +++++ .../command_line/hdf_command_line_server.py | 144 +++++++ .../command_line/hdf_defconfig_patch.py | 110 ++++++ .../command_line/hdf_delete_handler.py | 223 +++++++++++ .../command_line/hdf_device_info_hcs.py | 155 ++++++++ .../command_line/hdf_dot_config_file.py | 154 ++++++++ .../command_line/hdf_driver_config_file.py | 95 +++++ .../command_line/hdf_get_handler.py | 215 ++++++++++ .../command_line/hdf_hcs_file.py | 104 +++++ .../command_line/hdf_lite_kconfig_file.py | 88 +++++ .../command_line/hdf_lite_mk_file.py | 105 +++++ .../command_line/hdf_lite_settings_mk_file.py | 110 ++++++ .../command_line/hdf_manager_config_file.py | 174 ++++++++ .../command_line/hdf_module_kconfig_file.py | 203 ++++++++++ .../command_line/hdf_module_mk_file.py | 90 +++++ .../command_line/hdf_ping_handler.py | 42 ++ .../command_line/hdf_set_handler.py | 144 +++++++ .../command_line/hdf_tool_argument_parser.py | 47 +++ .../command_line/hdf_tool_commands.py | 65 +++ .../command_line/hdf_vendor_build_file.py | 80 ++++ .../command_line/hdf_vendor_kconfig_file.py | 126 ++++++ .../command_line/hdf_vendor_makefile.py | 89 +++++ .../command_line/hdf_vendor_mk_file.py | 97 +++++ .../hdf_tool_daemon_server.py | 53 +++ tools/hdf_dev_eco_tool/hdf_tool_exception.py | 41 ++ tools/hdf_dev_eco_tool/hdf_tool_settings.py | 124 ++++++ tools/hdf_dev_eco_tool/hdf_tool_version.py | 38 ++ tools/hdf_dev_eco_tool/hdf_utils.py | 370 ++++++++++++++++++ tools/hdf_dev_eco_tool/main.py | 74 ++++ .../resources/create_model.config | 1 + .../hdf_dev_eco_tool/resources/settings.json | 23 ++ .../templates/lite/Linux_Kconfig.template | 34 ++ .../templates/lite/Linux_Makefile.template | 33 ++ .../templates/lite/Linux_built-in.template | 4 + .../templates/lite/Liteos_BUILD_gn.template | 41 ++ .../lite/Liteos_Device_Info_Hcs.template | 15 + .../templates/lite/Liteos_Kconfig.template | 34 ++ .../templates/lite/Liteos_Makefile.template | 39 ++ .../templates/lite/device_info_hcs.template | 15 + .../templates/lite/hdf_driver.c.template | 41 ++ .../templates/lite/hdf_driver.h.template | 10 + .../templates/lite/hdf_driver_config.template | 3 + .../lite/hdf_driver_kconfig.template | 6 + .../lite/hdf_driver_makefile.template | 10 + .../lite/hdf_driver_manager_config.template | 38 ++ .../hdf_driver_manager_config_device.template | 10 + .../hdf_driver_manager_config_host.template | 3 + .../templates/lite/hdf_hcs_makefile.template | 7 + .../lite/hdf_module_kconfig.template | 6 + .../templates/lite/hdf_module_mk.template | 4 + .../lite/hdf_module_mk_driver.template | 5 + .../lite/hdf_vendor_kconfig.template | 1 + .../templates/lite/hdf_vendor_mk.template | 2 + .../lite/hdf_vendor_mk_module.template | 4 + 57 files changed, 4222 insertions(+) create mode 100755 tools/hdf_dev_eco_tool/command_line/__init__.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_command_error_code.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_command_handler_base.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_command_line_server.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_delete_handler.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_device_info_hcs.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_dot_config_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_driver_config_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_hcs_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_lite_kconfig_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_lite_mk_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_lite_settings_mk_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_manager_config_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_module_kconfig_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_module_mk_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_ping_handler.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_tool_argument_parser.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_tool_commands.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_vendor_build_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_vendor_makefile.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_vendor_mk_file.py create mode 100755 tools/hdf_dev_eco_tool/hdf_tool_daemon_server.py create mode 100755 tools/hdf_dev_eco_tool/hdf_tool_exception.py create mode 100755 tools/hdf_dev_eco_tool/hdf_tool_settings.py create mode 100755 tools/hdf_dev_eco_tool/hdf_tool_version.py create mode 100755 tools/hdf_dev_eco_tool/hdf_utils.py create mode 100755 tools/hdf_dev_eco_tool/main.py create mode 100755 tools/hdf_dev_eco_tool/resources/create_model.config create mode 100755 tools/hdf_dev_eco_tool/resources/settings.json create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Kconfig.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Makefile.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Linux_built-in.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_BUILD_gn.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Device_Info_Hcs.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Kconfig.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Makefile.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.h.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_config.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_kconfig.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_makefile.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_device.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_host.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_hcs_makefile.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_kconfig.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk_driver.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_kconfig.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk.template create mode 100755 tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk_module.template diff --git a/tools/hdf_dev_eco_tool/command_line/__init__.py b/tools/hdf_dev_eco_tool/command_line/__init__.py new file mode 100755 index 000000000..e69de29bb diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py new file mode 100755 index 000000000..7aeb77e81 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py @@ -0,0 +1,333 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import json +import platform +from string import Template + +from .hdf_command_handler_base import HdfCommandHandlerBase +from .hdf_command_error_code import CommandErrorCode +from .hdf_device_info_hcs import HdfDeviceInfoHcsFile +from .hdf_vendor_build_file import HdfVendorBuildFile +from .hdf_vendor_kconfig_file import HdfVendorKconfigFile +from .hdf_vendor_mk_file import HdfVendorMkFile +from .hdf_driver_config_file import HdfDriverConfigFile +from hdf_tool_settings import HdfToolSettings +from hdf_tool_exception import HdfToolException +from .hdf_vendor_makefile import HdfVendorMakeFile +from .hdf_defconfig_patch import HdfDefconfigAndPatch +import hdf_utils + + +class HdfAddHandler(HdfCommandHandlerBase): + def __init__(self, args): + super(HdfAddHandler, self).__init__() + self.cmd = 'add' + self.handlers = { + 'vendor': self._add_vendor_handler, + 'module': self._add_module_handler, + 'driver': self._add_driver_handler, + 'config': self._add_config_handler, + } + self.parser.add_argument("--action_type", + help=' '.join(self.handlers.keys()), + required=True) + self.parser.add_argument("--root_dir", required=True) # 路径 + self.parser.add_argument("--vendor_name") # 厂商 + self.parser.add_argument("--module_name") # 模块名 + self.parser.add_argument("--driver_name") # 驱动名称 + self.parser.add_argument("--board_name") # 板子名称 + self.parser.add_argument("--kernel_name") # 内核名称 + self.args = self.parser.parse_args(args) + + @staticmethod + def _render(template_path, output_path, data_model): + if not os.path.exists(template_path): + return + raw_content = hdf_utils.read_file(template_path) + contents = Template(raw_content).safe_substitute(data_model) + hdf_utils.write_file(output_path, contents) + + def _file_gen_lite(self, template, out_dir, filename, model): + templates_dir = hdf_utils.get_templates_lite_dir() + template_path = os.path.join(templates_dir, template) + file_path = os.path.join(out_dir, filename) + self._render(template_path, file_path, model) + + def _add_vendor_handler(self): + self.check_arg_raise_if_not_exist("vendor_name") + root, vendor, _, _, board = self.get_args() + target_dir = hdf_utils.get_vendor_hdf_dir(root, vendor) + if os.path.exists(target_dir): + raise HdfToolException( + "%s already exists" % + target_dir, CommandErrorCode.TARGET_ALREADY_EXIST) + os.makedirs(target_dir) + self._file_gen_lite('hdf_vendor_kconfig.template', target_dir, + 'Kconfig', {}) + board_parent_path = HdfToolSettings().get_board_parent_path(board) + if not board_parent_path: + board_parent_path = 'vendor/hisilicon' + data_model = { + "board_parent_path": board_parent_path + } + self._file_gen_lite('hdf_vendor_mk.template', target_dir, + 'hdf_vendor.mk', data_model) + + def _add_module_handler(self): + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("module_name") + self.check_arg_raise_if_not_exist("kernel_name") + self.check_arg_raise_if_not_exist("board_name") + self.check_arg_raise_if_not_exist("driver_name") + + args_tuple = self.get_args() + root, vendor, module, driver, board, kernel = args_tuple + converter = hdf_utils.WordsConverter(self.args.module_name) + driver_name_converter = hdf_utils.WordsConverter(self.args.driver_name) + framework_hdf = hdf_utils.get_vendor_hdf_dir_framework(root) + if not os.path.exists(framework_hdf): + raise HdfToolException( + ' framework model path "%s" not exist' % + framework_hdf, CommandErrorCode.TARGET_NOT_EXIST) + # 在 framework 目录下创建对应的 module 的文件目录用于存放 .c 驱动文件 + framework_drv_root_dir = hdf_utils.get_drv_root_dir( + root, vendor, module) + if os.path.exists(framework_drv_root_dir): + raise HdfToolException('module "%s" already exist' % module, + CommandErrorCode.TARGET_ALREADY_EXIST) + os.makedirs(framework_drv_root_dir) + + # 创建 .c 模板驱动 + state, driver_file_path = self._add_driver_handler(*args_tuple) + if not state: + raise HdfToolException( + 'create drivers file fail "%s" ' % + driver_file_path.split("\\")[-1]) + adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(root, kernel) + if not os.path.exists(adapter_hdf): + raise HdfToolException( + ' adapter model path "%s" not exist' % + adapter_hdf, CommandErrorCode.TARGET_NOT_EXIST) + + # 创建 adapter 路径下的 module 文件夹 + adapter_model_path = os.path.join(adapter_hdf, 'model', module) + if not os.path.exists(adapter_model_path): + os.makedirs(adapter_model_path) + + data_model = { + "module_upper_case": converter.upper_case(), + "module_lower_case": converter.lower_case(), + "driver_file_name": ("%s_driver.c" % + driver_name_converter.lower_case()), + "driver_name": driver_name_converter.lower_case() + } + # 创建 adapter 下的 module中的三个文件 + if kernel == 'liteos': + file_path, model_level_config_file_path = \ + self._add_module_handler_liteos( + framework_hdf, adapter_model_path, + data_model, converter, *args_tuple) + elif kernel == "linux": + file_path, model_level_config_file_path = \ + self._add_module_handler_linux( + framework_hdf, adapter_model_path, + data_model, *args_tuple) + else: + file_path = {} + model_level_config_file_path = {} + config_item = { + 'module_name': module, + 'module_path': file_path, + 'driver_name': "%s_driver.c" % driver, + 'driver_file_path': driver_file_path, + 'enabled': True + } + config_file_out = { + 'module_name': module, + 'module_path': file_path, + 'driver_name': driver_file_path.split("\\")[-1], + 'driver_file_path': driver_file_path, + 'module_level_config_path': model_level_config_file_path + } + config_file = hdf_utils.read_file( + os.path.join('resources', 'create_model.config')) + config_file_json = json.loads(config_file) + config_file_json[module] = config_file_out + if platform.system() == "Windows": + config_file_replace = json.dumps(config_file_json, indent=4).\ + replace(root.replace('\\', '\\\\') + '\\\\', "") + hdf_utils.write_file( + os.path.join('resources', 'create_model.config'), + config_file_replace.replace('\\\\', '/')) + if platform.system() == "Linux": + config_file_replace = json.dumps(config_file_json, indent=4).\ + replace(root + '/', "") + hdf_utils.write_file( + os.path.join('resources', 'create_model.config'), + config_file_replace) + return json.dumps(config_item) + + def _add_module_handler_liteos(self, framework_hdf, adapter_model_path, + data_model, converter, *args_tuple): + root, vendor, module, driver, board, kernel = args_tuple + liteos_file_path = {} + liteos_level_config_file_path = {} + liteos_file_name = ['BUILD.gn', 'Kconfig', 'Makefile'] + template_path = "/".join([framework_hdf] + ["tools", + "hdf_dev_eco_tool", "resources", "templates", "lite"]) + for file_name in liteos_file_name: + for i in os.listdir(template_path): + if i.find(file_name.split(".")[0]) > 0: + out_path = os.path.join(adapter_model_path, file_name) + self._render(os.path.join(template_path, i), + out_path, data_model) + liteos_file_path[file_name] = out_path + # 修改 liteos 下的 Kconfig 文件 + vendor_k = HdfVendorKconfigFile(root, vendor, kernel, path="") + vendor_k_path = vendor_k.add_module([module, 'Kconfig']) + liteos_level_config_file_path[module+"_Kconfig"] = vendor_k_path + + # 修改 liteos 下的 hdf_lite.mk 文件 + vendor_mk = HdfVendorMkFile(root, vendor) + vendor_mk_path = vendor_mk.add_module(module) + liteos_level_config_file_path[module + "_hdf_lite"] = vendor_mk_path + + # 修改 liteos 下的 Build.gn 文件 + vendor_gn = HdfVendorBuildFile(root, vendor) + vendor_gn_path = vendor_gn.add_module(module) + liteos_level_config_file_path[module + "Build"] = vendor_gn_path + + # 修改 vendor/hisilicon/hispark_taurus/hdf_config/ + # device_info 下的 device_info.hcs 文件 + device_info = HdfDeviceInfoHcsFile( + root, vendor, module, board, driver, path="") + hcs_file_path = device_info.add_model_hcs_file_config() + liteos_file_path["devices_info.hcs"] = hcs_file_path + + # 修改 dot_configs 的配置文件 + dot_file_list = hdf_utils.get_dot_configs_path(root, vendor, board) + template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" + new_demo_config = Template(template_string).substitute( + {"module_upper_case": converter.upper_case()}) + for dot_file in dot_file_list: + file_lines = hdf_utils.read_file_lines(dot_file) + file_lines[-1] = file_lines[-1].strip() + "\n" + if new_demo_config != file_lines[-1]: + file_lines.append(new_demo_config) + hdf_utils.write_file_lines(dot_file, file_lines) + liteos_level_config_file_path[module + "_dot_configs"] = dot_file_list + return liteos_file_path, liteos_level_config_file_path + + def _add_module_handler_linux(self, framework_hdf, adapter_model_path, + data_model, *args_tuple): + root, vendor, module, driver, board, kernel = args_tuple + linux_file_path = {} + linux_level_config_file_path = {} + linux_file_name = ['Kconfig', 'Makefile'] + template_path = "/".join([framework_hdf] + + ["tools", "hdf_dev_eco_tool", + "resources", "templates", "lite"]) + for file_name in linux_file_name: + for i in hdf_utils.template_filename_filtrate( + template_path, kernel): + if i.find(file_name.split(".")[0]) > 0: + out_path = os.path.join(adapter_model_path, file_name) + self._render(os.path.join(template_path, i), + out_path, data_model) + linux_file_path[file_name] = out_path + # 修改 linux 下的 Kconfig 文件 + vendor_k = HdfVendorKconfigFile(root, vendor, kernel, path="") + vendor_k_path = vendor_k.add_module([module, 'Kconfig']) + linux_level_config_file_path[module + "_Kconfig"] = vendor_k_path + + # 修改 linux 下的 Makefile 文件 + vendor_mk = HdfVendorMakeFile(root, vendor, kernel, path='') + vendor_mk_path = vendor_mk.add_module(data_model) + linux_level_config_file_path[module + "_Makefile"] = vendor_mk_path + + # 修改 vendor/hisilicon/hispark_taurus_linux/ + # hdf_config/device_info 下的 device_info.hcs 文件 + device_info = HdfDeviceInfoHcsFile( + root, vendor, module, board, driver, path="") + hcs_file_path = device_info.add_model_hcs_file_config() + linux_file_path["devices_info.hcs"] = hcs_file_path + + # 修改 dot_configs 的配置文件 + template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + new_demo_config = Template(template_string).substitute(data_model) + defconfig_patch = HdfDefconfigAndPatch( + root, vendor, kernel, board, + data_model, new_demo_config) + + config_path = defconfig_patch.get_config_config() + files = [] + patch_list = defconfig_patch.add_module(config_path, files=files) + config_path = defconfig_patch.get_config_patch() + files1 = [] + defconfig_list = defconfig_patch.add_module(config_path, files=files1) + linux_level_config_file_path[module + "_dot_configs"] = \ + list(set(patch_list + defconfig_list)) + return linux_file_path, linux_level_config_file_path + + def _add_driver_handler(self, *args_tuple): + root, vendor, module, driver, board, kernel = args_tuple + drv_converter = hdf_utils.WordsConverter(self.args.driver_name) + drv_src_dir = hdf_utils.get_drv_src_dir(root, vendor, module) + if os.path.exists(os.path.join(drv_src_dir, '%s_driver.c' % driver)): + raise HdfToolException( + 'driver "%s" already exist' % + driver, CommandErrorCode.TARGET_ALREADY_EXIST) + data_model = { + 'driver_lower_case': drv_converter.lower_case(), + 'driver_upper_camel_case': drv_converter.upper_camel_case(), + 'driver_lower_camel_case': drv_converter.lower_camel_case(), + 'driver_upper_case': drv_converter.upper_case() + } + self._file_gen_lite('hdf_driver.c.template', drv_src_dir, + '%s_driver.c' % driver, data_model) + driver_file_path = os.path.join( + drv_src_dir, '%s_driver.c' % driver) + return True, driver_file_path + + def _add_config_handler(self): + self.check_arg_raise_if_not_exist("module_name") + self.check_arg_raise_if_not_exist("driver_name") + self.check_arg_raise_if_not_exist("board_name") + root, _, module, driver, board = self.get_args() + drv_config = HdfDriverConfigFile(root, board, module, driver) + drv_config.create_driver() + return drv_config.get_drv_config_path() + + diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_command_error_code.py b/tools/hdf_dev_eco_tool/command_line/hdf_command_error_code.py new file mode 100755 index 000000000..2d16c9cff --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_command_error_code.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + + +class CommandErrorCode(object): + MESSAGE_FORMAT_WRONG = 1001 + INTERFACE_ERROR = 1002 + TARGET_NOT_EXIST = 1003 + TARGET_ALREADY_EXIST = 1004 + FILE_FORMAT_WRONG = 1005 + UNKNOWN_ERROR = 1111 diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_command_handler_base.py b/tools/hdf_dev_eco_tool/command_line/hdf_command_handler_base.py new file mode 100755 index 000000000..93eee0c1c --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_command_handler_base.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os + +from .hdf_command_error_code import CommandErrorCode +from .hdf_tool_argument_parser import HdfToolArgumentParser +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfCommandHandlerBase(object): + def __init__(self): + self.cmd = 'base' + self.action_type = 'base_action_type' + self.handlers = {} + self.args = {} + self.parser = HdfToolArgumentParser() + + def run(self): + self.action_type = self._get_action_type() + if self.action_type in self.handlers: + return self.handlers[self.action_type]() + else: + raise HdfToolException( + 'unknown action_type: "%s" for "%s" cmd' % + (self.action_type, self.cmd), + CommandErrorCode.INTERFACE_ERROR) + + def _get_action_type(self): + try: + return getattr(self.args, 'action_type') + except AttributeError: + return '' + + def check_arg_raise_if_not_exist(self, arg): + try: + value = getattr(self.args, arg) + if not value: + raise AttributeError() + except AttributeError: + raise HdfToolException( + 'argument "--%s" is required for "%s" cmd' % + (arg, self.cmd), CommandErrorCode.INTERFACE_ERROR) + + def _get_arg(self, arg): + try: + value = getattr(self.args, arg) + return value + except AttributeError: + return '' + + def get_args(self): + args = ['vendor_name', 'module_name', + 'driver_name', 'board_name', 'kernel_name'] + ret = [self._get_arg('root_dir')] + for arg in args: + value = self._get_arg(arg) + if value: + value = hdf_utils.WordsConverter(value).lower_case() + ret.append(value) + return tuple(ret) + + @staticmethod + def check_path_raise_if_not_exist(full_path): + if not os.path.exists(full_path): + raise HdfToolException( + '%s not exist' % + full_path, CommandErrorCode.TARGET_NOT_EXIST) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_command_line_server.py b/tools/hdf_dev_eco_tool/command_line/hdf_command_line_server.py new file mode 100755 index 000000000..060c0c9fa --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_command_line_server.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import sys +import argparse + +from .hdf_tool_commands import HdfToolCommands +from .hdf_tool_argument_parser import HdfToolArgumentParser +from command_line.hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException + + +class Message(object): + TYPE_REQ = 'request' + TYPE_QUIT = 'quit' + TYPE_ERROR = 'error' + TYPE_SUCCESS = 'success' + + def __init__(self, msg_type, content): + self.msg_type = msg_type + self.content = content + + def is_quit(self): + return self.msg_type.lower() == Message.TYPE_ERROR + + +def pack_message(msg_type, content, err_code=None): + body = bytearray(content, 'utf-8') + if not err_code: + header = bytearray('{},{}\n'.format(msg_type, len(body)), 'utf-8') + else: + header = bytearray('{},{},{}\n'.format(msg_type, len(body), err_code), + 'utf-8') + bytes_packet = bytearray().join([header, body]) + return bytes_packet + + +def decode_header(header): + header_parts = header.split(',') + if len(header_parts) < 2: + return -1, '', 0 + msg_type = header_parts[0] + body_len = int(header_parts[1]) + return 0, msg_type, body_len + + +def decode_body(body): + arg_parser = HdfToolArgumentParser() + arg_parser.add_argument('cmd') + arg_parser.add_argument('remainder_args', nargs=argparse.REMAINDER) + args = arg_parser.parse_args(body.strip().split(' ')) + remainder = [arg for arg in args.remainder_args if len(arg) != 0] + return args.cmd, remainder + + +class HdfCommandLineServer(object): + def __init__(self, input_obj, output_obj): + self.input_obj = input_obj + self.output_obj = output_obj + self.commands = HdfToolCommands() + + def _send_back(self, msg_type, content, error_code=None): + message_bytes = pack_message(msg_type, content, error_code) + self.output_obj.write(message_bytes) + self.output_obj.flush() + + def _send_back_success(self, content): + self._send_back(Message.TYPE_SUCCESS, content) + + def _send_back_error(self, error_code, content): + self._send_back(Message.TYPE_ERROR, content, error_code) + + def _read_header(self): + head_bytes = self.input_obj.readline() + msg_header = str(head_bytes, encoding="utf-8") + return decode_header(msg_header) + + def _read_body(self, body_len): + body_bytes = self.input_obj.read(body_len) + body = str(body_bytes, encoding='utf-8') + return decode_body(body) + + def run(self): + while True: + try: + ret, msg_type, body_len = self._read_header() + if ret != 0: + err_code = CommandErrorCode.MESSAGE_FORMAT_WRONG + self._send_back_error(err_code, 'header wrong') + continue + if msg_type == Message.TYPE_QUIT: + self._send_back_success('Bye bye!') + break + if body_len < 0: + err_code = CommandErrorCode.MESSAGE_FORMAT_WRONG + self._send_back_error(err_code, 'body len wrong') + continue + cmd, args = self._read_body(body_len) + ret = self.commands.run(cmd, args) + if ret: + self._send_back_success(str(ret)) + else: + self._send_back_success('') + except HdfToolException as exc: + try: + self._send_back_error(exc.error_code, exc.exc_msg) + except OSError: + sys.exit(-1) + except Exception as exc: + try: + self._send_back_error(CommandErrorCode.UNKNOWN_ERROR, + str(exc)) + except OSError: + sys.exit(-1) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py new file mode 100755 index 000000000..4348c8a9c --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re +from string import Template + +from hdf_tool_settings import HdfToolSettings +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfDefconfigAndPatch(object): + def __init__(self, root, vendor, kernel, + board, data_model, new_demo_config): + self.root = root + self.vendor = vendor + self.kernel = kernel + self.board = board + self.data_model = data_model + self.new_demo_config = new_demo_config + self.file_path = hdf_utils.get_template_file_path(root, vendor) + self.drivers_path_list = HdfToolSettings().\ + get_board_parent_file(self.board) + + def get_config_config(self): + return os.path.join(self.root, "kernel", self.kernel, "config") + + def get_config_patch(self): + return os.path.join(self.root, "kernel", self.kernel, "patches") + + def add_module(self, path, files): + for filename in os.listdir(path): + new_path = os.path.join(path, filename) + if not os.path.isdir(new_path): + self.find_file(new_path, files) + else: + self.add_module(new_path, files=[]) + return files + + def delete_module(self, path): + lines = hdf_utils.read_file_lines(path) + if self.new_demo_config in lines or \ + ("+" + self.new_demo_config) in lines: + if path.split(".")[-1] != "patch": + lines.remove(self.new_demo_config) + else: + lines.remove("+" + self.new_demo_config) + hdf_utils.write_file_lines(path, lines) + + def rename_vendor(self): + pattern = r'vendor/([a-zA-Z0-9_\-]+)/' + replacement = 'vendor/%s/' % self.vendor + new_content = re.sub(pattern, replacement, self.contents) + hdf_utils.write_file(self.file_path, new_content) + + def find_file(self, path, files): + if path.split("\\")[-1] in self.drivers_path_list or \ + path.split("/")[-1] in self.drivers_path_list: + files.append(path) + codetype = "utf-8" + with open(path, "r+", encoding=codetype) as fread: + data = fread.readlines() + insert_index = None + state = False + for index, line in enumerate(data): + if line.find("CONFIG_DRIVERS_HDF_INPUT=y") >= 0: + insert_index = index + elif line.find(self.new_demo_config) >= 0: + state = True + if not state: + if path.split(".")[-1] != "patch": + data.insert(insert_index + 1, + self.new_demo_config) + else: + data.insert(insert_index + 1, + "+" + self.new_demo_config) + with open(path, "w", encoding=codetype) as fwrite: + fwrite.writelines(data) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_delete_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_delete_handler.py new file mode 100755 index 000000000..b2e590c0c --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_delete_handler.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + + +import json +import os +import shutil +from string import Template + +from hdf_tool_exception import HdfToolException +from .hdf_command_error_code import CommandErrorCode +from .hdf_command_handler_base import HdfCommandHandlerBase +from .hdf_defconfig_patch import HdfDefconfigAndPatch +from .hdf_device_info_hcs import HdfDeviceInfoHcsFile +from .hdf_vendor_build_file import HdfVendorBuildFile +from .hdf_vendor_kconfig_file import HdfVendorKconfigFile +from .hdf_vendor_makefile import HdfVendorMakeFile +from .hdf_vendor_mk_file import HdfVendorMkFile +from .hdf_module_kconfig_file import HdfModuleKconfigFile +from .hdf_module_mk_file import HdfModuleMkFile +from .hdf_driver_config_file import HdfDriverConfigFile +import hdf_utils + + +class HdfDeleteHandler(HdfCommandHandlerBase): + def __init__(self, args): + super(HdfDeleteHandler, self).__init__() + self.cmd = 'delete' + self.handlers = { + 'vendor': self._delete_vendor_handler, + 'module': self._delete_module_handler, + 'driver': self._delete_driver_handler, + } + self.parser.add_argument("--action_type", + help=' '.join(self.handlers.keys()), + required=True) + self.parser.add_argument("--root_dir", required=True) + self.parser.add_argument("--vendor_name") + self.parser.add_argument("--module_name") + self.parser.add_argument("--driver_name") + self.parser.add_argument("--board_name") + self.parser.add_argument("--kernel_name") + self.args = self.parser.parse_args(args) + + def _delete_vendor_handler(self): + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("board_name") + root, vendor, _, _, _ = self.get_args() + vendor_hdf_dir = hdf_utils.get_vendor_hdf_dir(root, vendor) + print(vendor_hdf_dir) + if not os.path.exists(vendor_hdf_dir): + return + for module in os.listdir(vendor_hdf_dir): + mod_dir = os.path.join(vendor_hdf_dir, module) + if os.path.isdir(mod_dir): + self._delete_module(root, module) + shutil.rmtree(vendor_hdf_dir) + + def _delete_module(self, root, model, model_info): + for key, path_value in model_info.items(): + if key.split("_")[-1] == "name": + pass + elif key == "driver_file_path": + driver_file = os.path.join( + root, path_value.split(model)[0], model) + if os.path.exists(driver_file): + shutil.rmtree(driver_file) + else: + self._delete_file_func(root, key, model_info, model) + create_model_data = self._delete_model_info() + delete_model_info = hdf_utils.get_create_model_info( + root=root, create_data=json.dumps(create_model_data)) + return delete_model_info + + def _delete_model_info(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("module_name") + root, _, module, _, _, _ = self.get_args() + adapter_framework = hdf_utils.get_vendor_hdf_dir_framework(root=root) + if not os.path.exists(adapter_framework): + raise HdfToolException( + ' adapter model path "%s" not exist' % + adapter_framework, CommandErrorCode.TARGET_NOT_EXIST) + create_file_save_path = os.path.join( + adapter_framework, "tools", "hdf_dev_eco_tool", + "resources", "create_model.config") + if not os.path.exists(create_file_save_path): + raise HdfToolException( + 'create file config "%s" not exist' % + create_file_save_path, CommandErrorCode.TARGET_NOT_EXIST) + data = hdf_utils.read_file(create_file_save_path) + write_data = json.loads(data) + write_data.pop(module) + hdf_utils.write_file(create_file_save_path, + json.dumps(write_data, indent=4)) + return write_data + + def _delete_module_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("module_name") + root, _, module, _, _, _ = self.get_args() + adapter_framework = hdf_utils.get_vendor_hdf_dir_framework(root=root) + if not os.path.exists(adapter_framework): + raise HdfToolException( + ' adapter model path "%s" not exist' % + adapter_framework, CommandErrorCode.TARGET_NOT_EXIST) + create_file_save_path = os.path.join( + adapter_framework, "tools", "hdf_dev_eco_tool", + "resources", "create_model.config") + if not os.path.exists(create_file_save_path): + raise HdfToolException( + 'create file config "%s" not exist' % + create_file_save_path, CommandErrorCode.TARGET_NOT_EXIST) + data = hdf_utils.read_file(create_file_save_path) + file_info = json.loads(data) + model_info = file_info.get(module, None) + if model_info is None: + raise HdfToolException( + ' delete model "%s" not exist' % + module, CommandErrorCode.TARGET_NOT_EXIST) + else: + return self._delete_module(root, module, model_info) + + def _delete_driver(self, module, driver): + root, vendor, _, _, board = self.get_args() + drv_dir = hdf_utils.get_drv_dir(root, vendor, module, driver) + if os.path.exists(drv_dir): + shutil.rmtree(drv_dir) + k_path = hdf_utils.get_module_kconfig_path(root, vendor, module) + HdfModuleKconfigFile(root, module, k_path).delete_driver(driver) + HdfModuleMkFile(root, vendor, module).delete_driver(driver) + HdfDriverConfigFile(root, board, module, driver).delete_driver() + + def _delete_driver_handler(self): + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("module_name") + self.check_arg_raise_if_not_exist("driver_name") + self.check_arg_raise_if_not_exist("board_name") + _, _, module, driver, _ = self.get_args() + self._delete_driver(module, driver) + + def _delete_file_func(self, root, key, model_info, model): + if key == "module_level_config_path": + for key1, value1 in model_info[key].items(): + if key1 == "%s_Makefile" % model: + HdfVendorMakeFile( + root, vendor="", kernel="", + path=os.path.join(root, value1)).delete_module(model) + elif key1 == "%s_Kconfig" % model: + HdfVendorKconfigFile( + root, vendor="", kernel="", + path=os.path.join(root, value1)).delete_module(model) + elif key1 == "%sBuild" % model: + HdfVendorBuildFile( + root, vendor="").delete_module( + file_path=os.path.join(root, value1), model=model) + elif key1 == "%s_hdf_lite" % model: + HdfVendorMkFile( + root, vendor="").delete_module( + file_path=os.path.join(root, value1), module=model) + elif key1 == "%s_dot_configs" % model: + for dot_path in value1: + if dot_path.split(".")[-1] == "config": + template_string = \ + "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" + else: + template_string = \ + "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + new_demo_config = Template(template_string).\ + substitute({"module_upper_case": model.upper()}) + defconfig_patch = HdfDefconfigAndPatch( + root=root, vendor="", kernel="", board="", + data_model="", new_demo_config=new_demo_config) + defconfig_patch.delete_module( + path=os.path.join(root, dot_path)) + elif key == "module_path": + for _, value2 in model_info[key].items(): + if value2.endswith("hcs"): + hcs_path = os.path.join(root, value2) + HdfDeviceInfoHcsFile( + root=root, vendor="", module="", + board="", driver="", path=hcs_path). \ + delete_driver(module=model) + else: + if value2: + file_path = os.path.join(root, value2) + if os.path.exists(file_path): + os.remove(file_path) + model_dir_path = "/".join(file_path.split("/")[:-1]) + if os.path.exists(model_dir_path): + file_list = os.listdir(model_dir_path) + if not file_list: + shutil.rmtree(model_dir_path) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_device_info_hcs.py b/tools/hdf_dev_eco_tool/command_line/hdf_device_info_hcs.py new file mode 100755 index 000000000..61ecca692 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_device_info_hcs.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re +from string import Template + + +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfDeviceInfoHcsFile(object): + def __init__(self, root, vendor, module, board, driver, path): + if not path: + self.module = module + self.vendor = vendor + self.board = board + self.root = root + self.driver = driver + self.lines = None + self.hcspath = hdf_utils.get_hcs_file_path( + self.root, self.vendor, self.board) + else: + self.hcspath = path + self.root = root + self.file_path = hdf_utils.get_template_file_path(root) + if not os.path.exists(self.file_path): + raise HdfToolException( + 'template file: %s not exist' % + self.file_path, CommandErrorCode.TARGET_NOT_EXIST) + if not os.path.exists(self.hcspath): + raise HdfToolException( + 'hcs file: %s not exist' % + self.hcspath, CommandErrorCode.TARGET_NOT_EXIST) + + def _save(self): + if self.lines: + hdf_utils.write_file(self.hcspath, ''.join(self.lines)) + + def _find_line(self, pattern): + for index, line in enumerate(self.lines): + if re.search(pattern, line): + return index, line + return 0, '' + + def _find_last_include(self): + if not self.lines: + return 0 + i = len(self.lines) - 1 + while i >= 0: + line = self.lines[i] + if re.search(self.include_pattern, line): + return i + 1 + i -= 1 + return 0 + + def _create_makefile(self): + mk_path = os.path.join(self.file_dir, 'Makefile') + template_str = hdf_utils.get_template('hdf_hcs_makefile.template') + hdf_utils.write_file(mk_path, template_str) + + def check_and_create(self): + if self.lines: + return + if not os.path.exists(self.file_dir): + os.makedirs(self.file_dir) + self._create_makefile() + self.lines.append('#include "hdf_manager/manager_config.hcs"\n') + self._save() + + def add_driver(self, module, driver): + target_line = self.line_template % (module, driver) + target_pattern = self.line_pattern % (module, driver) + idx, line = self._find_line(target_pattern) + if line: + self.lines[idx] = target_line + else: + pos = self._find_last_include() + self.lines.insert(pos, target_line) + self._save() + + def delete_driver(self, module): + hcs_config = hdf_utils.read_file_lines(self.hcspath) + index_info = {} + count = 0 + for index, line in enumerate(hcs_config): + if line.find("%s :: host" % module) > 0: + index_info["start_index"] = index + for child_index in range( + index_info["start_index"], len(hcs_config)): + if hcs_config[child_index].strip().endswith("{"): + count += 1 + elif hcs_config[child_index].strip() == "}": + count -= 1 + if count == 0: + index_info["end_index"] = child_index + break + break + if index_info: + self.lines = hcs_config[0:index_info["start_index"]] \ + + hcs_config[index_info["end_index"] + 1:] + self._save() + return True + + def add_model_hcs_file_config(self): + template_path = os.path.join(self.file_path, + 'device_info_hcs.template') + lines = list(map(lambda x: "\t\t" + x, + hdf_utils.read_file_lines(template_path))) + old_lines = list(filter(lambda x: x != "\n", + hdf_utils.read_file_lines(self.hcspath))) + new_data = old_lines[:-2] + lines + old_lines[-2:] + data = { + "driver_name": self.driver, + "model_name": self.module, + } + for index, _ in enumerate(new_data): + new_data[index] = Template(new_data[index]).substitute(data) + codetype = "utf-8" + with open(self.hcspath, "w+", encoding=codetype) as lwrite: + for j in new_data: + lwrite.write(j) + return self.hcspath diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_dot_config_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_dot_config_file.py new file mode 100755 index 000000000..a40f64210 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_dot_config_file.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +import hdf_utils + + +class ConfigItem(object): + def __init__(self, index, line): + self.index = index + self.line = line + + +class HdfDotConfigFile(object): + def __init__(self, dot_config_path): + self.file_path = dot_config_path + if os.path.exists(dot_config_path): + self.lines = hdf_utils.read_file_lines(dot_config_path) + self.dot_config_exist = True + else: + self.lines = [] + self.dot_config_exist = False + self.cache = {} + self.hdf_item = 'LOSCFG_DRIVERS_HDF' + self.prefix = 'LOSCFG_' + + def save(self): + if not self.dot_config_exist: + return + with open(self.file_path, 'r+', newline='\n') as file: + file.truncate() + file.write(''.join(self.lines)) + + def _update_cache(self, item, index, line): + self.cache[item] = ConfigItem(index, line) + + def _find(self, item): + if item in self.cache: + index = self.cache[item].index + line = self.cache[item].line + return index, line + for index, line in enumerate(self.lines): + item_pattern = r'%s\s*(=|is)' % item + if re.search(item_pattern, line): + line_ = line.strip() + self._update_cache(item, index, line_) + return index, line_ + return 0, '' + + @staticmethod + def _is_line_enabled(line): + if line.strip().startswith('#'): + return False + return True + + def _enable(self, item): + if not item: + return + new_line = '%s=y\n' % item + index, line = self._find(item) + if line: + if self._is_line_enabled(line): + return + self.lines[index] = new_line + self._update_cache(item, index, new_line) + return + else: + count = len(self.lines) + self.lines.append(new_line) + self._update_cache(item, count, new_line) + + def _disable(self, item): + if not item: + return + new_line = '# %s is not set\n' % item + index, line = self._find(item) + if not line: + return + if not self._is_line_enabled(line): + return + self.lines[index] = new_line + self._update_cache(item, index, new_line) + + def _is_enabled(self, item): + if not item: + return False + index, line = self._find(item) + if not line: + return False + return self._is_line_enabled(line) + + def _add_prefix(self, item): + if not item.startswith(self.prefix): + item = '%s%s' % (self.prefix, item) + return item + + def is_enabled(self, item, depends_on_item): + if item: + item = self._add_prefix(item) + if depends_on_item: + depends_on_item = self._add_prefix(depends_on_item) + if depends_on_item: + if not self._is_enabled(depends_on_item): + return False + return self._is_enabled(item) + + def enable(self, item, depends_on_item): + if item: + item = self._add_prefix(item) + if depends_on_item: + depends_on_item = self._add_prefix(depends_on_item) + self._enable(self.hdf_item) + self._enable(depends_on_item) + self._enable(item) + + def disable(self, item): + if item: + item = self._add_prefix(item) + self._disable(item) + + def add_dot_config(self): + hdf_utils.get_dot_configs_path() diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_driver_config_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_driver_config_file.py new file mode 100755 index 000000000..a4d045e45 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_driver_config_file.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +from string import Template + +from .hdf_manager_config_file import HdfManagerConfigFile +from .hdf_hcs_file import HdfHcsFile +from hdf_tool_settings import HdfToolSettings +from hdf_tool_exception import HdfToolException +from command_line.hdf_command_error_code import CommandErrorCode +import hdf_utils + + +class HdfDriverConfigFile(object): + def __init__(self, root, board, module, driver, kernel, only_path=False): + self.root = root + self.board = board + self.module = module + self.driver = driver + self.kernel = kernel + bpp = HdfToolSettings().get_board_parent_path(self.board) + board_path = os.path.join(self.root, bpp, self.board) + + if not os.path.exists(board_path): + raise HdfToolException('board: %s not exist' % board_path, + CommandErrorCode.TARGET_NOT_EXIST) + self.config_dir = os.path.join(board_path, 'hdf_config') + self.drv_dir = os.path.join(self.config_dir, self.module) + self.drv_config_path = os.path.join( + self.drv_dir, '%s_config.hcs' % self.driver) + if only_path: + return + manager_hcs_path = os.path.join(self.config_dir, 'device_info', + 'device_info.hcs') + self.manager_hcs = HdfManagerConfigFile(manager_hcs_path) + hdf_hcs_path = os.path.join(self.config_dir, 'hdf.hcs') + self.hdf_hcs = HdfHcsFile(hdf_hcs_path) + + def _check_and_create_common_config(self): + self.manager_hcs.check_and_create() + self.hdf_hcs.check_and_create() + if not os.path.exists(self.drv_dir): + os.makedirs(self.drv_dir) + + def create_driver(self): + self._check_and_create_common_config() + template_str = hdf_utils.get_template('hdf_driver_config.template') + config_content = Template(template_str).safe_substitute({}) + hdf_utils.write_file(self.drv_config_path, config_content) + self.manager_hcs.add_device(self.module, self.driver) + self.hdf_hcs.add_driver(self.module, self.driver) + + def delete_driver(self): + if not os.path.exists(self.drv_config_path): + return + os.remove(self.drv_config_path) + self.manager_hcs.delete_device(self.module, self.driver) + self.hdf_hcs.delete_driver(self.module, self.driver) + + def get_drv_config_path(self): + if os.path.exists(self.drv_config_path): + return os.path.realpath(self.drv_config_path) + else: + return '' diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py new file mode 100755 index 000000000..e12ca7798 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import json + +from .hdf_command_handler_base import HdfCommandHandlerBase +from .hdf_lite_mk_file import HdfLiteMkFile +from .hdf_vendor_kconfig_file import HdfVendorKconfigFile +from .hdf_module_kconfig_file import HdfModuleKconfigFile +from .hdf_driver_config_file import HdfDriverConfigFile +from command_line.hdf_command_error_code import CommandErrorCode +from hdf_tool_settings import HdfToolSettings +from hdf_tool_exception import HdfToolException +import hdf_tool_version +import hdf_utils + + +class HdfGetHandler(HdfCommandHandlerBase): + HDF_VERSION_MAJOR = 0 + HDF_VERSION_MINOR = 1 + + def __init__(self, args): + super(HdfGetHandler, self).__init__() + self.cmd = 'get' + self.handlers = { + 'vendor_list': self._get_vendor_list_handler, + 'current_vendor': self._get_current_vendor_handler, + 'vendor_parent_path': self._get_vendor_parent_path_handler, + 'individual_vendor_path': self._get_individual_vendor_path_handler, + 'board_list': self._get_board_list_handler, + 'driver_list': self._get_driver_list_handler, + 'driver_file': self._get_driver_file_handler, + 'drv_config_file': self._get_drv_config_file_handler, + 'hdf_tool_core_version': self._get_version_handler, + 'model_list': self._get_model_dict, + 'version': self.__get_version, + } + self.parser.add_argument("--action_type", + help=' '.join(self.handlers.keys()), + required=True) + self.parser.add_argument("--root_dir") + self.parser.add_argument("--vendor_name") + self.parser.add_argument("--module_name") + self.parser.add_argument("--driver_name") + self.parser.add_argument("--board_name") + self.args = self.parser.parse_args(args) + + def _get_vendor_list_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + root = self.args.root_dir + vendor_root_dir = hdf_utils.get_vendor_root_dir(root) + vendors = [] + if os.path.exists(vendor_root_dir): + for vendor in os.listdir(vendor_root_dir): + hdf = hdf_utils.get_vendor_hdf_dir(root, vendor) + if os.path.exists(hdf): + vendors.append(vendor) + return ','.join(vendors) + + def _get_current_vendor_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + return HdfLiteMkFile(self.args.root_dir).get_current_vendor() + + @staticmethod + def _get_board_list_handler(): + settings = HdfToolSettings() + return settings.get_supported_boards() + + def _get_vendor_parent_path_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + target = hdf_utils.get_vendor_root_dir(self.args.root_dir) + return os.path.realpath(target) + + def _get_individual_vendor_path_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + root, vendor, _, _, _ = self.get_args() + target = hdf_utils.get_vendor_dir(root, vendor) + return os.path.realpath(target) + + @staticmethod + def _get_version_handler(): + return hdf_tool_version.get_version() + + def _get_driver_list_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + root, vendor, _, _, _ = self.get_args() + hdf_dir = hdf_utils.get_vendor_hdf_dir(root, vendor) + if not os.path.exists(hdf_dir): + raise HdfToolException('vendor "%s" not exist' % vendor, + CommandErrorCode.TARGET_NOT_EXIST) + modules = os.listdir(hdf_dir) + vendor_k = HdfVendorKconfigFile(root, vendor) + module_items = vendor_k.get_module_and_config_path() + drivers = {} + for item in module_items: + module, k_path = item + if module in modules: + models = \ + HdfModuleKconfigFile(root, module, + k_path).get_models() + drivers[module] = models + return json.dumps(drivers) + + def _get_driver_file_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("module_name") + self.check_arg_raise_if_not_exist("driver_name") + root = os.path.realpath(self.args.root_dir) + _, vendor, module, driver, _ = self.get_args() + drv_dir = hdf_utils.get_drv_dir(root, vendor, module, driver) + if not os.path.exists(drv_dir): + raise HdfToolException( + 'driver directory: %s not exist' % + drv_dir, CommandErrorCode.TARGET_NOT_EXIST) + for root_path, dirs, files in os.walk(drv_dir): + for file in files: + if file.endswith('.c'): + return os.path.realpath(os.path.join(root_path, file)) + return '' + + def _get_drv_config_file_handler(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("module_name") + self.check_arg_raise_if_not_exist("driver_name") + self.check_arg_raise_if_not_exist("board_name") + root, _, module, driver, board = self.get_args() + drv_config = HdfDriverConfigFile(root, board, module, driver, True) + return drv_config.get_drv_config_path() + + def _get_model_dict(self): + self.check_arg_raise_if_not_exist("root_dir") + root, _, _, _, _, _ = self.get_args() + adapter_framework = hdf_utils.get_vendor_hdf_dir_framework(root=root) + if not os.path.exists(adapter_framework): + raise HdfToolException( + ' adapter model path "%s" not exist' % + adapter_framework, CommandErrorCode.TARGET_NOT_EXIST) + create_file_save_path = os.path.join( + adapter_framework, "tools", "hdf_dev_eco_tool", + "resources", "create_model.config") + if not os.path.exists(create_file_save_path): + raise HdfToolException( + 'create file config "%s" not exist' % + create_file_save_path, CommandErrorCode.TARGET_NOT_EXIST) + out_model_list = [] + data = hdf_utils.read_file(create_file_save_path) + json_type = json.loads(data) + if not json_type: + return out_model_list + file_key_list = list(list(json_type. + items())[0][-1].keys())[:-1] + for k, _ in json_type.items(): + model_file_path = {} + for key in file_key_list: + if key.split("_")[-1] == "path": + path_dict = json_type[k][key] + model_file_path = self._model_info( + path_dict, root, model_file_path, key) + out_model_list.append({k: model_file_path}) + return out_model_list + + def __get_version(self): + version_end = "\nCopyright (c) 2020-2021 Huawei Device Co., Ltd." + version_head = "hdf_dev_eco_tool version : " + return version_head + str(self.HDF_VERSION_MAJOR) \ + + "." + str(self.HDF_VERSION_MINOR) + version_end + + def _model_info(self, path_dict, root, model_file_path, key): + if isinstance(path_dict, dict): + for k_filename, file_path in path_dict.items(): + if not os.path.exists(os.path.join(root, file_path)): + model_file_path[k_filename] = " " + else: + model_file_path[k_filename] = path_dict[k_filename] + else: + hcs_file_path = os.path.join(root, path_dict) + if not os.path.exists(hcs_file_path): + model_file_path[key] = " " + else: + model_file_path[key] = path_dict + return model_file_path diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_hcs_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_hcs_file.py new file mode 100755 index 000000000..9cb614cfe --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_hcs_file.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +import hdf_utils + + +class HdfHcsFile(object): + def __init__(self, file_path): + self.file_path = file_path + self.file_dir = os.path.dirname(self.file_path) + if os.path.exists(self.file_path): + self.lines = hdf_utils.read_file_lines(self.file_path) + else: + self.lines = [] + self.line_template = '#include "%s/%s_config.hcs"\n' + self.line_pattern = r'^\s*#include\s+"%s/%s_config.hcs"' + self.include_pattern = r'^\s*#include' + + def _save(self): + if self.lines: + hdf_utils.write_file(self.file_path, ''.join(self.lines)) + + def _find_line(self, pattern): + for index, line in enumerate(self.lines): + if re.search(pattern, line): + return index, line + return 0, '' + + def _find_last_include(self): + if not self.lines: + return 0 + i = len(self.lines) - 1 + while i >= 0: + line = self.lines[i] + if re.search(self.include_pattern, line): + return i + 1 + i -= 1 + return 0 + + def _create_makefile(self): + mk_path = os.path.join(self.file_dir, 'Makefile') + template_str = hdf_utils.get_template('hdf_hcs_makefile.template') + hdf_utils.write_file(mk_path, template_str) + + def check_and_create(self): + if self.lines: + return + if not os.path.exists(self.file_dir): + os.makedirs(self.file_dir) + self._create_makefile() + self.lines.append('#include "hdf_manager/manager_config.hcs"\n') + self._save() + + def add_driver(self, module, driver): + target_line = self.line_template % (module, driver) + target_pattern = self.line_pattern % (module, driver) + idx, line = self._find_line(target_pattern) + if line: + self.lines[idx] = target_line + else: + pos = self._find_last_include() + self.lines.insert(pos, target_line) + self._save() + + def delete_driver(self, module, driver): + target_pattern = self.line_pattern % (module, driver) + idx, line = self._find_line(target_pattern) + if not line: + return + self.lines[idx] = '' + self._save() diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_lite_kconfig_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_lite_kconfig_file.py new file mode 100755 index 000000000..077d7f200 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_lite_kconfig_file.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +from hdf_tool_settings import HdfToolSettings +import hdf_utils + + +class HdfLiteKconfigFile(object): + def __init__(self, root): + self.file_path = hdf_utils.get_hdf_lite_kconfig_path(root) + self.orig_exist = False + if os.path.exists(self.file_path): + self.lines = hdf_utils.read_file_lines(self.file_path) + self.orig_exist = True + else: + self.lines = [] + self.vendor_pattern = r'source\s+".*/vendor/.*/Kconfig"' + self.target_pattern_format = r'source\s+".*/vendor/%s/.*/Kconfig"' + self.target_index = -1 + + def _save(self): + if self.orig_exist: + hdf_utils.write_file(self.file_path, ''.join(self.lines)) + + def _find_all_vendors(self, target_vendor): + vendors = [] + for index, line in enumerate(self.lines): + if self.target_index == -1: + if re.search(self.target_pattern_format % target_vendor, line): + self.target_index = index + continue + if re.search(self.vendor_pattern, line): + vendors.append(index) + return vendors + + def _comment_other_vendors(self, other_vendors): + for index in other_vendors: + if not hdf_utils.is_commented_line(self.lines[index], '#'): + self.lines[index] = '# %s' % self.lines[index] + + def set_vendor(self, current_vendor): + other_vendors = self._find_all_vendors(current_vendor) + self._comment_other_vendors(other_vendors) + drivers_path = HdfToolSettings().get_drivers_path() + new_line = 'source "../../vendor/%s/%s/Kconfig"\n' % \ + (current_vendor, drivers_path) + if self.target_index != -1: + self.lines[self.target_index] = new_line + else: + pos = len(self.lines) - 1 + while pos > 0 and len(self.lines[pos].strip()) == 0: + pos -= 1 + pos += 1 + self.lines.insert(pos, new_line) + self._save() diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_lite_mk_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_lite_mk_file.py new file mode 100755 index 000000000..e7dc12e82 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_lite_mk_file.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +from hdf_tool_settings import HdfToolSettings +import hdf_utils + + +class HdfLiteMkFile(object): + def __init__(self, root): + self.file_path = hdf_utils.get_hdf_lite_mk_path(root) + self.orig_exist = False + if os.path.exists(self.file_path): + self.lines = hdf_utils.read_file_lines(self.file_path) + self.orig_exist = True + else: + self.lines = [] + self.end_line_pattern = r'LITEOS_BASELIB\s*[+]=\s*--no-whole-archive' + self.vendor_pattern = r'include.*hdf_vendor[.]mk' + self.target_format = r'include .*vendor/%s/.*/hdf_vendor[.]mk' + self.end_line_index = -1 + self.target_line_index = -1 + self.current_vendor_pattern = r'^\s*include.*/device/(.*)/lite.mk' + + def _save(self): + if self.orig_exist: + hdf_utils.write_file(self.file_path, ''.join(self.lines)) + + def _find_all_vendors(self, current_vendor): + vendor_lines = [] + for index, line in enumerate(self.lines): + if self.target_line_index == -1: + if re.search(self.target_format % current_vendor, line): + self.target_line_index = index + continue + if self.end_line_index == -1: + if re.search(self.end_line_pattern, line): + self.end_line_index = index + continue + if re.search(self.vendor_pattern, line): + vendor_lines.append(index) + return vendor_lines + + def _comment_other_vendors(self, other_vendors): + for index in other_vendors: + if not hdf_utils.is_commented_line(self.lines[index], '#'): + self.lines[index] = '# %s' % self.lines[index] + + def set_vendor(self, current_vendor): + other_vendors = self._find_all_vendors(current_vendor) + self._comment_other_vendors(other_vendors) + drivers_path = HdfToolSettings().get_drivers_path() + new_line = \ + 'include $(LITEOSTOPDIR)/../../vendor/%s/%s/hdf_vendor.mk\n' % \ + (current_vendor, drivers_path) + if self.target_line_index != -1: + self.lines[self.target_line_index] = new_line + elif self.end_line_index != -1: + self.lines.insert(self.end_line_index, new_line) + else: + self.lines.append(new_line) + self._save() + + def get_current_vendor(self): + for line in self.lines: + match_obj = re.search(self.current_vendor_pattern, line) + if match_obj: + vendor_drivers_path = match_obj.group(1) + parts = vendor_drivers_path.split('/') + valid_parts = [part for part in parts if part] + if valid_parts: + return valid_parts[0] + return '' diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_lite_settings_mk_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_lite_settings_mk_file.py new file mode 100755 index 000000000..e163130ea --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_lite_settings_mk_file.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfLiteSettingsMkFile(object): + def __init__(self, root_dir): + self.root_dir = root_dir + self.file_path = hdf_utils.get_hdf_lite_settings_mk_path(root_dir) + if os.path.exists(self.file_path): + self.lines = hdf_utils.read_file_lines(self.file_path) + else: + dir_path = os.path.dirname(self.file_path) + if not os.path.exists(dir_path): + os.makedirs(dir_path) + self.lines = [] + self.line_pattern = r'(%s\s*:=\s*)(.*)' + self.hdf_vendor_var_name = 'HDF_COMPILE_VENDOR' + self.board_vendor_path_var_name = 'HDF_SET_BOARD_VENDOR_PATH' + + def _save(self): + if self.lines: + hdf_utils.write_file(self.file_path, ''.join(self.lines)) + + def _append(self, new_line): + self.lines.append(new_line) + self._save() + + def _find_var_line(self, var_name): + for index, line in enumerate(self.lines): + if var_name in line: + return index, line + return 0, '' + + def _is_vendor_valid(self, vendor_name): + vendor_hdf_path = \ + hdf_utils.get_vendor_hdf_dir(self.root_dir, vendor_name) + if os.path.exists(vendor_hdf_path): + return True + return False + + def _set_var_value(self, var_name, var_value): + idx, var_line = self._find_var_line(var_name) + if var_line: + self.lines[idx] = re.sub(self.line_pattern % var_name, + r'\g<1>%s' % var_value, var_line) + self._save() + else: + new_line = '\n%s := %s' % (var_name, var_value) + self._append(new_line) + + def _get_var_value(self, var_name): + idx, var_line = self._find_var_line(var_name) + var_value = '' + if var_line: + match_obj = re.search(self.line_pattern % var_name, var_line) + if match_obj: + var_value = match_obj.group(2) + return var_value.strip() + + def set_vendor(self, vendor_name): + if not self._is_vendor_valid(vendor_name): + raise HdfToolException('vendor: "%s" not exist' % vendor_name, + CommandErrorCode.TARGET_NOT_EXIST) + self._set_var_value(self.hdf_vendor_var_name, vendor_name) + + def get_vendor(self): + vendor_name = self._get_var_value(self.hdf_vendor_var_name) + if self._is_vendor_valid(vendor_name): + return vendor_name + return '' + + def set_board_vendor_path(self, board_vendor_path): + self._set_var_value(self.board_vendor_path_var_name, board_vendor_path) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_manager_config_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_manager_config_file.py new file mode 100755 index 000000000..d856a393e --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_manager_config_file.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re +from string import Template + +from hdf_tool_exception import HdfToolException +from command_line.hdf_command_error_code import CommandErrorCode +import hdf_utils + + +class HdfManagerConfigFile(object): + def __init__(self, file_path): + self.file_path = file_path + self.file_dir = os.path.dirname(self.file_path) + self.host_pattern = r'%s\s*::\s*host\s*{' + self.hdf_manager_pattern = r'device_info\s*{' + self.contents = '' + self._read_contents() + + def _read_contents(self): + if os.path.exists(self.file_path): + self.contents = hdf_utils.read_file(self.file_path) + else: + self.contents = '' + + def check_and_create(self): + if self.contents: + return + template_str = \ + hdf_utils.get_template('hdf_driver_manager_config.template') + self.contents = Template(template_str).safe_substitute({}) + if not os.path.exists(self.file_dir): + os.makedirs(self.file_dir) + hdf_utils.write_file(self.file_path, self.contents) + + def _find_range(self, pattern): + match_obj = re.search(pattern, self.contents) + if not match_obj: + return None + start = match_obj.start() + if start == -1: + return None + braces = [] + start += len(match_obj.group(0)) - 1 + end = start + for i in range(start, len(self.contents)): + if '{' == self.contents[i]: + braces.append('{') + elif '}' == self.contents[i]: + count = len(braces) + if count == 0: + return None + if count == 1: + end = i + break + braces.pop() + if end != start: + while end > start + 1: + end -= 1 + if self.contents[end] not in [' ', '\t']: + break + return hdf_utils.SectionRange(start, end) + return None + + @staticmethod + def _begin_end(module, driver): + dev_id = hdf_utils.get_id(module, driver) + device_begin = '\n/* 0: + del lines[index] + hdf_utils.write_file_lines(file_path, lines) + + def rename_vendor(self): + pattern = r'vendor/([a-zA-Z0-9_\-]+)/' + replacement = 'vendor/%s/' % self.vendor + new_content = re.sub(pattern, replacement, self.contents) + hdf_utils.write_file(self.file_path, new_content) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py new file mode 100755 index 000000000..2359dab2c --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re + +from hdf_tool_settings import HdfToolSettings +import hdf_utils + + +class HdfVendorKconfigFile(object): + def __init__(self, root, vendor, kernel, path): + if not path: + self.kernel = kernel + self.root = root + self.vendor = vendor + self.kconfig_path = hdf_utils.\ + get_vendor_kconfig_path(self.root, self.kernel) + else: + self.kconfig_path = path + if os.path.exists(self.kconfig_path): + self.lines = hdf_utils.read_file_lines(self.kconfig_path) + else: + self.lines = [] + drivers_path = HdfToolSettings().get_drivers_path_adapter() + if kernel.capitalize() == "Liteos" or re.search( + r'liteos/Kconfig', self.kconfig_path): + line_pattern = \ + r'^\s*source\s+"../../(%s/([a-zA-Z0-9_\-]+)/.*)"'\ + % (drivers_path) + self.line_re = re.compile(line_pattern) + self.line_prefix = 'source "../../%s/%s/%s"'\ + % (drivers_path, 'liteos', 'model') + elif kernel.capitalize() == "Linux" or re.search( + r'linux/Kconfig', self.kconfig_path): + line_pattern = \ + r'^\s*source\s+"../../(%s/([a-zA-Z0-9_\-]+)/.*)"'\ + % (drivers_path) + self.line_re = re.compile(line_pattern) + self.line_prefix = 'source "drivers/hdf/khdf/model/%s/Kconfig"\n' + + def _save(self): + if self.lines: + hdf_utils.write_file(self.kconfig_path, ''.join(self.lines)) + + def get_module_and_config_path(self): + tuples = [] + for line in self.lines: + match_obj = self.line_re.search(line) + if match_obj: + k_path_raw = match_obj.group(1).replace('/', os.sep) + k_path = os.path.join(self.root, k_path_raw) + tuples.append((match_obj.group(2), k_path)) + return tuples + + def _find_line(self, line_part): + for index, line in enumerate(self.lines): + if line_part in line: + return index, line + return 0, '' + + def add_module(self, module_to_k_path_parts): + module_k_part = '/'.join(module_to_k_path_parts) + index, line = self._find_line(module_k_part) + if line: + return + line = '\n%s/%s"\n' % (self.line_prefix, module_k_part) + if self.lines: + if self.lines[-1].endswith('\n'): + if self.kernel.capitalize() == "Liteos": + line = '%s/%s"\n' % (self.line_prefix[:-1], module_k_part) + elif self.kernel.capitalize() == "Linux": + line = self.line_prefix % (module_to_k_path_parts[0]) + for file_index, file_line in enumerate(self.lines): + if file_line.strip() == "endif": + self.lines.insert(file_index - 1, line) + break + self._save() + return self.kconfig_path + + def delete_module(self, module): + if self.line_prefix.find("Kconfig") > 0: + line_part = self.line_prefix % module + else: + line_part = '%s/%s/Kconfig"\n' % (self.line_prefix[:-1], module) + index, line = self._find_line(line_part) + if line: + self.lines[index] = '' + self._save() + + def rename_vendor(self, ): + for i, line in enumerate(self.lines): + pattern = r'vendor/([a-zA-Z0-9_\-]+)/' + replacement = 'vendor/%s/' % self.vendor + self.lines[i] = re.sub(pattern, replacement, line) + self._save() diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_vendor_makefile.py b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_makefile.py new file mode 100755 index 000000000..7153cc7e4 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_makefile.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import re +from string import Template + +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfVendorMakeFile(object): + def __init__(self, root, vendor, kernel, path): + if path: + self.file_path = path + else: + self.vendor = vendor + self.kernel = kernel + self.file_path = hdf_utils.\ + get_vendor_makefile_path(root, self.kernel) + if not os.path.exists(self.file_path): + raise HdfToolException('file: %s not exist' % self.file_path, + CommandErrorCode.TARGET_NOT_EXIST) + self.contents = hdf_utils.read_file_lines(self.file_path) + self.template_str = \ + "obj-$(CONFIG_DRIVERS_HDF_${module_upper_case}) " \ + "+= model/${module_lower_case}/\n" + + def _begin_end(self, module): + module_id = hdf_utils.get_id(self.vendor, module) + begin = '\n# pos_range.end_pos + 1: + file.write(file_content[pos_range.end_pos + 1:]) + + +def append_and_save(file_content, file_path, new_section): + if not file_content or not file_path or not new_section: + return + with open(file_path, 'w', newline='\n') as file: + file.write(file_content) + _write_one_section(file, new_section) + + +def delete_and_save(file_content, file_path, delete_range): + if not file_content or not file_path or not delete_range: + return + length = len(file_content) + with open(file_path, 'w', newline='\n') as file: + file.write(file_content[:delete_range.start_pos]) + if delete_range.end_pos + 1 < length: + file.write(file_content[delete_range.end_pos + 1:]) + + +def replace_and_save(file_content, file_path, old_range, new_section): + if not file_content or not file_path or not old_range or not new_section: + return + with open(file_path, 'w', newline='\n') as file: + file.write(file_content[:old_range.start_pos]) + _write_one_section(file, new_section) + file.write(file_content[old_range.end_pos + 1:]) + + +def get_id(part2): + full_name = part2 + return hashlib.sha256(full_name.encode('utf8')).hexdigest()[:32] + + +def create_dirs(dir_path): + if dir_path and not os.path.exists(dir_path): + try: + os.makedirs(dir_path) + except Exception: + raise HdfToolException('create dirs fail: %s' % dir_path) + + +def read_file(file_path): + with open(file_path, encoding="utf-8") as file: + content = file.read() + return content + + +def read_file_lines(file_path, code_type="utf-8"): + with open(file_path, encoding=code_type) as file: + lines = file.readlines() + return lines + + +def write_file(file_path, content): + with open(file_path, 'w+', newline='\n') as file: + file.write(content) + + +def write_file_lines(file_path, content, code_type="utf-8"): + with open(file_path, 'w', encoding=code_type) as file: + file.writelines(content) + + +def get_framework_lite_dir(root): + return os.path.join(root, 'drivers', 'adapter', 'khdf', 'liteos') + + +def get_vendor_root_dir(root): + return os.path.join(root, 'vendor') + + +def get_vendor_dir(root, vendor): + return os.path.join(get_vendor_root_dir(root), vendor) + + +def get_vendor_hdf_dir_framework(root): + relative_path = HdfToolSettings().get_drivers_path_framework() + return os.path.join(root, relative_path) + + +def get_vendor_hdf_dir_adapter(root, kernel='liteos'): + relative_path = HdfToolSettings().get_drivers_path_adapter() + return os.path.join(root, relative_path, kernel) + + +def get_vendor_lite_mk_path(root): + return os.path.join(get_vendor_hdf_dir_adapter(root), 'hdf_lite.mk') + + +def get_vendor_makefile_path(root, kernel): + return os.path.join(get_vendor_hdf_dir_adapter(root, kernel), 'Makefile') + + +def get_dot_configs_path(root, vendor, board): + path = os.path.join(root, "vendor", vendor, board, 'kernel_configs') + return [os.path.join(path, i) for i in os.listdir(path)] + + +def get_module_dir(root, vendor, module): + return os.path.join(get_vendor_hdf_dir_framework(root), 'model', module) + + +def get_drv_root_dir(root, vendor, module): + return os.path.join(get_module_dir(root, vendor, module), 'driver') + + +def get_drv_dir(root, vendor, module, driver): + return os.path.join(get_drv_root_dir(root, vendor, module), driver) + + +def get_drv_src_dir(root, vendor, module): + return get_drv_root_dir(root, vendor, module) + + +def get_drv_include_dir(root, vendor, module, driver): + return os.path.join(get_drv_dir(root, vendor, module, driver), 'include') + + +def get_vendor_kconfig_path(root, kernel): + hdf_dir = get_vendor_hdf_dir_adapter(root, kernel) + return os.path.join(hdf_dir, 'Kconfig') + + +def get_module_kconfig_path(root, vendor, module): + return os.path.join(get_drv_root_dir(root, vendor, module), 'Kconfig') + + +def get_module_mk_path(root, vendor, module): + return os.path.join(get_drv_root_dir(root, vendor, module), 'Makefile') + + +def get_liteos_a_dot_config_path(root): + return os.path.join(root, 'kernel', 'liteos_a', '.config') + + +def get_resources_dir(): + cur_dir = os.path.realpath(os.path.dirname(__file__)) + return os.path.join(cur_dir, 'resources') + + +def get_templates_dir(): + return os.path.join(get_resources_dir(), 'templates') + + +def get_templates_lite_dir(): + return os.path.join(get_templates_dir(), 'lite') + + +def get_template(template_name, type_='lite'): + templates_dir = os.path.join(get_templates_dir(), type_) + template = os.path.join(templates_dir, template_name) + with open(template) as file: + template_str = file.read() + return template_str + + +def get_hdf_lite_settings_mk_path(root_dir): + return os.path.join(get_framework_lite_dir(root_dir), + 'hdf_lite_settings.mk') + + +def get_hdf_lite_mk_path(root_dir): + return os.path.join(get_framework_lite_dir(root_dir), + 'hdf_lite.mk') + + +def get_hdf_lite_kconfig_path(root_dir): + return os.path.join(get_framework_lite_dir(root_dir), + 'Kconfig') + + +def is_commented_line(line, comment_start): + if line.strip().startswith(comment_start): + return True + else: + return False + + +def get_vendor_gn_path(root): + return os.path.join(get_vendor_hdf_dir_adapter(root), 'BUILD.gn') + + +def get_template_file_path(root, kernel='liteos'): + template_relative_path = HdfToolSettings().get_template_path() + relative_path2 = HdfToolSettings().get_drivers_path_framework() + return os.path.join(root, relative_path2, template_relative_path) + + +def get_hcs_file_path(root, vendor, board): + return os.path.join(root, "vendor", vendor, board, + "hdf_config", "device_info", "device_info.hcs") + + +def template_filename_filtrate(dir_path, kernal): + filename_list = [] + for filename in os.listdir(dir_path): + if filename.split("_")[0] == kernal.capitalize(): + filename_list.append(filename) + return filename_list + + +def get_create_model_info(root, create_data): + data = json.loads(create_data) + out_model_list = [] + if not data: + return [] + file_key_list = list(list(data.items())[0][-1].keys())[:-1] + for k, _ in data.items(): + model_file_path = {} + for key in file_key_list: + if key.split("_")[-1] == "path": + path_dict = data[k][key] + if isinstance(path_dict, dict): + for k_filename, file_path in path_dict.items(): + if not os.path.exists(os.path.join(root, file_path)): + model_file_path[k_filename] = " " + else: + model_file_path[k_filename] = path_dict[k_filename] + else: + hcs_file_path = os.path.join(root, path_dict) + if not os.path.exists(hcs_file_path): + model_file_path[key] = " " + else: + model_file_path[key] = path_dict + out_model_list.append({k: model_file_path}) + return out_model_list \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/main.py b/tools/hdf_dev_eco_tool/main.py new file mode 100755 index 000000000..a9aa14688 --- /dev/null +++ b/tools/hdf_dev_eco_tool/main.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import sys +import argparse + +from command_line.hdf_tool_commands import HdfToolCommands +from hdf_tool_daemon_server import HdfToolDaemonServer +from hdf_tool_exception import HdfToolException +from command_line.hdf_command_error_code import CommandErrorCode + + +def check_python_version(): + if sys.version_info < (3, 0): + print('Please run with python version >= 3.0') + sys.exit(-1) + + +def main(): + check_python_version() + commands = HdfToolCommands() + help_info = 'Tools backend for hdf driver development.' + arg_parser = argparse.ArgumentParser(description=help_info) + arg_parser.add_argument('--run_as_daemon', action='store_true') + arg_parser.add_argument('--server_type', help='command_line or ls_hcs,' + 'default command_line', default='command_line') + arg_parser.add_argument('command', help=commands.help()) + arg_parser.add_argument('remainder_args', nargs=argparse.REMAINDER) + args = arg_parser.parse_args() + if args.run_as_daemon: + HdfToolDaemonServer(args.server_type).run() + return + try: + ret = commands.run(args.command, args.remainder_args) + if ret or isinstance(ret, list): + print(ret) + except HdfToolException as exc: + print('error: {}, {}'.format(exc.error_code, exc.exc_msg)) + except Exception as exc: + print('error: {}, {}'.format(CommandErrorCode.UNKNOWN_ERROR, str(exc))) + + +if __name__ == "__main__": + main() diff --git a/tools/hdf_dev_eco_tool/resources/create_model.config b/tools/hdf_dev_eco_tool/resources/create_model.config new file mode 100755 index 000000000..9e26dfeeb --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/create_model.config @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/settings.json b/tools/hdf_dev_eco_tool/resources/settings.json new file mode 100755 index 000000000..ecbf0e137 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/settings.json @@ -0,0 +1,23 @@ +{ + "supported_boards": { + "hispark_taurus": { + "board_parent_path": "vendor/hisilicon/hispark_taurus", + "dot_config_path": "kernel/liteos_a/tools/build/config", + "dot_configs": ["hispark_taurus_debug_shell_tee.config", "hispark_taurus_debug_shell.config" + ,"hispark_taurus_release_tee.config", "hispark_taurus_release.config" + , "hispark_taurus_clang_release_tee.config", "hispark_taurus_clang_release.config"] + }, + "hispark_taurus_linux": { + "patch_and_config": ["hi3516dv300.patch", "hi3516dv300_small_defconfig", "hi3516dv300_standard_defconfig", + "small_common_defconfig", "standard_common_defconfig"] + }, + "hispark_aries": { + "board_parent_path": "vendor/hisilicon/hispark_aries", + "dot_config_path": "kernel/liteos_a/tools/build/config", + "dot_configs": ["hispark_aries_clang_release.config", "hispark_aries_release.config", "hispark_aries_debug_shell.config"] + } + }, + "drivers_path_relative_to_vendor": "drivers/framework", + "drivers_path_relative_adapter": "drivers/adapter/khdf", + "template_file_path": "tools/hdf_dev_eco_tool/resources/templates/lite" +} diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Kconfig.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Kconfig.template new file mode 100755 index 000000000..952d17e01 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Kconfig.template @@ -0,0 +1,34 @@ +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other materials +# provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used +# to endorse or promote products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +config DRIVERS_HDF_${module_upper_case} + bool "Enable HDF ${module_lower_case} driver" + default n + depends on DRIVERS_HDF + help + Answer Y to enable HDF ${module_lower_case} driver. \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Makefile.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Makefile.template new file mode 100755 index 000000000..d1a0267eb --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_Makefile.template @@ -0,0 +1,33 @@ +# +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. +# +# This software is licensed under the terms of the GNU General Public +# License version 2, as published by the Free Software Foundation, and +# may be copied, distributed, and modified under those terms. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# + +${module_upper_case}_ROOT_DIR = ../../../../../framework/model/${module_lower_case}/driver + +obj-$(CONFIG_DRIVERS_HDF_${module_upper_case}) += \ + $(${module_upper_case}_ROOT_DIR)/${driver_name}_driver.o + +ccflags-y += -I$(srctree)/drivers/hdf/framework/include/core \ + -I$(srctree)/drivers/hdf/framework/core/common/include/host \ + -I$(srctree)/drivers/hdf/framework/include/utils \ + -I$(srctree)/drivers/hdf/framework/include/osal \ + -I$(srctree)/drivers/hdf/framework/ability/sbuf/include \ + -I$(srctree)/drivers/hdf/framework/include/platform \ + -I$(srctree)/drivers/hdf/framework/include/config \ + -I$(srctree)/drivers/hdf/framework/core/host/include \ + -I$(srctree)/drivers/hdf/framework/core/shared/include \ + -I$(srctree)/drivers/hdf/framework/utils/include \ + -I$(srctree)/drivers/hdf/khdf/osal/include + +ccflags-y +=-I$(srctree)/bounds_checking_function/include \ + -I$(srctree)/drivers/hdf/evdev \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_built-in.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_built-in.template new file mode 100755 index 000000000..9cf4aa1b4 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Linux_built-in.template @@ -0,0 +1,4 @@ +! +// 56 ` +../../../../../framework/model/${module_lower_case}/${module_lower_case}.o/ +/0 0 0 0 644 1912 ` \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_BUILD_gn.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_BUILD_gn.template new file mode 100755 index 000000000..9b648355e --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_BUILD_gn.template @@ -0,0 +1,41 @@ +# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other materials +# provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used +# to endorse or promote products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import("//drivers/adapter/khdf/liteos/hdf.gni") +module_switch = defined(LOSCFG_DRIVERS_HDF_${module_upper_case}) +module_name = "hdf_${module_lower_case}_driver" +hdf_driver(module_name) { + FRAMEWORKS_${module_upper_case}_ROOT = "$HDF_FRAMEWORKS_PATH/model/${module_lower_case}" + sources = ["$FRAMEWORKS_${module_upper_case}_ROOT/driver/${driver_file_name}"] + + include_dirs = [ + "//third_party/FreeBSD/sys/dev/evdev/" + ] +} + diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Device_Info_Hcs.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Device_Info_Hcs.template new file mode 100755 index 000000000..64e5b0c46 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Device_Info_Hcs.template @@ -0,0 +1,15 @@ +${driver_name} :: host{ + hostName = "${driver_name}_host"; // hostƣhostڵijһ + priority = 100; // hostȼ0-200ֵԽȼԽͣĬ100ȼͬ򲻱֤hostļ˳ + device_${driver_name} :: device { // ${driver_name}豸ڵ + device0 :: deviceNode { // ${driver_name}DeviceNodeڵ + policy = 2; // policyֶ񷢲IJ + priority= 100; // ȼ0-200ֵԽȼԽͣĬ100ȼͬ򲻱֤deviceļ˳ + preload = 0; // ֶ + permission = 0664; // 豸ڵȨ + moduleName = "${driver_name}_driver"; // ƣֶεֵڽṹmoduleNameֵһ + serviceName = "${driver_name}_service"; // ⷢƣΨһ + deviceMatchAttr = ""; // ˽ƥĹؼ֣˽ñеmatch_attrֵ + } + } +} diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Kconfig.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Kconfig.template new file mode 100755 index 000000000..bb09830c8 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Kconfig.template @@ -0,0 +1,34 @@ +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other materials +# provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used +# to endorse or promote products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +config DRIVERS_HDF_${module_upper_case} + bool "Enable HDF ${module_lower_case} driver" + default n + depends on DRIVERS_HDF + help + Answer Y to enable HDF ${module_lower_case} driver. \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Makefile.template b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Makefile.template new file mode 100755 index 000000000..e4574aff0 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/Liteos_Makefile.template @@ -0,0 +1,39 @@ +# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other materials +# provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be used +# to endorse or promote products derived from this software without specific prior written +# permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk + +${module_upper_case}_ROOT_DIR = $(LITEOSTOPDIR)/../../drivers/framework/model/${module_lower_case} + +ifeq ($(LOSCFG_DRIVERS_HDF_${module_upper_case}), y) +MODULE_NAME := hdf_${module_lower_case}_driver +LOCAL_INCLUDE := $(${module_upper_case}_ROOT_DIR)/../../../../../third_party/FreeBSD/sys/dev/evdev +LOCAL_SRCS += $(${module_upper_case}_ROOT_DIR)/driver/${driver_file_name} + +endif +include $(HDF_DRIVER) diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template b/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template new file mode 100755 index 000000000..edf95d033 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template @@ -0,0 +1,15 @@ +${model_name} :: host{ + hostName = "${model_name}_host"; + priority = 100; + device_${model_name} :: device { + device0 :: deviceNode { + policy = 2; + priority= 100; + preload = 0; + permission = 0664; + moduleName = "${driver_name}_driver"; + serviceName = "${driver_name}_service"; + deviceMatchAttr = ""; + } + } +} diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template new file mode 100755 index 000000000..9d890166d --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template @@ -0,0 +1,41 @@ +#include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件 +#include "hdf_log.h" // HDF 框架提供的日志接口头文件 + +#define HDF_LOG_TAG ${driver_lower_case}_driver // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签 + +//驱动服务结构的定义 +struct ITestDriverService { + struct IDeviceIoService ioService; // 服务结构的首个成员必须是IDeviceIoService类型的成员 + //以下可添加自定义的驱动的服务接口 +}; + +//驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 +static int32_t Hdf${driver_upper_camel_case}DriverBind(struct HdfDeviceObject *deviceObject) { + // deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口 + HDF_LOGI("${driver_lower_case} driver bind success"); + return 0; +} + +// 驱动自身业务初始的接口 +static int32_t Hdf${driver_upper_camel_case}DriverInit(struct HdfDeviceObject *deviceObject) { + HDF_LOGI("Hello world"); + return 0; +} + +// 驱动资源释放的接口 +static void Hdf${driver_upper_camel_case}DriverRelease(struct HdfDeviceObject *deviceObject) { + HDF_LOGI("${driver_lower_case} driver Release success"); + return; +} + +// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量 +struct HdfDriverEntry g_${driver_lower_case}DriverEntry = { + .moduleVersion = 1, + .moduleName = "${driver_lower_case}_driver", + .Bind = Hdf${driver_upper_camel_case}DriverBind, + .Init = Hdf${driver_upper_camel_case}DriverInit, + .Release = Hdf${driver_upper_camel_case}DriverRelease, +}; + +// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 +HDF_INIT(g_${driver_lower_case}DriverEntry); diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.h.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.h.template new file mode 100755 index 000000000..3e4624094 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.h.template @@ -0,0 +1,10 @@ +#ifndef _${driver_upper_case}_DRIVER_H +#define _${driver_upper_case}_DRIVER_H + +#include "hdf_device_desc.h" + +struct ${driver_upper_camel_case}DriverService { + struct IDeviceIoService ${driver_lower_camel_case}Service; +}; + +#endif/*_${driver_upper_case}_DRIVER_H*/ diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_config.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_config.template new file mode 100755 index 000000000..0657e42b7 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_config.template @@ -0,0 +1,3 @@ +root { + +} \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_kconfig.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_kconfig.template new file mode 100755 index 000000000..ade08c636 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_kconfig.template @@ -0,0 +1,6 @@ +config DRIVERS_HDF_${driver_upper_case} + bool "Enable HDF ${driver_lower_case} driver" + default n + depends on DRIVERS_HDF_${module_upper_case} + help + Answer Y to enable HDF ${driver_lower_case} driver. \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_makefile.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_makefile.template new file mode 100755 index 000000000..19d4f048c --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_makefile.template @@ -0,0 +1,10 @@ +include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk + +MODULE_NAME := hdf${module_lower_case} + +LOCAL_INCLUDE := ./include +LOCAL_INCLUDE += ./src + +LOCAL_SRCS += $(wildcard ./src/*.c) + +include $(HDF_DRIVER) diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config.template new file mode 100755 index 000000000..2695a43a1 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config.template @@ -0,0 +1,38 @@ +root { + device_info { + match_attr = "hdf_manager"; + template host { + hostName = ""; + priority = 100; + template device { + template deviceNode { + policy = 0; + priority = 100; + preload = 0; + permission = 0666; + moduleName = ""; + serviceName = ""; + deviceMatchAttr = ""; + } + } + } + platform :: host { + hostName = "platform_host"; + } + display :: host { + hostName = "display_host"; + } + network :: host { + hostName = "network_host"; + } + storage :: host { + hostName = "storage_host"; + } + media :: host { + hostName = "media_host"; + } + common :: host { + hostName = "common_host"; + } + } +} diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_device.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_device.template new file mode 100755 index 000000000..04806197d --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_device.template @@ -0,0 +1,10 @@ + device_${driver_lower_case} :: device { + device0 :: deviceNode { + policy = 1; + priority = 100; + preload = 0; + permission = 0666; + moduleName = "${driver_lower_case}"; + serviceName = "${driver_lower_camel_case}Service"; + } + } \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_host.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_host.template new file mode 100755 index 000000000..1dac297e3 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver_manager_config_host.template @@ -0,0 +1,3 @@ + ${module_lower_case} :: host { + hostName = "${module_lower_case}_host"; + } \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_hcs_makefile.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_hcs_makefile.template new file mode 100755 index 000000000..33e9df73b --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_hcs_makefile.template @@ -0,0 +1,7 @@ +include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk + +MODULE_NAME := hdf_config + +LOCAL_PLATFORM_HCS_SRC := hdf.hcs + +include $(HDF_DRIVER) diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_kconfig.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_kconfig.template new file mode 100755 index 000000000..3a5127a05 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_kconfig.template @@ -0,0 +1,6 @@ +config DRIVERS_HDF_${module_upper_case} + bool "Enable HDF ${module_lower_case} module" + default n + depends on DRIVERS_HDF + help + Answer Y to enable HDF ${module_lower_case} module. diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk.template new file mode 100755 index 000000000..a2c985934 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk.template @@ -0,0 +1,4 @@ +include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk + +MODULE_NAME := hdf${module_lower_case} +include $(HDF_DRIVER) diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk_driver.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk_driver.template new file mode 100755 index 000000000..6502fecbd --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_module_mk_driver.template @@ -0,0 +1,5 @@ +ifeq ($(LOSCFG_DRIVERS_HDF_${driver_upper_case}), y) + LOCAL_INCLUDE += ./${driver_lower_case}/include + LOCAL_INCLUDE += ./${driver_lower_case}/src + LOCAL_SRCS += $(wildcard ./${driver_lower_case}/src/*.c) +endif \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_kconfig.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_kconfig.template new file mode 100755 index 000000000..8b1378917 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_kconfig.template @@ -0,0 +1 @@ + diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk.template new file mode 100755 index 000000000..5c51b1ec4 --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk.template @@ -0,0 +1,2 @@ +LITEOS_BASELIB += -lhdf_config +LIB_SUBDIRS += $(LITEOSTOPDIR)/../../${board_parent_path}/$(LITEOS_PLATFORM)/config diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk_module.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk_module.template new file mode 100755 index 000000000..14e31ffdd --- /dev/null +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_vendor_mk_module.template @@ -0,0 +1,4 @@ +ifeq ($(LOSCFG_DRIVERS_HDF_${module_upper_case}), y) + LITEOS_BASELIB += -lhdf_${module_lower_case}_driver + LIB_SUBDIRS += $(LITEOS_DRIVERS_HDF)/model/${module_lower_case} +endif \ No newline at end of file -- Gitee From 5a81b5b4fbb83b361d82a42fc3b8fc1b927a5f07 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 01:17:47 +0000 Subject: [PATCH 090/272] Hdmi framework code Signed-off-by: lzl --- support/platform/src/hdmi/hdmi_edid.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 44d591238..007b4c971 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -34,11 +34,15 @@ int32_t HdmiEdidGetRaw(struct HdmiEdid *edid, uint8_t *raw, uint32_t len) { uint32_t length; - if (edid == NULL || raw == NULL || len == 0) { + if (edid == NULL || raw == NULL) { return HDF_ERR_INVALID_PARAM; } length = ((len < edid->rawLen) ? len : edid->rawLen); + if (length == 0) { + HDF_LOGE("edid data not get."); + return (int32_t)length; + } if (memcpy_s(raw, len, edid->raw, length) != EOK) { HDF_LOGE("memcpy_s fail."); return HDF_ERR_IO; -- Gitee From ef57729b10a0920dbbac22af5370485ef54ad083 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 01:22:40 +0000 Subject: [PATCH 091/272] hdmi framework code Signed-off-by: lzl --- support/platform/src/hdmi/hdmi_common.c | 2 +- support/platform/src/hdmi/hdmi_core.c | 2 +- support/platform/src/hdmi/hdmi_dfm.c | 2 +- support/platform/src/hdmi/hdmi_dispatch.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/support/platform/src/hdmi/hdmi_common.c b/support/platform/src/hdmi/hdmi_common.c index ced9501ee..e499459f7 100644 --- a/support/platform/src/hdmi/hdmi_common.c +++ b/support/platform/src/hdmi/hdmi_common.c @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_log.h" #include "hdmi_common.h" +#include "hdf_log.h" #define HDF_LOG_TAG hdmi_common_c diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index 4a4fe58ea..a2471d0af 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -6,9 +6,9 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdmi_core.h" #include "device_resource_if.h" #include "hdf_log.h" -#include "hdmi_core.h" #include "hdmi_dispatch.h" #include "osal_mem.h" #include "osal_time.h" diff --git a/support/platform/src/hdmi/hdmi_dfm.c b/support/platform/src/hdmi/hdmi_dfm.c index 2475025cc..87f28c755 100644 --- a/support/platform/src/hdmi/hdmi_dfm.c +++ b/support/platform/src/hdmi/hdmi_dfm.c @@ -6,9 +6,9 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdmi_dfm.h" #include "hdf_log.h" #include "hdmi_common.h" -#include "hdmi_dfm.h" #define HDF_LOG_TAG hdmi_dfm_c diff --git a/support/platform/src/hdmi/hdmi_dispatch.c b/support/platform/src/hdmi/hdmi_dispatch.c index c3f2e34f0..784340700 100644 --- a/support/platform/src/hdmi/hdmi_dispatch.c +++ b/support/platform/src/hdmi/hdmi_dispatch.c @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_log.h" #include "hdmi_dispatch.h" +#include "hdf_log.h" #include "hdmi_core.h" #include "hdmi_if.h" -- Gitee From 9a48beb79724b09b8412564592facfda4f731721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=B9=E6=A0=91=E6=B8=85?= Date: Mon, 18 Oct 2021 01:32:42 +0000 Subject: [PATCH 092/272] update support/platform/src/gpio/gpio_core.c. Signed-off-by: shuqingyin --- support/platform/src/gpio/gpio_core.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/support/platform/src/gpio/gpio_core.c b/support/platform/src/gpio/gpio_core.c index 61ad2c016..39b763614 100644 --- a/support/platform/src/gpio/gpio_core.c +++ b/support/platform/src/gpio/gpio_core.c @@ -10,6 +10,8 @@ #include "hdf_log.h" #include "osal_mem.h" #include "plat_log.h" +#include "platform_core.h" +#include "securec.h" #define HDF_LOG_TAG gpio_core -- Gitee From b17a0a1087bebbce5db1743f582f1ed1af6e4d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=B9=E6=A0=91=E6=B8=85?= Date: Mon, 18 Oct 2021 01:33:49 +0000 Subject: [PATCH 093/272] update support/platform/src/gpio/gpio_if.c. Signed-off-by: shuqingyin --- support/platform/src/gpio/gpio_if.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/support/platform/src/gpio/gpio_if.c b/support/platform/src/gpio/gpio_if.c index d466a2299..d7c0205cd 100644 --- a/support/platform/src/gpio/gpio_if.c +++ b/support/platform/src/gpio/gpio_if.c @@ -13,9 +13,11 @@ #include "hdf_io_service_if.h" #include "platform_errno.h" #else +#include "devsvc_manager_clnt.h" #include "gpio/gpio_core.h" #endif +#include "hdf_base.h" #include "hdf_log.h" #define HDF_LOG_TAG gpio_if -- Gitee From 34ed8241d5fd68e0acc5fe30912fa05d7eb4bee3 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 02:16:43 +0000 Subject: [PATCH 094/272] hdmi framework code Signed-off-by: lzl --- .../platform/include/hdmi/hdmi_infoframe.h | 4 ++-- support/platform/src/hdmi/hdmi_edid.c | 2 +- support/platform/src/hdmi/hdmi_infoframe.c | 22 +++++++++---------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index e2ba5e318..c1bbf5bcb 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -145,7 +145,7 @@ struct HdmiVsInfoframe { uint8_t verNum; uint8_t len; union { - struct HdmiVs14VsifContent _14Vsif; + struct HdmiVs14VsifContent vsif; struct HdmiVsUserVsifContent userVsif; struct HdmiForumVsifContent forumVsif; } vsifContent; @@ -382,7 +382,7 @@ union HdmiGbdRangeData0 { struct { uint8_t gbdColorSpace : 3; /* [0:2] */ uint8_t gbdColorPercision : 2; /* [3:4] */ - uint8_t rsvd: 2; /* [5:6] */ + uint8_t rsvd : 2; /* [5:6] */ uint8_t formatFlag : 1; /* [7] */ } bits; uint8_t val; diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 007b4c971..23c3d99c4 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -697,7 +697,7 @@ static void HdmiEdidVsdb3dStructureInfoPhase(struct HdmiSinkDeviceCapability *si (data[(*offset)] & HDMI_BIT5_MARK) ? true : false; sinkCap->vsdbInfo.support3dType[HDMI_VS_VIDEO_3D_TOP_AND_BOTTOM] = (data[(*offset)] & HDMI_BIT6_MARK) ? true : false; - (*offset)++; + (*offset)++; } } diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 5ae9719fb..02e3931b4 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -63,11 +63,11 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, } HdmiInfoframeFillHeader(&(infoframe->header), data, len); - if (vs->vsifContent._14Vsif.oui == HDMI_IEEE_OUI_1_4) { + if (vs->vsifContent.vsif.oui == HDMI_IEEE_OUI_1_4) { data[4] = HDMI_IEEE_OUI_1_4_1ST; data[5] = HDMI_IEEE_OUI_1_4_2ND; data[6] = HDMI_IEEE_OUI_1_4_3RD; - vsifContent = &(vs->vsifContent._14Vsif); + vsifContent = &(vs->vsifContent.vsif); userContent = &(vs->vsifContent.userVsif); data[7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_4K) { @@ -627,29 +627,29 @@ static uint8_t HdmiGetVsifLength(struct HdmiVs14VsifContent *_14Vsif, bool dolby static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *videoAttr) { struct HdmiVideo4kInfo *_4kInfo = NULL; - struct HdmiVs14VsifContent *_14Vsif = &(vs->vsifContent._14Vsif); + struct HdmiVs14VsifContent *vsif = &(vs->vsifContent.vsif); enum HdmiVic vic; uint32_t cnt; - _14Vsif->oui = HDMI_IEEE_OUI_1_4; + vsif->oui = HDMI_IEEE_OUI_1_4; vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, false); if ((vic == HDMI_VIC_3840X2160P24_16_9 || vic == HDMI_VIC_3840X2160P25_16_9 || vic == HDMI_VIC_3840X2160P30_16_9 || vic == HDMI_VIC_4096X2160P24_256_135) && videoAttr->_3dStruct == HDMI_VS_VIDEO_3D_BUTT) { - _14Vsif->format = HDMI_VS_VIDEO_FORMAT_4K; + vsif->format = HDMI_VS_VIDEO_FORMAT_4K; for (cnt = 0; cnt <= HDMI_VIDEO_4K_CODES_MAX; cnt++) { _4kInfo = HdmiCommonGetVideo4kInfo(cnt); if (_4kInfo != NULL && _4kInfo->timing == videoAttr->timing) { - _14Vsif->vic = _4kInfo->_4kVic; + vsif->vic = _4kInfo->_4kVic; break; } } } else if (videoAttr->_3dStruct < HDMI_VS_VIDEO_3D_BUTT) { // common 3D - _14Vsif->format = HDMI_VS_VIDEO_FORMAT_3D; - _14Vsif->_3dStruct = videoAttr->_3dStruct; + vsif->format = HDMI_VS_VIDEO_FORMAT_3D; + vsif->_3dStruct = videoAttr->_3dStruct; } else { - _14Vsif->format = HDMI_VS_VIDEO_FORMAT_NULL; - _14Vsif->_3dStruct = videoAttr->_3dStruct; + vsif->format = HDMI_VS_VIDEO_FORMAT_NULL; + vsif->_3dStruct = videoAttr->_3dStruct; } } @@ -667,7 +667,7 @@ static void HdmiFillVsInfoframe(struct HdmiInfoframe *frame, struct HdmiVideoAtt vs->type = HDMI_INFOFRAME_PACKET_TYPE_VS; vs->verNum = HDMI_VSIF_VERSION; HdmiFill14Vsif(vs, videoAttr); - vs->len = HdmiGetVsifLength(&(vs->vsifContent._14Vsif), dolbyEnable, hdrSupport); + vs->len = HdmiGetVsifLength(&(vs->vsifContent.vsif), dolbyEnable, hdrSupport); /* fill user vendor data */ vs->vsifContent.userVsif.len = frame->userVsif.len; ret = memcpy_s(vs->vsifContent.userVsif.data, HDMI_VENDOR_USER_DATA_MAX_LEN, -- Gitee From 2dd74ad887b4c04a769444ba6bfc6a1020c2c6a8 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 03:17:57 +0000 Subject: [PATCH 095/272] hdmi framework code Signed-off-by: lzl --- support/platform/src/hdmi/hdmi_infoframe.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 02e3931b4..3e59245ea 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -626,7 +626,7 @@ static uint8_t HdmiGetVsifLength(struct HdmiVs14VsifContent *_14Vsif, bool dolby static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *videoAttr) { - struct HdmiVideo4kInfo *_4kInfo = NULL; + struct HdmiVideo4kInfo *info = NULL; struct HdmiVs14VsifContent *vsif = &(vs->vsifContent.vsif); enum HdmiVic vic; uint32_t cnt; @@ -638,9 +638,9 @@ static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *vid videoAttr->_3dStruct == HDMI_VS_VIDEO_3D_BUTT) { vsif->format = HDMI_VS_VIDEO_FORMAT_4K; for (cnt = 0; cnt <= HDMI_VIDEO_4K_CODES_MAX; cnt++) { - _4kInfo = HdmiCommonGetVideo4kInfo(cnt); - if (_4kInfo != NULL && _4kInfo->timing == videoAttr->timing) { - vsif->vic = _4kInfo->_4kVic; + info = HdmiCommonGetVideo4kInfo(cnt); + if (info != NULL && info->timing == videoAttr->timing) { + vsif->vic = info->_4kVic; break; } } -- Gitee From 0bf62c5082b5aa84c232496a76455b6f53823922 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 18 Oct 2021 07:25:38 +0000 Subject: [PATCH 096/272] Fix Input C90 Warning Signed-off-by: YOUR_NAME --- model/input/driver/hdf_encoder.c | 21 ++++++++++++------- model/input/driver/hdf_input_device_manager.c | 6 ++++-- model/input/driver/hdf_key.c | 9 +++++--- model/input/driver/hdf_touch.c | 5 +++-- model/input/driver/input_config_parser.c | 5 +++-- model/input/driver/touchscreen/touch_ft6336.c | 3 ++- 6 files changed, 32 insertions(+), 17 deletions(-) diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 134b8f610..85ddcb782 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -18,12 +18,13 @@ static void EncoderTimerFunc(uintptr_t arg) { + int32_t ret; EncoderDriver *encoderDrv = (EncoderDriver *)arg; uint16_t gpioClk = encoderDrv->encoderCfg->gpioClk; uint16_t gpioData = encoderDrv->encoderCfg->gpioData; uint16_t gpioSW = encoderDrv->encoderCfg->gpioSW; - int32_t ret = GpioRead(gpioClk, &encoderDrv->encoderClkNowSta); + ret = GpioRead(gpioClk, &encoderDrv->encoderClkNowSta); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: gpio read failed, ret %d", __func__, ret); return; @@ -64,12 +65,13 @@ static void EncoderTimerFunc(uintptr_t arg) static EncoderCfg *EncoderConfigInstance(struct HdfDeviceObject *device) { + int32_t ret; EncoderCfg *encoderCfg = (EncoderCfg *)OsalMemAlloc(sizeof(EncoderCfg)); if (encoderCfg == NULL) { HDF_LOGE("%s: malloc encoder config failed", __func__); return NULL; } - int32_t ret = memset_s(encoderCfg, sizeof(EncoderCfg), 0, sizeof(EncoderCfg)); + ret = memset_s(encoderCfg, sizeof(EncoderCfg), 0, sizeof(EncoderCfg)); if (ret != 0) { HDF_LOGE("%s: memset_s encoder config failed", __func__); OsalMemFree(encoderCfg); @@ -87,12 +89,13 @@ static EncoderCfg *EncoderConfigInstance(struct HdfDeviceObject *device) static EncoderDriver *EncoderDriverInstance(EncoderCfg *encoderCfg) { + int32_t ret; EncoderDriver *encoderDrv = (EncoderDriver *)OsalMemAlloc(sizeof(EncoderDriver)); if (encoderDrv == NULL) { HDF_LOGE("%s: malloc key driver failed", __func__); return NULL; } - int32_t ret = memset_s(encoderDrv, sizeof(EncoderDriver), 0, sizeof(EncoderDriver)); + ret = memset_s(encoderDrv, sizeof(EncoderDriver), 0, sizeof(EncoderDriver)); if (ret != 0) { HDF_LOGE("%s: memset encoder driver failed", __func__); OsalMemFree(encoderDrv); @@ -107,6 +110,7 @@ static EncoderDriver *EncoderDriverInstance(EncoderCfg *encoderCfg) static int32_t EncoderInit(EncoderDriver *EncoderDrv) { + int32_t ret; uint16_t gpioClk = EncoderDrv->encoderCfg->gpioClk; uint16_t gpioData = EncoderDrv->encoderCfg->gpioData; uint16_t gpioSW = EncoderDrv->encoderCfg->gpioSW; @@ -114,7 +118,7 @@ static int32_t EncoderInit(EncoderDriver *EncoderDrv) GpioSetDir(gpioData, GPIO_DIR_IN); GpioSetDir(gpioSW, GPIO_DIR_IN); - int32_t ret = OsalTimerCreate(&EncoderDrv->timer, TIMER_INTERVAL_ENCODER, EncoderTimerFunc, EncoderDrv); + ret = OsalTimerCreate(&EncoderDrv->timer, TIMER_INTERVAL_ENCODER, EncoderTimerFunc, EncoderDrv); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: create timer failed, ret = %d\n", __func__, ret); return HDF_FAILURE; @@ -149,12 +153,13 @@ static int32_t EncoderInit(EncoderDriver *EncoderDrv) static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) { + int32_t ret; InputDevice *inputDev = (InputDevice *)OsalMemAlloc(sizeof(InputDevice)); if (inputDev == NULL) { HDF_LOGE("%s: malloc input device failed", __func__); return NULL; } - int32_t ret = memset_s(inputDev, sizeof(InputDevice), 0, sizeof(InputDevice)); + ret = memset_s(inputDev, sizeof(InputDevice), 0, sizeof(InputDevice)); if (ret != 0) { HDF_LOGE("%s: memset encoder driver failed", __func__); OsalMemFree(inputDev); @@ -178,6 +183,7 @@ static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg, struct HdfDeviceObject *device) { + int32_t ret; EncoderDriver *EncoderDrv = EncoderDriverInstance(encoderCfg); if (EncoderDrv == NULL) { HDF_LOGE("%s: instance encoder driver failed", __func__); @@ -185,7 +191,7 @@ static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg, struct HdfDeviceObj } device->priv = (void *)EncoderDrv; - int32_t ret = EncoderInit(EncoderDrv); + ret = EncoderInit(EncoderDrv); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: key driver init failed, ret %d", __func__, ret); goto EXIT; @@ -213,6 +219,7 @@ EXIT: static int32_t HdfEnCoderDriverInit(struct HdfDeviceObject *device) { + int32_t ret; if (device == NULL) { HDF_LOGE("%s: param is null", __func__); return HDF_ERR_INVALID_PARAM; @@ -224,7 +231,7 @@ static int32_t HdfEnCoderDriverInit(struct HdfDeviceObject *device) return HDF_ERR_MALLOC_FAIL; } - int32_t ret = RegisterEncoderDevice(encoderCfg, device); + ret = RegisterEncoderDevice(encoderCfg, device); if (ret != HDF_SUCCESS) { goto EXIT; } diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index c9fcaa95a..365313745 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -103,12 +103,14 @@ static int32_t CreateDeviceNode(InputDevice *inputDev) static void DeleteDeviceNode(InputDevice *inputDev) { + int32_t len; + int32_t ret; if (IsHidDevice(inputDev->devType)) { char svcName[SERVICE_NAME_LEN] = {0}; const char *moduleName = "HDF_HID"; - int32_t len = (inputDev->devId < PLACEHOLDER_LIMIT) ? 1 : PLACEHOLDER_LENGTH; - int32_t ret = snprintf_s(svcName, SERVICE_NAME_LEN, strlen("hdf_input_event") + len, "%s%u", + len = (inputDev->devId < PLACEHOLDER_LIMIT) ? 1 : PLACEHOLDER_LENGTH; + ret = snprintf_s(svcName, SERVICE_NAME_LEN, strlen("hdf_input_event") + len, "%s%u", "hdf_input_event", inputDev->devId); if (ret < 0) { HDF_LOGE("%s: snprintf_s failed", __func__); diff --git a/model/input/driver/hdf_key.c b/model/input/driver/hdf_key.c index 7df3cd819..56ba4cb97 100644 --- a/model/input/driver/hdf_key.c +++ b/model/input/driver/hdf_key.c @@ -23,6 +23,7 @@ int32_t KeyIrqHandle(uint16_t intGpioNum, void *data) { + int32_t ret; uint16_t gpioValue = 0; KeyDriver *driver = (KeyDriver *)data; if (driver == NULL) { @@ -32,7 +33,7 @@ int32_t KeyIrqHandle(uint16_t intGpioNum, void *data) if (event == NULL) { return HDF_FAILURE; } - int32_t ret = GpioDisableIrq(intGpioNum); + ret = GpioDisableIrq(intGpioNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: disable irq failed, ret %d", __func__, ret); @@ -143,13 +144,14 @@ static InputDevice *InputDeviceInstance(KeyDriver *keyDrv) static int32_t RegisterKeyDevice(KeyChipCfg *keyCfg) { + int32_t ret; KeyDriver *keyDrv = KeyDriverInstance(keyCfg); if (keyDrv == NULL) { HDF_LOGE("%s: instance key config failed", __func__); return HDF_ERR_MALLOC_FAIL; } - int32_t ret = KeyInit(keyDrv); + ret = KeyInit(keyDrv); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: key driver init failed, ret %d", __func__, ret); goto EXIT; @@ -178,6 +180,7 @@ EXIT: static int32_t HdfKeyDriverInit(struct HdfDeviceObject *device) { + int32_t ret; HDF_LOGI("%s: enter", __func__); if (device == NULL) { return HDF_ERR_INVALID_PARAM; @@ -189,7 +192,7 @@ static int32_t HdfKeyDriverInit(struct HdfDeviceObject *device) return HDF_ERR_MALLOC_FAIL; } - int32_t ret = RegisterKeyDevice(keyCfg); + ret = RegisterKeyDevice(keyCfg); if (ret != HDF_SUCCESS) { goto EXIT; } diff --git a/model/input/driver/hdf_touch.c b/model/input/driver/hdf_touch.c index 9f67dea50..b12ebcf9e 100644 --- a/model/input/driver/hdf_touch.c +++ b/model/input/driver/hdf_touch.c @@ -456,13 +456,14 @@ static int32_t TouchGetDeviceStrInfo(TouchDriver *driver, int32_t cmd, struct Hd static int32_t TouchGetDeviceAttr(TouchDriver *driver, struct HdfSBuf *reply) { + char *tempStr = "main_touch"; + int32_t ret; if (driver->inputDev == NULL) { return HDF_FAILURE; } HDF_LOGE("%s: enter", __func__); - char *tempStr = "main_touch"; - int32_t ret = strncpy_s(driver->inputDev->attrSet.devName, DEV_NAME_LEN, tempStr, strlen(tempStr)); + ret = strncpy_s(driver->inputDev->attrSet.devName, DEV_NAME_LEN, tempStr, strlen(tempStr)); if (ret != 0) { HDF_LOGE("%s: strncpy dev attr failed", __func__); return HDF_FAILURE; diff --git a/model/input/driver/input_config_parser.c b/model/input/driver/input_config_parser.c index 01bc6524e..17f65dd27 100644 --- a/model/input/driver/input_config_parser.c +++ b/model/input/driver/input_config_parser.c @@ -25,12 +25,13 @@ int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config) { + int32_t ret; + struct DeviceResourceIface *parser = NULL; if (node == NULL || config == NULL) { HDF_LOGE("%s: param is null", __func__); return HDF_FAILURE; } - struct DeviceResourceIface *parser = NULL; parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); if (parser == NULL) { HDF_LOGE("%s: instance parser failed", __func__); @@ -38,7 +39,7 @@ int32_t ParseKeyConfig(const struct DeviceResourceNode *node, KeyChipCfg *config } const struct DeviceResourceNode *keyNode = node; - int32_t ret = parser->GetString(keyNode, "keyName", &config->keyName, NULL); + ret = parser->GetString(keyNode, "keyName", &config->keyName, NULL); CHECK_PARSER_RET(ret, "GetString"); ret = parser->GetUint8(keyNode, "inputType", &config->devType, 0); CHECK_PARSER_RET(ret, "GetUint8"); diff --git a/model/input/driver/touchscreen/touch_ft6336.c b/model/input/driver/touchscreen/touch_ft6336.c index 87a006fbe..8742debab 100644 --- a/model/input/driver/touchscreen/touch_ft6336.c +++ b/model/input/driver/touchscreen/touch_ft6336.c @@ -92,10 +92,11 @@ static int32_t ChipDataHandle(ChipDevice *device) uint8_t buf[POINT_BUFFER_LEN] = {0}; uint8_t reg = 0x0; uint8_t pointNum; + int32_t ret; InputI2cClient *i2cClient = &device->driver->i2cClient; FrameData *frame = &device->driver->frameData; - int32_t ret = InputI2cRead(i2cClient, ®, 1, buf, POINT_BUFFER_LEN); + ret = InputI2cRead(i2cClient, ®, 1, buf, POINT_BUFFER_LEN); CHIP_CHECK_RETURN(ret); OsalMutexLock(&device->driver->mutex); -- Gitee From 6dff14d4b0b7a03c19a22e6658d2f81b67dea080 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 07:44:49 +0000 Subject: [PATCH 097/272] hdmi framework code Signed-off-by: lzl --- include/platform/hdmi_if.h | 2 +- support/platform/include/hdmi/hdmi_cec.h | 2 +- support/platform/include/hdmi/hdmi_common.h | 2 +- support/platform/include/hdmi/hdmi_core.h | 2 +- support/platform/include/hdmi/hdmi_ddc.h | 2 +- support/platform/include/hdmi/hdmi_dfm.h | 2 +- support/platform/include/hdmi/hdmi_dispatch.h | 2 +- support/platform/include/hdmi/hdmi_edid.h | 2 +- support/platform/include/hdmi/hdmi_event.h | 2 +- support/platform/include/hdmi/hdmi_frl.h | 2 +- support/platform/include/hdmi/hdmi_hdcp.h | 2 +- support/platform/include/hdmi/hdmi_hdr.h | 2 +- support/platform/include/hdmi/hdmi_infoframe.h | 2 +- support/platform/include/hdmi/hdmi_ncts.h | 2 +- support/platform/include/hdmi/hdmi_scdc.h | 2 +- support/platform/src/hdmi/hdmi_common.c | 2 +- support/platform/src/hdmi/hdmi_core.c | 2 +- support/platform/src/hdmi/hdmi_ddc.c | 2 +- support/platform/src/hdmi/hdmi_dfm.c | 2 +- support/platform/src/hdmi/hdmi_dispatch.c | 2 +- support/platform/src/hdmi/hdmi_edid.c | 2 +- support/platform/src/hdmi/hdmi_event.c | 2 +- support/platform/src/hdmi/hdmi_frl.c | 2 +- support/platform/src/hdmi/hdmi_hdcp.c | 4 ++-- support/platform/src/hdmi/hdmi_hdr.c | 3 ++- support/platform/src/hdmi/hdmi_if.c | 3 ++- support/platform/src/hdmi/hdmi_infoframe.c | 2 +- support/platform/src/hdmi/hdmi_ncts.c | 2 +- support/platform/src/hdmi/hdmi_scdc.c | 2 +- 29 files changed, 32 insertions(+), 30 deletions(-) diff --git a/include/platform/hdmi_if.h b/include/platform/hdmi_if.h index 9be1da370..a7ad5073e 100644 --- a/include/platform/hdmi_if.h +++ b/include/platform/hdmi_if.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_cec.h b/support/platform/include/hdmi/hdmi_cec.h index 7ce934acf..122bc46fb 100644 --- a/support/platform/include/hdmi/hdmi_cec.h +++ b/support/platform/include/hdmi/hdmi_cec.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_common.h b/support/platform/include/hdmi/hdmi_common.h index 4be3b1efe..ef44ca307 100644 --- a/support/platform/include/hdmi/hdmi_common.h +++ b/support/platform/include/hdmi/hdmi_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h index e3d1ee12b..d1643111e 100644 --- a/support/platform/include/hdmi/hdmi_core.h +++ b/support/platform/include/hdmi/hdmi_core.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_ddc.h b/support/platform/include/hdmi/hdmi_ddc.h index cdd9cf60c..4dbcc25b2 100644 --- a/support/platform/include/hdmi/hdmi_ddc.h +++ b/support/platform/include/hdmi/hdmi_ddc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_dfm.h b/support/platform/include/hdmi/hdmi_dfm.h index a22aee86e..f8592a658 100644 --- a/support/platform/include/hdmi/hdmi_dfm.h +++ b/support/platform/include/hdmi/hdmi_dfm.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_dispatch.h b/support/platform/include/hdmi/hdmi_dispatch.h index c7292369c..cc680781e 100644 --- a/support/platform/include/hdmi/hdmi_dispatch.h +++ b/support/platform/include/hdmi/hdmi_dispatch.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_edid.h b/support/platform/include/hdmi/hdmi_edid.h index edeba2c03..a749fba71 100644 --- a/support/platform/include/hdmi/hdmi_edid.h +++ b/support/platform/include/hdmi/hdmi_edid.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_event.h b/support/platform/include/hdmi/hdmi_event.h index 2a7fae951..0f66458fd 100644 --- a/support/platform/include/hdmi/hdmi_event.h +++ b/support/platform/include/hdmi/hdmi_event.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_frl.h b/support/platform/include/hdmi/hdmi_frl.h index 4d034629a..4c81381f1 100644 --- a/support/platform/include/hdmi/hdmi_frl.h +++ b/support/platform/include/hdmi/hdmi_frl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_hdcp.h b/support/platform/include/hdmi/hdmi_hdcp.h index 9a7e743c7..1af81e452 100644 --- a/support/platform/include/hdmi/hdmi_hdcp.h +++ b/support/platform/include/hdmi/hdmi_hdcp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_hdr.h b/support/platform/include/hdmi/hdmi_hdr.h index 7d8d83ff0..e2971b3b3 100644 --- a/support/platform/include/hdmi/hdmi_hdr.h +++ b/support/platform/include/hdmi/hdmi_hdr.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index c1bbf5bcb..78796d17c 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_ncts.h b/support/platform/include/hdmi/hdmi_ncts.h index 97923b71d..acce3330c 100644 --- a/support/platform/include/hdmi/hdmi_ncts.h +++ b/support/platform/include/hdmi/hdmi_ncts.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/include/hdmi/hdmi_scdc.h b/support/platform/include/hdmi/hdmi_scdc.h index 7c0f9bbe3..4f75eb638 100644 --- a/support/platform/include/hdmi/hdmi_scdc.h +++ b/support/platform/include/hdmi/hdmi_scdc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_common.c b/support/platform/src/hdmi/hdmi_common.c index e499459f7..2cfac6c80 100644 --- a/support/platform/src/hdmi/hdmi_common.c +++ b/support/platform/src/hdmi/hdmi_common.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index a2471d0af..406c01cc2 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_ddc.c b/support/platform/src/hdmi/hdmi_ddc.c index 8fd4b2392..083ed1a14 100644 --- a/support/platform/src/hdmi/hdmi_ddc.c +++ b/support/platform/src/hdmi/hdmi_ddc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_dfm.c b/support/platform/src/hdmi/hdmi_dfm.c index 87f28c755..330f5cef0 100644 --- a/support/platform/src/hdmi/hdmi_dfm.c +++ b/support/platform/src/hdmi/hdmi_dfm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_dispatch.c b/support/platform/src/hdmi/hdmi_dispatch.c index 784340700..0e4ad04a7 100644 --- a/support/platform/src/hdmi/hdmi_dispatch.c +++ b/support/platform/src/hdmi/hdmi_dispatch.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 23c3d99c4..bae788133 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 97ff983d3..621971949 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_frl.c b/support/platform/src/hdmi/hdmi_frl.c index 6db3e397e..42bab9c87 100644 --- a/support/platform/src/hdmi/hdmi_frl.c +++ b/support/platform/src/hdmi/hdmi_frl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_hdcp.c b/support/platform/src/hdmi/hdmi_hdcp.c index 2e4389b06..eb4bc15d8 100644 --- a/support/platform/src/hdmi/hdmi_hdcp.c +++ b/support/platform/src/hdmi/hdmi_hdcp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -286,7 +286,7 @@ static int32_t HdmiHdcpAuthenticationWaitKsvListReady(struct HdmiHdcp *hdcp) if (ready == false) { return HDF_ERR_TIMEOUT; } - /* */ + ret = HdmiHdcpAuthenticationCheckBstatus(hdcp); if (ret != HDF_SUCCESS) { return ret; diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c index 838ae2bd6..588366ad9 100644 --- a/support/platform/src/hdmi/hdmi_hdr.c +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -8,6 +8,7 @@ #include "hdf_log.h" #include "hdmi_core.h" +#include "securec.h" #define HDF_LOG_TAG hdmi_hdr_c diff --git a/support/platform/src/hdmi/hdmi_if.c b/support/platform/src/hdmi/hdmi_if.c index a3a9b791d..add9587e2 100644 --- a/support/platform/src/hdmi/hdmi_if.c +++ b/support/platform/src/hdmi/hdmi_if.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -8,6 +8,7 @@ #include "hdmi_if.h" #ifndef __USER__ +#include "devsvc_manager_clnt.h" #include "hdmi_core.h" #endif #include "hdf_base.h" diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 3e59245ea..86800056d 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_ncts.c b/support/platform/src/hdmi/hdmi_ncts.c index c90000aa5..aff34dbad 100644 --- a/support/platform/src/hdmi/hdmi_ncts.c +++ b/support/platform/src/hdmi/hdmi_ncts.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/support/platform/src/hdmi/hdmi_scdc.c b/support/platform/src/hdmi/hdmi_scdc.c index 29afc76d9..81fa46ba9 100644 --- a/support/platform/src/hdmi/hdmi_scdc.c +++ b/support/platform/src/hdmi/hdmi_scdc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. -- Gitee From e6aac2e3cd959b0fa66a449b9ec10a9764eeb116 Mon Sep 17 00:00:00 2001 From: lzl Date: Mon, 18 Oct 2021 08:34:04 +0000 Subject: [PATCH 098/272] hdmi test code Signed-off-by: lzl --- .../test/unittest/common/hdf_hdmi_test.cpp | 264 +++++++++++++++ test/unittest/platform/common/hdmi_test.c | 302 ++++++++++++++++++ test/unittest/platform/common/hdmi_test.h | 39 +++ test/unittest/platform/hdf_hdmi_entry_test.c | 32 ++ test/unittest/platform/hdf_hdmi_entry_test.h | 16 + 5 files changed, 653 insertions(+) create mode 100644 support/platform/test/unittest/common/hdf_hdmi_test.cpp create mode 100644 test/unittest/platform/common/hdmi_test.c create mode 100644 test/unittest/platform/common/hdmi_test.h create mode 100644 test/unittest/platform/hdf_hdmi_entry_test.c create mode 100644 test/unittest/platform/hdf_hdmi_entry_test.h diff --git a/support/platform/test/unittest/common/hdf_hdmi_test.cpp b/support/platform/test/unittest/common/hdf_hdmi_test.cpp new file mode 100644 index 000000000..93278dae1 --- /dev/null +++ b/support/platform/test/unittest/common/hdf_hdmi_test.cpp @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdmi_if.h" +#include "hdf_io_service_if.h" +#include "hdf_uhdf_test.h" + +using namespace testing::ext; + +enum HdmiTestCmd { + HDMI_START_AND_STOP_01 = 0, + HDMI_SET_AUDIO_ATTR_01 = 1, + HDMI_SET_VIDEO_ATTR_01 = 2, + HDMI_SET_HDR_ATTR_01 = 3, + HDMI_SET_AVMUTE_01 = 4, + HDMI_EDID_RAW_DATA_GET_01 = 5, + HDMI_DEEP_COLOR_SET_AND_GET_01 = 6, + HDMI_HPD_REGISTER_AND_UNREGISTER_01 = 7, +}; + +class HdfLiteHdmiTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfLiteHdmiTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void HdfLiteHdmiTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void HdfLiteHdmiTest::SetUp() +{ +} + +void HdfLiteHdmiTest::TearDown() +{ +} + +static void HdmiUserHpdHandle(void *data, bool hpd) +{ + (void)data; + + if (hpd == true) { + printf("HdmiUserHpdHandle: hpd."); + } else { + printf("HdmiUserHpdHandle: unhpd."); + } +} + +static void HdmiUserSetAttrCaseTest(DevHandle handle) +{ + struct HdmiVideoAttr videoAttr; + struct HdmiAudioAttr audioAttr; + struct HdmiHdrAttr hdrAttr; + int32_t ret; + + videoAttr.colorSpace = HDMI_COLOR_SPACE_YCBCR444; + videoAttr.colorimetry = HDMI_COLORIMETRY_EXTENDED; + videoAttr.extColorimetry = HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM; + videoAttr.quantization = HDMI_QUANTIZATION_RANGE_FULL; + ret = HdmiSetVideoAttribute(handle, &videoAttr); + if (ret != HDF_SUCCESS) { + printf("HdmiSetVideoAttribute fail."); + } + audioAttr.codingType = HDMI_AUDIO_CODING_TYPE_MP3; + audioAttr.ifType = HDMI_AUDIO_IF_TYPE_I2S; + audioAttr.bitDepth = HDMI_ADIO_BIT_DEPTH_16; + audioAttr.sampleRate = HDMI_SAMPLE_RATE_8K; + audioAttr.channels = HDMI_AUDIO_FORMAT_CHANNEL_3; + ret = HdmiSetAudioAttribute(handle, &audioAttr); + if (ret != HDF_SUCCESS) { + printf("HdmiSetAudioAttribute fail."); + } + hdrAttr.mode = HDMI_HDR_MODE_CEA_861_3; + hdrAttr.userMode = HDMI_HDR_USERMODE_DOLBY; + hdrAttr.eotfType = HDMI_EOTF_SMPTE_ST_2048; + hdrAttr.metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1; + hdrAttr.colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_XV_YCC_709; + ret = HdmiSetHdrAttribute(handle, &hdrAttr); + if (ret != HDF_SUCCESS) { + printf("HdmiSetHdrAttribute fail."); + } +} + +static void HdmiUserTest(void) +{ + DevHandle handle = NULL; + int32_t ret; + enum HdmiDeepColor color = HDMI_DEEP_COLOR_24BITS; + uint8_t data[128] = {0}; + struct HdmiHpdCallbackInfo callback; + + handle = HdmiOpen(0); + if (handle == NULL) { + printf("HdmiOpen fail."); + } + callback.data = NULL; + callback.callbackFunc = HdmiUserHpdHandle; + ret = HdmiRegisterHpdCallbackFunc(handle, &callback); + if (ret != HDF_SUCCESS) { + printf("HdmiRegisterHpdCallbackFunc fail."); + } + ret = HdmiAvmuteSet(handle, true); + if (ret != HDF_SUCCESS) { + printf("HdmiAvmuteSet fail."); + } + ret = HdmiDeepColorSet(handle, HDMI_DEEP_COLOR_48BITS); + if (ret != HDF_SUCCESS) { + printf("HdmiDeepColorSet fail."); + } + ret = HdmiDeepColorGet(handle, &color); + if (ret != HDF_SUCCESS) { + printf("HdmiDeepColorGet fail."); + } + printf("HdmiDeepColorGet success, color = %d.", color); + + HdmiUserSetAttrCaseTest(handle); + + ret = HdmiStart(handle); + if (ret != HDF_SUCCESS) { + printf("HdmiStart fail."); + } + ret = HdmiReadSinkEdid(handle, data, 128); + if (ret < 0) { + printf("HdmiReadSinkEdid fail."); + } + printf("HdmiReadSinkEdid success, data[6] = %d, data[8] = %d.", data[6], data[8]); + ret = HdmiStop(handle); + if (ret != HDF_SUCCESS) { + printf("HdmiStop fail."); + } + ret = HdmiUnregisterHpdCallbackFunc(handle); + if (ret != HDF_SUCCESS) { + printf("HdmiUnregisterHpdCallbackFunc fail."); + } + HdmiClose(handle); +} + +/** + * @tc.name: HdmiStartAndStop001 + * @tc.desc: test HdmiStart/HdmiStop interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiStartAndStop001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_START_AND_STOP_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiSetAudioAttr001 + * @tc.desc: test HdmiSetAudioAttr interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiSetAudioAttr001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_SET_AUDIO_ATTR_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiSetVideoAttr001 + * @tc.desc: test HdmiSetVideoAttr interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiSetVideoAttr001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_SET_VIDEO_ATTR_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiSetHdrAttr001 + * @tc.desc: test HdmiSetHdrAttr interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiSetHdrAttr001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_SET_HDR_ATTR_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiSetAvmute001 + * @tc.desc: test HdmiSetAvmute interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiSetAvmute001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_SET_AVMUTE_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiEdidRawDataGet001 + * @tc.desc: test HdmiReadSinkEdid interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiEdidRawDataGet001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_EDID_RAW_DATA_GET_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiDeepColorSetAndGet001 + * @tc.desc: test HdmiDeepColorSet/HdmiDeepColorGet interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiDeepColorSetAndGet001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_DEEP_COLOR_SET_AND_GET_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiDeepColorSetAndGet001 + * @tc.desc: test HdmiDeepColorSet/HdmiDeepColorGet interface in kernel status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiHpdRegisterAndUngister001, TestSize.Level1) +{ + struct HdfTestMsg msg = { TEST_PAL_HDMI_TYPE, HDMI_HPD_REGISTER_AND_UNREGISTER_01, -1 }; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdmiUserTest001 + * @tc.desc: test hdmi all interface in user status. + * @tc.type: FUNC + * @tc.require: SR000G4490 + */ +HWTEST_F(HdfLiteHdmiTest, HdmiUserTest001, TestSize.Level1) +{ + HdmiUserTest(); +} diff --git a/test/unittest/platform/common/hdmi_test.c b/test/unittest/platform/common/hdmi_test.c new file mode 100644 index 000000000..4e5cc8934 --- /dev/null +++ b/test/unittest/platform/common/hdmi_test.c @@ -0,0 +1,302 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "hdmi_if.h" +#include "hdmi_test.h" + +#define HDF_LOG_TAG hdmi_test_c + +struct HdmiTestFunc { + enum HdmiTestCmd type; + int32_t (*Func)(struct HdmiTester *tester); +}; + +static DevHandle HdmiTestGetHandle(struct HdmiTester *tester) +{ + if (tester == NULL) { + HDF_LOGE("%s: tester is null", __func__); + return NULL; + } + return HdmiOpen(tester->busNum); +} + +static void HdmiTestReleaseHandle(DevHandle handle) +{ + if (handle == NULL) { + HDF_LOGE("%s: sdio handle is null", __func__); + return; + } + HdmiClose(handle); +} + +static int32_t TestHdmiStartAndStop(struct HdmiTester *tester) +{ + int32_t ret; + + ret = HdmiStart(tester->handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiStart failed ret = %d.", __func__, ret); + return ret; + } + ret = HdmiStop(tester->handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiStop failed ret = %d.", __func__, ret); + } + return ret; +} + +static int32_t TestHdmiSetAudioAttr(struct HdmiTester *tester) +{ + int32_t ret; + struct HdmiAudioAttr attr = {0}; + + attr.codingType = HDMI_AUDIO_CODING_TYPE_STREAM; + attr.ifType = HDMI_AUDIO_IF_TYPE_I2S; + attr.bitDepth = HDMI_ADIO_BIT_DEPTH_20; + attr.sampleRate = HDMI_SAMPLE_RATE_12K; + attr.channels = HDMI_AUDIO_FORMAT_CHANNEL_5; + ret = HdmiSetAudioAttribute(tester->handle, &attr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiSetAudioAttribute failed ret = %d.", __func__, ret); + } + return ret; +} + +static int32_t TestHdmiSetVideoAttr(struct HdmiTester *tester) +{ + int32_t ret; + struct HdmiVideoAttr attr = {0}; + + attr.xvycc = true; + attr.nups = HDMI_NUPS_HORIZONTAL; + attr.colorSpace = HDMI_COLOR_SPACE_YCBCR420; + attr.colorimetry = HDMI_COLORIMETRY_ITU709; + attr.quantization = HDMI_QUANTIZATION_RANGE_FULL; + ret = HdmiSetVideoAttribute(tester->handle, &attr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiSetAudioAttribute failed ret = %d.", __func__, ret); + } + return ret; +} + +static int32_t TestHdmiSetHdrAttr(struct HdmiTester *tester) +{ + int32_t ret; + struct HdmiHdrAttr attr = {0}; + + attr.mode = HDMI_HDR_MODE_DOLBY_NORMAL; + attr.userMode = HDMI_HDR_USERMODE_DOLBY; + attr.eotfType = HDMI_EOTF_HLG; + attr.colorimetry = HDMI_HDR_EXTENDED_COLORIMETRY_S_YCC_601; + attr.metadataType = HDMI_DRM_STATIC_METADATA_TYPE_1; + ret = HdmiSetHdrAttribute(tester->handle, &attr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiSetHdrAttribute failed ret=%d.", __func__, ret); + } + return ret; +} + +static int32_t TestHdmiSetAvmute(struct HdmiTester *tester) +{ + int32_t ret; + + ret = HdmiAvmuteSet(tester->handle, true); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiAvmuteSet failed ret = %d.", __func__, ret); + return ret; + } + + ret = HdmiAvmuteSet(tester->handle, false); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiAvmuteSet failed ret = %d.", __func__, ret); + } + return ret; +} + +static int32_t TestHdmiEdidRawDataGet(struct HdmiTester *tester) +{ + int32_t len; + uint8_t edid[HDMI_EDID_MAX_LEN] = {0}; + + len = HdmiReadSinkEdid(tester->handle, edid, HDMI_EDID_MAX_LEN); + if (len < 0) { + HDF_LOGE("%s: HdmiReadSinkEdid failed len = %d.", __func__, len); + return HDF_FAILURE; + } + HDF_LOGD("%s: HdmiReadSinkEdid success, len = %d, edid[1] = 0x%x.", __func__, len, edid[1]); + return HDF_SUCCESS; +} + +static int32_t TestHdmiDeepColorSetAndGet(struct HdmiTester *tester) +{ + int32_t ret; + enum HdmiDeepColor color = HDMI_DEEP_COLOR_BUTT; + + ret = HdmiDeepColorSet(tester->handle, HDMI_DEEP_COLOR_48BITS); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiDeepColorSet failed ret = %d.", __func__, ret); + } + ret = HdmiDeepColorGet(tester->handle, &color); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiDeepColorGet failed ret = %d.", __func__, ret); + } else { + HDF_LOGE("%s: HdmiDeepColorGet success, color = %d.", __func__, color); + } + return ret; +} + +static void TestHdmiHdpHandle(void *data, bool hdp) +{ + (void)data; + + if (hdp == true) { + HDF_LOGE("TestHdmiHdpHandle: hdp."); + } else { + HDF_LOGE("TestHdmiHdpHandle: unhdp."); + } +} + +static int32_t TestHdmiHpdRegisterAndUnregister(struct HdmiTester *tester) +{ + int32_t ret; + struct HdmiHpdCallbackInfo info; + + info.data = NULL; + info.callbackFunc = TestHdmiHdpHandle; + ret = HdmiRegisterHpdCallbackFunc(tester->handle, &info); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: TestHdmiHpdRegisterAndUnregister failed ret = %d.", __func__, ret); + } + ret = HdmiUnregisterHpdCallbackFunc(tester->handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HdmiUnregisterHpdCallbackFunc failed ret = %d.", __func__, ret); + } + return ret; +} + +struct HdmiTestFunc g_hdmiTestFunc[] = { + { HDMI_START_AND_STOP_01, TestHdmiStartAndStop }, + { HDMI_SET_AUDIO_ATTR_01, TestHdmiSetAudioAttr }, + { HDMI_SET_VIDEO_ATTR_01, TestHdmiSetVideoAttr }, + { HDMI_SET_HDR_ATTR_01, TestHdmiSetHdrAttr }, + { HDMI_SET_AVMUTE_01, TestHdmiSetAvmute }, + { HDMI_EDID_RAW_DATA_GET_01, TestHdmiEdidRawDataGet }, + { HDMI_DEEP_COLOR_SET_AND_GET_01, TestHdmiDeepColorSetAndGet }, + { HDMI_HPD_REGISTER_AND_UNREGISTER_01, TestHdmiHpdRegisterAndUnregister }, +}; + +static int32_t HdmiTestEntry(struct HdmiTester *tester, int32_t cmd) +{ + int32_t i; + int32_t ret = HDF_SUCCESS; + bool isFind = false; + + if (tester == NULL) { + HDF_LOGE("%s: tester is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + tester->handle = HdmiTestGetHandle(tester); + if (tester->handle == NULL) { + HDF_LOGE("%s: hdmi test get handle failed", __func__); + return HDF_FAILURE; + } + for (i = 0; i < sizeof(g_hdmiTestFunc) / sizeof(g_hdmiTestFunc[0]); i++) { + if (cmd == g_hdmiTestFunc[i].type && g_hdmiTestFunc[i].Func != NULL) { + ret = g_hdmiTestFunc[i].Func(tester); + isFind = true; + break; + } + } + if (!isFind) { + ret = HDF_ERR_NOT_SUPPORT; + HDF_LOGE("%s: cmd %d not supported", __func__, cmd); + } + HdmiTestReleaseHandle(tester->handle); + return ret; +} + +static int32_t HdmiTestFillConfig(struct HdmiTester *tester, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "busNum", &(tester->busNum), 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fill bus num failed", __func__); + return ret; + } + + HDF_LOGE("%s: busNum:%d.", __func__, tester->busNum); + return HDF_SUCCESS; +} + +static int32_t HdmiTestBind(struct HdfDeviceObject *device) +{ + static struct HdmiTester tester; + + if (device == NULL) { + HDF_LOGE("%s: device or config is null!", __func__); + return HDF_ERR_IO; + } + + device->service = &tester.service; + HDF_LOGE("%s: HDMI_TEST service init success!", __func__); + return HDF_SUCCESS; +} + +static int32_t HdmiTestInit(struct HdfDeviceObject *device) +{ + struct HdmiTester *tester = NULL; + int32_t ret; + + if (device == NULL || device->service == NULL || device->property == NULL) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + + tester = (struct HdmiTester *)device->service; + if (tester == NULL) { + HDF_LOGE("%s: tester is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + ret = HdmiTestFillConfig(tester, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed", __func__); + return ret; + } + tester->TestEntry = HdmiTestEntry; + HDF_LOGE("%s: success", __func__); + return HDF_SUCCESS; +} + +static void HdmiTestRelease(struct HdfDeviceObject *device) +{ + if (device != NULL) { + device->service = NULL; + } +} + +struct HdfDriverEntry g_hdmiTestEntry = { + .moduleVersion = 1, + .Bind = HdmiTestBind, + .Init = HdmiTestInit, + .Release = HdmiTestRelease, + .moduleName = "PLATFORM_HDMI_TEST", +}; +HDF_INIT(g_hdmiTestEntry); diff --git a/test/unittest/platform/common/hdmi_test.h b/test/unittest/platform/common/hdmi_test.h new file mode 100644 index 000000000..109138e4f --- /dev/null +++ b/test/unittest/platform/common/hdmi_test.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDMI_TEST_H +#define HDMI_TEST_H + +#include "hdf_device_desc.h" +#include "hdf_platform.h" + +enum HdmiTestCmd { + HDMI_START_AND_STOP_01 = 0, + HDMI_SET_AUDIO_ATTR_01 = 1, + HDMI_SET_VIDEO_ATTR_01 = 2, + HDMI_SET_HDR_ATTR_01 = 3, + HDMI_SET_AVMUTE_01 = 4, + HDMI_EDID_RAW_DATA_GET_01 = 5, + HDMI_DEEP_COLOR_SET_AND_GET_01 = 6, + HDMI_HPD_REGISTER_AND_UNREGISTER_01 = 7, +}; + +struct HdmiTester { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + int32_t (*TestEntry)(struct HdmiTester *tester, int32_t cmd); + uint32_t busNum; + DevHandle handle; +}; + +static inline struct HdmiTester *GetHdmiTester(void) +{ + return (struct HdmiTester *)DevSvcManagerClntGetService("HDMI_TEST"); +} + +#endif /* HDMI_TEST_H */ diff --git a/test/unittest/platform/hdf_hdmi_entry_test.c b/test/unittest/platform/hdf_hdmi_entry_test.c new file mode 100644 index 000000000..6c97f196b --- /dev/null +++ b/test/unittest/platform/hdf_hdmi_entry_test.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_hdmi_entry_test.h" +#include "hdmi_if.h" +#include "hdmi_test.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG hdf_hdmi_entry_test + +int32_t HdfHdmiUnitTestEntry(HdfTestMsg *msg) +{ + struct HdmiTester *tester = NULL; + + if (msg == NULL) { + HDF_LOGE("HdfHdmiUnitTestEntry: msg is NULL"); + return HDF_FAILURE; + } + tester = GetHdmiTester(); + if (tester == NULL || tester->TestEntry == NULL) { + HDF_LOGE("HdfHdmiUnitTestEntry: tester/TestEntry is NULL"); + msg->result = HDF_FAILURE; + return HDF_FAILURE; + } + msg->result = tester->TestEntry(tester, msg->subCmd); + return msg->result; +} diff --git a/test/unittest/platform/hdf_hdmi_entry_test.h b/test/unittest/platform/hdf_hdmi_entry_test.h new file mode 100644 index 000000000..9a4463670 --- /dev/null +++ b/test/unittest/platform/hdf_hdmi_entry_test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_HDMI_ENTRY_TEST_H +#define HDF_HDMI_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfHdmiUnitTestEntry(HdfTestMsg *msg); + +#endif // HDF_HDMI_ENTRY_TEST_H \ No newline at end of file -- Gitee From 3de7fda48c5059411eeb1958c90acee46e27bca1 Mon Sep 17 00:00:00 2001 From: chenpan0560 Date: Mon, 18 Oct 2021 16:59:41 +0800 Subject: [PATCH 099/272] Revise hdf_defconfig_patch.py file indentation issues Signed-off-by: chenpan0560 --- tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py index 4348c8a9c..e0d1cdb0c 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py @@ -60,7 +60,7 @@ class HdfDefconfigAndPatch(object): def get_config_patch(self): return os.path.join(self.root, "kernel", self.kernel, "patches") - def add_module(self, path, files): + def add_module(self, path, files): for filename in os.listdir(path): new_path = os.path.join(path, filename) if not os.path.isdir(new_path): -- Gitee From 7264530be28306238c739f9b18e7dcb809638ecf Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 18 Oct 2021 20:14:59 +0800 Subject: [PATCH 100/272] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=EF=BC=9A1.=E5=A2=9E=E5=8A=A0mipi-csi=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8D=95=E5=85=83=EF=BC=9B2.=E5=B0=86=E5=8D=95=E5=85=83?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E5=8A=A0=E5=85=A5=E6=B5=8B=E8=AF=95=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- .../unittest/common/hdf_mipi_csi_test.cpp | 206 +++++++ .../unittest/common/hdf_mipi_dsi_test.cpp | 7 - test/unittest/common/hdf_main_test.c | 6 + test/unittest/common/hdf_main_test.h | 1 + test/unittest/include/hdf_uhdf_test.h | 3 +- test/unittest/platform/common/mipi_csi_test.c | 547 ++++++++++++++++++ test/unittest/platform/common/mipi_csi_test.h | 62 ++ test/unittest/platform/common/mipi_dsi_test.c | 6 +- .../platform/hdf_mipi_csi_entry_test.c | 35 ++ .../platform/hdf_mipi_csi_entry_test.h | 15 + .../platform/hdf_mipi_dsi_entry_test.c | 1 - 11 files changed, 875 insertions(+), 14 deletions(-) create mode 100755 support/platform/test/unittest/common/hdf_mipi_csi_test.cpp create mode 100755 test/unittest/platform/common/mipi_csi_test.c create mode 100755 test/unittest/platform/common/mipi_csi_test.h create mode 100755 test/unittest/platform/hdf_mipi_csi_entry_test.c create mode 100755 test/unittest/platform/hdf_mipi_csi_entry_test.h diff --git a/support/platform/test/unittest/common/hdf_mipi_csi_test.cpp b/support/platform/test/unittest/common/hdf_mipi_csi_test.cpp new file mode 100755 index 000000000..8c661ecff --- /dev/null +++ b/support/platform/test/unittest/common/hdf_mipi_csi_test.cpp @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_uhdf_test.h" +#include + +using namespace testing::ext; + +/** + * @brief Mipi csi test case number. + * + * The sequence number is related to the test logic, which is different from the actual call. + * 1, 4, 8 and 9 need to be called according to the actual situation. + * + * @since 1.0 + */ +enum MipiCsiTestCmd { + MIPI_CSI_TEST_SET_HS_MODE = 0, + MIPI_CSI_TEST_DISABLE_MIPI_CLOCK = 1, /* for test */ + MIPI_CSI_TEST_ENABLE_MIPI_CLOCK = 2, + MIPI_CSI_TEST_RESET_RX = 3, + MIPI_CSI_TEST_DISABLE_SENSOR_CLOCK = 4, /* for test */ + MIPI_CSI_TEST_ENABLE_SENSOR_CLOCK = 5, + MIPI_CSI_TEST_RESET_SENSOR = 6, + MIPI_CSI_TEST_SET_DEV_ATTR = 7, + MIPI_CSI_TEST_SET_PHY_CMVMODE = 8, /* for test */ + MIPI_CSI_TEST_SET_EXT_DATA_TYPE = 9, /* for test */ + MIPI_CSI_TEST_UNRESET_RX = 10, + MIPI_CSI_TEST_UNRESET_SENSOR = 11, + MIPI_CSI_TEST_MAX = 12 +}; + +class HdfLiteMipiCsiTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfLiteMipiCsiTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void HdfLiteMipiCsiTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void HdfLiteMipiCsiTest::SetUp() +{ +} + +void HdfLiteMipiCsiTest::TearDown() +{ +} + +/** + * @tc.name: MipiCsiSetHsModeTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiSetHsModeTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_SET_HS_MODE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiDisableMipiClockTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiDisableMipiClockTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_DISABLE_MIPI_CLOCK, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiEnableMipiClockTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiEnableMipiClockTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_ENABLE_MIPI_CLOCK, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiResetRxTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiResetRxTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_RESET_RX, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiDisableSensorClockTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiDisableSensorClockTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_DISABLE_SENSOR_CLOCK, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiEnableSensorClockTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiEnableSensorClockTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_ENABLE_SENSOR_CLOCK, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiResetSensorTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiResetSensorTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_RESET_SENSOR, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiSetComboDevAttrTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiSetComboDevAttrTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_SET_DEV_ATTR, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiSetPhyCmvmodeTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiSetPhyCmvmodeTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_SET_PHY_CMVMODE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiSetExtDataTypeTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiSetExtDataTypeTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_SET_EXT_DATA_TYPE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiUnresetRxTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiUnresetRxTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_UNRESET_RX, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: MipiCsiUnresetSensorTest001 + * @tc.desc: mipi csi function test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteMipiCsiTest, MipiCsiUnresetSensorTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_MIPI_CSI_TYPE, MIPI_CSI_TEST_UNRESET_SENSOR, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} \ No newline at end of file diff --git a/support/platform/test/unittest/common/hdf_mipi_dsi_test.cpp b/support/platform/test/unittest/common/hdf_mipi_dsi_test.cpp index 4f394ec38..d0b009e15 100644 --- a/support/platform/test/unittest/common/hdf_mipi_dsi_test.cpp +++ b/support/platform/test/unittest/common/hdf_mipi_dsi_test.cpp @@ -7,14 +7,7 @@ */ #include "hdf_uhdf_test.h" -#include -#include -#include -#include #include -#include -#include -#include "hdf_io_service_if.h" using namespace testing::ext; diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 205ac2ded..804c8f8c9 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -44,6 +44,9 @@ #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_DSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI) #include "hdf_mipi_dsi_entry_test.h" #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_CSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_CSI) +#include "hdf_mipi_csi_entry_test.h" +#endif #if (defined(LOSCFG_STORAGE_EMMC) && defined(LOSCFG_DRIVERS_HDF_PLATFORM_EMMC)) || \ defined(CONFIG_DRIVERS_HDF_PLATFORM_EMMC) #include "hdf_emmc_entry_test.h" @@ -97,6 +100,9 @@ HdfTestFuncList g_hdfTestFuncList[] = { #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_DSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI) { TEST_PAL_MIPI_DSI_TYPE, HdfMipiDsiEntry }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_MIPI_CSI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_MIPI_CSI) + { TEST_PAL_MIPI_CSI_TYPE, HdfMipiCsiEntry }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_SDIO) || defined(CONFIG_DRIVERS_HDF_PLATFORM_SDIO) { TEST_PAL_SDIO_TYPE, HdfSdioUnitTestEntry }, #endif diff --git a/test/unittest/common/hdf_main_test.h b/test/unittest/common/hdf_main_test.h index c54969825..3447e3594 100644 --- a/test/unittest/common/hdf_main_test.h +++ b/test/unittest/common/hdf_main_test.h @@ -58,6 +58,7 @@ typedef enum { TEST_PAL_ADC_TYPE = 20, TEST_PAL_WDT_TYPE = 21, TEST_PAL_I3C_TYPE = 22, + TEST_PAL_MIPI_CSI_TYPE = 23, TEST_PAL_END = 200, TEST_OSAL_BEGIN = TEST_PAL_END, #define HDF_OSAL_TEST_ITEM(v) (TEST_OSAL_BEGIN + (v)) diff --git a/test/unittest/include/hdf_uhdf_test.h b/test/unittest/include/hdf_uhdf_test.h index 0c22f0cb9..73a762633 100644 --- a/test/unittest/include/hdf_uhdf_test.h +++ b/test/unittest/include/hdf_uhdf_test.h @@ -54,11 +54,12 @@ enum HdfTestSubModuleCmd { TEST_PAL_ADC_TYPE = 20, TEST_PAL_WDT_TYPE = 21, TEST_PAL_I3C_TYPE = 22, + TEST_PAL_MIPI_CSI_TYPE = 23, TEST_PAL_END = 200, TEST_OSAL_BEGIN = TEST_PAL_END, #define HDF_OSAL_TEST_ITEM(v) (TEST_OSAL_BEGIN + (v)) TEST_OSAL_ITEM = HDF_OSAL_TEST_ITEM(1), - TEST_OSAL_END = 400, + TEST_OSAL_END = 400, TEST_WIFI_BEGIN = TEST_OSAL_END, TEST_WIFI_TYPE = TEST_WIFI_BEGIN + 1, TEST_WIFI_END = 600, diff --git a/test/unittest/platform/common/mipi_csi_test.c b/test/unittest/platform/common/mipi_csi_test.c new file mode 100755 index 000000000..cb028a06d --- /dev/null +++ b/test/unittest/platform/common/mipi_csi_test.c @@ -0,0 +1,547 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "mipi_csi_test.h" +#include "hdf_log.h" +#include "osal_time.h" +#include "securec.h" + +#define HDF_LOG_TAG mipi_csi_test +#define SEQ_OUTPUT_DELAY 100 /* Delay time of sequential output, unit: ms */ + +// Input interface type of RX. +enum InterfaceType { + INTERFACE_MIPI = 0, + INTERFACE_LVDS, + INTERFACE_CMOS, + INTERFACE_BUTT +}; + +static int32_t MipiCsiTestSetUp(struct MipiCsiTest *test) +{ + HDF_LOGI("%s: enter!", __func__); + + if (test == NULL) { + HDF_LOGE("%s: test is NULL.", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (test->handle == NULL) { + HDF_LOGE("%s: enter! cntlrId:0x%x", __func__, test->cntlrId); + test->cntlrId = 0; + test->handle = MipiCsiOpen(test->cntlrId); + if (test->handle == NULL) { + HDF_LOGE("%s: failed.", __func__); + return HDF_FAILURE; + } + } + + test->fails = 0; + HDF_LOGD("%s: cntlrId:0x%x", __func__, test->cntlrId); + return HDF_SUCCESS; +} + +static void MipiCsiTestTearDown(struct MipiCsiTest *test) +{ + if (test == NULL) { + return; + } + if (test->handle != NULL) { + MipiCsiClose(test->handle); + test->handle = NULL; + } +} + +/** + * @brief Initialize the device parameters applying LVDS protocol. + * + * This is not fully tested! + * + * @since 1.0 + */ +static void InitLvdsDevAttr(LvdsDevAttr *lvdsAttr) +{ + int i; + int j; + int k; + LvdsDevAttr attr; + + if (lvdsAttr == NULL) { + return; + } + + (void)memset_s(&attr, sizeof(LvdsDevAttr), 0, sizeof(LvdsDevAttr)); + // Hi3516CV500 (DATA_TYPE_RAW_12BIT), Hi3516EV200 (DATA_TYPE_RAW_12BIT) + attr.inputDataType = DATA_TYPE_RAW_12BIT; + attr.wdrMode = HI_WDR_MODE_NONE; + // LVDS synchronization mode. LVDS_SYNC_MODE_SOF, LVDS_SYNC_MODE_SAV + attr.syncMode = LVDS_SYNC_MODE_SOF; + // LVDS Vsync type. LVDS_VSYNC_NORMAL, LVDS_VSYNC_SHARE, LVDS_VSYNC_HCONNECT + attr.vsyncAttr.syncType = LVDS_VSYNC_NORMAL; + // hconnect vsync blanking len, valid when the syncType is LVDS_VSYNC_HCONNECT + // This is not fully tested! + if (attr.vsyncAttr.syncType == LVDS_VSYNC_HCONNECT) { + attr.vsyncAttr.hblank1 = 0; + attr.vsyncAttr.hblank2 = 0; + } + // frame identification code: LVDS_FID_NONE, LVDS_FID_IN_SAV, LVDS_FID_IN_DATA + attr.fidAttr.fidType = LVDS_FID_NONE; + // Sony DOL has the Frame Information Line, in DOL H-Connection mode, should + // configure this flag as false to disable output the Frame Information Line. + // This is not fully tested! + attr.fidAttr.outputFil = 'm'; + // LVDS bit size end mode: LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIG + attr.dataEndian = LVDS_ENDIAN_LITTLE; + // sync code endian: little/big, LVDS_ENDIAN_LITTLE, LVDS_ENDIAN_BIG + attr.syncCodeEndian = LVDS_ENDIAN_LITTLE; + // laneId: -1 - disable + attr.laneId[0] = 0; /* 0 -- laneId 0 */ + attr.laneId[1] = 1; /* 1 -- laneId 1 */ + attr.laneId[2] = 2; /* 2 -- laneId 2 */ + attr.laneId[3] = 3; /* 3 -- laneId 3 */ + + /** each vc has 4 params, syncCode[i]: + syncMode is SYNC_MODE_SOF: SOF, EOF, SOL, EOL + syncMode is SYNC_MODE_SAV: invalid sav, invalid eav, valid sav, valid eav */ + // This is not fully tested! + for (i = 0; i < LVDS_LANE_NUM; i++) { + for (j = 0; j < WDR_VC_NUM; j++) { + for (k = 0; k < SYNC_CODE_NUM; k++) { + attr.syncCode[i][j][k] = 0; /* 0 -- frame0 sof */ + } + } + } + + *lvdsAttr = attr; +} + +/** + * @brief Initialize MIPI device attributes. + * + * Data type (DT: data type) + * The data type describes the format and content of load data. Up to 64 data types are supported. + * There are only two data types for short packets, and the others belong to long packets. + * + * @Data type describe + * 0x00 – 0x07 Synchronous short packet data type + * 0x08 – 0x0F General short packet data type + * 0x10 – 0x17 General long packet data type + * 0x18 – 0x1F YUV data + * 0x20 – 0x27 RGB data + * 0x28 – 0x2F Raw data + * 0x30 – 0x37 User defined byte based data type + * 0x38 – 0x3F Reserved + * + * @since 1.0 + */ +static void InitMipiDevAttr(MipiDevAttr *mipiAttr) +{ + MipiDevAttr attr; + if (mipiAttr == NULL) { + return; + } + + HDF_LOGI("%s: enter.", __func__); + (void)memset_s(&attr, sizeof(MipiDevAttr), 0, sizeof(MipiDevAttr)); + // Hi3516CV500 (DATA_TYPE_RAW_12BIT), Hi3516EV200 (DATA_TYPE_RAW_12BIT) + attr.inputDataType = DATA_TYPE_RAW_12BIT; + // Hi3516CV500 (HI_MIPI_WDR_MODE_NONE), Hi3516EV200 (HI_MIPI_WDR_MODE_NONE) + attr.wdrMode = HI_MIPI_WDR_MODE_NONE; + // laneId: -1 - disable + // Hi3516CV500 (0, 1, 2, 3), Hi3516EV200 (0, 1, -1, -1) + attr.laneId[0] = 0; /* 0 -- laneId 0 */ + attr.laneId[1] = 1; /* 1 -- laneId 1 */ + attr.laneId[2] = 2; /* 2 -- laneId 2 */ + attr.laneId[3] = 3; /* 3 -- laneId 3 */ + + // Used by the HI_MIPI_WDR_MODE_DT, This is not fully tested! + if (attr.wdrMode == HI_MIPI_WDR_MODE_DT) { + attr.dataType[0] = 0x39; /* 0x39 -- data type reserved */ + attr.dataType[1] = 0x39; /* 0x39 -- data type reserved */ + attr.dataType[2] = 0x39; /* 0x39 -- data type reserved */ + attr.dataType[3] = 0x39; /* 0x39 -- data type reserved */ + } + + *mipiAttr = attr; +} + +static int MipiGetIntputModeType(InputMode inputMode) +{ + switch (inputMode) { + case INPUT_MODE_SUBLVDS: + case INPUT_MODE_LVDS: + case INPUT_MODE_HISPI: + return INTERFACE_LVDS; + case INPUT_MODE_MIPI: + return INTERFACE_MIPI; + case INPUT_MODE_CMOS: + case INPUT_MODE_BT1120: + case INPUT_MODE_BT656: + case INPUT_MODE_BYPASS: + return INTERFACE_CMOS; + default: + break; + } + + return INTERFACE_BUTT; +} + +static void InitComboDevAttr(struct MipiCsiTest *test) +{ + enum InterfaceType interType; + ComboDevAttr attr; + + (void)memset_s(&attr, sizeof(ComboDevAttr), 0, sizeof(ComboDevAttr)); + // Hi3516CV500(0), Hi3516EV200(0) + attr.devno = 0; + // Hi3516CV500(INPUT_MODE_MIPI), Hi3516EV200(INPUT_MODE_MIPI) + attr.inputMode = INPUT_MODE_MIPI; + // Hi3516CV500(MIPI_DATA_RATE_X1), Hi3516EV200(MIPI_DATA_RATE_X1) + attr.dataRate = MIPI_DATA_RATE_X1; + // Hi3516CV500 (0, 204, 2592, 1944), Hi3516EV200 (0, 204, 2304, 1296), Hi3516DV300-imx335 (0, 0, 2592, 1944) + attr.imgRect.x = 0; /* 0: image sensor left-top positon */ + attr.imgRect.y = 0; /* 0: image sensor right-top position */ + attr.imgRect.width = 2592; /* 2592: image sensor width size */ + attr.imgRect.height = 1944; /* 1944: image sensor height size */ + + interType = MipiGetIntputModeType(attr.inputMode); + if (interType == INTERFACE_MIPI) { + HDF_LOGI("%s: call[InitMipiDevAttr].", __func__); + InitMipiDevAttr(&attr.mipiAttr); + } else if (interType == INTERFACE_LVDS) { + HDF_LOGI("%s: call[InitLvdsDevAttr].", __func__); + InitLvdsDevAttr(&attr.lvdsAttr); + } else { + HDF_LOGE("%s: interType = %d is error!", __func__, attr.inputMode); + } + + test->attr = attr; +} + +static int32_t MipiCsiSetComboDevAttrTest(struct MipiCsiTest *test) +{ + int32_t ret; + + InitComboDevAttr(test); + ret = MipiCsiSetComboDevAttr(test->handle, &(test->attr)); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + + HDF_LOGE("%s: failed.", __func__); + return ret; +} + +static int32_t MipiCsiSetPhyCmvmodeTest(struct MipiCsiTest *test) +{ + int32_t ret; + + test->devno = 0; + // PHY_CMV_GE1200MV or PHY_CMV_LT1200MV + test->cmvMode = PHY_CMV_GE1200MV; + ret = MipiCsiSetPhyCmvmode(test->handle, test->devno, test->cmvMode); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiResetSensorTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // snsResetSource select 0 or 1, and must be less than SNS_MAX_RST_SOURCE_NUM + test->snsResetSource = 0; + ret = MipiCsiResetSensor(test->handle, test->snsResetSource); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiUnresetSensorTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // snsResetSource select 0 or 1, and must be less than SNS_MAX_RST_SOURCE_NUM + test->snsResetSource = 0; + ret = MipiCsiUnresetSensor(test->handle, test->snsResetSource); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiResetRxTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // comboDev select 0 or 1, and must be less than MIPI_RX_MAX_DEV_NUM + test->comboDev = 0; + ret = MipiCsiResetRx(test->handle, test->comboDev); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiUnresetRxTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // comboDev select 0 or 1, and must be less than MIPI_RX_MAX_DEV_NUM + test->comboDev = 0; + ret = MipiCsiUnresetRx(test->handle, test->comboDev); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiSetHsModeTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // laneDivideMode: Hi3516CV500(LANE_DIVIDE_MODE_0), Hi3516EV200(LANE_DIVIDE_MODE_0) + test->laneDivideMode = LANE_DIVIDE_MODE_0; + ret = MipiCsiSetHsMode(test->handle, test->laneDivideMode); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiEnableMipiClockTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // comboDev select 0 or 1, and must be less than MIPI_RX_MAX_DEV_NUM + test->comboDev = 0; + ret = MipiCsiEnableClock(test->handle, test->comboDev); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiDisableMipiClockTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // comboDev select 0 or 1, and must be less than MIPI_RX_MAX_DEV_NUM + test->comboDev = 0; + ret = MipiCsiDisableClock(test->handle, test->comboDev); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiEnableSensorClockTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // snsClkSource select 0 or 1, and must be less than SNS_MAX_CLK_SOURCE_NUM + test->snsClkSource = 0; + ret = MipiCsiEnableSensorClock(test->handle, test->snsClkSource); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiDisableSensorClockTest(struct MipiCsiTest *test) +{ + int32_t ret; + + // snsClkSource select 0 or 1, and must be less than SNS_MAX_CLK_SOURCE_NUM + test->snsClkSource = 0; + ret = MipiCsiDisableSensorClock(test->handle, test->snsClkSource); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiSetExtDataTypeTest(struct MipiCsiTest *test) +{ + int32_t ret; + ExtDataType dataType; + dataType.devno = 0; + dataType.num = 0; + + // extDataBitWidth set 8, 10, 12, 14 or 16. + dataType.extDataBitWidth[0] = 12; /* 12:magic bit width */ + dataType.extDataBitWidth[1] = 12; /* 12:magic bit width */ + dataType.extDataBitWidth[2] = 12; /* 12:magic bit width */ + + dataType.extDataType[0] = 0x39; /* 0x39 -- data type reserved */ + dataType.extDataType[1] = 0x39; /* 0x39 -- data type reserved */ + dataType.extDataType[2] = 0x39; /* 0x39 -- data type reserved */ + test->dataType = dataType; + + ret = MipiCsiSetExtDataType(test->handle, &test->dataType); + if ((ret == HDF_SUCCESS) || (ret == HDF_ERR_NOT_SUPPORT)) { + return HDF_SUCCESS; + } + HDF_LOGE("%s: failed.", __func__); + + return ret; +} + +static int32_t MipiCsiTestByCmd(struct MipiCsiTest *test, uint8_t cmd) +{ + int32_t ret = HDF_FAILURE; + + if (test == NULL) { + HDF_LOGE("%s: test is NULL", __func__); + return ret; + } + + HDF_LOGI("%s: test cmd %u, enter.", __func__, cmd); + switch (cmd) { + case MIPI_CSI_TEST_SET_HS_MODE: + ret = MipiCsiSetHsModeTest(test); + break; + case MIPI_CSI_TEST_DISABLE_MIPI_CLOCK: + ret = MipiCsiDisableMipiClockTest(test); + break; + case MIPI_CSI_TEST_ENABLE_MIPI_CLOCK: + ret = MipiCsiEnableMipiClockTest(test); + break; + case MIPI_CSI_TEST_RESET_RX: + ret = MipiCsiResetRxTest(test); + break; + case MIPI_CSI_TEST_DISABLE_SENSOR_CLOCK: + ret = MipiCsiDisableSensorClockTest(test); + break; + case MIPI_CSI_TEST_ENABLE_SENSOR_CLOCK: + ret = MipiCsiEnableSensorClockTest(test); + break; + case MIPI_CSI_TEST_RESET_SENSOR: + ret = MipiCsiResetSensorTest(test); + break; + case MIPI_CSI_TEST_SET_DEV_ATTR: + ret = MipiCsiSetComboDevAttrTest(test); + break; + case MIPI_CSI_TEST_SET_PHY_CMVMODE: + ret = MipiCsiSetPhyCmvmodeTest(test); + break; + case MIPI_CSI_TEST_SET_EXT_DATA_TYPE: + ret = MipiCsiSetExtDataTypeTest(test); + break; + case MIPI_CSI_TEST_UNRESET_RX: + ret = MipiCsiUnresetRxTest(test); + break; + case MIPI_CSI_TEST_UNRESET_SENSOR: + ret = MipiCsiUnresetSensorTest(test); + break; + default: + HDF_LOGE("%s: not support", __func__); + break; + } + HDF_LOGI("%s: test cmd %u, ret %d done.", __func__, cmd, ret); + + return ret; +} + +static int32_t MipiCsiTestDoTest(struct MipiCsiTest *test, uint8_t cmd) +{ + int32_t ret; + OsalMSleep(SEQ_OUTPUT_DELAY); + + if (test == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + +#ifdef MIPI_CSI_TEST_SELF + int32_t i; + if (cmd != 0) { + return HDF_SUCCESS; + } + ret = MipiCsiTestSetUp(test); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: setup fail!", __func__); + return ret; + } + + for (i = 0; i < test->total; i++) { + if (MipiCsiTestByCmd(test, i) != HDF_SUCCESS) { + test->fails++; + } + } + HDF_LOGI("\n\n%s: **********PASS:%u FAIL:%u**************\n\n", + __func__, test->total - test->fails, test->fails); + ret = (test->fails > 0) ? HDF_FAILURE : HDF_SUCCESS; + MipiCsiTestTearDown(test); +#else + if (cmd == 0) { + ret = MipiCsiTestSetUp(test); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [MipiCsiTestSetUp] failed!", __func__); + return ret; + } + } + ret = MipiCsiTestByCmd(test, cmd); + if (cmd == (test->total - 1)) { + MipiCsiTestTearDown(test); + } +#endif + OsalMSleep(SEQ_OUTPUT_DELAY); + + return ret; +} + +static int32_t MipiCsiTestBind(struct HdfDeviceObject *device) +{ + static struct MipiCsiTest test; + + test.cntlrId = 0; + test.total = MIPI_CSI_TEST_MAX; + test.doTest = MipiCsiTestDoTest; + device->service = &test.service; +#ifdef MIPI_CSI_TEST_SELF + HDF_LOGI("%s: test on init!", __func__); + test.doTest(&test, -1); +#endif + return HDF_SUCCESS; +} + +static int32_t MipiCsiTestInit(struct HdfDeviceObject *device) +{ + (void)device; + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_mipiCsiTestEntry = { + .moduleVersion = 1, + .Bind = MipiCsiTestBind, + .Init = MipiCsiTestInit, + .moduleName = "PLATFORM_MIPI_CSI_TEST", +}; +HDF_INIT(g_mipiCsiTestEntry); diff --git a/test/unittest/platform/common/mipi_csi_test.h b/test/unittest/platform/common/mipi_csi_test.h new file mode 100755 index 000000000..81324f2c4 --- /dev/null +++ b/test/unittest/platform/common/mipi_csi_test.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef MIPI_CSI_TEST_H +#define MIPI_CSI_TEST_H + +#include "hdf_device_desc.h" +#include "mipi_csi_if.h" + +/** + * @brief Pal mipi csi test case number. + * + * The sequence number is related to the test logic, which is different from the actual call. + * 1, 4, 8 and 9 need to be called according to the actual situation. + * + * @since 1.0 + */ +enum MipiCsiTestCmd { + MIPI_CSI_TEST_SET_HS_MODE = 0, + MIPI_CSI_TEST_DISABLE_MIPI_CLOCK = 1, /* for test */ + MIPI_CSI_TEST_ENABLE_MIPI_CLOCK = 2, + MIPI_CSI_TEST_RESET_RX = 3, + MIPI_CSI_TEST_DISABLE_SENSOR_CLOCK = 4, /* for test */ + MIPI_CSI_TEST_ENABLE_SENSOR_CLOCK = 5, + MIPI_CSI_TEST_RESET_SENSOR = 6, + MIPI_CSI_TEST_SET_DEV_ATTR = 7, + MIPI_CSI_TEST_SET_PHY_CMVMODE = 8, /* for test */ + MIPI_CSI_TEST_SET_EXT_DATA_TYPE = 9, /* for test */ + MIPI_CSI_TEST_UNRESET_RX = 10, + MIPI_CSI_TEST_UNRESET_SENSOR = 11, + MIPI_CSI_TEST_MAX = 12, +}; + +struct MipiCsiTest { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + int32_t (*doTest)(struct MipiCsiTest *test, uint8_t cmd); + DevHandle handle; + uint32_t total; + uint32_t fails; + + uint8_t cntlrId; + ComboDevAttr attr; + uint8_t devno; + PhyCmvMode cmvMode; + ExtDataType dataType; + LaneDivideMode laneDivideMode; + uint8_t comboDev; + uint8_t snsClkSource; + uint8_t snsResetSource; +}; + +static inline struct MipiCsiTest *MipiCsiTestServiceGet(void) +{ + return (struct MipiCsiTest *)DevSvcManagerClntGetService("PLATFORM_MIPI_CSI_TEST"); +} +#endif /* MIPI_CSI_TEST_H */ diff --git a/test/unittest/platform/common/mipi_dsi_test.c b/test/unittest/platform/common/mipi_dsi_test.c index b991e1e41..21319289d 100644 --- a/test/unittest/platform/common/mipi_dsi_test.c +++ b/test/unittest/platform/common/mipi_dsi_test.c @@ -6,12 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "osal_mem.h" -#include "device_resource_if.h" -#include "hdf_base.h" -#include "hdf_device_desc.h" -#include "hdf_log.h" #include "mipi_dsi_test.h" +#include "hdf_log.h" #define HDF_LOG_TAG mipi_dsi_test diff --git a/test/unittest/platform/hdf_mipi_csi_entry_test.c b/test/unittest/platform/hdf_mipi_csi_entry_test.c new file mode 100755 index 000000000..780221843 --- /dev/null +++ b/test/unittest/platform/hdf_mipi_csi_entry_test.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_mipi_csi_entry_test.h" +#include "hdf_log.h" +#include "mipi_csi_test.h" + +#define HDF_LOG_TAG hdf_mipi_csi_entry_test + +int32_t HdfMipiCsiEntry(HdfTestMsg *msg) +{ + int32_t ret; + struct MipiCsiTest *test = NULL; + + if (msg == NULL) { + return HDF_FAILURE; + } + + test = MipiCsiTestServiceGet(); + if (test == NULL) { + HDF_LOGE("%s: get service fail!", __func__); + return HDF_FAILURE; + } + + HDF_LOGI("%s: call [doTest]", __func__); + ret = test->doTest(test, msg->subCmd); + msg->result = (int8_t)ret; + + return ret; +} diff --git a/test/unittest/platform/hdf_mipi_csi_entry_test.h b/test/unittest/platform/hdf_mipi_csi_entry_test.h new file mode 100755 index 000000000..c31a73106 --- /dev/null +++ b/test/unittest/platform/hdf_mipi_csi_entry_test.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_MIPI_CSI_ENTRY_TEST_H +#define HDF_MIPI_CSI_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfMipiCsiEntry(HdfTestMsg *msg); +#endif // HDF_MIPI_CSI_ENTRY_TEST_H \ No newline at end of file diff --git a/test/unittest/platform/hdf_mipi_dsi_entry_test.c b/test/unittest/platform/hdf_mipi_dsi_entry_test.c index c4001c213..ff2a8856b 100644 --- a/test/unittest/platform/hdf_mipi_dsi_entry_test.c +++ b/test/unittest/platform/hdf_mipi_dsi_entry_test.c @@ -8,7 +8,6 @@ #include "hdf_mipi_dsi_entry_test.h" #include "hdf_log.h" -#include "mipi_dsi_if.h" #include "mipi_dsi_test.h" #define HDF_LOG_TAG hdf_mipi_dsi_entry_test -- Gitee From 1cb57f7befc3eccad97ee31b665c343e886edb57 Mon Sep 17 00:00:00 2001 From: yufengs Date: Tue, 19 Oct 2021 08:55:27 +0800 Subject: [PATCH 101/272] Modify USB DDK CI 2021-10-18 Change-Id: Ie3c92a7ea0db4ae7b4a6b16369ff9aabe8495f47 Signed-off-by: yufengs --- .../usb/device/include/usb_device_lite_cdcacm_test.h | 1 + .../usb/device/src/usb_device_lite_cdcacm_test.c | 12 ++++++------ .../usb/device/src/usb_device_lite_sdk_if_test.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h index a04d9c16d..68e8ca4c4 100755 --- a/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h +++ b/test/unittest/model/usb/device/include/usb_device_lite_cdcacm_test.h @@ -52,6 +52,7 @@ #define ACM_DATA_IDX 2 #define ACM_IAD_IDX 3 +#define REQUEST_ALLOC_PIPE ((uint8_t)(0x20)) #define REQUEST_ALLOC_LENGTH ((uint32_t)(0x0800)) struct Serial { diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index d2d6bbba5..a27c03898 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -335,31 +335,31 @@ static struct Serial *SerialAlloc(void) return port; } -static void ParsePipes(struct AcmDevice *acmDevice, struct UsbFnInterface *fnIface, UsbFnInterfaceHandle handle) +static void ParsePipes(struct AcmDevice *acmDevice, const struct UsbFnInterface *fnIface, UsbFnInterfaceHandle handle) { uint32_t j; int ret; struct UsbFnPipeInfo pipeInfo = {0}; for (j = 0; j < fnIface->info.numPipes; j++) { - ret = UsbFnGetInterfacePipeInfo(fnIface, j, &pipeInfo); + ret = UsbFnGetInterfacePipeInfo((struct UsbFnInterface *)fnIface, j, &pipeInfo); if (ret != HDF_SUCCESS) { return; } if (pipeInfo.type == USB_PIPE_TYPE_INTERRUPT) { acmDevice->notifyPipe.id = pipeInfo.id; acmDevice->notifyPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->ctrlIface.fn = fnIface; + acmDevice->ctrlIface.fn = (struct UsbFnInterface *)fnIface; acmDevice->ctrlIface.handle = handle; } else if (pipeInfo.type == USB_PIPE_TYPE_BULK) { if (pipeInfo.dir == USB_PIPE_DIRECTION_IN) { acmDevice->dataInPipe.id = pipeInfo.id; acmDevice->dataInPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->dataIface.fn = fnIface; + acmDevice->dataIface.fn = (struct UsbFnInterface *)fnIface; acmDevice->dataIface.handle = handle; } else { acmDevice->dataOutPipe.id = pipeInfo.id; acmDevice->dataOutPipe.maxPacketSize = pipeInfo.maxPacketSize; - acmDevice->dataIface.fn = fnIface; + acmDevice->dataIface.fn = (struct UsbFnInterface *)fnIface; acmDevice->dataIface.handle = handle; } } @@ -601,7 +601,7 @@ static struct UsbFnRequest *GetCtrlReq(struct AcmDevice *acm) return req; } -static int Setup(struct AcmDevice *acm, struct UsbFnCtrlRequest *setup) +static int Setup(struct AcmDevice *acm, const struct UsbFnCtrlRequest *setup) { struct UsbFnRequest *req = NULL; struct CtrlInfo *ctrlInfo = NULL; diff --git a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c index f5e8fc53e..9f46ec60c 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_sdk_if_test.c @@ -1125,7 +1125,7 @@ int32_t UsbFnDviceTestAllocRequest005(void) HDF_LOGE("%s: ctrlIface.handle is invail", __func__); return HDF_FAILURE; } - req = UsbFnAllocRequest(g_acmDevice->ctrlIface.handle, 0x20, REQUEST_ALLOC_LENGTH); + req = UsbFnAllocRequest(g_acmDevice->ctrlIface.handle, REQUEST_ALLOC_PIPE, REQUEST_ALLOC_LENGTH); if (req != NULL) { HDF_LOGE("%s: alloc req success!!", __func__); ret = UsbFnFreeRequest(req); @@ -1192,7 +1192,7 @@ int32_t UsbFnDviceTestAllocRequest008(void) return HDF_FAILURE; } length = g_acmDevice->dataOutPipe.maxPacketSize; - req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, 0x20, length); + req = UsbFnAllocRequest(g_acmDevice->dataIface.handle, REQUEST_ALLOC_PIPE, length); if (req != NULL) { HDF_LOGE("%s: alloc req success!!", __func__); ret = UsbFnFreeRequest(req); -- Gitee From f283d3b202b3966f0c7c57506cb58c429247c8c5 Mon Sep 17 00:00:00 2001 From: lzl Date: Tue, 19 Oct 2021 07:19:08 +0000 Subject: [PATCH 102/272] modify hdmi code Signed-off-by: lzl --- support/platform/include/hdmi/hdmi_dfm.h | 1 + 1 file changed, 1 insertion(+) diff --git a/support/platform/include/hdmi/hdmi_dfm.h b/support/platform/include/hdmi/hdmi_dfm.h index f8592a658..c40456a56 100644 --- a/support/platform/include/hdmi/hdmi_dfm.h +++ b/support/platform/include/hdmi/hdmi_dfm.h @@ -9,6 +9,7 @@ #ifndef HDMI_DFM_H #define HDMI_DFM_H +#include "hdmi_common.h" #include "hdmi_if.h" #ifdef __cplusplus -- Gitee From a97941709fc66109f67aec488da1cc06396fa8b5 Mon Sep 17 00:00:00 2001 From: lzl Date: Wed, 20 Oct 2021 06:16:03 +0000 Subject: [PATCH 103/272] clean HDMI code warning Signed-off-by: lzl --- support/platform/src/hdmi/hdmi_cec.c | 1 + support/platform/src/hdmi/hdmi_if.c | 1 - test/unittest/platform/common/hdmi_test.c | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index b91093f33..248608eb1 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -211,6 +211,7 @@ static bool HdmiCecCheckSomeSpecialfMsgLen(struct HdmiCecMsg *msg, uint8_t opcod break; case HDMI_CEC_OPCODE_RECORD_ON: ret = HdmiCecCheckRecordOnMsgLen(msg); + break; default: break; } diff --git a/support/platform/src/hdmi/hdmi_if.c b/support/platform/src/hdmi/hdmi_if.c index add9587e2..9a3d7a7f3 100644 --- a/support/platform/src/hdmi/hdmi_if.c +++ b/support/platform/src/hdmi/hdmi_if.c @@ -8,7 +8,6 @@ #include "hdmi_if.h" #ifndef __USER__ -#include "devsvc_manager_clnt.h" #include "hdmi_core.h" #endif #include "hdf_base.h" diff --git a/test/unittest/platform/common/hdmi_test.c b/test/unittest/platform/common/hdmi_test.c index 4e5cc8934..e46fe95a4 100644 --- a/test/unittest/platform/common/hdmi_test.c +++ b/test/unittest/platform/common/hdmi_test.c @@ -9,7 +9,6 @@ #include "device_resource_if.h" #include "hdf_base.h" #include "hdf_log.h" -#include "osal_mem.h" #include "osal_time.h" #include "hdmi_if.h" #include "hdmi_test.h" -- Gitee From 107f503d4d981511496ba48f0c9358758b069667 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 21 Oct 2021 09:50:41 +0800 Subject: [PATCH 104/272] clear the warings of reviewbot Signed-off-by: YOUR_NAME --- test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c index c41032459..c08aa37e2 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c @@ -7,11 +7,7 @@ */ #include "hcs_parser_test.h" -#include "device_resource_if.h" #include "hcs_config_test.h" -#include "hdf_base.h" -#include "hdf_log.h" -#include "osal_mem.h" // add test case entry HdfTestCaseList g_hdfConfigTestCaseList[] = { -- Gitee From dfd8512d3f45b26d03a43ae2f1755d7921b7ed5f Mon Sep 17 00:00:00 2001 From: vb6174 Date: Thu, 21 Oct 2021 12:50:18 +0000 Subject: [PATCH 105/272] audio device model update Signed-off-by: vb6174 --- model/audio/common/src/audio_accessory_base.c | 14 +++- model/audio/common/src/audio_platform_base.c | 1 - model/audio/core/src/audio_host.c | 9 ++- .../test/unittest/common/audio_core_test.cpp | 64 +++++++++---------- .../test/unittest/common/audio_host_test.cpp | 4 +- .../test/unittest/common/audio_parse_test.cpp | 2 +- .../dispatch/src/audio_stream_dispatch.c | 6 +- .../common/audio_stream_dispatch_test.cpp | 5 +- model/audio/sapm/src/audio_sapm.c | 20 +++--- .../test/unittest/common/audio_sapm_test.cpp | 13 ++-- test/unittest/common/hdf_main_test.c | 2 + test/unittest/common/hdf_main_test.h | 1 + 12 files changed, 81 insertions(+), 60 deletions(-) diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 715440022..aa0773774 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -7,12 +7,16 @@ */ #include "audio_accessory_base.h" -#include "audio_device_log.h" +#include "audio_core.h" #define HDF_LOG_TAG audio_accessory_base int32_t FormatToBitWidth(enum AudioFormat format, uint16_t *bitWidth) { + if (bitWidth == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL"); + return HDF_FAILURE; + } // current set default format(standard) for 16/24 bit switch (format) { case AUDIO_FORMAT_PCM_16_BIT: @@ -22,7 +26,7 @@ int32_t FormatToBitWidth(enum AudioFormat format, uint16_t *bitWidth) *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; break; default: - AUDIO_DEVICE_LOG_ERR("format: %d is not support.", format); + AUDIO_DRIVER_LOG_ERR("format: %d is not support.", format); return HDF_ERR_NOT_SUPPORT; } return HDF_SUCCESS; @@ -30,6 +34,10 @@ int32_t FormatToBitWidth(enum AudioFormat format, uint16_t *bitWidth) int32_t RateToFrequency(uint32_t rate, uint16_t *freq) { + if (freq == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL"); + return HDF_FAILURE; + } switch (rate) { case I2S_SAMPLE_FREQUENCY_8000: *freq = I2S_SAMPLE_FREQUENCY_REG_VAL_8000; @@ -68,7 +76,7 @@ int32_t RateToFrequency(uint32_t rate, uint16_t *freq) *freq = I2S_SAMPLE_FREQUENCY_REG_VAL_96000; break; default: - AUDIO_DEVICE_LOG_ERR("rate: %d is not support.", rate); + AUDIO_DRIVER_LOG_ERR("rate: %d is not support.", rate); return HDF_ERR_NOT_SUPPORT; } return HDF_SUCCESS; diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 3f6747519..6163fdf72 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -74,6 +74,5 @@ int32_t AudioDataBigEndianChange(char *srcData, uint32_t audioLen, enum DataBitW } break; } - AUDIO_DRIVER_LOG_DEBUG("audioLen = %d\n", audioLen); return HDF_SUCCESS; } diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index 5ef6da851..574cbdf1e 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -41,6 +41,7 @@ struct AudioCard *GetCardInstance(const char *serviceName) return audioCard; } } + ADM_LOG_ERR("serviceName is %s.", serviceName); return NULL; } @@ -387,8 +388,12 @@ static int32_t AudioDriverInit(struct HdfDeviceObject *device) } /* Bind specific codec、platform and dai device */ - AudioBindDaiLink(audioCard, &(audioCard->configData)); - if (!audioCard->rtd->complete) { + ret = AudioBindDaiLink(audioCard, &(audioCard->configData)); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("AudioBindDaiLink fail ret=%d", ret); + return HDF_FAILURE; + } + if (audioCard->rtd == NULL || (!audioCard->rtd->complete)) { ADM_LOG_ERR("AudioBindDaiLink fail!"); return HDF_ERR_IO; } diff --git a/model/audio/core/test/unittest/common/audio_core_test.cpp b/model/audio/core/test/unittest/common/audio_core_test.cpp index 91f8f7900..854107077 100755 --- a/model/audio/core/test/unittest/common/audio_core_test.cpp +++ b/model/audio/core/test/unittest/common/audio_core_test.cpp @@ -38,193 +38,193 @@ void AudioCoreTest::TearDown() { } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterPlatform, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterPlatform, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERPLATFORM, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterDai, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterDai, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERDAI, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterAccessory, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterAccessory, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERACCESSORY, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterCodec, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterCodec, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERCODEC, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_SocRegisterDsp, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_SocRegisterDsp, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERDSP, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_SocDeviceRegister, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_SocDeviceRegister, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTSOCDEVICEREGISTER, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_BindDaiLink, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_BindDaiLink, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTBINDDAILINK, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecRegBits, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecRegBits, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTUPDATECODECREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryRegBits, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryRegBits, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTUPDATEACCESSORYREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecAiaoRegBits, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecAiaoRegBits, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTUPDATECODECAIAOREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryAiaoRegBits, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryAiaoRegBits, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTUPDATEACCESSORYAIAOREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetCodec, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetCodec, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTKCONTROLGETCODEC, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetAccessory, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetAccessory, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTKCONTROLGETACCESSORY, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AddControl, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AddControl, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTADDCONTROL, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AddControls, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AddControls, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTADDCONTROLS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecReadReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecReadReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryReadReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryReadReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoReadReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoReadReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoReadReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoReadReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecWriteReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecWriteReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECWRITEREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryWriteReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryWriteReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYWRITEREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoWriteReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoWriteReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOWRITEREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoWriteReg, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoWriteReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOWRITEREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_InfoCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_InfoCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTINFOCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecGetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecGetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryGetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryGetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoGetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoGetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoGetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoGetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecSetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecSetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECSETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessorySetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessorySetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYSETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoSetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoSetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOSETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoSetCtrlOps, TestSize.Level0) +HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoSetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOSETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); diff --git a/model/audio/core/test/unittest/common/audio_host_test.cpp b/model/audio/core/test/unittest/common/audio_host_test.cpp index 6632edb9a..119ab6d6c 100755 --- a/model/audio/core/test/unittest/common/audio_host_test.cpp +++ b/model/audio/core/test/unittest/common/audio_host_test.cpp @@ -39,13 +39,13 @@ void AudioHostTest::TearDown() { } -HWTEST_F(AudioHostTest, AudioHostTest_GetCodec, TestSize.Level0) +HWTEST_F(AudioHostTest, AudioHostTest_GetCodec, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTGETCODEC, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioHostTest, AudioHostTest_GetAudioServiceName, TestSize.Level0) +HWTEST_F(AudioHostTest, AudioHostTest_GetAudioServiceName, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTGETCARDINSTANCE, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); diff --git a/model/audio/core/test/unittest/common/audio_parse_test.cpp b/model/audio/core/test/unittest/common/audio_parse_test.cpp index 6b612d03a..dd0e5bf7a 100755 --- a/model/audio/core/test/unittest/common/audio_parse_test.cpp +++ b/model/audio/core/test/unittest/common/audio_parse_test.cpp @@ -39,7 +39,7 @@ void AudioParseTest::TearDown() { } -HWTEST_F(AudioParseTest, AudioParseTest_GetConfigData, TestSize.Level0) +HWTEST_F(AudioParseTest, AudioParseTest_GetConfigData, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTGETCCNFIGDATA, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index 0bb697ed6..ecbf5af3d 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -397,7 +397,7 @@ static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct Aud return HDF_SUCCESS; } -static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, struct AudioTxMmapData *txMmapData) +static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const struct AudioTxMmapData *txMmapData) { struct PlatformDevice *platform = NULL; int32_t ret = HDF_SUCCESS; @@ -425,7 +425,7 @@ static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, struct return HDF_SUCCESS; } -static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, struct AudioRxMmapData *rxMmapData) +static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const struct AudioRxMmapData *rxMmapData) { struct PlatformDevice *platform = NULL; int32_t ret = HDF_SUCCESS; @@ -465,7 +465,7 @@ int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf * ADM_LOG_ERR("input param is NULL."); return HDF_FAILURE; } - + (void)memset_s(&transfer, sizeof(struct AudioTxData), 0, sizeof(struct AudioTxData)); if (!HdfSbufReadUint32(data, (uint32_t *)&(transfer.frames))) { ADM_LOG_ERR("read request frames failed!"); return HDF_FAILURE; diff --git a/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp b/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp index 50bd21dcb..68b415642 100755 --- a/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp +++ b/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp @@ -11,7 +11,7 @@ #include "hdf_uhdf_test.h" using namespace testing::ext; - +namespace { class AudioStreamDispatchTest : public testing::Test { public: static void SetUpTestCase(); @@ -38,8 +38,9 @@ void AudioStreamDispatchTest::TearDown() { } -HWTEST_F(AudioStreamDispatchTest, AudioStreamDispatchTest001, TestSize.Level0) +HWTEST_F(AudioStreamDispatchTest, AudioStreamDispatchTest001, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTSTREAMDISPATCH, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } +} diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index af5815025..496d087a4 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -675,7 +675,7 @@ int32_t AudioSapmNewMixerControls(struct AudioSapmComponent *sapmComponent, stru struct AudioSapmpath *path = NULL; int32_t i; - if (sapmComponent == NULL || audioCard == NULL) { + if (sapmComponent == NULL || sapmComponent->kcontrols == NULL || audioCard == NULL) { ADM_LOG_ERR("input params check error: sapmComponent=%p, audioCard=%p.", sapmComponent, audioCard); return HDF_FAILURE; } @@ -722,6 +722,11 @@ int AudioSapmNewMuxControls(struct AudioSapmComponent *sapmComponent, struct Aud ADM_LOG_ERR("add control fail!"); return HDF_FAILURE; } + + if (sapmComponent->kcontrols == NULL) { + ADM_LOG_ERR("sapmComponent->kcontrols is NULL!"); + return HDF_FAILURE; + } sapmComponent->kcontrols[0] = kctrl; DListInsertHead(&sapmComponent->kcontrols[0]->list, &audioCard->controls); @@ -1126,14 +1131,13 @@ int32_t AudioCodecSapmSetCtrlOps(const struct AudioKcontrol *kcontrol, const str ADM_LOG_ERR("Device read register is failure!"); return HDF_FAILURE; } - if (MixerUpdatePowerStatus(kcontrol, pathStatus) != HDF_SUCCESS) { - ADM_LOG_ERR("update power status is failure!"); - return HDF_FAILURE; - } - curValue &= mixerCtrl->mask << mixerCtrl->shift; value = (value & mixerCtrl->mask) << mixerCtrl->shift; - if (curValue != value) { + if (curValue != value || g_audioSapmIsSleep == true) { + if (MixerUpdatePowerStatus(kcontrol, pathStatus) != HDF_SUCCESS) { + ADM_LOG_ERR("update power status is failure!"); + return HDF_FAILURE; + } if (AudioUpdateCodecRegBits(codec, mixerCtrl, elemValue->value[0]) != HDF_SUCCESS) { ADM_LOG_ERR("update reg bits fail!"); return HDF_FAILURE; @@ -1166,7 +1170,7 @@ int32_t AudioAccessorySapmSetCtrlOps(const struct AudioKcontrol *kcontrol, const } curValue &= mixerCtrl->mask << mixerCtrl->shift; value = (value & mixerCtrl->mask) << mixerCtrl->shift; - if (curValue != value) { + if (curValue != value || g_audioSapmIsSleep == true) { if (MixerUpdatePowerStatus(kcontrol, pathStatus) != HDF_SUCCESS) { ADM_LOG_ERR("update power status fail!"); return HDF_FAILURE; diff --git a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp index 7d700a9da..d56b40374 100755 --- a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp +++ b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp @@ -11,7 +11,7 @@ #include "hdf_uhdf_test.h" using namespace testing::ext; - +namespace { class AudioSapmTest : public testing::Test { public: static void SetUpTestCase(); @@ -38,32 +38,33 @@ void AudioSapmTest::TearDown() { } -HWTEST_F(AudioSapmTest, AudioSapmTest001, TestSize.Level0) +HWTEST_F(AudioSapmTest, AudioSapmTest001, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTNEWCOMPONENT, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest002, TestSize.Level0) +HWTEST_F(AudioSapmTest, AudioSapmTest002, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTADDROUTES, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest003, TestSize.Level0) +HWTEST_F(AudioSapmTest, AudioSapmTest003, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTNEWCONTROLS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest004, TestSize.Level0) +HWTEST_F(AudioSapmTest, AudioSapmTest004, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTPOWERCOMPONET, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest005, TestSize.Level0) +HWTEST_F(AudioSapmTest, AudioSapmTest005, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTREFRESHTIME, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } +} diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 804c8f8c9..0864e4165 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -60,6 +60,7 @@ #endif #if defined(LOSCFG_DRIVERS_HDF_AUDIO_TEST) || defined(CONFIG_DRIVERS_HDF_AUDIO_TEST) #include "hdf_audio_test.h" +#include "hdf_audio_driver_test.h" #endif #if defined(LOSCFG_DRIVERS_HDF_USB_DDK_DEVICE) || defined(CONFIG_DRIVERS_HDF_USB_DDK_DEVICE) #include "hdf_usb_device_test.h" @@ -121,6 +122,7 @@ HdfTestFuncList g_hdfTestFuncList[] = { #endif #if defined(LOSCFG_DRIVERS_HDF_AUDIO_TEST) || defined(CONFIG_DRIVERS_HDF_AUDIO_TEST) {TEST_AUDIO_TYPE, HdfAudioEntry}, + {TEST_AUDIO_DRIVER_TYPE, HdfAudioDriverEntry}, #endif #if defined(LOSCFG_DRIVERS_HDF_USB_DDK_DEVICE) || defined(CONFIG_DRIVERS_HDF_USB_DDK_DEVICE) {TEST_USB_DEVICE_TYPE, HdfUsbDeviceEntry}, diff --git a/test/unittest/common/hdf_main_test.h b/test/unittest/common/hdf_main_test.h index 3447e3594..4c005a131 100644 --- a/test/unittest/common/hdf_main_test.h +++ b/test/unittest/common/hdf_main_test.h @@ -69,6 +69,7 @@ typedef enum { TEST_WIFI_END = 600, TEST_CONFIG_TYPE = 601, TEST_AUDIO_TYPE = 701, + TEST_AUDIO_DRIVER_TYPE = TEST_AUDIO_TYPE + 1, TEST_HDF_FRAME_END = 800, TEST_USB_DEVICE_TYPE = 900, TEST_USB_HOST_TYPE = 1000, -- Gitee From 34b6b7ed6b39a9d7095112e720a3aa27bdacfb7b Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 22 Oct 2021 10:20:16 +0800 Subject: [PATCH 106/272] =?UTF-8?q?mipi=E8=A7=84=E8=8C=83=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- support/platform/src/mipi_csi_core.c | 98 +++++++++---------- support/platform/src/mipi_csi_if.c | 2 +- support/platform/src/mipi_dsi_core.c | 28 +++--- support/platform/src/mipi_dsi_if.c | 2 +- .../platform/hdf_mipi_csi_entry_test.c | 7 +- .../platform/hdf_mipi_dsi_entry_test.c | 12 ++- 6 files changed, 77 insertions(+), 72 deletions(-) diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi_csi_core.c index fc09022b0..f665b8bb1 100755 --- a/support/platform/src/mipi_csi_core.c +++ b/support/platform/src/mipi_csi_core.c @@ -24,7 +24,7 @@ int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject HDF_LOGI("%s: enter!", __func__); if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_ERR_INVALID_PARAM; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->devNo >= MAX_CNTLR_CNT) { HDF_LOGE("%s: cntlr->devNo is error.", __func__); @@ -32,7 +32,7 @@ int32_t MipiCsiRegisterCntlr(struct MipiCsiCntlr *cntlr, struct HdfDeviceObject } if (device == NULL) { HDF_LOGE("%s: device is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (g_mipiCsihandle[cntlr->devNo].cntlr == NULL) { @@ -119,11 +119,11 @@ int32_t MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pA if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (pAttr == NULL) { HDF_LOGE("%s: pAttr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setComboDevAttr == NULL) { HDF_LOGE("%s: setComboDevAttr is NULL.", __func__); @@ -131,7 +131,7 @@ int32_t MipiCsiCntlrSetComboDevAttr(struct MipiCsiCntlr *cntlr, ComboDevAttr *pA } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->setComboDevAttr(cntlr, pAttr); + ret = cntlr->ops->setComboDevAttr(cntlr, pAttr); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -150,7 +150,7 @@ int32_t MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, Phy if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setPhyCmvmode == NULL) { HDF_LOGE("%s: setPhyCmvmode is NULL.", __func__); @@ -158,7 +158,7 @@ int32_t MipiCsiCntlrSetPhyCmvmode(struct MipiCsiCntlr *cntlr, uint8_t devno, Phy } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->setPhyCmvmode(cntlr, devno, cmvMode); + ret = cntlr->ops->setPhyCmvmode(cntlr, devno, cmvMode); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -177,7 +177,7 @@ int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* data if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (dataType == NULL) { HDF_LOGE("%s: dataType is NULL.", __func__); @@ -189,7 +189,7 @@ int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* data } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->setExtDataType(cntlr, dataType); + ret = cntlr->ops->setExtDataType(cntlr, dataType); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -208,7 +208,7 @@ int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDiv if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setHsMode == NULL) { HDF_LOGE("%s: setHsMode is NULL.", __func__); @@ -216,7 +216,7 @@ int32_t MipiCsiCntlrSetHsMode(struct MipiCsiCntlr *cntlr, LaneDivideMode laneDiv } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->setHsMode(cntlr, laneDivideMode); + ret = cntlr->ops->setHsMode(cntlr, laneDivideMode); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -235,7 +235,7 @@ int32_t MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->enableClock == NULL) { HDF_LOGE("%s: enableClock is NULL.", __func__); @@ -243,7 +243,7 @@ int32_t MipiCsiCntlrEnableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->enableClock(cntlr, comboDev); + ret = cntlr->ops->enableClock(cntlr, comboDev); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -262,7 +262,7 @@ int32_t MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->disableClock == NULL) { HDF_LOGE("%s: disableClock is NULL.", __func__); @@ -270,7 +270,7 @@ int32_t MipiCsiCntlrDisableClock(struct MipiCsiCntlr *cntlr, uint8_t comboDev) } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->disableClock(cntlr, comboDev); + ret = cntlr->ops->disableClock(cntlr, comboDev); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -289,7 +289,7 @@ int32_t MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->resetRx == NULL) { HDF_LOGE("%s: resetRx is NULL.", __func__); @@ -297,7 +297,7 @@ int32_t MipiCsiCntlrResetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->resetRx(cntlr, comboDev); + ret = cntlr->ops->resetRx(cntlr, comboDev); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -316,7 +316,7 @@ int32_t MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->unresetRx == NULL) { HDF_LOGE("%s: unresetRx is NULL.", __func__); @@ -324,7 +324,7 @@ int32_t MipiCsiCntlrUnresetRx(struct MipiCsiCntlr *cntlr, uint8_t comboDev) } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->unresetRx(cntlr, comboDev); + ret = cntlr->ops->unresetRx(cntlr, comboDev); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -343,7 +343,7 @@ int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClk if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->enableSensorClock == NULL) { HDF_LOGE("%s: enableSensorClock is NULL.", __func__); @@ -351,7 +351,7 @@ int32_t MipiCsiCntlrEnableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsClk } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->enableSensorClock(cntlr, snsClkSource); + ret = cntlr->ops->enableSensorClock(cntlr, snsClkSource); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -370,7 +370,7 @@ int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsCl if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->disableSensorClock == NULL) { HDF_LOGE("%s: disableSensorClock is NULL.", __func__); @@ -378,7 +378,7 @@ int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsCl } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->disableSensorClock(cntlr, snsClkSource); + ret = cntlr->ops->disableSensorClock(cntlr, snsClkSource); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -397,7 +397,7 @@ int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSour if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->resetSensor == NULL) { HDF_LOGE("%s: resetSensor is NULL.", __func__); @@ -405,7 +405,7 @@ int32_t MipiCsiCntlrResetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSour } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->resetSensor(cntlr, snsResetSource); + ret = cntlr->ops->resetSensor(cntlr, snsResetSource); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -424,7 +424,7 @@ int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSo if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->unresetSensor == NULL) { HDF_LOGE("%s: unresetSensor is NULL.", __func__); @@ -432,7 +432,7 @@ int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSo } (void)OsalMutexLock(&(cntlr->lock)); - ret = cntlr->ops->unresetSensor(cntlr, snsResetSource); + ret = cntlr->ops->unresetSensor(cntlr, snsResetSource); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -448,7 +448,7 @@ int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx) { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -460,7 +460,7 @@ int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx) } if (ctx == NULL) { HDF_LOGE("%s: ctx is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -475,7 +475,7 @@ int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phy { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -487,7 +487,7 @@ int32_t MipiCsiDebugGetPhyErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int phy } if (errInfo == NULL) { HDF_LOGE("%s: errInfo is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -502,7 +502,7 @@ int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -514,7 +514,7 @@ int32_t MipiCsiDebugGetMipiErrInt(struct MipiCsiCntlr *cntlr, unsigned int phyId } if (errInfo == NULL) { HDF_LOGE("%s: errInfo is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -529,7 +529,7 @@ int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int ph { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -541,7 +541,7 @@ int32_t MipiCsiDebugGetLvdsErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int ph } if (errInfo == NULL) { HDF_LOGE("%s: errInfo is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -556,7 +556,7 @@ int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int p { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -568,7 +568,7 @@ int32_t MipiCsiDebugGetAlignErrIntCnt(struct MipiCsiCntlr *cntlr, unsigned int p } if (errInfo == NULL) { HDF_LOGE("%s: errInfo is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -583,7 +583,7 @@ int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -595,7 +595,7 @@ int32_t MipiCsiDebugGetPhyData(struct MipiCsiCntlr *cntlr, int phyId, int laneId } if (laneData == NULL) { HDF_LOGE("%s: laneData is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -610,7 +610,7 @@ int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, in { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -622,7 +622,7 @@ int32_t MipiCsiDebugGetPhyMipiLinkData(struct MipiCsiCntlr *cntlr, int phyId, in } if (laneData == NULL) { HDF_LOGE("%s: laneData is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -637,7 +637,7 @@ int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, in { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -649,7 +649,7 @@ int32_t MipiCsiDebugGetPhyLvdsLinkData(struct MipiCsiCntlr *cntlr, int phyId, in } if (laneData == NULL) { HDF_LOGE("%s: laneData is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -664,7 +664,7 @@ int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t dev { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -676,7 +676,7 @@ int32_t MipiCsiDebugGetMipiImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t dev } if (pSize == NULL) { HDF_LOGE("%s: pSize is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -691,7 +691,7 @@ int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t dev { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -703,7 +703,7 @@ int32_t MipiCsiDebugGetLvdsImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t dev } if (pSize == NULL) { HDF_LOGE("%s: pSize is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -718,7 +718,7 @@ int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t { if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->debugs == NULL) { HDF_LOGE("%s: debugs is NULL.", __func__); @@ -730,7 +730,7 @@ int32_t MipiCsiDebugGetLvdsLaneImgsizeStatis(struct MipiCsiCntlr *cntlr, uint8_t } if (pSize == NULL) { HDF_LOGE("%s: pSize is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); diff --git a/support/platform/src/mipi_csi_if.c b/support/platform/src/mipi_csi_if.c index c856f1a0a..f11d219bb 100755 --- a/support/platform/src/mipi_csi_if.c +++ b/support/platform/src/mipi_csi_if.c @@ -5,7 +5,7 @@ * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ - + #include "mipi_csi_if.h" #include "mipi_csi_core.h" diff --git a/support/platform/src/mipi_dsi_core.c b/support/platform/src/mipi_dsi_core.c index 1178f766e..c11d85579 100644 --- a/support/platform/src/mipi_dsi_core.c +++ b/support/platform/src/mipi_dsi_core.c @@ -26,7 +26,7 @@ int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject HDF_LOGI("%s: enter!", __func__); if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); - return HDF_ERR_INVALID_PARAM; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->devNo >= MAX_CNTLR_CNT) { HDF_LOGE("%s: cntlr->devNo is error.", __func__); @@ -35,7 +35,7 @@ int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject if (device == NULL) { HDF_LOGE("%s: device is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (g_mipiDsihandle[cntlr->devNo].cntlr == NULL) { @@ -123,12 +123,12 @@ int32_t MipiDsiCntlrSetCfg(struct MipiDsiCntlr *cntlr, struct MipiCfg *cfg) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cfg == NULL) { HDF_LOGE("%s: cfg is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setCntlrCfg == NULL) { @@ -138,7 +138,7 @@ int32_t MipiDsiCntlrSetCfg(struct MipiDsiCntlr *cntlr, struct MipiCfg *cfg) (void)OsalMutexLock(&(cntlr->lock)); cntlr->cfg = *cfg; - ret = cntlr->ops->setCntlrCfg(cntlr); + ret = cntlr->ops->setCntlrCfg(cntlr); (void)OsalMutexUnlock(&(cntlr->lock)); if (ret == HDF_SUCCESS) { @@ -154,11 +154,11 @@ int32_t MipiDsiCntlrGetCfg(struct MipiDsiCntlr *cntlr, struct MipiCfg *cfg) { if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cfg == NULL) { HDF_LOGE("%s: cfg is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } (void)OsalMutexLock(&(cntlr->lock)); @@ -242,11 +242,11 @@ int32_t MipiDsiCntlrTx(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cmd == NULL) { HDF_LOGE("%s: cmd is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setCmd == NULL) { @@ -276,11 +276,11 @@ int32_t MipiDsiCntlrRx(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd, int32 if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if ((cmd == NULL) || (out == NULL)) { HDF_LOGE("%s: cmd or out is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->getCmd == NULL) { @@ -307,7 +307,7 @@ int32_t MipiDsiCntlrPowerControl(struct MipiDsiCntlr *cntlr, uint8_t enable) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->powerControl == NULL) { @@ -334,7 +334,7 @@ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->attach == NULL) { @@ -361,7 +361,7 @@ int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, DevHandle *panelData) if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); - return HDF_FAILURE; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->setDrvData == NULL) { diff --git a/support/platform/src/mipi_dsi_if.c b/support/platform/src/mipi_dsi_if.c index afd5d260a..0df8690d8 100755 --- a/support/platform/src/mipi_dsi_if.c +++ b/support/platform/src/mipi_dsi_if.c @@ -5,7 +5,7 @@ * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ - + #include "mipi_dsi_if.h" #include "mipi_dsi_core.h" diff --git a/test/unittest/platform/hdf_mipi_csi_entry_test.c b/test/unittest/platform/hdf_mipi_csi_entry_test.c index 780221843..d3b4d0d71 100755 --- a/test/unittest/platform/hdf_mipi_csi_entry_test.c +++ b/test/unittest/platform/hdf_mipi_csi_entry_test.c @@ -18,13 +18,14 @@ int32_t HdfMipiCsiEntry(HdfTestMsg *msg) struct MipiCsiTest *test = NULL; if (msg == NULL) { - return HDF_FAILURE; + HDF_LOGE("%s: msg is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } test = MipiCsiTestServiceGet(); if (test == NULL) { - HDF_LOGE("%s: get service fail!", __func__); - return HDF_FAILURE; + HDF_LOGE("%s: test is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } HDF_LOGI("%s: call [doTest]", __func__); diff --git a/test/unittest/platform/hdf_mipi_dsi_entry_test.c b/test/unittest/platform/hdf_mipi_dsi_entry_test.c index ff2a8856b..ad4a3d6da 100644 --- a/test/unittest/platform/hdf_mipi_dsi_entry_test.c +++ b/test/unittest/platform/hdf_mipi_dsi_entry_test.c @@ -14,19 +14,23 @@ int32_t HdfMipiDsiEntry(HdfTestMsg *msg) { + int32_t ret; struct MipiDsiTest *test = NULL; if (msg == NULL) { - return HDF_FAILURE; + HDF_LOGE("%s: msg is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } test = MipiDsiTestServiceGet(); if (test == NULL) { - HDF_LOGE("%s: get service fail!", __func__); - return HDF_FAILURE; + HDF_LOGE("%s: test is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } - msg->result = test->doTest(test, msg->subCmd); + HDF_LOGI("%s: call [doTest]", __func__); + ret = test->doTest(test, msg->subCmd); + msg->result = (int8_t)ret; return HDF_SUCCESS; } -- Gitee From cbbd4575c3f247b99dcfc9766cfafb326180438e Mon Sep 17 00:00:00 2001 From: kangweijie Date: Fri, 22 Oct 2021 08:17:44 +0000 Subject: [PATCH 107/272] Description:C90 Alarm reset Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/bus/hdf_ibus_intf.c | 3 +- .../network/wifi/core/components/softap/ap.c | 8 +- model/network/wifi/core/components/sta/sta.c | 4 +- model/network/wifi/core/module/wifi_base.c | 16 ++-- .../platform/src/hdf_wlan_config_parser.c | 7 +- .../platform/src/hdf_wlan_power_manager.c | 3 +- .../platform/src/hdf_wlan_priority_queue.c | 6 +- .../wifi/platform/src/hdf_wlan_utils.c | 6 +- .../platform/src/message/message_dispatcher.c | 40 +++++--- .../platform/src/message/message_router.c | 93 +++++++++++-------- .../platform/src/message/nodes/local_node.c | 39 ++++---- .../wifi/platform/src/message/sidecar.c | 41 ++++---- .../wifi/platform/src/qos/flow_control_task.c | 4 +- .../wifi/unittest/message/hdf_queue_test.c | 15 ++- 14 files changed, 172 insertions(+), 113 deletions(-) diff --git a/model/network/wifi/bus/hdf_ibus_intf.c b/model/network/wifi/bus/hdf_ibus_intf.c index 413984375..e3e5d6c21 100644 --- a/model/network/wifi/bus/hdf_ibus_intf.c +++ b/model/network/wifi/bus/hdf_ibus_intf.c @@ -19,10 +19,11 @@ extern "C" { struct BusDev *HdfWlanCreateBusManager(const struct HdfConfigWlanBus *busConfig) { + struct BusDev *bus = NULL; if (busConfig == NULL) { return NULL; } - struct BusDev *bus = (struct BusDev *)OsalMemCalloc(sizeof(struct BusDev)); + bus = (struct BusDev *)OsalMemCalloc(sizeof(struct BusDev)); if (bus == NULL) { return NULL; } diff --git a/model/network/wifi/core/components/softap/ap.c b/model/network/wifi/core/components/softap/ap.c index d685abed7..9f236ef85 100644 --- a/model/network/wifi/core/components/softap/ap.c +++ b/model/network/wifi/core/components/softap/ap.c @@ -49,17 +49,19 @@ static uint32_t ChangeBeacon(struct NetDevice *netDev, WifiApSetting *apSettings static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) { - HDF_LOGE("%s:starting ap...", __func__); struct WlanAPConf apConf = { 0 }; int32_t ret; - struct HdfChipDriver *chipDriver = GetChipDriver(netDev); + struct HdfChipDriver *chipDriver = NULL; + errno_t err; + HDF_LOGE("%s:starting ap...", __func__); + chipDriver = GetChipDriver(netDev); if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } apConf.band = IEEE80211_BAND_2GHZ; - errno_t err = memcpy_s(apConf.ssidConf.ssid, IEEE80211_MAX_SSID_LEN, apSettings->ssid, apSettings->ssidLen); + err = memcpy_s(apConf.ssidConf.ssid, IEEE80211_MAX_SSID_LEN, apSettings->ssid, apSettings->ssidLen); if (err != EOK) { HDF_LOGE("%s: memcpy_s failed!ret=%d", __func__, err); return HDF_FAILURE; diff --git a/model/network/wifi/core/components/sta/sta.c b/model/network/wifi/core/components/sta/sta.c index f72abde6b..3996b7082 100644 --- a/model/network/wifi/core/components/sta/sta.c +++ b/model/network/wifi/core/components/sta/sta.c @@ -376,7 +376,7 @@ static int32_t WifiCmdSetScanningMacAddress(const RequestContext *context, struc const char *ifName = NULL; unsigned char *mac = NULL; uint32_t replayDataSize; - + struct HdfChipDriver *chipDriver = NULL; (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; @@ -397,7 +397,7 @@ static int32_t WifiCmdSetScanningMacAddress(const RequestContext *context, struc return HDF_FAILURE; } - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + chipDriver = GetChipDriver(netdev); if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index 6e88c7e2c..d0886685e 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -737,6 +737,7 @@ static int32_t WifiCmdSendAction(const RequestContext *context, struct HdfSBuf * const char *ifName = NULL; uint32_t dataSize = 0; struct NetDevice *netdev = NULL; + int ret; (void)context; (void)rspData; @@ -778,7 +779,7 @@ static int32_t WifiCmdSendAction(const RequestContext *context, struct HdfSBuf * return HDF_FAILURE; } - int ret = SendAction(netdev, &actionData); + ret = SendAction(netdev, &actionData); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: fail to remain on channel,%d", __func__, ret); } @@ -998,6 +999,7 @@ static int32_t WifiCmdSetTxPower(const RequestContext *context, struct HdfSBuf * static int32_t WifiCmdSetClient(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { uint32_t clientNum = 0; + struct HdfWifiEventToClientMap *eventToClientMap = NULL; (void)rspData; if (reqData == NULL || context == NULL) { @@ -1009,7 +1011,7 @@ static int32_t WifiCmdSetClient(const RequestContext *context, struct HdfSBuf *r return HDF_FAILURE; } - struct HdfWifiEventToClientMap *eventToClientMap = HdfWifiGetEventToClientMap(); + eventToClientMap = HdfWifiGetEventToClientMap(); if (eventToClientMap == NULL) { HDF_LOGE("%s:get HdfWifiEventToClientMap failed", __func__); return HDF_FAILURE; @@ -1223,6 +1225,7 @@ void SendMessageResetDriverCallBack(const RequestContext *context, struct HdfSBu ErrorCode rspCode) { uint8_t chipId; + int32_t ret; const char *ifName = NULL; (void)context; @@ -1241,7 +1244,7 @@ void SendMessageResetDriverCallBack(const RequestContext *context, struct HdfSBu return; } - int32_t ret = HdfWifiEventResetResult(chipId, rspCode, ifName); + ret = HdfWifiEventResetResult(chipId, rspCode, ifName); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: send resetDriver event fail!", __func__); } @@ -1251,13 +1254,13 @@ void SendMessageResetDriverCallBack(const RequestContext *context, struct HdfSBu static int32_t WifiCmdResetDriver(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { int32_t ret; - + struct HdfSBuf *data = NULL; (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; } - struct HdfSBuf *data = HdfSBufCopy(reqData); + data = HdfSBufCopy(reqData); if (data == NULL) { HDF_LOGE("%s: sbuf copy fail", __func__); return HDF_FAILURE; @@ -1514,6 +1517,7 @@ static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *re struct NetDevice *netdev = NULL; const char *ifName = NULL; WifiIfRemove *ifRemove = NULL; + uint32_t dataSize; (void)context; if (reqData == NULL || rspData == NULL) { @@ -1530,7 +1534,7 @@ static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *re return HDF_FAILURE; } - uint32_t dataSize = 0; + dataSize = 0; if (!HdfSbufReadBuffer(reqData, (const void **)&(ifRemove), &dataSize) || dataSize != sizeof(WifiIfRemove)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; diff --git a/model/network/wifi/platform/src/hdf_wlan_config_parser.c b/model/network/wifi/platform/src/hdf_wlan_config_parser.c index d32facbbb..b342ff4da 100644 --- a/model/network/wifi/platform/src/hdf_wlan_config_parser.c +++ b/model/network/wifi/platform/src/hdf_wlan_config_parser.c @@ -250,6 +250,8 @@ static int32_t ParseWlanPowerConfig(const struct DeviceResourceNode *node, static int32_t ParseWlanPowersConfig(const struct DeviceResourceNode *node, struct HdfConfWlanPowers *powersConfig) { struct DeviceResourceIface *drsOps = NULL; + const struct DeviceResourceNode *fstPowerNode = NULL; + const struct DeviceResourceNode *secPowerNode = NULL; if (node == NULL || powersConfig == NULL) { HDF_LOGE("%s: at least one of the paras is NULL!", __func__); return HDF_FAILURE; @@ -259,8 +261,7 @@ static int32_t ParseWlanPowersConfig(const struct DeviceResourceNode *node, stru HDF_LOGE("%s: at least one of the paras is NULL!", __func__); return HDF_FAILURE; } - - const struct DeviceResourceNode *fstPowerNode = drsOps->GetChildNode(node, "power0"); + fstPowerNode = drsOps->GetChildNode(node, "power0"); if (fstPowerNode == NULL) { HDF_LOGE("%s: get power0 config fail!", __func__); return HDF_FAILURE; @@ -269,7 +270,7 @@ static int32_t ParseWlanPowersConfig(const struct DeviceResourceNode *node, stru return HDF_FAILURE; } - const struct DeviceResourceNode *secPowerNode = drsOps->GetChildNode(node, "power1"); + secPowerNode = drsOps->GetChildNode(node, "power1"); if (secPowerNode == NULL) { HDF_LOGE("%s: get power1 config fail!", __func__); return HDF_FAILURE; diff --git a/model/network/wifi/platform/src/hdf_wlan_power_manager.c b/model/network/wifi/platform/src/hdf_wlan_power_manager.c index 50592e734..f7a598b00 100644 --- a/model/network/wifi/platform/src/hdf_wlan_power_manager.c +++ b/model/network/wifi/platform/src/hdf_wlan_power_manager.c @@ -142,11 +142,12 @@ int32_t HdfWlanPowerMgrRelease(struct PowerManager* powerMgr) */ struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *configPowers) { + struct PowerManagerImpl *powerMgrimpl = NULL; if (configPowers == NULL) { HDF_LOGE("%s: configPowers is NULL", __func__); return NULL; } - struct PowerManagerImpl *powerMgrimpl = NULL; + powerMgrimpl = (struct PowerManagerImpl *)OsalMemCalloc(sizeof(struct PowerManagerImpl)); if (powerMgrimpl == NULL) { HDF_LOGE("%s: OsalMemCalloc fail! ", __func__); diff --git a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c index e61c90435..89dfa48ba 100644 --- a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c +++ b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c @@ -29,6 +29,7 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun uint32_t queueMemSize; PriorityQueueImpl *priorityQueue = NULL; uint32_t ret = HDF_SUCCESS; + HDF_STATUS status; if (priorityLevelCount > MAX_PRIORITY_LEVEL || priorityLevelCount == 0) { HDF_LOGE("%s:priorityLevelCount must in 1 to 8", __func__); return NULL; @@ -52,7 +53,7 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun return NULL; } - HDF_STATUS status = OsalSemInit(&priorityQueue->messageSemaphore, 0); + status = OsalSemInit(&priorityQueue->messageSemaphore, 0); if (status != HDF_SUCCESS) { DestroyPriorityQueue((PriorityQueue *)priorityQueue); return NULL; @@ -64,6 +65,7 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun void DestroyPriorityQueue(PriorityQueue *queue) { uint8_t i; + HDF_STATUS status; PriorityQueueImpl *queueImpl = (PriorityQueueImpl *)queue; if (queue == NULL) { return; @@ -76,7 +78,7 @@ void DestroyPriorityQueue(PriorityQueue *queue) DestroyQueue(queueImpl->queues[i]); queueImpl->queues[i] = NULL; } - HDF_STATUS status = OsalSemDestroy(&queueImpl->messageSemaphore); + status = OsalSemDestroy(&queueImpl->messageSemaphore); if (status != HDF_SUCCESS) { HDF_LOGE("%s:Destroy message queue semaphore failed!status=%d", __func__, status); } diff --git a/model/network/wifi/platform/src/hdf_wlan_utils.c b/model/network/wifi/platform/src/hdf_wlan_utils.c index b7dc9ac24..c8c93e5d2 100644 --- a/model/network/wifi/platform/src/hdf_wlan_utils.c +++ b/model/network/wifi/platform/src/hdf_wlan_utils.c @@ -45,6 +45,7 @@ struct WlanHwCapability *GetHwCapability(struct NetDevice *netDev) { struct HdfChipDriver *chipDriver = GetChipDriver(netDev); struct WlanHwCapability *capability = NULL; + int32_t ret; if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return NULL; @@ -53,7 +54,7 @@ struct WlanHwCapability *GetHwCapability(struct NetDevice *netDev) HDF_LOGE("%s: chipdriver not implemented", __func__); return NULL; } - int32_t ret = chipDriver->ops->GetHwCapability(netDev, &capability); + ret = chipDriver->ops->GetHwCapability(netDev, &capability); if (ret != HDF_SUCCESS || capability == NULL) { HDF_LOGE("%s:GetHwCapability failed!ifName=%s,ret=%d", __func__, netDev->name, ret); return NULL; @@ -222,6 +223,7 @@ char *HdfWlanGetIfNames(const uint8_t chipId, uint8_t *ifNameCount) char *ifNames = NULL; uint32_t bufferSize; uint8_t i, j; + int32_t ret; if (ifNameCount == NULL) { HDF_LOGE("%s: para is NULL", __func__); return NULL; @@ -261,7 +263,7 @@ char *HdfWlanGetIfNames(const uint8_t chipId, uint8_t *ifNameCount) if (((netIfMapTemp >> i) & 0x1) == 0) { continue; } - int32_t ret = GetPlatformIfName(i, ifNames + (j * IFNAMSIZ), IFNAMSIZ); + ret = GetPlatformIfName(i, ifNames + (j * IFNAMSIZ), IFNAMSIZ); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:Get ifName failed!ret=%d", __func__, ret); OsalMemFree(ifNames); diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index 23056b800..f0e1f6144 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -61,6 +61,7 @@ void ReleaseMessageMapper(struct ServiceDef *mapper) struct MessageDef *GetMsgDef(const struct ServiceDef *serviceDef, uint32_t commandId) { + struct MessageDef *msgDef = NULL; if (serviceDef == NULL || serviceDef->messages == NULL) { HDF_LOGE("%s:input is NULL!", __func__); return NULL; @@ -70,7 +71,7 @@ struct MessageDef *GetMsgDef(const struct ServiceDef *serviceDef, uint32_t comma return NULL; } - struct MessageDef *msgDef = serviceDef->messages + commandId; + msgDef = serviceDef->messages + commandId; if (msgDef->handler == NULL) { HDF_LOGE("%s:command has no handler!", __func__); return NULL; @@ -103,11 +104,12 @@ ErrorCode AppendToLocalDispatcher(MessageDispatcher *dispatcher, const uint8_t p void SetToResponse(MessageContext *context) { + ServiceId senderId; if (context->requestType != MESSAGE_TYPE_ASYNC_REQ && context->requestType != MESSAGE_TYPE_SYNC_REQ) { HDF_LOGE("Only sync and async message can send response!type=%u", context->requestType); return; } - ServiceId senderId = context->senderId; + senderId = context->senderId; context->senderId = context->receiverId; context->receiverId = senderId; context->requestType = MESSAGE_RSP_START + context->requestType - MESSAGE_REQ_START; @@ -128,11 +130,12 @@ static void HandleAsyncResponse(MessageContext *context) static void HandleSyncResponse(MessageContext *context) { + HDF_STATUS status; if (context == NULL) { HDF_LOGE("Input context is NULL!"); return; } - HDF_STATUS status = OsalSemPost(&context->rspSemaphore); + status = OsalSemPost(&context->rspSemaphore); if (status != HDF_SUCCESS) { HDF_LOGE("Send semaphore failed!CMD=%u,Sender=%u,Receiver=%u", context->commandId, context->senderId, context->receiverId); @@ -229,11 +232,13 @@ static void ReleaseAllMessage(MessageDispatcher *dispatcher) static int RunDispatcher(void *para) { + MessageDispatcher *dispatcher = NULL; + MessageContext *context = NULL; if (para == NULL) { HDF_LOGE("Start dispatcher failed! cause:%s\n", "input para is NULL"); return ME_ERROR_NULL_PTR; } - MessageDispatcher *dispatcher = (MessageDispatcher *)para; + dispatcher = (MessageDispatcher *)para; if (dispatcher->messageQueue == NULL) { HDF_LOGE("Start dispatcher failed! cause:%s\n", "message queue is NULL"); return ME_ERROR_NULL_PTR; @@ -253,7 +258,7 @@ static int RunDispatcher(void *para) dispatcher->status = ME_STATUS_RUNNING; } while (dispatcher->status == ME_STATUS_RUNNING) { - MessageContext *context = PopPriorityQueue(dispatcher->messageQueue, QUEUE_OPER_TIMEOUT); + context = PopPriorityQueue(dispatcher->messageQueue, QUEUE_OPER_TIMEOUT); if (context == NULL) { continue; } @@ -273,14 +278,17 @@ static int RunDispatcher(void *para) static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) { + HDF_STATUS status; + ErrorCode errCode; + LocalMessageDispatcher *localDispatcher = NULL; if (dispatcher == NULL) { return ME_ERROR_NULL_PTR; } - HDF_STATUS status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } - ErrorCode errCode = ME_SUCCESS; + errCode = ME_SUCCESS; do { if (dispatcher->status != ME_STATUS_STOPPED) { errCode = ME_ERROR_WRONG_STATUS; @@ -292,7 +300,7 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) .priority = OSAL_THREAD_PRI_DEFAULT, .stackSize = 0x2000, }; - LocalMessageDispatcher *localDispatcher = (LocalMessageDispatcher *)dispatcher; + localDispatcher = (LocalMessageDispatcher *)dispatcher; status = OsalThreadCreate(&localDispatcher->dispatcherThread, RunDispatcher, localDispatcher); if (status != HDF_SUCCESS) { HDF_LOGE("%s:OsalThreadCreate failed!status=%d", __func__, status); @@ -327,11 +335,11 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) static void ShutdownDispatcher(MessageDispatcher *dispatcher) { + HDF_STATUS status; if (dispatcher == NULL) { return; } - - HDF_STATUS status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Get lock failed!status=%d", status); return; @@ -354,6 +362,7 @@ static void ShutdownDispatcher(MessageDispatcher *dispatcher) IMPLEMENT_SHARED_OBJ(MessageDispatcher); static void DestroyLocalDispatcher(MessageDispatcher *dispatcher) { + int32_t ret; if (dispatcher == NULL) { return; } @@ -365,7 +374,7 @@ static void DestroyLocalDispatcher(MessageDispatcher *dispatcher) dispatcher->messageQueue = NULL; } - int32_t ret = OsalMutexDestroy(&dispatcher->mutex); + ret = OsalMutexDestroy(&dispatcher->mutex); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:Release mutex failed.ret=%d", __func__, ret); } @@ -375,16 +384,17 @@ static void DestroyLocalDispatcher(MessageDispatcher *dispatcher) ErrorCode CreateLocalDispatcher(MessageDispatcher **dispatcher, const DispatcherConfig *config) { + LocalMessageDispatcher *localDispatcher = NULL; + int32_t ret; + ErrorCode errCode; if (dispatcher == NULL || config == NULL) { return ME_ERROR_NULL_PTR; } - LocalMessageDispatcher *localDispatcher = (LocalMessageDispatcher *)OsalMemCalloc(sizeof(LocalMessageDispatcher)); + localDispatcher = (LocalMessageDispatcher *)OsalMemCalloc(sizeof(LocalMessageDispatcher)); if (localDispatcher == NULL) { return ME_ERROR_RES_LAKE; } - - ErrorCode errCode; do { localDispatcher->status = ME_STATUS_STOPPED; localDispatcher->AppendMessage = AppendToLocalDispatcher; @@ -397,7 +407,7 @@ ErrorCode CreateLocalDispatcher(MessageDispatcher **dispatcher, const Dispatcher break; } - int32_t ret = OsalMutexInit(&localDispatcher->mutex); + ret = OsalMutexInit(&localDispatcher->mutex); if (ret != HDF_SUCCESS) { errCode = ME_ERROR_OPER_MUTEX_FAILED; break; diff --git a/model/network/wifi/platform/src/message/message_router.c b/model/network/wifi/platform/src/message/message_router.c index 3776a3e66..68dc5db60 100644 --- a/model/network/wifi/platform/src/message/message_router.c +++ b/model/network/wifi/platform/src/message/message_router.c @@ -70,6 +70,7 @@ static void ReleaseRemoteService(RemoteService *service) static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bool requireLock) { + MessageDispatcher *result = NULL; if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) { HDF_LOGE("%s:Input ID is too big.input=%u", __func__, dispatcherId); return NULL; @@ -82,7 +83,7 @@ static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bo return NULL; } } - MessageDispatcher *result = NULL; + do { if (g_dispatchers[dispatcherId] == NULL) { break; @@ -105,17 +106,19 @@ static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bo static ErrorCode RegDispatcher(DispatcherId dispatcherId, MessageDispatcher *dispatcher) { + HDF_STATUS status; + ErrorCode errCode; if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) { HDF_LOGE("%s:dispatcher id is too big!id=%u", __func__, dispatcherId); return ME_ERROR_PARA_WRONG; } - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - ErrorCode errCode = ME_SUCCESS; + errCode = ME_SUCCESS; do { if (g_routerStatus != ME_STATUS_RUNNING) { errCode = ME_ERROR_WRONG_STATUS; @@ -138,11 +141,12 @@ static ErrorCode RegDispatcher(DispatcherId dispatcherId, MessageDispatcher *dis ErrorCode AddDispatcher(DispatcherConfig *config) { + ErrorCode errCode; + MessageDispatcher *dispatcher = NULL; if (config == NULL) { return ME_ERROR_NULL_PTR; } - MessageDispatcher *dispatcher = NULL; - ErrorCode errCode = CreateLocalDispatcher(&dispatcher, config); + errCode = CreateLocalDispatcher(&dispatcher, config); if (errCode != ME_SUCCESS) { return errCode; } @@ -190,12 +194,13 @@ static void NotifyAllNodesServiceDel(const NodeId nodeId, ServiceId serviceId) static ErrorCode NotifyAllNodesServiceAdd(const NodeId nodeId, struct ServiceDef *mapper) { uint8_t i; + uint8_t notifyNodeIndex; + ErrorCode errCode; if (mapper == NULL) { return ME_ERROR_NULL_PTR; } - ErrorCode errCode = ME_SUCCESS; - uint8_t notifyNodeIndex; + errCode = ME_SUCCESS; for (notifyNodeIndex = 0; notifyNodeIndex < MAX_NODE_COUNT; notifyNodeIndex++) { if (notifyNodeIndex == nodeId) { continue; @@ -258,6 +263,11 @@ static ErrorCode DoRegistService(const NodeId nodeId, const DispatcherId dispatc } static ErrorCode RegistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, struct ServiceDef *mapper) { + HDF_STATUS status; + MessageNode *node = NULL; + RemoteService *remoteService = NULL; + MessageDispatcher *dispatcher = NULL; + ErrorCode errCode; if (mapper == NULL) { return ME_ERROR_NULL_PTR; } @@ -266,23 +276,19 @@ static ErrorCode RegistServiceInner(const NodeId nodeId, const DispatcherId disp HDF_LOGE("%s:serviceId exceed max value! ServiceId=%u", __func__, mapper->serviceId); return ME_ERROR_PARA_WRONG; } - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - MessageNode *node = RefMessageNode(nodeId, false); + node = RefMessageNode(nodeId, false); if (node == NULL) { HDF_LOGE("%s:Node not found!", __func__); OsalMutexUnlock(&g_routerMutex); return ME_ERROR_NO_SUCH_NODE; } - RemoteService *remoteService = NULL; - MessageDispatcher *dispatcher = NULL; - - ErrorCode errCode; - do { + do { if (node->CreateRemoteService == NULL) { HDF_LOGE("%s:Can not reg service to node %d", __func__, nodeId); errCode = ME_ERROR_NOT_SUPPORTED; @@ -337,6 +343,8 @@ ErrorCode RegistLocalService(const DispatcherId dispatcherId, struct ServiceDef ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service) { + HDF_STATUS status; + ErrorCode errCode; if (service == NULL) { return ME_ERROR_NULL_PTR; } @@ -348,13 +356,13 @@ ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service) HDF_LOGE("%s:NodeId exceed max value! NodeId=%d", __func__, nodeId); return ME_ERROR_PARA_WRONG; } - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - ErrorCode errCode = DoRegistService(nodeId, BAD_DISPATCHER_ID, service); + errCode = DoRegistService(nodeId, BAD_DISPATCHER_ID, service); if (errCode != ME_SUCCESS) { HDF_LOGE("%s:RegService failed! errCode=%d", __func__, errCode); } @@ -367,16 +375,19 @@ ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service) } static ErrorCode UnregistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, const ServiceId serviceId) { + RemoteService *service = NULL; + HDF_STATUS status; + ErrorCode errCode; if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) { return ME_ERROR_PARA_WRONG; } - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - ErrorCode errCode = ME_SUCCESS; + errCode = ME_SUCCESS; do { if (g_servicesIndex[serviceId].nodeIndex != nodeId || g_servicesIndex[serviceId].dispatcherId != dispatcherId) { errCode = ME_ERROR_NO_SUCH_SERVICE; @@ -386,7 +397,7 @@ static ErrorCode UnregistServiceInner(const NodeId nodeId, const DispatcherId di errCode = ME_ERROR_NO_SUCH_SERVICE; break; } - RemoteService *service = g_servicesIndex[serviceId].remoteService; + service = g_servicesIndex[serviceId].remoteService; ReleaseRemoteService(service); g_servicesIndex[serviceId].remoteService = NULL; g_servicesIndex[serviceId].nodeIndex = NO_SUCH_NODE_INDEX; @@ -438,6 +449,9 @@ static bool CheckServiceID(ServiceId serviceId, bool allowSync) RemoteService *RefRemoteService(ServiceId serviceId) { + HDF_STATUS status; + RemoteService *remoteService = NULL; + RemoteService *service = NULL; if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) { return NULL; } @@ -445,16 +459,14 @@ RemoteService *RefRemoteService(ServiceId serviceId) if (!CheckServiceID(serviceId, true)) { return NULL; } - - RemoteService *service = NULL; - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return NULL; } do { - RemoteService *remoteService = g_servicesIndex[serviceId].remoteService; + remoteService = g_servicesIndex[serviceId].remoteService; if (remoteService != NULL && remoteService->Ref != NULL) { service = remoteService->Ref(remoteService); } @@ -469,11 +481,12 @@ RemoteService *RefRemoteService(ServiceId serviceId) ErrorCode SendMessage(MessageContext *context) { - RemoteService *service = RefRemoteService(context->receiverId); + RemoteService *service = NULL; + ErrorCode errCode; + service = RefRemoteService(context->receiverId); if (service == NULL) { return ME_ERROR_NO_SUCH_SERVICE; } - ErrorCode errCode; do { if (service->SendMessage == NULL) { errCode = ME_ERROR_NOT_SUPPORTED; @@ -552,6 +565,7 @@ static void ReleaseNodes(void) static ErrorCode DoStartMessageRouter(uint8_t nodesConfig) { uint8_t i; + ErrorCode errCode; if (g_routerStatus != ME_STATUS_STOPPED) { HDF_LOGE("Router have already started!"); return ME_ERROR_MUTI_INIT_NOT_ALLOWED; @@ -562,8 +576,6 @@ static ErrorCode DoStartMessageRouter(uint8_t nodesConfig) g_servicesIndex[i].nodeIndex = NO_SUCH_NODE_INDEX; g_servicesIndex[i].dispatcherId = BAD_DISPATCHER_ID; } - - ErrorCode errCode; do { HDF_LOGE("%s:Create local node ...", __func__); errCode = CreateLocalNode(&g_messageNodes[LOCAL_NODE_INDEX]); @@ -595,13 +607,14 @@ static ErrorCode DoStartMessageRouter(uint8_t nodesConfig) ErrorCode EnableDefaultDispatcher(void) { + ErrorCode errCode; DispatcherConfig config = { .dispatcherId = DEFAULT_DISPATCHER_ID, .queueSize = DEFAULT_DISPATCHER_QUEUE_SIZE, .priorityLevelCount = DEFAULT_DISPATCHER_PRIORITY_COUNT }; HDF_LOGI("Register default dispatcher..."); - ErrorCode errCode = AddDispatcher(&config); + errCode = AddDispatcher(&config); if (errCode != ME_SUCCESS) { HDF_LOGE("Register default dispatcher failed!ret=%d", errCode); } @@ -610,18 +623,20 @@ ErrorCode EnableDefaultDispatcher(void) ErrorCode StartMessageRouter(uint8_t nodesConfig) { + HDF_STATUS status; + ErrorCode errCode; if (g_routerMutex.realMutex == NULL) { HDF_STATUS status = OsalMutexInit(&g_routerMutex); if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } } - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - ErrorCode errCode = DoStartMessageRouter(nodesConfig); + errCode = DoStartMessageRouter(nodesConfig); status = OsalMutexUnlock(&g_routerMutex); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); @@ -632,6 +647,7 @@ ErrorCode StartMessageRouter(uint8_t nodesConfig) static ErrorCode DoShutdownMessageRouter(void) { uint8_t i; + RemoteService *service = NULL; if (g_routerStatus == ME_STATUS_STOPPED) { return ME_SUCCESS; } @@ -641,7 +657,7 @@ static ErrorCode DoShutdownMessageRouter(void) if (g_servicesIndex[i].remoteService == NULL) { continue; } - RemoteService *service = g_servicesIndex[i].remoteService; + service = g_servicesIndex[i].remoteService; g_servicesIndex[i].remoteService = NULL; g_servicesIndex[i].nodeIndex = NO_SUCH_NODE_INDEX; g_servicesIndex[i].dispatcherId = BAD_DISPATCHER_ID; @@ -667,14 +683,14 @@ static ErrorCode DoShutdownMessageRouter(void) ErrorCode ShutdownMessageRouter() { HDF_LOGW("%s:Shutdown router...", __func__); - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + HDF_STATUS status; + ErrorCode errCode; + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); return ME_ERROR_OPER_MUTEX_FAILED; } - - ErrorCode errCode = DoShutdownMessageRouter(); - + errCode = DoShutdownMessageRouter(); status = OsalMutexUnlock(&g_routerMutex); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); @@ -687,13 +703,14 @@ ErrorCode ShutdownMessageRouter() MessageNode *RefMessageNode(const NodeId nodeId, bool isRequireLock) { + MessageNode *node = NULL; + HDF_STATUS status; if (nodeId >= MAX_NODE_COUNT) { HDF_LOGE("Input nodeId >= MAX_NODE_COUNT"); return NULL; } - MessageNode *node = NULL; if (isRequireLock) { - HDF_STATUS status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("%s:require lock failed!", __func__); return NULL; @@ -705,7 +722,7 @@ MessageNode *RefMessageNode(const NodeId nodeId, bool isRequireLock) } if (isRequireLock) { - HDF_STATUS status = OsalMutexUnlock(&g_routerMutex); + status = OsalMutexUnlock(&g_routerMutex); if (status != HDF_SUCCESS) { HDF_LOGE("%s:Unlock mutex failed!", __func__); } diff --git a/model/network/wifi/platform/src/message/nodes/local_node.c b/model/network/wifi/platform/src/message/nodes/local_node.c index b5b8c89a1..18bf236e5 100644 --- a/model/network/wifi/platform/src/message/nodes/local_node.c +++ b/model/network/wifi/platform/src/message/nodes/local_node.c @@ -31,13 +31,13 @@ typedef struct LocalNodeService { static void HandleRequestMessage(const RemoteService *service, MessageContext *context) { + LocalNodeService *localNodeService = NULL; + localNodeService = (LocalNodeService *)service; + struct MessageDef messageDef = { NULL, 0 }; if (context == NULL || service == NULL) { HDF_LOGE("%s:input is NULL", __func__); return; } - LocalNodeService *localNodeService = (LocalNodeService *)service; - - struct MessageDef messageDef = { NULL, 0 }; if (localNodeService->mapper != NULL && context->commandId < localNodeService->mapper->messagesLength) { messageDef = localNodeService->mapper->messages[context->commandId]; } @@ -51,12 +51,13 @@ static void HandleRequestMessage(const RemoteService *service, MessageContext *c static void HandleResponseMessage(const RemoteService *service, MessageContext *context) { (void)service; + HDF_STATUS status; if (context->requestType < MESSAGE_RSP_START) { return; } if (context->requestType == MESSAGE_TYPE_SYNC_RSP) { - HDF_STATUS status = OsalSemPost(&context->rspSemaphore); + status = OsalSemPost(&context->rspSemaphore); if (status != HDF_SUCCESS) { ReleaseMessageContext(context); } @@ -117,10 +118,11 @@ static void ShutdownLocalService(RemoteService *service) static void DestroyLocalNodeRemoteService(RemoteService *service) { + LocalNodeService *localService = NULL; if (service == NULL) { return; } - LocalNodeService *localService = (LocalNodeService *)service; + localService = (LocalNodeService *)service; if (localService->dispatcher != NULL && localService->dispatcher->Disref != NULL) { localService->dispatcher->Disref(localService->dispatcher); } @@ -131,6 +133,9 @@ static void DestroyLocalNodeRemoteService(RemoteService *service) RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *dispatcher, struct ServiceDef *mapper) { + LocalNodeService *service = NULL; + (void)node; + ErrorCode errCode; if (mapper == NULL) { return NULL; } @@ -138,14 +143,10 @@ RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *disp HDF_LOGE("%s:Bad dispatcher found!", __func__); return NULL; } - (void)node; - - LocalNodeService *service = (LocalNodeService *)OsalMemCalloc(sizeof(LocalNodeService)); + service = (LocalNodeService *)OsalMemCalloc(sizeof(LocalNodeService)); if (service == NULL) { return NULL; } - - ErrorCode errCode; do { service->status = ME_STATUS_RUNNING; service->ExecRequestMsg = HandleRequestMessage; @@ -176,16 +177,17 @@ RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *disp static ErrorCode InitLocalNode(MessageNode *node) { + HDF_STATUS status; + ErrorCode errCode; if (node == NULL) { return ME_ERROR_NULL_PTR; } - HDF_STATUS status = OsalMutexTimedLock(&node->mutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&node->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } - - ErrorCode errCode = ME_SUCCESS; + errCode = ME_SUCCESS; do { if (node->status != ME_STATUS_STOPPED) { HDF_LOGE("%s:unexpected status %d", __func__, node->status); @@ -224,10 +226,11 @@ static ErrorCode InitLocalNode(MessageNode *node) static void DestroyLocalNode(MessageNode *node) { + int32_t ret; if (node == NULL) { return; } - int32_t ret = OsalMutexDestroy(&node->mutex); + ret = OsalMutexDestroy(&node->mutex); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:Release mutex failed!ret=%d", __func__, ret); } @@ -236,15 +239,17 @@ static void DestroyLocalNode(MessageNode *node) ErrorCode CreateLocalNode(MessageNode **node) { + int32_t ret; + LocalMessageNode *newNode = NULL; + ErrorCode errCode; if (node == NULL) { return ME_ERROR_NULL_PTR; } HDF_LOGI("Creating local node..."); - LocalMessageNode *newNode = (LocalMessageNode *)OsalMemCalloc(sizeof(LocalMessageNode)); + newNode = (LocalMessageNode *)OsalMemCalloc(sizeof(LocalMessageNode)); if (newNode == NULL) { return ME_ERROR_RES_LAKE; } - ErrorCode errCode; do { newNode->status = ME_STATUS_STOPPED; newNode->Init = InitLocalNode; @@ -253,7 +258,7 @@ ErrorCode CreateLocalNode(MessageNode **node) newNode->NotifyServiceAdd = NULL; newNode->NotifyServiceDel = NULL; - int32_t ret = OsalMutexInit(&newNode->mutex); + ret = OsalMutexInit(&newNode->mutex); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:Init mutex failed!err=%d", __func__, ret); errCode = ME_ERROR_OPER_MUTEX_FAILED; diff --git a/model/network/wifi/platform/src/message/sidecar.c b/model/network/wifi/platform/src/message/sidecar.c index dc8692e93..2cc0f8e8d 100644 --- a/model/network/wifi/platform/src/message/sidecar.c +++ b/model/network/wifi/platform/src/message/sidecar.c @@ -26,12 +26,13 @@ typedef struct { static ErrorCode MessageInputCheck(const Service *sideCar, ServiceId receiver, struct HdfSBuf *sendData) { + SideCarPrivateData *privateData = NULL; if (sideCar == NULL || sideCar->privateData == NULL) { HDF_LOGE("%s:sideCar or sideCar.privateData is NULL", __func__); return ME_ERROR_NULL_PTR; } - SideCarPrivateData *privateData = (SideCarPrivateData *)sideCar->privateData; + privateData = (SideCarPrivateData *)sideCar->privateData; if (receiver >= MESSAGE_ENGINE_MAX_SERVICE || privateData->serviceId >= MESSAGE_ENGINE_MAX_SERVICE) { return ME_ERROR_NO_SUCH_SERVICE; } @@ -74,6 +75,7 @@ int32_t DispatchToMessage(struct HdfDeviceIoClient *client, int id, struct HdfSB ServiceId serviceId = GetServiceID(id); uint32_t cmd = GetCmd(id); MessageContext *context = NULL; + RemoteService *targetService = NULL; if (client == NULL) { return HDF_ERR_INVALID_PARAM; @@ -88,7 +90,6 @@ int32_t DispatchToMessage(struct HdfDeviceIoClient *client, int id, struct HdfSB context->rspData = rspData; context->requestType = MESSAGE_TYPE_SYNC_REQ; context->client = client; - RemoteService *targetService = NULL; do { targetService = RefRemoteService(serviceId); if (targetService == NULL || targetService->SendMessage == NULL) { @@ -109,18 +110,20 @@ int32_t DispatchToMessage(struct HdfDeviceIoClient *client, int id, struct HdfSB static ErrorCode SideCarSendSyncMessage(const Service *sideCar, ServiceId receiver, uint32_t commandId, struct HdfSBuf *sendData, struct HdfSBuf *recvData) { + SideCarPrivateData *privateData = NULL; + MessageContext *context = NULL; + RemoteService *targetService = NULL; ErrorCode errCode = MessageInputCheck(sideCar, receiver, sendData); if (errCode != ME_SUCCESS) { return errCode; } - SideCarPrivateData *privateData = (SideCarPrivateData *)sideCar->privateData; - MessageContext *context = CreateMessageContext(privateData->serviceId, receiver, commandId, sendData); + privateData = (SideCarPrivateData *)sideCar->privateData; + context = CreateMessageContext(privateData->serviceId, receiver, commandId, sendData); if (context == NULL) { return ME_ERROR_NULL_PTR; } context->rspData = recvData; context->requestType = MESSAGE_TYPE_SYNC_REQ; - RemoteService *targetService = NULL; do { targetService = RefRemoteService(receiver); if (targetService == NULL || targetService->SendMessage == NULL) { @@ -141,17 +144,21 @@ static ErrorCode SideCarSendSyncMessage(const Service *sideCar, ServiceId receiv static ErrorCode SideCarSendAsyncMessageInner(const Service *sideCar, ServiceId receiver, uint32_t commandId, struct HdfSBuf *reqData, MessageCallBack callback) { + SideCarPrivateData *privateData = NULL; + MessageContext *context = NULL; + struct HdfSBuf *rspData = NULL; + RemoteService *targetService = NULL; ErrorCode errCode = MessageInputCheck(sideCar, receiver, reqData); if (errCode != ME_SUCCESS) { return errCode; } - SideCarPrivateData *privateData = (SideCarPrivateData *)sideCar->privateData; - MessageContext *context = CreateMessageContext(privateData->serviceId, receiver, commandId, reqData); + privateData = (SideCarPrivateData *)sideCar->privateData; + context = CreateMessageContext(privateData->serviceId, receiver, commandId, reqData); if (context == NULL) { return ME_ERROR_NULL_PTR; } - struct HdfSBuf *rspData = HdfSBufObtainDefaultSize(); + rspData = HdfSBufObtainDefaultSize(); if (rspData == NULL) { OsalMemFree(context); return HDF_FAILURE; @@ -159,8 +166,6 @@ static ErrorCode SideCarSendAsyncMessageInner(const Service *sideCar, ServiceId context->requestType = MESSAGE_TYPE_ASYNC_REQ; context->callback = callback; context->rspData = rspData; - - RemoteService *targetService = NULL; do { targetService = RefRemoteService(receiver); if (targetService == NULL || targetService->SendMessage == NULL) { @@ -199,6 +204,8 @@ static ErrorCode SideCarSendOneWayMessage(const struct SideCar_ *sideCar, Servic static ErrorCode DestroyService(Service *service) { + SideCarPrivateData *data = NULL; + ErrorCode errCode; if (service == NULL) { return ME_ERROR_NULL_PTR; } @@ -207,10 +214,9 @@ static ErrorCode DestroyService(Service *service) HDF_LOGE("%s:privateData is NULL!", __func__); return ME_ERROR_PARA_WRONG; } - SideCarPrivateData *data = (SideCarPrivateData *)service->privateData; + data = (SideCarPrivateData *)service->privateData; HDF_LOGE("Destroy service! id=%d", data->serviceId); - - ErrorCode errCode = UnregistLocalService(data->dispatcherId, data->serviceId); + errCode = UnregistLocalService(data->dispatcherId, data->serviceId); if (errCode != ME_SUCCESS) { HDF_LOGE("Unregist service failed!ret=%d", errCode); return errCode; @@ -224,6 +230,9 @@ static ErrorCode DestroyService(Service *service) Service *InitService(struct ServiceDef *def, const ServiceCfg *cfg) { + Service *service = NULL; + SideCarPrivateData *privateData = NULL; + ErrorCode errCode; if (cfg == NULL || def == NULL) { return NULL; } @@ -233,7 +242,7 @@ Service *InitService(struct ServiceDef *def, const ServiceCfg *cfg) return NULL; } - Service *service = (Service *)OsalMemCalloc(sizeof(Service)); + service = (Service *)OsalMemCalloc(sizeof(Service)); if (service == NULL) { HDF_LOGE("%s:OsalMemAlloc return NULL!", __func__); return NULL; @@ -243,7 +252,7 @@ Service *InitService(struct ServiceDef *def, const ServiceCfg *cfg) service->SendOneWayMessage = SideCarSendOneWayMessage; service->Destroy = DestroyService; - SideCarPrivateData *privateData = (SideCarPrivateData *)OsalMemCalloc(sizeof(SideCarPrivateData)); + privateData = (SideCarPrivateData *)OsalMemCalloc(sizeof(SideCarPrivateData)); if (privateData == NULL) { OsalMemFree(service); HDF_LOGE("%s:OsalMemAlloc return NULL!", __func__); @@ -254,7 +263,7 @@ Service *InitService(struct ServiceDef *def, const ServiceCfg *cfg) service->privateData = (void *)privateData; privateData = NULL; - ErrorCode errCode = RegistLocalService(cfg->dispatcherId, def); + errCode = RegistLocalService(cfg->dispatcherId, def); if (errCode != ME_SUCCESS) { OsalMemFree(service->privateData); service->privateData = NULL; diff --git a/model/network/wifi/platform/src/qos/flow_control_task.c b/model/network/wifi/platform/src/qos/flow_control_task.c index b51209bd8..01d342351 100644 --- a/model/network/wifi/platform/src/qos/flow_control_task.c +++ b/model/network/wifi/platform/src/qos/flow_control_task.c @@ -171,6 +171,7 @@ static void DestroyTask(struct FlowControlModule *fcm, FlowDir dir) int32_t CreateFlowControlTask(struct FlowControlModule *fcm) { + int32_t ret; struct OsalThreadParam config = { .priority = OSAL_THREAD_PRI_HIGHEST, .stackSize = 0, @@ -180,8 +181,7 @@ int32_t CreateFlowControlTask(struct FlowControlModule *fcm) HDF_LOGE("%s fail: fcm = null!", __func__); return HDF_ERR_INVALID_PARAM; } - - int32_t ret = CreateTask(&fcm->txTransferThread, RX_THREAD_NAME, RunWiFiTxFlowControl, &config, fcm); + ret = CreateTask(&fcm->txTransferThread, RX_THREAD_NAME, RunWiFiTxFlowControl, &config, fcm); if (ret == HDF_FAILURE) { fcm->threadStatus[FLOW_TX] = THREAD_INIT_FAIL; return HDF_FAILURE; diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c index 04b2f5ccd..2e8229503 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c @@ -27,6 +27,7 @@ int32_t MessageQueueTest001(void) int c = 3; int d = 4; int32_t errCode; + void *p = NULL; PriorityQueue *queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); @@ -45,7 +46,7 @@ int32_t MessageQueueTest001(void) errCode = PushPriorityQueue(queue, 0, &d); MSG_BREAK_IF_NOT_SUCCESS(errCode); - void *p = PopPriorityQueue(queue, 0); + p = PopPriorityQueue(queue, 0); MSG_BREAK_IF(errCode, p == NULL); MSG_BREAK_IF(errCode, p != &a); @@ -75,7 +76,9 @@ int32_t MessageQueueTest002(void) int c = 3; int d = 4; int32_t errCode; - PriorityQueue *queue = CreatePriorityQueue(TEST_QUEUE_SIZE, MUTI_PRIORITY); + void *p = NULL; + PriorityQueue *queue = NULL; + queue = CreatePriorityQueue(TEST_QUEUE_SIZE, MUTI_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); return -1; @@ -93,7 +96,7 @@ int32_t MessageQueueTest002(void) errCode = PushPriorityQueue(queue, 0, &d); MSG_BREAK_IF_NOT_SUCCESS(errCode); - void *p = PopPriorityQueue(queue, 0); + p = PopPriorityQueue(queue, 0); MSG_BREAK_IF(errCode, p == NULL); MSG_BREAK_IF(errCode, p != &a); @@ -130,7 +133,9 @@ static int RunPushQueue(void *para) int32_t MessageQueueTest003(void) { int32_t errCode = HDF_SUCCESS; - PriorityQueue *queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); + void *p = NULL; + PriorityQueue *queue = NULL; + queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); return -1; @@ -157,7 +162,7 @@ int32_t MessageQueueTest003(void) break; } - void *p = PopPriorityQueue(queue, POP_TIMEOUT); + p = PopPriorityQueue(queue, POP_TIMEOUT); MSG_BREAK_IF(errCode, p == NULL); MSG_BREAK_IF(errCode, p != &g_testValue); } while (false); -- Gitee From 6c3f975af1f5359054320635839100e82aebaf6b Mon Sep 17 00:00:00 2001 From: kangweijie Date: Fri, 22 Oct 2021 08:53:27 +0000 Subject: [PATCH 108/272] Description:C90 Alarm reset Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/bus/hdf_ibus_intf.c | 1 - .../network/wifi/core/components/softap/ap.c | 24 -------------- model/network/wifi/core/components/sta/sta.c | 31 ------------------- model/network/wifi/core/module/wifi_base.c | 22 ------------- .../platform/src/hdf_wlan_power_manager.c | 2 -- .../platform/src/hdf_wlan_priority_queue.c | 1 - .../wifi/platform/src/hdf_wlan_utils.c | 22 ++++++------- 7 files changed, 9 insertions(+), 94 deletions(-) diff --git a/model/network/wifi/bus/hdf_ibus_intf.c b/model/network/wifi/bus/hdf_ibus_intf.c index e3e5d6c21..580604cc3 100644 --- a/model/network/wifi/bus/hdf_ibus_intf.c +++ b/model/network/wifi/bus/hdf_ibus_intf.c @@ -27,7 +27,6 @@ struct BusDev *HdfWlanCreateBusManager(const struct HdfConfigWlanBus *busConfig) if (bus == NULL) { return NULL; } - switch (busConfig->busType) { case BUS_SDIO: if (HdfSdioBusInit(bus, busConfig) != HDF_SUCCESS) { diff --git a/model/network/wifi/core/components/softap/ap.c b/model/network/wifi/core/components/softap/ap.c index 9f236ef85..dadf03e8e 100644 --- a/model/network/wifi/core/components/softap/ap.c +++ b/model/network/wifi/core/components/softap/ap.c @@ -29,12 +29,10 @@ static uint32_t ChangeBeacon(struct NetDevice *netDev, WifiApSetting *apSettings HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - if (netDev == NULL || apSettings == NULL) { HDF_LOGE("%s: parameter null", __func__); return HDF_FAILURE; } - beaconConf.interval = apSettings->beaconInterval; beaconConf.DTIMPeriod = apSettings->dtimPeriod; beaconConf.hiddenSSID = (apSettings->hiddenSsid == 1); @@ -42,7 +40,6 @@ static uint32_t ChangeBeacon(struct NetDevice *netDev, WifiApSetting *apSettings beaconConf.headIEsLength = apSettings->beaconData.headLen; beaconConf.tailIEs = apSettings->beaconData.tail; beaconConf.tailIEsLength = apSettings->beaconData.tailLen; - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, ConfigBeacon); return chipDriver->apOps->ConfigBeacon(netDev, &beaconConf); } @@ -59,7 +56,6 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - apConf.band = IEEE80211_BAND_2GHZ; err = memcpy_s(apConf.ssidConf.ssid, IEEE80211_MAX_SSID_LEN, apSettings->ssid, apSettings->ssidLen); if (err != EOK) { @@ -70,20 +66,17 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) apConf.centerFreq1 = apSettings->freqParams.centerFreq1; apConf.channel = apSettings->freqParams.channel; apConf.width = apSettings->freqParams.bandwidth; - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, ConfigAp); ret = chipDriver->apOps->ConfigAp(netDev, &apConf); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:ConfigAp failed!ret=%d", __func__, ret); return HDF_FAILURE; } - ret = ChangeBeacon(netDev, apSettings); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:ChangeBeacon failed!ret=%d", __func__, ret); return HDF_FAILURE; } - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, StartAp); ret = chipDriver->apOps->StartAp(netDev); if (ret != HDF_SUCCESS) { @@ -101,14 +94,12 @@ static uint32_t StopAp(struct NetDevice *netDev) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, StopAp); ret = chipDriver->apOps->StopAp(netDev); if (ret != HDF_SUCCESS) { HDF_LOGE("StopAp:failed, error[%d]", ret); return ret; } - return NetIfSetStatus(netDev, NETIF_DOWN); } @@ -141,7 +132,6 @@ static uint32_t GetAssociatedStasCount(struct NetDevice *netDev, uint32_t *num) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, GetAssociatedStasCount); return chipDriver->apOps->GetAssociatedStasCount(netDev, num); } @@ -163,7 +153,6 @@ static int32_t WifiCmdSetAp(const RequestContext *context, struct HdfSBuf *reqDa uint32_t settingLen = 0; const char *ifName = NULL; struct NetDevice *netdev = NULL; - (void)context; (void)rspData; if (reqData == NULL) { @@ -201,7 +190,6 @@ static int32_t WifiCmdSetAp(const RequestContext *context, struct HdfSBuf *reqDa HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - HDF_LOGI("%s:%s starting AP ...", __func__, ifName); return StartAp(netdev, apSettings); } @@ -210,7 +198,6 @@ static int32_t WifiCmdStopAp(const RequestContext *context, struct HdfSBuf *reqD { const char *ifName = NULL; struct NetDevice *netdev = NULL; - (void)context; (void)rspData; if (reqData == NULL) { @@ -222,13 +209,11 @@ static int32_t WifiCmdStopAp(const RequestContext *context, struct HdfSBuf *reqD HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - HDF_LOGI("%s:%s stopping AP ...", __func__, ifName); return StopAp(netdev); } @@ -239,7 +224,6 @@ static int32_t WifiCmdChangeBeacon(const RequestContext *context, struct HdfSBuf WifiApSetting *apSettings = NULL; uint32_t settingLen = 0; const char *ifName = NULL; - (void)context; (void)rspData; if (reqData == NULL) { @@ -277,7 +261,6 @@ static int32_t WifiCmdChangeBeacon(const RequestContext *context, struct HdfSBuf HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - return ChangeBeacon(netdev, apSettings); } @@ -288,7 +271,6 @@ static int32_t WifiCmdStaRemove(const RequestContext *context, struct HdfSBuf *r const char *ifName = NULL; uint32_t dataSize = 0; int32_t ret; - (void)context; (void)rspData; if (reqData == NULL) { @@ -300,20 +282,17 @@ static int32_t WifiCmdStaRemove(const RequestContext *context, struct HdfSBuf *r HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - params.subtype = 0; params.reasonCode = 0; if (!HdfSbufReadBuffer(reqData, (const void **)¶ms.mac, &dataSize) || dataSize != ETH_ADDR_LEN) { HDF_LOGE("%s: %s!ParamName=%s,readSize=%u", __func__, ERROR_DESC_READ_REQ_FAILED, "mac", dataSize); return HDF_FAILURE; } - ret = DelStation(netdev, ¶ms); HDF_LOGI("%s:del station XX:XX:XX:XX:XX:%02X ret=%d", __func__, params.mac[ETH_ADDR_LEN - 1], ret); return ret; @@ -323,7 +302,6 @@ static int32_t GetAssociatedStas(struct NetDevice *netdev, uint32_t num, struct { int32_t ret; WifiStaInfo *staInfo = NULL; - staInfo = (WifiStaInfo *)OsalMemCalloc(sizeof(WifiStaInfo) * num); if (staInfo == NULL) { HDF_LOGE("%s: OsalMemCalloc failed!", __func__); @@ -350,7 +328,6 @@ static int32_t WifiCmdGetAssociatedStas(const RequestContext *context, struct Hd struct NetDevice *netdev = NULL; const char *ifName = NULL; uint32_t num; - (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; @@ -391,7 +368,6 @@ static int32_t WifiCmdSetCountryCode(const RequestContext *context, struct HdfSB const char *ifName = NULL; const char *code = NULL; uint32_t replayDataSize; - (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; diff --git a/model/network/wifi/core/components/sta/sta.c b/model/network/wifi/core/components/sta/sta.c index 3996b7082..aad87e8e1 100644 --- a/model/network/wifi/core/components/sta/sta.c +++ b/model/network/wifi/core/components/sta/sta.c @@ -60,7 +60,6 @@ inline static int32_t AbortScan(struct NetDevice *netDev) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->staOps, AbortScan); return chipDriver->staOps->AbortScan(netDev); } @@ -68,24 +67,20 @@ inline static int32_t AbortScan(struct NetDevice *netDev) static int WifiFillScanParam(struct WlanScanRequest *params, struct HdfSBuf *reqData) { uint32_t dataSize = 0; - if (!HdfSbufReadBuffer(reqData, (const void **)¶ms->bssid, &dataSize)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "apSettings"); return HDF_FAILURE; } - if (!HdfSbufReadBuffer(reqData, (const void **)¶ms->ssids, &dataSize)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ssids"); return HDF_FAILURE; } params->ssidCount = dataSize / sizeof(params->ssids[0]); - if (!HdfSbufReadBuffer(reqData, (const void **)¶ms->extraIEs, &dataSize)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "extraIes"); return HDF_FAILURE; } params->extraIEsLen = dataSize; - if (!HdfSbufReadBuffer(reqData, (const void **)¶ms->freqs, &dataSize)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "freqs"); return HDF_FAILURE; @@ -99,17 +94,14 @@ static int WifiFillScanParam(struct WlanScanRequest *params, struct HdfSBuf *req static uint8_t WifiValidIeAttr(const uint8_t *ie, uint32_t len) { uint8_t elemLen; - if (ie == NULL) { // ie null is normal return true; } - while (len != 0) { if (len < 2) { return false; } len -= 2; - elemLen = ie[1]; if (elemLen > len) { return false; @@ -117,19 +109,16 @@ static uint8_t WifiValidIeAttr(const uint8_t *ie, uint32_t len) len -= elemLen; ie += 2 + elemLen; } - return true; } static int WifiFillAssocParams(WifiAssociateParams *assoc, struct HdfSBuf *reqData) { uint32_t dataSize = 0; - if (!HdfSbufReadBuffer(reqData, (const void **)&assoc->bssid, &dataSize) || dataSize != ETH_ADDR_LEN) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "bssid"); return HDF_FAILURE; } - if (!HdfSbufReadBuffer(reqData, (const void **)&assoc->ssid, &(assoc->ssidLen))) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ssid"); return HDF_FAILURE; @@ -170,7 +159,6 @@ static int WifiFillAssocParams(WifiAssociateParams *assoc, struct HdfSBuf *reqDa HDF_LOGE("%s:void ssid", __func__); return HDF_FAILURE; } - if (WifiValidIeAttr(assoc->ie, assoc->ieLen) == false) { HDF_LOGE("%s:illegal ie", __func__); return HDF_FAILURE; @@ -185,27 +173,23 @@ static int WifiSetAssocParams(const WifiAssociateParams *assoc, const struct Net params->ssidLen = assoc->ssidLen; params->ie = assoc->ie; params->ieLen = assoc->ieLen; - if ((assoc->authType > WIFI_AUTHTYPE_AUTOMATIC) || (assoc->authType == WIFI_AUTHTYPE_SAE)) { HDF_LOGE("%s:illegal authType %u", __func__, assoc->authType); return HDF_FAILURE; } params->authType = assoc->authType; - params->bssid = assoc->bssid; params->privacy = assoc->privacy; if ((assoc->mfp != WIFI_MFP_REQUIRED) && (assoc->mfp != WIFI_MFP_NO) && (assoc->mfp != WIFI_MFP_OPTIONAL)) { HDF_LOGE("%s:unexpected mfp.mfp=%u", __func__, assoc->mfp); return HDF_FAILURE; } - params->mfp = (WifiMfp)assoc->mfp; if (assoc->key != NULL) { params->key = assoc->key; params->keyLen = assoc->keyLen; params->keyIdx = assoc->keyIdx; } - if (memcpy_s(¶ms->crypto, sizeof(WifiCryptoSetting), assoc->crypto, sizeof(WifiCryptoSetting)) != EOK) { HDF_LOGE("%s:copy crypto failed!", __func__); return HDF_FAILURE; @@ -221,7 +205,6 @@ static int32_t WifiCmdAssoc(const RequestContext *context, struct HdfSBuf *reqDa struct WlanHwCapability *capability = NULL; const char *ifName = NULL; int32_t ret; - (void)context; (void)rspData; if (reqData == NULL) { @@ -236,7 +219,6 @@ static int32_t WifiCmdAssoc(const RequestContext *context, struct HdfSBuf *reqDa if (WifiFillAssocParams(&assoc, reqData) != HDF_SUCCESS) { return HDF_FAILURE; } - if ((netdev = NetDeviceGetInstByName(ifName)) == NULL) { HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; @@ -244,7 +226,6 @@ static int32_t WifiCmdAssoc(const RequestContext *context, struct HdfSBuf *reqDa if (WifiSetAssocParams(&assoc, netdev, ¶ms) != HDF_SUCCESS) { return HDF_FAILURE; } - capability = GetHwCapability(netdev); if (capability == NULL) { HDF_LOGE("%s:GetHwCapability failed!", __func__); @@ -259,12 +240,10 @@ static int32_t WifiCmdAssoc(const RequestContext *context, struct HdfSBuf *reqDa break; } } while (false); - if (capability->Release != NULL) { capability->Release(capability); capability = NULL; } - return ret; } @@ -274,7 +253,6 @@ static int32_t WifiCmdDisconnect(const RequestContext *context, struct HdfSBuf * uint16_t reasonCode; const char *ifName = NULL; int ret; - (void)context; (void)rspData; if (reqData == NULL) { @@ -286,7 +264,6 @@ static int32_t WifiCmdDisconnect(const RequestContext *context, struct HdfSBuf * HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - if (!HdfSbufReadUint16(reqData, &reasonCode)) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "reasonCode"); return HDF_FAILURE; @@ -296,7 +273,6 @@ static int32_t WifiCmdDisconnect(const RequestContext *context, struct HdfSBuf * HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - HDF_LOGW("%s:%s disconnecting from AP...", __func__, ifName); ret = Disconnect(netdev, reasonCode); if (ret != HDF_SUCCESS) { @@ -311,7 +287,6 @@ static int32_t WifiCmdScan(const RequestContext *context, struct HdfSBuf *reqDat const char *ifName = NULL; struct WlanScanRequest params = { 0 }; int32_t ret; - (void)context; (void)rspData; if (reqData == NULL) { @@ -332,7 +307,6 @@ static int32_t WifiCmdScan(const RequestContext *context, struct HdfSBuf *reqDat if (ret != HDF_SUCCESS) { return ret; } - ret = ScanAll(netdev, ¶ms); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:ScanAll failed!ret=%d", __func__, ret); @@ -345,10 +319,8 @@ static int32_t WifiCmdAbortScan(const RequestContext *context, struct HdfSBuf *r struct NetDevice *netdev = NULL; int32_t ret; const char *ifName = HdfSbufReadString(reqData); - (void)context; (void)rspData; - if (ifName == NULL) { HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; @@ -362,7 +334,6 @@ static int32_t WifiCmdAbortScan(const RequestContext *context, struct HdfSBuf *r if (ret != HDF_SUCCESS) { HDF_LOGE("%s:AbortScan failed!ret=%d", __func__, ret); } - // keep return SUCCESS if AbortScan return FAILED return HDF_SUCCESS; } @@ -396,14 +367,12 @@ static int32_t WifiCmdSetScanningMacAddress(const RequestContext *context, struc HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "mac"); return HDF_FAILURE; } - chipDriver = GetChipDriver(netdev); if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->staOps, SetScanningMacAddress); - ret = chipDriver->staOps->SetScanningMacAddress(netdev, mac, IEEE80211_MAC_ADDR_LEN); if (ret != HDF_SUCCESS && ret != HDF_ERR_NOT_SUPPORT) { HDF_LOGE("%s: fail to do set scanning mac addr!ret=%d", __func__, ret); diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index d0886685e..eb3240dbb 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -366,13 +366,11 @@ static int32_t WifiCmdEnableEapol(const RequestContext *context, struct HdfSBuf HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); return HDF_FAILURE; } - eapol.callback = (void *)HdfWifiEventEapolRecv; eapol.context = NULL; @@ -383,7 +381,6 @@ static int32_t WifiCmdDisableEapol(const RequestContext *context, struct HdfSBuf { struct NetDevice *netdev = NULL; const char *ifName = NULL; - (void)context; (void)rspData; if (reqData == NULL) { @@ -395,7 +392,6 @@ static int32_t WifiCmdDisableEapol(const RequestContext *context, struct HdfSBuf HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s:netdev not found!ifName=%s", __func__, ifName); @@ -410,7 +406,6 @@ static int32_t WifiCmdGetAddr(const RequestContext *context, struct HdfSBuf *req struct NetDevice *netdev = NULL; const char *ifName = NULL; int32_t ret = HDF_SUCCESS; - (void)context; if (reqData == NULL || rspData == NULL) { HDF_LOGE("%s: reqData or rspData is NULL", __func__); @@ -421,7 +416,6 @@ static int32_t WifiCmdGetAddr(const RequestContext *context, struct HdfSBuf *req HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s: invalid netdev", __func__); @@ -437,9 +431,7 @@ static int32_t WifiCmdGetAddr(const RequestContext *context, struct HdfSBuf *req static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { struct NetDevice *netdev = NULL; - WifiSetMode *mode = NULL; - const char *ifName = NULL; uint32_t dataSize = 0; int32_t ret; @@ -465,9 +457,7 @@ static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *req HDF_LOGE("%s: invalid netdev", __func__); return HDF_FAILURE; } - HDF_LOGW("%s:%s changing mode to %u ...", __func__, ifName, mode->iftype); - ret = SetMode(netdev, mode->iftype); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: fail to do change intf,%d", __func__, ret); @@ -535,7 +525,6 @@ static uint32_t GetDeviceMacAddr(struct NetDevice *netdev, int32_t type, uint8_t } RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, GetDeviceMacAddr); - return chipDriver->ops->GetDeviceMacAddr(netdev, type, mac, len); } @@ -546,7 +535,6 @@ static uint32_t SetMacAddr(struct NetDevice *netdev, uint8_t *mac, uint8_t len) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, SetMacAddr); return chipDriver->ops->SetMacAddr(netdev, mac, len); } @@ -592,19 +580,16 @@ static int32_t WifiCmdGetHwFeature(const RequestContext *context, struct HdfSBuf HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); return HDF_FAILURE; } - netdev = NetDeviceGetInstByName(ifName); if (netdev == NULL) { HDF_LOGE("%s: invalid netdev", __func__); return HDF_FAILURE; } - ret = WifiFillHwFeature(netdev, &featureData); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: WifiFillHwFeature failed!ret=%d", __func__, ret); return HDF_FAILURE; } - if (!HdfSbufWriteBuffer(rspData, &featureData, sizeof(featureData))) { HDF_LOGE("%s: %s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); ret = HDF_ERR_IO; @@ -615,7 +600,6 @@ static int32_t WifiCmdGetHwFeature(const RequestContext *context, struct HdfSBuf static int32_t SetNetIfInfo(struct NetDevice *netdev, uint32_t type) { int ret = 0; - if (netdev != NULL) { ret = netdev->netDeviceIf->open(netdev); (void)NetIfSetStatus(netdev, NETIF_UP); @@ -641,7 +625,6 @@ static void SetNetworkAddr(struct NetDevice *netdev, uint32_t type) IpV4Addr ip; IpV4Addr netmask; IpV4Addr gw; - if (type == WIFI_IFTYPE_STATION) { ip.addr = 0x00000000UL; netmask.addr = 0x00000000UL; @@ -662,7 +645,6 @@ static void UnsetNetworkAddr(struct NetDevice *netdev) IpV4Addr ip = { 0x00000000UL }; IpV4Addr netmask = { 0x00000000UL }; IpV4Addr gw = { 0x00000000UL }; - if (netdev != NULL) { NetIfSetAddr(netdev, &ip, &netmask, &gw); } @@ -715,7 +697,6 @@ static int32_t WifiSendMlme(const RequestContext *context, struct HdfSBuf *reqDa (void)context; (void)reqData; (void)rspData; - return HDF_SUCCESS; } @@ -814,7 +795,6 @@ static int32_t WifiCmdGetNetworkInfo(const RequestContext *context, struct HdfSB static int32_t WifiCmdIsSupportCombo(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { uint8_t isComboValid; - (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; @@ -1215,9 +1195,7 @@ static int32_t WifiCmdDoResetChip(const RequestContext *context, struct HdfSBuf HDF_LOGE("%s:power reset failed!", __func__); return ERR_POWER_RESET_FAIL; } - ret = HdfWifiInitDevice(wlanDevice); - return ret; } diff --git a/model/network/wifi/platform/src/hdf_wlan_power_manager.c b/model/network/wifi/platform/src/hdf_wlan_power_manager.c index f7a598b00..ca16195b1 100644 --- a/model/network/wifi/platform/src/hdf_wlan_power_manager.c +++ b/model/network/wifi/platform/src/hdf_wlan_power_manager.c @@ -147,7 +147,6 @@ struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *c HDF_LOGE("%s: configPowers is NULL", __func__); return NULL; } - powerMgrimpl = (struct PowerManagerImpl *)OsalMemCalloc(sizeof(struct PowerManagerImpl)); if (powerMgrimpl == NULL) { HDF_LOGE("%s: OsalMemCalloc fail! ", __func__); @@ -158,6 +157,5 @@ struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *c powerMgrimpl->base.Release = HdfWlanPowerMgrRelease; powerMgrimpl->powerDatas.power0 = configPowers->power0; powerMgrimpl->powerDatas.power1 = configPowers->power1; - return (struct PowerManager *)powerMgrimpl; } \ No newline at end of file diff --git a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c index 89dfa48ba..a4892c8ba 100644 --- a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c +++ b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c @@ -52,7 +52,6 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun DestroyPriorityQueue((PriorityQueue *)priorityQueue); return NULL; } - status = OsalSemInit(&priorityQueue->messageSemaphore, 0); if (status != HDF_SUCCESS) { DestroyPriorityQueue((PriorityQueue *)priorityQueue); diff --git a/model/network/wifi/platform/src/hdf_wlan_utils.c b/model/network/wifi/platform/src/hdf_wlan_utils.c index c8c93e5d2..f2dee1cf7 100644 --- a/model/network/wifi/platform/src/hdf_wlan_utils.c +++ b/model/network/wifi/platform/src/hdf_wlan_utils.c @@ -1,10 +1,10 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ #include "hdf_wlan_utils.h" #include @@ -45,7 +45,7 @@ struct WlanHwCapability *GetHwCapability(struct NetDevice *netDev) { struct HdfChipDriver *chipDriver = GetChipDriver(netDev); struct WlanHwCapability *capability = NULL; - int32_t ret; + int32_t ret; if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return NULL; @@ -223,7 +223,7 @@ char *HdfWlanGetIfNames(const uint8_t chipId, uint8_t *ifNameCount) char *ifNames = NULL; uint32_t bufferSize; uint8_t i, j; - int32_t ret; + int32_t ret; if (ifNameCount == NULL) { HDF_LOGE("%s: para is NULL", __func__); return NULL; @@ -241,24 +241,20 @@ char *HdfWlanGetIfNames(const uint8_t chipId, uint8_t *ifNameCount) (*ifNameCount)++; } } - if (*ifNameCount == 0) { // Never alloc 0 size bufferSize = sizeof(char); } else { bufferSize = IFNAMSIZ * (uint32_t)(*ifNameCount); } - ifNames = (char *)OsalMemCalloc(bufferSize); if (ifNames == NULL) { HDF_LOGE("%s: oom!", __func__); return NULL; } - if (*ifNameCount == 0) { return ifNames; } - for (i = 0, j = 0; i < MAX_IF_COUNT; i++) { if (((netIfMapTemp >> i) & 0x1) == 0) { continue; -- Gitee From d56e988fb0ea54402dca5c958d8924a9476a3556 Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Sat, 23 Oct 2021 16:33:49 +0800 Subject: [PATCH 109/272] =?UTF-8?q?1022=E4=BB=A3=E7=A0=81=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/include/hdmi/hdmi_cec.h | 23 + support/platform/src/hdmi/hdmi_cec.c | 598 +++++++++++------------ 2 files changed, 322 insertions(+), 299 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_cec.h b/support/platform/include/hdmi/hdmi_cec.h index 122bc46fb..838547c4f 100644 --- a/support/platform/include/hdmi/hdmi_cec.h +++ b/support/platform/include/hdmi/hdmi_cec.h @@ -1642,6 +1642,29 @@ struct HdmiCecMsg { uint32_t timeout; /* Indicates the maximum time(in ms) for the peer to reply to a message. */ }; +#define HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT 0 +#define HDMI_CEC_MSG_DATA_FIRST_ELEMENT 1 +#define HDMI_CEC_MSG_DATA_SECOND_ELEMENT 2 +#define HDMI_CEC_MSG_DATA_THIRD_ELEMENT 3 +#define HDMI_CEC_MSG_DATA_FORTH_ELEMENT 4 +#define HDMI_CEC_MSG_DATA_FIFTH_ELEMENT 5 +#define HDMI_CEC_MSG_DATA_SIXTH_ELEMENT 6 +#define HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT 7 +#define HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT 8 +#define HDMI_CEC_MSG_DATA_NINTH_ELEMENT 9 + +#define DATA_ZEROTH_OFFSET_ELEMENT 0 +#define DATA_FIRST_OFFSET_ELEMENT 1 +#define DATA_SECOND_OFFSET_ELEMENT 2 +#define DATA_THIRD_OFFSET_ELEMENT 3 +#define DATA_FORTH_OFFSET_ELEMENT 4 +#define DATA_FIFTH_OFFSET_ELEMENT 5 +#define DATA_SIXTH_OFFSET_ELEMENT 6 +#define DATA_SEVENTH_OFFSET_ELEMENT 7 +#define DATA_EIGHTH_OFFSET_ELEMENT 8 +#define DATA_NINTH_OFFSET_ELEMENT 9 +#define DATA_TENTH_OFFSET_ELEMENT 10 + struct HdmiCecInfo { uint8_t logAddr; uint8_t logAddrType; diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index b91093f33..ddcfe4de4 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -147,10 +147,10 @@ static struct HdmiCecMsgLenInfo *HdmiCecGetMsgLenInfo(uint8_t opcode) static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) { - uint8_t info = (msg->data[2] & 0xf); /* Progremmed Info or Not Progremmed Error Info. */ + uint8_t info = (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0xf); /* Progremmed Info or Not Progremmed Error Info. */ /* Progremmed Indicator Check. */ - if ((msg->data[2] & 0x10) > 0) { + if ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0x10) > 0) { if ((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC || info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE) && msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN)) { @@ -168,7 +168,7 @@ static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) static bool HdmiCecCheckRecordOnMsgLen(struct HdmiCecMsg *msg) { - switch (msg->data[2]) { + switch (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]) { case HDMI_CEC_RECORD_SRC_OWN: break; case HDMI_CEC_RECORD_SRC_DIGITAL: @@ -254,37 +254,37 @@ static bool HdmiCecCheckMsgLen(struct HdmiCec *cec, struct HdmiCecMsg *msg, uint void HdmiCecEncodingActiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_ACTIVE_SOURCE; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ACTIVE_SOURCE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingImageViewOnMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_IMAGE_VIEW_ON; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_IMAGE_VIEW_ON; } void HdmiCecEncodingTextViewOnMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_TEXT_VIEW_ON; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TEXT_VIEW_ON; } void HdmiCecEncodingInactiveSourceMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_INACTIVE_SOURCE; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_INACTIVE_SOURCE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingRequestActiveSourceMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_ACTIVE_SOURCE; } @@ -293,12 +293,12 @@ void HdmiCecEncodingRequestActiveSourceMsg(struct HdmiCecMsg *msg, bool response void HdmiCecEncodingRoutingChangeMsg(struct HdmiCecMsg *msg, uint16_t orgAddr, uint16_t newAddr, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_ROUTING_CHANGE; - msg->data[2] = (orgAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (orgAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = (newAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[5] = (newAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ROUTING_CHANGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (orgAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (orgAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (newAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (newAddr & HDMI_ONE_BYTE_MARK); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_ROUTING_INFORMATION; } @@ -307,31 +307,31 @@ void HdmiCecEncodingRoutingChangeMsg(struct HdmiCecMsg *msg, uint16_t orgAddr, u void HdmiCecEncodingRoutingInfomationMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_ROUTING_INFORMATION; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ROUTING_INFORMATION; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingSetStreamPathMsg(struct HdmiCecMsg *msg, uint16_t phyAddr) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_SET_STREAM_PATH; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_STREAM_PATH; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingStandbyMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_STANDBY; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_STANDBY; } void HdmiCecEncodingRecordOffMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_OFF; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_OFF; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_RECORD_STATUS; } @@ -340,8 +340,8 @@ void HdmiCecEncodingRecordOffMsg(struct HdmiCecMsg *msg, bool response) static void HdmiCecEncodingRecordOnOwn(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; - msg->data[2] = HDMI_CEC_RECORD_SRC_OWN; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_OWN; } static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct HdmiCecDigitalServiceId *digital) @@ -350,13 +350,13 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H return; } - data[0] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | (digital->system); + data[DATA_ZEROTH_OFFSET_ELEMENT] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | (digital->system); if (digital->method == HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL) { - data[1] = (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + data[DATA_FIRST_OFFSET_ELEMENT] = (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); - data[2] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK; - data[3] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT; - data[4] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK; + data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK; + data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT; + data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK; return; } switch (digital->system) { @@ -364,33 +364,33 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ARIB_T: - data[1] = digital->systemData.arib.transportId >> HDMI_ONE_BYTE_SHIFT; - data[2] = digital->systemData.arib.transportId & HDMI_ONE_BYTE_MARK; - data[3] = digital->systemData.arib.serviceId >> HDMI_ONE_BYTE_SHIFT; - data[4] = digital->systemData.arib.serviceId & HDMI_ONE_BYTE_MARK; - data[5] = digital->systemData.arib.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; - data[6] = digital->systemData.arib.orgNetworkId & HDMI_ONE_BYTE_MARK; + data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.arib.transportId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.arib.transportId & HDMI_ONE_BYTE_MARK; + data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.arib.serviceId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.arib.serviceId & HDMI_ONE_BYTE_MARK; + data[DATA_FIFTH_OFFSET_ELEMENT] = digital->systemData.arib.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_SIXTH_OFFSET_ELEMENT] = digital->systemData.arib.orgNetworkId & HDMI_ONE_BYTE_MARK; break; case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_SATELLITE: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_ATSC_TERRESTRIAL: - data[1] = digital->systemData.atsc.transportId >> HDMI_ONE_BYTE_SHIFT; - data[2] = digital->systemData.atsc.transportId & HDMI_ONE_BYTE_MARK; - data[3] = digital->systemData.atsc.programNumber >> HDMI_ONE_BYTE_SHIFT; - data[4] = digital->systemData.atsc.programNumber & HDMI_ONE_BYTE_MARK; + data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.atsc.transportId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.atsc.transportId & HDMI_ONE_BYTE_MARK; + data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.atsc.programNumber >> HDMI_ONE_BYTE_SHIFT; + data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.atsc.programNumber & HDMI_ONE_BYTE_MARK; break; case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_C: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_S2: case HDMI_CEC_DIG_SERVICE_BCAST_SYSTEM_DVB_T: - data[1] = digital->systemData.dvb.transportId >> HDMI_ONE_BYTE_SHIFT; - data[2] = digital->systemData.dvb.transportId & HDMI_ONE_BYTE_MARK; - data[3] = digital->systemData.dvb.serviceId >> HDMI_ONE_BYTE_SHIFT; - data[4] = digital->systemData.dvb.serviceId & HDMI_ONE_BYTE_MARK; - data[5] = digital->systemData.dvb.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; - data[6] = digital->systemData.dvb.orgNetworkId & HDMI_ONE_BYTE_MARK; + data[DATA_FIRST_OFFSET_ELEMENT] = digital->systemData.dvb.transportId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.dvb.transportId & HDMI_ONE_BYTE_MARK; + data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.dvb.serviceId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.dvb.serviceId & HDMI_ONE_BYTE_MARK; + data[DATA_FIFTH_OFFSET_ELEMENT] = digital->systemData.dvb.orgNetworkId >> HDMI_ONE_BYTE_SHIFT; + data[DATA_SIXTH_OFFSET_ELEMENT] = digital->systemData.dvb.orgNetworkId & HDMI_ONE_BYTE_MARK; break; default: HDF_LOGE("digital system 0x%x is invalid", digital->system); @@ -400,38 +400,38 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H static void HdmiCecEncodingRecordOnDigital(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; - msg->data[2] = HDMI_CEC_RECORD_SRC_DIGITAL; - HdmiCecEncodingDigitalServiceId(&(msg->data[3]), HDMI_CEC_DIGITAL_SERVICE_ID_LEN, digital); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_DIGITAL; + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), HDMI_CEC_DIGITAL_SERVICE_ID_LEN, digital); } static void HdmiCecEncodingRecordOnAnalog(struct HdmiCecMsg *msg, uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_ANALOG_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; - msg->data[2] = HDMI_CEC_RECORD_SRC_ANALOG; - msg->data[3] = anaBcastType; - msg->data[4] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); - msg->data[5] = (anaFreq & HDMI_ONE_BYTE_MARK); - msg->data[6] = bcstSystem; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_ANALOG; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = anaBcastType; + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = bcstSystem; } static void HdmiCecEncodingRecordOnExtPlug(struct HdmiCecMsg *msg, uint8_t extPlug) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PLUG_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; - msg->data[2] = HDMI_CEC_RECORD_SRC_EXT_PLUG; - msg->data[3] = extPlug; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_EXT_PLUG; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = extPlug; } static void HdmiCecEncodingRecordOnExtPhyAddr(struct HdmiCecMsg *msg, uint16_t extPhyAddr) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_EXT_PHY_ADDR_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_ON; - msg->data[2] = HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR; - msg->data[3] = (extPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[4] = (extPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_EXT_PHY_ADDR; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (extPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (extPhyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSource *src, bool response) @@ -465,14 +465,14 @@ void HdmiCecEncodingRecordOnMsg(struct HdmiCecMsg *msg, struct HdmiCecRecordSour void HdmiCecEncodingRecordStatusMsg(struct HdmiCecMsg *msg, uint8_t recordStatusInfo) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_STATUS; - msg->data[2] = recordStatusInfo; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = recordStatusInfo; } void HdmiCecEncodingRecordTvScreenMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_RECORD_TV_SCREEN; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_TV_SCREEN; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_RECORD_ON; } @@ -483,13 +483,13 @@ static void HdmiCecEncodingCommTimerInfo(uint8_t *data, uint8_t len, struct Hdmi if (len < HDMI_CEC_COMM_TIMER_INFO_LEN) { return; } - data[0] = info->data; - data[1] = info->month; - data[2] = HDMI_CEC_BCD_FORMAT_TIME(info->startHour); - data[3] = HDMI_CEC_BCD_FORMAT_TIME(info->startMinute); - data[4] = HDMI_CEC_BCD_FORMAT_TIME(info->durationHour); - data[5] = HDMI_CEC_BCD_FORMAT_TIME(info->durationMinute); - data[6] = info->recordingSeq; + data[DATA_ZEROTH_OFFSET_ELEMENT] = info->data; + data[DATA_FIRST_OFFSET_ELEMENT] = info->month; + data[DATA_SECOND_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->startHour); + data[DATA_THIRD_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->startMinute); + data[DATA_FORTH_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->durationHour); + data[DATA_FIFTH_OFFSET_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(info->durationMinute); + data[DATA_SIXTH_OFFSET_ELEMENT] = info->recordingSeq; } static void HdmiCecEncodingAnalogueTimerInfo(uint8_t *data, uint8_t len, struct HdmiCecAnalogueTimerInfo *info) @@ -498,17 +498,17 @@ static void HdmiCecEncodingAnalogueTimerInfo(uint8_t *data, uint8_t len, struct return; } HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); - data[7] = info->anaBcastType; - data[8] = (info->anaFreq >> HDMI_ONE_BYTE_SHIFT); - data[9] = (info->anaFreq & HDMI_ONE_BYTE_MARK); - data[10] = info->bcstSystem; + data[DATA_SEVENTH_OFFSET_ELEMENT] = info->anaBcastType; + data[DATA_EIGHTH_OFFSET_ELEMENT] = (info->anaFreq >> HDMI_ONE_BYTE_SHIFT); + data[DATA_NINTH_OFFSET_ELEMENT] = (info->anaFreq & HDMI_ONE_BYTE_MARK); + data[DATA_TENTH_OFFSET_ELEMENT] = info->bcstSystem; } void HdmiCecEncodingClearAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER; - HdmiCecEncodingAnalogueTimerInfo(&(msg->data[2]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER; + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -520,14 +520,14 @@ static void HdmiCecEncodingDigitalTimerInfo(uint8_t *data, uint8_t len, struct H return; } HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); - HdmiCecEncodingDigitalServiceId(&data[7], len - HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->id)); + HdmiCecEncodingDigitalServiceId(&data[DATA_SEVENTH_OFFSET_ELEMENT], len - HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->id)); } void HdmiCecEncodingClearDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER; - HdmiCecEncodingDigitalTimerInfo(&(msg->data[2]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER; + HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -539,17 +539,17 @@ static void HdmiCecEncodingExternalTimerInfo(uint8_t *data, uint8_t len, struct return; } HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); - data[7] = info->extSrcSpec; - data[8] = info->extPlug; - data[9] = (info->extPhyAddr >> HDMI_ONE_BYTE_SHIFT); - data[10] = (info->extPhyAddr & HDMI_ONE_BYTE_MARK); + data[DATA_SEVENTH_OFFSET_ELEMENT] = info->extSrcSpec; + data[DATA_EIGHTH_OFFSET_ELEMENT] = info->extPlug; + data[DATA_NINTH_OFFSET_ELEMENT] = (info->extPhyAddr >> HDMI_ONE_BYTE_SHIFT); + data[DATA_TENTH_OFFSET_ELEMENT] = (info->extPhyAddr & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER; - HdmiCecEncodingExternalTimerInfo(&(msg->data[2]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER; + HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -558,8 +558,8 @@ void HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCec void HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAnalogueTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER; - HdmiCecEncodingAnalogueTimerInfo(&(msg->data[2]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER; + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -568,8 +568,8 @@ void HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAn void HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_DIGITAL_TIMER; - HdmiCecEncodingDigitalTimerInfo(&(msg->data[2]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_DIGITAL_TIMER; + HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -578,8 +578,8 @@ void HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDig void HdmiCecEncodingSetExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecExternalTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER; - HdmiCecEncodingExternalTimerInfo(&(msg->data[2]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER; + HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -595,8 +595,8 @@ void HdmiCecEncodingSetTimerProgramTitleMsg(struct HdmiCecMsg *msg, uint8_t *tit } length = ((len <= HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN) ? len : HDMI_CEC_PROGRAM_TITLE_STR_MAX_LEN); msg->len = HDMI_CEC_GET_MSG_LEN(length); - msg->data[1] = HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE; - if (memcpy_s(&(msg->data[2]), (msg->len - 2), title, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - 2), title, length) != EOK) { HDF_LOGE("encoding set timer program title, memcpy_s fail."); } } @@ -604,8 +604,8 @@ void HdmiCecEncodingSetTimerProgramTitleMsg(struct HdmiCecMsg *msg, uint8_t *tit void HdmiCecEncodingTimerClearedStatusMsg(struct HdmiCecMsg *msg, uint8_t status) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; - msg->data[2] = status; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status; } void HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTimerStatusData *status) @@ -613,11 +613,11 @@ void HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTimerSt bool duration = false; msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN); - msg->data[1] = HDMI_CEC_OPCODE_TIMER_STATUS; - msg->data[2] |= (status->timerOverlap << 7); - msg->data[2] |= (status->mediaInfo << 5); - msg->data[2] |= (status->progInfo.indicator << 4); - msg->data[2] |= (status->progInfo.info); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TIMER_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->timerOverlap << 7); + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->mediaInfo << 5); + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->progInfo.indicator << 4); + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] |= (status->progInfo.info); if (status->progInfo.indicator > 0) { /* Progremmed Info */ if (status->progInfo.info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC || @@ -632,22 +632,22 @@ void HdmiCecEncodingTimerStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTimerSt } if (duration == true) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN); - msg->data[3] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationHour); - msg->data[4] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationMinute); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationHour); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CEC_BCD_FORMAT_TIME(status->progInfo.durationMinute); } } void HdmiCecEncodingCecVersionMsg(struct HdmiCecMsg *msg, uint8_t version) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_CEC_VERSION; - msg->data[2] = version; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CEC_VERSION; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = version; } void HdmiCecEncodingGetCecVersionMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GET_CEC_VERSION; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GET_CEC_VERSION; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_CEC_VERSION; } @@ -656,7 +656,7 @@ void HdmiCecEncodingGetCecVersionMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingGetPhyAddressMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS; } @@ -665,7 +665,7 @@ void HdmiCecEncodingGetPhyAddressMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingGetMenuLanguageMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GET_MENU_LANGUAGE; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GET_MENU_LANGUAGE; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; } @@ -674,11 +674,11 @@ void HdmiCecEncodingGetMenuLanguageMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingReportPhyAddressMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, uint8_t deviceType) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = deviceType; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = deviceType; } void HdmiCecEncodingSetMenuLanguageMsg(struct HdmiCecMsg *msg, uint8_t *language, uint32_t len) @@ -689,9 +689,9 @@ void HdmiCecEncodingSetMenuLanguageMsg(struct HdmiCecMsg *msg, uint8_t *language } msg->len = HDMI_CEC_GET_MSG_LEN(len); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; - if (memcpy_s(&(msg->data[2]), (msg->len - 2), language, len) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - 2), language, len) != EOK) { HDF_LOGE("encoding set menu language, memcpy_s fail."); } } @@ -701,11 +701,11 @@ void HdmiCecEncodingReportFeaturesMsg(struct HdmiCecMsg *msg, struct HdmiCecInfo uint32_t i; msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_REPORT_FEATURES; - msg->data[2] = info->cecVersion; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_FEATURES; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = info->cecVersion; msg->len++; - msg->data[3] = info->allDeviceType; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = info->allDeviceType; msg->len++; /* fill RC Profile. */ for (i = 0; i < HDMI_CEC_RC_PROFILE_MAX_NUM; i++) { @@ -728,7 +728,7 @@ void HdmiCecEncodingReportFeaturesMsg(struct HdmiCecMsg *msg, struct HdmiCecInfo void HdmiCecEncodingGiveFeaturesMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_FEATURES; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_FEATURES; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_SET_MENU_LANGUAGE; } @@ -738,22 +738,22 @@ void HdmiCecEncodingGiveFeaturesMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingDeckControlMsg(struct HdmiCecMsg *msg, uint8_t mode) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_DECK_CONTROL; - msg->data[2] = mode; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DECK_CONTROL; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = mode; } void HdmiCecEncodingDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t info) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_DECK_STATUS; - msg->data[2] = info; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DECK_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = info; } void HdmiCecEncodingGiveDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_DECK_STATUS; - msg->data[2] = statusReq; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DECK_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = statusReq; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_DECK_STATUS; } @@ -762,15 +762,15 @@ void HdmiCecEncodingGiveDeckStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, void HdmiCecEncodingPlayMsg(struct HdmiCecMsg *msg, uint8_t playMode) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_PLAY; - msg->data[2] = playMode; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_PLAY; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = playMode; } void HdmiCecEncodingGiveTunerDeviceStatusMsg(struct HdmiCecMsg *msg, uint8_t statusReq, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS; - msg->data[2] = statusReq; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = statusReq; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS; } @@ -780,33 +780,33 @@ void HdmiCecEncodingSelectAnalogueServiceMsg(struct HdmiCecMsg *msg, uint8_t anaBcastType, uint16_t anaFreq, uint8_t bcstSystem) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE; - msg->data[2] = anaBcastType; - msg->data[3] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); - msg->data[4] = (anaFreq & HDMI_ONE_BYTE_MARK); - msg->data[5] = bcstSystem; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = anaBcastType; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = bcstSystem; } void HdmiCecEncodingSelectDigitalServiceMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalServiceId *digital) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE; - HdmiCecEncodingDigitalServiceId(&(msg->data[2]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, digital); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE; + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, digital); } void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTunerDeviceInfo *info) { - msg->data[1] = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS; - msg->data[2] = (info->recordingFlag << 7) | (info->dispInfo); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (info->recordingFlag << 7) | (info->dispInfo); if (info->isAnalogService == true) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN); - msg->data[3] = info->data.analog.anaBcastType; - msg->data[4] = (info->data.analog.anaFreq >> HDMI_ONE_BYTE_SHIFT); - msg->data[5] = (info->data.analog.anaFreq & HDMI_ONE_BYTE_MARK); - msg->data[6] = info->data.analog.bcstSystem; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = info->data.analog.anaBcastType; + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (info->data.analog.anaFreq >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->data.analog.anaFreq & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = info->data.analog.bcstSystem; } else { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_DIG_PARAM_LEN); - HdmiCecEncodingDigitalServiceId(&(msg->data[3]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, &(info->data.digital)); } } @@ -814,28 +814,28 @@ void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecT void HdmiCecEncodingTunerStepDecrementMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT; } void HdmiCecEncodingTunerStepIncrementMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT; } void HdmiCecEncodingDeviceVendorIdMsg(struct HdmiCecMsg *msg, uint32_t devVendorId) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID; - msg->data[2] = (devVendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; - msg->data[3] = (devVendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; - msg->data[4] = (devVendorId & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (devVendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (devVendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (devVendorId & HDMI_ONE_BYTE_MARK); } void HdmiCecEncodingGiveDeviceVendorIdMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_DEVICE_VENDOR_ID; } @@ -851,8 +851,8 @@ void HdmiCecEncodingVendorCommandMsg(struct HdmiCecMsg *msg, uint8_t *data, uint } length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_DATA_MAX_LEN : len; msg->len = HDMI_CEC_GET_MSG_LEN(length); - msg->data[1] = HDMI_CEC_OPCODE_VENDOR_COMMAND; - if (memcpy_s(&(msg->data[2]), (msg->len - 2), data, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_COMMAND; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - 2), data, length) != EOK) { HDF_LOGE("encoding vendor cmd, memcpy_s fail."); } } @@ -868,11 +868,11 @@ void HdmiCecEncodingVendorCommandWithIdMsg(struct HdmiCecMsg *msg, uint32_t vend length = (len > HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_DATA_WITH_ID_MAX_LEN : len; msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN + length); - msg->data[1] = HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID; - msg->data[2] = (vendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; - msg->data[3] = (vendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; - msg->data[4] = (vendorId & HDMI_ONE_BYTE_MARK); - if (memcpy_s(&(msg->data[5]), (msg->len - 5), data, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (vendorId >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (vendorId >> HDMI_ONE_BYTE_SHIFT) & HDMI_ONE_BYTE_MARK; + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (vendorId & HDMI_ONE_BYTE_MARK); + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT]), (msg->len - 5), data, length) != EOK) { HDF_LOGE("encoding vendor cmd with id, memcpy_s fail."); } } @@ -887,8 +887,8 @@ void HdmiCecEncodingVendorRemoteButtonDownMsg(struct HdmiCecMsg *msg, uint8_t *r } length = (len > HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN) ? HDMI_CEC_VENDOR_SPECIFIC_RC_CODE_MAX_LEN : len; msg->len = HDMI_CEC_GET_MSG_LEN(length); - msg->data[1] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN; - if (memcpy_s(&(msg->data[2]), (msg->len - 2), rcCode, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - 2), rcCode, length) != EOK) { HDF_LOGE("encoding vendor remote button down, memcpy_s fail."); } } @@ -896,7 +896,7 @@ void HdmiCecEncodingVendorRemoteButtonDownMsg(struct HdmiCecMsg *msg, uint8_t *r void HdmiCecEncodingVendorRemoteButtonUpMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP; } void HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg *msg, uint8_t dispControl, uint8_t *str, uint32_t len) @@ -909,9 +909,9 @@ void HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg *msg, uint8_t dispControl, } length = (len > HDMI_CEC_OSD_STRING_MAX_LEN) ? HDMI_CEC_OSD_STRING_MAX_LEN : len; msg->len = HDMI_CEC_GET_MSG_LEN(length + HDMI_CEC_DISPLAY_CONTROL_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_OSD_STRING; - msg->data[2] = dispControl; - if (memcpy_s(&(msg->data[3]), (msg->len - 3), str, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_OSD_STRING; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = dispControl; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), (msg->len - 3), str, length) != EOK) { HDF_LOGE("encoding set OSD string, memcpy_s fail."); } } @@ -919,7 +919,7 @@ void HdmiCecEncodingSetOsdStringMsg(struct HdmiCecMsg *msg, uint8_t dispControl, void HdmiCecEncodingGiveOsdNameMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_OSD_NAME; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_OSD_NAME; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_SET_OSD_NAME; } @@ -935,8 +935,8 @@ void HdmiCecEncodingSetOsdNameMsg(struct HdmiCecMsg *msg, uint8_t *name, uint32_ } length = (len > HDMI_CEC_OSD_NAME_MAX_LEN) ? HDMI_CEC_OSD_NAME_MAX_LEN : len; msg->len = HDMI_CEC_GET_MSG_LEN(length); - msg->data[1] = HDMI_CEC_OPCODE_SET_OSD_NAME; - if (memcpy_s(&(msg->data[2]), (msg->len - 2), name, length) != EOK) { + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_OSD_NAME; + if (memcpy_s(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), (msg->len - 2), name, length) != EOK) { HDF_LOGE("encoding set OSD name, memcpy_s fail."); } } @@ -944,8 +944,8 @@ void HdmiCecEncodingSetOsdNameMsg(struct HdmiCecMsg *msg, uint8_t *name, uint32_ void HdmiCecEncodingMenuRequestMsg(struct HdmiCecMsg *msg, uint8_t menuReq, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_MENU_REQUEST; - msg->data[2] = menuReq; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_MENU_REQUEST; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = menuReq; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_MENU_STATUS; } @@ -954,8 +954,8 @@ void HdmiCecEncodingMenuRequestMsg(struct HdmiCecMsg *msg, uint8_t menuReq, bool void HdmiCecEncodingMenuStatusMsg(struct HdmiCecMsg *msg, uint8_t menuStatus) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_MENU_STATUS; - msg->data[2] = menuStatus; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_MENU_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = menuStatus; } void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCecUiCmd *cmd) @@ -964,8 +964,8 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe return; } msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN); - msg->data[1] = HDMI_CEC_OPCODE_USER_CONTROL_PRESSED; - msg->data[2] = cmd->cmdType; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_USER_CONTROL_PRESSED; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = cmd->cmdType; if (cmd->hasAddOp == false) { return; } @@ -978,15 +978,15 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe case HDMI_CEC_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION: (msg->len)++; /* The additional operand is one byte for all these UI commands */ - msg->data[3] = cmd->addOperands.uiBroadcastType; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = cmd->addOperands.uiBroadcastType; break; case HDMI_CEC_UI_CMD_TUNE_FUNCTION: msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN; - msg->data[3] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); - msg->data[4] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK); - msg->data[5] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); - msg->data[6] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); break; default: HDF_LOGI("UI type %d have no additional operands.", cmd->cmdType); @@ -997,13 +997,13 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe void HdmiCecEncodingUserControlReleasedMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_USER_CONTROL_RELEASED; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_USER_CONTROL_RELEASED; } void HdmiCecEncodingGiveDevicePowerStatusMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_POWER_STATUS; } @@ -1012,28 +1012,28 @@ void HdmiCecEncodingGiveDevicePowerStatusMsg(struct HdmiCecMsg *msg, bool respon void HdmiCecEncodingReportDevicePowerStatusMsg(struct HdmiCecMsg *msg, uint8_t powerStatus) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN); - msg->data[1] = HDMI_CEC_OPCODE_REPORT_POWER_STATUS; - msg->data[2] = powerStatus; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_POWER_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = powerStatus; } void HdmiCecEncodingFeatureAbortMsg(struct HdmiCecMsg *msg, uint8_t opcode, uint8_t reason) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN); - msg->data[1] = HDMI_CEC_OPCODE_FEATURE_ABORT; - msg->data[2] = opcode; - msg->data[3] = reason; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_FEATURE_ABORT; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = opcode; + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = reason; } void HdmiCecEncodingAbortMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_ABORT; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_ABORT; } void HdmiCecEncodingGiveAudioStatusMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; } @@ -1042,7 +1042,7 @@ void HdmiCecEncodingGiveAudioStatusMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingGiveSystemAudioModeMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS; } @@ -1051,8 +1051,8 @@ void HdmiCecEncodingGiveSystemAudioModeMsg(struct HdmiCecMsg *msg, bool response void HdmiCecEncodingReportAudioStatusMsg(struct HdmiCecMsg *msg, uint8_t audioMuteStatus, uint8_t audioVolumeStatus) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; - msg->data[2] = (audioMuteStatus << HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT) | + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (audioMuteStatus << HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT) | (audioVolumeStatus & HDMI_CEC_AUDIO_VOLUME_STATUS_MARK); } @@ -1067,7 +1067,7 @@ void HdmiCecEncodingRequestShortAudioDescriptorMsg(struct HdmiCecMsg *msg, } num = (len > HDMI_CEC_MAX_AUDIO_FORMAT_NUM) ? HDMI_CEC_MAX_AUDIO_FORMAT_NUM : len; msg->len = HDMI_CEC_GET_MSG_LEN(num * HDMI_CEC_AUDIO_FORMAT_LEN); - msg->data[1] = HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR; for (i = 0; i < num; i++) { msg->data[2 + i] = (id[i] << HDMI_CEC_AUDIO_FORMAT_ID_SHIFT) | (code[i] & HDMI_CEC_AUDIO_FORMAT_CODE_MARK); } @@ -1086,7 +1086,7 @@ void HdmiCecEncodingReportShortAudioDescriptorMsg(struct HdmiCecMsg *msg, uint32 } num = (len > HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM) ? HDMI_CEC_MAX_SHORT_AUDIO_DESCRIPTOR_NUM : len; msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN * num); - msg->data[1] = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR; for (i = 0; i < num; i++) { msg->data[2 + i * HDMI_CEC_SHORT_AUDIO_DESCRIPTOR_LEN] = (descriptor[i] >> HDMI_TWO_BYTES_SHIFT) & HDMI_ONE_BYTE_MARK; @@ -1099,16 +1099,16 @@ void HdmiCecEncodingReportShortAudioDescriptorMsg(struct HdmiCecMsg *msg, uint32 void HdmiCecEncodingSetSystemAudioModeMsg(struct HdmiCecMsg *msg, uint8_t status) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE; - msg->data[2] = status; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status; } void HdmiCecEncodingSystemAudioModeRequestMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE; } @@ -1117,21 +1117,21 @@ void HdmiCecEncodingSystemAudioModeRequestMsg(struct HdmiCecMsg *msg, uint16_t p void HdmiCecEncodingSystemAudioModeStatusMsg(struct HdmiCecMsg *msg, uint8_t status) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS; - msg->data[2] = status; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = status; } void HdmiCecEncodingSetAudioRateMsg(struct HdmiCecMsg *msg, uint8_t rate) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN); - msg->data[1] = HDMI_CEC_OPCODE_SET_AUDIO_RATE; - msg->data[2] = rate; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_AUDIO_RATE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = rate; } void HdmiCecEncodingInitiateArcMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_INITIATE_ARC; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_INITIATE_ARC; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED; } @@ -1140,19 +1140,19 @@ void HdmiCecEncodingInitiateArcMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingReportArcInitiatedMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_ARC_INITIATED; } void HdmiCecEncodingReportArcTerminationMsg(struct HdmiCecMsg *msg) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION; } void HdmiCecEncodingRequestArcInitiationMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ARC_INITIATION; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_INITIATE_ARC; } @@ -1161,7 +1161,7 @@ void HdmiCecEncodingRequestArcInitiationMsg(struct HdmiCecMsg *msg, bool respons void HdmiCecEncodingRequestArcTerminationMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_ARC_TERMINATION; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TERMINATE_ARC; } @@ -1170,7 +1170,7 @@ void HdmiCecEncodingRequestArcTerminationMsg(struct HdmiCecMsg *msg, bool respon void HdmiCecEncodingTerminateArcMsg(struct HdmiCecMsg *msg, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(0); - msg->data[1] = HDMI_CEC_OPCODE_TERMINATE_ARC; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_TERMINATE_ARC; if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION; } @@ -1179,10 +1179,10 @@ void HdmiCecEncodingTerminateArcMsg(struct HdmiCecMsg *msg, bool response) void HdmiCecEncodingRequestCurrentLatencyMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY; } @@ -1192,16 +1192,16 @@ void HdmiCecEncodingReportCurrentLatencyMsg(struct HdmiCecMsg *msg, uint16_t phyAddr, struct HdmiCecLatencyInfo *info) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY; - msg->data[2] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (phyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = info->videoLatency; - msg->data[5] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) | (info->audioOutputCompensated); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = info->videoLatency; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) | (info->audioOutputCompensated); /* Operand[Audio Output Delay] is only present when [Audio Output Compensated] is 3. */ if (info->audioOutputCompensated == HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_PARTIAL_DELAY) { msg->len++; - msg->data[6] = info->audioOutputDelay; + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = info->audioOutputDelay; } } @@ -1210,15 +1210,15 @@ void HdmiCdcEncodingHecInquireStateMsg(struct HdmiCecMsg *msg, uint16_t initiato uint16_t phyAddr1, uint16_t phyAddr2, bool response) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_INQUIRE_STATE_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_INQUIRE_STATE; - msg->data[5] = (phyAddr1 >> HDMI_ONE_BYTE_SHIFT); - msg->data[6] = (phyAddr1 & HDMI_ONE_BYTE_MARK); - msg->data[7] = (phyAddr2 >> HDMI_ONE_BYTE_SHIFT); - msg->data[8] = (phyAddr2 & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_INQUIRE_STATE; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr1 >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr1 & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (phyAddr2 >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (phyAddr2 & HDMI_ONE_BYTE_MARK); if (response == true) { msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; } @@ -1228,21 +1228,21 @@ void HdmiCdcEncodingHecReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiator uint16_t phyAddr, struct HdmiCdcHecState *state) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MIN_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_REPORT_STATE; - msg->data[5] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[6] = (phyAddr & HDMI_ONE_BYTE_MARK); - msg->data[7] = (state->hecFuncState << HDMI_CDC_HEC_FUNC_STATE_SHIFT) | + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_REPORT_STATE; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (state->hecFuncState << HDMI_CDC_HEC_FUNC_STATE_SHIFT) | (state->hostFuncState << HDMI_CDC_HOST_FUNC_STATE_SHIFT) | (state->encFuncState << HDMI_CDC_ENC_FUNC_STATE_SHIFT) | (state->cdcErrCode); if (state->haveHecField == true) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MAX_LEN); - msg->data[8] = (state->hecField >> HDMI_ONE_BYTE_SHIFT); - msg->data[9] = (state->hecField & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (state->hecField >> HDMI_ONE_BYTE_SHIFT); + msg->data[DATA_NINTH_OFFSET_ELEMENT] = (state->hecField & HDMI_ONE_BYTE_MARK); } } @@ -1250,14 +1250,14 @@ void HdmiCdcEncodingHecSetStateAdjacentMsg(struct HdmiCecMsg *msg, uint16_t init uint16_t phyAddr, uint8_t hecSetState, bool response) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_ADJACENT_MSG_PARAM_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_SET_STATE_ADJACENT; - msg->data[5] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[6] = (phyAddr & HDMI_ONE_BYTE_MARK); - msg->data[7] = hecSetState; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_SET_STATE_ADJACENT; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = hecSetState; if (response == true) { msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; } @@ -1269,16 +1269,16 @@ void HdmiCdcEncodingHecSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhy uint32_t i; msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_SET_STATE_MSG_MIN_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_SET_STATE; - msg->data[5] = (info->phyAddr1 >> HDMI_ONE_BYTE_SHIFT); - msg->data[6] = (info->phyAddr1 & HDMI_ONE_BYTE_MARK); - msg->data[7] = (info->phyAddr2 >> HDMI_ONE_BYTE_SHIFT); - msg->data[8] = (info->phyAddr2 & HDMI_ONE_BYTE_MARK); - msg->data[9] = info->hecSetState; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_SET_STATE; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->phyAddr1 >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (info->phyAddr1 & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (info->phyAddr2 >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (info->phyAddr2 & HDMI_ONE_BYTE_MARK); + msg->data[DATA_NINTH_OFFSET_ELEMENT] = info->hecSetState; for (i = 0; (i < info->phyAddrLen) && (i < HDMI_CDC_HEC_SET_STATE_MSG_OPTIONAL_PA_MAX_NUM); i++) { if (info->phyAddr[i] == HDMI_CEC_INVALID_PHY_ADDR) { break; @@ -1302,11 +1302,11 @@ void HdmiCdcEncodingHecRequestDeactivationMsg(struct HdmiCecMsg *msg, uint16_t i return; } msg->len = HDMI_CDC_GET_MSG_LEN(0); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_REQUEST_DEACTIVATION; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_REQUEST_DEACTIVATION; for (i = 0; i < len; i++) { msg->data[msg->len] = (phyAddr[i] >> HDMI_ONE_BYTE_SHIFT); (msg->len)++; @@ -1321,21 +1321,21 @@ void HdmiCdcEncodingHecRequestDeactivationMsg(struct HdmiCecMsg *msg, uint16_t i void HdmiCdcEncodingHecNotifyAliveMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr) { msg->len = HDMI_CDC_GET_MSG_LEN(0); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_NOTIFY_ALIVE; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_NOTIFY_ALIVE; } void HdmiCdcEncodingHecDiscoverMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhyAddr, bool response) { msg->len = HDMI_CDC_GET_MSG_LEN(0); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HEC_DISCOVER; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HEC_DISCOVER; if (response == true) { msg->rspMsg = HDMI_CDC_HEC_REPORT_STATE; } @@ -1345,12 +1345,12 @@ void HdmiCdcEncodingHpdSetStateMsg(struct HdmiCecMsg *msg, uint16_t initiatorPhy uint8_t portNum, uint8_t hpdState, bool response) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_SET_STATE_MSG_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = HDMI_CDC_HPD_SET_STATE; - msg->data[5] = (portNum << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | hpdState; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = HDMI_CDC_HPD_SET_STATE; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (portNum << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | hpdState; if (response == true) { msg->rspMsg = CEC_MSG_CDC_HPD_REPORT_STATE; } @@ -1360,12 +1360,12 @@ void HdmiCdcEncodingHpdReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiator uint8_t hpdState, uint8_t errCode) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HPD_REPORT_STATE_MSG_LEN); - msg->data[0] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; - msg->data[1] = HDMI_CEC_OPCODE_CDC_MESSAGE; - msg->data[2] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); - msg->data[3] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); - msg->data[4] = CEC_MSG_CDC_HPD_REPORT_STATE; - msg->data[5] = (hpdState << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | errCode; + msg->data[HDMI_CEC_MSG_DATA_ZEROTH_ELEMENT] |= HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST; + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CDC_MESSAGE; + msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (initiatorPhyAddr >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (initiatorPhyAddr & HDMI_ONE_BYTE_MARK); + msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = CEC_MSG_CDC_HPD_REPORT_STATE; + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (hpdState << HDMI_CDC_INPUT_PORT_NUMBER_SHIFT) | errCode; } static int32_t HdmiCecSendMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) @@ -1426,7 +1426,7 @@ static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast) static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { - uint16_t phyAddr = ((msg->data[2] << HDMI_ONE_BYTE_SHIFT) | msg->data[3]); + uint16_t phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) | msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]); (void)cntlr; (void)txMsg; @@ -1488,7 +1488,7 @@ static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.vendorId == HDMI_CEC_VENDOR_ID_UNKNOWN) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1507,7 +1507,7 @@ static void HdmiCecHandleAbortMsg(struct HdmiCntlr *cntlr, if (cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH) { return; } - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_REFUSED); + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_REFUSED); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1517,7 +1517,7 @@ static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.osdName[0] == 0) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1534,7 +1534,7 @@ static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.cecVersion < HDMI_CEC_VERSION_2_0) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[1], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1551,7 +1551,7 @@ static void HdmiCecMsgDefaultHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { bool broadcast = HdmiCecIsBroadcastMsg(msg); - uint8_t opcode = msg->data[1]; + uint8_t opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT]; bool isResponse = (cntlr->cec->info.isWaitingResponse == true && cntlr->cec->info.response == opcode); if (broadcast == true || isResponse == true) { @@ -1605,7 +1605,7 @@ static void HdmiCecUpdateResponseFlag(struct HdmiCec *cec, uint8_t opcode) static void HdmiCecReceivedMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg) { - uint8_t opcode = msg->data[1]; + uint8_t opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT]; bool broadcast = HdmiCecIsBroadcastMsg(msg); bool unregistered = (HdmiCecGetMsgInitiator(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST); struct HdmiCecMsg txMsg = {0}; @@ -1643,7 +1643,7 @@ int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg) initiator = HdmiCecGetMsgInitiator(msg); destination = HdmiCecGetMsgDestination(msg); - opcode = msg->data[1]; + opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT]; /* Check if this message is for us. */ if (initiator != HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST && HdmiCecLogAddrValid(cntlr->cec, initiator) == true) { -- Gitee From 360eb037032999448139af67fea00e3b9513acc2 Mon Sep 17 00:00:00 2001 From: yue Date: Mon, 25 Oct 2021 10:09:45 +0800 Subject: [PATCH 110/272] =?UTF-8?q?2021/10/25hdi-gen=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yue --- tools/hdi-gen/parser/module_parser.h | 2 +- tools/hdi-gen/util/options.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 4041d914b..934ef45e9 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -9,8 +9,8 @@ #ifndef OHOS_HDI_MODULE_PARSER_H #define OHOS_HDI_MODULE_PARSER_H -#include #include +#include #include "ast/ast_module.h" #include "parser/file_detail.h" #include "util/options.h" diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 9afa957c5..9f547c5a3 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -34,7 +34,7 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, char* const argv[]) +Options& Options::Parse(int argc, char * const argv[]) { program_ = argv[0]; opterr = 1; -- Gitee From 8efae664e0ceca1af119b6e20250e6f4114921ea Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Mon, 25 Oct 2021 16:27:47 +0800 Subject: [PATCH 111/272] =?UTF-8?q?=E9=AD=94=E9=AC=BC=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- .../platform/include/hdmi/hdmi_infoframe.h | 27 ++++ support/platform/src/hdmi/hdmi_infoframe.c | 142 +++++++++--------- 2 files changed, 98 insertions(+), 71 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index 78796d17c..894fe5b33 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -34,6 +34,33 @@ extern "C" { #define HDMI_SPD_INFOFRAME_LEN 25 #define HDMI_INFOFRAME_CHECKSUM 256 +#define UINT8_ARRAY_TElEMENT_0 0 +#define UINT8_ARRAY_TElEMENT_1 1 +#define UINT8_ARRAY_TElEMENT_2 2 +#define UINT8_ARRAY_TElEMENT_3 3 +#define UINT8_ARRAY_TElEMENT_4 4 +#define UINT8_ARRAY_TElEMENT_5 5 +#define UINT8_ARRAY_TElEMENT_6 6 +#define UINT8_ARRAY_TElEMENT_7 7 +#define UINT8_ARRAY_TElEMENT_8 8 +#define UINT8_ARRAY_TElEMENT_9 9 +#define UINT8_ARRAY_TElEMENT_10 10 +#define UINT8_ARRAY_TElEMENT_11 11 +#define UINT8_ARRAY_TElEMENT_12 12 +#define UINT8_ARRAY_TElEMENT_13 13 +#define UINT8_ARRAY_TElEMENT_14 14 +#define UINT8_ARRAY_TElEMENT_15 15 +#define UINT8_ARRAY_TElEMENT_16 16 +#define UINT8_ARRAY_TElEMENT_17 17 +#define UINT8_ARRAY_TElEMENT_18 18 +#define UINT8_ARRAY_TElEMENT_19 19 +#define UINT8_ARRAY_TElEMENT_20 20 +#define UINT8_ARRAY_TElEMENT_21 21 +#define UINT8_ARRAY_TElEMENT_22 22 +#define UINT8_ARRAY_TElEMENT_23 23 +#define UINT8_ARRAY_TElEMENT_24 24 +#define UINT8_ARRAY_TElEMENT_25 25 + enum HdmiPacketType { HDMI_PACKET_TYPE_NULL = 0x00, /* Null Packet */ HDMI_PACKET_TYPE_AUDIO_CLOCK_REGENERATION = 0x01, /* Audio Clock Regeneration(N/CTS) */ diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 86800056d..1bc021888 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -30,7 +30,7 @@ static void HdmiInfoframeFillCheckSum(uint8_t *data, uint32_t len) * all valid bytes of the InfoFrame Packet contents(determined by InfoFrame_length), plus the checksum itself, * equals zero. */ - data[3] = HDMI_INFOFRAME_CHECKSUM - checkSum; + data[UINT8_ARRAY_TElEMENT_3] = HDMI_INFOFRAME_CHECKSUM - checkSum; } } @@ -40,9 +40,9 @@ static void HdmiInfoframeFillHeader(struct HdmiInfoframeHeader *header, uint8_t HDF_LOGE("len = %d, val is too small.", len); return; } - data[0] = header->type; - data[1] = header->verNum; - data[2] = header->len; + data[UINT8_ARRAY_TElEMENT_0] = header->type; + data[UINT8_ARRAY_TElEMENT_1] = header->verNum; + data[UINT8_ARRAY_TElEMENT_2] = header->len; } static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) @@ -64,19 +64,19 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, HdmiInfoframeFillHeader(&(infoframe->header), data, len); if (vs->vsifContent.vsif.oui == HDMI_IEEE_OUI_1_4) { - data[4] = HDMI_IEEE_OUI_1_4_1ST; - data[5] = HDMI_IEEE_OUI_1_4_2ND; - data[6] = HDMI_IEEE_OUI_1_4_3RD; + data[UINT8_ARRAY_TElEMENT_4] = HDMI_IEEE_OUI_1_4_1ST; + data[UINT8_ARRAY_TElEMENT_5] = HDMI_IEEE_OUI_1_4_2ND; + data[UINT8_ARRAY_TElEMENT_6] = HDMI_IEEE_OUI_1_4_3RD; vsifContent = &(vs->vsifContent.vsif); userContent = &(vs->vsifContent.userVsif); - data[7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; + data[UINT8_ARRAY_TElEMENT_7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_4K) { - data[8] = vsifContent->vic; + data[UINT8_ARRAY_TElEMENT_8] = vsifContent->vic; return HDF_SUCCESS; } else if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_3D) { - data[8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; + data[UINT8_ARRAY_TElEMENT_8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; } - data[9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << HDMI_VENDOR_3D_EXT_DATA_SHIFT; + data[UINT8_ARRAY_TElEMENT_9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << HDMI_VENDOR_3D_EXT_DATA_SHIFT; if (vsifContent->_3dMetaPresent == false) { if (userContent->len == 0 || (userContent->len + lenght) > len) { return HDF_SUCCESS; @@ -111,50 +111,50 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe HdmiInfoframeFillHeader(&(infoframe->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ - buff[0] |= (avi->colorSpace & HDMI_AVI_COLOR_SPACE_MARK) << HDMI_AVI_COLOR_SPACE_SHIFT; - buff[0] |= (avi->scanMode & HDMI_AVI_SCAN_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_0] |= (avi->colorSpace & HDMI_AVI_COLOR_SPACE_MARK) << HDMI_AVI_COLOR_SPACE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_0] |= (avi->scanMode & HDMI_AVI_SCAN_MODE_MARK); if (avi->activeFormatInformationPresent == true) { - buff[0] |= (1 << HDMI_AVI_ACTIVE_INFORMATION_SHIFT); + buff[UINT8_ARRAY_TElEMENT_0] |= (1 << HDMI_AVI_ACTIVE_INFORMATION_SHIFT); } if (avi->horizBarInfoPresent == true) { - buff[0] |= (1 << HDMI_AVI_HORIZONTAL_BAR_SHIFT); + buff[UINT8_ARRAY_TElEMENT_0] |= (1 << HDMI_AVI_HORIZONTAL_BAR_SHIFT); } if (avi->vertBarInfoPresent == true) { - buff[0] |= (1 << HDMI_AVI_VERTICAL_BAR_SHIFT); + buff[UINT8_ARRAY_TElEMENT_0] |= (1 << HDMI_AVI_VERTICAL_BAR_SHIFT); } /* PB2 */ - buff[1] |= (avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; - buff[1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; - buff[1] |= (avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); + buff[UINT8_ARRAY_TElEMENT_1] |= (avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= (avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); /* PB3 */ - buff[2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << HDMI_AVI_EXT_COLORIMETRY_SHIFT; - buff[2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; - buff[2] |= (avi->nups & HDMI_AVI_NUPS_RANGE_MARK); + buff[UINT8_ARRAY_TElEMENT_2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << HDMI_AVI_EXT_COLORIMETRY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_2] |= (avi->nups & HDMI_AVI_NUPS_RANGE_MARK); if (avi->itc == true) { - buff[2] |= (1 << HDMI_AVI_IT_CONTENT_SHIFT); + buff[UINT8_ARRAY_TElEMENT_2] |= (1 << HDMI_AVI_IT_CONTENT_SHIFT); } /* PB4 */ - buff[3] = avi->vic; + buff[UINT8_ARRAY_TElEMENT_3] = avi->vic; /* PB5 */ - buff[4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; - buff[4] |= (avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; - buff[4] |= (avi->pixelRepetitionFactor & HDMI_AVI_PIXEL_REPETION_FACTOR_MARK); + buff[UINT8_ARRAY_TElEMENT_4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= (avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= (avi->pixelRepetitionFactor & HDMI_AVI_PIXEL_REPETION_FACTOR_MARK); /* PB6 */ - buff[5] = (uint8_t)(avi->topBar & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)(avi->topBar & HDMI_AVI_BAR_MODE_MARK); /* PB7 */ - buff[6] = (uint8_t)((avi->topBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_6] = (uint8_t)((avi->topBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); /* PB8 */ - buff[7] = (uint8_t)(avi->bottomBar & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_7] = (uint8_t)(avi->bottomBar & HDMI_AVI_BAR_MODE_MARK); /* PB9 */ - buff[8] = (uint8_t)((avi->bottomBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_8] = (uint8_t)((avi->bottomBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); /* PB10 */ - buff[9] = (uint8_t)(avi->leftBar & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_9] = (uint8_t)(avi->leftBar & HDMI_AVI_BAR_MODE_MARK); /* PB11 */ - buff[10] = (uint8_t)((avi->leftBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_10] = (uint8_t)((avi->leftBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); /* PB12 */ - buff[11] = (uint8_t)(avi->rightBar & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_11] = (uint8_t)(avi->rightBar & HDMI_AVI_BAR_MODE_MARK); /* PB13 */ - buff[12] = (uint8_t)((avi->rightBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_12] = (uint8_t)((avi->rightBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); HdmiInfoframeFillCheckSum(data, lenght); return HDF_SUCCESS; } @@ -190,7 +190,7 @@ static int32_t HdmiInfoframePacketSpdEncoding(union HdmiInfoframeInfo *infoframe } buff += HDMI_SPD_PRODUCT_DESCRIPTION_LEN; /* PB25 */ - buff[0] = spd->sdi; + buff[UINT8_ARRAY_TElEMENT_0] = spd->sdi; HdmiInfoframeFillCheckSum(data, lenght); return HDF_SUCCESS; } @@ -214,20 +214,20 @@ static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infofra HdmiInfoframeFillHeader(&(infoframe->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ - buff[0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; - buff[0] |= (audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); + buff[UINT8_ARRAY_TElEMENT_0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_0] |= (audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); /* PB2 */ - buff[1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; - buff[1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); + buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); /* PB3 */ - buff[2] |= (audio->codingExtType & HDMI_AUDIO_CXT_MARK); + buff[UINT8_ARRAY_TElEMENT_2] |= (audio->codingExtType & HDMI_AUDIO_CXT_MARK); /* PB4 */ - buff[3] |= audio->channelAllocation; + buff[UINT8_ARRAY_TElEMENT_3] |= audio->channelAllocation; /* PB5 */ - buff[4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; - buff[4] |= (audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); + buff[UINT8_ARRAY_TElEMENT_4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= (audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); if (audio->dmInh == true) { - buff[4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); + buff[UINT8_ARRAY_TElEMENT_4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); } HdmiInfoframeFillCheckSum(data, lenght); return HDF_SUCCESS; @@ -253,57 +253,57 @@ static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe HdmiInfoframeFillHeader(&(infoframe->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ - buff[0] = drm->eotfType; + buff[UINT8_ARRAY_TElEMENT_0] = drm->eotfType; /* PB2 */ - buff[1] = drm->metadataType; + buff[UINT8_ARRAY_TElEMENT_1] = drm->metadataType; /* PB3 */ - buff[2] = (uint8_t)(des->displayPrimaries0X & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_2] = (uint8_t)(des->displayPrimaries0X & HDMI_DRM_METADATA_MARK); /* PB4 */ - buff[3] = (uint8_t)((des->displayPrimaries0X >> HDMI_DRM_METADATA_SHIFT) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_3] = (uint8_t)((des->displayPrimaries0X >> HDMI_DRM_METADATA_SHIFT) & HDMI_DRM_METADATA_MARK); /* PB5 */ - buff[4] = (uint8_t)(des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_4] = (uint8_t)(des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK); /* PB6 */ - buff[5] = (uint8_t)((des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)((des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB7 */ - buff[6] = (uint8_t)(des->displayPrimaries1X & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_6] = (uint8_t)(des->displayPrimaries1X & HDMI_DRM_METADATA_MARK); /* PB8 */ - buff[7] = (uint8_t)((des->displayPrimaries1X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_7] = (uint8_t)((des->displayPrimaries1X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB9 */ - buff[8] = (uint8_t)(des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_8] = (uint8_t)(des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK); /* PB10 */ - buff[9] = (uint8_t)((des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_9] = (uint8_t)((des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB11 */ - buff[10] = (uint8_t)(des->displayPrimaries2X & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_10] = (uint8_t)(des->displayPrimaries2X & HDMI_DRM_METADATA_MARK); /* PB12 */ - buff[11] = (uint8_t)((des->displayPrimaries2X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_11] = (uint8_t)((des->displayPrimaries2X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB13 */ - buff[12] = (uint8_t)(des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_12] = (uint8_t)(des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK); /* PB14 */ - buff[13] = (uint8_t)((des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_13] = (uint8_t)((des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB15 */ - buff[14] = (uint8_t)(des->whitePointX & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_14] = (uint8_t)(des->whitePointX & HDMI_DRM_METADATA_MARK); /* PB16 */ - buff[15] = (uint8_t)((des->whitePointX & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_15] = (uint8_t)((des->whitePointX & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB17 */ - buff[16] = (uint8_t)(des->whitePointY & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_16] = (uint8_t)(des->whitePointY & HDMI_DRM_METADATA_MARK); /* PB18 */ - buff[17] = (uint8_t)((des->whitePointY & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_17] = (uint8_t)((des->whitePointY & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB19 */ - buff[18] = (uint8_t)(des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_18] = (uint8_t)(des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); /* PB20 */ - buff[19] = (uint8_t)((des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_19] = (uint8_t)((des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB21 */ - buff[20] = (uint8_t)(des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_20] = (uint8_t)(des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); /* PB22 */ - buff[21] = (uint8_t)((des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_21] = (uint8_t)((des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB23 */ - buff[22] = (uint8_t)(des->maxContentLightLevel & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_22] = (uint8_t)(des->maxContentLightLevel & HDMI_DRM_METADATA_MARK); /* PB24 */ - buff[23] = (uint8_t)((des->maxContentLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_23] = (uint8_t)((des->maxContentLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); /* PB25 */ - buff[24] = (uint8_t)(des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_24] = (uint8_t)(des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK); /* PB26 */ - buff[25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); HdmiInfoframeFillCheckSum(data, lenght); return HDF_SUCCESS; } -- Gitee From 05d88d6aa1d9796a813c6007b4a58f7a7c32636d Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Mon, 25 Oct 2021 20:27:31 +0800 Subject: [PATCH 112/272] =?UTF-8?q?hdmi=5Fedid.c=E9=AD=94=E9=AC=BC?= =?UTF-8?q?=E6=95=B0=E5=AD=97=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/include/hdmi/hdmi_edid.h | 30 +++ support/platform/src/hdmi/hdmi_edid.c | 308 +++++++++++----------- 2 files changed, 184 insertions(+), 154 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_edid.h b/support/platform/include/hdmi/hdmi_edid.h index a749fba71..12629e4ca 100644 --- a/support/platform/include/hdmi/hdmi_edid.h +++ b/support/platform/include/hdmi/hdmi_edid.h @@ -19,6 +19,36 @@ extern "C" { #endif #endif /* __cplusplus */ +#define VIDEO_LENGTH_4 4 +#define VIDEO_LENGTH_5 5 +#define VIDEO_LENGTH_16 16 +#define VIDEO_WIDTH_3 3 +#define VIDEO_WIDTH_4 4 +#define VIDEO_WIDTH_9 9 +#define VIDEO_WIDTH_10 10 + +#define UINT8_ARRAY_TElEMENT_0 0 +#define UINT8_ARRAY_TElEMENT_1 1 +#define UINT8_ARRAY_TElEMENT_2 2 +#define UINT8_ARRAY_TElEMENT_3 3 +#define UINT8_ARRAY_TElEMENT_4 4 +#define UINT8_ARRAY_TElEMENT_5 5 +#define UINT8_ARRAY_TElEMENT_6 6 +#define UINT8_ARRAY_TElEMENT_7 7 +#define UINT8_ARRAY_TElEMENT_8 8 +#define UINT8_ARRAY_TElEMENT_9 9 +#define UINT8_ARRAY_TElEMENT_10 10 +#define UINT8_ARRAY_TElEMENT_11 11 +#define UINT8_ARRAY_TElEMENT_12 12 +#define UINT8_ARRAY_TElEMENT_13 13 +#define UINT8_ARRAY_TElEMENT_14 14 +#define UINT8_ARRAY_TElEMENT_15 15 +#define UINT8_ARRAY_TElEMENT_16 16 +#define UINT8_ARRAY_TElEMENT_17 17 +#define UINT8_ARRAY_TElEMENT_18 18 +#define UINT8_ARRAY_TElEMENT_19 19 +#define UINT8_ARRAY_TElEMENT_20 20 + /* (EDID)Extended Display Identification Data */ #define HDMI_EDID_SINGLE_BLOCK_SIZE 128 #define HDMI_EDID_MAX_BLOCK_NUM 4 diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index bae788133..e53b6b27a 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -87,7 +87,7 @@ static int32_t HdmiEdidVendorInfoPhase(struct HdmiEdid *edid) struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; /* Manufacturer Name */ - data = (block->vendorName[0] << HDMI_EDID_MANUFACRURER_NAME_SHIFT) | (block->vendorName[1]); + data = (block->vendorName[UINT8_ARRAY_TElEMENT_0] << HDMI_EDID_MANUFACRURER_NAME_SHIFT) | (block->vendorName[UINT8_ARRAY_TElEMENT_1]); for (i = 0; i < HDMI_EDID_MANUFACRURER_NAME_MAX_LEN - 1; i++) { tmpData = (data & (HDMI_EDID_MANUFACRURER_NAME_CHAR_MARK << (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i))); tmpData = (tmpData >> (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i)); @@ -98,7 +98,7 @@ static int32_t HdmiEdidVendorInfoPhase(struct HdmiEdid *edid) } /* Product Code */ - data = (block->productCode[1] << HDMI_EDID_PRODUCT_CODE_SHIFT) | (block->productCode[0]); + data = (block->productCode[UINT8_ARRAY_TElEMENT_1] << HDMI_EDID_PRODUCT_CODE_SHIFT) | (block->productCode[UINT8_ARRAY_TElEMENT_0]); sinkCap->vendorInfo.productCode = data; /* Serial Number */ @@ -195,16 +195,16 @@ static uint32_t HdmiEdidGetStandardTimingVertPixel(uint32_t aspectRatio, uint32_ switch (aspectRatio) { case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_10: - vertPixel = horizPixel * 10 / 16; + vertPixel = horizPixel * VIDEO_WIDTH_10 / VIDEO_LENGTH_16; break; case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_5_4: - vertPixel = horizPixel * 4 / 5; + vertPixel = horizPixel * VIDEO_WIDTH_4 / VIDEO_LENGTH_5; break; case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_4_3: - vertPixel = horizPixel * 3 / 4; + vertPixel = horizPixel * VIDEO_WIDTH_3 / VIDEO_LENGTH_4; break; case HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_16_9: - vertPixel = horizPixel * 9 / 16; + vertPixel = horizPixel * VIDEO_WIDTH_9 / VIDEO_LENGTH_16; break; default: HDF_LOGE("aspectRatio %d is invalid.", aspectRatio); @@ -225,12 +225,12 @@ static int32_t HdmiEdidStandardTimingPhase(struct HdmiEdid *edid) * Unused fields in this section shall be set to 01h, 01h. */ for (i = 0; i < HDMI_EDID_STANDARD_TIMING_COUNT; i++) { - if (data[0] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG || data[1] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG) { - sinkCap->stdTimingsInfo[i].horizPixel = (data[0] + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE) * + if (data[UINT8_ARRAY_TElEMENT_0] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG || data[UINT8_ARRAY_TElEMENT_1] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG) { + sinkCap->stdTimingsInfo[i].horizPixel = (data[UINT8_ARRAY_TElEMENT_0] + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE) * HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_FACTOR; - sinkCap->stdTimingsInfo[i].refreshRate = (data[1] & HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK) + + sinkCap->stdTimingsInfo[i].refreshRate = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK) + HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_BASE; - aspectRatio = (data[1] & HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_MARK) >> + aspectRatio = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_MARK) >> HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_SHIFT; sinkCap->stdTimingsInfo[i].vertPixel = HdmiEdidGetStandardTimingVertPixel(aspectRatio, sinkCap->stdTimingsInfo[i].horizPixel); @@ -297,7 +297,7 @@ static void HdmiEdidDetailedTimingDescriptorPhase(struct HdmiSinkDeviceCapabilit } perTiming = &cap->preTimingInfo[cap->preTimingCnt]; - pixelClock = (block->pixelClk[1] << HDMI_ONE_BYTE_SHIFT) | (block->pixelClk[0]); + pixelClock = (block->pixelClk[UINT8_ARRAY_TElEMENT_1] << HDMI_ONE_BYTE_SHIFT) | (block->pixelClk[UINT8_ARRAY_TElEMENT_0]); if (pixelClock == 0) { HDF_LOGD(" pixel clock is 0. preTimingCnt = %d", cap->preTimingCnt); return; @@ -341,7 +341,7 @@ static void HdmiEdidDetailedTiming(struct HdmiSinkDeviceCapability *sinkCap, uin /* * Monitor Descriptor flag: data0/data1/data2 is 0x00. */ - if (data[0] == 0x00 && data[1] == 0x00 && data[2] == 0x00) { + if (data[UINT8_ARRAY_TElEMENT_0] == 0x00 && data[UINT8_ARRAY_TElEMENT_1] == 0x00 && data[UINT8_ARRAY_TElEMENT_2] == 0x00) { HdmiEdidMonitorDescriptorPhase(sinkCap, data, len); return; } @@ -404,7 +404,7 @@ static int32_t HdmiEdidFirstBlockPhase(struct HdmiEdid *edid) return ret; } - len = sizeof(func) / sizeof(func[0]); + len = sizeof(func) / sizeof(func[UINT8_ARRAY_TElEMENT_0]); for (i = 0; i < len; i++) { if (func[i] == NULL) { continue; @@ -509,15 +509,15 @@ static int32_t HdmiEdidExtAudioDataBlockPhase(struct HdmiSinkDeviceCapability *s } data += (i * HDMI_EDID_EXTENSION_SHORT_AUDIO_DESCRIPTOR_LEN); /* byte0: bit[6:3] Audio Format Code; bit[2:0] Max Number of channels - 1 */ - formatCode = (data[0] & HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_MARK) >> + formatCode = (data[UINT8_ARRAY_TElEMENT_0] & HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_MARK) >> HDMI_EDID_EXTENSION_AUDIO_FORMAT_CODE_SHIFT; sinkCap->audioInfo[sinkCap->audioInfoCnt].formatCode = (enum HdmiAudioCodingType)formatCode; sinkCap->audioInfo[sinkCap->audioInfoCnt].channels = - (data[0] & HDMI_EDID_EXTENSION_AUDIO_MAX_CHANNEL_MARK) + 1; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_EDID_EXTENSION_AUDIO_MAX_CHANNEL_MARK) + 1; /* byte1: Sample Rate */ - HdmiEdidExtAdbSampleRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[1], formatCode); + HdmiEdidExtAdbSampleRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[UINT8_ARRAY_TElEMENT_1], formatCode); /* byte2: bit depth or maximum bit rate */ - HdmiEdidExtAdbDepthAndMaxRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[2], formatCode); + HdmiEdidExtAdbDepthAndMaxRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[UINT8_ARRAY_TElEMENT_2], formatCode); sinkCap->audioInfoCnt++; } return HDF_SUCCESS; @@ -570,10 +570,10 @@ static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *s static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 5) { - sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[3] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; - sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[3] & HDMI_LOWER_NIBBLE_MARK); - sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[4] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; - sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[4] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_LOWER_NIBBLE_MARK); sinkCap->vsdbInfo.cecAddr.addrValid = (sinkCap->vsdbInfo.cecAddr.phyAddrA != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && (sinkCap->vsdbInfo.cecAddr.phyAddrB != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && @@ -585,12 +585,12 @@ static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap static void HdmiEdidVsdbColorDepthPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 6) { - sinkCap->vsdbInfo.supportAi = (data[5] & HDMI_BIT7_MARK) ? true : false; - sinkCap->vsdbInfo.supportDviDual = (data[5] & HDMI_BIT0_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dcY444 = (data[5] & HDMI_BIT3_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc30bit = (data[5] & HDMI_BIT4_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc36bit = (data[5] & HDMI_BIT5_MARK) ? true : false; - sinkCap->vsdbInfo.deepColor.dc48bit = (data[5] & HDMI_BIT6_MARK) ? true : false; + sinkCap->vsdbInfo.supportAi = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.supportDviDual = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dcY444 = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT3_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc30bit = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT4_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc36bit = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.deepColor.dc48bit = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT6_MARK) ? true : false; } } @@ -601,7 +601,7 @@ static void HdmiEdidVsdbMaxTmdsClockPhase(struct HdmiSinkDeviceCapability *sinkC * supports ant Deep Color mode or supports DVI dual-link. A value of zeor means that no clock rate is indicated. */ if (len >= 7) { - sinkCap->maxTmdsClk = data[6] * HDMI_EDID_EXTENSION_TMDS_FACTOR; + sinkCap->maxTmdsClk = data[UINT8_ARRAY_TElEMENT_6] * HDMI_EDID_EXTENSION_TMDS_FACTOR; sinkCap->supportHdmi20 = (sinkCap->maxTmdsClk > HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE) ? true : false; } } @@ -609,9 +609,9 @@ static void HdmiEdidVsdbMaxTmdsClockPhase(struct HdmiSinkDeviceCapability *sinkC static void HdmiEdidVsdbSinkPresentPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 8) { - sinkCap->vsdbInfo.latencyFieldsPresent = (data[7] & HDMI_BIT7_MARK) ? true : false; - sinkCap->vsdbInfo.iLatencyFieldsPresent = (data[7] & HDMI_BIT6_MARK) ? true : false; - sinkCap->vsdbInfo.hdmiVideoPresent = (data[7] & HDMI_BIT5_MARK) ? true : false; + sinkCap->vsdbInfo.latencyFieldsPresent = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo.iLatencyFieldsPresent = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT6_MARK) ? true : false; + sinkCap->vsdbInfo.hdmiVideoPresent = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT5_MARK) ? true : false; } } @@ -619,18 +619,18 @@ static void HdmiEdidVsdbSinkLatencyPhase(struct HdmiSinkDeviceCapability *sinkCa { if (sinkCap->vsdbInfo.latencyFieldsPresent == true) { if (len >= 9) { - sinkCap->vsdbInfo.videoLatency = data[8]; + sinkCap->vsdbInfo.videoLatency = data[UINT8_ARRAY_TElEMENT_8]; } if (len >= 10) { - sinkCap->vsdbInfo.videoLatency = data[9]; + sinkCap->vsdbInfo.videoLatency = data[UINT8_ARRAY_TElEMENT_9]; } } if (sinkCap->vsdbInfo.iLatencyFieldsPresent == true) { if (len >= 11) { - sinkCap->vsdbInfo.interlacedVideoLatency = data[10]; + sinkCap->vsdbInfo.interlacedVideoLatency = data[UINT8_ARRAY_TElEMENT_10]; } if (len >= 12) { - sinkCap->vsdbInfo.interlacedAudioLatency = data[11]; + sinkCap->vsdbInfo.interlacedAudioLatency = data[UINT8_ARRAY_TElEMENT_11]; } } } @@ -653,7 +653,7 @@ static void HdmiEdidVsdbVicInfoPhase(struct HdmiSinkDeviceCapability *sinkCap, break; } index = data[(*offset)]; - if (index != 0 && index < sizeof(hdmi4kVic) / sizeof(hdmi4kVic[0])) { + if (index != 0 && index < sizeof(hdmi4kVic) / sizeof(hdmi4kVic[UINT8_ARRAY_TElEMENT_0])) { sinkCap->videoInfo.vic[sinkCap->videoInfo.vicNum] = hdmi4kVic[index]; sinkCap->videoInfo.vicNum++; } @@ -711,13 +711,13 @@ static void HdmiEdidVsdbVicAnd3dInfoPhase(struct HdmiSinkDeviceCapability *sinkC HDF_LOGD("vsdb: these is no vic/3d field."); return; } - sinkCap->vsdbInfo._3dPresent = (data[12] & HDMI_BIT7_MARK) ? true : false; + sinkCap->vsdbInfo._3dPresent = (data[UINT8_ARRAY_TElEMENT_12] & HDMI_BIT7_MARK) ? true : false; sinkCap->vsdbInfo._3dMultiPresent = - (data[12] & HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; + (data[UINT8_ARRAY_TElEMENT_12] & HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; if (len >= 14) { - hdmiVicLen = (data[13] & HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; - hdmi3dLen = (data[13] & HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK); + hdmiVicLen = (data[UINT8_ARRAY_TElEMENT_13] & HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; + hdmi3dLen = (data[UINT8_ARRAY_TElEMENT_13] & HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK); } /* byte14~byteN: Vic info/3D info */ @@ -765,26 +765,26 @@ static int32_t HdmiEdidVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8 static void HdmiEdidHfVsdb21Phase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { - sinkCap->hfVsdbInfo.maxFrlRate = (data[6] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; - - sinkCap->hfVsdbInfo.fapaStartLocation = (data[7] & HDMI_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.allm = (data[7] & HDMI_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.fva = (data[7] & HDMI_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.cnmVrr = (data[7] & HDMI_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.cinemaVrr = (data[7] & HDMI_BIT4_MARK) ? true : false; - sinkCap->hfVsdbInfo.mDelta = (data[7] & HDMI_BIT5_MARK) ? true : false; - sinkCap->hfVsdbInfo.vrrMin = (data[8] & 0x3F); - sinkCap->hfVsdbInfo.vrrMax = ((data[8] & 0xC0) << 2) | data[9]; - - sinkCap->hfVsdbInfo.dscInfo.dsc1p2 = (data[10] & HDMI_BIT7_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscNative420 = (data[10] & HDMI_BIT6_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscAllBpp = (data[10] & HDMI_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc10bpc = (data[10] & HDMI_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[10] & HDMI_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[10] & HDMI_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[11] & HDMI_LOWER_NIBBLE_MARK); - sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; - sinkCap->hfVsdbInfo.dscInfo.dscTotalChunkKBytes = (data[12] & 0x3F); + sinkCap->hfVsdbInfo.maxFrlRate = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + + sinkCap->hfVsdbInfo.fapaStartLocation = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.allm = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.fva = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.cnmVrr = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.cinemaVrr = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT4_MARK) ? true : false; + sinkCap->hfVsdbInfo.mDelta = (data[UINT8_ARRAY_TElEMENT_7] & HDMI_BIT5_MARK) ? true : false; + sinkCap->hfVsdbInfo.vrrMin = (data[UINT8_ARRAY_TElEMENT_8] & 0x3F); + sinkCap->hfVsdbInfo.vrrMax = ((data[UINT8_ARRAY_TElEMENT_8] & 0xC0) << 2) | data[UINT8_ARRAY_TElEMENT_9]; + + sinkCap->hfVsdbInfo.dscInfo.dsc1p2 = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscNative420 = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscAllBpp = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc10bpc = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->hfVsdbInfo.dscInfo.dscTotalChunkKBytes = (data[UINT8_ARRAY_TElEMENT_12] & 0x3F); } static int32_t HdmiEdidHfVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) @@ -795,23 +795,23 @@ static int32_t HdmiEdidHfVsdbPhase(struct HdmiSinkDeviceCapability *sinkCap, uin } /* byte3: Version */ - if (data[3] != HDMI_EDID_EXTENSION_HFVSDB_VERSION) { - HDF_LOGD("vsdb: verdion %d is invalid.", data[3]); + if (data[UINT8_ARRAY_TElEMENT_3] != HDMI_EDID_EXTENSION_HFVSDB_VERSION) { + HDF_LOGD("vsdb: verdion %d is invalid.", data[UINT8_ARRAY_TElEMENT_3]); } /* byte4: Max_TMDS_Character_Rate */ - sinkCap->maxTmdsClk = data[4] * HDMI_EDID_EXTENSION_TMDS_FACTOR; + sinkCap->maxTmdsClk = data[UINT8_ARRAY_TElEMENT_4] * HDMI_EDID_EXTENSION_TMDS_FACTOR; sinkCap->supportHdmi20 = (sinkCap->maxTmdsClk > HDMI_EDID_EXTENSION_MAX_HDMI14_TMDS_RATE) ? true : false; /* byte5: several sink present */ - sinkCap->hfVsdbInfo.scdcPresent = (data[5] & HDMI_BIT7_MARK) ? true : false; - sinkCap->hfVsdbInfo.rrCapable = (data[5] & HDMI_BIT6_MARK) ? true : false; - sinkCap->hfVsdbInfo.lte340McscScramble = (data[5] & HDMI_BIT3_MARK) ? true : false; - sinkCap->hfVsdbInfo.independentView = (data[5] & HDMI_BIT2_MARK) ? true : false; - sinkCap->hfVsdbInfo.dualView = (data[5] & HDMI_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo._3dOsdDisparity = (data[5] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.scdcPresent = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT7_MARK) ? true : false; + sinkCap->hfVsdbInfo.rrCapable = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT6_MARK) ? true : false; + sinkCap->hfVsdbInfo.lte340McscScramble = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT3_MARK) ? true : false; + sinkCap->hfVsdbInfo.independentView = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dualView = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo._3dOsdDisparity = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; /* byte6: deep color */ - sinkCap->hfVsdbInfo.dc.dc30bit = (data[6] & HDMI_BIT0_MARK) ? true : false; - sinkCap->hfVsdbInfo.dc.dc36bit = (data[6] & HDMI_BIT1_MARK) ? true : false; - sinkCap->hfVsdbInfo.dc.dc48bit = (data[6] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc30bit = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc36bit = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hfVsdbInfo.dc.dc48bit = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT2_MARK) ? true : false; if (len > HDMI_EDID_EXTENSION_HFVSDB_MIN_INVALID_LEN && len <= HDMI_EDID_EXTENSION_HFVSDB_MAX_INVALID_LEN) { HdmiEdidHfVsdb21Phase(sinkCap, data, len); @@ -826,16 +826,16 @@ static int32_t HdmiEdidExtVsDataBlockPhase(struct HdmiSinkDeviceCapability *sink bool hfVsdb = false; if (len >= HDMI_EDID_EXTENSION_VSDB_LEN && - data[0] == HDMI_EDID_EXTENSION_VSDB_IEEE_1ST && - data[1] == HDMI_EDID_EXTENSION_VSDB_IEEE_2ND && - data[2] == HDMI_EDID_EXTENSION_VSDB_IEEE_3RD) { + data[UINT8_ARRAY_TElEMENT_0] == HDMI_EDID_EXTENSION_VSDB_IEEE_1ST && + data[UINT8_ARRAY_TElEMENT_1] == HDMI_EDID_EXTENSION_VSDB_IEEE_2ND && + data[UINT8_ARRAY_TElEMENT_2] == HDMI_EDID_EXTENSION_VSDB_IEEE_3RD) { vsdb = true; } if (len >= HDMI_EDID_EXTENSION_VSDB_LEN && - data[0] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_1ST && - data[1] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_2ND && - data[2] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_3RD) { + data[UINT8_ARRAY_TElEMENT_0] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_1ST && + data[UINT8_ARRAY_TElEMENT_1] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_2ND && + data[UINT8_ARRAY_TElEMENT_2] == HDMI_EDID_EXTENSION_HFVSDB_IEEE_3RD) { hfVsdb = true; } @@ -856,27 +856,27 @@ static int32_t HdmiEdidExtSpeakerDataBlockPhase(struct HdmiSinkDeviceCapability } sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FL_FR] = - (data[0] & HDMI_BIT0_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT0_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_LFE] = - (data[0] & HDMI_BIT1_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT1_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FC] = - (data[0] & HDMI_BIT2_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT2_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BL_BR] = - (data[0] & HDMI_BIT3_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT3_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_BC] = - (data[0] & HDMI_BIT4_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT4_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLC_FRC] = - (data[0] & HDMI_BIT5_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT5_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_RLC_RRC] = - (data[0] & HDMI_BIT6_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT6_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_FLW_FRW] = - (data[0] & HDMI_BIT7_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_0] & HDMI_BIT7_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFL_TPFH] = - (data[1] & HDMI_BIT0_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT0_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPC] = - (data[1] & HDMI_BIT1_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT1_MARK) ? true : false; sinkCap->supportAudioSpeaker[HDMI_EDID_AUDIO_SPEAKER_TPFC] = - (data[1] & HDMI_BIT2_MARK) ? true : false; + (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT2_MARK) ? true : false; return HDF_SUCCESS; } @@ -888,8 +888,8 @@ static void HdmiEdidExtUseExtDataBlockVcdbPhase(struct HdmiSinkDeviceCapability return; } - sinkCap->videoCap.qy = (data[1] & HDMI_BIT7_MARK) ? true : false; - sinkCap->videoCap.qs = (data[1] & HDMI_BIT6_MARK) ? true : false; + sinkCap->videoCap.qy = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT7_MARK) ? true : false; + sinkCap->videoCap.qs = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT6_MARK) ? true : false; } static void HdmiEdidExtUseExtDataBlockCdbPhase(struct HdmiSinkDeviceCapability *sinkCap, @@ -900,17 +900,17 @@ static void HdmiEdidExtUseExtDataBlockCdbPhase(struct HdmiSinkDeviceCapability * return; } - sinkCap->colorimetry.xvYcc601 = (data[1] & HDMI_BIT0_MARK) ? true : false; - sinkCap->colorimetry.xvYcc709 = (data[1] & HDMI_BIT1_MARK) ? true : false; - sinkCap->colorimetry.sYcc601 = (data[1] & HDMI_BIT2_MARK) ? true : false; - sinkCap->colorimetry.opYcc601 = (data[1] & HDMI_BIT3_MARK) ? true : false; - sinkCap->colorimetry.opRgb = (data[1] & HDMI_BIT4_MARK) ? true : false; - sinkCap->colorimetry.bt2020cYcc = (data[1] & HDMI_BIT5_MARK) ? true : false; - sinkCap->colorimetry.bt2020Ycc = (data[1] & HDMI_BIT6_MARK) ? true : false; - sinkCap->colorimetry.bt2020Rgb = (data[1] & HDMI_BIT7_MARK) ? true : false; + sinkCap->colorimetry.xvYcc601 = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT0_MARK) ? true : false; + sinkCap->colorimetry.xvYcc709 = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT1_MARK) ? true : false; + sinkCap->colorimetry.sYcc601 = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->colorimetry.opYcc601 = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT3_MARK) ? true : false; + sinkCap->colorimetry.opRgb = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT4_MARK) ? true : false; + sinkCap->colorimetry.bt2020cYcc = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT5_MARK) ? true : false; + sinkCap->colorimetry.bt2020Ycc = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT6_MARK) ? true : false; + sinkCap->colorimetry.bt2020Rgb = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT7_MARK) ? true : false; - sinkCap->colorimetry.dciP3 = (data[2] & HDMI_BIT7_MARK) ? true : false; - sinkCap->colorimetry.md = (data[2] & HDMI_LOWER_NIBBLE_MARK); + sinkCap->colorimetry.dciP3 = (data[UINT8_ARRAY_TElEMENT_2] & HDMI_BIT7_MARK) ? true : false; + sinkCap->colorimetry.md = (data[UINT8_ARRAY_TElEMENT_2] & HDMI_LOWER_NIBBLE_MARK); } static void HdmiEdidExtUseExtDataBlockY420VdbPhase(struct HdmiSinkDeviceCapability *sinkCap, @@ -983,11 +983,11 @@ static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapabili return; } - sinkCap->hdrCap.eotf.sdr = (data[1] & HDMI_BIT0_MARK) ? true : false; - sinkCap->hdrCap.eotf.hdr = (data[1] & HDMI_BIT1_MARK) ? true : false; - sinkCap->hdrCap.eotf.smpteSt2048 = (data[1] & HDMI_BIT2_MARK) ? true : false; - sinkCap->hdrCap.eotf.hlg = (data[1] & HDMI_BIT2_MARK) ? true : false; - sinkCap->hdrCap.smType1 = (data[2] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hdrCap.eotf.sdr = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT0_MARK) ? true : false; + sinkCap->hdrCap.eotf.hdr = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT1_MARK) ? true : false; + sinkCap->hdrCap.eotf.smpteSt2048 = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hdrCap.eotf.hlg = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_BIT2_MARK) ? true : false; + sinkCap->hdrCap.smType1 = (data[UINT8_ARRAY_TElEMENT_2] & HDMI_BIT0_MARK) ? true : false; /* * The length of the data block, n, in Byte 1 indicates which of the Bytes 5 to 7 are present. Bytes 5 to 7 are @@ -995,13 +995,13 @@ static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapabili * Bytes 5 and 6 are present; and when n is 6, Bytes 5 to 7 are present. */ if (len >= 4) { - sinkCap->hdrCap.maxLuminancedata = data[3]; + sinkCap->hdrCap.maxLuminancedata = data[UINT8_ARRAY_TElEMENT_3]; } if (len >= 5) { - sinkCap->hdrCap.maxFrameAverageLuminanceData = data[4]; + sinkCap->hdrCap.maxFrameAverageLuminanceData = data[UINT8_ARRAY_TElEMENT_4]; } if (len >= 6) { - sinkCap->hdrCap.maxFrameAverageLuminanceData = data[5]; + sinkCap->hdrCap.maxFrameAverageLuminanceData = data[UINT8_ARRAY_TElEMENT_5]; } } @@ -1016,54 +1016,54 @@ static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability return; } - oui = (data[1]) | (data[2] << 8) | (data[3] << 16); + oui = (data[UINT8_ARRAY_TElEMENT_1]) | (data[UINT8_ARRAY_TElEMENT_2] << 8) | (data[UINT8_ARRAY_TElEMENT_3] << 16); if (oui != HDMI_EDID_VSVDB_DOLBY_OUI) { return; } sinkCap->dolbyCap.oui = oui; - sinkCap->dolbyCap.version = (data[4] & HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; - sinkCap->dolbyCap.yuv422 = (data[4] & HDMI_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.b2160p60 = (data[4] & HDMI_BIT1_MARK) ? true : false; + sinkCap->dolbyCap.version = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; + sinkCap->dolbyCap.yuv422 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.b2160p60 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT1_MARK) ? true : false; if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_0) { - sinkCap->dolbyCap.globalDimming = (data[4] & HDMI_BIT2_MARK) ? true : false; - sinkCap->dolbyCap.redX = ((data[5] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[6] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.redY = (data[5] & HDMI_LOWER_NIBBLE_MARK) | (data[7] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenX = ((data[8] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[9] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenY = (data[8] & HDMI_LOWER_NIBBLE_MARK) | (data[10] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueX = ((data[11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[12] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueY = (data[11] & HDMI_LOWER_NIBBLE_MARK) | (data[13] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteX = ((data[14] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[15] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteY = (data[14] & HDMI_LOWER_NIBBLE_MARK) | (data[16] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.minLuminance = ((data[17] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[18] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT2_MARK) ? true : false; + sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_6] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.redY = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_7] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenX = ((data[UINT8_ARRAY_TElEMENT_8] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_9] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenY = (data[UINT8_ARRAY_TElEMENT_8] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_10] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueX = ((data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_12] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueY = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_13] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteX = ((data[UINT8_ARRAY_TElEMENT_14] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_15] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteY = (data[UINT8_ARRAY_TElEMENT_14] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_16] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_17] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_18] << HDMI_NIBBLE_SHIFT); sinkCap->dolbyCap.maxLuminance = - (data[17] & HDMI_LOWER_NIBBLE_MARK) | (data[19] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.dMajorVer = (data[20] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; - sinkCap->dolbyCap.dMinorVer = (data[20] & HDMI_LOWER_NIBBLE_MARK); + (data[UINT8_ARRAY_TElEMENT_17] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_19] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.dMajorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->dolbyCap.dMinorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_LOWER_NIBBLE_MARK); return; } if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_1) { - sinkCap->dolbyCap.dmVer = (data[4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; - sinkCap->dolbyCap.globalDimming = (data[5] & HDMI_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.maxLuminance = ((data[5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); - sinkCap->dolbyCap.colorimetry = (data[6] & HDMI_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.minLuminance = ((data[6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); - sinkCap->dolbyCap.redX = data[8]; - sinkCap->dolbyCap.redY = data[9]; - sinkCap->dolbyCap.greenX = data[10]; - sinkCap->dolbyCap.greenY = data[11]; - sinkCap->dolbyCap.blueX = data[12]; - sinkCap->dolbyCap.blueY = data[13]; + sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; + sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.maxLuminance = ((data[UINT8_ARRAY_TElEMENT_5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.colorimetry = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.redX = data[UINT8_ARRAY_TElEMENT_8]; + sinkCap->dolbyCap.redY = data[UINT8_ARRAY_TElEMENT_9]; + sinkCap->dolbyCap.greenX = data[UINT8_ARRAY_TElEMENT_10]; + sinkCap->dolbyCap.greenY = data[UINT8_ARRAY_TElEMENT_11]; + sinkCap->dolbyCap.blueX = data[UINT8_ARRAY_TElEMENT_12]; + sinkCap->dolbyCap.blueY = data[UINT8_ARRAY_TElEMENT_13]; } } static int32_t HdmiEdidExtUseExtDataBlockPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { - uint8_t extTagCode = data[0]; + uint8_t extTagCode = data[UINT8_ARRAY_TElEMENT_0]; switch (extTagCode) { case HDMI_EDID_EXT_VCDB: @@ -1131,7 +1131,7 @@ static void HdmiEdidExtSeveralDataBlockPhase(struct HdmiEdid *edid, uint8_t bloc uint8_t *data = edid->raw + (blockNum * HDMI_EDID_SINGLE_BLOCK_SIZE); struct HdmiSinkDeviceCapability *sinkCap = &(edid->sinkCap); uint8_t blkOffset = HDMI_EDID_EXTENSION_BLOCK_OFFSET; - uint8_t dtdOffset = data[2]; + uint8_t dtdOffset = data[UINT8_ARRAY_TElEMENT_2]; uint8_t dbTagCode, blkLen; int32_t ret; @@ -1139,8 +1139,8 @@ static void HdmiEdidExtSeveralDataBlockPhase(struct HdmiEdid *edid, uint8_t bloc /* phase data block */ for (blkLen = 0; (blkOffset < dtdOffset) && (data != NULL); blkOffset += (blkLen + 1)) { data += blkLen; - blkLen = (data[0] & HDMI_EDID_EXTENSION_DATA_BLOCK_LEN_MARK); - dbTagCode = (data[0] & HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_MARK) >> + blkLen = (data[UINT8_ARRAY_TElEMENT_0] & HDMI_EDID_EXTENSION_DATA_BLOCK_LEN_MARK); + dbTagCode = (data[UINT8_ARRAY_TElEMENT_0] & HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_MARK) >> HDMI_EDID_EXTENSION_DATA_BLOCK_TAG_CODE_SHIFT; data++; ret = HdmiEdidExtDataBlockPhase(sinkCap, data, blkLen, dbTagCode); @@ -1178,27 +1178,27 @@ static int32_t HdmiEdidExtBlockPhase(struct HdmiEdid *edid, uint8_t blockNum) } /* byte0: Extension Tag */ - if (data[0] != HDMI_EDID_CTA_EXTENSION_TAG) { - HDF_LOGD("ext tag is %d", data[0]); + if (data[UINT8_ARRAY_TElEMENT_0] != HDMI_EDID_CTA_EXTENSION_TAG) { + HDF_LOGD("ext tag is %d", data[UINT8_ARRAY_TElEMENT_0]); } /* byte1: Extension Revision Number */ - if (data[1] != HDMI_EDID_CTA_EXTENSION3_REVISION) { - HDF_LOGD("revision number is %d", data[1]); + if (data[UINT8_ARRAY_TElEMENT_1] != HDMI_EDID_CTA_EXTENSION3_REVISION) { + HDF_LOGD("revision number is %d", data[UINT8_ARRAY_TElEMENT_1]); } /* * byte2: Byte number offset d where 18-byte descriptors begin (typically Detailed Timing Descriptors). * If no data is provided in the reserved data block, then d is 4. If d is 0, then no detailed timing * descriptors are provided and no data is provided in the reserved data block collection. */ - if (data[2] < HDMI_EDID_EXTENSION_D_INVALID_MIN_VAL) { + if (data[UINT8_ARRAY_TElEMENT_2] < HDMI_EDID_EXTENSION_D_INVALID_MIN_VAL) { HDF_LOGD("ext block%d no dtd", blockNum); return HDF_SUCCESS; } /* byte3: indication of underscan support, audio support, support of YCBCR and total number of native DTDs. */ sinkCap->colorSpace.rgb444 = true; - sinkCap->colorSpace.ycbcr422 = (data[3] & HDMI_BIT4_MARK) ? true : false; - sinkCap->colorSpace.ycbcr444 = (data[3] & HDMI_BIT5_MARK) ? true : false; - sinkCap->supportAudio = (data[3] & HDMI_BIT6_MARK) ? true : false; + sinkCap->colorSpace.ycbcr422 = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_BIT4_MARK) ? true : false; + sinkCap->colorSpace.ycbcr444 = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_BIT5_MARK) ? true : false; + sinkCap->supportAudio = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_BIT6_MARK) ? true : false; /* * Video Data Block, Audio Data Block, Speaker Allocation Data Block, * Vendor Specific Data Block and Video Capability Data Block phase. -- Gitee From fb8269f6f6591905c42f6419d4d6cabafcd8e5d5 Mon Sep 17 00:00:00 2001 From: JasonYujia Date: Tue, 26 Oct 2021 08:00:54 +0000 Subject: [PATCH 113/272] modify display reviewbot bug Signed-off-by: JasonYujia --- model/display/driver/hdf_disp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/display/driver/hdf_disp.c b/model/display/driver/hdf_disp.c index 793ff99b7..c599bc17d 100644 --- a/model/display/driver/hdf_disp.c +++ b/model/display/driver/hdf_disp.c @@ -110,8 +110,8 @@ static int32_t SetDispBacklight(uint32_t devId, uint32_t level) if (disp && disp->panelManager && devId < disp->panelManager->panelNum) { panel = disp->panelManager->panel[devId]; } - if (UpdateBrightness(panel->blDev, level) != HDF_SUCCESS) { - HDF_LOGE("%s:UpdateBrightness failed", __func__); + if ((panel == NULL) || (UpdateBrightness(panel->blDev, level) != HDF_SUCCESS)) { + HDF_LOGE("%s:panel is null or UpdateBrightness failed", __func__); return HDF_FAILURE; } HDF_LOGI("%s:level = %u", __func__, level); -- Gitee From 47977f9bbd213ccb6d6a751bafc15017923d24f0 Mon Sep 17 00:00:00 2001 From: yufengs Date: Wed, 27 Oct 2021 17:28:12 +0800 Subject: [PATCH 114/272] Rename usb_interface.h to usb_ddk_interface.h file Signed-off-by: yufengs Change-Id: Iae36a69908f9c7c666d1ac154b22ad4d53c030b5 --- test/unittest/model/usb/host/include/usb_raw_test.h | 2 +- test/unittest/model/usb/host/include/usb_test.h | 2 +- test/unittest/model/usb/host/src/usb_raw_io.c | 2 +- test/unittest/model/usb/host/src/usb_raw_test.c | 2 +- test/unittest/model/usb/host/src/usb_test.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/unittest/model/usb/host/include/usb_raw_test.h b/test/unittest/model/usb/host/include/usb_raw_test.h index d4871a7f8..40f9bd400 100755 --- a/test/unittest/model/usb/host/include/usb_raw_test.h +++ b/test/unittest/model/usb/host/include/usb_raw_test.h @@ -13,7 +13,7 @@ #include "hdf_device_desc.h" #include "hdf_platform.h" #include "implementation/global_implementation.h" -#include "usb_interface.h" +#include "usb_ddk_interface.h" #include "usb_raw_api.h" enum UsbRawTestCmd { diff --git a/test/unittest/model/usb/host/include/usb_test.h b/test/unittest/model/usb/host/include/usb_test.h index 99da33d8b..c2f7d388c 100755 --- a/test/unittest/model/usb/host/include/usb_test.h +++ b/test/unittest/model/usb/host/include/usb_test.h @@ -14,7 +14,7 @@ #include "hdf_platform.h" #include "implementation/global_implementation.h" #include "usb_ddk.h" -#include "usb_interface.h" +#include "usb_ddk_interface.h" enum UsbTestCmd { USB_WRITE_TEST = 0, diff --git a/test/unittest/model/usb/host/src/usb_raw_io.c b/test/unittest/model/usb/host/src/usb_raw_io.c index 42ee4a508..45212bf9b 100755 --- a/test/unittest/model/usb/host/src/usb_raw_io.c +++ b/test/unittest/model/usb/host/src/usb_raw_io.c @@ -15,7 +15,7 @@ #include "hdf_log.h" #include "osal_mem.h" #include "osal_time.h" -#include "usb_interface.h" +#include "usb_ddk_interface.h" #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY #include "usb_pnp_notify.h" #endif diff --git a/test/unittest/model/usb/host/src/usb_raw_test.c b/test/unittest/model/usb/host/src/usb_raw_test.c index 8f19fb97e..040ffbe62 100755 --- a/test/unittest/model/usb/host/src/usb_raw_test.c +++ b/test/unittest/model/usb/host/src/usb_raw_test.c @@ -15,7 +15,7 @@ #include "hdf_log.h" #include "osal_mem.h" #include "osal_time.h" -#include "usb_interface.h" +#include "usb_ddk_interface.h" #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY #include "usb_pnp_notify.h" #endif diff --git a/test/unittest/model/usb/host/src/usb_test.c b/test/unittest/model/usb/host/src/usb_test.c index 0963e1365..4fc60ca5c 100755 --- a/test/unittest/model/usb/host/src/usb_test.c +++ b/test/unittest/model/usb/host/src/usb_test.c @@ -13,7 +13,7 @@ #include "hdf_log.h" #include "osal_mem.h" #include "osal_time.h" -#include "usb_interface.h" +#include "usb_ddk_interface.h" #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY #include "usb_pnp_notify.h" #endif -- Gitee From 0fad6637a9fc3abd9d801a0ea32215ba698b9d8a Mon Sep 17 00:00:00 2001 From: kangweijie Date: Thu, 28 Oct 2021 06:21:07 +0000 Subject: [PATCH 115/272] Description:C90 Warning cleaning Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/bus/hdf_ibus_intf.c | 2 +- .../network/wifi/core/components/softap/ap.c | 6 ++-- model/network/wifi/core/components/sta/sta.c | 2 +- model/network/wifi/core/module/wifi_base.c | 13 +++---- .../platform/src/hdf_wlan_config_parser.c | 4 +-- .../platform/src/hdf_wlan_power_manager.c | 2 +- .../platform/src/hdf_wlan_priority_queue.c | 4 +-- .../wifi/platform/src/hdf_wlan_utils.c | 4 +-- .../platform/src/message/message_dispatcher.c | 18 +++++----- .../platform/src/message/message_router.c | 34 +++++++++---------- .../platform/src/message/nodes/local_node.c | 21 ++++++------ .../wifi/platform/src/message/sidecar.c | 14 ++++---- .../wifi/platform/src/qos/flow_control_task.c | 4 +-- .../wifi/unittest/message/hdf_queue_test.c | 9 ++--- .../wifi/unittest/module/hdf_module_test.c | 3 +- 15 files changed, 70 insertions(+), 70 deletions(-) diff --git a/model/network/wifi/bus/hdf_ibus_intf.c b/model/network/wifi/bus/hdf_ibus_intf.c index 580604cc3..8a0bde671 100644 --- a/model/network/wifi/bus/hdf_ibus_intf.c +++ b/model/network/wifi/bus/hdf_ibus_intf.c @@ -19,7 +19,7 @@ extern "C" { struct BusDev *HdfWlanCreateBusManager(const struct HdfConfigWlanBus *busConfig) { - struct BusDev *bus = NULL; + struct BusDev *bus = NULL; if (busConfig == NULL) { return NULL; } diff --git a/model/network/wifi/core/components/softap/ap.c b/model/network/wifi/core/components/softap/ap.c index dadf03e8e..09e450738 100644 --- a/model/network/wifi/core/components/softap/ap.c +++ b/model/network/wifi/core/components/softap/ap.c @@ -48,10 +48,10 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) { struct WlanAPConf apConf = { 0 }; int32_t ret; - struct HdfChipDriver *chipDriver = NULL; + struct HdfChipDriver *chipDriver = NULL; errno_t err; - HDF_LOGE("%s:starting ap...", __func__); - chipDriver = GetChipDriver(netDev); + HDF_LOGE("%s:starting ap...", __func__); + chipDriver = GetChipDriver(netDev); if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; diff --git a/model/network/wifi/core/components/sta/sta.c b/model/network/wifi/core/components/sta/sta.c index aad87e8e1..2bd56db64 100644 --- a/model/network/wifi/core/components/sta/sta.c +++ b/model/network/wifi/core/components/sta/sta.c @@ -347,7 +347,7 @@ static int32_t WifiCmdSetScanningMacAddress(const RequestContext *context, struc const char *ifName = NULL; unsigned char *mac = NULL; uint32_t replayDataSize; - struct HdfChipDriver *chipDriver = NULL; + struct HdfChipDriver *chipDriver = NULL; (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index eb3240dbb..e3510e686 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -718,8 +718,7 @@ static int32_t WifiCmdSendAction(const RequestContext *context, struct HdfSBuf * const char *ifName = NULL; uint32_t dataSize = 0; struct NetDevice *netdev = NULL; - int ret; - + int ret; (void)context; (void)rspData; if (reqData == NULL) { @@ -979,8 +978,7 @@ static int32_t WifiCmdSetTxPower(const RequestContext *context, struct HdfSBuf * static int32_t WifiCmdSetClient(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { uint32_t clientNum = 0; - struct HdfWifiEventToClientMap *eventToClientMap = NULL; - + struct HdfWifiEventToClientMap *eventToClientMap = NULL; (void)rspData; if (reqData == NULL || context == NULL) { return HDF_ERR_INVALID_PARAM; @@ -1203,7 +1201,7 @@ void SendMessageResetDriverCallBack(const RequestContext *context, struct HdfSBu ErrorCode rspCode) { uint8_t chipId; - int32_t ret; + int32_t ret; const char *ifName = NULL; (void)context; @@ -1232,7 +1230,7 @@ void SendMessageResetDriverCallBack(const RequestContext *context, struct HdfSBu static int32_t WifiCmdResetDriver(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { int32_t ret; - struct HdfSBuf *data = NULL; + struct HdfSBuf *data = NULL; (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; @@ -1495,8 +1493,7 @@ static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *re struct NetDevice *netdev = NULL; const char *ifName = NULL; WifiIfRemove *ifRemove = NULL; - uint32_t dataSize; - + uint32_t dataSize; (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; diff --git a/model/network/wifi/platform/src/hdf_wlan_config_parser.c b/model/network/wifi/platform/src/hdf_wlan_config_parser.c index b342ff4da..61da15060 100644 --- a/model/network/wifi/platform/src/hdf_wlan_config_parser.c +++ b/model/network/wifi/platform/src/hdf_wlan_config_parser.c @@ -250,7 +250,7 @@ static int32_t ParseWlanPowerConfig(const struct DeviceResourceNode *node, static int32_t ParseWlanPowersConfig(const struct DeviceResourceNode *node, struct HdfConfWlanPowers *powersConfig) { struct DeviceResourceIface *drsOps = NULL; - const struct DeviceResourceNode *fstPowerNode = NULL; + const struct DeviceResourceNode *fstPowerNode = NULL; const struct DeviceResourceNode *secPowerNode = NULL; if (node == NULL || powersConfig == NULL) { HDF_LOGE("%s: at least one of the paras is NULL!", __func__); @@ -261,7 +261,7 @@ static int32_t ParseWlanPowersConfig(const struct DeviceResourceNode *node, stru HDF_LOGE("%s: at least one of the paras is NULL!", __func__); return HDF_FAILURE; } - fstPowerNode = drsOps->GetChildNode(node, "power0"); + fstPowerNode = drsOps->GetChildNode(node, "power0"); if (fstPowerNode == NULL) { HDF_LOGE("%s: get power0 config fail!", __func__); return HDF_FAILURE; diff --git a/model/network/wifi/platform/src/hdf_wlan_power_manager.c b/model/network/wifi/platform/src/hdf_wlan_power_manager.c index ca16195b1..1c7f29c92 100644 --- a/model/network/wifi/platform/src/hdf_wlan_power_manager.c +++ b/model/network/wifi/platform/src/hdf_wlan_power_manager.c @@ -142,7 +142,7 @@ int32_t HdfWlanPowerMgrRelease(struct PowerManager* powerMgr) */ struct PowerManager* HdfWlanCreatePowerManager(const struct HdfConfWlanPowers *configPowers) { - struct PowerManagerImpl *powerMgrimpl = NULL; + struct PowerManagerImpl *powerMgrimpl = NULL; if (configPowers == NULL) { HDF_LOGE("%s: configPowers is NULL", __func__); return NULL; diff --git a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c index a4892c8ba..76daf4842 100644 --- a/model/network/wifi/platform/src/hdf_wlan_priority_queue.c +++ b/model/network/wifi/platform/src/hdf_wlan_priority_queue.c @@ -29,7 +29,7 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun uint32_t queueMemSize; PriorityQueueImpl *priorityQueue = NULL; uint32_t ret = HDF_SUCCESS; - HDF_STATUS status; + HDF_STATUS status; if (priorityLevelCount > MAX_PRIORITY_LEVEL || priorityLevelCount == 0) { HDF_LOGE("%s:priorityLevelCount must in 1 to 8", __func__); return NULL; @@ -64,7 +64,7 @@ PriorityQueue *CreatePriorityQueue(uint16_t queueSize, uint8_t priorityLevelCoun void DestroyPriorityQueue(PriorityQueue *queue) { uint8_t i; - HDF_STATUS status; + HDF_STATUS status; PriorityQueueImpl *queueImpl = (PriorityQueueImpl *)queue; if (queue == NULL) { return; diff --git a/model/network/wifi/platform/src/hdf_wlan_utils.c b/model/network/wifi/platform/src/hdf_wlan_utils.c index f2dee1cf7..a6bd35cc2 100644 --- a/model/network/wifi/platform/src/hdf_wlan_utils.c +++ b/model/network/wifi/platform/src/hdf_wlan_utils.c @@ -45,7 +45,7 @@ struct WlanHwCapability *GetHwCapability(struct NetDevice *netDev) { struct HdfChipDriver *chipDriver = GetChipDriver(netDev); struct WlanHwCapability *capability = NULL; - int32_t ret; + int32_t ret; if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); return NULL; @@ -223,7 +223,7 @@ char *HdfWlanGetIfNames(const uint8_t chipId, uint8_t *ifNameCount) char *ifNames = NULL; uint32_t bufferSize; uint8_t i, j; - int32_t ret; + int32_t ret; if (ifNameCount == NULL) { HDF_LOGE("%s: para is NULL", __func__); return NULL; diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index f0e1f6144..2916955b6 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -61,7 +61,7 @@ void ReleaseMessageMapper(struct ServiceDef *mapper) struct MessageDef *GetMsgDef(const struct ServiceDef *serviceDef, uint32_t commandId) { - struct MessageDef *msgDef = NULL; + struct MessageDef *msgDef = NULL; if (serviceDef == NULL || serviceDef->messages == NULL) { HDF_LOGE("%s:input is NULL!", __func__); return NULL; @@ -104,7 +104,7 @@ ErrorCode AppendToLocalDispatcher(MessageDispatcher *dispatcher, const uint8_t p void SetToResponse(MessageContext *context) { - ServiceId senderId; + ServiceId senderId; if (context->requestType != MESSAGE_TYPE_ASYNC_REQ && context->requestType != MESSAGE_TYPE_SYNC_REQ) { HDF_LOGE("Only sync and async message can send response!type=%u", context->requestType); return; @@ -130,7 +130,7 @@ static void HandleAsyncResponse(MessageContext *context) static void HandleSyncResponse(MessageContext *context) { - HDF_STATUS status; + HDF_STATUS status; if (context == NULL) { HDF_LOGE("Input context is NULL!"); return; @@ -232,7 +232,7 @@ static void ReleaseAllMessage(MessageDispatcher *dispatcher) static int RunDispatcher(void *para) { - MessageDispatcher *dispatcher = NULL; + MessageDispatcher *dispatcher = NULL; MessageContext *context = NULL; if (para == NULL) { HDF_LOGE("Start dispatcher failed! cause:%s\n", "input para is NULL"); @@ -278,13 +278,13 @@ static int RunDispatcher(void *para) static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) { - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; LocalMessageDispatcher *localDispatcher = NULL; if (dispatcher == NULL) { return ME_ERROR_NULL_PTR; } - status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } @@ -335,11 +335,11 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) static void ShutdownDispatcher(MessageDispatcher *dispatcher) { - HDF_STATUS status; + HDF_STATUS status; if (dispatcher == NULL) { return; } - status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); + status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Get lock failed!status=%d", status); return; @@ -384,7 +384,7 @@ static void DestroyLocalDispatcher(MessageDispatcher *dispatcher) ErrorCode CreateLocalDispatcher(MessageDispatcher **dispatcher, const DispatcherConfig *config) { - LocalMessageDispatcher *localDispatcher = NULL; + LocalMessageDispatcher *localDispatcher = NULL; int32_t ret; ErrorCode errCode; if (dispatcher == NULL || config == NULL) { diff --git a/model/network/wifi/platform/src/message/message_router.c b/model/network/wifi/platform/src/message/message_router.c index 68dc5db60..e584d51d8 100644 --- a/model/network/wifi/platform/src/message/message_router.c +++ b/model/network/wifi/platform/src/message/message_router.c @@ -70,7 +70,7 @@ static void ReleaseRemoteService(RemoteService *service) static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bool requireLock) { - MessageDispatcher *result = NULL; + MessageDispatcher *result = NULL; if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) { HDF_LOGE("%s:Input ID is too big.input=%u", __func__, dispatcherId); return NULL; @@ -106,7 +106,7 @@ static MessageDispatcher *RefDispatcherInner(const DispatcherId dispatcherId, bo static ErrorCode RegDispatcher(DispatcherId dispatcherId, MessageDispatcher *dispatcher) { - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; if (dispatcherId >= MESSAGE_ENGINE_MAX_DISPATCHER) { HDF_LOGE("%s:dispatcher id is too big!id=%u", __func__, dispatcherId); @@ -141,7 +141,7 @@ static ErrorCode RegDispatcher(DispatcherId dispatcherId, MessageDispatcher *dis ErrorCode AddDispatcher(DispatcherConfig *config) { - ErrorCode errCode; + ErrorCode errCode; MessageDispatcher *dispatcher = NULL; if (config == NULL) { return ME_ERROR_NULL_PTR; @@ -194,7 +194,7 @@ static void NotifyAllNodesServiceDel(const NodeId nodeId, ServiceId serviceId) static ErrorCode NotifyAllNodesServiceAdd(const NodeId nodeId, struct ServiceDef *mapper) { uint8_t i; - uint8_t notifyNodeIndex; + uint8_t notifyNodeIndex; ErrorCode errCode; if (mapper == NULL) { return ME_ERROR_NULL_PTR; @@ -263,7 +263,7 @@ static ErrorCode DoRegistService(const NodeId nodeId, const DispatcherId dispatc } static ErrorCode RegistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, struct ServiceDef *mapper) { - HDF_STATUS status; + HDF_STATUS status; MessageNode *node = NULL; RemoteService *remoteService = NULL; MessageDispatcher *dispatcher = NULL; @@ -288,7 +288,7 @@ static ErrorCode RegistServiceInner(const NodeId nodeId, const DispatcherId disp OsalMutexUnlock(&g_routerMutex); return ME_ERROR_NO_SUCH_NODE; } - do { + do { if (node->CreateRemoteService == NULL) { HDF_LOGE("%s:Can not reg service to node %d", __func__, nodeId); errCode = ME_ERROR_NOT_SUPPORTED; @@ -343,7 +343,7 @@ ErrorCode RegistLocalService(const DispatcherId dispatcherId, struct ServiceDef ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service) { - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; if (service == NULL) { return ME_ERROR_NULL_PTR; @@ -375,7 +375,7 @@ ErrorCode RegistRemoteService(NodeId nodeId, RemoteService *service) } static ErrorCode UnregistServiceInner(const NodeId nodeId, const DispatcherId dispatcherId, const ServiceId serviceId) { - RemoteService *service = NULL; + RemoteService *service = NULL; HDF_STATUS status; ErrorCode errCode; if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) { @@ -449,7 +449,7 @@ static bool CheckServiceID(ServiceId serviceId, bool allowSync) RemoteService *RefRemoteService(ServiceId serviceId) { - HDF_STATUS status; + HDF_STATUS status; RemoteService *remoteService = NULL; RemoteService *service = NULL; if (serviceId >= MESSAGE_ENGINE_MAX_SERVICE) { @@ -481,8 +481,8 @@ RemoteService *RefRemoteService(ServiceId serviceId) ErrorCode SendMessage(MessageContext *context) { - RemoteService *service = NULL; - ErrorCode errCode; + RemoteService *service = NULL; + ErrorCode errCode; service = RefRemoteService(context->receiverId); if (service == NULL) { return ME_ERROR_NO_SUCH_SERVICE; @@ -565,7 +565,7 @@ static void ReleaseNodes(void) static ErrorCode DoStartMessageRouter(uint8_t nodesConfig) { uint8_t i; - ErrorCode errCode; + ErrorCode errCode; if (g_routerStatus != ME_STATUS_STOPPED) { HDF_LOGE("Router have already started!"); return ME_ERROR_MUTI_INIT_NOT_ALLOWED; @@ -607,7 +607,7 @@ static ErrorCode DoStartMessageRouter(uint8_t nodesConfig) ErrorCode EnableDefaultDispatcher(void) { - ErrorCode errCode; + ErrorCode errCode; DispatcherConfig config = { .dispatcherId = DEFAULT_DISPATCHER_ID, .queueSize = DEFAULT_DISPATCHER_QUEUE_SIZE, @@ -623,7 +623,7 @@ ErrorCode EnableDefaultDispatcher(void) ErrorCode StartMessageRouter(uint8_t nodesConfig) { - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; if (g_routerMutex.realMutex == NULL) { HDF_STATUS status = OsalMutexInit(&g_routerMutex); @@ -647,7 +647,7 @@ ErrorCode StartMessageRouter(uint8_t nodesConfig) static ErrorCode DoShutdownMessageRouter(void) { uint8_t i; - RemoteService *service = NULL; + RemoteService *service = NULL; if (g_routerStatus == ME_STATUS_STOPPED) { return ME_SUCCESS; } @@ -683,7 +683,7 @@ static ErrorCode DoShutdownMessageRouter(void) ErrorCode ShutdownMessageRouter() { HDF_LOGW("%s:Shutdown router...", __func__); - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { @@ -703,7 +703,7 @@ ErrorCode ShutdownMessageRouter() MessageNode *RefMessageNode(const NodeId nodeId, bool isRequireLock) { - MessageNode *node = NULL; + MessageNode *node = NULL; HDF_STATUS status; if (nodeId >= MAX_NODE_COUNT) { HDF_LOGE("Input nodeId >= MAX_NODE_COUNT"); diff --git a/model/network/wifi/platform/src/message/nodes/local_node.c b/model/network/wifi/platform/src/message/nodes/local_node.c index 18bf236e5..8b1ba563c 100644 --- a/model/network/wifi/platform/src/message/nodes/local_node.c +++ b/model/network/wifi/platform/src/message/nodes/local_node.c @@ -31,7 +31,7 @@ typedef struct LocalNodeService { static void HandleRequestMessage(const RemoteService *service, MessageContext *context) { - LocalNodeService *localNodeService = NULL; + LocalNodeService *localNodeService = NULL; localNodeService = (LocalNodeService *)service; struct MessageDef messageDef = { NULL, 0 }; if (context == NULL || service == NULL) { @@ -51,7 +51,7 @@ static void HandleRequestMessage(const RemoteService *service, MessageContext *c static void HandleResponseMessage(const RemoteService *service, MessageContext *context) { (void)service; - HDF_STATUS status; + HDF_STATUS status; if (context->requestType < MESSAGE_RSP_START) { return; } @@ -74,6 +74,7 @@ static void HandleResponseMessage(const RemoteService *service, MessageContext * ErrorCode SendMessageLocalNode(const RemoteService *service, MessageContext *context) { + LocalNodeService *localService = NULL; uint8_t pri = HIGHEST_PRIORITY; if (service == NULL || context == NULL) { HDF_LOGE("%s:Input is NULL!", __func__); @@ -88,7 +89,7 @@ ErrorCode SendMessageLocalNode(const RemoteService *service, MessageContext *con (void)OsalSemPost(&context->rspSemaphore); return ME_SUCCESS; } else { - LocalNodeService *localService = (LocalNodeService *)service; + localService = (LocalNodeService *)service; if (localService->dispatcher == NULL || localService->dispatcher->AppendMessage == NULL) { HDF_LOGE("This service has no dispatcher!"); return ME_ERROR_NOT_SUPPORTED; @@ -118,7 +119,7 @@ static void ShutdownLocalService(RemoteService *service) static void DestroyLocalNodeRemoteService(RemoteService *service) { - LocalNodeService *localService = NULL; + LocalNodeService *localService = NULL; if (service == NULL) { return; } @@ -133,7 +134,7 @@ static void DestroyLocalNodeRemoteService(RemoteService *service) RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *dispatcher, struct ServiceDef *mapper) { - LocalNodeService *service = NULL; + LocalNodeService *service = NULL; (void)node; ErrorCode errCode; if (mapper == NULL) { @@ -143,7 +144,7 @@ RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *disp HDF_LOGE("%s:Bad dispatcher found!", __func__); return NULL; } - service = (LocalNodeService *)OsalMemCalloc(sizeof(LocalNodeService)); + service = (LocalNodeService *)OsalMemCalloc(sizeof(LocalNodeService)); if (service == NULL) { return NULL; } @@ -177,7 +178,7 @@ RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *disp static ErrorCode InitLocalNode(MessageNode *node) { - HDF_STATUS status; + HDF_STATUS status; ErrorCode errCode; if (node == NULL) { return ME_ERROR_NULL_PTR; @@ -187,7 +188,7 @@ static ErrorCode InitLocalNode(MessageNode *node) if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } - errCode = ME_SUCCESS; + errCode = ME_SUCCESS; do { if (node->status != ME_STATUS_STOPPED) { HDF_LOGE("%s:unexpected status %d", __func__, node->status); @@ -226,7 +227,7 @@ static ErrorCode InitLocalNode(MessageNode *node) static void DestroyLocalNode(MessageNode *node) { - int32_t ret; + int32_t ret; if (node == NULL) { return; } @@ -239,7 +240,7 @@ static void DestroyLocalNode(MessageNode *node) ErrorCode CreateLocalNode(MessageNode **node) { - int32_t ret; + int32_t ret; LocalMessageNode *newNode = NULL; ErrorCode errCode; if (node == NULL) { diff --git a/model/network/wifi/platform/src/message/sidecar.c b/model/network/wifi/platform/src/message/sidecar.c index 2cc0f8e8d..75843c05f 100644 --- a/model/network/wifi/platform/src/message/sidecar.c +++ b/model/network/wifi/platform/src/message/sidecar.c @@ -26,7 +26,7 @@ typedef struct { static ErrorCode MessageInputCheck(const Service *sideCar, ServiceId receiver, struct HdfSBuf *sendData) { - SideCarPrivateData *privateData = NULL; + SideCarPrivateData *privateData = NULL; if (sideCar == NULL || sideCar->privateData == NULL) { HDF_LOGE("%s:sideCar or sideCar.privateData is NULL", __func__); return ME_ERROR_NULL_PTR; @@ -75,7 +75,7 @@ int32_t DispatchToMessage(struct HdfDeviceIoClient *client, int id, struct HdfSB ServiceId serviceId = GetServiceID(id); uint32_t cmd = GetCmd(id); MessageContext *context = NULL; - RemoteService *targetService = NULL; + RemoteService *targetService = NULL; if (client == NULL) { return HDF_ERR_INVALID_PARAM; @@ -110,7 +110,7 @@ int32_t DispatchToMessage(struct HdfDeviceIoClient *client, int id, struct HdfSB static ErrorCode SideCarSendSyncMessage(const Service *sideCar, ServiceId receiver, uint32_t commandId, struct HdfSBuf *sendData, struct HdfSBuf *recvData) { - SideCarPrivateData *privateData = NULL; + SideCarPrivateData *privateData = NULL; MessageContext *context = NULL; RemoteService *targetService = NULL; ErrorCode errCode = MessageInputCheck(sideCar, receiver, sendData); @@ -144,7 +144,7 @@ static ErrorCode SideCarSendSyncMessage(const Service *sideCar, ServiceId receiv static ErrorCode SideCarSendAsyncMessageInner(const Service *sideCar, ServiceId receiver, uint32_t commandId, struct HdfSBuf *reqData, MessageCallBack callback) { - SideCarPrivateData *privateData = NULL; + SideCarPrivateData *privateData = NULL; MessageContext *context = NULL; struct HdfSBuf *rspData = NULL; RemoteService *targetService = NULL; @@ -204,7 +204,7 @@ static ErrorCode SideCarSendOneWayMessage(const struct SideCar_ *sideCar, Servic static ErrorCode DestroyService(Service *service) { - SideCarPrivateData *data = NULL; + SideCarPrivateData *data = NULL; ErrorCode errCode; if (service == NULL) { return ME_ERROR_NULL_PTR; @@ -216,7 +216,7 @@ static ErrorCode DestroyService(Service *service) } data = (SideCarPrivateData *)service->privateData; HDF_LOGE("Destroy service! id=%d", data->serviceId); - errCode = UnregistLocalService(data->dispatcherId, data->serviceId); + errCode = UnregistLocalService(data->dispatcherId, data->serviceId); if (errCode != ME_SUCCESS) { HDF_LOGE("Unregist service failed!ret=%d", errCode); return errCode; @@ -230,7 +230,7 @@ static ErrorCode DestroyService(Service *service) Service *InitService(struct ServiceDef *def, const ServiceCfg *cfg) { - Service *service = NULL; + Service *service = NULL; SideCarPrivateData *privateData = NULL; ErrorCode errCode; if (cfg == NULL || def == NULL) { diff --git a/model/network/wifi/platform/src/qos/flow_control_task.c b/model/network/wifi/platform/src/qos/flow_control_task.c index 01d342351..a6f3b7a16 100644 --- a/model/network/wifi/platform/src/qos/flow_control_task.c +++ b/model/network/wifi/platform/src/qos/flow_control_task.c @@ -171,7 +171,7 @@ static void DestroyTask(struct FlowControlModule *fcm, FlowDir dir) int32_t CreateFlowControlTask(struct FlowControlModule *fcm) { - int32_t ret; + int32_t ret; struct OsalThreadParam config = { .priority = OSAL_THREAD_PRI_HIGHEST, .stackSize = 0, @@ -181,7 +181,7 @@ int32_t CreateFlowControlTask(struct FlowControlModule *fcm) HDF_LOGE("%s fail: fcm = null!", __func__); return HDF_ERR_INVALID_PARAM; } - ret = CreateTask(&fcm->txTransferThread, RX_THREAD_NAME, RunWiFiTxFlowControl, &config, fcm); + ret = CreateTask(&fcm->txTransferThread, RX_THREAD_NAME, RunWiFiTxFlowControl, &config, fcm); if (ret == HDF_FAILURE) { fcm->threadStatus[FLOW_TX] = THREAD_INIT_FAIL; return HDF_FAILURE; diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c index 2e8229503..c3b60629c 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c @@ -27,7 +27,7 @@ int32_t MessageQueueTest001(void) int c = 3; int d = 4; int32_t errCode; - void *p = NULL; + void *p = NULL; PriorityQueue *queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); @@ -76,7 +76,7 @@ int32_t MessageQueueTest002(void) int c = 3; int d = 4; int32_t errCode; - void *p = NULL; + void *p = NULL; PriorityQueue *queue = NULL; queue = CreatePriorityQueue(TEST_QUEUE_SIZE, MUTI_PRIORITY); if (queue == NULL) { @@ -133,8 +133,9 @@ static int RunPushQueue(void *para) int32_t MessageQueueTest003(void) { int32_t errCode = HDF_SUCCESS; - void *p = NULL; + void *p = NULL; PriorityQueue *queue = NULL; + int32_t status; queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); @@ -148,7 +149,7 @@ int32_t MessageQueueTest003(void) .stackSize = 0x1000, }; - int32_t status = OsalThreadCreate(&pushThread, RunPushQueue, queue); + status = OsalThreadCreate(&pushThread, RunPushQueue, queue); if (status != HDF_SUCCESS) { HDF_LOGE("%s:OsalThreadCreate failed!status=%d", __func__, status); errCode = HDF_FAILURE; diff --git a/test/unittest/model/network/wifi/unittest/module/hdf_module_test.c b/test/unittest/model/network/wifi/unittest/module/hdf_module_test.c index 858bff8fa..cf4255f7e 100644 --- a/test/unittest/model/network/wifi/unittest/module/hdf_module_test.c +++ b/test/unittest/model/network/wifi/unittest/module/hdf_module_test.c @@ -76,12 +76,13 @@ static int32_t WiFiModuleTestSetEnv(void) int32_t WiFiModuleTestCreateModule(void) { int32_t ret; + struct WifiModule *module = NULL; ret = WiFiModuleTestSetEnv(); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:WiFiModuleTestSetEnv failed.ret=%d", __func__, ret); return ret; } - struct WifiModule *module = OsalMemCalloc(sizeof(struct WifiModule)); + module = OsalMemCalloc(sizeof(struct WifiModule)); if (module == NULL) { HDF_LOGE("%s fail WifiModuleCreate FAIL ", __func__); return HDF_FAILURE; -- Gitee From 925a7db74f56ddeb2a12113ec87d6da0e84bd50c Mon Sep 17 00:00:00 2001 From: kangweijie Date: Thu, 28 Oct 2021 06:45:23 +0000 Subject: [PATCH 116/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/platform/src/message/message_dispatcher.c | 2 +- model/network/wifi/platform/src/message/nodes/local_node.c | 2 +- .../model/network/wifi/unittest/message/hdf_queue_test.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index 2916955b6..9a8a029ed 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -362,7 +362,7 @@ static void ShutdownDispatcher(MessageDispatcher *dispatcher) IMPLEMENT_SHARED_OBJ(MessageDispatcher); static void DestroyLocalDispatcher(MessageDispatcher *dispatcher) { - int32_t ret; + int32_t ret; if (dispatcher == NULL) { return; } diff --git a/model/network/wifi/platform/src/message/nodes/local_node.c b/model/network/wifi/platform/src/message/nodes/local_node.c index 8b1ba563c..506d9f890 100644 --- a/model/network/wifi/platform/src/message/nodes/local_node.c +++ b/model/network/wifi/platform/src/message/nodes/local_node.c @@ -247,7 +247,7 @@ ErrorCode CreateLocalNode(MessageNode **node) return ME_ERROR_NULL_PTR; } HDF_LOGI("Creating local node..."); - newNode = (LocalMessageNode *)OsalMemCalloc(sizeof(LocalMessageNode)); + newNode = (LocalMessageNode *)OsalMemCalloc(sizeof(LocalMessageNode)); if (newNode == NULL) { return ME_ERROR_RES_LAKE; } diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c index c3b60629c..feee6d0e8 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c @@ -136,7 +136,7 @@ int32_t MessageQueueTest003(void) void *p = NULL; PriorityQueue *queue = NULL; int32_t status; - queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); + queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); return -1; -- Gitee From b03968d73c8fac7a876f6ad5206f686a02e8c6fb Mon Sep 17 00:00:00 2001 From: kangweijie Date: Thu, 28 Oct 2021 06:52:36 +0000 Subject: [PATCH 117/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/platform/src/message/message_router.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/network/wifi/platform/src/message/message_router.c b/model/network/wifi/platform/src/message/message_router.c index e584d51d8..0c0b6e9c4 100644 --- a/model/network/wifi/platform/src/message/message_router.c +++ b/model/network/wifi/platform/src/message/message_router.c @@ -146,7 +146,7 @@ ErrorCode AddDispatcher(DispatcherConfig *config) if (config == NULL) { return ME_ERROR_NULL_PTR; } - errCode = CreateLocalDispatcher(&dispatcher, config); + errCode = CreateLocalDispatcher(&dispatcher, config); if (errCode != ME_SUCCESS) { return errCode; } -- Gitee From 24b8c7b9c0e2722ff2b2d9480ffde8597c4b305c Mon Sep 17 00:00:00 2001 From: kangweijie Date: Fri, 29 Oct 2021 07:16:43 +0000 Subject: [PATCH 118/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/core/components/softap/ap.c | 2 +- model/network/wifi/platform/src/message/message_dispatcher.c | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/model/network/wifi/core/components/softap/ap.c b/model/network/wifi/core/components/softap/ap.c index 09e450738..11bf08a0a 100644 --- a/model/network/wifi/core/components/softap/ap.c +++ b/model/network/wifi/core/components/softap/ap.c @@ -50,7 +50,7 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) int32_t ret; struct HdfChipDriver *chipDriver = NULL; errno_t err; - HDF_LOGE("%s:starting ap...", __func__); + HDF_LOGI("%s:starting ap...", __func__); chipDriver = GetChipDriver(netDev); if (chipDriver == NULL) { HDF_LOGE("%s:bad net device found!", __func__); diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index 9a8a029ed..c3bbc95b3 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -281,13 +281,16 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) HDF_STATUS status; ErrorCode errCode; LocalMessageDispatcher *localDispatcher = NULL; + if (dispatcher == NULL) { return ME_ERROR_NULL_PTR; } + status = OsalMutexTimedLock(&dispatcher->mutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { return ME_ERROR_OPER_MUTEX_FAILED; } + errCode = ME_SUCCESS; do { if (dispatcher->status != ME_STATUS_STOPPED) { @@ -308,6 +311,7 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) errCode = ME_ERROR_CREATE_THREAD_FAILED; break; } + status = OsalThreadStart(&localDispatcher->dispatcherThread, &config); if (status != HDF_SUCCESS) { HDF_LOGE("%s:OsalThreadStart failed!status=%d", __func__, status); -- Gitee From be3c16f2ff3c00e7079bb3a5719a4753136527c9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Sat, 30 Oct 2021 14:36:29 +0800 Subject: [PATCH 119/272] =?UTF-8?q?PWM=203=E4=B8=AA=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=A0=B7=E4=BE=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- support/platform/src/pwm_core.c | 63 ++++++- .../test/unittest/common/hdf_pwm_test.cpp | 6 - test/unittest/platform/common/pwm_test.c | 164 ++++++++++++------ test/unittest/platform/common/pwm_test.h | 2 +- test/unittest/platform/hdf_pwm_entry_test.c | 4 +- 5 files changed, 170 insertions(+), 69 deletions(-) diff --git a/support/platform/src/pwm_core.c b/support/platform/src/pwm_core.c index 98b2347be..1f77085da 100644 --- a/support/platform/src/pwm_core.c +++ b/support/platform/src/pwm_core.c @@ -6,13 +6,12 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "pwm_core.h" #include "hdf_log.h" #include "osal_mem.h" -#include "pwm_core.h" -#include "pwm_if.h" #include "securec.h" -#define HDF_LOG_TAG PWM_CORE +#define HDF_LOG_TAG pwm_core #define PWM_NAME_LEN 32 static struct PwmDev *PwmGetDevByNum(uint32_t num) @@ -91,6 +90,7 @@ int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) int32_t ret; struct PwmDev *pwm = NULL; + HDF_LOGI("%s: enter.", __func__); if (handle == NULL) { HDF_LOGE("%s: handle is NULL", __func__); return HDF_ERR_INVALID_OBJECT; @@ -108,12 +108,16 @@ int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) HDF_LOGE("%s: setConfig is not support", __func__); return HDF_ERR_NOT_SUPPORT; } + HDF_LOGI("%s: set PwmConfig: number %u, period %u, duty %u, polarity %u, enable %u.", __func__, + config->number, config->period, config->duty, config->polarity, config->status); ret = pwm->method->setConfig(pwm, config); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed, ret %d", __func__, ret); return ret; } pwm->cfg = *config; + HDF_LOGI("%s: success.", __func__); + return HDF_SUCCESS; } @@ -121,6 +125,7 @@ int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) { struct PwmDev *pwm = NULL; + HDF_LOGI("%s: enter.", __func__); if (handle == NULL) { HDF_LOGE("%s: handle is NULL", __func__); return HDF_ERR_INVALID_OBJECT; @@ -131,6 +136,7 @@ int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) } pwm = (struct PwmDev *)handle; *config = pwm->cfg; + HDF_LOGI("%s: success.", __func__); return HDF_SUCCESS; } @@ -138,57 +144,96 @@ int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) int32_t PwmEnable(DevHandle handle) { struct PwmConfig config; + uint32_t curValue; + int32_t ret; + HDF_LOGI("%s: enter.", __func__); if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { return HDF_FAILURE; } + curValue = config.status; config.status = PWM_ENABLE_STATUS; - return PwmSetConfig(handle, &config); + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); + } + return ret; } int32_t PwmDisable(DevHandle handle) { struct PwmConfig config; + uint32_t curValue; + int32_t ret; + HDF_LOGI("%s: enter.", __func__); if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { return HDF_FAILURE; } + curValue = config.status; config.status = PWM_DISABLE_STATUS; - return PwmSetConfig(handle, &config); + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); + } + return ret; } int32_t PwmSetPeriod(DevHandle handle, uint32_t period) { struct PwmConfig config; + uint32_t curValue; + int32_t ret; + HDF_LOGI("%s: enter.", __func__); if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { return HDF_FAILURE; } + curValue = config.period; config.period = period; - return PwmSetConfig(handle, &config); + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. period: %d -> %d.", __func__, curValue, config.period); + } + return ret; } int32_t PwmSetDuty(DevHandle handle, uint32_t duty) { struct PwmConfig config; + uint32_t curValue; + int32_t ret; + HDF_LOGI("%s: enter.", __func__); if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { return HDF_FAILURE; } + curValue = config.duty; config.duty = duty; - return PwmSetConfig(handle, &config); + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. duty: %d -> %d.", __func__, curValue, config.duty); + } + return ret; } int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity) { struct PwmConfig config; + uint32_t curValue; + int32_t ret; + HDF_LOGI("%s: enter.", __func__); if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { return HDF_FAILURE; } + curValue = config.polarity; config.polarity = polarity; - config.duty = config.period - config.duty; - return PwmSetConfig(handle, &config); + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. polarity: %d -> %d.", __func__, curValue, config.polarity); + } + return ret; } int32_t PwmSetPriv(struct PwmDev *pwm, void *priv) diff --git a/support/platform/test/unittest/common/hdf_pwm_test.cpp b/support/platform/test/unittest/common/hdf_pwm_test.cpp index 3a439a5ea..c7c787dfa 100644 --- a/support/platform/test/unittest/common/hdf_pwm_test.cpp +++ b/support/platform/test/unittest/common/hdf_pwm_test.cpp @@ -6,13 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include -#include -#include -#include #include -#include -#include #include "hdf_uhdf_test.h" using namespace testing::ext; diff --git a/test/unittest/platform/common/pwm_test.c b/test/unittest/platform/common/pwm_test.c index 6c291326a..57ab34a3b 100644 --- a/test/unittest/platform/common/pwm_test.c +++ b/test/unittest/platform/common/pwm_test.c @@ -6,14 +6,17 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "pwm_test.h" #include "device_resource_if.h" #include "hdf_base.h" #include "hdf_log.h" -#include "osal_mem.h" #include "osal_time.h" -#include "pwm_test.h" -#define HDF_LOG_TAG pwm_test_c +#define HDF_LOG_TAG pwm_test +#define SEQ_OUTPUT_DELAY 100 /* Delay time of sequential output, unit: ms */ +#define OUTPUT_WAVES_DELAY 1 /* Delay time of waves output, unit: second */ +#define TEST_WAVES_NUMBER 10 /* The number of waves for test. */ + struct PwmTestFunc { enum PwmTestCmd type; int32_t (*Func)(struct PwmTest *test); @@ -27,7 +30,7 @@ static DevHandle PwmTestGetHandle(struct PwmTest *test) static void PwmTestReleaseHandle(DevHandle handle) { if (handle == NULL) { - HDF_LOGE("%s: pwm handle is null", __func__); + HDF_LOGE("%s: pwm handle is null.", __func__); return; } PwmClose(handle); @@ -37,23 +40,36 @@ static int32_t PwmSetConfigTest(struct PwmTest *test) { int32_t ret; struct PwmConfig cfg = {0}; + uint32_t number; + HDF_LOGI("%s: enter. Test [PwmSetConfig].", __func__); + number = test->cfg.number; + test->cfg.number = (number > 0) ? 0: TEST_WAVES_NUMBER; + HDF_LOGI("%s: Set number %u.", __func__, test->cfg.number); + ret = PwmSetConfig(test->handle, &(test->cfg)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmSetConfig] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } + OsalSleep(OUTPUT_WAVES_DELAY); + test->cfg.number = number; + HDF_LOGI("%s: Set number %u.", __func__, test->cfg.number); ret = PwmSetConfig(test->handle, &(test->cfg)); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmSetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } if (memcmp(&cfg, &(test->cfg), sizeof(cfg)) != 0) { - HDF_LOGE("%s: failed", __func__); + HDF_LOGE("%s: [memcmp] failed.", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -62,12 +78,13 @@ static int32_t PwmGetConfigTest(struct PwmTest *test) int32_t ret; struct PwmConfig cfg = {0}; + HDF_LOGI("%s: enter. Test [PwmGetConfig].", __func__); ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -75,22 +92,25 @@ static int32_t PwmSetPeriodTest(struct PwmTest *test) { int32_t ret; struct PwmConfig cfg = {0}; + uint32_t period; - ret = PwmSetPeriod(test->handle, test->cfg.period); + period = test->cfg.period + test->originCfg.period; + HDF_LOGI("%s: enter. Test [PwmSetPeriod] period %u.", __func__, period); + ret = PwmSetPeriod(test->handle, period); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmSetPeriod] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } - if (cfg.period != test->cfg.period) { - HDF_LOGE("%s: failed", __func__); + if (cfg.period != period) { + HDF_LOGE("%s: failed.", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -98,22 +118,25 @@ static int32_t PwmSetDutyTest(struct PwmTest *test) { int32_t ret; struct PwmConfig cfg = {0}; + uint32_t duty; - ret = PwmSetDuty(test->handle, test->cfg.duty); + duty = test->cfg.duty + test->originCfg.duty; + HDF_LOGI("%s: enter. Test [PwmSetDuty] duty %u.", __func__, duty); + ret = PwmSetDuty(test->handle, duty); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmSetDuty] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } - if (cfg.duty != test->cfg.duty) { - HDF_LOGE("%s: failed", __func__); + if (cfg.duty != duty) { + HDF_LOGE("%s: failed.", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -122,21 +145,31 @@ static int32_t PwmSetPolarityTest(struct PwmTest *test) int32_t ret; struct PwmConfig cfg = {0}; + HDF_LOGI("%s: enter.", __func__); + test->cfg.polarity = PWM_NORMAL_POLARITY; + HDF_LOGI("%s: Test [PwmSetPolarity] polarity %u.", __func__, test->cfg.polarity); ret = PwmSetPolarity(test->handle, test->cfg.polarity); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmSetPolarity] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } + test->cfg.polarity = PWM_INVERTED_POLARITY; + HDF_LOGI("%s: Test [PwmSetPolarity] polarity %u.", __func__, test->cfg.polarity); + ret = PwmSetPolarity(test->handle, test->cfg.polarity); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmSetPolarity] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } if (cfg.polarity != test->cfg.polarity) { - HDF_LOGE("%s: failed", __func__); + HDF_LOGE("%s: failed.", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -145,21 +178,28 @@ static int32_t PwmEnableTest(struct PwmTest *test) int32_t ret; struct PwmConfig cfg = {0}; + HDF_LOGI("%s: enter.", __func__); + ret = PwmDisable(test->handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmDisable] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } + HDF_LOGI("%s: Test [PwmEnable] enable.", __func__); ret = PwmEnable(test->handle); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmEnable] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } - if (cfg.status == 0) { + if (cfg.status == PWM_DISABLE_STATUS) { HDF_LOGE("%s: failed", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -168,21 +208,28 @@ static int32_t PwmDisableTest(struct PwmTest *test) int32_t ret; struct PwmConfig cfg = {0}; + HDF_LOGI("%s: enter.", __func__); + ret = PwmEnable(test->handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmEnable] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } + HDF_LOGI("%s: Test [PwmDisable] disable.", __func__); ret = PwmDisable(test->handle); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmDisable] failed, ret %d.", __func__, ret); return HDF_FAILURE; } ret = PwmGetConfig(test->handle, &cfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: error, ret %d", __func__, ret); + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); return HDF_FAILURE; } - if (cfg.status == 1) { - HDF_LOGE("%s: failed", __func__); + if (cfg.status == PWM_ENABLE_STATUS) { + HDF_LOGE("%s: failed.", __func__); return HDF_FAILURE; } - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return ret; } @@ -212,7 +259,7 @@ static int32_t PwmReliabilityTest(struct PwmTest *test) (void)PwmDisable(test->handle); (void)PwmDisable(test->handle); - HDF_LOGE("============= %s: success =============", __func__); + HDF_LOGI("%s: success.", __func__); return HDF_SUCCESS; } @@ -254,7 +301,7 @@ static int32_t PwmTestAll(struct PwmTest *test) } total++; - HDF_LOGE("============= %s: Pwm Test Total %d Error %d =============", __func__, total, error); + HDF_LOGI("%s: Pwm Test Total %d Error %d.", __func__, total, error); return HDF_SUCCESS; } @@ -278,20 +325,34 @@ static int32_t PwmTestEntry(struct PwmTest *test, int32_t cmd) if (test == NULL) { return HDF_ERR_INVALID_OBJECT; } + OsalMSleep(SEQ_OUTPUT_DELAY); test->handle = PwmTestGetHandle(test); if (test->handle == NULL) { - HDF_LOGE("%s: spi test get handle fail", __func__); + HDF_LOGE("%s: pwm test get handle fail.", __func__); return HDF_FAILURE; } + // At first test case. + if (cmd == PWM_SET_PERIOD_TEST) { + ret = PwmGetConfig(test->handle, &(test->originCfg)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } + } for (i = 0; i < sizeof(g_pwmTestFunc) / sizeof(g_pwmTestFunc[0]); i++) { if (cmd == g_pwmTestFunc[i].type && g_pwmTestFunc[i].Func != NULL) { ret = g_pwmTestFunc[i].Func(test); - HDF_LOGE("%s: cmd %d ret %d", __func__, cmd, ret); + HDF_LOGI("%s: cmd %d ret %d.", __func__, cmd, ret); break; } } - + // At last test case. + if (cmd == PWM_DISABLE_TEST) { + PwmSetConfig(test->handle, &(test->originCfg)); + } PwmTestReleaseHandle(test->handle); + OsalMSleep(SEQ_OUTPUT_DELAY); + return ret; } @@ -302,9 +363,9 @@ static int32_t PwmTestBind(struct HdfDeviceObject *device) if (device != NULL) { device->service = &test.service; } else { - HDF_LOGE("%s: device is NULL", __func__); + HDF_LOGE("%s: device is NULL.", __func__); } - HDF_LOGE("%s: success", __func__); + HDF_LOGE("%s: success.", __func__); return HDF_SUCCESS; } @@ -317,31 +378,31 @@ static int32_t PwmTestInitFromHcs(struct PwmTest *test, const struct DeviceResou face = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); if (face == NULL) { - HDF_LOGE("%s: face is null", __func__); + HDF_LOGE("%s: face is null.", __func__); return HDF_FAILURE; } if (face->GetUint32 == NULL) { - HDF_LOGE("%s: GetUint32 not support", __func__); + HDF_LOGE("%s: GetUint32 not support.", __func__); return HDF_ERR_NOT_SUPPORT; } ret = face->GetUint32(node, "num", &(test->num), 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read num fail", __func__); + HDF_LOGE("%s: read num fail.", __func__); return HDF_FAILURE; } ret = face->GetUint32(node, "period", &(test->cfg.period), 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read period fail", __func__); + HDF_LOGE("%s: read period fail.", __func__); return HDF_FAILURE; } ret = face->GetUint32(node, "duty", &(test->cfg.duty), 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read duty fail", __func__); + HDF_LOGE("%s: read duty fail.", __func__); return HDF_FAILURE; } ret = face->GetUint32(node, "polarity", &tmp, 0); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read polarity fail", __func__); + HDF_LOGE("%s: read polarity fail.", __func__); return HDF_FAILURE; } test->cfg.polarity = tmp; @@ -359,14 +420,14 @@ static int32_t PwmTestInit(struct HdfDeviceObject *device) struct PwmTest *test = NULL; if (device == NULL || device->service == NULL || device->property == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); + HDF_LOGE("%s: invalid parameter.", __func__); return HDF_ERR_INVALID_PARAM; } test = (struct PwmTest *)device->service; if (PwmTestInitFromHcs(test, device->property) != HDF_SUCCESS) { return HDF_FAILURE; } - HDF_LOGE("%s: success", __func__); + HDF_LOGE("%s: success.", __func__); test->TestEntry = PwmTestEntry; return HDF_SUCCESS; } @@ -374,7 +435,7 @@ static int32_t PwmTestInit(struct HdfDeviceObject *device) static void PwmTestRelease(struct HdfDeviceObject *device) { (void)device; - HDF_LOGE("%s: success", __func__); + HDF_LOGE("%s: success.", __func__); } struct HdfDriverEntry g_pwmTestEntry = { @@ -385,4 +446,3 @@ struct HdfDriverEntry g_pwmTestEntry = { .moduleName = "PLATFORM_PWM_TEST", }; HDF_INIT(g_pwmTestEntry); - diff --git a/test/unittest/platform/common/pwm_test.h b/test/unittest/platform/common/pwm_test.h index b82a8b3ed..35cfddddd 100644 --- a/test/unittest/platform/common/pwm_test.h +++ b/test/unittest/platform/common/pwm_test.h @@ -10,7 +10,6 @@ #define PWM_TEST_H #include "hdf_device_desc.h" -#include "hdf_platform.h" #include "pwm_if.h" enum PwmTestCmd { @@ -31,6 +30,7 @@ struct PwmTest { int32_t (*TestEntry)(struct PwmTest *test, int32_t cmd); uint32_t num; struct PwmConfig cfg; + struct PwmConfig originCfg; DevHandle handle; }; diff --git a/test/unittest/platform/hdf_pwm_entry_test.c b/test/unittest/platform/hdf_pwm_entry_test.c index bb274ea24..8bb761a7c 100644 --- a/test/unittest/platform/hdf_pwm_entry_test.c +++ b/test/unittest/platform/hdf_pwm_entry_test.c @@ -8,7 +8,6 @@ #include "hdf_pwm_entry_test.h" #include "hdf_log.h" -#include "pwm_if.h" #include "pwm_test.h" #define HDF_LOG_TAG hdf_pwm_entry_test @@ -18,13 +17,16 @@ int32_t HdfPwmUnitTestEntry(HdfTestMsg *msg) struct PwmTest *test = NULL; if (msg == NULL) { + HDF_LOGE("%s: msg is NULL!", __func__); return HDF_FAILURE; } test = GetPwmTest(); if (test == NULL || test->TestEntry == NULL) { + HDF_LOGE("%s: test or TestEntry is NULL!", __func__); msg->result = HDF_FAILURE; return HDF_FAILURE; } + HDF_LOGI("%s: call [TestEntry]", __func__); msg->result = test->TestEntry(test, msg->subCmd); return msg->result; } -- Gitee From 9ce4a52ba59f9147a287b8bdf2e0dcdb7a257f63 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Sat, 30 Oct 2021 07:15:16 +0000 Subject: [PATCH 120/272] =?UTF-8?q?Description:=20wifi=E6=A1=86=E6=9E=B6?= =?UTF-8?q?=E9=80=82=E9=85=8D5G=E7=89=B9=E6=80=A7=20Feature=20or=20Bugfix:?= =?UTF-8?q?Feature=20Binary=20Source:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- model/network/wifi/core/components/softap/ap.c | 2 +- model/network/wifi/include/hdf_wifi_cmd.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/model/network/wifi/core/components/softap/ap.c b/model/network/wifi/core/components/softap/ap.c index 11bf08a0a..8b15e8e0f 100644 --- a/model/network/wifi/core/components/softap/ap.c +++ b/model/network/wifi/core/components/softap/ap.c @@ -56,7 +56,6 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) HDF_LOGE("%s:bad net device found!", __func__); return HDF_FAILURE; } - apConf.band = IEEE80211_BAND_2GHZ; err = memcpy_s(apConf.ssidConf.ssid, IEEE80211_MAX_SSID_LEN, apSettings->ssid, apSettings->ssidLen); if (err != EOK) { HDF_LOGE("%s: memcpy_s failed!ret=%d", __func__, err); @@ -66,6 +65,7 @@ static int32_t StartAp(struct NetDevice *netDev, WifiApSetting *apSettings) apConf.centerFreq1 = apSettings->freqParams.centerFreq1; apConf.channel = apSettings->freqParams.channel; apConf.width = apSettings->freqParams.bandwidth; + apConf.band = apSettings->freqParams.band; RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->apOps, ConfigAp); ret = chipDriver->apOps->ConfigAp(netDev, &apConf); if (ret != HDF_SUCCESS) { diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 43a392ead..5a89f2fec 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -254,6 +254,7 @@ typedef struct { int32_t centerFreq1; int32_t centerFreq2; int32_t bandwidth; + uint8_t band; } WifiFreqParams; typedef struct { -- Gitee From 4ece669cdd20541be17fbd1614cd946e706f874e Mon Sep 17 00:00:00 2001 From: jifengfei Date: Mon, 1 Nov 2021 15:47:57 +0800 Subject: [PATCH 121/272] modify hall code Signed-off-by: jifengfei --- .../sensor/driver/chipset/hall/hall_ak8789.c | 33 +---- model/sensor/driver/hall/sensor_hall_driver.c | 136 +++++++++++------- model/sensor/driver/hall/sensor_hall_driver.h | 8 +- 3 files changed, 86 insertions(+), 91 deletions(-) diff --git a/model/sensor/driver/chipset/hall/hall_ak8789.c b/model/sensor/driver/chipset/hall/hall_ak8789.c index adbd7838b..8d96ccd87 100755 --- a/model/sensor/driver/chipset/hall/hall_ak8789.c +++ b/model/sensor/driver/chipset/hall/hall_ak8789.c @@ -29,37 +29,6 @@ struct Ak8789DrvData *Ak8789GetDrvData(void) #define SENSOR_HALL_CLK_REG_ADDR 0x114f0044 #define SENSOR_HALL_REG_CFG 0x400 -int32_t ReadAk8789Data(struct SensorCfgData *data) -{ - int32_t ret; - uint8_t tmp = 1; - OsalTimespec time; - struct SensorReportEvent event; - - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - - (void)memset_s(&event, sizeof(event), 0, sizeof(event)); - (void)memset_s(&time, sizeof(time), 0, sizeof(time)); - if (OsalGetTime(&time) != HDF_SUCCESS) { - HDF_LOGE("%s: Get time failed", __func__); - return HDF_FAILURE; - } - - event.timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * - SENSOR_CONVERT_UNIT; /* unit nanosecond */ - event.sensorId = SENSOR_TAG_HALL; - event.version = 0; - event.option = 0; - event.mode = SENSOR_WORK_MODE_ON_CHANGE; - event.dataLen = sizeof(tmp); - event.data = (uint8_t *)&tmp; - ret = ReportSensorEvent(&event); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AK8789 report data failed", __func__); - } - return ret; -} - static int32_t InitHallPreConfig(void) { if (SetSensorPinMux(SENSOR_HALL_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_HALL_REG_CFG) != HDF_SUCCESS) { @@ -122,7 +91,7 @@ int32_t AK8789InitDriver(struct HdfDeviceObject *device) } ops.Init = NULL; - ops.ReadData = ReadAk8789Data; + ops.ReadData = NULL; ret = HallRegisterChipOps(&ops); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Register AK8789 hall failed", __func__); diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 6c25692ef..84ad79b2f 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -14,6 +14,7 @@ #include "hdf_device_desc.h" #include "osal_irq.h" #include "osal_mem.h" +#include "osal_time.h" #include "sensor_config_controller.h" #include "sensor_device_manager.h" #include "sensor_platform_if.h" @@ -40,6 +41,40 @@ int32_t HallRegisterChipOps(const struct HallOpsCall *ops) return HDF_SUCCESS; } +void ReadGpioData(struct SensorCfgData *data) +{ + int32_t ret; + uint16_t tmp; + OsalTimespec time; + struct SensorReportEvent event; + + struct HallDrvData *drvData = HallGetDrvData(); + CHECK_NULL_PTR_RETURN(drvData); + + CHECK_NULL_PTR_RETURN(data); + + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + (void)memset_s(&time, sizeof(time), 0, sizeof(time)); + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return; + } + + tmp = drvData->status; + event.timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * + SENSOR_CONVERT_UNIT; /* unit nanosecond */ + event.sensorId = SENSOR_TAG_HALL; + event.version = 0; + event.option = 0; + event.mode = SENSOR_WORK_MODE_ON_CHANGE; + event.dataLen = sizeof(tmp); + event.data = (uint8_t *)&tmp; + ret = ReportSensorEvent(&event); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AK8789 report data failed", __func__); + } +} + static void HallDataWorkEntry(void *arg) { struct HallDrvData *drvData = NULL; @@ -48,10 +83,9 @@ static void HallDataWorkEntry(void *arg) CHECK_NULL_PTR_RETURN(drvData); if (drvData->ops.ReadData == NULL) { + ReadGpioData(drvData->hallCfg); HDF_LOGI("%s: Hall ReadData function NULL", __func__); - return; - } - if (drvData->ops.ReadData(drvData->hallCfg) != HDF_SUCCESS) { + } else if (drvData->ops.ReadData(drvData->hallCfg) != HDF_SUCCESS) { HDF_LOGE("%s: Hall read data failed", __func__); } } @@ -59,12 +93,24 @@ static void HallDataWorkEntry(void *arg) static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) { (void)gpio; + int32_t ret; + uint16_t valRead; struct HallDrvData *drvData = (struct HallDrvData *)data; CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + ret = GpioRead(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1], (uint16_t *)&valRead); + if(ret != 0) { + HDF_LOGE("%s: Read hall gpio value failed", __func__); + } + if (valRead == GPIO_VAL_LOW) { + drvData->status = 0; + } else if(valRead == GPIO_VAL_HIGH) { + drvData->status = 1; + } + if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { - HDF_LOGE("%s: Hall add work queue failed", __func__); + HDF_LOGE("%s: Hall north add work queue failed", __func__); } return HDF_SUCCESS; @@ -73,12 +119,24 @@ static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) { (void)gpio; + int32_t ret; + uint16_t valRead; struct HallDrvData *drvData = (struct HallDrvData *)data; CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + ret = GpioRead(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2], (uint16_t *)&valRead); + if(ret != 0) { + HDF_LOGE("%s: Read hall gpio value failed", __func__); + } + if (valRead == GPIO_VAL_LOW) { + drvData->status = 0; + } else if(valRead == GPIO_VAL_HIGH) { + drvData->status = 1; + } + if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { - HDF_LOGE("%s: Hall add work queue failed", __func__); + HDF_LOGE("%s: Hall south add work queue failed", __func__); } return HDF_SUCCESS; @@ -106,6 +164,7 @@ static int32_t InitHallData(struct HallDrvData *drvData) static int32_t SetHallEnable(void) { int32_t ret; + uint16_t mode; struct HallDrvData *drvData = HallGetDrvData(); CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); @@ -114,25 +173,27 @@ static int32_t SetHallEnable(void) return HDF_SUCCESS; } - if (drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO] >= 0) { - ret = GpioSetIrq(drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO], OSAL_IRQF_TRIGGER_FALLING, + mode = OSAL_IRQF_TRIGGER_RISING | OSAL_IRQF_TRIGGER_FALLING; + HDF_LOGE("%s: mode:%0x\n", __func__, mode); + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1] >= 0) { + ret = GpioSetIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1], mode, HallNorthPolarityIrqFunc, drvData); if (ret != 0) { HDF_LOGE("Gpio set north irq failed: %d", ret); } - ret = GpioEnableIrq(drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO]); + ret = GpioEnableIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1]); if (ret != 0) { HDF_LOGE("Gpio enable north irq failed: %d", ret); } } - if (drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO] >= 0) { - ret = GpioSetIrq(drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO], OSAL_IRQF_TRIGGER_FALLING, + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2] >= 0) { + ret = GpioSetIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2], mode, HallSouthPolarityIrqFunc, drvData); if (ret != 0) { HDF_LOGE("%s: Gpio set south irq failed", __func__); } - ret = GpioEnableIrq(drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO]); + ret = GpioEnableIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2]); if (ret != 0) { HDF_LOGE("%s: Gpio enable south irq failed", __func__); } @@ -153,25 +214,25 @@ static int32_t SetHallDisable(void) return HDF_SUCCESS; } - if (drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO] >= 0) { - ret = GpioUnSetIrq(drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO]); + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1] >= 0) { + ret = GpioUnSetIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1]); if (ret != 0) { HDF_LOGE("%s: Gpio unset north irq failed", __func__); } - ret = GpioDisableIrq(drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO]); + ret = GpioDisableIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1]); if (ret != 0) { HDF_LOGE("%s: Gpio disable north irq failed", __func__); } } - if (drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO] >= 0) { - ret = GpioUnSetIrq(drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO]); + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2] >= 0) { + ret = GpioUnSetIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2]); if (ret != 0) { HDF_LOGE("%s: Gpio unset south irq failed", __func__); } - ret = GpioDisableIrq(drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO]); + ret = GpioDisableIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2]); if (ret != 0) { HDF_LOGE("%s: Gpio disable south irq failed", __func__); } @@ -244,30 +305,6 @@ static int32_t InitHallOps(struct SensorCfgData *config, struct SensorDeviceInfo return HDF_SUCCESS; } -static int32_t ParserHallPinConfigData(const struct DeviceResourceNode *node, struct HallDrvData *drvData) -{ - int32_t ret; - struct DeviceResourceIface *parser = NULL; - - CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); - - CHECK_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); - - const struct DeviceResourceNode *pinNode = parser->GetChildNode(node, "hallPinConfig"); - CHECK_NULL_PTR_RETURN_VALUE(pinNode, HDF_ERR_INVALID_PARAM); - - ret = parser->GetUint32(pinNode, "NorthPolarityGpio", (uint32_t *)&drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO], 0); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "NorthPolarityGpio"); - ret = parser->GetUint32(pinNode, "SouthPolarityGpio", (uint32_t *)&drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO], 0); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "SouthPolarityGpio"); - - return HDF_SUCCESS; -} - static int32_t InitHallAfterDetected(const struct DeviceResourceNode *node, struct HallDrvData *drvData) { struct SensorDeviceInfo deviceInfo; @@ -284,28 +321,23 @@ static int32_t InitHallAfterDetected(const struct DeviceResourceNode *node, stru return HDF_FAILURE; } - if (ParserHallPinConfigData(node, drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: get hall pin config failed", __func__); - (void)DeleteSensorDevice(&drvData->hallCfg->sensorInfo); - return HDF_FAILURE; - } return HDF_SUCCESS; } static int32_t SetHallGpioPin(struct HallDrvData *drvData) { - if (drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO] >= 0) { - int ret = GpioSetDir(drvData->GpioIrq[HALL_NORTH_POLARITY_GPIO], GPIO_DIR_IN); + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1] >= 0) { + int ret = GpioSetDir(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1], GPIO_DIR_IN); if (ret != 0) { - HDF_LOGE("%s:%d set north gpio dir failed", __func__, __LINE__); + HDF_LOGE("%s:%d Set north gpio dir failed", __func__, __LINE__); return HDF_FAILURE; } } - if (drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO] >= 0) { - int ret = GpioSetDir(drvData->GpioIrq[HALL_SOUTH_POLARITY_GPIO], GPIO_DIR_IN); + if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2] >= 0) { + int ret = GpioSetDir(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2], GPIO_DIR_IN); if (ret != 0) { - HDF_LOGE("%s:%d south south gpio dir failed", __func__, __LINE__); + HDF_LOGE("%s:%d Set south gpio dir failed", __func__, __LINE__); return HDF_FAILURE; } } diff --git a/model/sensor/driver/hall/sensor_hall_driver.h b/model/sensor/driver/hall/sensor_hall_driver.h index 649059775..29071bb2b 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.h +++ b/model/sensor/driver/hall/sensor_hall_driver.h @@ -15,12 +15,6 @@ #define HALL_CHIP_NAME_AK8789 "ak8789" -enum HallGpioIrq { - HALL_NORTH_POLARITY_GPIO = 0, - HALL_SOUTH_POLARITY_GPIO = 1, - HALL_POLARITY_GPIO_MAX = 2, -}; - struct HallOpsCall { int32_t (*Init)(struct SensorCfgData *data); int32_t (*ReadData)(struct SensorCfgData *data); @@ -36,7 +30,7 @@ struct HallDrvData { int64_t interval; struct SensorCfgData *hallCfg; struct HallOpsCall ops; - int32_t GpioIrq[HALL_POLARITY_GPIO_MAX]; + uint16_t status; }; int32_t HallRegisterChipOps(const struct HallOpsCall *ops); -- Gitee From b3104196baa23df2016674c92161f1559306b873 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Mon, 1 Nov 2021 16:02:50 +0800 Subject: [PATCH 122/272] modify hall code Signed-off-by: jifengfei --- model/sensor/driver/common/src/sensor_config_parser.c | 5 +++++ model/sensor/driver/include/sensor_platform_if.h | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index b4984976c..9f0f3d4dd 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -358,6 +358,11 @@ static int32_t ParseSensorBus(struct DeviceResourceIface *parser, const struct D CHECK_PARSER_RESULT_RETURN_VALUE(ret, "busNum"); ret = parser->GetUint32(busNode, "busAddr", &config->busCfg.spiCfg.csNum, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "busAddr"); + } else if (config->busCfg.busType == SENSOR_BUS_GPIO) { + ret = parser->GetUint32(busNode, "gpioIrq1", &config->busCfg.GpioNum[SENSOR_GPIO_NUM1], 0); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq1"); + ret = parser->GetUint32(busNode, "gpioIrq2", &config->busCfg.GpioNum[SENSOR_GPIO_NUM2], 0); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq2"); } return HDF_SUCCESS; diff --git a/model/sensor/driver/include/sensor_platform_if.h b/model/sensor/driver/include/sensor_platform_if.h index 6bf64210f..6f1489383 100644 --- a/model/sensor/driver/include/sensor_platform_if.h +++ b/model/sensor/driver/include/sensor_platform_if.h @@ -52,6 +52,13 @@ enum SensorBusType { SENSOR_BUS_I2C = 0, SENSOR_BUS_SPI = 1, + SENSOR_BUS_GPIO = 2, +}; + +enum SensorGpioNum { + SENSOR_GPIO_NUM1 = 0, + SENSOR_GPIO_NUM2 = 1, + SENSOR_GPIO_NUM_MAX = 2, }; struct SensorI2cCfg { @@ -73,6 +80,7 @@ struct SensorBusCfg { union { struct SensorI2cCfg i2cCfg; struct SensorSpiCfg spiCfg; + uint32_t GpioNum[SENSOR_GPIO_NUM_MAX]; }; }; -- Gitee From 570ba82f693175db54468c1cbbd6d3f50c094e0c Mon Sep 17 00:00:00 2001 From: yafeng_wang Date: Sun, 31 Oct 2021 23:12:00 +0800 Subject: [PATCH 123/272] Add i3c test cases and update i3c framework source codes Signed-off-by: yafeng_wang --- include/platform/i3c_ccc.h | 89 +++ include/platform/i3c_if.h | 142 ++++- support/platform/include/i3c_core.h | 297 +++++++++- support/platform/src/i3c_core.c | 276 +++++---- support/platform/src/i3c_if.c | 8 +- .../test/unittest/common/hdf_i3c_test.cpp | 136 +++++ test/unittest/common/hdf_main_test.c | 6 + .../platform/common/i3c_driver_test.c | 126 +++++ test/unittest/platform/common/i3c_test.c | 528 ++++++++++++++++++ test/unittest/platform/common/i3c_test.h | 58 ++ test/unittest/platform/hdf_i3c_entry_test.c | 26 + test/unittest/platform/hdf_i3c_entry_test.h | 16 + test/unittest/platform/virtual/i3c_virtual.c | 447 +++++++++++++++ 13 files changed, 1968 insertions(+), 187 deletions(-) create mode 100644 include/platform/i3c_ccc.h create mode 100644 support/platform/test/unittest/common/hdf_i3c_test.cpp create mode 100644 test/unittest/platform/common/i3c_driver_test.c create mode 100644 test/unittest/platform/common/i3c_test.c create mode 100644 test/unittest/platform/common/i3c_test.h create mode 100644 test/unittest/platform/hdf_i3c_entry_test.c create mode 100644 test/unittest/platform/hdf_i3c_entry_test.h create mode 100644 test/unittest/platform/virtual/i3c_virtual.c diff --git a/include/platform/i3c_ccc.h b/include/platform/i3c_ccc.h new file mode 100644 index 000000000..272efa902 --- /dev/null +++ b/include/platform/i3c_ccc.h @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef I3C_CCC_H +#define I3C_CCC_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** CCC(Common Command Code) structure */ +struct I3cCccCmd; + +/** Broatcast commands */ +#define I3C_CCC_ENEC_B 0x00 +#define I3C_CCC_DISEC_B 0x01 +#define I3C_CCC_ENTAS0_B 0x02 +#define I3C_CCC_ENTAS1_B 0x03 +#define I3C_CCC_ENTAS2_B 0x04 +#define I3C_CCC_ENTAS3_B 0x05 +#define I3C_CCC_RSTDAA_B 0x06 +#define I3C_CCC_ENTDAA 0x07 +#define I3C_CCC_DEFSLVS 0x08 +#define I3C_CCC_SETMWL_B 0x09 +#define I3C_CCC_SETMRL_B 0x0a +#define I3C_CCC_ENTTM 0x0b +#define I3C_CCC_ENDXFER 0X12 +#define I3C_CCC_ENTHDR0 0x20 +#define I3C_CCC_ENTHDR1 0x21 +#define I3C_CCC_ENTHDR2 0x22 +#define I3C_CCC_ENTHDR3 0x23 +#define I3C_CCC_ENTHDR4 0x24 +#define I3C_CCC_ENTHDR5 0x25 +#define I3C_CCC_ENTHDR6 0x26 +#define I3C_CCC_ENTHDR7 0x27 +#define I3C_CCC_SETXTIME_B 0x28 +#define I3C_CCC_SETAASA 0X29 +#define I3C_CCC_VENDOR_B 0x61 +/** Driect commands */ +#define I3C_CCC_ENEC_D 0x80 +#define I3C_CCC_DISEC_D 0x81 +#define I3C_CCC_ENTAS0_D 0x82 +#define I3C_CCC_ENTAS1_D 0x83 +#define I3C_CCC_ENTAS2_D 0x84 +#define I3C_CCC_ENTAS3_D 0x85 +#define I3C_CCC_RSTDAA_D 0x86 +#define I3C_CCC_SETDASA 0x87 +#define I3C_CCC_SETNEWDA 0x88 +#define I3C_CCC_SETMWL_D 0x89 +#define I3C_CCC_SETMRL_D 0x8a +#define I3C_CCC_GETMWL 0x8b +#define I3C_CCC_GETMRL 0x8c +#define I3C_CCC_GETPID 0x8d +#define I3C_CCC_GETBCR 0x8e +#define I3C_CCC_GETDCR 0x8f +#define I3C_CCC_GETSTATUS 0x90 +#define I3C_CCC_GETACCMST 0x91 +#define I3C_CCC_SETBRGTGT 0x93 +#define I3C_CCC_GETMXDS 0x94 +#define I3C_CCC_GETHDRCAP 0x95 +#define I3C_CCC_SETXTIME_D 0x98 +#define I3C_CCC_GETXTIME 0x99 +#define I3C_CCC_VENDOR_D 0xe0 + +struct I3cCccCmd { + /** CCC(Common Command Code) */ + uint8_t cmd; + /** The destination address of the command, valid only if sending a direct CCC. */ + uint16_t dest; + /** When sending a read command, dataLength represents the length of the read data */ + uint32_t dataLength; + /** When sending a read command, buf is address of the buffer for storing transferred data */ + uint8_t *buf; +}; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* I3C_CORE_H */ diff --git a/include/platform/i3c_if.h b/include/platform/i3c_if.h index 595576b25..4dce31073 100644 --- a/include/platform/i3c_if.h +++ b/include/platform/i3c_if.h @@ -30,7 +30,6 @@ #define I3C_IF_H #include "hdf_platform.h" -#include "i3c_core.h" #include "i3c_ccc.h" #ifdef __cplusplus @@ -40,23 +39,84 @@ extern "C" { #endif /* __cplusplus */ enum TransMode { + /** I2C transfer mode */ I2C_MODE = 0, + /** I3C transfer mode */ I3C_MODE, - HDR_MODE, + /** CCC(Common Command Code) mode */ CCC_CMD_MODE, }; +enum I3cBusMode { + /** Single Data Rate mode */ + I3C_BUS_SDR_MODE = 0, + /** High Data Rate mode */ + I3C_BUS_HDR_MODE, +}; + +/** + * @brief Defines the configurations of I3C controller. + * + * @since 1.0 + */ +struct I3cConfig { + /** I3C bus mode */ + enum I3cBusMode busMode; + /** Current master object, its NULL when the controller is the master */ + struct I3cDevice *curMaster; +}; + +/** + * @brief Defines the I3C transfer message used during I3C transfer, I2C transfer or sending CCC(Common Command Code). + * + * @attention This structure does not limit the data transfer length specified by len. + * The specific I3C controller determines the maximum length allowed. \n + * The device address addr indicates the original device address and does not need to + * contain the read/write flag bit. + * + * @since 1.0 + */ struct I3cMsg { - struct CccCmd *cmd; + /** Address of the target device */ uint16_t addr; + /** Address of the buffer for storing transferred data */ uint8_t *buf; + /** Length of the transferred data */ uint16_t len; + /** + * Transfer Mode Flag | Description + * ------------| ----------------------- + * I2C_FLAG_READ | Read flag + * I2C_FLAG_READ_NO_ACK | No-ACK read flag + * I2C_FLAG_IGNORE_NO_ACK | Ignoring no-ACK flag + * I2C_FLAG_NO_START | No START condition flag + * I2C_FLAG_STOP | STOP condition flag + */ uint16_t flags; + /** Transfer mode select, using I2C_MODE defalut */ enum TransMode mode; - struct I3cCccCmd ccc; + /** CCC(Common Command Code) structure, which is used in CCC_CMD_MODE transfer mode */ + struct I3cCccCmd *ccc; + /** I3C error code, update by driver */ uint16_t err; }; +/** + * @brief Defines the data of I3C IBI(In-Band Interrupt). + * + * @attention The data of IBI can be obtained by payload and buf in the IBI function when generate an IBI. + * + * @since 1.0 + */ +struct I3cIbiData { + /** payload data length. Indicates the length of IBI payload data. It is automatically generated when an + * IBI is generated, do not modify while reading. + */ + uint32_t payload; + /** data buffer. The pointer of payload data. */ + uint8_t *buf; +}; + enum I3cFlag { /** Read flag. The value 1 indicates the read operation, and 0 indicates the write operation. */ I3C_FLAG_READ = (0x1 << 0), @@ -73,7 +133,19 @@ enum I3cFlag { I3C_FLAG_STOP = (0x1 << 15), }; -typedef int32_t (*I3cIbiFunc)(uint16_t addr, void *data); +/** + * @brief IBI(In-Band Interrupt) callback function. + * + * Use {@link I3cRequestIbi} to attach it to an I3C device. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. + * @param addr Indicates the address of device to requeset IBI(In-Band Interrupt). + * @param data Indicates the data structure of IBI. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * @since 1.0 + */ +typedef int32_t (*I3cIbiFunc)(DevHandle handle, uint16_t addr, struct I3cIbiData data); /** * @brief Obtains the handle of an I3C controller. @@ -84,6 +156,7 @@ typedef int32_t (*I3cIbiFunc)(uint16_t addr, void *data); * * @return Returns the pointer to the {@link DevHandle} of the I3C controller if the operation is successful; * returns NULL otherwise. + * * @since 1.0 */ DevHandle I3cOpen(int16_t number); @@ -94,7 +167,7 @@ DevHandle I3cOpen(int16_t number); * If you no longer need to access the I3C controller, you should call this function to close its handle so as * to release unused memory resources. * - * @param handle Indicates the pointer to the device handle of the I3C controller. + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. * * @since 1.0 */ @@ -102,11 +175,12 @@ void I3cClose(DevHandle handle); /** * @brief Launches an transfer to an I3C device or a compatible I2C device, - * or send a CCC (common command code) to an I3C device which is supported. + * or send a CCC (Common Command Code) to an I3C device which is supported. * - * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. - * @param msgs Indicates the pointer to the I3C transfer message structure array. + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. + * @param msg Indicates the pointer to the I3C transfer message structure array. * @param count Indicates the length of the message structure array. + * @param mode Indicates the transmission mode. * * @return Returns the number of transferred message structures if the operation is successful; * returns a negative value otherwise. @@ -117,45 +191,57 @@ void I3cClose(DevHandle handle); * @since 1.0 */ int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msg, int16_t count, enum TransMode mode); + /** - * @brief Launches an transfer to an I3C device or a compatible I2C device, - * or send a CCC (common command code) to an I3C device which is supported. - * - * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. - * - * @return Returns 0 if the operation is successful; Returns a negative value otherwise. - * - * @since 1.0 - */ -int32_t I3cDaa(DevHandle handle); - /** - * @brief Launches an transfer to an I3C device or a compatible I2C device, - * or send a CCC (Common Command Code) to an I3C device which is supported. + * @brief Requeset an IBI(in-bind interrupt) for an I3C device which is supported. * - * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. * @param addr Indicates the address of device to requeset IBI(In-Band Interrupt). * @param func Indicates the call back function of the IBI. * @param payload Indicates the length of payload data, in bytes. * - * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. * * @since 1.0 */ int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload); /** - * @brief Launches an transfer to an I3C device or a compatible I2C device, - * or send a CCC (Common Command Code) to an I3C device which is supported. + * @brief Free the IBI(in-bind interrupt) which is Requeseted by {@link I3cRequestIbi}. * - * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I2cOpen}. + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. * @param addr Indicates the address of device to free IBI. * - * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. * * @since 1.0 */ int32_t I3cFreeIbi(DevHandle handle, uint16_t addr); + /** + * @brief Set the config of a I3C controller. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. + * @param config Indicates the pointer of a configuration structure to set. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config); + + /** + * @brief Get the config of a I3C controller. + * + * @param handle Indicates the pointer to the device handle of the I3C controller obtained via {@link I3cOpen}. + * @param config Indicates the structure used to store the configuration. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config); + #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/include/i3c_core.h b/support/platform/include/i3c_core.h index 7b7c88677..dd356321a 100755 --- a/support/platform/include/i3c_core.h +++ b/support/platform/include/i3c_core.h @@ -21,7 +21,7 @@ extern "C" { #endif #endif /* __cplusplus */ -#define I3C_BUS_MAX 16 +#define I3C_CNTLR_MAX 20 #define I3C_ADDR_MAX 127 #define I3C_IBI_MAX 10 #define ADDRS_STATUS_BITS 2 @@ -32,27 +32,49 @@ extern "C" { #define ADDR_STATUS_BIT1_MASK 0x2 #define ADDR_STATUS_MASK 0x3 + +#define I3C_RESERVED_ADDR_7H00 0x00 +#define I3C_RESERVED_ADDR_7H01 0x01 +#define I3C_RESERVED_ADDR_7H02 0x02 +#define I3C_RESERVED_ADDR_7H3E 0x3e +#define I3C_RESERVED_ADDR_7H5E 0x5e +#define I3C_RESERVED_ADDR_7H6E 0x6e +#define I3C_RESERVED_ADDR_7H76 0x76 +#define I3C_RESERVED_ADDR_7H78 0x78 +#define I3C_RESERVED_ADDR_7H79 0x79 +#define I3C_RESERVED_ADDR_7H7A 0x7a +#define I3C_RESERVED_ADDR_7H7B 0x7b +#define I3C_RESERVED_ADDR_7H7C 0x7c +#define I3C_RESERVED_ADDR_7H7D 0x7d +#define I3C_RESERVED_ADDR_7H7E 0x7e +#define I3C_RESERVED_ADDR_7H7F 0x7f + +#define I3C_HOT_JOIN_ADDR I3C_RESERVED_ADDR_7H02 +#define I3C_BROADCAST_ADDR I3C_RESERVED_ADDR_7H7E + +#define CHECK_RESERVED_ADDR(addr) \ + ({((addr == I3C_RESERVED_ADDR_7H00) || (addr == I3C_RESERVED_ADDR_7H01) || \ + (addr == I3C_RESERVED_ADDR_7H02) || (addr == I3C_RESERVED_ADDR_7H3E) || \ + (addr == I3C_RESERVED_ADDR_7H5E) || (addr == I3C_RESERVED_ADDR_7H6E) || \ + (addr == I3C_RESERVED_ADDR_7H76) || (addr == I3C_RESERVED_ADDR_7H78) || \ + (addr == I3C_RESERVED_ADDR_7H79) || (addr == I3C_RESERVED_ADDR_7H7A) || \ + (addr == I3C_RESERVED_ADDR_7H7B) || (addr == I3C_RESERVED_ADDR_7H7C) || \ + (addr == I3C_RESERVED_ADDR_7H7D) || (addr == I3C_RESERVED_ADDR_7H7D) || \ + (addr == I3C_RESERVED_ADDR_7H7F)) ? I3C_ADDR_RESERVED : I3C_ADDR_FREE;}) \ + struct I3cCntlr; struct I3cMethod; struct I3cLockMethod; struct I3cDevice; struct I3cVendor; -struct I3cConfig; - -enum I3cBusMode { - I3C_BUS_SDR_MODE = 0, - I3C_BUS_HDR_MODE, -}; enum I3cDeviceType { + /** I2C device */ I3C_CNTLR_I2C_DEVICE = 0, - I3C_CNTLR_I3C_CONV_DEVICE, - I3C_CNTLR_I3C_SM_DEVICE, // secondary master I3C device -}; - -struct I3cConfig { - enum I3cBusMode busMode; - struct I3cDevice *curMaster; + /** legacy I2C device */ + I3C_CNTLR_I2C_LEGACY_DEVICE, + /** I3C device */ + I3C_CNTLR_I3C_DEVICE, }; struct I3cCntlr { @@ -67,16 +89,18 @@ struct I3cCntlr { void *priv; }; +/* vendor information of I3C device */ struct I3cVendor { - uint32_t vendor_mipi_id; - uint32_t vendor_version_id; - uint32_t vendor_product_id; + uint32_t vendorMipiId; + uint32_t vendorVersionId; + uint32_t vendorProductId; }; +/* In-bind Interrupt infomation */ struct I3cIbiInfo { - I3cIbiFunc irqFunc; - int32_t payload; - void *irqData; + I3cIbiFunc ibiFunc; + uint32_t payload; + uint8_t *data; }; struct I3cDevice { @@ -95,16 +119,85 @@ struct I3cDevice { }; struct I3cMethod { - int32_t (*doDaa)(struct I3cCntlr cntlr); - - int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd ccc); + /** + * @brief Send a CCC(Common Command Code), which is implemented by a specific vendor driver. + * + * @param cntlr Indicates the I3C controller device. + * @param ccc Indicates the {@link I3cCccCmd}(Common Command Code) structure. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ + int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc); + /** + * @brief Execute one or more I3C messages in I3C mode, which is implemented by a specific vendor driver. + * + * @param cntlr Indicates the I3C controller device. + * @param msgs Indicates the {@link I3cMsg} message array. + * @param count Indicates the length of the message array. + * + * @return Returns the number of transferred message structures on success; Returns a negative value otherwise. + * + * @see I3cMsg + * @since 1.0 + */ int32_t (*Transfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); + /** + * @brief Execute one or more I3C messages in I2C mode, which is implemented by a specific vendor driver. + * + * @param cntlr Indicates the I3C controller device. + * @param msgs Indicates the {@link I3cMsg} message array. + * @param count Indicates the length of the message array. + * + * @return Returns the number of transferred message structures on success; Returns a negative value otherwise. + * + * @see I3cMsg + * @since 1.0 + */ int32_t (*i2cTransfer)(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); - int32_t (*requestIbi)(struct I3cDevice *dev, I3cIbiFunc func, uint32_t payload); + /** + * @brief Set configurations of an I3C controller. + * + * @param cntlr Indicates the I3C controller to set. + * @param config Indicates the pointer of configuration structure. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ + int32_t (*setConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config); + /** + * @brief Get configurations of an I3C controller. + * + * @param cntlr Indicates the I3C controller to get configurations. + * @param config Indicates the pointer of configuration structure. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ + int32_t (*getConfig)(struct I3cCntlr *cntlr, struct I3cConfig *config); + + /** + * @brief Requeset an IBI(in-bind interrupt) for an I3C device which is supported. + * + * @param device Indicates the I3C device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ + int32_t (*requestIbi)(struct I3cDevice *dev); + + /** + * @brief Free an IBI(in-bind interrupt). + * + * @param device Indicates the I3C device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ void (*freeIbi)(struct I3cDevice *dev); }; @@ -114,7 +207,7 @@ struct I3cLockMethod { * * @param cntlr Indicates the I3C controller to access. * - * @return Returns 0 on success; returns a negative value otherwise. + * @return Returns 0 on success; Returns a negative value otherwise. * @since 1.0 */ int32_t (*lock)(struct I3cCntlr *cntlr); @@ -149,38 +242,180 @@ enum I3cAddrStatus { I3C_ADDR_I3C_DEVICE, }; -int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config); +enum I3cDeviceSupportIbi { + I3C_DEVICE_NOT_SUPPORT_IBI = 0, + I3C_DEVICE_SUPPORT_IBI, +}; +/** + * @brief Set the config of a I3C controller. + * + * @param cntlr Indicates the I3C controller device. + * @param config Indicates the pointer of the configuration structure. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config); +/** + * @brief Get the config of a I3C controller. + * + * @param cntlr Indicates the I3C controller device. + * @param config Indicates the pointer of the configuration structure. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config); + +/** + * @brief Requeset an IBI(in-bind interrupt) for an I3C device which is supported. + * + * @param cntlr Indicates the I3C controller device. + * @param addr Indicates the address of device to requeset IBI(In-Band Interrupt). + * @param func Indicates the call back function of the IBI. + * @param payload Indicates the length of payload data, in bytes. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc func, uint32_t payload); +/** + * @brief Free the IBI(in-bind interrupt) which is Requeseted by {@link I3cCntlrRequestIbi}. + * + * @param cntlr Indicates the I3C controller device. + * @param addr Indicates the address of device to requeset IBI(In-Band Interrupt). + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ int32_t I3cCntlrFreeIbi(struct I3cCntlr *cntlr, uint16_t addr); -int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd ccc); +/** + * @brief Send a CCC (Common Command Code) to an I3C device which is supported. + * + * @param cntlr Indicates the I3C controller device. + * @param ccc The pointer of CCC (Common Command Code) structure to send. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc); +/** + * @brief Execute one or more I3C messages in I2C mode. + * + * @param cntlr Indicates the I3C controller device. + * @param msgs Indicates the {@link I3cMsg} message array. + * @param count Indicates the length of the message array. + * + * @return Returns the number of transferred message structures on success; Returns a negative value otherwise. + * + * @see I3cMsg + * @since 1.0 + */ int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); +/** + * @brief Execute one or more I3C messages in I3C mode. + * + * @param cntlr Indicates the I3C controller device. + * @param msgs Indicates the {@link I3cMsg} message array. + * @param count Indicates the length of the message array. + * + * @return Returns the number of transferred message structures on success; Returns a negative value otherwise. + * + * @see I3cMsg + * @since 1.0 + */ int32_t I3cCntlrTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count); -int32_t I3cCntlrDaa(struct I3cCntlr *cntlr); - +/** + * @brief Add an I3C device or an I2C device to device list. + * + * @param device Indicates the I3C device or I2C device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ int32_t I3cDeviceAdd(struct I3cDevice *device); +/** + * @brief Remove an I3C device or an I2C device from device list. + * + * @param device Indicates the I3C device or I2C device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ void I3cDeviceRemove(struct I3cDevice *device); +/** + * @brief Find and return an I3C controller by number, with ref count. + * + * @param number Indicates the I3C controller to get. + * + * @return Returns an I3C controller object on success; Returns NULL otherwise. + * + * @since 1.0 + */ struct I3cCntlr *I3cCntlrGet(int16_t number); +/** + * @brief Release an I3C controller obtained by {@link I3cCntlrGet}. + * + * @param number Indicates the I3C controller to get. + * + * @since 1.0 + */ void I3cCntlrPut(struct I3cCntlr *cntlr); +/** + * @brief Add an I3C controller to controller list. + * + * @param cntlr Indicates the I3C controller device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ int32_t I3cCntlrAdd(struct I3cCntlr *cntlr); +/** + * @brief Remove an I3C controller from controller list. + * + * @param cntlr Indicates the I3C controller device. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ void I3cCntlrRemove(struct I3cCntlr *cntlr); -void I3cCntlrIrqCallback(struct I3cCntlr *cntlr, uint16_t addr); +/** + * @brief Get an I3C device by addr. + * + * @param cntlr Indicates the I3C controller device. + * @param addr Indicates the address of the device which you would like to get. + * + * @return Returns 0 on success; Returns a negative value otherwise. + * @since 1.0 + */ +struct I3cDevice *GetDeviceByAddr(struct I3cCntlr *cntlr, uint16_t addr); + +/** + * @brief IBI(In-bind Interrupt) callback function. + * + * @param device Indicates the device that generated the IBI. + * + * @return Returns an I3C device object on success; Returns NULL otherwise. + * + * @since 1.0 + */ +int32_t I3cCntlrIbiCallback(struct I3cDevice *device); enum I3cIoCmd { - I3c_Io_I2cTransfer = 0, + I3C_IO_I2C_TRANSFER = 0, I3C_IO_PRIV_TRANSFER, I3C_IO_OPEN, I3C_IO_CLOSE, diff --git a/support/platform/src/i3c_core.c b/support/platform/src/i3c_core.c index 7be51c852..9239b28b6 100755 --- a/support/platform/src/i3c_core.c +++ b/support/platform/src/i3c_core.c @@ -14,33 +14,6 @@ #include "osal_mutex.h" #define I3C_SERVICE_NAME "HDF_PLATFORM_I3C_MANAGER" -#define I3C_CNTLR_MAX 16 - -#define I3C_RESERVED_ADDR_7H00 0x00 -#define I3C_RESERVED_ADDR_7H01 0x01 -#define I3C_RESERVED_ADDR_7H02 0x02 -#define I3C_RESERVED_ADDR_7H3E 0x3e -#define I3C_RESERVED_ADDR_7H5E 0x5e -#define I3C_RESERVED_ADDR_7H6E 0x6e -#define I3C_RESERVED_ADDR_7H76 0x76 -#define I3C_RESERVED_ADDR_7H78 0x78 -#define I3C_RESERVED_ADDR_7H79 0x79 -#define I3C_RESERVED_ADDR_7H7A 0x7a -#define I3C_RESERVED_ADDR_7H7B 0x7b -#define I3C_RESERVED_ADDR_7H7C 0x7c -#define I3C_RESERVED_ADDR_7H7D 0x7d -#define I3C_RESERVED_ADDR_7H7E 0x7e -#define I3C_RESERVED_ADDR_7H7F 0x7f - -#define CHECK_RESERVED_ADDR(addr) \ - ({((addr == I3C_RESERVED_ADDR_7H00) || (addr == I3C_RESERVED_ADDR_7H01) || \ - (addr == I3C_RESERVED_ADDR_7H02) || (addr == I3C_RESERVED_ADDR_7H3E) || \ - (addr == I3C_RESERVED_ADDR_7H5E) || (addr == I3C_RESERVED_ADDR_7H6E) || \ - (addr == I3C_RESERVED_ADDR_7H76) || (addr == I3C_RESERVED_ADDR_7H78) || \ - (addr == I3C_RESERVED_ADDR_7H79) || (addr == I3C_RESERVED_ADDR_7H7A) || \ - (addr == I3C_RESERVED_ADDR_7H7B) || (addr == I3C_RESERVED_ADDR_7H7C) || \ - (addr == I3C_RESERVED_ADDR_7H7D) || (addr == I3C_RESERVED_ADDR_7H7D) || \ - (addr == I3C_RESERVED_ADDR_7H7F)) ? I3C_ADDR_RESERVED : I3C_ADDR_FREE;}) \ struct I3cManager { struct IDeviceIoService service; @@ -92,10 +65,8 @@ static inline void I3cCntlrUnlock(struct I3cCntlr *cntlr) static struct DListHead *I3cDeviceListGet(void) { static struct DListHead *head = NULL; - + head = &g_i3cDeviceList; - DListHeadInit(head); - OsalSpinInit(&g_listLock); while (OsalSpinLock(&g_listLock)); return head; @@ -116,7 +87,7 @@ static int32_t GetAddrStatus(struct I3cCntlr *cntlr, uint16_t addr) } status = ADDR_STATUS_MASK & ((cntlr->addrSlot[addr / ADDRS_PER_UINT16]) \ - >> ((addr % ADDRS_PER_UINT16) * ADDRS_PER_UINT16)); + >> ((addr % ADDRS_PER_UINT16) * ADDRS_STATUS_BITS)); return status; } @@ -143,9 +114,9 @@ static int32_t SetAddrStatus(struct I3cCntlr *cntlr, uint16_t addr, enum I3cAddr return ret; } - statusMask = ADDR_STATUS_MASK << (addr % ADDRS_PER_UINT16); - temp = (cntlr->addrSlot[addr / ADDRS_PER_UINT16]) | statusMask; - temp &= ((uint16_t)status) << (addr % ADDRS_PER_UINT16); + statusMask = ADDR_STATUS_MASK << ((addr % ADDRS_PER_UINT16) * ADDRS_STATUS_BITS); + temp = (cntlr->addrSlot[addr / ADDRS_PER_UINT16]) & ~statusMask; + temp |= ((uint16_t)status) << ((addr % ADDRS_PER_UINT16) * ADDRS_STATUS_BITS); cntlr->addrSlot[addr / ADDRS_PER_UINT16] = temp; I3cCntlrUnlock(cntlr); @@ -153,7 +124,7 @@ static int32_t SetAddrStatus(struct I3cCntlr *cntlr, uint16_t addr, enum I3cAddr return HDF_SUCCESS; } -void inline I3cInitAddrStatus(struct I3cCntlr *cntlr) +static void inline I3cInitAddrStatus(struct I3cCntlr *cntlr) { uint16_t addr; @@ -168,30 +139,38 @@ static int32_t GetFreeAddr(struct I3cCntlr *cntlr) { enum I3cAddrStatus status; int16_t count; + int32_t ret; if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL!", __func__); return HDF_ERR_INVALID_PARAM; } + ret = I3cCntlrLock(cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Lock cntlr failed!", __func__); + return ret; + } + for (count = 0; count <= I3C_ADDR_MAX; count++) { status = (enum I3cAddrStatus)GetAddrStatus(cntlr, count); if (status == I3C_ADDR_FREE) { return (int32_t)count; } } - + I3cCntlrUnlock(cntlr); HDF_LOGE("%s: No free addresses left!", __func__); return HDF_FAILURE; } -int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd ccc) +int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc) { int32_t ret; - if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { - cntlr->lockOps->unlock(cntlr); + if (ccc == NULL) { + HDF_LOGE("%s: ccc is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; } if (cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) { @@ -210,7 +189,7 @@ int32_t I3cCntlrSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd ccc) return ret; } -static struct I3cDevice *GetDeviceByAddr(struct I3cCntlr *cntlr, uint16_t addr) +struct I3cDevice *GetDeviceByAddr(struct I3cCntlr *cntlr, uint16_t addr) { struct DListHead *head = NULL; struct I3cDevice *pos = NULL; @@ -222,74 +201,84 @@ static struct I3cDevice *GetDeviceByAddr(struct I3cCntlr *cntlr, uint16_t addr) return NULL; } addrStatus = GetAddrStatus(cntlr, addr); - if (addrStatus == I3C_ADDR_FREE || addrStatus == I3C_ADDR_RESERVED) { + if (addrStatus == I3C_ADDR_FREE) { HDF_LOGE("%s: The addr 0x%x is unavailable", __func__, addr); return NULL; } + if (addrStatus == I3C_ADDR_RESERVED) { + HDF_LOGE("%s: The addr 0x%x is reserved", __func__, addr); + return NULL; + } if (addrStatus == I3C_ADDR_I2C_DEVICE || addrStatus == I3C_ADDR_I3C_DEVICE) { head = I3cDeviceListGet(); DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct I3cDevice, list) { if ((pos->dynaAddr == addr) && (pos->cntlr == cntlr)) { I3cDeviceListPut(); + HDF_LOGI("%s: found by dynaAddr,done!", __func__); return pos; } else if ((!pos->dynaAddr) && (pos->addr == addr) && (pos->cntlr == cntlr)) { + HDF_LOGI("%s: found by Addr,done!", __func__); I3cDeviceListPut(); return pos; } } } HDF_LOGE("%s: No such device found! addr: 0x%x", __func__, addr); - I3cDeviceListPut(); return NULL; } +static int32_t I3cDeviceDefineI3cDevices(struct I3cDevice *device) +{ + int32_t ret, addr; + + ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_I3C_DEVICE); + if (ret != HDF_SUCCESS) { + addr = GetFreeAddr(device->cntlr); + if (addr <= 0) { + HDF_LOGE("%s: No free addresses left!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + ret = SetAddrStatus(device->cntlr, (uint16_t)addr, I3C_ADDR_I3C_DEVICE); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Add I3C device failed!", __func__); + return ret; + } + } + + return HDF_SUCCESS; +} + int32_t I3cDeviceAdd(struct I3cDevice *device) { struct DListHead *head = NULL; struct I3cDevice *pos = NULL; struct I3cDevice *tmp = NULL; - struct I3cCccCmd ccc; int32_t ret; - int32_t addr; if ((device == NULL) || (GetAddrStatus(device->cntlr, device->addr) != I3C_ADDR_FREE)) { + HDF_LOGE("%s: device or addr is unavailable", __func__); return HDF_ERR_INVALID_OBJECT; } - ret = I3cCntlrLock(device->cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Lock cntlr failed!", __func__); - return ret; - } - if (device->type == I3C_CNTLR_I2C_DEVICE) { + if (device->type == I3C_CNTLR_I2C_DEVICE || device->type == I3C_CNTLR_I2C_LEGACY_DEVICE) { ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_I2C_DEVICE); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Add I2C device failed!", __func__); return ret; } } else { - ccc.cmd = I3C_CCC_SETDASA; - ccc.dest = device->addr; - ret = I3cCntlrSendCccCmd(device->cntlr, ccc); - if (device->type == I3C_CNTLR_I2C_DEVICE) { - ret = SetAddrStatus(device->cntlr, device->addr, I3C_ADDR_I3C_DEVICE); - if (ret != HDF_SUCCESS) { - addr = GetFreeAddr(device->cntlr); - if (addr <= 0) { - HDF_LOGE("%s: No free addresses left!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - ret = SetAddrStatus(device->cntlr, addr, I3C_ADDR_I3C_DEVICE); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Add I3C device failed!", __func__); - return ret; - } - } + ret = I3cDeviceDefineI3cDevices(device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: I3c DEFSLVS error!", __func__); + return ret; } } head = I3cDeviceListGet(); DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct I3cDevice, list) { + if (pos == NULL) { // empty list + break; + } if ((pos->pid == device->pid) && (pos->cntlr == device->cntlr)) { I3cDeviceListPut(); HDF_LOGE("%s: device already existed!: 0x%llx", __func__, device->pid); @@ -300,7 +289,7 @@ int32_t I3cDeviceAdd(struct I3cDevice *device) DListHeadInit(&device->list); DListInsertTail(&device->list, head); I3cDeviceListPut(); - I3cCntlrUnlock(device->cntlr); + HDF_LOGI("%s: done!", __func__); return HDF_SUCCESS; } @@ -326,7 +315,7 @@ static int32_t I3cManagerAddCntlr(struct I3cCntlr *cntlr) int32_t ret; struct I3cManager *manager = g_i3cManager; - if (cntlr->busId >= I3C_BUS_MAX) { + if (cntlr->busId >= I3C_CNTLR_MAX) { HDF_LOGE("%s: busId:%d exceed!", __func__, cntlr->busId); return HDF_ERR_INVALID_PARAM; } @@ -357,7 +346,7 @@ static void I3cManagerRemoveCntlr(struct I3cCntlr *cntlr) { struct I3cManager *manager = g_i3cManager; - if (cntlr->busId < 0 || cntlr->busId >= I3C_BUS_MAX) { + if (cntlr->busId < 0 || cntlr->busId >= I3C_CNTLR_MAX) { HDF_LOGE("%s: invalid busId:%d!", __func__, cntlr->busId); return; } @@ -385,7 +374,7 @@ struct I3cCntlr *I3cCntlrGet(int16_t number) struct I3cCntlr *cntlr = NULL; struct I3cManager *manager = g_i3cManager; - if (number < 0 || number >= I3C_BUS_MAX) { + if (number < 0 || number >= I3C_CNTLR_MAX) { HDF_LOGE("%s: invalid busId:%d!", __func__, number); return NULL; } @@ -456,8 +445,9 @@ int32_t I3cCntlrTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t co { int32_t ret; - if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { - cntlr->lockOps->unlock(cntlr); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops == NULL || cntlr->ops->Transfer == NULL) { @@ -480,10 +470,12 @@ int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t { int32_t ret; - if (cntlr->lockOps != NULL && cntlr->lockOps->unlock != NULL) { - cntlr->lockOps->unlock(cntlr); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; } + if (cntlr->ops == NULL || cntlr->ops->i2cTransfer == NULL) { HDF_LOGE("%s: ops or i2ctransfer is null", __func__); return HDF_ERR_NOT_SUPPORT; @@ -499,17 +491,22 @@ int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t return ret; } -int32_t I3cCntlrDaa(struct I3cCntlr *cntlr) +int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) { int32_t ret; - struct I3cCccCmd ccc; if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); return HDF_ERR_INVALID_OBJECT; } - if (cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) { - HDF_LOGE("%s: ops or sendCccCmd is null", __func__); + if (config == NULL) { + HDF_LOGE("%s: config is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (cntlr->ops == NULL || cntlr->ops->setConfig == NULL) { + HDF_LOGE("%s: ops or setConfig is NULL!", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -517,16 +514,18 @@ int32_t I3cCntlrDaa(struct I3cCntlr *cntlr) HDF_LOGE("%s: lock controller fail!", __func__); return HDF_ERR_DEVICE_BUSY; } - ccc.cmd = I3C_CCC_ENTDAA; - ccc.dest = I3C_BROADCAST_ADDR; - ret = cntlr->ops->sendCccCmd(cntlr, ccc); + + ret = cntlr->ops->setConfig(cntlr, config); + cntlr->config = *config; I3cCntlrUnlock(cntlr); return ret; } -int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) +int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) { + int32_t ret; + if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL!", __func__); return HDF_ERR_INVALID_OBJECT; @@ -537,18 +536,21 @@ int32_t I3cCntlrSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) return HDF_ERR_INVALID_PARAM; } - cntlr->config = *config; - return HDF_SUCCESS; -} + if (cntlr->ops == NULL || cntlr->ops->getConfig == NULL) { + HDF_LOGE("%s: ops or getConfig is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } -int32_t I3cCntlrGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) -{ - if (cntlr == NULL) { - return HDF_ERR_INVALID_OBJECT; + if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { + HDF_LOGE("%s: lock controller fail!", __func__); + return HDF_ERR_DEVICE_BUSY; } + ret = cntlr->ops->getConfig(cntlr, config); config = &cntlr->config; - return HDF_SUCCESS; + I3cCntlrUnlock(cntlr); + + return ret; } int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc func, uint32_t payload) @@ -561,39 +563,43 @@ int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc fun if (cntlr == NULL) { return HDF_ERR_INVALID_OBJECT; } - - if ((cntlr->ops == NULL || cntlr->ops->sendCccCmd == NULL) || (!device->supportIbi)) { + if (cntlr->ops == NULL || cntlr->ops->requestIbi == NULL) { HDF_LOGE("%s: Not support!", __func__); return HDF_ERR_NOT_SUPPORT; } - if ((func == NULL) || (addr >= I3C_ADDR_MAX)) { HDF_LOGE("%s: invalid func or addr!", __func__); return HDF_ERR_INVALID_PARAM; } - device = GetDeviceByAddr(cntlr, addr); if (device == NULL) { HDF_LOGE("%s: Get device failed!", __func__); return HDF_ERR_INVALID_OBJECT; } - + if (device->supportIbi != I3C_DEVICE_SUPPORT_IBI) { + HDF_LOGE("%s: not support!", __func__); + return HDF_ERR_NOT_SUPPORT; + } if (I3cCntlrLock(cntlr) != HDF_SUCCESS) { HDF_LOGE("%s: lock controller fail!", __func__); return HDF_ERR_DEVICE_BUSY; } for (ptr = 0; ptr < I3C_IBI_MAX; ptr++) { - if (cntlr->ibiSlot[ptr] == NULL) { - cntlr->ibiSlot[ptr] = device->ibi; - ibi = (struct I3cIbiInfo *)OsalMemCalloc(sizeof(*ibi)); - ibi->irqFunc = func; - ibi->payload = payload; - device->ibi = ibi; - ret = cntlr->ops->requestIbi(device, func, payload); - return ret; + if (cntlr->ibiSlot[ptr] != NULL) { + continue; } + ibi = (struct I3cIbiInfo *)OsalMemCalloc(sizeof(*ibi)); + ibi->ibiFunc = func; + ibi->payload = payload; + ibi->data = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * payload); + device->ibi = ibi; + cntlr->ibiSlot[ptr] = device->ibi; + ret = cntlr->ops->requestIbi(device); + I3cCntlrUnlock(cntlr); + return ret; } + I3cCntlrUnlock(cntlr); return HDF_ERR_DEVICE_BUSY; } @@ -619,37 +625,63 @@ int32_t I3cCntlrFreeIbi(struct I3cCntlr *cntlr, uint16_t addr) } for (ptr = 0; ptr < I3C_IBI_MAX; ptr++) { - if (cntlr->ibiSlot[ptr] == device->ibi) { - cntlr->ibiSlot[ptr] = NULL; - OsalMemFree(device->ibi); + if (cntlr->ibiSlot[ptr] == NULL || device->ibi == NULL) { + break; + } + if (cntlr->ibiSlot[ptr] != device->ibi) { + break; + } + cntlr->ibiSlot[ptr] = NULL; + if (device->ibi->data != NULL) { + OsalMemFree(device->ibi->data); } + OsalMemFree(device->ibi); + device->ibi = NULL; + break; } return HDF_SUCCESS; } -void I3cCntlrIrqCallback(struct I3cCntlr *cntlr, uint16_t addr) +int32_t I3cCntlrIbiCallback(struct I3cDevice *device) { - struct I3cIbiInfo *info = NULL; - struct I3cDevice *device = NULL; + struct I3cIbiData *ibiData = NULL; + + if (device == NULL) { + HDF_LOGW("%s: invalid device!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ibiData = (struct I3cIbiData *)OsalMemCalloc(sizeof(*ibiData)); + if (ibiData == NULL) { + HDF_LOGE("%s: Memcalloc failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ibiData->buf = device->ibi->data; + ibiData->payload = device->ibi->payload; + + if (device->ibi->ibiFunc == NULL) { + HDF_LOGW("%s: device->ibi or ibiFunc is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (device->dynaAddr != 0) { + (void)device->ibi->ibiFunc(device->cntlr, device->dynaAddr, *ibiData); + OsalMemFree(ibiData); - if (cntlr != NULL && addr <= I3C_ADDR_MAX) { - device = GetDeviceByAddr(cntlr, addr); - info = device->ibi; - if (info != NULL && info->irqFunc != NULL) { - (void)info->irqFunc(addr, info->irqData); - } else { - HDF_LOGW("%s: info or irqFunc is NULL!", __func__); - } } else { - HDF_LOGW("%s: invalid cntlr(info) or addr:%u!", __func__, addr); + (void)device->ibi->ibiFunc(device->cntlr, device->addr, *ibiData); + OsalMemFree(ibiData); } + + return HDF_SUCCESS; } static int32_t I3cManagerBind(struct HdfDeviceObject *device) { (void)device; - HDF_LOGE("%s:success!", __func__); + HDF_LOGI("%s:Enter!", __func__); return HDF_SUCCESS; } @@ -678,7 +710,8 @@ static int32_t I3cManagerInit(struct HdfDeviceObject *device) } manager->device = device; g_i3cManager = manager; - HDF_LOGE("%s:success!", __func__); + DListHeadInit(&g_i3cDeviceList); + OsalSpinInit(&g_listLock); return HDF_SUCCESS; } @@ -699,7 +732,6 @@ static void I3cManagerRelease(struct HdfDeviceObject *device) } g_i3cManager = NULL; OsalMemFree(manager); - HDF_LOGE("%s:success!", __func__); } struct HdfDriverEntry g_i3cManagerEntry = { diff --git a/support/platform/src/i3c_if.c b/support/platform/src/i3c_if.c index 8945d7300..a1ebe7b2b 100755 --- a/support/platform/src/i3c_if.c +++ b/support/platform/src/i3c_if.c @@ -9,7 +9,8 @@ #include "i3c_core.h" #include "i3c_if.h" #include "hdf_log.h" -#define HDF_LOG_TAG adc_if_c + +#define HDF_LOG_TAG i3c_if_c DevHandle I3cOpen(int16_t number) { @@ -52,11 +53,6 @@ int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msgs, int16_t count, enum T return ret; } -int32_t I3cDaa(DevHandle handle) -{ - return I3cCntlrDaa((struct I3cCntlr *)handle); -} - int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config) { return I3cCntlrSetConfig((struct I3cCntlr *)handle, config); diff --git a/support/platform/test/unittest/common/hdf_i3c_test.cpp b/support/platform/test/unittest/common/hdf_i3c_test.cpp new file mode 100644 index 000000000..095c0bdd7 --- /dev/null +++ b/support/platform/test/unittest/common/hdf_i3c_test.cpp @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdf_uhdf_test.h" +#include "i3c_test.h" +#include "hdf_io_service_if.h" + +using namespace testing::ext; + +class HdfI3cTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfI3cTest::SetUpTestCase() +{ + int32_t ret; + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_SETUP_ALL, -1}; + HdfTestOpenService(); + HdfTestSendMsgToService(&msg); +} + +void HdfI3cTest::TearDownTestCase() +{ + int32_t ret; + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_TEARDOWN_ALL, -1}; + HdfTestSendMsgToService(&msg); + HdfTestCloseService(); +} + +void HdfI3cTest::SetUp() +{ +} + +void HdfI3cTest::TearDown() +{ +} + +/** + * @tc.name: HdfI3cTestTransfer001 + * @tc.desc: i3c transfer test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestTransfer001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_TRANSFER, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestSetConfig001 + * @tc.desc: i3c set config test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestSetConfig001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_SET_CONFIG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestGetConfig001 + * @tc.desc: i3c get config test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestGetConfig001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_GET_CONFIG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestRequestIbi001 + * @tc.desc: i3c request ibi test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestRequestIbi001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_REQUEST_IBI, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestRreeIbi001 + * @tc.desc: i3c free ibi test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestRreeIbi001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_FREE_IBI, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestMultiThread001 + * @tc.desc: i3c multithreading test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestMultiThread001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_MULTI_THREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HdfI3cTestReliability001 + * @tc.desc: i3c reliability test + * @tc.type: FUNC + * @tc.require: N/A + */ +HWTEST_F(HdfI3cTest, HdfI3cTestReliability001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_RELIABILITY, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 0864e4165..7a33d356a 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -26,6 +26,9 @@ #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) #include "hdf_adc_entry_test.h" #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I3C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I3C) +#include "hdf_i3c_entry_test.h" +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_SPI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_SPI) #include "hdf_spi_entry_test.h" #endif @@ -86,6 +89,9 @@ HdfTestFuncList g_hdfTestFuncList[] = { #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) { TEST_PAL_ADC_TYPE, HdfAdcTestEntry }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I3C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I3C) + { TEST_PAL_I3C_TYPE, HdfI3cTestEntry }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_SPI) || defined(CONFIG_DRIVERS_HDF_PLATFORM_SPI) { TEST_PAL_SPI_TYPE, HdfSpiUnitTestEntry }, #endif diff --git a/test/unittest/platform/common/i3c_driver_test.c b/test/unittest/platform/common/i3c_driver_test.c new file mode 100644 index 000000000..b648f961a --- /dev/null +++ b/test/unittest/platform/common/i3c_driver_test.c @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "i3c_test.h" +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG i3c_driver_test_c + +static struct I3cTestConfig g_config; + +static int32_t I3cTestDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + HDF_LOGD("%s: enter!", __func__); + + if (cmd == 0) { + if (reply == NULL) { + HDF_LOGE("%s: reply is null!", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufWriteBuffer(reply, &g_config, sizeof(g_config))) { + HDF_LOGE("%s: write reply failed", __func__); + return HDF_ERR_IO; + } + } else { + return HDF_ERR_NOT_SUPPORT; + } + + return HDF_SUCCESS; +} + +static int32_t I3cTestReadConfig(struct I3cTestConfig *config, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint16(node, "busId", &config->busId, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read busId failed", __func__); + return ret; + } + + ret = drsOps->GetUint16(node, "devAddr", &config->devAddr, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read dev addr failed", __func__); + return ret; + } + + ret = drsOps->GetUint16(node, "regLen", &config->regLen, 1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read reg len failed", __func__); + return ret; + } + + ret = drsOps->GetUint16(node, "regAddr", &config->regAddr, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read reg addr failed", __func__); + return ret; + } + + ret = drsOps->GetUint16(node, "bufSize", &config->bufSize, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read buf size failed", __func__); + return ret; + } + return HDF_SUCCESS; +} + +static int32_t I3cTestBind(struct HdfDeviceObject *device) +{ + int32_t ret; + static struct IDeviceIoService service; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or config is null!", __func__); + return HDF_ERR_IO; + } + + ret = I3cTestReadConfig(&g_config, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed", __func__); + return ret; + } + service.Dispatch = I3cTestDispatch; + device->service = &service; + HDF_LOGI("%s: Done!", __func__); + return HDF_SUCCESS; +} + +static int32_t I3cTestInit(struct HdfDeviceObject *device) +{ + (void)device; + HDF_LOGI("%s: Done!", __func__); + return HDF_SUCCESS; +} + +static void I3cTestRelease(struct HdfDeviceObject *device) +{ + if (device != NULL) { + device->service = NULL; + } + HDF_LOGI("%s: Done!", __func__); + return; +} + +struct HdfDriverEntry g_i3cTestEntry = { + .moduleVersion = 1, + .Bind = I3cTestBind, + .Init = I3cTestInit, + .Release = I3cTestRelease, + .moduleName = "PLATFORM_I3C_TEST", +}; +HDF_INIT(g_i3cTestEntry); diff --git a/test/unittest/platform/common/i3c_test.c b/test/unittest/platform/common/i3c_test.c new file mode 100644 index 000000000..4ecd50490 --- /dev/null +++ b/test/unittest/platform/common/i3c_test.c @@ -0,0 +1,528 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "i3c_test.h" +#include "i3c_if.h" +#include "i3c_ccc.h" +#include "hdf_base.h" +#include "hdf_io_service_if.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" +#include "osal_thread.h" +#include "osal_time.h" + +#define HDF_LOG_TAG i3c_test_c + +#define I3C_TEST_MSG_NUM 2 +#define I3C_TEST_8BIT 8 +#define I3C_TEST_WAIT_TIMES 100 +#define I3C_TEST_STACK_SIZE (1024 * 256) +#define I3C_TEST_IBI_PAYLOAD 16 +#define I3C_TEST_REG_LEN 2 + +static struct I3cMsg g_msgs[I3C_TEST_MSG_NUM]; +static uint8_t *g_buf; +static uint8_t g_regs[I3C_TEST_REG_LEN]; + +struct I3cTestEntry { + int cmd; + int32_t (*func)(void *param); + const char *name; +}; + +static int32_t I3cTestGetTestConfig(struct I3cTestConfig *config) +{ + int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = NULL; + const void *buf = NULL; + uint32_t len; + + service = HdfIoServiceBind("I3C_TEST"); + if (service == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + reply = HdfSBufObtain(sizeof(*config) + sizeof(uint64_t)); + if (reply == NULL) { + HDF_LOGE("%s: Failed to obtain reply", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = service->dispatcher->Dispatch(&service->object, 0, NULL, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Remote dispatch failed", __func__); + return ret; + } + + if (!HdfSbufReadBuffer(reply, &buf, &len)) { + HDF_LOGE("%s: Read buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (len != sizeof(*config)) { + HDF_LOGE("%s: Config size:%zu, read size:%u", __func__, sizeof(*config), len); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (memcpy_s(config, sizeof(*config), buf, sizeof(*config)) != EOK) { + HDF_LOGE("%s: Memcpy buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + HdfSBufRecycle(reply); + HDF_LOGD("%s: Done", __func__); + return HDF_SUCCESS; +} + +struct I3cTester *I3cTesterGet(void) +{ + int32_t ret; + static struct I3cTester tester; + static bool hasInit = false; + + if (hasInit) { + return &tester; + } + ret = I3cTestGetTestConfig(&tester.config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed, ret = %d", __func__, ret); + return NULL; + } + tester.handle = I3cOpen(tester.config.busId); + if (tester.handle == NULL) { + HDF_LOGE("%s: Open I3C controller: %u failed!", __func__, tester.config.busId); + return NULL; + } + hasInit = true; + HDF_LOGD("%s: Done", __func__); + return &tester; +} + +static int32_t I3cTestMallocBuf(struct I3cTester *tester) +{ + struct I3cTestConfig *config = &tester->config; + + if (g_buf == NULL) { + g_buf = OsalMemCalloc(config->bufSize); + if (g_buf == NULL) { + HDF_LOGE("I3cTestMallocBuf: malloc buf fail!"); + return HDF_ERR_MALLOC_FAIL; + } + } + + g_regs[0] = (uint8_t)config->regAddr; + if (config->regLen > 1) { + g_regs[1] = g_regs[0]; + g_regs[0] = (uint8_t)(config->regAddr >> I3C_TEST_8BIT); + } + + g_msgs[0].addr = config->devAddr; + g_msgs[0].flags = 0; + g_msgs[0].len = config->regLen; + g_msgs[0].buf = g_regs; + + g_msgs[1].addr = config->devAddr; + g_msgs[1].flags = I3C_FLAG_READ; + g_msgs[1].len = config->bufSize; + g_msgs[1].buf = g_buf; + + return HDF_SUCCESS; +} + +int32_t I3cTestSetUpAll(void *param) +{ + struct I3cTester *tester = NULL; + struct I3cTestConfig *cfg = NULL; + + (void) param; + HDF_LOGD("I3cTestSetUpAll: enter!"); + tester = I3cTesterGet(); + if (tester == NULL) { + HDF_LOGE("I3cTestSetUpAll: get tester fail!"); + return HDF_ERR_INVALID_OBJECT; + } + tester->total = I3C_TEST_CMD_MAX; + tester->fails = 0; + + cfg = &tester->config; + HDF_LOGD("I3cTestSetUpAll: test on bus:0x%x, addr:0x%x, reg:0x%x, reglen:0x%x, size:0x%x", + cfg->busId, cfg->devAddr, cfg->regAddr, cfg->regLen, cfg->bufSize); + if (I3cTestMallocBuf(tester) != HDF_SUCCESS) { + HDF_LOGE("I3cTestSetUpAll: set up test case fail!"); + } + HDF_LOGD("I3cTestSetUpAll: exit!"); + *((int32_t *)param) = 1; + + return HDF_SUCCESS; +} + +int32_t I3cTestTearDownAll(void *param) +{ + if (g_buf != NULL) { + OsalMemFree(g_buf); + g_buf = NULL; + } + *((int32_t *)param) = 1; + + return HDF_SUCCESS; +} + +int32_t I3cTestSetUpSingle(void) +{ + return HDF_SUCCESS; +} + +int32_t I3cTestTearDownSingle(void) +{ + return HDF_SUCCESS; +} + +int32_t I3cTestTransfer(void *param) +{ + struct I3cTester *tester = NULL; + int32_t ret; + tester = I3cTesterGet(); +/* *((int32_t *)param) = 1; +return HDF_SUCCESS; */ + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_INVALID_OBJECT; + } + /* transfer one write msg */ + ret = I3cTransfer(tester->handle, g_msgs, 1, I3C_MODE); + if (ret != 1) { + HDF_LOGE("%s: I3cTransfer(write) err: %d", __func__, ret); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + + /* transfer one read msg */ + ret = I3cTransfer(tester->handle, g_msgs + 1, 1, I3C_MODE); + if (ret != 1) { + HDF_LOGE("%s: I3cTransfer(read) err: %d", __func__, ret); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + + /* transfer two msgs including a read msg and a write msg */ + ret = I3cTransfer(tester->handle, g_msgs, I3C_TEST_MSG_NUM, I3C_MODE); + if (ret != I3C_TEST_MSG_NUM) { + HDF_LOGE("%s: I3cTransfer(mix) err: %d", __func__, ret); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + *((int32_t *)param) = 1; + HDF_LOGD("%s: Done", __func__); + return HDF_SUCCESS; +} + +int32_t I3cTestSetConfig(void *param) +{ + struct I3cTester *tester = NULL; + struct I3cConfig *config = NULL; + int32_t ret; + + tester = I3cTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_INVALID_OBJECT; + } + + config = (struct I3cConfig*)OsalMemCalloc(sizeof(*config)); + if (config == NULL) { + HDF_LOGE("%s: MemCalloc failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_MALLOC_FAIL; + } + + config->busMode = I3C_BUS_HDR_MODE; + config->curMaster = NULL; + ret = I3cSetConfig(tester->handle, config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Set config failed!, busId = %d", __func__, tester->config.busId); + OsalMemFree(config); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + OsalMemFree(config); + config = NULL; + HDF_LOGD("%s: Done", __func__); + *((int32_t *)param) = 1; + + return HDF_SUCCESS; +} + +int32_t I3cTestGetConfig(void *param) +{ + struct I3cTester *tester = NULL; + struct I3cConfig *config = NULL; + int32_t ret; + + tester = I3cTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_INVALID_OBJECT; + } + + config = (struct I3cConfig*)OsalMemCalloc(sizeof(*config)); + if (config == NULL) { + HDF_LOGE("%s: MemCalloc failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_MALLOC_FAIL; + } + + ret = I3cGetConfig(tester->handle, config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Get config failed!, busId = %d", __func__, tester->config.busId); + OsalMemFree(config); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + + OsalMemFree(config); + config = NULL; + *((int32_t *)param) = 1; + HDF_LOGD("%s: Done", __func__); + + return HDF_SUCCESS; +} + +static int32_t TestI3cIbiFunc(DevHandle handle, uint16_t addr, struct I3cIbiData data) +{ + (void)handle; + (void)addr; + HDF_LOGD("%s: %.16s", __func__, (char *)data.buf); + + return HDF_SUCCESS; +} + +int32_t I3cTestRequestIbi(void *param) +{ + struct I3cTester *tester = NULL; + int32_t ret; + + tester = I3cTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_INVALID_OBJECT; + } + + ret = I3cRequestIbi(tester->handle, tester->config.devAddr, TestI3cIbiFunc, I3C_TEST_IBI_PAYLOAD); + if (ret != HDF_SUCCESS) { + *((int32_t *)param) = 1; + HDF_LOGE("%s: Requset IBI failed!, busId = %d", __func__, tester->config.busId); + return HDF_FAILURE; + } + *((int32_t *)param) = 1; + HDF_LOGD("%s: Done", __func__); + + return HDF_SUCCESS; +} + +int32_t I3cTestFreeIbi(void *param) +{ + struct I3cTester *tester = NULL; + int32_t ret; + + tester = I3cTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + ret = I3cFreeIbi(tester->handle, tester->config.devAddr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Free IBI failed!, busId = %d", __func__, tester->config.busId); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + *((int32_t *)param) = 1; + HDF_LOGD("%s: done", __func__); + + return HDF_SUCCESS; +} + +int32_t I3cTestThreadFunc(OsalThreadEntry func) +{ + int32_t ret; + struct OsalThread thread1, thread2; + struct OsalThreadParam cfg1, cfg2; + int32_t count1, count2; + + count1 = count2 = 0; + ret = OsalThreadCreate(&thread1, func, (void *)&count1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadCreate(&thread2, func, (void *)&count2); + if (ret != HDF_SUCCESS) { + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + cfg1.name = "I3cTestThread-1"; + cfg2.name = "I3cTestThread-2"; + cfg1.priority = cfg2.priority = OSAL_THREAD_PRI_DEFAULT; + cfg1.stackSize = cfg2.stackSize = I3C_TEST_STACK_SIZE; + + ret = OsalThreadStart(&thread1, &cfg1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("start test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadStart(&thread2, &cfg2); + if (ret != HDF_SUCCESS) { + HDF_LOGE("start test thread2 fail:%d", ret); + return HDF_FAILURE; + } + + while (count1 == 0 || count2 == 0) { + HDF_LOGE("waitting testing thread finish..."); + OsalMSleep(I3C_TEST_WAIT_TIMES); + } + + (void)OsalThreadDestroy(&thread1); + (void)OsalThreadDestroy(&thread2); + HDF_LOGD("%s: done", __func__); + + return HDF_SUCCESS; +} + +static struct I3cTestEntry g_multiThreadEntry[] = { + { I3C_TEST_CMD_TRANSFER, I3cTestTransfer, "I3cTestTransfer" }, + { I3C_TEST_CMD_SET_CONFIG, I3cTestSetConfig, "I3cTestSetConfig" }, + { I3C_TEST_CMD_GET_CONFIG, I3cTestGetConfig, "I3cTestGetConfig" }, + { I3C_TEST_CMD_REQUEST_IBI, I3cTestRequestIbi, "I3cTestRequestIbi" }, + { I3C_TEST_CMD_FREE_IBI, I3cTestFreeIbi, "I3cTestFreeIbi" }, +}; + +int32_t I3cTestMultiThread(void *param) +{ + uint32_t i; + int32_t ret = HDF_ERR_NOT_SUPPORT; + + for (i = 0; i < sizeof(g_multiThreadEntry) / sizeof(g_multiThreadEntry[0]); i++) { + if (g_multiThreadEntry[i].func == NULL) { + HDF_LOGE("%s: func is NULL", __func__); + return HDF_FAILURE; + } + HDF_LOGI("%s: =================calling func %d =========================", __func__, i); + ret = I3cTestThreadFunc((OsalThreadEntry)g_multiThreadEntry[i].func); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Multithreading test failed: %u", __func__, i); + return ret; + } + } + *((int32_t *)param) = 1; + + return HDF_SUCCESS; +} + +int32_t I3cTestReliability(void *param) +{ + struct I3cTester *tester = NULL; + struct I3cConfig *config = NULL; + + tester = I3cTesterGet(); + if (tester == NULL || tester->handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + config = (struct I3cConfig *)OsalMemCalloc(sizeof(*config)); + config->busMode = I3C_BUS_HDR_MODE; + config->curMaster = NULL; + // invalid handle + (void)I3cTransfer(NULL, g_msgs, 1, I3C_MODE); + (void)I3cSetConfig(NULL, config); + (void)I3cGetConfig(NULL, config); + (void)I3cRequestIbi(NULL, tester->config.devAddr, TestI3cIbiFunc, I3C_TEST_IBI_PAYLOAD); + (void)I3cFreeIbi(NULL, tester->config.devAddr); + // Invalid msg + (void)I3cTransfer(tester->handle, NULL, 1, I3C_MODE); + // Invalid config + (void)I3cSetConfig(tester->handle, NULL); + (void)I3cGetConfig(tester->handle, NULL); + // Invalid function + (void)I3cRequestIbi(tester->handle, tester->config.devAddr, NULL, I3C_TEST_IBI_PAYLOAD); + // Invalid number + (void)I3cTransfer(tester->handle, g_msgs, -1, I3C_MODE); + (void)I3cRequestIbi(tester->handle, tester->config.devAddr, TestI3cIbiFunc, -1); + *((int32_t *)param) = 1; + HDF_LOGD("%s: Done", __func__); + + return HDF_SUCCESS; +} + +static struct I3cTestEntry g_entry[] = { + { I3C_TEST_CMD_TRANSFER, I3cTestTransfer, "I3cTestTransfer" }, + { I3C_TEST_CMD_SET_CONFIG, I3cTestSetConfig, "I3cTestSetConfig" }, + { I3C_TEST_CMD_GET_CONFIG, I3cTestGetConfig, "I3cTestGetConfig" }, + { I3C_TEST_CMD_REQUEST_IBI, I3cTestRequestIbi, "I3cTestRequestIbi" }, + { I3C_TEST_CMD_FREE_IBI, I3cTestFreeIbi, "I3cTestFreeIbi" }, + { I3C_TEST_CMD_MULTI_THREAD, I3cTestMultiThread, "I3cTestMultiThread" }, + { I3C_TEST_CMD_RELIABILITY, I3cTestReliability, "I3cTestReliability" }, + { I3C_TEST_CMD_SETUP_ALL, I3cTestSetUpAll, "I3cTestSetUpAll" }, + { I3C_TEST_CMD_TEARDOWN_ALL, I3cTestTearDownAll, "I3cTestTearDownAll" }, +}; + +int32_t I3cTestExecute(int cmd) +{ + uint32_t i; + int32_t count; + int32_t ret = HDF_ERR_NOT_SUPPORT; + + if (cmd > I3C_TEST_CMD_MAX) { + HDF_LOGE("%s: invalid cmd:%d", __func__, cmd); + ret = HDF_ERR_NOT_SUPPORT; + goto __EXIT__; + } + + for (i = 0; i < sizeof(g_entry) / sizeof(g_entry[0]); i++) { + if (g_entry[i].cmd != cmd || g_entry[i].func == NULL) { + continue; + } + count = 0; + ret = g_entry[i].func((void *)&count); + break; + } + +__EXIT__: + HDF_LOGI("[%s][======cmd:%d====ret:%d======]", __func__, cmd, ret); + return ret; +} + +void I3cTestExecuteAll(void) +{ + int32_t i; + int32_t ret; + int32_t fails = 0; + + /* setup env for all test cases */ + (void)I3cTestExecute(I3C_TEST_CMD_SETUP_ALL); + + for (i = 0; i < I3C_TEST_CMD_SETUP_ALL; i++) { + ret = I3cTestExecute(i); + fails += (ret != HDF_SUCCESS) ? 1 : 0; + } + + /* teardown env for all test cases */ + (void)I3cTestExecute(I3C_TEST_CMD_TEARDOWN_ALL); + + HDF_LOGI("I3cTestExecuteALL: **********PASS:%d FAIL:%d************\n\n", + I3C_TEST_CMD_RELIABILITY + 1 - fails, fails); +} diff --git a/test/unittest/platform/common/i3c_test.h b/test/unittest/platform/common/i3c_test.h new file mode 100644 index 000000000..7ef6c9e61 --- /dev/null +++ b/test/unittest/platform/common/i3c_test.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef I3C_TEST_H +#define I3C_TEST_H + +#include "i3c_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct I3cTestConfig { + uint16_t busId; + uint16_t devAddr; + uint16_t regAddr; + uint16_t regLen; + uint16_t bufSize; +}; + +struct I3cTester { + struct I3cTestConfig config; + DevHandle handle; + uint16_t total; + uint16_t fails; +}; + +enum I3cTestCmd { + I3C_TEST_CMD_TRANSFER = 0, + I3C_TEST_CMD_SET_CONFIG, + I3C_TEST_CMD_GET_CONFIG, + I3C_TEST_CMD_REQUEST_IBI, + I3C_TEST_CMD_FREE_IBI, + I3C_TEST_CMD_MULTI_THREAD, + I3C_TEST_CMD_RELIABILITY, + I3C_TEST_CMD_SETUP_ALL, + I3C_TEST_CMD_TEARDOWN_ALL, + I3C_TEST_CMD_SETUP_SINGLE, + I3C_TEST_CMD_TEARDOWN_SINGLE, + I3C_TEST_CMD_MAX, +}; + +int32_t I3cTestExecute(int cmd); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* I3C_TEST_H */ diff --git a/test/unittest/platform/hdf_i3c_entry_test.c b/test/unittest/platform/hdf_i3c_entry_test.c new file mode 100644 index 000000000..1182fa64e --- /dev/null +++ b/test/unittest/platform/hdf_i3c_entry_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_i3c_entry_test.h" +#include "hdf_log.h" +#include "i3c_test.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG hdf_adc_entry_test + +int32_t HdfI3cTestEntry(HdfTestMsg *msg) +{ + HDF_LOGI("%s: enter", __func__); + if (msg == NULL) { + return HDF_FAILURE; + } + + msg->result = I3cTestExecute(msg->subCmd); + + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/test/unittest/platform/hdf_i3c_entry_test.h b/test/unittest/platform/hdf_i3c_entry_test.h new file mode 100644 index 000000000..efe663e0a --- /dev/null +++ b/test/unittest/platform/hdf_i3c_entry_test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_I3C_ENTRY_TEST_H +#define HDF_I3C_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfI3cTestEntry(HdfTestMsg *msg); + +#endif /* HDF_I3C_ENTRY_TEST_H */ diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c new file mode 100644 index 000000000..b6c7a2fe5 --- /dev/null +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -0,0 +1,447 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "i3c_core.h" +#include "device_resource_if.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_io.h" +#include "osal_irq.h" +#include "osal_mem.h" +#include "osal_spinlock.h" +#include "osal_time.h" +#include "plat_log.h" + +#define HDF_LOG_TAG i3c_virtual + +#define VIRTUAL_I3C_DELAY 50 +#define VIRTUAL_I3C_HOT_JOIN_TEST_ADDR 0x3f + +#define VIRTUAL_I3C_TEST_STR_LEN 11 +#define VIRTUAL_I3C_TEST_STR "Hello I3C!" + +struct VirtualI3cCntlr { + struct I3cCntlr cntlr; + OsalSpinlock spin; + uint16_t busId; + uint16_t busMode; + uint16_t IrqNum; + uint32_t i3cMaxRate; + uint32_t i3cRate; + uint32_t i2cFmRate; + uint32_t i2cFmPlusRate; +}; + +struct VirtualI3cTransferData { + struct I3cMsg *msgs; + int16_t index; + int16_t count; +}; + +struct VirtualI3cIbiSimulator { + uint16_t ibiAddr; + uint16_t deviceAddr; +}; + +static struct VirtualI3cIbiSimulator ibiSimulator; + +static inline void VirtualI3cSetIbiSimulator(uint16_t addr, uint16_t deviceAddr) +{ + ibiSimulator.ibiAddr = addr; + ibiSimulator.deviceAddr = deviceAddr; +} + +static inline uint16_t VirtualI3cGetIbiAddr(void) +{ + return ibiSimulator.ibiAddr; +} + +static inline uint16_t VirtualI3cGetIbiDeviceAddr(void) +{ + return ibiSimulator.deviceAddr; +} + +static int32_t VirtualI3cXferI2cOneMsgPolling(const struct VirtualI3cCntlr *virtual, const struct VirtualI3cTransferData *td) +{ + struct I3cMsg *msg = &td->msgs[td->index]; + + (void)virtual; + (void)msg; + PLAT_LOGV("%s: msg:%p, addr:%x, flags:0x%x, len=%d", __func__, msg, msg->addr, msg->flags, msg->len); + + return HDF_SUCCESS; +} + +static inline void VirtualI3cCntlrInit(struct VirtualI3cCntlr *virtual) +{ + HDF_LOGI("%s: cntlr:%u init done!", __func__, virtual->busId); +} + +static int32_t VirtualSendCccCmd(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc) +{ + (void)cntlr; + HDF_LOGI("%s: Enter, destination: %x", __func__, ccc->dest); + + return HDF_SUCCESS; +} + +static int32_t VirtualI3cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count) +{ + struct VirtualI3cCntlr *virtual = NULL; + + (void)cntlr; + (void)msgs; + if (cntlr == NULL || cntlr->priv == NULL) { + HDF_LOGE("%s: cntlr or virtual is null!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + virtual = (struct VirtualI3cCntlr *)cntlr; + + if (msgs == NULL || count <= 0) { + HDF_LOGE("%s: err params! count:%d", __func__, count); + return HDF_ERR_INVALID_PARAM; + } + + return count; +} + +static int32_t VirtualI3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t count) +{ + int32_t ret; + unsigned long irqSave; + struct VirtualI3cCntlr *virtual = NULL; + struct VirtualI3cTransferData td; + + if (cntlr == NULL || cntlr->priv == NULL) { + HDF_LOGE("%s: cntlr or virtual is null!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + virtual = (struct VirtualI3cCntlr *)cntlr; + + if (msgs == NULL || count <= 0) { + HDF_LOGE("%s: err params! count:%d", __func__, count); + return HDF_ERR_INVALID_PARAM; + } + td.msgs = msgs; + td.count = count; + td.index = 0; + + irqSave = LOS_IntLock(); + while (td.index < td.count) { + ret = VirtualI3cXferI2cOneMsgPolling(virtual, &td); + if (ret != 0) { + break; + } + td.index++; + } + LOS_IntRestore(irqSave); + return (td.index > 0) ? td.index : ret; +} + +int32_t VirtualI3cSetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) +{ + (void)cntlr; + (void)config; + HDF_LOGI("%s: done!", __func__); + return HDF_SUCCESS; +} + +int32_t VirtualI3cGetConfig(struct I3cCntlr *cntlr, struct I3cConfig *config) +{ + (void)cntlr; + (void)config; + HDF_LOGI("%s: done!", __func__); + return HDF_SUCCESS; +} + +int32_t VirtualI3cRequestIbi(struct I3cDevice *dev) +{ + (void)dev; + HDF_LOGI("%s: done!", __func__); + + return HDF_SUCCESS; +} + +static void VirtualI3cFreeIbi(struct I3cDevice *dev) +{ + (void)dev; + HDF_LOGI("%s: done!", __func__); +} + +static const struct I3cMethod g_method = { + .sendCccCmd = VirtualSendCccCmd, + .i2cTransfer = VirtualI3cCntlrI2cTransfer, + .Transfer = VirtualI3cTransfer, + .setConfig = VirtualI3cSetConfig, + .getConfig = VirtualI3cGetConfig, + .requestIbi = VirtualI3cRequestIbi, + .freeIbi = VirtualI3cFreeIbi, +}; + +static void VirtualI3cHotJoin(struct VirtualI3cCntlr *virtual) +{ + uint16_t deviceAddr; + struct I3cDevice *device = NULL; + int32_t ret; + + deviceAddr = VirtualI3cGetIbiDeviceAddr(); + device = (struct I3cDevice *)OsalMemCalloc(sizeof(*device)); + device->cntlr = &virtual->cntlr; + device->addr = deviceAddr; + device->type = I3C_CNTLR_I3C_DEVICE; + device->supportIbi = I3C_DEVICE_SUPPORT_IBI; + ret = I3cDeviceAdd(device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Add device failed!", __func__); + return; + } + HDF_LOGI("%s: done!", __func__); +} + +static int32_t VirtualI3cReservedAddrWorker(struct VirtualI3cCntlr *virtual, uint16_t addr) +{ + (void)virtual; + switch (addr) { + case I3C_HOT_JOIN_ADDR: + VirtualI3cHotJoin(virtual); + break; + case I3C_RESERVED_ADDR_7H3E: + case I3C_RESERVED_ADDR_7H5E: + case I3C_RESERVED_ADDR_7H6E: + case I3C_RESERVED_ADDR_7H76: + case I3C_RESERVED_ADDR_7H7A: + case I3C_RESERVED_ADDR_7H7C: + case I3C_RESERVED_ADDR_7H7F: + /* All cases of broadcast address single bit error detect */ + HDF_LOGW("%s: broadcast Address single bit error!", __func__); + break; + default: + HDF_LOGD("%s: Reserved address which is not supported!", __func__); + break; + } + + return HDF_SUCCESS; +} + +static int32_t I3cIbiHandle(uint32_t irq, void *data) +{ + struct VirtualI3cCntlr *virtual = NULL; + struct I3cDevice *device = NULL; + uint16_t ibiAddr; + char *testStr = VIRTUAL_I3C_TEST_STR; + + (void)irq; + if (data == NULL) { + HDF_LOGW("%s: data is NULL!", __func__); + return HDF_ERR_INVALID_PARAM; + } + virtual = (struct VirtualI3cCntlr *)data; + ibiAddr = VirtualI3cGetIbiAddr(); + if (CHECK_RESERVED_ADDR(ibiAddr) == I3C_ADDR_RESERVED) { + HDF_LOGD("%s: Calling VirtualI3cResAddrWorker...", __func__); + return VirtualI3cReservedAddrWorker(virtual, ibiAddr); + } else { + HDF_LOGD("%s: Calling I3cCntlrIbiCallback...", __func__); + if (device->ibi->payload > VIRTUAL_I3C_TEST_STR_LEN) { + /* Put the string "Hello I3C!" into IBI buffer */ + *device->ibi->data = *testStr; + } + device = GetDeviceByAddr(&virtual->cntlr, ibiAddr); + return I3cCntlrIbiCallback(device); + } + + return HDF_SUCCESS; +} + +/* Soft calling is used here to simulate in-band interrupt */ +static inline void SoftInterruptTrigger(struct VirtualI3cCntlr *virtual, uint16_t ibiDeviceAddr) +{ + VirtualI3cSetIbiSimulator(I3C_HOT_JOIN_ADDR, ibiDeviceAddr); + HDF_LOGE("%s: IrqNum: %d", __func__, virtual->IrqNum); + + (void)I3cIbiHandle(virtual->IrqNum, (void *)virtual); // Simulate soft interrupt through direct call +} + +static int32_t VirtualI3cHotJoinSimulator(void) +{ + uint16_t busId; + struct I3cCntlr *cntlr = NULL; + struct VirtualI3cCntlr *virtual; + + for (busId = 0; busId < I3C_CNTLR_MAX; busId++) { + cntlr = I3cCntlrGet(busId); + if (cntlr == NULL) { + continue; + } + + virtual = (struct VirtualI3cCntlr *)cntlr; + OsalMDelay(VIRTUAL_I3C_DELAY); + SoftInterruptTrigger(virtual, VIRTUAL_I3C_HOT_JOIN_TEST_ADDR); + } + + return HDF_SUCCESS; +} + +static int32_t VirtualI3cReadDrs(struct VirtualI3cCntlr *virtual, const struct DeviceResourceNode *node) +{ + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: Invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + if (drsOps->GetUint16(node, "busId", &virtual->busId, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read busId fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint16(node, "busMode", &virtual->busMode, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read busMode fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint16(node, "IrqNum", &virtual->IrqNum, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read IrqNum fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "i3cMaxRate", &virtual->i3cMaxRate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read i3cMaxRate fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "i3cRate", &virtual->i3cRate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read i3cRate fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "i2cFmRate", &virtual->i2cFmRate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read i2cFmRate fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "i2cFmPlusRate", &virtual->i2cFmPlusRate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read i2cFmPlusRate fail!", __func__); + return HDF_ERR_IO; + } + + return HDF_SUCCESS; +} + +static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct VirtualI3cCntlr *virtual = NULL; + (void)device; + + virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); + if (virtual == NULL) { + HDF_LOGE("%s: Malloc virtual fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = VirtualI3cReadDrs(virtual, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); + goto __ERR__; + } + + VirtualI3cCntlrInit(virtual); + virtual->cntlr.priv = (void *)node; + virtual->cntlr.busId = virtual->busId; + virtual->cntlr.ops = &g_method; + (void)OsalSpinInit(&virtual->spin); + ret = I3cCntlrAdd(&virtual->cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret); + (void)OsalSpinDestroy(&virtual->spin); + goto __ERR__; + } + + return HDF_SUCCESS; +__ERR__: + if (virtual != NULL) { + OsalMemFree(virtual); + virtual = NULL; + } + + return ret; +} + +static int32_t VirtualI3cInit(struct HdfDeviceObject *device) +{ + int32_t ret; + const struct DeviceResourceNode *childNode = NULL; + + HDF_LOGE("%s: Enter", __func__); + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + ret = HDF_SUCCESS; + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = VirtualI3cParseAndInit(device, childNode); + if (ret != HDF_SUCCESS) { + break; + } + } + ret = VirtualI3cHotJoinSimulator(); + + return ret; +} + +static void VirtualI3cRemoveByNode(const struct DeviceResourceNode *node) +{ + int32_t ret; + int16_t busId; + struct I3cCntlr *cntlr = NULL; + struct VirtualI3cCntlr *virtual = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return; + } + + ret = drsOps->GetUint16(node, "busId", (uint16_t *)&busId, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read busId fail!", __func__); + return; + } + + cntlr = I3cCntlrGet(busId); + if (cntlr != NULL && cntlr->priv == node) { + I3cCntlrPut(cntlr); + I3cCntlrRemove(cntlr); + virtual = (struct VirtualI3cCntlr *)cntlr; + (void)OsalSpinDestroy(&virtual->spin); + OsalMemFree(virtual); + } + return; +} + +static void VirtualI3cRelease(struct HdfDeviceObject *device) +{ + const struct DeviceResourceNode *childNode = NULL; + + HDF_LOGI("%s: enter", __func__); + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return; + } + + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + VirtualI3cRemoveByNode(childNode); + } +} + +struct HdfDriverEntry g_i3cDriverEntry = { + .moduleVersion = 1, + .Init = VirtualI3cInit, + .Release = VirtualI3cRelease, + .moduleName = "virtual_i3c_driver", +}; +HDF_INIT(g_i3cDriverEntry); -- Gitee From bf4716c596dbd2906e26f5c811d8deabfa6e6cc1 Mon Sep 17 00:00:00 2001 From: xu <189278427@qq.com> Date: Mon, 1 Nov 2021 16:53:51 +0800 Subject: [PATCH 124/272] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E8=BF=91?= =?UTF-8?q?=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu <189278427@qq.com> --- .../chipset/proximity/proximity_apds9960.c | 200 ++++++++++++++++++ .../chipset/proximity/proximity_apds9960.h | 28 +++ .../proximity/sensor_proximity_driver.c | 2 +- .../proximity/sensor_proximity_driver.h | 5 +- 4 files changed, 231 insertions(+), 4 deletions(-) create mode 100644 model/sensor/driver/chipset/proximity/proximity_apds9960.c create mode 100644 model/sensor/driver/chipset/proximity/proximity_apds9960.h diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.c b/model/sensor/driver/chipset/proximity/proximity_apds9960.c new file mode 100644 index 000000000..d7869fbcf --- /dev/null +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.c @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "proximity_apds9960.h" +#include +#include "osal_mem.h" +#include "osal_time.h" +#include "sensor_config_controller.h" +#include "sensor_device_manager.h" +#include "sensor_proximity_driver.h" + +#define HDF_LOG_TAG proximity_apds9960_c + + +static struct Apds9960DrvData *g_apds9960DrvData = NULL; + +struct Apds9960DrvData *Apds9960GetDrvData(void) +{ + return g_apds9960DrvData; +} + +/* IO config for int-pin and I2C-pin */ +#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c +#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 +#define SENSOR_I2C_REG_CFG 0x403 + +static int32_t ReadApds9960RawData(struct SensorCfgData *data, struct ProximityData *rawData, int64_t *timestamp) +{ + uint8_t tmp; + uint8_t ldata; + OsalTimespec time; + + (void)memset_s(&time, sizeof(time), 0, sizeof(time)); + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return HDF_FAILURE; + } + *timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; /* unit nanosecond */ + + int32_t ret = ReadSensor(&data->busCfg, APDS9960_PROXIMITY_DATA_ADDR, &tmp, sizeof(uint8_t)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); + + if (tmp <= APDS9960_PROXIMITY_THRESHOLD) { + rawData->stateFlag = 5; //near state + } else { + rawData->stateFlag = 0; //far state + } + return ret; +} + +int32_t ReadApds9960Data(struct SensorCfgData *data) +{ + int32_t ret; + struct ProximityData rawData = { 5 }; + struct SensorReportEvent event; + + (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + + ret = ReadApds9960RawData(data, &rawData, &event.timestamp); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + + event.sensorId = SENSOR_TAG_PROXIMITY; + event.option = 0; + event.mode = SENSOR_WORK_MODE_ON_CHANGE; + event.dataLen = sizeof(rawData); + event.data = (uint8_t *)&rawData; + ret = ReportSensorEvent(&event); + + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: APDS9960 report data failed", __func__); + } + + return ret; +} + +static int32_t InitApda9960(struct SensorCfgData *data) +{ + int32_t ret; + + CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); + ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: APDS9960 sensor init config failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t InitProximityPreConfig(void) +{ + if (SetSensorPinMux(SENSOR_I2C6_DATA_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Data write mux pin failed", __func__); + return HDF_FAILURE; + } + if (SetSensorPinMux(SENSOR_I2C6_CLK_REG_ADDR, SENSOR_ADDR_WIDTH_4_BYTE, SENSOR_I2C_REG_CFG) != HDF_SUCCESS) { + HDF_LOGE("%s: Clk write mux pin failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t DispatchApds9960(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t Apds9960BindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct Apds9960DrvData *drvData = (struct Apds9960DrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc Apds9960 drv data fail", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchApds9960; + drvData->device = device; + device->service = &drvData->ioService; + g_apds9960DrvData = drvData; + + return HDF_SUCCESS; +} + +int32_t Apds996InitDriver(struct HdfDeviceObject *device) +{ + int32_t ret; + struct ProximityOpsCall ops; + + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Apds9960DrvData *drvData = (struct Apds9960DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + ret = InitProximityPreConfig(); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init APDS9960 bus mux config", __func__); + return HDF_FAILURE; + } + + drvData->sensorCfg = ProximityCreateCfgData(device->property); + if (drvData->sensorCfg == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + ops.Init = NULL; + ops.ReadData = ReadApds9960Data; + ret = ProximityRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register APDS9960 proximity failed", __func__); + return HDF_FAILURE; + } + + ret = InitApda9960(drvData->sensorCfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Init APDS9960 proximity failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + + +void Apds996ReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct Apds9960DrvData *drvData = (struct Apds9960DrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + ProximityReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_proximityApds9960DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_PROXIMITY_APDS9960", + .Bind = Apds9960BindDriver, + .Init = Apds996InitDriver, + .Release = Apds996ReleaseDriver, +}; + +HDF_INIT(g_proximityApds9960DevEntry); \ No newline at end of file diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.h b/model/sensor/driver/chipset/proximity/proximity_apds9960.h new file mode 100644 index 000000000..080cd7258 --- /dev/null +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef PROXIMITY_APDS9960_H +#define PROXIMITY_APDS9960_H + +#include "sensor_config_parser.h" +#include "sensor_proximity_driver.h" + +#define APDS9960_PROXIMITY_DATA_ADDR 0X9C // Proximity Data + +#define APDS9960_PROXIMITY_THRESHOLD 7 // threshold + +int32_t DetectProximityApds9960Chip(struct SensorCfgData *data); +int32_t ReadApds9960Data(struct SensorCfgData *data); + +struct Apds9960DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + +#endif /* PROXIMITY_APDS9960_H */ \ No newline at end of file diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.c b/model/sensor/driver/proximity/sensor_proximity_driver.c index 9b2c6f574..14de57291 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.c +++ b/model/sensor/driver/proximity/sensor_proximity_driver.c @@ -88,8 +88,8 @@ static int32_t InitProximityData(struct ProximityDrvData *drvData) } drvData->interval = SENSOR_TIMER_MIN_TIME; - drvData->initStatus = true; drvData->enable = false; + drvData->detectFlag = false; return HDF_SUCCESS; } diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.h b/model/sensor/driver/proximity/sensor_proximity_driver.h index cbd8b5c52..0f272de56 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.h +++ b/model/sensor/driver/proximity/sensor_proximity_driver.h @@ -15,11 +15,10 @@ #include "sensor_platform_if.h" #define PROXIMITY_DEFAULT_SAMPLING_200_MS 200000000 -#define PROXIMITY_CHIP_NAME_STK3338 "stk3338" +#define PROXIMITY_CHIP_NAME_APDS9960 "apds9960" struct ProximityData { - int16_t data; - uint8_t stateFlag; + uint32_t stateFlag; }; struct ProximityOpsCall { -- Gitee From e75c4bca0ab5427fcf2e3a64a58d37814ad82f61 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Tue, 2 Nov 2021 10:51:35 +0800 Subject: [PATCH 125/272] modify hall code Signed-off-by: jifengfei --- model/sensor/driver/hall/sensor_hall_driver.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 84ad79b2f..61b2bbe0b 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -41,7 +41,7 @@ int32_t HallRegisterChipOps(const struct HallOpsCall *ops) return HDF_SUCCESS; } -void ReadGpioData(struct SensorCfgData *data) +void ReadGpioData() { int32_t ret; uint16_t tmp; @@ -51,8 +51,6 @@ void ReadGpioData(struct SensorCfgData *data) struct HallDrvData *drvData = HallGetDrvData(); CHECK_NULL_PTR_RETURN(drvData); - CHECK_NULL_PTR_RETURN(data); - (void)memset_s(&event, sizeof(event), 0, sizeof(event)); (void)memset_s(&time, sizeof(time), 0, sizeof(time)); if (OsalGetTime(&time) != HDF_SUCCESS) { @@ -83,7 +81,7 @@ static void HallDataWorkEntry(void *arg) CHECK_NULL_PTR_RETURN(drvData); if (drvData->ops.ReadData == NULL) { - ReadGpioData(drvData->hallCfg); + ReadGpioData(); HDF_LOGI("%s: Hall ReadData function NULL", __func__); } else if (drvData->ops.ReadData(drvData->hallCfg) != HDF_SUCCESS) { HDF_LOGE("%s: Hall read data failed", __func__); @@ -104,9 +102,9 @@ static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) HDF_LOGE("%s: Read hall gpio value failed", __func__); } if (valRead == GPIO_VAL_LOW) { - drvData->status = 0; - } else if(valRead == GPIO_VAL_HIGH) { drvData->status = 1; + } else if(valRead == GPIO_VAL_HIGH) { + drvData->status = 0; } if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { @@ -130,9 +128,9 @@ static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) HDF_LOGE("%s: Read hall gpio value failed", __func__); } if (valRead == GPIO_VAL_LOW) { - drvData->status = 0; - } else if(valRead == GPIO_VAL_HIGH) { drvData->status = 1; + } else if(valRead == GPIO_VAL_HIGH) { + drvData->status = 0; } if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { @@ -174,7 +172,6 @@ static int32_t SetHallEnable(void) } mode = OSAL_IRQF_TRIGGER_RISING | OSAL_IRQF_TRIGGER_FALLING; - HDF_LOGE("%s: mode:%0x\n", __func__, mode); if (drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1] >= 0) { ret = GpioSetIrq(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1], mode, HallNorthPolarityIrqFunc, drvData); @@ -456,4 +453,4 @@ struct HdfDriverEntry g_sensorHallDevEntry = { .Release = HallReleaseDriver, }; -HDF_INIT(g_sensorHallDevEntry); +HDF_INIT(g_sensorHallDevEntry); \ No newline at end of file -- Gitee From 9f626e2e8c4a7fefe7e75f191f1168e393d39377 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Tue, 2 Nov 2021 03:32:31 +0000 Subject: [PATCH 126/272] update audio code Signed-off-by: vb6174 --- include/audio/audio_accessory_if.h | 4 +- include/audio/audio_codec_if.h | 19 +- include/audio/audio_dai_if.h | 20 +- include/audio/audio_platform_if.h | 90 +- .../common/include/audio_accessory_base.h | 36 +- model/audio/common/include/audio_codec_base.h | 12 +- model/audio/common/include/audio_dai_base.h | 33 + model/audio/common/include/audio_dma_base.h | 37 + model/audio/common/include/audio_driver_log.h | 105 ++ model/audio/common/include/audio_dsp_base.h | 38 + .../common/include/audio_platform_base.h | 29 +- model/audio/common/src/audio_accessory_base.c | 352 +++++- model/audio/common/src/audio_codec_base.c | 300 +++-- model/audio/common/src/audio_dai_base.c | 114 ++ model/audio/common/src/audio_dma_base.c | 83 ++ model/audio/common/src/audio_dsp_base.c | 383 ++++++ model/audio/common/src/audio_platform_base.c | 1099 ++++++++++++++++- model/audio/core/include/audio_control.h | 1 + model/audio/core/include/audio_core.h | 49 +- model/audio/core/include/audio_host.h | 80 +- model/audio/core/include/audio_parse.h | 76 ++ model/audio/core/src/audio_core.c | 331 ++--- model/audio/core/src/audio_host.c | 21 +- model/audio/core/src/audio_parse.c | 431 +++++++ .../test/unittest/common/audio_common_test.h | 10 - .../test/unittest/common/audio_core_test.cpp | 60 - .../dispatch/include/audio_stream_dispatch.h | 7 +- .../dispatch/src/audio_control_dispatch.c | 10 +- .../dispatch/src/audio_stream_dispatch.c | 522 +++++--- model/audio/sapm/include/audio_sapm.h | 5 + model/audio/sapm/src/audio_sapm.c | 130 +- .../model/audio/include/audio_core_test.h | 31 +- .../model/audio/include/audio_host_test.h | 1 - .../model/audio/include/hdf_audio_test.h | 43 +- .../model/audio/src/audio_core_test.c | 379 ++++-- .../model/audio/src/audio_host_test.c | 27 +- .../model/audio/src/audio_parse_test.c | 18 +- .../audio/src/audio_stream_dispatch_test.c | 11 - .../unittest/model/audio/src/hdf_audio_test.c | 35 +- 39 files changed, 4032 insertions(+), 1000 deletions(-) create mode 100644 model/audio/common/include/audio_dai_base.h create mode 100644 model/audio/common/include/audio_dma_base.h create mode 100644 model/audio/common/include/audio_driver_log.h create mode 100644 model/audio/common/include/audio_dsp_base.h create mode 100644 model/audio/common/src/audio_dai_base.c create mode 100644 model/audio/common/src/audio_dma_base.c create mode 100644 model/audio/common/src/audio_dsp_base.c diff --git a/include/audio/audio_accessory_if.h b/include/audio/audio_accessory_if.h index a86532d2d..bd753a630 100755 --- a/include/audio/audio_accessory_if.h +++ b/include/audio/audio_accessory_if.h @@ -46,11 +46,9 @@ struct AccessoryData { int32_t (*Init)(struct AudioCard *, const struct AccessoryDevice *device); int32_t (*Read)(const struct AccessoryDevice *, uint32_t, uint32_t *); int32_t (*Write)(const struct AccessoryDevice *, uint32_t, uint32_t); - int32_t (*AiaoRead)(const struct AccessoryDevice *, uint32_t, uint32_t *); - int32_t (*AiaoWrite)(const struct AccessoryDevice *, uint32_t, uint32_t); - const struct AudioKcontrol *controls; int numControls; + struct AudioRegCfgData* regConfig; }; #ifdef __cplusplus diff --git a/include/audio/audio_codec_if.h b/include/audio/audio_codec_if.h index d0636abb4..d18d99da6 100755 --- a/include/audio/audio_codec_if.h +++ b/include/audio/audio_codec_if.h @@ -26,11 +26,6 @@ extern "C" { #define AUDIODRV_CTL_ELEM_IFACE_PGA 5 /* PGA device */ #define AUDIODRV_CTL_ELEM_IFACE_AIAO 6 /* AIAO device */ -struct VirtualAddress { - unsigned long acodecVir; - unsigned long aiaoVir; -}; - struct CodecDevice { const char *devCodecName; struct CodecData *devData; @@ -44,16 +39,17 @@ struct CodecData { const char *drvCodecName; /* Codec driver callbacks */ int32_t (*Init)(struct AudioCard *, struct CodecDevice *); - int32_t (*Read)(const struct CodecDevice *, uint32_t, uint32_t *); - int32_t (*Write)(const struct CodecDevice *, uint32_t, uint32_t); - int32_t (*AiaoRead)(const struct CodecDevice *, uint32_t, uint32_t *); - int32_t (*AiaoWrite)(const struct CodecDevice *, uint32_t, uint32_t); - const struct AudioKcontrol *controls; + int32_t (*Read)(unsigned long, uint32_t, uint32_t *); + int32_t (*Write)(unsigned long, uint32_t, uint32_t); + struct AudioKcontrol *controls; int numControls; - const struct AudioSapmComponent *sapmComponents; + struct AudioSapmComponent *sapmComponents; int numSapmComponent; const struct AudioSapmRoute *sapmRoutes; int numSapmRoutes; + unsigned long virtualAddress; // IoRemap Address + struct AudioRegCfgData *regConfig; + struct AudioRegCfgGroupNode **regCfgGroup; }; /* Codec host is defined in codec driver */ @@ -75,6 +71,7 @@ enum AudioRegParams { INTERNALLY_CODEC_ENABLE, RENDER_CHANNEL_MODE, CAPTRUE_CHANNEL_MODE, + S_NORMAL_AP01_P_HIFI, }; enum SapmRegParams { diff --git a/include/audio/audio_dai_if.h b/include/audio/audio_dai_if.h index f6e756edf..603e938a5 100755 --- a/include/audio/audio_dai_if.h +++ b/include/audio/audio_dai_if.h @@ -15,6 +15,10 @@ extern "C" { #endif #endif /* __cplusplus */ +#include "audio_host.h" +#include "audio_parse.h" +#include "audio_control.h" + struct DaiDevice { const char *devDaiName; struct DaiData *devData; @@ -24,16 +28,27 @@ struct DaiDevice { struct AudioDaiOps { int32_t (*Startup)(const struct AudioCard *, const struct DaiDevice *); - int32_t (*HwParams)(const struct AudioCard *, const struct AudioPcmHwParams *, const struct DaiDevice *); + int32_t (*HwParams)(const struct AudioCard *, const struct AudioPcmHwParams *); int32_t (*Trigger)(const struct AudioCard *, int, const struct DaiDevice *); }; struct DaiData { const char *drvDaiName; /* DAI driver callbacks */ - int32_t (*DaiInit)(const struct AudioCard *, const struct DaiDevice *); + int32_t (*DaiInit)(struct AudioCard *, const struct DaiDevice *); + int32_t (*Read)(unsigned long, uint32_t, uint32_t *); + int32_t (*Write)(unsigned long, uint32_t, uint32_t); /* ops */ const struct AudioDaiOps *ops; + /* DAI DMA data */ + struct PcmInfo pcmInfo; + struct AudioKcontrol *controls; + int numControls; + bool daiInitFlag; + uint32_t regDaiBase; + struct AudioRegCfgData *regConfig; + struct AudioRegCfgGroupNode **regCfgGroup; + struct OsalMutex mutex; }; /* Dai host is defined in dai driver */ @@ -41,7 +56,6 @@ struct DaiHost { struct IDeviceIoService service; struct HdfDeviceObject *device; void *priv; - bool daiInitFlag; }; #ifdef __cplusplus diff --git a/include/audio/audio_platform_if.h b/include/audio/audio_platform_if.h index c2cc766b8..586a57cd9 100755 --- a/include/audio/audio_platform_if.h +++ b/include/audio/audio_platform_if.h @@ -44,6 +44,12 @@ extern "C" { #define GPIO_BASE_ADDR 0x120D0000 #define BASE_ADDR_REMAP_SIZE 0x10000 +enum PcmStatus { + PCM_STOP = 0, + PCM_PAUSE, + PCM_START, +}; + struct CircleBufInfo { uint32_t cirBufSize; uint32_t trafBufSize; @@ -54,48 +60,47 @@ struct CircleBufInfo { uint32_t *virtAddr; uint32_t wbufOffSet; uint32_t wptrOffSet; - uint32_t runStatus; + uint32_t rbufOffSet; + uint32_t rptrOffSet; + enum PcmStatus runStatus; uint32_t chnId; uint32_t enable; struct OsalMutex buffMutex; - uint64_t framesPosition; + uint32_t framesPosition; + uint32_t pointer; + uint32_t periodsMax; + uint32_t periodsMin; + uint32_t cirBufMax; + uint32_t curTrafSize; }; -struct PcmInfo { - /* The number of channels in a frame */ - uint32_t channels; - /* The number of frames per second */ - uint32_t rate; - uint32_t bitWidth; - uint32_t frameSize; - bool isBigEndian; - bool isSignedData; - uint32_t startThreshold; - uint32_t stopThreshold; - uint32_t silenceThreshold; - uint32_t totalStreamSize; +struct PlatformData { + const char *drvPlatformName; + /* platform driver callbacks */ + int32_t (*PlatformInit)(const struct AudioCard *, const struct PlatformDevice *); + /* platform stream ops */ + struct AudioDmaOps *ops; + struct CircleBufInfo renderBufInfo; + struct CircleBufInfo captureBufInfo; + struct PcmInfo pcmInfo; + bool platformInitFlag; + struct AudioMmapData mmapData; + uint32_t mmapLoopCount; + void *dmaPrv; }; -/* platform related definitions */ -struct AudioPlatformOps { - int32_t (*HwParams)(const struct AudioCard *, const struct AudioPcmHwParams *); - int32_t (*RenderTrigger)(struct AudioCard *, int); - int32_t (*CaptureTrigger)(struct AudioCard *, int); - uint32_t (*Pointer)(struct AudioCard *); - int32_t (*Write)(const struct AudioCard *, struct AudioTxData *); - int32_t (*Read)(const struct AudioCard *, struct AudioRxData *); - int32_t (*MmapWrite)(const struct AudioCard *, const struct AudioTxMmapData *); - int32_t (*MmapRead)(const struct AudioCard *, const struct AudioRxMmapData *); - int32_t (*RenderPrepare)(const struct AudioCard *); - int32_t (*CapturePrepare)(const struct AudioCard *); - int32_t (*RenderStart)(struct AudioCard *); - int32_t (*CaptureStart)(struct AudioCard *); - int32_t (*RenderStop)(struct AudioCard *); - int32_t (*CaptureStop)(struct AudioCard *); - int32_t (*RenderPause)(struct AudioCard *); - int32_t (*CapturePause)(struct AudioCard *); - int32_t (*RenderResume)(struct AudioCard *); - int32_t (*CaptureResume)(struct AudioCard *); +/* dma related definitions */ +struct AudioDmaOps { + int32_t (*DmaBufAlloc)(struct PlatformData *, enum AudioStreamType); + int32_t (*DmaBufFree)(struct PlatformData *, enum AudioStreamType); + int32_t (*DmaRequestChannel)(struct PlatformData *); + int32_t (*DmaConfigChannel)(struct PlatformData *); + int32_t (*DmaPrep)(struct PlatformData *); + int32_t (*DmaSubmit)(struct PlatformData *); + int32_t (*DmaPending)(struct PlatformData *); + int32_t (*DmaPause)(struct PlatformData *); + int32_t (*DmaResume)(struct PlatformData *); + int32_t (*DmaPointer)(struct PlatformData *, uint32_t *); }; struct PlatformDevice { @@ -105,26 +110,11 @@ struct PlatformDevice { struct DListHead list; }; -struct PlatformData { - const char *drvPlatformName; - /* platform driver callbacks */ - int32_t (*PlatformInit)(const struct AudioCard *, const struct PlatformDevice *); - /* pcm creation and destruction */ - int32_t (*PcmNew)(struct PlatformDevice *); - void (*PcmFree)(struct PlatformDevice *); - /* platform stream ops */ - struct AudioPlatformOps *ops; -}; - /* Platform host is defined in platform driver */ struct PlatformHost { struct IDeviceIoService service; struct HdfDeviceObject *device; void *priv; - bool platformInitFlag; - struct CircleBufInfo renderBufInfo; - struct CircleBufInfo captureBufInfo; - struct PcmInfo pcmInfo; }; static inline struct PlatformHost *PlatformHostFromDevice(struct HdfDeviceObject *device) diff --git a/model/audio/common/include/audio_accessory_base.h b/model/audio/common/include/audio_accessory_base.h index ab0f94a06..e52b5b5b0 100755 --- a/model/audio/common/include/audio_accessory_base.h +++ b/model/audio/common/include/audio_accessory_base.h @@ -8,9 +8,12 @@ #ifndef AUDIO_ACCESSORY_BASE_H #define AUDIO_ACCESSORY_BASE_H - +#include "audio_core.h" #include "audio_host.h" +#include "audio_sapm.h" +#include "audio_parse.h" #include "audio_control.h" +#include "audio_platform_base.h" #ifdef __cplusplus #if __cplusplus @@ -48,17 +51,30 @@ enum I2sFrequencyRegVal { I2S_SAMPLE_FREQUENCY_REG_VAL_96000 = 0xB /* 96kHz sample_rate */ }; -enum I2sFormatRegVal { - I2S_SAMPLE_FORMAT_REG_VAL_MSB_24 = 0x2, /* MSB-justified data up to 24 bits */ - I2S_SAMPLE_FORMAT_REG_VAL_24 = 0x3, /* I2S data up to 24 bits */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_16 = 0x4, /* LSB-justified 16-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_18 = 0x5, /* LSB-justified 18-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_20 = 0x6, /* LSB-justified 20-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_24 = 0x7, /* LSB-justified 24-bit data */ +struct AccessoryTransferData { + uint16_t i2cDevAddr; + uint16_t i2cBusNumber; + uint32_t accessoryCfgCtrlCount; + struct AudioRegCfgGroupNode **accessoryRegCfgGroupNode; + struct AudioKcontrol *accessoryControls; +}; + +struct DaiParamsVal { + uint32_t frequencyVal; + uint32_t formatVal; + uint32_t channelVal; }; -int32_t FormatToBitWidth(enum AudioFormat format, uint16_t *bitWidth); -int32_t RateToFrequency(uint32_t rate, uint16_t *freq); +int32_t AccessoryI2cReadWrite(struct AudioAddrConfig *regAttr, uint16_t rwFlag); +int32_t AccessoryRegBitsRead(struct AudioMixerControl *regAttr, uint32_t *regValue); +int32_t AccessoryRegBitsUpdate(struct AudioMixerControl regAttr); + +int32_t AcessoryDeviceFrequencyParse(uint32_t rate, uint16_t *freq); +int32_t AccessoryDaiParamsUpdate(struct DaiParamsVal daiParamsVal); +int32_t AccessoryDeviceCfgGet(struct AccessoryData *data, struct AccessoryTransferData *transferData); +int32_t AccessoryDeviceCtrlRegInit(void); +int32_t AccessoryDeviceRegRead(const struct AccessoryDevice *codec, uint32_t reg, uint32_t *value); +int32_t AccessoryDeviceRegWrite(const struct AccessoryDevice *codec, uint32_t reg, uint32_t value); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/include/audio_codec_base.h b/model/audio/common/include/audio_codec_base.h index f4d5bf3b3..712a2b73e 100755 --- a/model/audio/common/include/audio_codec_base.h +++ b/model/audio/common/include/audio_codec_base.h @@ -19,12 +19,16 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t CodecDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *value); -int32_t CodecDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t value); -int32_t CodecAiaoDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *value); -int32_t CodecAiaoDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t value); +int32_t CodecDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *value); +int32_t CodecDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value); int32_t CodecGetServiceName(const struct HdfDeviceObject *device, const char **drvCodecName); int32_t CodecGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); +int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecData *codecData); +int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData); +int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl); + + +int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *codecData); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/include/audio_dai_base.h b/model/audio/common/include/audio_dai_base.h new file mode 100644 index 000000000..cf70a793c --- /dev/null +++ b/model/audio/common/include/audio_dai_base.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DAI_BASE_H +#define AUDIO_DAI_BASE_H + +#include "audio_codec_if.h" +#include "audio_core.h" +#include "osal_io.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct DaiData *DaiDataFromCard(const struct AudioCard *card); +int32_t DaiGetConfigInfo(const struct HdfDeviceObject *device, struct DaiData *data); +int32_t DaiCheckSampleRate(unsigned int sampleRates); +int32_t DaiSetConfigInfo(struct DaiData *data); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/model/audio/common/include/audio_dma_base.h b/model/audio/common/include/audio_dma_base.h new file mode 100644 index 000000000..8bd5013d8 --- /dev/null +++ b/model/audio/common/include/audio_dma_base.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DMA_BASE_H +#define AUDIO_DMA_BASE_H + +#include "audio_host.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t AudioDmaBufAlloc(struct PlatformData *data, enum AudioStreamType streamType); +int32_t AudioDmaBufFree(struct PlatformData *data, enum AudioStreamType streamType); +int32_t AudioDmaRequestChannel(struct PlatformData *data); +int32_t AudioDmaConfigChannel(struct PlatformData *data); +int32_t AudioDmaPrep(struct PlatformData *data); +int32_t AudioDmaSubmit(struct PlatformData *data); +int32_t AudioDmaPending(struct PlatformData *data); +int32_t AudioDmaPause(struct PlatformData *data); +int32_t AudioDmaResume(struct PlatformData *data); +int32_t AudioDmaPointer(struct PlatformData *data, uint32_t *pointer); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif diff --git a/model/audio/common/include/audio_driver_log.h b/model/audio/common/include/audio_driver_log.h new file mode 100644 index 000000000..73ccacc24 --- /dev/null +++ b/model/audio/common/include/audio_driver_log.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DRIVER_LOG_H +#define AUDIO_DRIVER_LOG_H +#include "hdf_log.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +// 1 is on; 0 is off +#define AUDIO_ADM_DEBUG_ON 0 +#define AUDIO_DRIVER_DEBUG_ON 0 +#define AUDIO_DEVICE_DEBUG_ON 0 + +// audio ADM log define +#ifdef __LITEOS__ +#define ADM_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#elif AUDIO_ADM_DEBUG_ON +#define ADM_LOG_DEBUG(fmt, arg...) do { \ + HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) +#else +#define ADM_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#endif + +#define ADM_LOG_ERR(fmt, arg...) do { \ + HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define ADM_LOG_INFO(fmt, arg...) do { \ + HDF_LOGI("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define ADM_LOG_WARNING(fmt, arg...) do { \ + HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +// audio driver log define +#ifdef __LITEOS__ +#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#elif AUDIO_DRIVER_DEBUG_ON +#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ + HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) +#else +#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#endif + +#define AUDIO_DRIVER_LOG_ERR(fmt, arg...) do { \ + HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define AUDIO_DRIVER_LOG_INFO(fmt, arg...) do { \ + HDF_LOGI("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define AUDIO_DRIVER_LOG_WARNING(fmt, arg...) do { \ + HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +// audio device log define +#ifdef __LITEOS__ +#define AUDIO_DEVICE_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#elif AUDIO_DEVICE_DEBUG_ON +#define AUDIO_DEVICE_LOG_DEBUG(fmt, arg...) do { \ + HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) +#else +#define AUDIO_DEVICE_LOG_DEBUG(fmt, arg...) do { \ + } while (0) +#endif + +#define AUDIO_DEVICE_LOG_ERR(fmt, arg...) do { \ + HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define AUDIO_DEVICE_LOG_INFO(fmt, arg...) do { \ + HDF_LOGI("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#define AUDIO_DEVICE_LOG_WARNING(fmt, arg...) do { \ + HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ + } while (0) + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_DRIVER_LOG_H */ diff --git a/model/audio/common/include/audio_dsp_base.h b/model/audio/common/include/audio_dsp_base.h new file mode 100644 index 000000000..535cffdd0 --- /dev/null +++ b/model/audio/common/include/audio_dsp_base.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DSP_BASE_H +#define AUDIO_DSP_BASE_H + +#include "audio_host.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t DspGetServiceName(const struct HdfDeviceObject *device, const char **drvDspName); +int32_t DspGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); +int32_t DspLinkDeviceInit(struct AudioCard *card, const struct DaiDevice *device); +int32_t DspDeviceInit(const struct DspDevice *device); +int32_t DspDeviceReadReg(const struct DspDevice *device, uint8_t *buf, uint32_t len); +int32_t DspDeviceWriteReg(const struct DspDevice *device, uint8_t *buf, uint32_t len); +int32_t DspLinkStartup(const struct AudioCard *card, const struct DaiDevice *device); +int32_t DspLinkHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param); +int32_t DspDecodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); +int32_t DspEncodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); +int32_t DspEqualizerActive(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_DSP_BASE_H */ diff --git a/model/audio/common/include/audio_platform_base.h b/model/audio/common/include/audio_platform_base.h index 72a9608c0..0a6215ccd 100755 --- a/model/audio/common/include/audio_platform_base.h +++ b/model/audio/common/include/audio_platform_base.h @@ -18,6 +18,10 @@ extern "C" { #endif #endif /* __cplusplus */ +#define MIN_PERIOD_SIZE 4096 +#define BITSTOBYTE 8 +#define MAX_BUFF_SIZE (64 * 1024) + enum DataBitWidth { DATA_BIT_WIDTH8 = 8, /* 8 bit witdth */ DATA_BIT_WIDTH16 = 16, /* 16 bit witdth */ @@ -27,9 +31,30 @@ enum DataBitWidth { DATA_BIT_WIDTH32 = 32, /* 32 bit witdth */ }; -struct PlatformData *PlatformDataFromDevice(const struct AudioCard *card); -int32_t PlatformCreatePlatformHost(const struct AudioCard *card, struct PlatformHost **platformHost); +unsigned int SysReadl(unsigned long addr); +void SysWritel(unsigned long addr, unsigned int value); + +struct PlatformData *PlatformDataFromCard(const struct AudioCard *card); +uint32_t AudioBytesToFrames(uint32_t frameBits, uint32_t size); int32_t AudioDataBigEndianChange(char *srcData, uint32_t audioLen, enum DataBitWidth bitWidth); +int32_t AudioFramatToBitWidth(enum AudioFormat format, unsigned int *bitWidth); +int32_t AudioSetPcmInfo(struct PlatformData *platformData, const struct AudioPcmHwParams *param); +int32_t AudioSetRenderBufInfo(struct PlatformData *data, const struct AudioPcmHwParams *param); +int32_t AudioSetCaptureBufInfo(struct PlatformData *data, const struct AudioPcmHwParams *param); +int32_t AudioPcmWrite(const struct AudioCard *card, struct AudioTxData *txData); +int32_t AudioPcmRead(const struct AudioCard *card, struct AudioRxData *rxData); +int32_t AudioPcmMmapWrite(const struct AudioCard *card, const struct AudioMmapData *txMmapData); +int32_t AudioPcmMmapRead(const struct AudioCard *card, const struct AudioMmapData *rxMmapData); +int32_t AudioRenderOpen(const struct AudioCard *card); +int32_t AudioCaptureOpen(const struct AudioCard *card); +int32_t AudioRenderClose(const struct AudioCard *card); +int32_t AudioPcmPointer(const struct AudioCard *card, uint32_t *pointer); +int32_t AudioCaptureClose(const struct AudioCard *card); +int32_t AudioHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param); +int32_t AudioRenderPrepare(const struct AudioCard *card); +int32_t AudioCapturePrepare(const struct AudioCard *card); +int32_t AudioRenderTrigger(struct AudioCard *card, int cmd); +int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index aa0773774..0c02a7366 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -7,32 +7,244 @@ */ #include "audio_accessory_base.h" -#include "audio_core.h" +#include "audio_driver_log.h" +#include "osal_time.h" +#include "i2c_if.h" -#define HDF_LOG_TAG audio_accessory_base +#define HDF_LOG_TAG "audio_accessory_base" -int32_t FormatToBitWidth(enum AudioFormat format, uint16_t *bitWidth) +#define COMM_SHIFT_8BIT (8) +#define COMM_MASK_FF (0xFF) +#define COMM_WAIT_TIMES (10) // ms + +#define I2C_REG_LEN (1) +#define I2C_REG_MSGLEN (3) +#define I2C_MSG_NUM (2) +#define I2C_MSG_BUF_SIZE (2) + +uint16_t g_i2cDevAddr, g_i2cBusNumber; +struct AudioRegCfgGroupNode **g_audioRegCfgGroupNode = NULL; +struct AudioKcontrol *g_audioControls = NULL; + +/* + * release I2C object public function + */ +static void AccessoryI2cRelease(struct I2cMsg *msgs, int16_t msgSize, DevHandle i2cHandle) { - if (bitWidth == NULL) { - AUDIO_DRIVER_LOG_ERR("input param is NULL"); + if (msgs != NULL) { + if (msgSize == 0 && msgs->buf != NULL) { + OsalMemFree(msgs->buf); + msgs->buf = NULL; + } else if (msgSize == 1 && msgs[0].buf != NULL) { + OsalMemFree(msgs[0].buf); + msgs[0].buf = NULL; + } else if (msgSize >= I2C_MSG_NUM) { + if (msgs[0].buf != NULL) { + msgs[0].buf = NULL; + } + if (msgs[1].buf != NULL) { + OsalMemFree(msgs[1].buf); + msgs[1].buf = NULL; + } + } + AUDIO_DRIVER_LOG_DEBUG("OsalMemFree msgBuf success.\n"); + } + // close i2c device + if (i2cHandle != NULL) { + I2cClose(i2cHandle); + i2cHandle = NULL; + AUDIO_DRIVER_LOG_DEBUG("I2cClose success.\n"); + } +} + +static int32_t AccessoryI2cMsgFill(const struct AudioAddrConfig *regAttr, uint16_t rwFlag, + uint8_t *regs, struct I2cMsg *msgs) +{ + uint8_t *msgBuf = NULL; + if (rwFlag != 0 && rwFlag != I2C_FLAG_READ) { + AUDIO_DRIVER_LOG_ERR("invalid rwFlag value: %d.", rwFlag); + return HDF_ERR_INVALID_PARAM; + } + regs[0] = regAttr->addr; + msgs[0].addr = g_i2cDevAddr; + msgs[0].flags = 0; + msgs[0].len = I2C_REG_MSGLEN; + AUDIO_DRIVER_LOG_DEBUG("msgs[0].addr=0x%02x, regs[0]=0x%02x.", msgs[0].addr, regs[0]); + if (rwFlag == 0) { // write + // S 11011A2A1 0 A ADDR A MS1 A LS1 A <....> P + msgBuf = OsalMemCalloc(I2C_REG_MSGLEN); + if (msgBuf == NULL) { + AUDIO_DRIVER_LOG_ERR("[write]: malloc buf failed!"); + return HDF_ERR_MALLOC_FAIL; + } + msgBuf[0] = regs[0]; + msgBuf[1] = (uint8_t)(regAttr->value >> COMM_SHIFT_8BIT); // High 8 bit + msgBuf[I2C_MSG_BUF_SIZE] = (uint8_t)(regAttr->value & COMM_MASK_FF); // Low 8 bit + msgs[0].buf = msgBuf; + AUDIO_DRIVER_LOG_DEBUG("msgBuf[1]=0x%02x.", msgBuf[1]); + AUDIO_DRIVER_LOG_DEBUG("msgBuf[2]=0x%02x.", msgBuf[I2C_MSG_BUF_SIZE]); + } else { + // S 11011A2A1 0 A ADDR A Sr 11011A2A1 1 A MS1 A LS1 A <....> NA P + msgBuf = OsalMemCalloc(I2C_MSG_NUM); + if (msgBuf == NULL) { + AUDIO_DRIVER_LOG_ERR("[read]: malloc buf failed!"); + return HDF_ERR_MALLOC_FAIL; + } + msgs[0].len = 1; + msgs[0].buf = regs; + msgs[1].addr = g_i2cDevAddr; + msgs[1].flags = I2C_FLAG_READ; + msgs[1].len = I2C_MSG_NUM; + msgs[1].buf = msgBuf; + } + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +int32_t AccessoryI2cReadWrite(struct AudioAddrConfig *regAttr, uint16_t rwFlag) +{ + int32_t ret; + DevHandle i2cHandle; + int16_t transferMsgCount = 1; + uint8_t regs[I2C_REG_LEN]; + struct I2cMsg msgs[I2C_MSG_NUM]; + AUDIO_DRIVER_LOG_DEBUG("entry.\n"); + if (regAttr == NULL || rwFlag < 0 || rwFlag > 1) { + AUDIO_DRIVER_LOG_ERR("invalid parameter."); + return HDF_ERR_INVALID_PARAM; + } + i2cHandle = I2cOpen(g_i2cBusNumber); + if (i2cHandle == NULL) { + AUDIO_DRIVER_LOG_ERR("open i2cBus:%u failed! i2cHandle:%p", g_i2cBusNumber, i2cHandle); return HDF_FAILURE; } - // current set default format(standard) for 16/24 bit - switch (format) { - case AUDIO_FORMAT_PCM_16_BIT: - *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; - break; - case AUDIO_FORMAT_PCM_24_BIT: - *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; - break; - default: - AUDIO_DRIVER_LOG_ERR("format: %d is not support.", format); - return HDF_ERR_NOT_SUPPORT; + if (rwFlag == I2C_FLAG_READ) { + transferMsgCount = I2C_MSG_NUM; + } + ret = AccessoryI2cMsgFill(regAttr, rwFlag, regs, msgs); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AccessoryI2cMsgFill failed!"); + I2cClose(i2cHandle); + return HDF_FAILURE; + } + ret = I2cTransfer(i2cHandle, msgs, transferMsgCount); + if (ret != transferMsgCount) { + AUDIO_DRIVER_LOG_ERR("I2cTransfer err:%d", ret); + AccessoryI2cRelease(msgs, transferMsgCount, i2cHandle); + return HDF_FAILURE; + } + if (rwFlag == I2C_FLAG_READ) { + regAttr->value = (msgs[1].buf[0] << COMM_SHIFT_8BIT) | msgs[1].buf[1]; // result value 16 bit + AUDIO_DRIVER_LOG_DEBUG("[read]: regAttr->regValue=0x%04x.\n", regAttr->value); + } + AccessoryI2cRelease(msgs, transferMsgCount, i2cHandle); + return HDF_SUCCESS; +} + +// Read contrl reg bits value +int32_t AccessoryRegBitsRead(struct AudioMixerControl *regAttr, uint32_t *regValue) +{ + int32_t ret; + struct AudioAddrConfig regVal; + if (regAttr == NULL || regAttr->reg < 0) { + AUDIO_DRIVER_LOG_ERR("input invalid parameter."); + return HDF_ERR_INVALID_PARAM; + } + regVal.addr = regAttr->reg; + ret = AccessoryI2cReadWrite(®Val, I2C_FLAG_READ); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AccessoryRegBitsRead failed."); + return HDF_FAILURE; + } + *regValue = regVal.value; + regAttr->value = (regVal.value >> regAttr->shift) & regAttr->mask; + if (regAttr->value > regAttr->max || regAttr->value < regAttr->min) { + AUDIO_DRIVER_LOG_ERR("invalid bitsValue=0x%x", regAttr->value); + return HDF_FAILURE; + } + if (regAttr->invert) { + regAttr->value = regAttr->max - regAttr->value; + } + AUDIO_DRIVER_LOG_DEBUG("regAddr=0x%x, regValue=0x%x, currBitsValue=0x%x", + regAttr->reg, regVal.value,regAttr->value); + AUDIO_DRIVER_LOG_DEBUG("mask=0x%x, shift=%d, max=0x%x,min=0x%x, invert=%d", + regAttr->mask, regAttr->shift, regAttr->max, regAttr->min, regAttr->invert); + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +// Update contrl reg bits value +int32_t AccessoryRegBitsUpdate(struct AudioMixerControl regAttr) +{ + int32_t ret; + struct AudioAddrConfig regVal; + uint32_t newValue, newMask, value; + if (regAttr.reg < 0) { + AUDIO_DRIVER_LOG_ERR("input invalid parameter."); + return HDF_ERR_INVALID_PARAM; + } + if (regAttr.invert) { + regAttr.value = regAttr.max - regAttr.value; + } + newValue = regAttr.value << regAttr.shift; + newMask = regAttr.mask << regAttr.shift; + ret = AccessoryRegBitsRead(®Attr, &value); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("AccessoryRegBitsRead faileded, ret=%d.", ret); + return HDF_FAILURE; } + regVal.value = (value & ~newMask) | (newValue & newMask); + regVal.addr = regAttr.reg; + ret = AccessoryI2cReadWrite(®Val, 0); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AccessoryI2cReadWrite faileded."); + return HDF_FAILURE; + } + AUDIO_DRIVER_LOG_DEBUG("regAddr=0x%x, regValue=0x%x, oldValue=0x%x, newValue=0x%x,", + regAttr.reg, regVal.value, regAttr.value, newValue); + AUDIO_DRIVER_LOG_DEBUG(" mask=0x%x, shift=%d, max=0x%x, min=0x%x, invert=%d", + newMask, regAttr.shift, regAttr.max, regAttr.min, regAttr.invert); + AUDIO_DRIVER_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t RateToFrequency(uint32_t rate, uint16_t *freq) +// update external codec I2S frequency +int32_t AccessoryDaiParamsUpdate(struct DaiParamsVal daiParamsVal) +{ + int32_t ret; + const int itemNum = 3; // current only 3 items(frequency, format, channel) + struct AudioMixerControl *regAttr = NULL; + ret = (g_audioRegCfgGroupNode == NULL || g_audioRegCfgGroupNode[AUDIO_DAI_PATAM_GROUP] == NULL + || g_audioRegCfgGroupNode[AUDIO_DAI_PATAM_GROUP]->regCfgItem == NULL + || g_audioRegCfgGroupNode[AUDIO_DAI_PATAM_GROUP]->itemNum < itemNum); + if (ret) { + AUDIO_DRIVER_LOG_ERR("g_audioRegCfgGroupNode[AUDIO_DAI_PATAM_GROUP] is NULL."); + return HDF_FAILURE; + } + regAttr = g_audioRegCfgGroupNode[AUDIO_DAI_PATAM_GROUP]->regCfgItem; + regAttr[0].value = daiParamsVal.frequencyVal; + ret = AccessoryRegBitsUpdate(regAttr[0]); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("set freq failed."); + return HDF_FAILURE; + } + regAttr[1].value = daiParamsVal.formatVal; + ret = AccessoryRegBitsUpdate(regAttr[1]); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("set format failed."); + return HDF_FAILURE; + } + regAttr[itemNum - 1].value = daiParamsVal.channelVal; + ret = AccessoryRegBitsUpdate(regAttr[itemNum - 1]); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("set channel failed."); + return HDF_FAILURE; + } + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +int32_t AcessoryDeviceFrequencyParse(uint32_t rate, uint16_t *freq) { if (freq == NULL) { AUDIO_DRIVER_LOG_ERR("input param is NULL"); @@ -79,5 +291,111 @@ int32_t RateToFrequency(uint32_t rate, uint16_t *freq) AUDIO_DRIVER_LOG_ERR("rate: %d is not support.", rate); return HDF_ERR_NOT_SUPPORT; } + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceCfgGet(struct AccessoryData *accessoryData, + struct AccessoryTransferData *accessoryTransferData) +{ + int32_t ret, index; + struct AudioControlConfig *ctlcfgItem = NULL; + uint32_t audioCfgCtrlCount; + ret = (accessoryData == NULL || accessoryData->regConfig == NULL || accessoryTransferData == NULL); + if (ret) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + g_i2cDevAddr = accessoryTransferData->i2cDevAddr; + g_i2cBusNumber = accessoryTransferData->i2cBusNumber; + g_audioRegCfgGroupNode = accessoryData->regConfig->audioRegParams; + ret = (g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP] == NULL || + g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem == NULL || + g_audioRegCfgGroupNode[AUDIO_CTRL_PATAM_GROUP] == NULL || + g_audioRegCfgGroupNode[AUDIO_CTRL_PATAM_GROUP]->regCfgItem == NULL); + if (ret) { + AUDIO_DRIVER_LOG_ERR("parsing params is NULL."); + return HDF_FAILURE; + } + ctlcfgItem = g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; + audioCfgCtrlCount = g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->itemNum; + g_audioControls = (struct AudioKcontrol *)OsalMemCalloc(audioCfgCtrlCount * sizeof(struct AudioKcontrol)); + accessoryTransferData->accessoryRegCfgGroupNode = g_audioRegCfgGroupNode; + accessoryTransferData->accessoryCfgCtrlCount = audioCfgCtrlCount; + accessoryTransferData->accessoryControls = g_audioControls; + for (index = 0; index < audioCfgCtrlCount; index++) { + g_audioControls[index].iface = ctlcfgItem[index].iface; + g_audioControls[index].name = g_audioControlsList[ctlcfgItem[index].arrayIndex]; + g_audioControls[index].Info = AudioInfoCtrlOps; + g_audioControls[index].privateValue = + (unsigned long)&g_audioRegCfgGroupNode[AUDIO_CTRL_PATAM_GROUP]->regCfgItem[index]; + g_audioControls[index].Get = AudioAccessoryGetCtrlOps; + g_audioControls[index].Set = AudioAccessorySetCtrlOps; + } + return HDF_SUCCESS; +} + +/* + * init control reg to default value + */ +int32_t AccessoryDeviceCtrlRegInit(void) +{ + int32_t ret, i; + // Set codec control register(00h-14h) default value + ret = (g_audioRegCfgGroupNode == NULL || g_audioRegCfgGroupNode[AUDIO_INIT_GROUP] == NULL + || g_audioRegCfgGroupNode[AUDIO_INIT_GROUP]->addrCfgItem == NULL); + if (ret) { + AUDIO_DRIVER_LOG_ERR("g_audioRegCfgGroupNode[AUDIO_INIT_GROUP] is NULL."); + return HDF_FAILURE; + } + struct AudioAddrConfig *initCfg = g_audioRegCfgGroupNode[AUDIO_INIT_GROUP]->addrCfgItem; + for (i = 0; i < g_audioRegCfgGroupNode[AUDIO_INIT_GROUP]->itemNum; i++) { + AUDIO_DRIVER_LOG_DEBUG("i=%d, Addr = [0x%2x]", i, initCfg[i].addr); + ret = AccessoryI2cReadWrite(&initCfg[i], 0); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AccessoryI2cReadWrite(write) err, regAttr.regAddr: 0x%x.\n", + initCfg[i].addr); + return HDF_FAILURE; + } + OsalMSleep(COMM_WAIT_TIMES); + } + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceRegRead(const struct AccessoryDevice *codec, uint32_t reg, uint32_t *val) +{ + int32_t ret; + struct AudioAddrConfig regAttr; + if (val == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_ERR_INVALID_OBJECT; + } + (void)codec; + regAttr.addr = (uint8_t)reg; + regAttr.value = 0; + ret = AccessoryI2cReadWrite(®Attr, I2C_FLAG_READ); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("failed."); + return HDF_FAILURE; + } + *val = regAttr.value; + AUDIO_DRIVER_LOG_DEBUG("success"); + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceRegWrite(const struct AccessoryDevice *codec, uint32_t reg, uint32_t value) +{ + int32_t ret; + struct AudioAddrConfig regAttr; + (void)codec; + regAttr.addr = (uint8_t)reg; + regAttr.value = (uint16_t)value; + ret = AccessoryI2cReadWrite(®Attr, 0); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("failed."); + return HDF_FAILURE; + } + AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; } diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 0bef4037f..40626ab28 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -7,99 +7,26 @@ */ #include "audio_codec_base.h" +#include "audio_parse.h" +#include "audio_driver_log.h" +#include "audio_sapm.h" #define HDF_LOG_TAG audio_codec_base -int32_t CodecDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val) +int32_t CodecDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val) { - unsigned long acodecVir; - struct VirtualAddress *virtualAdd = NULL; - AUDIO_DRIVER_LOG_DEBUG("entry"); - - if ((codec == NULL) || (codec->device == NULL) || (val == NULL)) { - AUDIO_DRIVER_LOG_ERR("input param codec or codec->device is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - virtualAdd = (struct VirtualAddress *)((volatile uintptr_t)codec->device->priv); - if (virtualAdd == NULL) { - AUDIO_DRIVER_LOG_ERR("virtualAdd is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - acodecVir = virtualAdd->acodecVir; - *val = OSAL_READL((void *)(volatile uintptr_t)(acodecVir + reg)); - - AUDIO_DRIVER_LOG_DEBUG("success"); - return HDF_SUCCESS; -} - -int32_t CodecDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t value) -{ - unsigned long acodecVir; - struct VirtualAddress *virtualAdd = NULL; - AUDIO_DRIVER_LOG_DEBUG("entry"); - - if ((codec == NULL) || (codec->device == NULL)) { - AUDIO_DRIVER_LOG_ERR("param codec or codec->device is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - virtualAdd = (struct VirtualAddress *)((volatile uintptr_t)codec->device->priv); - if (virtualAdd == NULL) { - AUDIO_DRIVER_LOG_ERR("virtualAdd is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - acodecVir = virtualAdd->acodecVir; - OSAL_WRITEL(value, (void *)(volatile uintptr_t)(acodecVir + reg)); - - AUDIO_DRIVER_LOG_DEBUG("success"); - return HDF_SUCCESS; -} - -int32_t CodecAiaoDeviceReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val) -{ - unsigned long aiaoVir; - struct VirtualAddress *virtualAdd = NULL; - AUDIO_DRIVER_LOG_DEBUG("entry"); - - if ((codec == NULL) || (codec->device == NULL) || (val == NULL)) { - AUDIO_DRIVER_LOG_ERR("codec or codec->device is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - virtualAdd = (struct VirtualAddress *)((volatile uintptr_t)codec->device->priv); - if (virtualAdd == NULL) { - AUDIO_DRIVER_LOG_ERR("virtualAdd is NULL."); - return HDF_ERR_INVALID_OBJECT; + if (val == NULL) { + AUDIO_DRIVER_LOG_ERR("param val is null."); + return HDF_FAILURE; } - aiaoVir = virtualAdd->aiaoVir; - *val = OSAL_READL((void *)(volatile uintptr_t)(aiaoVir + reg)); - - AUDIO_DRIVER_LOG_DEBUG("success"); + *val = OSAL_READL((void *)((uintptr_t)(virtualAddress + reg))); return HDF_SUCCESS; } -int32_t CodecAiaoDeviceWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t value) +int32_t CodecDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value) { - unsigned long aiaoVir; - struct VirtualAddress *virtualAdd = NULL; - AUDIO_DRIVER_LOG_DEBUG("entry"); - - if ((codec == NULL) || (codec->device == NULL)) { - AUDIO_DRIVER_LOG_ERR("codec or codec->device is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - virtualAdd = (struct VirtualAddress *)((volatile uintptr_t)codec->device->priv); - if (virtualAdd == NULL) { - AUDIO_DRIVER_LOG_ERR("virtualAdd is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - aiaoVir = virtualAdd->aiaoVir; - OSAL_WRITEL(value, (void *)(volatile uintptr_t)(aiaoVir + reg)); - - AUDIO_DRIVER_LOG_DEBUG("success"); + OSAL_WRITEL(value, (void *)((uintptr_t)(virtualAddress + reg))); return HDF_SUCCESS; } @@ -164,3 +91,210 @@ int32_t CodecGetDaiName(const struct HdfDeviceObject *device, const char **drvDa return HDF_SUCCESS; } + +int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecData *codecData) +{ + if (device == NULL || codecData == NULL) { + AUDIO_DRIVER_LOG_ERR("param is null!"); + return HDF_FAILURE; + } + + if (codecData->regConfig != NULL) { + ADM_LOG_ERR("g_codecData regConfig fail!"); + return HDF_FAILURE; + } + + codecData->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(codecData->regConfig))); + if (codecData->regConfig == NULL) { + ADM_LOG_ERR("malloc AudioRegCfgData fail!"); + return HDF_FAILURE; + } + + if (CodecGetRegConfig(device, codecData->regConfig) != HDF_SUCCESS) { + ADM_LOG_ERR("CodecGetRegConfig fail!"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t SapmCtrlToSapmComp(struct AudioSapmComponent *sapmComponents, + struct AudioSapmCtrlConfig *sapmCompItem, uint16_t index) +{ + if (sapmComponents == NULL || sapmCompItem == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + + sapmComponents[index].componentName = + g_audioSapmCompNameList[sapmCompItem[index].compNameIndex]; + sapmComponents[index].reg = sapmCompItem[index].reg; + sapmComponents[index].sapmType = sapmCompItem[index].sapmType; + sapmComponents[index].mask = sapmCompItem[index].mask; + sapmComponents[index].shift = sapmCompItem[index].shift; + sapmComponents[index].invert = sapmCompItem[index].invert; + sapmComponents[index].kcontrolsNum = sapmCompItem[index].kcontrolsNum; + + return HDF_SUCCESS; +} + +static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData,struct AudioRegCfgGroupNode ** regCfgGroup) +{ + uint16_t index; + + if (codeData == NULL || regCfgGroup == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + + struct AudioSapmCtrlConfig *sapmCompItem = regCfgGroup[AUDIO_SAPM_COMP_GROUP]->sapmCompItem; + struct AudioControlConfig *sapmCtrlItem = regCfgGroup[AUDIO_SAPM_CFG_GROUP]->ctrlCfgItem; + struct AudioMixerControl *ctlSapmRegCfgItem = regCfgGroup[AUDIO_CTRL_SAPM_PATAM_GROUP]->regCfgItem; + + if (sapmCompItem == NULL || sapmCtrlItem == NULL || ctlSapmRegCfgItem == NULL) { + AUDIO_DRIVER_LOG_ERR("sapmCompItem, sapmCtrlItem, ctlSapmRegCfgItem is NULL."); + return HDF_FAILURE; + } + + struct AudioKcontrol *audioSapmControls = (struct AudioKcontrol *)OsalMemCalloc + (regCfgGroup[AUDIO_SAPM_CFG_GROUP]->itemNum * sizeof(struct AudioKcontrol)); + if (audioSapmControls == NULL) { + AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed."); + return HDF_FAILURE; + } + for (index = 0; index < regCfgGroup[AUDIO_SAPM_CFG_GROUP]->itemNum; index++) { + audioSapmControls[index].iface = sapmCtrlItem[index].iface; + audioSapmControls[index].name = g_audioSapmCfgNameList[sapmCtrlItem[index].arrayIndex]; + audioSapmControls[index].privateValue = (unsigned long)&ctlSapmRegCfgItem[index]; + audioSapmControls[index].Info = AudioInfoCtrlOps; + audioSapmControls[index].Get = AudioCodecSapmGetCtrlOps; + audioSapmControls[index].Set = AudioCodecSapmSetCtrlOps; + } + + codeData->numSapmComponent = regCfgGroup[AUDIO_SAPM_COMP_GROUP]->itemNum; + codeData->sapmComponents = (struct AudioSapmComponent *) + OsalMemCalloc(codeData->numSapmComponent * sizeof(struct AudioSapmComponent)); + if (codeData->sapmComponents == NULL) { + OsalMemFree(audioSapmControls); + AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed."); + return HDF_FAILURE; + } + + for (index = 0; index < codeData->numSapmComponent; index++) { + if (SapmCtrlToSapmComp(codeData->sapmComponents ,sapmCompItem, index)) { + OsalMemFree(audioSapmControls); + return HDF_FAILURE; + } + + if (sapmCompItem[index].kcontrolsNum) { + codeData->sapmComponents[index].kcontrolNews = + &audioSapmControls[sapmCompItem[index].kcontrolNews - 1]; + } + } + + return HDF_SUCCESS; +} + +int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData) +{ + uint16_t index; + + if (codeData == NULL || daiData == NULL || codeData->regConfig == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + + struct AudioIdInfo *audioIdInfo = &(codeData->regConfig->audioIdInfo); + struct AudioRegCfgGroupNode **regCfgGroup = codeData->regConfig->audioRegParams; + daiData->regCfgGroup = regCfgGroup; + codeData->regCfgGroup = regCfgGroup; + if (audioIdInfo == NULL || regCfgGroup == NULL) { + AUDIO_DRIVER_LOG_ERR("audioIdInfo or regCfgGroup is NULL."); + return HDF_FAILURE; + } + + struct AudioControlConfig *compItem = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; + struct AudioMixerControl *ctlRegCfgItem = regCfgGroup[AUDIO_CTRL_PATAM_GROUP]->regCfgItem; + if (compItem == NULL || ctlRegCfgItem == NULL) { + AUDIO_DRIVER_LOG_ERR("compItem or ctlRegCfgItem is NULL."); + return HDF_FAILURE; + } + + codeData->numControls = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->itemNum; + codeData->controls = + (struct AudioKcontrol *)OsalMemCalloc(codeData->numControls * sizeof(struct AudioKcontrol)); + if (codeData->controls == NULL) { + AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed."); + return HDF_FAILURE; + } + + for (index = 0; index < codeData->numControls; index++) { + codeData->controls[index].iface = compItem[index].iface; + codeData->controls[index].name = g_audioControlsList[compItem[index].arrayIndex]; + codeData->controls[index].Info = AudioInfoCtrlOps; + codeData->controls[index].privateValue = (unsigned long)&ctlRegCfgItem[index]; + if (compItem[index].enable) { + codeData->controls[index].Get = AudioCodecGetCtrlOps; + codeData->controls[index].Set = AudioCodecSetCtrlOps; + } + } + + codeData->virtualAddress = (uintptr_t)OsalIoRemap(audioIdInfo->chipIdRegister, audioIdInfo->chipIdSize); + + if (CodecSetSapmConfigInfo(codeData, regCfgGroup) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl) +{ + uint32_t index = 0; + if (codeData == NULL || codeData->regConfig == NULL || + aiaoGetCtrl == NULL || aiaoSetCtrl == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + struct AudioRegCfgGroupNode **regCfgGroup = codeData->regConfig->audioRegParams; + struct AudioControlConfig *compItem = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; + if (regCfgGroup == NULL || compItem == NULL) { + AUDIO_DRIVER_LOG_ERR("regCfgGroup or compItem is NULL."); + return HDF_FAILURE; + } + + for (index = 0; index < codeData->numControls; index++) { + if (!compItem[index].enable) { + codeData->controls[index].Get = aiaoGetCtrl; + codeData->controls[index].Set = aiaoSetCtrl; + } + } + + return HDF_SUCCESS; +} + +int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *codecData) +{ + if (device == NULL) { + AUDIO_DRIVER_LOG_ERR("param is null!"); + return HDF_FAILURE; + } + + if (codecData->regConfig != NULL) { + ADM_LOG_ERR("g_codecData regConfig fail!"); + return HDF_FAILURE; + } + + codecData->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(codecData->regConfig))); + if (codecData->regConfig == NULL) { + ADM_LOG_ERR("malloc AudioRegCfgData fail!"); + return HDF_FAILURE; + } + + if (CodecGetRegConfig(device, codecData->regConfig) != HDF_SUCCESS) { + ADM_LOG_ERR("CodecGetRegConfig fail!"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} diff --git a/model/audio/common/src/audio_dai_base.c b/model/audio/common/src/audio_dai_base.c new file mode 100644 index 000000000..bdface250 --- /dev/null +++ b/model/audio/common/src/audio_dai_base.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_host.h" +#include "audio_core.h" +#include "audio_parse.h" +#include "audio_driver_log.h" +#include "audio_dai_if.h" +#include "osal_io.h" + +struct DaiData *DaiDataFromCard(const struct AudioCard *card) +{ + if (card == NULL || card->rtd == NULL || card->rtd->cpuDai == NULL) { + AUDIO_DRIVER_LOG_ERR("param is null."); + return NULL; + } + return card->rtd->cpuDai->devData; +} + + +int32_t DaiGetConfigInfo(const struct HdfDeviceObject *device, struct DaiData *data) +{ + if (device == NULL || data == NULL) { + AUDIO_DRIVER_LOG_ERR("param is null!"); + return HDF_FAILURE; + } + + if (data->regConfig != NULL) { + ADM_LOG_ERR("g_codecData regConfig fail!"); + return HDF_FAILURE; + } + + data->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(data->regConfig))); + if (data->regConfig == NULL) { + ADM_LOG_ERR("malloc AudioRegCfgData fail!"); + return HDF_FAILURE; + } + + if (CodecGetRegConfig(device, data->regConfig) != HDF_SUCCESS) { + ADM_LOG_ERR("dai GetRegConfig fail!"); + OsalMemFree(data->regConfig); + data->regConfig = NULL; + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t DaiCheckSampleRate(unsigned int sampleRates) +{ + bool check = (sampleRates == AUDIO_SAMPLE_RATE_8000 || sampleRates == AUDIO_SAMPLE_RATE_12000 || + sampleRates == AUDIO_SAMPLE_RATE_11025 || sampleRates == AUDIO_SAMPLE_RATE_16000 || + sampleRates == AUDIO_SAMPLE_RATE_22050 || sampleRates == AUDIO_SAMPLE_RATE_24000 || + sampleRates == AUDIO_SAMPLE_RATE_32000 || sampleRates == AUDIO_SAMPLE_RATE_44100 || + sampleRates == AUDIO_SAMPLE_RATE_48000 || sampleRates == AUDIO_SAMPLE_RATE_64000 || + sampleRates == AUDIO_SAMPLE_RATE_96000); + if (check) { + return HDF_SUCCESS; + } else { + AUDIO_DRIVER_LOG_ERR("FramatToSampleRate fail: Invalid sampling rate: %d.", sampleRates); + return HDF_ERR_NOT_SUPPORT; + } +} + +int32_t DaiSetConfigInfo(struct DaiData *data) +{ + uint16_t index; + struct AudioRegCfgGroupNode **regCfgGroup = NULL; + struct AudioMixerControl *patRegCfgItemTmp = NULL; + struct AudioControlConfig *item = NULL; + + if (data == NULL || data->regConfig == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + + regCfgGroup = data->regConfig->audioRegParams; + if (regCfgGroup == NULL) { + AUDIO_DRIVER_LOG_DEBUG("regCfgGroup is null."); + return HDF_SUCCESS; + } + + patRegCfgItemTmp = regCfgGroup[AUDIO_CTRL_PATAM_GROUP]->regCfgItem; + item = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; + + if (patRegCfgItemTmp == NULL || item == NULL) { + AUDIO_DRIVER_LOG_ERR("patRegCfgItemTmp or item is NULL."); + return HDF_FAILURE; + } + + data->numControls = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->itemNum; + data->controls = (struct AudioKcontrol *)OsalMemCalloc(data->numControls * sizeof(struct AudioKcontrol)); + if (data->controls == NULL) { + AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed."); + return HDF_FAILURE; + } + + for (index = 0; index < data->numControls; index++) { + data->controls[index].iface = item[index].iface; + data->controls[index].name = g_audioControlsList[item[index].arrayIndex]; + data->controls[index].Info = AudioInfoCtrlOps; + data->controls[index].privateValue = (unsigned long)&patRegCfgItemTmp[index]; + data->controls[index].Get = AudioCpuDaiGetCtrlOps; + data->controls[index].Set = AudioCpuDaiSetCtrlOps; + } + + return HDF_SUCCESS; +} + diff --git a/model/audio/common/src/audio_dma_base.c b/model/audio/common/src/audio_dma_base.c new file mode 100644 index 000000000..c0a06174e --- /dev/null +++ b/model/audio/common/src/audio_dma_base.c @@ -0,0 +1,83 @@ +#include "audio_platform_if.h" + +int32_t AudioDmaBufAlloc(struct PlatformData *data, enum AudioStreamType streamType) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaBufAlloc != NULL) { + return data->ops->DmaBufAlloc(data, streamType); + } + return HDF_FAILURE; +} + +int32_t AudioDmaBufFree(struct PlatformData *data, enum AudioStreamType streamType) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaBufFree != NULL) { + return data->ops->DmaBufFree(data, streamType); + } + return HDF_FAILURE; +} + +int32_t AudioDmaRequestChannel(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaConfigChannel != NULL) { + return data->ops->DmaRequestChannel(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaConfigChannel(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaConfigChannel != NULL) { + return data->ops->DmaConfigChannel(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaPrep(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaPrep != NULL) { + return data->ops->DmaPrep(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaSubmit(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaSubmit != NULL) { + return data->ops->DmaSubmit(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaPending(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaPending != NULL) { + return data->ops->DmaPending(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaPause(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaPause != NULL) { + return data->ops->DmaPause(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaResume(struct PlatformData *data) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaResume != NULL) { + return data->ops->DmaResume(data); + } + return HDF_FAILURE; +} + +int32_t AudioDmaPointer(struct PlatformData *data, uint32_t *pointer) +{ + if (data != NULL && data->ops != NULL && data->ops->DmaPointer != NULL) { + return data->ops->DmaPointer(data, pointer); + } + return HDF_FAILURE; +} + + diff --git a/model/audio/common/src/audio_dsp_base.c b/model/audio/common/src/audio_dsp_base.c new file mode 100644 index 000000000..fb472fa87 --- /dev/null +++ b/model/audio/common/src/audio_dsp_base.c @@ -0,0 +1,383 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_accessory_base.h" +#include "audio_dsp_if.h" +#include "osal_io.h" +#include "spi_if.h" +#include "audio_driver_log.h" + +#define DEFAULT_SPEED 2000000 +#define BITS_PER_WORD_EIGHT 8 +#define DSP_CS_NUM 1 +#define DSP_SPI_BUS_NUM 1 + +enum DspI2sFormatRegVal { + I2S_SAMPLE_FORMAT_REG_VAL_MSB_24 = 0x2, /* MSB-justified data up to 24 bits */ + I2S_SAMPLE_FORMAT_REG_VAL_24 = 0x3, /* I2S data up to 24 bits */ + I2S_SAMPLE_FORMAT_REG_VAL_LSB_16 = 0x4, /* LSB-justified 16-bit data */ + I2S_SAMPLE_FORMAT_REG_VAL_LSB_18 = 0x5, /* LSB-justified 18-bit data */ + I2S_SAMPLE_FORMAT_REG_VAL_LSB_20 = 0x6, /* LSB-justified 20-bit data */ + I2S_SAMPLE_FORMAT_REG_VAL_LSB_24 = 0x7, /* LSB-justified 24-bit data */ +}; + +struct SpiDevInfo g_devInfo = { + .busNum = DSP_SPI_BUS_NUM, + .csNum = DSP_CS_NUM, +}; + +int32_t DspLinkStartup(const struct AudioCard *card, const struct DaiDevice *device) +{ + (void)card; + (void)device; + return HDF_SUCCESS; +} + +static int32_t DspCfgI2sFrequency(uint32_t rate, uint16_t *frequency) +{ + switch (rate) { + case I2S_SAMPLE_FREQUENCY_8000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_8000; + break; + case I2S_SAMPLE_FREQUENCY_11025: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_11025; + break; + case I2S_SAMPLE_FREQUENCY_12000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_12000; + break; + case I2S_SAMPLE_FREQUENCY_16000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_16000; + break; + case I2S_SAMPLE_FREQUENCY_22050: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_22050; + break; + case I2S_SAMPLE_FREQUENCY_24000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_24000; + break; + case I2S_SAMPLE_FREQUENCY_32000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_32000; + break; + case I2S_SAMPLE_FREQUENCY_44100: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_44100; + break; + case I2S_SAMPLE_FREQUENCY_48000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_48000; + break; + case I2S_SAMPLE_FREQUENCY_64000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_64000; + break; + case I2S_SAMPLE_FREQUENCY_88200: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_88200; + break; + case I2S_SAMPLE_FREQUENCY_96000: + *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_96000; + break; + default: + AUDIO_DRIVER_LOG_ERR("rate: %d is not support.", rate); + return HDF_ERR_NOT_SUPPORT; + } + return HDF_SUCCESS; +} + +static int32_t DspSetI2sBitWidth(enum AudioFormat format, uint16_t *bitWidth) +{ + switch (format) { + case AUDIO_FORMAT_PCM_8_BIT: + *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; + break; + case AUDIO_FORMAT_PCM_16_BIT: + *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; + break; + case AUDIO_FORMAT_PCM_24_BIT: + *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; + break; + default: + AUDIO_DRIVER_LOG_ERR("format: %d is not support.", format); + return HDF_ERR_NOT_SUPPORT; + } + return HDF_SUCCESS; +} + +static int DspSetI2sFrequency(uint16_t frequencyVal) +{ + return HDF_SUCCESS; +} + +static int DspSetI2sFormat(uint16_t formatVal) +{ + return HDF_SUCCESS; +} + +int32_t DspLinkHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param) +{ + int ret; + uint16_t frequency, bitWidth; + (void)card; + + AUDIO_DRIVER_LOG_DEBUG("entry."); + if (param == NULL || param->cardServiceName == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is nullptr."); + return HDF_ERR_INVALID_PARAM; + } + ret = DspCfgI2sFrequency(param->rate, &frequency); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("RateToFrequency fail."); + return HDF_ERR_NOT_SUPPORT; + } + ret = DspSetI2sBitWidth(param->format, &bitWidth); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("FormatToBitWidth fail."); + return HDF_ERR_NOT_SUPPORT; + } + ret = DspSetI2sFrequency(frequency); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("SetDspI2sFs fail."); + return HDF_FAILURE; + } + ret = DspSetI2sFormat(bitWidth); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("SetDspI2sFormat fail."); + return HDF_FAILURE; + } + AUDIO_DRIVER_LOG_DEBUG("DspLinkHwParams: channels = %d, rate = %d, periodSize = %d, \ + periodCount = %d, format = %d, cardServiceName = %s \n", + param->channels, param->rate, param->periodSize, + param->periodCount, (uint32_t)param->format, param->cardServiceName); + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +static int DspPowerEnable(void) +{ + return HDF_SUCCESS; +} + +static int DspGpioPinInit(void) +{ + return HDF_SUCCESS; +} + +static int DspI2cPinInit(void) +{ + return HDF_SUCCESS; +} + +static int DspI2sInit(void) +{ + return HDF_SUCCESS; +} + +static int DspI2cInit(void) +{ + return HDF_SUCCESS; +} + +/* not init dsp gpio */ +static int DspSpiPinInit(void) +{ + return HDF_FAILURE; +} + +int32_t DspDeviceInit(const struct DspDevice *device) +{ + DevHandle devHandle; + struct SpiCfg devCfg = { + .maxSpeedHz = DEFAULT_SPEED, + .mode = SPI_CLK_POLARITY, + .transferMode = SPI_DMA_TRANSFER, + .bitsPerWord = BITS_PER_WORD_EIGHT, + }; + + if (DspPowerEnable() != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DspPowerEnable: return Error!"); + return HDF_FAILURE; + } + + if (DspGpioPinInit() != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DspGpioPinInit: return Error!"); + return HDF_FAILURE; + } + + if (DspI2cPinInit() != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DspI2cPinInit: return Error!"); + return HDF_FAILURE; + } + + if (DspSpiPinInit() == HDF_SUCCESS) { + devHandle = SpiOpen(&g_devInfo); + if (devHandle == NULL) { + AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); + return HDF_FAILURE; + } + + if (SpiSetCfg(devHandle, &devCfg) != HDF_SUCCESS) { + SpiClose(devHandle); + AUDIO_DRIVER_LOG_ERR("DspDeviceCfg: spi failed!"); + return HDF_FAILURE; + } + SpiClose(devHandle); + } else { + AUDIO_DRIVER_LOG_ERR("Dsp Gpio Pin: not init!"); + } + + if (DspI2cInit() != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (DspI2sInit() != HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t DspDeviceReadReg(const struct DspDevice *device, uint8_t *buf, uint32_t len) +{ + int32_t ret; + + DevHandle devHandle = SpiOpen(&g_devInfo); + if (devHandle == NULL) { + AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); + return HDF_FAILURE; + } + + ret = SpiRead(devHandle, buf, len); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DspDeviceRead: spi failed!"); + SpiClose(devHandle); + return HDF_FAILURE; + } + + SpiClose(devHandle); + + return HDF_SUCCESS; +} + +int32_t DspDeviceWriteReg(const struct DspDevice *device, uint8_t *buf, uint32_t len) +{ + int32_t ret; + + DevHandle devHandle = SpiOpen(&g_devInfo); + if (devHandle == NULL) { + AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); + return HDF_FAILURE; + } + + ret = SpiWrite(devHandle, buf, len); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DspDeviceRead: spi failed!"); + SpiClose(devHandle); + return HDF_FAILURE; + } + + SpiClose(devHandle); + + return HDF_SUCCESS; +} + +int32_t DspLinkDeviceInit(struct AudioCard *card, const struct DaiDevice *device) +{ + if (device == NULL || device->devDaiName == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is nullptr."); + return HDF_FAILURE; + } + AUDIO_DRIVER_LOG_DEBUG("dsp Link device name: %s\n", device->devDaiName); + (void)card; + return HDF_SUCCESS; +} + +int32_t DspGetServiceName(const struct HdfDeviceObject *device, const char **drvDspName) +{ + const struct DeviceResourceNode *node = NULL; + struct DeviceResourceIface *drsOps = NULL; + int32_t ret; + + if (device == NULL) { + AUDIO_DRIVER_LOG_ERR("device is NULL."); + return HDF_FAILURE; + } + + node = device->property; + if (node == NULL) { + AUDIO_DRIVER_LOG_ERR("deivce property is NULL."); + return HDF_FAILURE; + } + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetString == NULL) { + AUDIO_DRIVER_LOG_ERR("from resource get drsops failed!"); + return HDF_FAILURE; + } + + ret = drsOps->GetString(node, "serviceName", drvDspName, 0); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("read DspServiceName fail!"); + return ret; + } + + return HDF_SUCCESS; +} + +int32_t DspGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName) +{ + const struct DeviceResourceNode *node = NULL; + struct DeviceResourceIface *drsOps = NULL; + int32_t ret; + + if (device == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is null pointer."); + return HDF_FAILURE; + } + + node = device->property; + if (node == NULL) { + AUDIO_DRIVER_LOG_ERR("drs node is null pointer."); + return HDF_FAILURE; + } + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetString == NULL) { + AUDIO_DRIVER_LOG_ERR("drs ops fail!"); + return HDF_FAILURE; + } + + ret = drsOps->GetString(node, "dspDaiName", drvDaiName, 0); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("read dspDaiName fail!"); + return ret; + } + + return HDF_SUCCESS; +} + + +int32_t DspDecodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) +{ + (void)card; + (void)buf; + (void)device; + AUDIO_DRIVER_LOG_DEBUG("decode run!!!"); + return HDF_SUCCESS; +} + +int32_t DspEncodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) +{ + (void)card; + (void)buf; + (void)device; + AUDIO_DRIVER_LOG_DEBUG("encode run!!!"); + return HDF_SUCCESS; +} + + +int32_t DspEqualizerActive(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) +{ + (void)card; + (void)buf; + (void)device; + AUDIO_DRIVER_LOG_DEBUG("equalizer run!!!"); + return HDF_SUCCESS; +} diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 6163fdf72..ea0e242f2 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -7,10 +7,33 @@ */ #include "audio_platform_base.h" -#include "audio_core.h" +#include "osal_time.h" +#include "osal_uaccess.h" +#include "audio_driver_log.h" +#include "audio_dma_base.h" +#include "audio_sapm.h" +#include "audio_stream_dispatch.h" #define HDF_LOG_TAG audio_platform_base -struct PlatformData *PlatformDataFromDevice(const struct AudioCard *card) +const int MAX_PERIOD_SIZE = 1024 * 16; +const int MAX_PERIOD_COUNT = 32; +const int MIN_PERIOD_COUNT = 4; +const int RENDER_TRAF_BUF_SIZE = 1024; +const int MIN_BUFF_SIZE = 16 * 1024; +const int TIME_OUT_CONST = 50; +const int SLEEP_TIME = 5; + +unsigned int SysReadl(unsigned long addr) +{ + return *(volatile unsigned int *)(addr); +} + +void SysWritel(unsigned long addr, unsigned int value) +{ + *(volatile unsigned int *)(addr) = value; +} + +struct PlatformData *PlatformDataFromCard(const struct AudioCard *card) { if (card == NULL || card->rtd == NULL || card->rtd->platform == NULL) { AUDIO_DRIVER_LOG_ERR("param is null."); @@ -19,25 +42,17 @@ struct PlatformData *PlatformDataFromDevice(const struct AudioCard *card) return card->rtd->platform->devData; } -int32_t PlatformCreatePlatformHost(const struct AudioCard *card, struct PlatformHost **platformHost) +uint32_t AudioBytesToFrames(uint32_t frameBits, uint32_t size) { - if (platformHost == NULL) { - AUDIO_DRIVER_LOG_ERR("input param platformHost is invalid."); - return HDF_ERR_INVALID_PARAM; - } - if (card == NULL || card->rtd == NULL || card->rtd->platform == NULL) { - AUDIO_DRIVER_LOG_ERR("input para is NULL."); - return HDF_FAILURE; - } - - *platformHost = PlatformHostFromDevice(card->rtd->platform->device); - if (*platformHost == NULL) { - AUDIO_DRIVER_LOG_ERR("PlatformHostFromDevice faile."); - return HDF_FAILURE; + if (size == 0) { + AUDIO_DRIVER_LOG_ERR("size is null."); + return 0; + } else { + return (frameBits / size); } - return HDF_SUCCESS; } + int32_t AudioDataBigEndianChange(char *srcData, uint32_t audioLen, enum DataBitWidth bitWidth) { if (srcData == NULL) { @@ -76,3 +91,1053 @@ int32_t AudioDataBigEndianChange(char *srcData, uint32_t audioLen, enum DataBitW } return HDF_SUCCESS; } + +int32_t AudioFramatToBitWidth(enum AudioFormat format, unsigned int *bitWidth) +{ + if (bitWidth == NULL) { + AUDIO_DRIVER_LOG_ERR("bitWidth is null."); + return HDF_FAILURE; + } + switch (format) { + case AUDIO_FORMAT_PCM_16_BIT: + *bitWidth = DATA_BIT_WIDTH16; + break; + + case AUDIO_FORMAT_PCM_24_BIT: + *bitWidth = DATA_BIT_WIDTH24; + break; + + default: + AUDIO_DRIVER_LOG_ERR("format: %d is not define.", format); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioSetPcmInfo(struct PlatformData *platformData, const struct AudioPcmHwParams *param) +{ + if (platformData == NULL || param == NULL) { + AUDIO_DRIVER_LOG_ERR("platform is NULL."); + return HDF_FAILURE; + } + platformData->pcmInfo.rate = param->rate; + platformData->pcmInfo.frameSize = param->channels * platformData->pcmInfo.bitWidth / BITSTOBYTE; + platformData->pcmInfo.channels = param->channels; + + platformData->renderBufInfo.chnId = 0; + platformData->captureBufInfo.chnId = 0; + + platformData->pcmInfo.isBigEndian = param->isBigEndian; + platformData->pcmInfo.isSignedData = param->isSignedData; + + platformData->pcmInfo.startThreshold = param->startThreshold; + platformData->pcmInfo.stopThreshold = param->stopThreshold; + platformData->pcmInfo.silenceThreshold = param->silenceThreshold; + + platformData->pcmInfo.interleaved = 1; + platformData->pcmInfo.channels = param->channels; + platformData->pcmInfo.streamType = param->streamType; + + return HDF_SUCCESS; +} + +int32_t AudioSetRenderBufInfo(struct PlatformData *data, const struct AudioPcmHwParams *param) +{ + uint32_t size; + + if (data == NULL || param == NULL) { + AUDIO_DRIVER_LOG_ERR("platform is NULL."); + return HDF_FAILURE; + } + data->renderBufInfo.period = param->period; + if (param->periodSize < MIN_PERIOD_SIZE || param->periodSize > MAX_PERIOD_SIZE) { + AUDIO_DRIVER_LOG_ERR("periodSize is invalid."); + return HDF_FAILURE; + } + data->renderBufInfo.periodSize = param->periodSize; + if (param->periodCount < MIN_PERIOD_COUNT || param->periodCount > MAX_PERIOD_COUNT) { + AUDIO_DRIVER_LOG_ERR("periodCount is invalid."); + return HDF_FAILURE; + } + data->renderBufInfo.periodCount = param->periodCount; + + data->renderBufInfo.trafBufSize = RENDER_TRAF_BUF_SIZE; + + size = data->renderBufInfo.periodCount * data->renderBufInfo.periodSize; + if (size < MIN_BUFF_SIZE || size > MAX_BUFF_SIZE) { + AUDIO_DRIVER_LOG_ERR("buffSize is invalid."); + return HDF_FAILURE; + } + + data->renderBufInfo.cirBufSize = size; + return HDF_SUCCESS; +} + +int32_t AudioSetCaptureBufInfo(struct PlatformData *data, const struct AudioPcmHwParams *param) +{ + if (data == NULL || param == NULL) { + AUDIO_DRIVER_LOG_ERR("platform is NULL."); + return HDF_FAILURE; + } + + data->captureBufInfo.period = param->period; + if (param->periodSize < MIN_PERIOD_SIZE || param->periodSize > MAX_PERIOD_SIZE) { + AUDIO_DRIVER_LOG_ERR("periodSize is invalid %d.", param->periodSize); + return HDF_FAILURE; + } + data->captureBufInfo.periodSize = param->periodSize; + if (param->periodCount < MIN_PERIOD_COUNT || param->periodCount > MAX_PERIOD_COUNT) { + AUDIO_DRIVER_LOG_ERR("periodCount is invalid %d.", param->periodCount); + return HDF_FAILURE; + } + data->captureBufInfo.periodCount = param->periodCount; + + if (param->silenceThreshold < MIN_PERIOD_SIZE || param->silenceThreshold > MAX_PERIOD_SIZE) { + AUDIO_DRIVER_LOG_ERR("silenceThreshold is invalid %d.", param->silenceThreshold); + return HDF_FAILURE; + } + data->captureBufInfo.trafBufSize = param->silenceThreshold; + data->captureBufInfo.cirBufSize = param->periodSize * param->periodCount; + if (data->captureBufInfo.cirBufSize > data->captureBufInfo.cirBufMax) { + AUDIO_DRIVER_LOG_ERR("cirBufSize is invalid %d.", data->captureBufInfo.cirBufSize); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioWriteProcBigEndian(const struct PlatformData *data, struct AudioTxData *txData) +{ + uint64_t buffSize; + + if (data == NULL || txData == NULL || txData->buf == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is null."); + return HDF_FAILURE; + } + + buffSize = txData->frames * data->pcmInfo.frameSize; + if (data->pcmInfo.isBigEndian) { + if (AudioDataBigEndianChange(txData->buf, buffSize, data->pcmInfo.bitWidth) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} + +static enum CriBuffStatus AudioDmaBuffStatus(const struct AudioCard *card) +{ + uint32_t dataAvailable; + uint32_t residual; + uint32_t pointer; + struct PlatformData *data = NULL; + uint32_t wptr; + uint32_t rptr; + + data = PlatformDataFromCard(card); + if (data == NULL || data->ops == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (AudioPcmPointer(card, &pointer) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("get Pointer failed."); + return ENUM_CIR_BUFF_FULL; + } + + if (data->pcmInfo.streamType == AUDIO_RENDER_STREAM) { + data->renderBufInfo.pointer = pointer; + rptr = data->renderBufInfo.pointer * data->pcmInfo.frameSize; + dataAvailable = (data->renderBufInfo.wbufOffSet - rptr) % data->renderBufInfo.cirBufSize; + residual = data->renderBufInfo.cirBufSize - dataAvailable; + if ((residual > data->renderBufInfo.trafBufSize)) { + return ENUM_CIR_BUFF_NORMAL; + } + return ENUM_CIR_BUFF_FULL; + } else if (data->pcmInfo.streamType == AUDIO_CAPTURE_STREAM) { + rptr = data->captureBufInfo.rptrOffSet; + wptr = pointer * data->pcmInfo.frameSize; + data->captureBufInfo.pointer = pointer; + + if (wptr >= rptr) { + // [S ... R ... W ... E] + dataAvailable = wptr - rptr; + if (dataAvailable < data->captureBufInfo.trafBufSize) { + AUDIO_DRIVER_LOG_DEBUG("empty rptr: %d wptr: %d trafBufSize: %d ", rptr, + wptr, data->captureBufInfo.trafBufSize); + return ENUM_CIR_BUFF_EMPTY; + } + } + AUDIO_DRIVER_LOG_DEBUG("rptr: %d wptr: %d trafBufSize: %d ", rptr, wptr, data->captureBufInfo.trafBufSize); + return ENUM_CIR_BUFF_NORMAL; + } else { + AUDIO_DRIVER_LOG_ERR("streamType is invalead."); + return ENUM_CIR_BUFF_FULL; + } +} + +int32_t AudioPcmWrite(const struct AudioCard *card, struct AudioTxData *txData) +{ + struct PlatformData *data = NULL; + enum CriBuffStatus status; + uint32_t wPtr; + int ret; + + if (card == NULL || txData == NULL || txData->buf == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is null."); + return HDF_FAILURE; + } + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("from PlatformDataFromCard get platformData is NULL."); + return HDF_FAILURE; + } + + // 1. Computed buffer size + data->renderBufInfo.trafBufSize = txData->frames * data->pcmInfo.frameSize; + + // 2. Big Small Exchange + if (data->pcmInfo.isBigEndian) { + if (AudioDataBigEndianChange(txData->buf, data->renderBufInfo.trafBufSize, + data->pcmInfo.bitWidth) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); + return HDF_FAILURE; + } + } + // 3. Buffer state checking + status = AudioDmaBuffStatus(card); + if (status != ENUM_CIR_BUFF_NORMAL) { + txData->status = ENUM_CIR_BUFF_FULL; + return HDF_SUCCESS; + } + + // 4. write buffer + if (data->renderBufInfo.trafBufSize > data->renderBufInfo.cirBufSize) { + AUDIO_DRIVER_LOG_ERR("transferFrameSize is tool big."); + return HDF_FAILURE; + } + wPtr = data->renderBufInfo.wbufOffSet % data->renderBufInfo.cirBufSize; + + if (data->renderBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("render buffer is null."); + return HDF_FAILURE; + } + ret = memcpy_s((char *)(data->renderBufInfo.virtAddr) + wPtr, + data->renderBufInfo.trafBufSize, txData->buf, data->renderBufInfo.trafBufSize); + if (ret != 0) { + AUDIO_DRIVER_LOG_ERR("memcpy_s failed."); + return HDF_FAILURE; + } + txData->status = ENUM_CIR_BUFF_NORMAL; + data->renderBufInfo.wptrOffSet = wPtr + data->renderBufInfo.trafBufSize; + data->renderBufInfo.wbufOffSet += data->renderBufInfo.trafBufSize; + + return HDF_SUCCESS; +} + +static int32_t PcmReadData(struct PlatformData *data, struct AudioRxData *rxData) +{ + uint32_t wptr; + uint32_t rptr; + uint32_t validDataSize; + + if (data == NULL || rxData == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is null."); + return HDF_FAILURE; + } + + rxData->buf = (char *)(data->captureBufInfo.virtAddr) + data->captureBufInfo.rptrOffSet; + wptr = data->captureBufInfo.pointer * data->pcmInfo.frameSize; + rptr = data->captureBufInfo.rptrOffSet; + data->captureBufInfo.curTrafSize = data->captureBufInfo.trafBufSize; + if (rptr > wptr) { + validDataSize = data->captureBufInfo.cirBufSize - rptr; + if (validDataSize < data->captureBufInfo.trafBufSize) { + data->captureBufInfo.curTrafSize = validDataSize; + } + } + + // 3. Big Small Exchange + if (!data->pcmInfo.isBigEndian) { + if (rxData->buf == NULL || + AudioDataBigEndianChange(rxData->buf, data->captureBufInfo.curTrafSize, + data->pcmInfo.bitWidth) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); + return HDF_FAILURE; + } + } + + rxData->frames = data->captureBufInfo.curTrafSize / data->pcmInfo.frameSize; + rxData->bufSize = data->captureBufInfo.curTrafSize; + rxData->status = ENUM_CIR_BUFF_NORMAL; + + return HDF_SUCCESS; +} + +int32_t AudioPcmRead(const struct AudioCard *card, struct AudioRxData *rxData) +{ + struct PlatformData *data = NULL; + enum CriBuffStatus status; + + if (card == NULL || rxData == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is null."); + return HDF_FAILURE; + } + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("from PlatformDataFromCard get platformData is NULL."); + return HDF_FAILURE; + } + if (data->captureBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("capture buffer is null."); + return HDF_FAILURE; + } + + // 1. Buffer state checking + status = AudioDmaBuffStatus(card); + if (status != ENUM_CIR_BUFF_NORMAL) { + rxData->status = ENUM_CIR_BUFF_EMPTY; + rxData->buf = (char *)(data->captureBufInfo.virtAddr) + data->captureBufInfo.rptrOffSet; + rxData->frames = 0; + rxData->bufSize = 0; + AUDIO_DRIVER_LOG_DEBUG("buff is empty."); + return HDF_SUCCESS; + } + + // 2. read buffer + if (PcmReadData(data, rxData) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Pcm Read Data fail."); + return HDF_FAILURE; + } + + // 4. update rptr + data->captureBufInfo.rptrOffSet += data->captureBufInfo.curTrafSize; + if (data->captureBufInfo.rptrOffSet >= data->captureBufInfo.cirBufSize) { + data->captureBufInfo.rptrOffSet = 0; + } + return HDF_SUCCESS; +} + +static int32_t MmapWriteData(struct PlatformData *data, char *tmpBuf) +{ + uint32_t wPtr; + int ret; + + if (data->renderBufInfo.trafBufSize > data->renderBufInfo.cirBufSize) { + AUDIO_DRIVER_LOG_ERR("transferFrameSize is tool big."); + OsalMemFree(tmpBuf); + return HDF_FAILURE; + } + + wPtr = data->renderBufInfo.wbufOffSet % data->renderBufInfo.cirBufSize; + ret = CopyFromUser(tmpBuf, (char *)data->mmapData.memoryAddress + data->mmapData.offset, + data->renderBufInfo.trafBufSize); + if (ret != EOK) { + AUDIO_DRIVER_LOG_ERR("CopyFromUser failed."); + OsalMemFree(tmpBuf); + return HDF_FAILURE; + } + + ret = memcpy_s((char *)(data->renderBufInfo.virtAddr) + wPtr, data->renderBufInfo.trafBufSize, + tmpBuf, data->renderBufInfo.trafBufSize); + if (ret != 0) { + AUDIO_DRIVER_LOG_ERR("memcpy_s failed."); + OsalMemFree(tmpBuf); + return HDF_FAILURE; + } + + data->renderBufInfo.wptrOffSet = wPtr + data->renderBufInfo.trafBufSize; + data->renderBufInfo.wbufOffSet += data->renderBufInfo.trafBufSize; + data->renderBufInfo.framesPosition += data->renderBufInfo.trafBufSize / data->pcmInfo.frameSize; + data->mmapData.offset += data->renderBufInfo.trafBufSize; + data->mmapLoopCount++; + return HDF_SUCCESS; +} + +static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) +{ + struct PlatformData *data = NULL; + enum CriBuffStatus status; + uint32_t timeout = 0; + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + if (data->renderBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("render buffer is null."); + return HDF_FAILURE; + } + + uint32_t totalSize = data->mmapData.totalBufferFrames * data->pcmInfo.frameSize; + uint32_t lastBuffSize = ((totalSize % MIN_PERIOD_SIZE) == 0) ? MIN_PERIOD_SIZE : (totalSize % MIN_PERIOD_SIZE); + uint32_t loopTimes = (lastBuffSize == MIN_PERIOD_SIZE) ? (totalSize / MIN_PERIOD_SIZE) : (totalSize / MIN_PERIOD_SIZE + 1); + data->mmapLoopCount = 0; + char *tmpBuf = OsalMemCalloc(MIN_PERIOD_SIZE); + + while (data->mmapLoopCount < loopTimes && data->renderBufInfo.runStatus != PCM_STOP) { + if (data->renderBufInfo.runStatus == PCM_PAUSE) { + OsalMSleep(5); + continue; + } + status = AudioDmaBuffStatus(card); + if (status != ENUM_CIR_BUFF_NORMAL) { + OsalMSleep(SLEEP_TIME); + AUDIO_DRIVER_LOG_DEBUG("dma buff status ENUM_CIR_BUFF_FULL."); + timeout++; + if (timeout >= TIME_OUT_CONST) { + AUDIO_DRIVER_LOG_ERR("timeout failed."); + OsalMemFree(tmpBuf); + return HDF_FAILURE; + } + continue; + } + timeout = 0; + data->renderBufInfo.trafBufSize = (data->mmapLoopCount < (loopTimes - 1)) ? MIN_PERIOD_SIZE : lastBuffSize; + + if (MmapWriteData(data, tmpBuf) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("MmapWriteData fail."); + OsalMemFree(tmpBuf); + return HDF_FAILURE; + } + } + + if (data->mmapLoopCount > loopTimes) { + data->renderBufInfo.runStatus = PCM_STOP; + } + + OsalMemFree(tmpBuf); + return HDF_SUCCESS; +} + +int32_t AudioPcmMmapWrite(const struct AudioCard *card, const struct AudioMmapData *txMmapData) +{ + int32_t ret; + struct PlatformData *data = NULL; + AUDIO_DRIVER_LOG_DEBUG("entry."); + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (txMmapData == NULL || txMmapData->memoryAddress == NULL || txMmapData->transferFrameSize <= 0 || + txMmapData->totalBufferFrames <= 0) { + AUDIO_DRIVER_LOG_ERR("param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + data->mmapData.offset = txMmapData->offset; + data->mmapData.memoryAddress = txMmapData->memoryAddress; + data->mmapData.totalBufferFrames = txMmapData->totalBufferFrames; + data->mmapData.transferFrameSize = txMmapData->transferFrameSize; + data->mmapLoopCount = 0; + + AUDIO_DRIVER_LOG_DEBUG("*******offset=0x%x memoryAddress=0x%x totalBufferFrames=0x%x transferFrameSize=0x%x ", + data->mmapData.offset, data->mmapData.memoryAddress, data->mmapData.totalBufferFrames, + data->mmapData.transferFrameSize); + + ret = AudioMmapWriteTransfer(card); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioMmapTransfer fail."); + return HDF_FAILURE; + } + + AUDIO_DRIVER_LOG_DEBUG("render mmap write success."); + return HDF_SUCCESS; +} + +static int32_t MmapReadData(struct PlatformData *data, const struct AudioMmapData *rxMmapData, uint32_t offset) +{ + uint32_t wPtr; + uint32_t rPtr; + uint32_t validDataSize; + + if (data == NULL || rxMmapData == NULL) { + AUDIO_DRIVER_LOG_ERR("data is null."); + return HDF_FAILURE; + } + + rPtr = data->captureBufInfo.rptrOffSet; + wPtr = data->captureBufInfo.pointer * data->pcmInfo.frameSize; + if (rPtr > wPtr) { + validDataSize = data->captureBufInfo.cirBufSize - rPtr; + if (validDataSize < data->captureBufInfo.trafBufSize) { + data->captureBufInfo.curTrafSize = validDataSize; + } + } + if (!data->pcmInfo.isBigEndian) { + if (AudioDataBigEndianChange((char *)(data->captureBufInfo.virtAddr) + rPtr, + data->captureBufInfo.curTrafSize, data->pcmInfo.bitWidth) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); + return HDF_FAILURE; + } + } + + if (CopyToUser((char *)rxMmapData->memoryAddress + offset, + (char *)(data->captureBufInfo.virtAddr) + rPtr, data->captureBufInfo.curTrafSize) != 0) { + AUDIO_DRIVER_LOG_ERR("CopyToUser failed."); + return HDF_FAILURE; + } + + // 4. update rptr + data->captureBufInfo.rptrOffSet += data->captureBufInfo.curTrafSize; + if (data->captureBufInfo.rptrOffSet >= data->captureBufInfo.cirBufSize) { + data->captureBufInfo.rptrOffSet = 0; + } + data->captureBufInfo.framesPosition += data->captureBufInfo.curTrafSize / data->pcmInfo.frameSize; + + return HDF_SUCCESS; +} + +int32_t AudioMmapReadTransfer(const struct AudioCard *card, const struct AudioMmapData *rxMmapData) +{ + uint32_t offset = 0; + enum CriBuffStatus status; + uint32_t timeout = 0; + struct PlatformData *data = NULL; + + if (!card || !rxMmapData || !rxMmapData->memoryAddress || rxMmapData->totalBufferFrames <= 0) { + AUDIO_DRIVER_LOG_ERR("param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + uint32_t frameSize = data->pcmInfo.frameSize; + uint32_t totalSize = rxMmapData->totalBufferFrames * frameSize; + data->captureBufInfo.pointer = 0; + data->captureBufInfo.curTrafSize = data->captureBufInfo.trafBufSize; + if (data->captureBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("capture buffer is null."); + return HDF_FAILURE; + } + + do { + if (data->captureBufInfo.runStatus == PCM_PAUSE) { + OsalMSleep(5); + continue; + } + + // 1. get buffer status + status = AudioDmaBuffStatus(card); + if (status != ENUM_CIR_BUFF_NORMAL) { + OsalMSleep(SLEEP_TIME); + AUDIO_DRIVER_LOG_DEBUG("dma buff status ENUM_CIR_BUFF_FULL."); + timeout++; + if (timeout >= TIME_OUT_CONST) { + AUDIO_DRIVER_LOG_ERR("timeout failed."); + return HDF_FAILURE; + } + continue; + } + timeout = 0; + + // 2. read data + if (MmapReadData(data, rxMmapData, offset) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("MmapReadData fail."); + return HDF_FAILURE; + } + + offset += data->captureBufInfo.curTrafSize; + + } while (offset < totalSize && data->captureBufInfo.runStatus != 0); + return HDF_SUCCESS; +} + +int32_t AudioPcmMmapRead(const struct AudioCard *card, const struct AudioMmapData *rxMmapData) +{ + int32_t ret; + struct PlatformData *data = NULL; + AUDIO_DRIVER_LOG_DEBUG("entry."); + + ret = (card == NULL || rxMmapData == NULL || rxMmapData->memoryAddress == NULL + || rxMmapData->totalBufferFrames <= 0); + if (ret) { + AUDIO_DRIVER_LOG_ERR("param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + ret = AudioMmapReadTransfer(card, rxMmapData); + if (ret) { + AUDIO_DRIVER_LOG_ERR("AudioMmapReadTransfer fail."); + return HDF_ERR_INVALID_PARAM; + } + + AUDIO_DRIVER_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +static int32_t AudioRenderBuffInit(struct PlatformData *platformData) +{ + int ret; + + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("input para is NULL."); + return HDF_FAILURE; + } + + if (platformData->renderBufInfo.virtAddr != NULL) { + return HDF_SUCCESS; + } + + platformData->renderBufInfo.cirBufMax = MAX_BUFF_SIZE; + platformData->renderBufInfo.phyAddr = 0; + + ret = AudioDmaBufAlloc(platformData, AUDIO_RENDER_STREAM); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Dma Buf Alloc fail."); + return HDF_FAILURE; + } + + if (platformData->renderBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("mem alloc failed."); + return HDF_FAILURE; + } + + (void)memset_s(platformData->renderBufInfo.virtAddr, platformData->renderBufInfo.cirBufMax, + 0, platformData->renderBufInfo.cirBufMax); + + return HDF_SUCCESS; +} + +static int32_t AudioRenderBuffFree(struct PlatformData *platformData) +{ + int ret; + + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + + ret = AudioDmaBufFree(platformData, AUDIO_RENDER_STREAM); + if (ret) { + AUDIO_DRIVER_LOG_ERR("Dma Buf Alloc fail."); + return HDF_FAILURE; + } + + platformData->renderBufInfo.virtAddr = NULL; + platformData->renderBufInfo.phyAddr = 0; + return HDF_SUCCESS; +} + +static int32_t AudioCaptureBuffInit(struct PlatformData *platformData) +{ + int ret; + + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + if (platformData->captureBufInfo.virtAddr != NULL) { + return HDF_SUCCESS; + } + + platformData->captureBufInfo.cirBufMax = MAX_BUFF_SIZE; + platformData->captureBufInfo.phyAddr = 0; + + ret = AudioDmaBufAlloc(platformData, AUDIO_CAPTURE_STREAM); + if (ret) { + AUDIO_DRIVER_LOG_ERR("Dma Buf Alloc fail."); + return HDF_FAILURE; + } + + if (platformData->captureBufInfo.virtAddr == NULL) { + AUDIO_DRIVER_LOG_ERR("mem alloc failed."); + return HDF_FAILURE; + } + + (void)memset_s(platformData->captureBufInfo.virtAddr, platformData->captureBufInfo.cirBufMax, 0, + platformData->captureBufInfo.cirBufMax); + + return HDF_SUCCESS; +} + +static int32_t AudioCaptureBuffFree(struct PlatformData *platformData) +{ + int ret; + + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + + ret = AudioDmaBufFree(platformData, AUDIO_CAPTURE_STREAM); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Dma Buf Alloc fail."); + return HDF_FAILURE; + } + + platformData->captureBufInfo.virtAddr = NULL; + platformData->captureBufInfo.phyAddr = 0; + return HDF_SUCCESS; +} + +int32_t AudioRenderOpen(const struct AudioCard *card) +{ + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (data->renderBufInfo.virtAddr == NULL) { + if (AudioRenderBuffInit(data) != HDF_SUCCESS) { + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} + +int32_t AudioRenderClose(const struct AudioCard *card) +{ + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + return AudioRenderBuffFree(data); +} + +int32_t AudioCaptureOpen(const struct AudioCard *card) +{ + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param card is NULL."); + return HDF_FAILURE; + } + + struct PlatformData *platformData = PlatformDataFromCard(card); + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (platformData->captureBufInfo.virtAddr == NULL) { + if (AudioCaptureBuffInit(platformData) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioCaptureBuffInit: fail."); + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} + +int32_t AudioCaptureClose(const struct AudioCard *card) +{ + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param card is NULL."); + return HDF_FAILURE; + } + + struct PlatformData *platformData = PlatformDataFromCard(card); + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + return AudioCaptureBuffFree(platformData); +} + +int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) +{ + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + switch (cmd) { + case AUDIO_DRV_PCM_IOCTRL_RENDER_START: + if (AudioDmaSubmit(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + + if (AudioDmaPending(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->renderBufInfo.runStatus = PCM_START; + break; + case AUDIO_DRV_PCM_IOCTRL_RENDER_STOP: + if (AudioDmaPause(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->renderBufInfo.runStatus = PCM_STOP; + break; + case AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE: + if (AudioDmaPause(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->renderBufInfo.runStatus = PCM_PAUSE; + break; + case AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME: + if (AudioDmaResume(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampPowerUp(card) != HDF_SUCCESS) { + return HDF_FAILURE; + } + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->renderBufInfo.runStatus = PCM_START; + break; + default: + AUDIO_DRIVER_LOG_ERR("invalude cmd id: %d.", cmd); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) +{ + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param is invalid."); + return HDF_ERR_INVALID_PARAM; + } + + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + switch (cmd) { + case AUDIO_DRV_PCM_IOCTRL_CAPTURE_START: + if (AudioDmaSubmit(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + if (AudioDmaPending(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->captureBufInfo.runStatus = PCM_START; + break; + case AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP: + if (AudioDmaPause(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + return HDF_FAILURE; + } + data->captureBufInfo.runStatus = PCM_STOP; + break; + case AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE: + if (AudioDmaPause(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + data->captureBufInfo.runStatus = PCM_PAUSE; + break; + case AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME: + if (AudioDmaResume(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampPowerUp(card) != HDF_SUCCESS) { + return HDF_FAILURE; + } + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + data->captureBufInfo.runStatus = PCM_START; + break; + default: + AUDIO_DRIVER_LOG_ERR("invalude cmd id: %d.", cmd); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param) +{ + const int chnlCntMin = 1; + const int chnlCntMax = 2; + + if (card == NULL || param == NULL || param->cardServiceName == NULL) { + AUDIO_DRIVER_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + + if (param->channels < chnlCntMin || param->channels > chnlCntMax) { + AUDIO_DRIVER_LOG_ERR("channels param is invalid."); + return HDF_FAILURE; + } + + struct PlatformData *platformData = PlatformDataFromCard(card); + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("platformData is null."); + return HDF_FAILURE; + } + + if (AudioDmaRequestChannel(platformData) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Dma Request Channel fail."); + return HDF_FAILURE; + } + + if (AudioFramatToBitWidth(param->format, &platformData->pcmInfo.bitWidth) != HDF_SUCCESS) { + return HDF_FAILURE; + } + if (AudioSetPcmInfo(platformData, param) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (param->streamType == AUDIO_RENDER_STREAM) { + if (AudioSetRenderBufInfo(platformData, param) != HDF_SUCCESS) { + return HDF_FAILURE; + } + } else if (param->streamType == AUDIO_CAPTURE_STREAM) { + if (AudioSetCaptureBufInfo(platformData, param) != HDF_SUCCESS) { + return HDF_FAILURE; + } + } else { + AUDIO_DRIVER_LOG_ERR("param streamType is invalid."); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioRenderPrepare(const struct AudioCard *card) +{ + int ret; + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param card is NULL."); + return HDF_FAILURE; + } + + struct PlatformData *platformData = PlatformDataFromCard(card); + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (platformData->renderBufInfo.virtAddr != NULL) { + (void)memset_s(platformData->renderBufInfo.virtAddr, platformData->renderBufInfo.cirBufSize, 0, + platformData->renderBufInfo.cirBufSize); + } + platformData->renderBufInfo.wbufOffSet = 0; + platformData->renderBufInfo.wptrOffSet = 0; + platformData->pcmInfo.totalStreamSize = 0; + platformData->renderBufInfo.framesPosition = 0; + platformData->renderBufInfo.pointer = 0; + + ret = AudioDmaConfigChannel(platformData); + if (ret) { + AUDIO_DRIVER_LOG_ERR("Dma Config Channel fail."); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioCapturePrepare(const struct AudioCard *card) +{ + int ret; + if (card == NULL) { + AUDIO_DRIVER_LOG_ERR("param card is NULL."); + return HDF_FAILURE; + } + + struct PlatformData *platformData = PlatformDataFromCard(card); + if (platformData == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (platformData->captureBufInfo.virtAddr != NULL) { + (void)memset_s(platformData->captureBufInfo.virtAddr, platformData->captureBufInfo.cirBufSize, 0, + platformData->captureBufInfo.cirBufSize); + } + platformData->captureBufInfo.rbufOffSet = 0; + platformData->captureBufInfo.rptrOffSet = 0; + platformData->captureBufInfo.chnId = 0; + platformData->pcmInfo.totalStreamSize = 0; + platformData->captureBufInfo.framesPosition = 0; + platformData->captureBufInfo.pointer = 0; + + ret = AudioDmaConfigChannel(platformData); + if (ret) { + AUDIO_DRIVER_LOG_ERR("Dma Config Channel fail."); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioPcmPointer(const struct AudioCard *card, uint32_t *pointer) +{ + int ret; + if (card == NULL || pointer == NULL) { + AUDIO_DRIVER_LOG_ERR("param card is NULL."); + return HDF_FAILURE; + } + + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + ret = AudioDmaPointer(data, pointer); + if (ret != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Dma Pointer fail."); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + + diff --git a/model/audio/core/include/audio_control.h b/model/audio/core/include/audio_control.h index 76ec94c6a..fe418c87e 100755 --- a/model/audio/core/include/audio_control.h +++ b/model/audio/core/include/audio_control.h @@ -52,6 +52,7 @@ struct AudioMixerControl { uint32_t shift; uint32_t rshift; /* right sound channel reg shift */ uint32_t invert; + uint32_t value; }; struct AudioKcontrol { diff --git a/model/audio/core/include/audio_core.h b/model/audio/core/include/audio_core.h index 32a2f860c..762e56be1 100755 --- a/model/audio/core/include/audio_core.h +++ b/model/audio/core/include/audio_core.h @@ -29,27 +29,6 @@ extern "C" { #define AUDIO_DAI_LINK_COMPLETE 1 #define AUDIO_DAI_LINK_UNCOMPLETE 0 -#ifdef __LITEOS__ -#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ - } while (0) -#else -#define AUDIO_DRIVER_LOG_DEBUG(fmt, arg...) do { \ - HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) -#endif - -#define AUDIO_DRIVER_LOG_ERR(fmt, arg...) do { \ - HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - -#define AUDIO_DRIVER_LOG_INFO(fmt, arg...) do { \ - HDF_LOGI("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - -#define AUDIO_DRIVER_LOG_WARNING(fmt, arg...) do { \ - HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - enum AudioDeviceType { AUDIO_DAI_DEVICE, AUDIO_DSP_DEVICE, @@ -78,35 +57,39 @@ int32_t AudioUpdateCodecRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, uint32_t value); int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, const struct AudioMixerControl *mixerControl, uint32_t value); -int32_t AudioUpdateCodecAiaoRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, - uint32_t value); -int32_t AudioUpdateAccessoryAiaoRegBits(struct AccessoryDevice *accessory, - const struct AudioMixerControl *mixerControl, uint32_t value); +int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, struct AudioMixerControl *mixerControl, uint32_t value); struct CodecDevice *AudioKcontrolGetCodec(const struct AudioKcontrol *kcontrol); struct AccessoryDevice *AudioKcontrolGetAccessory(const struct AudioKcontrol *kcontrol); +struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol); int32_t AudioAddControls(struct AudioCard *audioCard, const struct AudioKcontrol *controls, int32_t controlMaxNum); struct AudioKcontrol *AudioAddControl(const struct AudioCard *audioCard, const struct AudioKcontrol *ctl); +int32_t AudioGetCtrlOpsRReg(struct AudioCtrlElemValue *elemValue, + const struct AudioMixerControl *mixerCtrl, uint32_t rcurValue); +int32_t AudioGetCtrlOpsReg(struct AudioCtrlElemValue *elemValue, + const struct AudioMixerControl *mixerCtrl, uint32_t curValue); +int32_t AudioSetCtrlOpsReg(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue, + const struct AudioMixerControl *mixerCtrl, uint32_t *value); +int32_t AudioSetCtrlOpsRReg(const struct AudioCtrlElemValue *elemValue, + struct AudioMixerControl *mixerCtrl, uint32_t *rvalue, bool *updateRReg); +int32_t AudioDaiReadReg(const struct DaiDevice *dai, uint32_t reg, uint32_t *val); +int32_t AudioDaiWriteReg(const struct DaiDevice *dai, uint32_t reg, uint32_t val); + int32_t AudioCodecReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val); int32_t AudioCodecWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val); int32_t AudioAccessoryReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val); int32_t AudioAccessoryWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val); -int32_t AudioCodecAiaoReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val); -int32_t AudioCodecAiaoWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val); -int32_t AudioAccessoryAiaoReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val); -int32_t AudioAccessoryAiaoWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val); int32_t AudioInfoCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemInfo *elemInfo); int32_t AudioCodecGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); int32_t AudioCodecSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); int32_t AudioAccessorySetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); -int32_t AudioCodecAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); -int32_t AudioCodecAiaoSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); -int32_t AudioAccessoryAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); -int32_t AudioAccessoryAiaoSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData, struct DaiData *DaiData); +int32_t AudioCpuDaiSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); +int32_t AudioCpuDaiGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); + #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/core/include/audio_host.h b/model/audio/core/include/audio_host.h index e49c6b0e5..b4d1aa276 100755 --- a/model/audio/core/include/audio_host.h +++ b/model/audio/core/include/audio_host.h @@ -24,27 +24,6 @@ extern "C" { #endif #endif /* __cplusplus */ -#ifdef __LITEOS__ -#define ADM_LOG_DEBUG(fmt, arg...) do { \ - } while (0) -#else -#define ADM_LOG_DEBUG(fmt, arg...) do { \ - HDF_LOGD("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) -#endif - -#define ADM_LOG_ERR(fmt, arg...) do { \ - HDF_LOGE("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - -#define ADM_LOG_INFO(fmt, arg...) do { \ - HDF_LOGI("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - -#define ADM_LOG_WARNING(fmt, arg...) do { \ - HDF_LOGW("[%s][line:%d]: " fmt, __func__, __LINE__, ##arg); \ - } while (0) - #define BUFF_SIZE_MAX 64 #define AUDIO_LIST_HEAD_INIT(name) { &(name), &(name) } @@ -68,6 +47,30 @@ enum AudioFormat { AUDIO_FORMAT_G726 = 0x2000003u, /**< audio G726 */ }; +typedef enum { + AUDIO_SAMPLE_RATE_8000 = 8000, /* 8kHz sample_rate */ + AUDIO_SAMPLE_RATE_12000 = 12000, /* 12kHz sample_rate */ + AUDIO_SAMPLE_RATE_11025 = 11025, /* 11.025kHz sample_rate */ + AUDIO_SAMPLE_RATE_16000 = 16000, /* 16kHz sample_rate */ + AUDIO_SAMPLE_RATE_22050 = 22050, /* 22.050kHz sample_rate */ + AUDIO_SAMPLE_RATE_24000 = 24000, /* 24kHz sample_rate */ + AUDIO_SAMPLE_RATE_32000 = 32000, /* 32kHz sample_rate */ + AUDIO_SAMPLE_RATE_44100 = 44100, /* 44.1kHz sample_rate */ + AUDIO_SAMPLE_RATE_48000 = 48000, /* 48kHz sample_rate */ + AUDIO_SAMPLE_RATE_64000 = 64000, /* 64kHz sample_rate */ + AUDIO_SAMPLE_RATE_96000 = 96000, /* 96kHz sample_rate */ + AUDIO_SAMPLE_RATE_BUTT, +} AudioSampleRate; + +enum AuidoBitWidth { + BIT_WIDTH8 = 8, /* 8 bit witdth */ + BIT_WIDTH16 = 16, /* 16 bit witdth */ + BIT_WIDTH18 = 18, /* 18 bit witdth */ + BIT_WIDTH20 = 20, /* 20 bit witdth */ + BIT_WIDTH24 = 24, /* 24 bit witdth */ + BIT_WIDTH32 = 32, /* 32 bit witdth */ +}; + struct AudioConfigData { const char *cardServiceName; const char *codecName; @@ -80,6 +83,12 @@ struct AudioConfigData { const char *dspDaiName; }; +enum AudioSapmTurnStandbyMode { + AUDIO_SAPM_TURN_STANDBY_LATER = 0, + AUDIO_SAPM_TURN_STANDBY_NOW, + AUDIO_SAPM_TURN_STANDBY_BUTT, +}; + struct AudioCard { struct AudioRuntimeDeivces *rtd; struct AudioConfigData configData; @@ -95,6 +104,7 @@ struct AudioCard { struct DListHead components; /* all components for this card */ struct DListHead paths; /* all paths for this card */ struct DListHead sapmDirty; /* all dirty for this card */ + enum AudioSapmTurnStandbyMode standbyMode; bool sapmSleepState; bool sapmStandbyState; bool sapmMonitorState; @@ -111,6 +121,23 @@ enum AudioStreamType { AUDIO_RENDER_STREAM, }; +struct PcmInfo { + enum AudioStreamType streamType; + /* The number of channels in a frame */ + uint32_t channels; + /* The number of frames per second */ + uint32_t rate; + uint32_t bitWidth; + uint32_t frameSize; + bool isBigEndian; + bool isSignedData; + uint32_t startThreshold; + uint32_t stopThreshold; + uint32_t silenceThreshold; + uint32_t totalStreamSize; + uint32_t interleaved; +}; + struct AudioPcmHwParams { /* The stream type in a frame */ enum AudioStreamType streamType; @@ -153,16 +180,7 @@ struct AudioRxData { unsigned long frames; /* frames number */ }; -struct AudioTxMmapData { - void *memoryAddress; /**< Pointer to the mmap buffer */ - int32_t memoryFd; /**< File descriptor of the mmap buffer */ - int32_t totalBufferFrames; /**< Total size of the mmap buffer (unit: frame )*/ - int32_t transferFrameSize; /**< Transfer size (unit: frame) */ - int32_t isShareable; /**< Whether the mmap buffer can be shared among processes */ - uint32_t offset; -}; - -struct AudioRxMmapData { +struct AudioMmapData { void *memoryAddress; /**< Pointer to the mmap buffer */ int32_t memoryFd; /**< File descriptor of the mmap buffer */ int32_t totalBufferFrames; /**< Total size of the mmap buffer (unit: frame )*/ diff --git a/model/audio/core/include/audio_parse.h b/model/audio/core/include/audio_parse.h index 9ded34ee9..cd7c96f06 100755 --- a/model/audio/core/include/audio_parse.h +++ b/model/audio/core/include/audio_parse.h @@ -10,6 +10,7 @@ #define AUDIO_PARSE_H #include "audio_host.h" +#include "audio_control.h" #ifdef __cplusplus #if __cplusplus @@ -17,8 +18,83 @@ extern "C" { #endif #endif /* __cplusplus */ +#define AUDIO_CONFIG_MAX_ITEM 100 + +static const char *g_audioControlsList[] = { + "Main Playback Volume", "Main Capture Volume", + "Playback Mute", "Capture Mute", "Mic Left Gain", + "Mic Right Gain", "External Codec Enable", + "Internally Codec Enable", "Render Channel Mode", "Captrue Channel Mode" +}; + +static char *g_audioSapmCompNameList[] = { + "ADCL", "ADCR", "DACL", "DACR", "LPGA", "RPGA", "SPKL", "SPKR", "MIC" +}; + +static char *g_audioSapmCfgNameList[] = { + "LPGA MIC Switch", "RPGA MIC Switch", "Dacl enable", "Dacr enable" +}; + +enum AudioRegOpsType { + AUDIO_RSET_GROUP = 0, + AUDIO_INIT_GROUP, + AUDIO_CTRL_PATAM_GROUP, + AUDIO_CTRL_SAPM_PATAM_GROUP, + AUDIO_DAI_STARTUP_PATAM_GROUP, + AUDIO_DAI_PATAM_GROUP, + AUDIO_CTRL_CFG_GROUP, + AUDIO_SAPM_COMP_GROUP, + AUDIO_SAPM_CFG_GROUP, + AUDIO_GROUP_MAX +}; + +struct AudioIdInfo { + const char *chipName; + uint32_t chipIdRegister; + uint32_t chipIdSize; +}; + +struct AudioControlConfig { + uint8_t arrayIndex; + uint8_t iface; + uint8_t enable; +}; + +struct AudioAddrConfig { + uint32_t addr; + uint32_t value; +}; + +struct AudioSapmCtrlConfig { + uint8_t sapmType; + uint8_t compNameIndex; + uint8_t reg; + uint8_t mask; + uint8_t shift; + uint8_t invert; + uint8_t kcontrolNews; + uint8_t kcontrolsNum; +}; + + +struct AudioRegCfgGroupNode { + uint8_t itemNum; + enum AudioRegOpsType groupIndex; + struct AudioAddrConfig *addrCfgItem; + struct AudioMixerControl *regCfgItem; + struct AudioControlConfig *ctrlCfgItem; + struct AudioSapmCtrlConfig *sapmCompItem; +}; + +struct AudioRegCfgData { + struct AudioIdInfo audioIdInfo; + struct AudioRegCfgGroupNode *audioRegParams[AUDIO_GROUP_MAX]; +}; + int32_t AudioFillConfigData(const struct HdfDeviceObject *device, struct AudioConfigData *configData); +int32_t CodecGetRegConfig(const struct HdfDeviceObject *device, struct AudioRegCfgData *configData); + #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index f61a73415..fa6c5f00f 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -7,6 +7,8 @@ */ #include "audio_core.h" +#include "osal_io.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_core @@ -16,27 +18,27 @@ AUDIO_LIST_HEAD(codecController); AUDIO_LIST_HEAD(dspController); AUDIO_LIST_HEAD(accessoryController); -int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *data) +int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *platformData) { - struct PlatformDevice *platform = NULL; + struct PlatformDevice *platformDevice = NULL; - if ((device == NULL) || (data == NULL)) { - ADM_LOG_ERR("Input params check error: device=%p, data=%p.", device, data); + if ((device == NULL) || (platformData == NULL)) { + ADM_LOG_ERR("Input params check error: device=%p, platformData=%p.", device, platformData); return HDF_ERR_INVALID_OBJECT; } - platform = (struct PlatformDevice *)OsalMemCalloc(sizeof(*platform)); - if (platform == NULL) { - ADM_LOG_ERR("Malloc platform device fail!"); + platformDevice = (struct PlatformDevice *)OsalMemCalloc(sizeof(*platformDevice)); + if (platformDevice == NULL) { + ADM_LOG_ERR("Malloc platformDevice device fail!"); return HDF_ERR_MALLOC_FAIL; } - platform->devPlatformName = data->drvPlatformName; - platform->devData = data; - platform->device = device; - DListInsertHead(&platform->list, &platformController); - ADM_LOG_INFO("Register [%s] success.", platform->devPlatformName); + platformDevice->devPlatformName = platformData->drvPlatformName; + platformDevice->devData = platformData; + platformDevice->device = device; + DListInsertHead(&platformDevice->list, &platformController); + ADM_LOG_INFO("Register [%s] success.", platformDevice->devPlatformName); return HDF_SUCCESS; } @@ -121,6 +123,7 @@ int32_t AudioRegisterCodec(struct HdfDeviceObject *device, struct CodecData *cod ret = AudioSocDeviceRegister(device, (void *)daiData, AUDIO_DAI_DEVICE); if (ret != HDF_SUCCESS) { + OsalIoUnmap((void *)((uintptr_t)(void*)&(codec->devData->virtualAddress))); OsalMemFree(codec); ADM_LOG_ERR("Register dai device fail ret=%d", ret); return HDF_ERR_IO; @@ -453,78 +456,50 @@ int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, return HDF_SUCCESS; } -int32_t AudioUpdateCodecAiaoRegBits(struct CodecDevice *codec, - const struct AudioMixerControl *mixerControl, uint32_t value) +int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; uint32_t curValue = 0; uint32_t mixerControlMask; - ADM_LOG_DEBUG("Entry to update AIAO codec reg bits."); + struct DaiData *data = NULL; - if (codec == NULL || mixerControl == NULL) { - ADM_LOG_ERR("Invalid AIAO codec param."); + if (dai == NULL || dai->devData == NULL || mixerControl == NULL) { + ADM_LOG_ERR("Invalid accessory param."); return HDF_ERR_INVALID_OBJECT; } + data = dai->devData; - value = value << mixerControl->shift; - mixerControlMask = mixerControl->mask << mixerControl->shift; - - OsalMutexLock(&codec->mutex); - ret = AudioCodecAiaoReadReg(codec, mixerControl->reg, &curValue); - if (ret != HDF_SUCCESS) { - OsalMutexUnlock(&codec->mutex); - ADM_LOG_ERR("Read AIAO codec reg fail ret=%d.", ret); + if (value > mixerControl->max || value < mixerControl->min) { + ADM_LOG_ERR("value is invalued=%d.", value); return HDF_FAILURE; } - curValue = (curValue & ~mixerControlMask) | (value & mixerControlMask); - ret = AudioCodecAiaoWriteReg(codec, mixerControl->reg, curValue); - if (ret != HDF_SUCCESS) { - OsalMutexUnlock(&codec->mutex); - ADM_LOG_ERR("Write AIAO codec reg fail ret=%d", ret); - return HDF_FAILURE; - } - OsalMutexUnlock(&codec->mutex); - - ADM_LOG_DEBUG("Update AIAO codec reg bits successful."); - return HDF_SUCCESS; -} - -int32_t AudioUpdateAccessoryAiaoRegBits(struct AccessoryDevice *accessory, - const struct AudioMixerControl *mixerControl, uint32_t value) -{ - int32_t ret; - uint32_t curValue = 0; - uint32_t mixerControlMask; - ADM_LOG_DEBUG("Entry to update AIAO accessory reg bits."); - - if (accessory == NULL || mixerControl == NULL) { - ADM_LOG_ERR("Invalid AIAO accessory param."); - return HDF_ERR_INVALID_OBJECT; - } - value = value << mixerControl->shift; mixerControlMask = mixerControl->mask << mixerControl->shift; - OsalMutexLock(&accessory->mutex); - ret = AudioAccessoryAiaoReadReg(accessory, mixerControl->reg, &curValue); + OsalMutexLock(&data->mutex); + ret = AudioDaiReadReg(dai, mixerControl->reg, &curValue); if (ret != HDF_SUCCESS) { - OsalMutexUnlock(&accessory->mutex); - ADM_LOG_ERR("Read AIAO accessory reg fail ret=%d.", ret); + OsalMutexUnlock(&data->mutex); + ADM_LOG_ERR("Read reg fail ret=%d.", ret); return HDF_FAILURE; } + curValue = (curValue & ~mixerControlMask) | (value & mixerControlMask); - ret = AudioAccessoryAiaoWriteReg(accessory, mixerControl->reg, curValue); + + ADM_LOG_DEBUG("reg: 0x%x curValue: 0x%x.", mixerControl->reg, curValue); + ret = AudioDaiWriteReg(dai, mixerControl->reg, curValue); if (ret != HDF_SUCCESS) { - OsalMutexUnlock(&accessory->mutex); - ADM_LOG_ERR("Write AIAO accessory reg fail ret=%d", ret); + OsalMutexUnlock(&data->mutex); + ADM_LOG_ERR("Write reg fail ret=%d", ret); return HDF_FAILURE; } - OsalMutexUnlock(&accessory->mutex); + OsalMutexUnlock(&data->mutex); - ADM_LOG_DEBUG("Update AIAO accessory reg bits successful."); + ADM_LOG_DEBUG("Success."); return HDF_SUCCESS; } + struct CodecDevice *AudioKcontrolGetCodec(const struct AudioKcontrol *kcontrol) { struct AudioCard *audioCard = NULL; @@ -559,6 +534,23 @@ struct AccessoryDevice *AudioKcontrolGetAccessory(const struct AudioKcontrol *kc return audioCard->rtd->accessory; } +struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol) +{ + struct AudioCard *audioCard = NULL; + if (kcontrol == NULL || kcontrol->pri == NULL) { + ADM_LOG_ERR("Input param kcontrol is NULL."); + return NULL; + } + + audioCard = (struct AudioCard *)((volatile uintptr_t)(kcontrol->pri)); + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("Get codec or rtd fail."); + return NULL; + } + + return audioCard->rtd->cpuDai; +} + struct AudioKcontrol *AudioAddControl(const struct AudioCard *audioCard, const struct AudioKcontrol *ctrl) { struct AudioKcontrol *control = NULL; @@ -608,61 +600,67 @@ int32_t AudioAddControls(struct AudioCard *audioCard, const struct AudioKcontrol return HDF_SUCCESS; } -int32_t AudioCodecReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val) +int32_t AudioDaiReadReg(const struct DaiDevice *dai, uint32_t reg, uint32_t *val) { int32_t ret; - if (codec == NULL || codec->devData == NULL || codec->devData->Read == NULL || val == NULL) { - ADM_LOG_ERR("Input param codec is NULL."); + unsigned long virtualAddress; + if (dai == NULL || dai->devData == NULL || dai->devData->Read == NULL || val == NULL) { + ADM_LOG_ERR("Input param is NULL."); return HDF_FAILURE; } - ret = codec->devData->Read(codec, reg, val); + virtualAddress = dai->devData->regDaiBase; + ret = dai->devData->Read(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Codec device read fail."); + ADM_LOG_ERR("dai device read fail."); return HDF_FAILURE; } return HDF_SUCCESS; } -int32_t AudioAccessoryReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val) +int32_t AudioDaiWriteReg(const struct DaiDevice *dai, uint32_t reg, uint32_t val) { int32_t ret; - if (accessory == NULL || accessory->devData == NULL || accessory->devData->Read == NULL || val == NULL) { - ADM_LOG_ERR("Input param accessory is NULL."); + unsigned long virtualAddress; + if (dai == NULL || dai->devData == NULL || dai->devData->Write == NULL) { + ADM_LOG_ERR("Input param codec is NULL."); return HDF_FAILURE; } - ret = accessory->devData->Read(accessory, reg, val); + virtualAddress = dai->devData->regDaiBase; + ret = dai->devData->Write(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Accessory device read fail."); + ADM_LOG_ERR("dai device write fail."); return HDF_FAILURE; } return HDF_SUCCESS; } -int32_t AudioCodecAiaoReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val) +int32_t AudioCodecReadReg(const struct CodecDevice *codec, uint32_t reg, uint32_t *val) { int32_t ret; - if (codec == NULL || codec->devData == NULL || codec->devData->AiaoRead == NULL || val == NULL) { + unsigned long virtualAddress; + if (codec == NULL || codec->devData == NULL || codec->devData->Read == NULL || val == NULL) { ADM_LOG_ERR("Input param codec is NULL."); return HDF_FAILURE; } - ret = codec->devData->AiaoRead(codec, reg, val); + virtualAddress = codec->devData->virtualAddress; + ret = codec->devData->Read(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Device read fail."); + ADM_LOG_ERR("Codec device read fail."); return HDF_FAILURE; } return HDF_SUCCESS; } -int32_t AudioAccessoryAiaoReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val) +int32_t AudioAccessoryReadReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t *val) { int32_t ret; - if (accessory == NULL || accessory->devData == NULL || accessory->devData->AiaoRead == NULL || val == NULL) { + if (accessory == NULL || accessory->devData == NULL || accessory->devData->Read == NULL || val == NULL) { ADM_LOG_ERR("Input param accessory is NULL."); return HDF_FAILURE; } - ret = accessory->devData->AiaoRead(accessory, reg, val); + ret = accessory->devData->Read(accessory, reg, val); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Device read fail."); + ADM_LOG_ERR("Accessory device read fail."); return HDF_FAILURE; } return HDF_SUCCESS; @@ -671,11 +669,13 @@ int32_t AudioAccessoryAiaoReadReg(const struct AccessoryDevice *accessory, uint3 int32_t AudioCodecWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val) { int32_t ret; + unsigned long virtualAddress; if (codec == NULL || codec->devData == NULL || codec->devData->Write == NULL) { ADM_LOG_ERR("Input param codec is NULL."); return HDF_FAILURE; } - ret = codec->devData->Write(codec, reg, val); + virtualAddress = codec->devData->virtualAddress; + ret = codec->devData->Write(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("Codec device write fail."); return HDF_FAILURE; @@ -698,36 +698,6 @@ int32_t AudioAccessoryWriteReg(const struct AccessoryDevice *accessory, uint32_t return HDF_SUCCESS; } -int32_t AudioCodecAiaoWriteReg(const struct CodecDevice *codec, uint32_t reg, uint32_t val) -{ - int32_t ret; - if (codec == NULL || codec->devData == NULL || codec->devData->AiaoWrite == NULL) { - ADM_LOG_ERR("Input param codec aiao is NULL."); - return HDF_FAILURE; - } - ret = codec->devData->AiaoWrite(codec, reg, val); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Codec aiao device write fail."); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -int32_t AudioAccessoryAiaoWriteReg(const struct AccessoryDevice *accessory, uint32_t reg, uint32_t val) -{ - int32_t ret; - if (accessory == NULL || accessory->devData == NULL || accessory->devData->AiaoWrite == NULL) { - ADM_LOG_ERR("Input param accessory aiao is NULL."); - return HDF_FAILURE; - } - ret = accessory->devData->AiaoWrite(accessory, reg, val); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Accessory aiao device write fail."); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - int32_t AudioInfoCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemInfo *elemInfo) { struct AudioMixerControl *mixerCtrl = NULL; @@ -750,7 +720,7 @@ int32_t AudioInfoCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlE return HDF_SUCCESS; } -static int32_t AudioGetCtrlOpsRReg(struct AudioCtrlElemValue *elemValue, +int32_t AudioGetCtrlOpsRReg(struct AudioCtrlElemValue *elemValue, const struct AudioMixerControl *mixerCtrl, uint32_t rcurValue) { if (elemValue == NULL || mixerCtrl == NULL) { @@ -777,7 +747,7 @@ static int32_t AudioGetCtrlOpsRReg(struct AudioCtrlElemValue *elemValue, return HDF_SUCCESS; } -static int32_t AudioGetCtrlOpsReg(struct AudioCtrlElemValue *elemValue, +int32_t AudioGetCtrlOpsReg(struct AudioCtrlElemValue *elemValue, const struct AudioMixerControl *mixerCtrl, uint32_t curValue) { if (elemValue == NULL || mixerCtrl == NULL) { @@ -859,71 +829,7 @@ int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct Au return HDF_SUCCESS; } -int32_t AudioCodecAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) -{ - uint32_t curValue = 0; - uint32_t rcurValue = 0; - struct CodecDevice *codec = NULL; - struct AudioMixerControl *mixerCtrl = NULL; - if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { - ADM_LOG_ERR("CODECAIAO input param is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - codec = AudioKcontrolGetCodec(kcontrol); - mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue); - if (mixerCtrl == NULL || codec == NULL) { - ADM_LOG_ERR("mixerCtrl and codec is NULL."); - return HDF_FAILURE; - } - if (AudioCodecAiaoReadReg(codec, mixerCtrl->reg, &curValue) != HDF_SUCCESS || - AudioCodecAiaoReadReg(codec, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) { - ADM_LOG_ERR("Read Reg fail."); - return HDF_FAILURE; - } - if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS || - AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio CODECAIAO get kcontrol reg and rreg fail."); - return HDF_FAILURE; - } - - ADM_LOG_DEBUG("Get CODECAIAO ctrl switch successful."); - return HDF_SUCCESS; -} - -int32_t AudioAccessoryAiaoGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) -{ - uint32_t curValue = 0; - uint32_t rcurValue = 0; - struct AccessoryDevice *accessory = NULL; - struct AudioMixerControl *mixerCtrl = NULL; - if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { - ADM_LOG_ERR("ACCESSORYCAIAO input param is NULL."); - return HDF_ERR_INVALID_OBJECT; - } - - accessory = AudioKcontrolGetAccessory(kcontrol); - mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue); - if (mixerCtrl == NULL || accessory == NULL) { - ADM_LOG_ERR("mixerCtrl and accessory is NULL."); - return HDF_FAILURE; - } - if (AudioAccessoryAiaoReadReg(accessory, mixerCtrl->reg, &curValue) != HDF_SUCCESS || - AudioAccessoryAiaoReadReg(accessory, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) { - ADM_LOG_ERR("Read Reg fail."); - return HDF_FAILURE; - } - if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS || - AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio ACCESSORYCAIAO get kcontrol reg and rreg fail."); - return HDF_FAILURE; - } - - ADM_LOG_DEBUG("Get ACCESSORYCAIAO ctrl switch successful."); - return HDF_SUCCESS; -} - -static int32_t AudioSetCtrlOpsReg(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue, +int32_t AudioSetCtrlOpsReg(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue, const struct AudioMixerControl *mixerCtrl, uint32_t *value) { if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL || @@ -944,7 +850,7 @@ static int32_t AudioSetCtrlOpsReg(const struct AudioKcontrol *kcontrol, const st return HDF_SUCCESS; } -static int32_t AudioSetCtrlOpsRReg(const struct AudioCtrlElemValue *elemValue, +int32_t AudioSetCtrlOpsRReg(const struct AudioCtrlElemValue *elemValue, struct AudioMixerControl *mixerCtrl, uint32_t *rvalue, bool *updateRReg) { uint32_t rshift; @@ -1054,79 +960,74 @@ int32_t AudioAccessorySetCtrlOps(const struct AudioKcontrol *kcontrol, const str return HDF_SUCCESS; } -int32_t AudioCodecAiaoSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue) +int32_t AudioCpuDaiSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue) { uint32_t value; uint32_t rvalue; bool updateRReg = false; - struct CodecDevice *codec = NULL; + struct DaiDevice *dai = NULL; struct AudioMixerControl *mixerCtrl = NULL; if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL) { - ADM_LOG_ERR("Audio codec aiao input param is NULL."); + ADM_LOG_ERR("Audio input param is NULL."); return HDF_ERR_INVALID_OBJECT; } mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue); if (AudioSetCtrlOpsReg(kcontrol, elemValue, mixerCtrl, &value) != HDF_SUCCESS) { - ADM_LOG_ERR("AudioSetCtrlOpsReg fail."); - return HDF_FAILURE; + ADM_LOG_ERR("AudioSetCtrlOpsReg is fail."); + return HDF_ERR_INVALID_OBJECT; } - - codec = AudioKcontrolGetCodec(kcontrol); - if (AudioUpdateCodecAiaoRegBits(codec, mixerCtrl, value) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio codec aiao stereo update reg bits fail."); + dai = AudioKcontrolGetCpuDai(kcontrol); + if (dai == NULL) { + ADM_LOG_ERR("AudioKcontrolGetCodec is fail."); + return HDF_ERR_INVALID_OBJECT; + } + if (AudioUpdateDaiRegBits(dai, mixerCtrl, value) != HDF_SUCCESS) { + ADM_LOG_ERR("Audio codec stereo update reg bits fail."); return HDF_FAILURE; } if (AudioSetCtrlOpsRReg(elemValue, mixerCtrl, &rvalue, &updateRReg) != HDF_SUCCESS) { - ADM_LOG_ERR("AudioSetCtrlOpsRReg fail."); - return HDF_FAILURE; + ADM_LOG_ERR("AudioSetCtrlOpsRReg is fail."); + return HDF_ERR_INVALID_OBJECT; } + if (updateRReg) { - if (AudioUpdateCodecAiaoRegBits(codec, mixerCtrl, rvalue) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio codec aiao stereo update reg bits fail."); + if (AudioUpdateDaiRegBits(dai, mixerCtrl, rvalue) != HDF_SUCCESS) { + ADM_LOG_ERR("Audio codec stereo update reg bits fail."); return HDF_FAILURE; } } - return HDF_SUCCESS; } -int32_t AudioAccessoryAiaoSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue) +int32_t AudioCpuDaiGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue) { - uint32_t value; - uint32_t rvalue; - bool updateRReg = false; - struct AccessoryDevice *accessory = NULL; + uint32_t curValue = 0; + uint32_t rcurValue = 0; struct AudioMixerControl *mixerCtrl = NULL; - if (kcontrol == NULL || (kcontrol->privateValue <= 0) || elemValue == NULL) { - ADM_LOG_ERR("Audio accessory aiao input param is NULL."); + struct DaiDevice *dai = NULL; + if (kcontrol == NULL || kcontrol->privateValue <= 0 || elemValue == NULL) { + ADM_LOG_ERR("Audio input param is NULL."); return HDF_ERR_INVALID_OBJECT; } - mixerCtrl = (struct AudioMixerControl *)((volatile uintptr_t)kcontrol->privateValue); - if (AudioSetCtrlOpsReg(kcontrol, elemValue, mixerCtrl, &value) != HDF_SUCCESS) { - ADM_LOG_ERR("AudioSetCtrlOpsReg fail."); + dai = AudioKcontrolGetCpuDai(kcontrol); + if (mixerCtrl == NULL || dai == NULL) { + ADM_LOG_ERR("mixerCtrl and codec is NULL."); return HDF_FAILURE; } - - accessory = AudioKcontrolGetAccessory(kcontrol); - if (AudioUpdateAccessoryAiaoRegBits(accessory, mixerCtrl, value) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio accessory aiao stereo update reg bits fail."); + if (AudioDaiReadReg(dai, mixerCtrl->reg, &curValue) != HDF_SUCCESS || + AudioDaiReadReg(dai, mixerCtrl->rreg, &rcurValue) != HDF_SUCCESS) { + ADM_LOG_ERR("Read Reg fail."); return HDF_FAILURE; } - - if (AudioSetCtrlOpsRReg(elemValue, mixerCtrl, &rvalue, &updateRReg) != HDF_SUCCESS) { - ADM_LOG_ERR("AudioSetCtrlOpsRReg fail."); + if (AudioGetCtrlOpsReg(elemValue, mixerCtrl, curValue) != HDF_SUCCESS || + AudioGetCtrlOpsRReg(elemValue, mixerCtrl, rcurValue) != HDF_SUCCESS) { + ADM_LOG_ERR("Audio codec get kcontrol reg and rreg fail."); return HDF_FAILURE; } - if (updateRReg) { - if (AudioUpdateAccessoryAiaoRegBits(accessory, mixerCtrl, rvalue) != HDF_SUCCESS) { - ADM_LOG_ERR("Audio accessory aiao stereo update reg bits fail."); - return HDF_FAILURE; - } - } - return HDF_SUCCESS; } + diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index 574cbdf1e..22f5235cf 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -11,6 +11,7 @@ #include "audio_core.h" #include "audio_parse.h" #include "audio_sapm.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_host @@ -164,7 +165,7 @@ static int32_t AudioDspDevInit(const struct AudioCard *audioCard) return HDF_SUCCESS; } -static int32_t AudioCodecDaiDevInit(const struct AudioCard *audioCard) +static int32_t AudioCodecDaiDevInit(struct AudioCard *audioCard) { struct AudioRuntimeDeivces *rtd = NULL; struct DaiDevice *codecDai = NULL; @@ -194,7 +195,7 @@ static int32_t AudioCodecDaiDevInit(const struct AudioCard *audioCard) return HDF_SUCCESS; } -static int32_t AudioAccessoryDaiDevInit(const struct AudioCard *audioCard) +static int32_t AudioAccessoryDaiDevInit(struct AudioCard *audioCard) { struct AudioRuntimeDeivces *rtd = NULL; struct DaiDevice *accessoryDai = NULL; @@ -224,7 +225,7 @@ static int32_t AudioAccessoryDaiDevInit(const struct AudioCard *audioCard) return HDF_SUCCESS; } -static int32_t AudioCpuDaiDevInit(const struct AudioCard *audioCard) +static int32_t AudioCpuDaiDevInit(struct AudioCard *audioCard) { struct AudioRuntimeDeivces *rtd = NULL; struct DaiDevice *cpuDai = NULL; @@ -254,7 +255,7 @@ static int32_t AudioCpuDaiDevInit(const struct AudioCard *audioCard) return HDF_SUCCESS; } -static int32_t AudioDspDaiDevInit(const struct AudioCard *audioCard) +static int32_t AudioDspDaiDevInit(struct AudioCard *audioCard) { struct AudioRuntimeDeivces *rtd = NULL; struct DaiDevice *dspDai = NULL; @@ -295,22 +296,18 @@ static int32_t AudioInitDaiLink(struct AudioCard *audioCard) if (AudioPlatformDevInit(audioCard) || AudioCpuDaiDevInit(audioCard)) { ADM_LOG_ERR("Platform and CpuDai init fail."); - return HDF_ERR_IO; } if ((AudioCodecDevInit(audioCard) || AudioCodecDaiDevInit(audioCard))) { - ADM_LOG_ERR("codec init fail."); - return HDF_ERR_IO; + ADM_LOG_ERR("codec Device init fail."); } if (AudioAccessoryDevInit(audioCard) || AudioAccessoryDaiDevInit(audioCard)) { - ADM_LOG_ERR("Accessory init fail."); - return HDF_ERR_IO; + ADM_LOG_ERR("Accessory Device init fail."); } if (AudioDspDevInit(audioCard) || AudioDspDaiDevInit(audioCard)) { - ADM_LOG_ERR("Dsp Dai init fail."); - return HDF_ERR_IO; + ADM_LOG_ERR("Dsp Device init fail."); } ADM_LOG_DEBUG("success."); @@ -387,6 +384,8 @@ static int32_t AudioDriverInit(struct HdfDeviceObject *device) return HDF_ERR_IO; } + audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER; + /* Bind specific codec、platform and dai device */ ret = AudioBindDaiLink(audioCard, &(audioCard->configData)); if (ret != HDF_SUCCESS) { diff --git a/model/audio/core/src/audio_parse.c b/model/audio/core/src/audio_parse.c index b483b3c0b..751b9af2b 100755 --- a/model/audio/core/src/audio_parse.c +++ b/model/audio/core/src/audio_parse.c @@ -7,9 +7,61 @@ */ #include "audio_parse.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_parse +enum AudioRegCfgIndex { + AUDIO_REG_CFG_REG_INDEX = 0, + AUDIO_REG_CFG_RREG_INDEX, + AUDIO_REG_CFG_SHIFT_INDEX, + AUDIO_REG_CFG_RSHIFT_INDEX, + AUDIO_REG_CFG_MIN_INDEX, + AUDIO_REG_CFG_MAX_INDEX, + AUDIO_REG_CFG_MASK_INDEX, + AUDIO_REG_CFG_INVERT_INDEX, + AUDIO_REG_CFG_VALUE_INDEX, + AUDIO_REG_CFG_INDEX_MAX +}; + +enum AudioAddrCfgIndex { + AUDIO_ADDR_CFG_REG_INDEX = 0, + AUDIO_ADDR_CFG_VALUE_INDEX, + AUDIO_ADDR_CFG_INDEX_MAX +}; + +enum AudioCrtlCfgIndex { + AUDIO_CTRL_CFG_INDEX_INDEX = 0, + AUDIO_CTRL_CFG_IFACE_INDEX, + AUDIO_CTRL_CFG_ENABLE_INDEX, + AUDIO_CTRL_CFG_INDEX_MAX +}; + +enum AudioSapmComponentIndex { + AUDIO_SAPM_COMP_INDEX_TYPE = 0, + AUDIO_SAPM_COMP_INDEX_NAME, + AUDIO_SAPM_COMP_INDEX_REG, + AUDIO_SAPM_COMP_INDEX_MASK, + AUDIO_SAPM_COMP_INDEX_SHIFT, + AUDIO_SAPM_COMP_INDEX_INVERT, + AUDIO_SAPM_COMP_INDEX_KCTL, + AUDIO_SAPM_COMP_INDEX_KCTLNUM, + AUDIO_SAPM_COMP_INDEX_MAX +}; + + +static char *g_audioRegGroupName[AUDIO_GROUP_MAX] = { + "resetSeqConfig", + "initSeqConfig", + "ctrlParamsSeqConfig", + "ctrlSapmParamsSeqConfig", + "daiStartupSeqConfig", + "daiParamsSeqConfig", + "controlsConfig", + "sapmComponent", + "sapmConfig" +}; + int32_t AudioFillConfigData(const struct HdfDeviceObject *device, struct AudioConfigData *configData) { const struct DeviceResourceNode *node = NULL; @@ -58,3 +110,382 @@ int32_t AudioFillConfigData(const struct HdfDeviceObject *device, struct AudioCo return HDF_SUCCESS; } + +static uint32_t GetAudioRegGroupNameIndex(const char *name) +{ + uint32_t index; + + if (name == NULL) { + return AUDIO_GROUP_MAX; + } + + for (index = 0; index < AUDIO_GROUP_MAX; ++index) { + if ((g_audioRegGroupName[index] != NULL) && (strcmp(name, g_audioRegGroupName[index]) == 0)) { + break; + } + } + + return index; +} + +static uint32_t* GetRegArray(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, + struct AudioRegCfgGroupNode* group, uint32_t indexMax) +{ + int32_t ret; + + if (group == NULL || parser == NULL || regNode == NULL || indexMax == 0) { + ADM_LOG_ERR("Input para check error"); + return NULL; + } + + int32_t index = group->groupIndex; + if (index >= AUDIO_GROUP_MAX) { + ADM_LOG_ERR("Input indexMax=%d error", index); + return NULL; + } + + int32_t num = parser->GetElemNum(regNode, g_audioRegGroupName[index]); + if (num <= 0 || num > AUDIO_CONFIG_MAX_ITEM) { + ADM_LOG_ERR("parser %s element num failed", g_audioRegGroupName[index]); + return NULL; + } + + group->itemNum = (num + 1) / indexMax; + + uint32_t *buf = (uint32_t *)OsalMemCalloc(sizeof(uint32_t) * num); + if (buf == NULL) { + ADM_LOG_ERR("malloc reg array buf failed!"); + return NULL; + } + + ret = parser->GetUint32Array(regNode, g_audioRegGroupName[index], buf, num, 0); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("parser %s reg array failed", g_audioRegGroupName[index]); + OsalMemFree(buf); + return NULL; + } + return buf; +} + +static int32_t ParseAudioRegItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, + struct AudioRegCfgGroupNode* group) +{ + int32_t step; + int32_t index; + + if (group == NULL || parser == NULL || regNode == NULL) { + ADM_LOG_ERR("Input para check error"); + return HDF_FAILURE; + } + + int32_t *buf = GetRegArray(parser, regNode, group, AUDIO_REG_CFG_INDEX_MAX); + if (buf == NULL) { + ADM_LOG_ERR("malloc reg array buf failed!"); + return HDF_FAILURE; + } + + group->regCfgItem = + (struct AudioMixerControl*)OsalMemCalloc(group->itemNum * sizeof(*(group->regCfgItem))); + if (group->regCfgItem == NULL) { + OsalMemFree(buf); + ADM_LOG_ERR("malloc audio reg config item failed!"); + return HDF_ERR_MALLOC_FAIL; + } + + for (index = 0; index < group->itemNum; ++index) { + step = AUDIO_REG_CFG_INDEX_MAX * index; + + group->regCfgItem[index].reg = buf[step + AUDIO_REG_CFG_REG_INDEX]; + group->regCfgItem[index].rreg = buf[step + AUDIO_REG_CFG_RREG_INDEX]; + group->regCfgItem[index].shift = buf[step + AUDIO_REG_CFG_SHIFT_INDEX]; + group->regCfgItem[index].rshift = buf[step + AUDIO_REG_CFG_RSHIFT_INDEX]; + group->regCfgItem[index].min = buf[step + AUDIO_REG_CFG_MIN_INDEX]; + group->regCfgItem[index].max = buf[step + AUDIO_REG_CFG_MAX_INDEX]; + group->regCfgItem[index].mask = buf[step + AUDIO_REG_CFG_MASK_INDEX]; + group->regCfgItem[index].invert = buf[step + AUDIO_REG_CFG_INVERT_INDEX]; + group->regCfgItem[index].value = buf[step + AUDIO_REG_CFG_VALUE_INDEX]; + } + OsalMemFree(buf); + + return HDF_SUCCESS; +} + +static int32_t ParseAudioSapmItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, + struct AudioRegCfgGroupNode* group) +{ + int32_t step; + int32_t index; + + if (group == NULL || parser == NULL || regNode == NULL) { + ADM_LOG_ERR("Input para check error"); + return HDF_FAILURE; + } + + uint32_t *buf = GetRegArray(parser, regNode, group, AUDIO_SAPM_COMP_INDEX_MAX); + if (buf == NULL) { + ADM_LOG_ERR("malloc reg array buf failed!"); + return HDF_FAILURE; + } + + group->sapmCompItem = + (struct AudioSapmCtrlConfig*)OsalMemCalloc(group->itemNum * sizeof(*(group->sapmCompItem))); + if (group->sapmCompItem == NULL) { + OsalMemFree(buf); + ADM_LOG_ERR("malloc audio reg config item failed!"); + return HDF_ERR_MALLOC_FAIL; + } + + for (index = 0; index < group->itemNum; ++index) { + step = AUDIO_SAPM_COMP_INDEX_MAX * index; + group->sapmCompItem[index].sapmType = buf[step + AUDIO_SAPM_COMP_INDEX_TYPE]; + group->sapmCompItem[index].compNameIndex = buf[step + AUDIO_SAPM_COMP_INDEX_NAME]; + group->sapmCompItem[index].reg = buf[step + AUDIO_SAPM_COMP_INDEX_REG]; + group->sapmCompItem[index].mask = buf[step + AUDIO_SAPM_COMP_INDEX_MASK]; + group->sapmCompItem[index].shift = buf[step + AUDIO_SAPM_COMP_INDEX_SHIFT]; + group->sapmCompItem[index].invert = buf[step + AUDIO_SAPM_COMP_INDEX_INVERT]; + group->sapmCompItem[index].kcontrolNews = buf[step + AUDIO_SAPM_COMP_INDEX_KCTL]; + group->sapmCompItem[index].kcontrolsNum = buf[step + AUDIO_SAPM_COMP_INDEX_KCTLNUM]; + } + + OsalMemFree(buf); + return HDF_SUCCESS; +} + + +static int32_t ParseAudioCtrlItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, + struct AudioRegCfgGroupNode* group) +{ + int32_t step; + int32_t index; + + if (parser == NULL || regNode == NULL || group == NULL) { + ADM_LOG_ERR("Input para check error"); + return HDF_FAILURE; + } + + uint32_t *buf = GetRegArray(parser, regNode, group, AUDIO_CTRL_CFG_INDEX_MAX); + if (buf == NULL) { + ADM_LOG_ERR("malloc reg array buf failed!"); + return HDF_FAILURE; + } + + group->ctrlCfgItem = + (struct AudioControlConfig*)OsalMemCalloc(group->itemNum * sizeof(*(group->ctrlCfgItem))); + if (group->ctrlCfgItem == NULL) { + OsalMemFree(buf); + ADM_LOG_ERR("malloc audio ctrl config item failed!"); + return HDF_ERR_MALLOC_FAIL; + } + + for (index = 0; index < group->itemNum; ++index) { + step = AUDIO_CTRL_CFG_INDEX_MAX * index; + + group->ctrlCfgItem[index].arrayIndex = buf[step + AUDIO_CTRL_CFG_INDEX_INDEX]; + group->ctrlCfgItem[index].iface = buf[step + AUDIO_CTRL_CFG_IFACE_INDEX]; + group->ctrlCfgItem[index].enable = buf[step + AUDIO_CTRL_CFG_ENABLE_INDEX]; + } + OsalMemFree(buf); + return HDF_SUCCESS; +} + +static int32_t ParseAudioAddrItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, + struct AudioRegCfgGroupNode* group) +{ + int32_t step; + int32_t index = group->groupIndex; + + if (parser == NULL || regNode == NULL || g_audioRegGroupName[index] == NULL || group == NULL) { + ADM_LOG_ERR("Input para check error: groupName=%p", g_audioRegGroupName[index]); + return HDF_FAILURE; + } + + uint32_t *buf = GetRegArray(parser, regNode, group, AUDIO_ADDR_CFG_INDEX_MAX); + if (buf == NULL) { + ADM_LOG_ERR("malloc reg array buf failed!"); + return HDF_FAILURE; + } + + group->addrCfgItem = (struct AudioAddrConfig*)OsalMemCalloc(group->itemNum * sizeof(*(group->addrCfgItem))); + if (group->addrCfgItem == NULL) { + OsalMemFree(buf); + ADM_LOG_ERR("malloc audio addr config item failed!"); + return HDF_ERR_MALLOC_FAIL; + } + + for (index = 0; index < group->itemNum; ++index) { + step = AUDIO_ADDR_CFG_INDEX_MAX * index; + + group->addrCfgItem[index].addr = buf[step + AUDIO_ADDR_CFG_REG_INDEX]; + group->addrCfgItem[index].value = buf[step + AUDIO_ADDR_CFG_VALUE_INDEX]; + } + OsalMemFree(buf); + return HDF_SUCCESS; +} + +static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, + const struct DeviceResourceNode *regCfgNode, struct AudioRegCfgGroupNode** groupNode, uint32_t index) +{ + int32_t ret = HDF_FAILURE; + struct AudioRegCfgGroupNode *group = NULL; + + if (parser == NULL || regCfgNode == NULL || groupNode == NULL) { + ADM_LOG_ERR("Input para check error: parser=%p, regCfgNode=%p, groupNode=%p.", + parser, regCfgNode, groupNode); + return HDF_FAILURE; + } + + group = *groupNode; + if (group != NULL) { + if (group->regCfgItem != NULL) { + OsalMemFree(group->regCfgItem); + } + + if (group->ctrlCfgItem != NULL) { + OsalMemFree(group->ctrlCfgItem); + } + OsalMemFree(group); + } + + group = (struct AudioRegCfgGroupNode*)OsalMemCalloc(sizeof(*group)); + if (group == NULL) { + ADM_LOG_ERR("malloc audio reg config group failed"); + return HDF_ERR_MALLOC_FAIL; + } + *groupNode = group; + (*groupNode)->groupIndex = index; + + switch(index){ + case AUDIO_CTRL_CFG_GROUP: + case AUDIO_SAPM_CFG_GROUP: + ret = ParseAudioCtrlItem(parser, regCfgNode, group); + break; + case AUDIO_RSET_GROUP: + case AUDIO_INIT_GROUP: + ret = ParseAudioAddrItem(parser, regCfgNode, group); + break; + case AUDIO_DAI_PATAM_GROUP: + case AUDIO_CTRL_PATAM_GROUP: + case AUDIO_CTRL_SAPM_PATAM_GROUP: + case AUDIO_DAI_STARTUP_PATAM_GROUP: + ret = ParseAudioRegItem(parser, regCfgNode, group); + break; + case AUDIO_SAPM_COMP_GROUP: + ret = ParseAudioSapmItem(parser, regCfgNode, group); + break; + default: + ADM_LOG_ERR("parse audio config index = %d not found!", index); + return HDF_FAILURE; + } + + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("parse audio config item failed!"); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static void ReleaseAudioAllRegConfig(struct AudioRegCfgData *config) +{ + int32_t index; + + if (config == NULL) { + return; + } + + for (index = 0; index < AUDIO_GROUP_MAX; ++index) { + if (config->audioRegParams[index] != NULL) { + if (config->audioRegParams[index]->regCfgItem != NULL) { + OsalMemFree(config->audioRegParams[index]->regCfgItem); + config->audioRegParams[index]->regCfgItem = NULL; + } + OsalMemFree(config->audioRegParams[index]); + config->audioRegParams[index] = NULL; + } + } +} + +static int32_t ParseAudioAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, + struct AudioIdInfo *config) +{ + int32_t ret; + ret = parser->GetString(attrNode, "chipName", &config->chipName, NULL); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("parser chipName reg audioIdInfo failed!"); + return HDF_SUCCESS; + } + + ret = parser->GetUint32(attrNode, "chipIdRegister", &config->chipIdRegister, 0); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("parser chipIdRegister reg audioIdInfo failed!"); + return HDF_SUCCESS; + } + + ret = parser->GetUint32(attrNode, "chipIdSize", &config->chipIdSize, 0); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("parser chipIdSize reg audioIdInfo failed!"); + return HDF_SUCCESS; + } + return ret; +} + +int32_t CodecGetRegConfig(const struct HdfDeviceObject *device, struct AudioRegCfgData *configData) +{ + uint16_t index; + const struct DeviceResourceNode *root = NULL; + const struct DeviceResourceNode *regCfgNode = NULL; + const struct DeviceResourceAttr *regAttr = NULL; + const struct DeviceResourceNode *idNode = NULL; + struct DeviceResourceIface *drsOps = NULL; + + ADM_LOG_DEBUG("Entry."); + + if (device == NULL || configData == NULL) { + ADM_LOG_ERR("Input para check error: device=%p, configData=%p.", device, configData); + return HDF_FAILURE; + } + + root = device->property; + if (root == NULL) { + ADM_LOG_ERR("drs node is NULL."); + return HDF_FAILURE; + } + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetString == NULL) { + ADM_LOG_ERR("AudioFillConfigData: invalid drs ops fail!"); + return HDF_FAILURE; + } + + idNode = drsOps->GetChildNode(root, "idInfo"); + if (idNode != NULL) { + if (ParseAudioAttr(drsOps, idNode, &configData->audioIdInfo) != HDF_SUCCESS) { + ADM_LOG_ERR("audio reg node attr is null"); + return HDF_FAILURE; + } + } + + regCfgNode = drsOps->GetChildNode(root, "regConfig"); + if (regCfgNode == NULL) { + ADM_LOG_ERR("CodecGetRegConfig: Read audioRegConfig fail!"); + return HDF_FAILURE; + } + + DEV_RES_NODE_FOR_EACH_ATTR(regCfgNode, regAttr) { + if (regAttr == NULL || regAttr->name == NULL) { + ADM_LOG_ERR("audio reg node attr is null"); + return HDF_FAILURE; + } + + index = GetAudioRegGroupNameIndex(regAttr->name); + if (index >= AUDIO_GROUP_MAX) { + continue; + } + + if (ParseAudioRegGroup(drsOps, regCfgNode, &configData->audioRegParams[index], index) != HDF_SUCCESS) { + ADM_LOG_ERR("parse audio register group failed"); + ReleaseAudioAllRegConfig(configData); + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} diff --git a/model/audio/core/test/unittest/common/audio_common_test.h b/model/audio/core/test/unittest/common/audio_common_test.h index 74f213f15..99441c5b4 100755 --- a/model/audio/core/test/unittest/common/audio_common_test.h +++ b/model/audio/core/test/unittest/common/audio_common_test.h @@ -27,29 +27,19 @@ enum { TESTBINDDAILINK, TESTUPDATECODECREGBITS, TESTUPDATEACCESSORYREGBITS, - TESTUPDATECODECAIAOREGBITS, - TESTUPDATEACCESSORYAIAOREGBITS, TESTKCONTROLGETCODEC, TESTKCONTROLGETACCESSORY, TESTADDCONTROL, TESTADDCONTROLS, TESTCODECREADREG, TESTACCESSORYREADREG, - TESTCODECAIAOREADREG, - TESTACCESSORYAIAOREADREG, TESTCODECWRITEREG, TESTACCESSORYWRITEREG, - TESTCODECAIAOWRITEREG, - TESTACCESSORYAIAOWRITEREG, TESTINFOCTRLOPS, TESTCODECGETCTRLOPS, TESTACCESSORYGETCTRLOPS, - TESTCODECAIAOGETCTRLOPS, - TESTACCESSORYAIAOGETCTRLOPS, TESTCODECSETCTRLOPS, TESTACCESSORYSETCTRLOPS, - TESTCODECAIAOSETCTRLOPS, - TESTACCESSORYAIAOSETCTRLOPS, TESTNEWCOMPONENT, TESTADDROUTES, diff --git a/model/audio/core/test/unittest/common/audio_core_test.cpp b/model/audio/core/test/unittest/common/audio_core_test.cpp index 854107077..6d653820a 100755 --- a/model/audio/core/test/unittest/common/audio_core_test.cpp +++ b/model/audio/core/test/unittest/common/audio_core_test.cpp @@ -92,18 +92,6 @@ HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryRegBits, TestSize.Level1) EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecAiaoRegBits, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTUPDATECODECAIAOREGBITS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryAiaoRegBits, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTUPDATEACCESSORYAIAOREGBITS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetCodec, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTKCONTROLGETCODEC, -1}; @@ -140,18 +128,6 @@ HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryReadReg, TestSize.Level1) EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoReadReg, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOREADREG, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoReadReg, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOREADREG, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - HWTEST_F(AudioCoreTest, AudioCoreTest_CodecWriteReg, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECWRITEREG, -1}; @@ -164,18 +140,6 @@ HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryWriteReg, TestSize.Level1) EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoWriteReg, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOWRITEREG, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoWriteReg, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOWRITEREG, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - HWTEST_F(AudioCoreTest, AudioCoreTest_InfoCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTINFOCTRLOPS, -1}; @@ -194,18 +158,6 @@ HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryGetCtrlOps, TestSize.Level1) EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoGetCtrlOps, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOGETCTRLOPS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoGetCtrlOps, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOGETCTRLOPS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - HWTEST_F(AudioCoreTest, AudioCoreTest_CodecSetCtrlOps, TestSize.Level1) { struct HdfTestMsg msg = {g_testAudioType, TESTCODECSETCTRLOPS, -1}; @@ -217,16 +169,4 @@ HWTEST_F(AudioCoreTest, AudioCoreTest_AccessorySetCtrlOps, TestSize.Level1) struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYSETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } - -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecAiaoSetCtrlOps, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTCODECAIAOSETCTRLOPS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} - -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryAiaoSetCtrlOps, TestSize.Level1) -{ - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYAIAOSETCTRLOPS, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} } diff --git a/model/audio/dispatch/include/audio_stream_dispatch.h b/model/audio/dispatch/include/audio_stream_dispatch.h index b1d4c7529..3e9a2c654 100755 --- a/model/audio/dispatch/include/audio_stream_dispatch.h +++ b/model/audio/dispatch/include/audio_stream_dispatch.h @@ -41,9 +41,10 @@ enum StreamDispMethodCmd { AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, - AUDIO_DRV_PCM_IOCTRL_DSP_DECODE, - AUDIO_DRV_PCM_IOCTRL_DSP_ENCODE, - AUDIO_DRV_PCM_IOCTRL_DSP_EQUALIZER, + AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN, + AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE, + AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN, + AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE, AUDIO_DRV_PCM_IOCTRL_BUTT, }; diff --git a/model/audio/dispatch/src/audio_control_dispatch.c b/model/audio/dispatch/src/audio_control_dispatch.c index 082e66a35..3f8d5fa99 100755 --- a/model/audio/dispatch/src/audio_control_dispatch.c +++ b/model/audio/dispatch/src/audio_control_dispatch.c @@ -8,6 +8,7 @@ #include "audio_control_dispatch.h" #include "audio_control.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_control_dispatch @@ -126,7 +127,6 @@ static int32_t ControlHostElemRead(const struct HdfDeviceIoClient *client, struc struct AudioCtrlElemValue elemValue; struct AudioCtrlElemId id; int32_t result; - ADM_LOG_DEBUG("entry."); if ((client == NULL) || (reqData == NULL) || (rspData == NULL)) { ADM_LOG_ERR("Input ElemRead params check error: client=%p, reqData=%p, rspData=%p.", client, reqData, rspData); @@ -148,6 +148,7 @@ static int32_t ControlHostElemRead(const struct HdfDeviceIoClient *client, struc ADM_LOG_ERR("ElemRead request itemName failed!"); return HDF_FAILURE; } + ADM_LOG_DEBUG("itemName: %s cardServiceName: %s iface: %d ", id.itemName, id.cardServiceName, id.iface); kctrl = AudioGetKctrlInstance(&id); if (kctrl == NULL || kctrl->Get == NULL) { @@ -170,7 +171,6 @@ static int32_t ControlHostElemRead(const struct HdfDeviceIoClient *client, struc ADM_LOG_ERR("Write response data value[1]=%d failed!", elemValue.value[1]); return HDF_FAILURE; } - ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } @@ -180,7 +180,6 @@ static int32_t ControlHostElemWrite(const struct HdfDeviceIoClient *client, struct AudioKcontrol *kctrl = NULL; struct AudioCtrlElemValue elemValue; int32_t result; - ADM_LOG_DEBUG("entry."); if ((client == NULL) || (reqData == NULL)) { ADM_LOG_ERR("Input params check error: client=%p, reqData=%p.", client, reqData); @@ -209,6 +208,10 @@ static int32_t ControlHostElemWrite(const struct HdfDeviceIoClient *client, return HDF_FAILURE; } + ADM_LOG_DEBUG("itemName: %s cardServiceName: %s iface: %d value: %d ", elemValue.id.itemName, + elemValue.id.cardServiceName, + elemValue.id.iface, elemValue.value[0]); + kctrl = AudioGetKctrlInstance(&elemValue.id); if (kctrl == NULL || kctrl->Set == NULL) { ADM_LOG_ERR("Find kctrl or Set fail!"); @@ -220,7 +223,6 @@ static int32_t ControlHostElemWrite(const struct HdfDeviceIoClient *client, ADM_LOG_ERR("Get control value fail result=%d", result); return HDF_FAILURE; } - ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index ecbf5af3d..db6375b5e 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -7,6 +7,8 @@ */ #include "audio_stream_dispatch.h" +#include "audio_platform_base.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_stream_dispatch @@ -33,7 +35,7 @@ int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPc * If not, skip the if statement and execute in sequence. */ if (cpuDai->devData->ops->HwParams != NULL) { - int ret = cpuDai->devData->ops->HwParams(audioCard, params, cpuDai); + int ret = cpuDai->devData->ops->HwParams(audioCard, params); if (ret < 0) { ADM_LOG_ERR("cpuDai hardware params fail ret=%d", ret); return HDF_ERR_IO; @@ -68,7 +70,7 @@ int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct Audio * If not, skip the if statement and execute in sequence. */ if (codecDai->devData->ops->HwParams != NULL) { - int ret = codecDai->devData->ops->HwParams(audioCard, params, codecDai); + int ret = codecDai->devData->ops->HwParams(audioCard, params); if (ret < 0) { ADM_LOG_ERR("codecDai hardware params fail ret=%d", ret); return HDF_ERR_IO; @@ -91,21 +93,13 @@ int32_t HwPlatfromDispatch(const struct AudioCard *audioCard, const struct Audio return HDF_FAILURE; } - struct PlatformDevice *platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL) { - ADM_LOG_ERR("platform param is NULL."); - return HDF_FAILURE; - } - /* If there are HwParams function, it will be executed directly. * If not, skip the if statement and execute in sequence. */ - if (platform->devData->ops->HwParams != NULL) { - int ret = platform->devData->ops->HwParams(audioCard, params); - if (ret < 0) { - ADM_LOG_ERR("platform hardware params fail ret=%d", ret); - return HDF_ERR_IO; - } + int ret = AudioHwParams(audioCard, params); + if (ret < 0) { + ADM_LOG_ERR("platform hardware params fail ret=%d", ret); + return HDF_ERR_IO; } return HDF_SUCCESS; @@ -119,12 +113,69 @@ int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct AudioPc } /* Traverse through each driver method; Enter if you have, if not, exectue in order */ - if (HwCodecDaiDispatch(audioCard, params) || - HwCpuDaiDispatch(audioCard, params) || - HwPlatfromDispatch(audioCard, params)) { - ADM_LOG_ERR("hardware params fail."); + if (HwCodecDaiDispatch(audioCard, params) != HDF_SUCCESS) { + ADM_LOG_ERR("codec dai hardware params fail."); + return HDF_FAILURE; + } + + if (HwCpuDaiDispatch(audioCard, params) != HDF_SUCCESS) { + ADM_LOG_ERR("cpu dai hardware params fail."); + return HDF_FAILURE; + } + + if (HwPlatfromDispatch(audioCard, params) != HDF_SUCCESS) { + ADM_LOG_ERR("platform dai hardware params fail."); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t AudioDaiDeviceStartup(struct AudioCard *audioCard) +{ + struct DaiDevice *cpuDai = NULL; + struct DaiDevice *codecDai = NULL; + struct DaiDevice *accessoryDai = NULL; + int ret; + + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); return HDF_FAILURE; } + cpuDai = audioCard->rtd->cpuDai; + if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && + cpuDai->devData->ops->Startup != NULL) { + ret = cpuDai->devData->ops->Startup(audioCard, cpuDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("cpuDai Startup fail."); + return HDF_FAILURE; + } + } else { + ADM_LOG_DEBUG("cpu dai startup is null."); + } + + codecDai = audioCard->rtd->codecDai; + if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL && + codecDai->devData->ops->Startup != NULL) { + ret = codecDai->devData->ops->Startup(audioCard, codecDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("codecDai Startup fail."); + return HDF_FAILURE; + } + } else { + ADM_LOG_DEBUG("codec dai startup is null."); + } + + accessoryDai = audioCard->rtd->accessoryDai; + if (accessoryDai != NULL && accessoryDai->devData != NULL && accessoryDai->devData->ops != NULL && + accessoryDai->devData->ops->Startup != NULL) { + ret = accessoryDai->devData->ops->Startup(audioCard, accessoryDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("accessoryDai Startup fail."); + return HDF_FAILURE; + } + } else { + ADM_LOG_DEBUG("accessory dai startup is null."); + } return HDF_SUCCESS; } @@ -205,10 +256,8 @@ int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBu struct HdfSBuf *reply) { struct AudioPcmHwParams params; - struct StreamHost *streamHost = NULL; struct AudioCard *audioCard = NULL; - char *cardName = NULL; - int ret = HDF_SUCCESS; + int ret; ADM_LOG_DEBUG("entry."); if ((client == NULL || client->device == NULL) || (data == NULL)) { @@ -217,31 +266,14 @@ int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBu } (void)reply; - streamHost = StreamHostFromDevice(client->device); - if (streamHost == NULL) { - ADM_LOG_ERR("renderHost is NULL"); - return HDF_FAILURE; - } - - cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX); - if (cardName == NULL) { - ADM_LOG_ERR("malloc cardServiceName fail!"); - return HDF_FAILURE; - } - streamHost->priv = cardName; - (void)memset_s(¶ms, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams)); + ret = HwParamsDataAnalysis(data, ¶ms); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("hwparams data analysis failed ret=%d", ret); return HDF_FAILURE; } - if (memcpy_s(cardName, BUFF_SIZE_MAX, params.cardServiceName, BUFF_SIZE_MAX) != EOK) { - ADM_LOG_ERR("memcpy cardName failed."); - return HDF_FAILURE; - } - audioCard = GetCardInstance(params.cardServiceName); if (audioCard == NULL) { ADM_LOG_ERR("get card instance fail."); @@ -292,8 +324,6 @@ static struct AudioCard *StreamHostGetCardInstance(const struct HdfDeviceIoClien int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -307,25 +337,81 @@ int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct (void)reply; audioCard = StreamHostGetCardInstance(client); - if (audioCard == NULL || audioCard->rtd == NULL) { + if (audioCard == NULL) { ADM_LOG_ERR("CapturePrepare get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->CapturePrepare == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); + ret = AudioCapturePrepare(audioCard); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform CapturePrepare fail ret=%d", ret); + return HDF_ERR_IO; + } + + ADM_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + +int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, + struct HdfSBuf *reply) +{ + char *cardName = NULL; + const char *carNameTemp = NULL; + struct StreamHost *streamHost = NULL; + struct AudioCard *audioCard = NULL; + + ADM_LOG_DEBUG("entry."); + + if (client == NULL) { + ADM_LOG_ERR("StreamHostCaptureOpen input param is NULL."); return HDF_FAILURE; } - ret = platform->devData->ops->CapturePrepare(audioCard); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform CapturePrepare fail ret=%d", ret); + (void)reply; + + cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX); + if (cardName == NULL) { + ADM_LOG_ERR("malloc cardServiceName fail!"); + return HDF_FAILURE; + } + + streamHost = StreamHostFromDevice(client->device); + if (streamHost == NULL) { + OsalMemFree(cardName); + ADM_LOG_ERR("renderHost is NULL"); + return HDF_FAILURE; + } + + if (!(carNameTemp = HdfSbufReadString(data))) { + OsalMemFree(cardName); + ADM_LOG_ERR("read request cardServiceName failed!"); + return HDF_FAILURE; + } + + if (strncpy_s(cardName, BUFF_SIZE_MAX - 1, carNameTemp, strlen(carNameTemp) + 1) != EOK) { + ADM_LOG_ERR("memcpy cardName failed."); + OsalMemFree(cardName); + return HDF_FAILURE; + } + ADM_LOG_DEBUG("card name: %s.", cardName); + streamHost->priv = cardName; + + audioCard = StreamHostGetCardInstance(client); + if (audioCard == NULL) { + ADM_LOG_ERR("StreamHostCaptureOpen get card instance or rtd fail."); + return HDF_FAILURE; + } + + if (AudioCaptureOpen(audioCard) != HDF_SUCCESS) { + ADM_LOG_ERR("platform CaptureOpen fail"); return HDF_ERR_IO; } + if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) { + ADM_LOG_ERR("Dai Device Startup fail."); + return HDF_FAILURE; + } + ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } @@ -333,8 +419,6 @@ int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -352,16 +436,8 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H ADM_LOG_ERR("RenderPrepare get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->RenderPrepare == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - - ret = platform->devData->ops->RenderPrepare(audioCard); + ret = AudioRenderPrepare(audioCard); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform RenderPrepare fail ret=%d", ret); return HDF_ERR_IO; @@ -371,51 +447,101 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H return HDF_SUCCESS; } -static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct AudioTxData *transfer) +int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, + struct HdfSBuf *reply) { - struct PlatformDevice *platform = NULL; - int32_t ret = HDF_SUCCESS; + char *cardName = NULL; + const char *carNameTemp = NULL; + struct StreamHost *streamHost = NULL; + struct AudioCard *audioCard = NULL; - if (audioCard == NULL || audioCard->rtd == NULL || transfer == NULL) { - ADM_LOG_ERR("input param is NULL."); + ADM_LOG_DEBUG("entry."); + + if (client == NULL) { + ADM_LOG_ERR("StreamHostRenderOpen input param is NULL."); return HDF_FAILURE; } - platform = audioCard->rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->Write == NULL) { - ADM_LOG_ERR("audioCard platform is NULL."); + (void)reply; + + cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX); + if (cardName == NULL) { + ADM_LOG_ERR("malloc cardServiceName fail!"); return HDF_FAILURE; } - ret = platform->devData->ops->Write(audioCard, transfer); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform write fail ret=%d", ret); + streamHost = StreamHostFromDevice(client->device); + if (streamHost == NULL) { + ADM_LOG_ERR("renderHost is NULL"); + OsalMemFree(cardName); + return HDF_FAILURE; + } + + if (!(carNameTemp = HdfSbufReadString(data))) { + ADM_LOG_ERR("read request cardServiceName failed!"); + OsalMemFree(cardName); return HDF_FAILURE; } + if (strncpy_s(cardName, BUFF_SIZE_MAX - 1, carNameTemp, strlen(carNameTemp) + 1) != EOK) { + ADM_LOG_ERR("memcpy cardName failed."); + OsalMemFree(cardName); + return HDF_FAILURE; + } + + ADM_LOG_DEBUG("card name: %s.", cardName); + + streamHost->priv = cardName; + + audioCard = StreamHostGetCardInstance(client); + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("StreamHostRenderOpen get card instance or rtd fail."); + return HDF_FAILURE; + } + + if (AudioRenderOpen(audioCard) != HDF_SUCCESS) { + ADM_LOG_ERR("platform RenderOpen fail."); + return HDF_FAILURE; + } + + if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) { + ADM_LOG_ERR("Dai Device Startup fail."); + return HDF_FAILURE; + } + + ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const struct AudioTxMmapData *txMmapData) +static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct AudioTxData *transfer) { - struct PlatformDevice *platform = NULL; - int32_t ret = HDF_SUCCESS; - ADM_LOG_DEBUG("entry."); + int32_t ret; - if (audioCard == NULL || audioCard->rtd == NULL || txMmapData == NULL) { + if (audioCard == NULL || transfer == NULL) { ADM_LOG_ERR("input param is NULL."); return HDF_FAILURE; } - platform = audioCard->rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->Write == NULL) { - ADM_LOG_ERR("audioCard platform is NULL."); + ret = AudioPcmWrite(audioCard, transfer); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("pcm write fail ret=%d", ret); return HDF_FAILURE; } - ret = platform->devData->ops->MmapWrite(audioCard, txMmapData); + return HDF_SUCCESS; +} + +static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const struct AudioMmapData *txMmapData) +{ + int32_t ret; + ADM_LOG_DEBUG("entry."); + + if (audioCard == NULL || txMmapData == NULL) { + ADM_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + + ret = AudioPcmMmapWrite(audioCard, txMmapData); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform write fail ret=%d", ret); return HDF_FAILURE; @@ -425,25 +551,17 @@ static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const return HDF_SUCCESS; } -static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const struct AudioRxMmapData *rxMmapData) +static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const struct AudioMmapData *rxMmapData) { - struct PlatformDevice *platform = NULL; - int32_t ret = HDF_SUCCESS; + int32_t ret; ADM_LOG_DEBUG("entry."); - if (audioCard == NULL || audioCard->rtd == NULL || rxMmapData == NULL) { + if (audioCard == NULL || rxMmapData == NULL) { ADM_LOG_ERR("input param is NULL."); return HDF_FAILURE; } - platform = audioCard->rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->MmapRead == NULL) { - ADM_LOG_ERR("audioCard platform is NULL."); - return HDF_FAILURE; - } - - ret = platform->devData->ops->MmapRead(audioCard, rxMmapData); + ret = AudioPcmMmapRead(audioCard, rxMmapData); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform read fail ret=%d", ret); return HDF_FAILURE; @@ -497,8 +615,6 @@ int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf * int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; struct AudioRxData rxData; int ret = HDF_SUCCESS; @@ -511,22 +627,14 @@ int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *d (void)data; audioCard = StreamHostGetCardInstance(client); - if (audioCard == NULL || audioCard->rtd == NULL) { + if (audioCard == NULL) { ADM_LOG_ERR("get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || - platform->devData->ops == NULL || platform->devData->ops->Read == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - - ret = platform->devData->ops->Read(audioCard, &rxData); + ret = AudioPcmRead(audioCard, &rxData); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform read fail ret=%d", ret); + ADM_LOG_ERR("pcm read fail ret=%d", ret); return HDF_FAILURE; } @@ -551,7 +659,7 @@ int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *d int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioTxMmapData txMmapData; + struct AudioMmapData txMmapData; struct AudioCard *audioCard = NULL; uint64_t mAddress = 0; ADM_LOG_DEBUG("entry."); @@ -603,16 +711,16 @@ int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, stru return HDF_FAILURE; } audioCard = StreamHostGetCardInstance(client); - if (audioCard == NULL || audioCard->rtd == NULL || audioCard->rtd->platform == NULL) { + if (audioCard == NULL) { ADM_LOG_ERR("audioCard instance is NULL."); return HDF_FAILURE; } - struct PlatformHost *platformHost = PlatformHostFromDevice(audioCard->rtd->platform->device); - if (platformHost == NULL) { + struct PlatformData *platformData = PlatformDataFromCard(audioCard); + if (platformData == NULL) { ADM_LOG_ERR("platformHost instance is NULL."); return HDF_FAILURE; } - if (!HdfSbufWriteUint64(reply, platformHost->renderBufInfo.framesPosition)) { + if (!HdfSbufWriteUint64(reply, platformData->renderBufInfo.framesPosition)) { ADM_LOG_ERR("render mmap write position fail!"); return HDF_FAILURE; } @@ -624,7 +732,7 @@ int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct HdfSBu { uint64_t mAddress = 0; struct AudioCard *audioCard = NULL; - struct AudioRxMmapData rxMmapData; + struct AudioMmapData rxMmapData; ADM_LOG_DEBUG("entry."); if (client == NULL || reply == NULL) { ADM_LOG_ERR("input param is NULL."); @@ -674,16 +782,16 @@ int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struc return HDF_FAILURE; } audioCard = StreamHostGetCardInstance(client); - if (audioCard == NULL || audioCard->rtd == NULL || audioCard->rtd->platform == NULL) { + if (audioCard == NULL) { ADM_LOG_ERR("audioCard is NULL."); return HDF_FAILURE; } - struct PlatformHost *platformHost = PlatformHostFromDevice(audioCard->rtd->platform->device); - if (platformHost == NULL) { + struct PlatformData *platformData = PlatformDataFromCard(audioCard); + if (platformData == NULL) { ADM_LOG_ERR("platformHost is NULL."); return HDF_FAILURE; } - if (!HdfSbufWriteUint64(reply, platformHost->captureBufInfo.framesPosition)) { + if (!HdfSbufWriteUint64(reply, platformData->captureBufInfo.framesPosition)) { ADM_LOG_ERR("render mmap write position fail!"); return HDF_FAILURE; } @@ -694,7 +802,8 @@ int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struc int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; + struct DaiDevice *cpuDai = NULL; + struct DaiDevice *codecDai = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -713,15 +822,21 @@ int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct Hdf return HDF_FAILURE; } rtd = audioCard->rtd; + audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->RenderStart == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; + cpuDai = rtd->cpuDai; + if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && + cpuDai->devData->ops->Trigger != NULL) { + cpuDai->devData->ops->Trigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START, cpuDai); + } + + codecDai = rtd->codecDai; + if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL && + codecDai->devData->ops->Trigger != NULL) { + codecDai->devData->ops->Trigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START, codecDai); } - ret = platform->devData->ops->RenderStart(audioCard); + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform render start fail ret=%d", ret); return HDF_ERR_IO; @@ -733,8 +848,6 @@ int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct Hdf int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -752,16 +865,9 @@ int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct Hd ADM_LOG_ERR("CaptureStart get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->CaptureStart == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } + audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER; - ret = platform->devData->ops->CaptureStart(audioCard); + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_START); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform capture start fail ret=%d", ret); return HDF_ERR_IO; @@ -774,8 +880,6 @@ int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct Hd int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -785,7 +889,6 @@ int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfS return HDF_FAILURE; } - (void)data; (void)reply; audioCard = StreamHostGetCardInstance(client); @@ -793,16 +896,13 @@ int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfS ADM_LOG_ERR("RenderStop get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->RenderStop == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); + if (!HdfSbufReadUint32(data, &audioCard->standbyMode)) { + ADM_LOG_ERR("read request streamType failed!"); return HDF_FAILURE; } - ret = platform->devData->ops->RenderStop(audioCard); + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_STOP); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform render stop fail ret=%d", ret); return HDF_ERR_IO; @@ -812,10 +912,40 @@ int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfS return HDF_SUCCESS; } +int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, + struct HdfSBuf *reply) +{ + struct AudioCard *audioCard = NULL; + int ret; + ADM_LOG_DEBUG("entry."); + + if (client == NULL) { + ADM_LOG_ERR("RenderClose input param is NULL."); + return HDF_FAILURE; + } + + (void)data; + (void)reply; + + audioCard = StreamHostGetCardInstance(client); + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("RenderStop get card instance or rtd fail."); + return HDF_FAILURE; + } + + ret = AudioRenderClose(audioCard); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform RenderClose fail ret=%d", ret); + return HDF_ERR_IO; + } + + ADM_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + + int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -825,7 +955,6 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf return HDF_FAILURE; } - (void)data; (void)reply; audioCard = StreamHostGetCardInstance(client); @@ -833,16 +962,13 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf ADM_LOG_ERR("CaptureStop get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->CaptureStop == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); + if (!HdfSbufReadUint32(data, &audioCard->standbyMode)) { + ADM_LOG_ERR("read request streamType failed!"); return HDF_FAILURE; } - ret = platform->devData->ops->CaptureStop(audioCard); + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform capture stop fail ret=%d", ret); return HDF_ERR_IO; @@ -852,10 +978,39 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf return HDF_SUCCESS; } +int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct AudioCard *audioCard = NULL; + int ret; + ADM_LOG_DEBUG("entry."); + + if (client == NULL) { + ADM_LOG_ERR("CaptureClose input param is NULL."); + return HDF_FAILURE; + } + + (void)data; + (void)reply; + + audioCard = StreamHostGetCardInstance(client); + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("CaptureStop get card instance or rtd fail."); + return HDF_FAILURE; + } + + ret = AudioCaptureClose(audioCard); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform capture close fail ret=%d", ret); + return HDF_ERR_IO; + } + + ADM_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + + int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -873,16 +1028,8 @@ int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct Hdf ADM_LOG_ERR("RenderPause get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->RenderPause == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - ret = platform->devData->ops->RenderPause(audioCard); + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform render pause fail ret=%d", ret); return HDF_ERR_IO; @@ -895,8 +1042,6 @@ int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct Hdf int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -914,16 +1059,8 @@ int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct Hd ADM_LOG_ERR("CapturePause get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->CapturePause == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - ret = platform->devData->ops->CapturePause(audioCard); + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform captur pause fail ret=%d", ret); return HDF_ERR_IO; @@ -936,10 +1073,8 @@ int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct Hd int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; - int ret = HDF_SUCCESS; + int ret; ADM_LOG_DEBUG("entry."); if (client == NULL) { @@ -955,16 +1090,8 @@ int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct Hd ADM_LOG_ERR("RenderResume get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->RenderResume == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - ret = platform->devData->ops->RenderResume(audioCard); + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform RenderResume fail ret=%d", ret); return HDF_ERR_IO; @@ -977,8 +1104,6 @@ int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct Hd int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { - struct AudioRuntimeDeivces *rtd = NULL; - struct PlatformDevice *platform = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -996,16 +1121,8 @@ int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct H ADM_LOG_ERR("CaptureResume get card instance or rtd fail."); return HDF_FAILURE; } - rtd = audioCard->rtd; - - platform = rtd->platform; - if (platform == NULL || platform->devData == NULL || platform->devData->ops == NULL || - platform->devData->ops->CaptureResume == NULL) { - ADM_LOG_ERR("audioCard rtd platform is NULL."); - return HDF_FAILURE; - } - ret = platform->devData->ops->CaptureResume(audioCard); + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("platform CaptureResume fail ret=%d", ret); return HDF_ERR_IO; @@ -1136,10 +1253,14 @@ static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { {AUDIO_DRV_PCM_IOCTRL_HW_PARAMS, StreamHostHwParams}, {AUDIO_DRV_PCM_IOCTRL_RENDER_PREPARE, StreamHostRenderPrepare}, {AUDIO_DRV_PCM_IOCTRL_CAPTURE_PREPARE, StreamHostCapturePrepare}, + {AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN, StreamHostRenderOpen}, + {AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE, StreamHostRenderClose}, {AUDIO_DRV_PCM_IOCTRL_WRITE, StreamHostWrite}, {AUDIO_DRV_PCM_IOCTRL_READ, StreamHostRead}, {AUDIO_DRV_PCM_IOCTRL_RENDER_START, StreamHostRenderStart}, {AUDIO_DRV_PCM_IOCTRL_RENDER_STOP, StreamHostRenderStop}, + {AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN, StreamHostCaptureOpen}, + {AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE, StreamHostCaptureClose}, {AUDIO_DRV_PCM_IOCTRL_CAPTURE_START, StreamHostCaptureStart}, {AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP, StreamHostCaptureStop}, {AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE, StreamHostRenderPause}, @@ -1150,9 +1271,6 @@ static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { {AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE, StreamHostMmapRead}, {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, StreamHostMmapPositionWrite}, {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, StreamHostMmapPositionRead}, - {AUDIO_DRV_PCM_IOCTRL_DSP_DECODE, StreamHostDspDecode}, - {AUDIO_DRV_PCM_IOCTRL_DSP_ENCODE, StreamHostDspEncode}, - {AUDIO_DRV_PCM_IOCTRL_DSP_EQUALIZER, StreamHostDspEqualizer}, }; int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, diff --git a/model/audio/sapm/include/audio_sapm.h b/model/audio/sapm/include/audio_sapm.h index 0eaa935cb..7d39f43e9 100755 --- a/model/audio/sapm/include/audio_sapm.h +++ b/model/audio/sapm/include/audio_sapm.h @@ -39,6 +39,7 @@ enum AudioSapmType { AUDIO_SAPM_INPUT = 0, /* input pin */ AUDIO_SAPM_OUTPUT, /* output pin */ AUDIO_SAPM_MUX, /* selects 1 analog signal from many inputs */ + AUDIO_SAPM_DEMUX, /* connects the input to one of multiple outputs */ AUDIO_SAPM_VIRT_MUX, /* virtual version of snd_soc_dapm_mux */ AUDIO_SAPM_VALUE_MUX, /* selects 1 analog signal from many inputs */ AUDIO_SAPM_MIXER, /* mixes several analog signals together */ @@ -57,8 +58,12 @@ enum AudioSapmType { AUDIO_SAPM_PRE, /* machine specific pre component - exec first */ AUDIO_SAPM_POST, /* machine specific post component - exec last */ AUDIO_SAPM_SUPPLY, /* power/clock supply */ + AUDIO_SAPM_REGULATOR_SUPPLY, /* external regulator */ + AUDIO_SAPM_CLOCK_SUPPLY, /* external clock */ AUDIO_SAPM_AIF_IN, /* audio interface input */ AUDIO_SAPM_AIF_OUT, /* audio interface output */ + AUDIO_SAPM_SIGGEN, /* signal generator */ + AUDIO_SAPM_SINK, }; /* component has no PM register bit */ diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index 496d087a4..a0d26e327 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -10,6 +10,7 @@ #include "osal_io.h" #include "osal_time.h" #include "osal_timer.h" +#include "audio_driver_log.h" #define HDF_LOG_TAG audio_sapm @@ -152,6 +153,21 @@ static int32_t AudioSapmGenericCheckPower(const struct AudioSapmComponent *sapmC return SAPM_POWER_UP; } +static int32_t AudioSapmAdcPowerClock(struct AudioSapmComponent *sapmComponent) +{ + (void)sapmComponent; + ADM_LOG_INFO("Adc standby mode entry!"); + return HDF_SUCCESS; +} + +static int32_t AudioSapmDdcPowerClock(struct AudioSapmComponent *sapmComponent) +{ + (void)sapmComponent; + ADM_LOG_INFO("Ddc standby mode entry!"); + return HDF_SUCCESS; +} + + static int32_t AudioSapmAdcCheckPower(const struct AudioSapmComponent *sapmComponent) { int32_t input; @@ -239,11 +255,56 @@ static void AudioSampCheckPowerCallback(struct AudioSapmComponent *sapmComponent return; } +static void AudioSampPowerClockCallback(struct AudioSapmComponent *sapmComponent) +{ + if (sapmComponent == NULL) { + ADM_LOG_ERR("input param cpt is NULL."); + return; + } + + switch (sapmComponent->sapmType) { + case AUDIO_SAPM_ANALOG_SWITCH: + case AUDIO_SAPM_MIXER: + case AUDIO_SAPM_MIXER_NAMED_CTRL: + sapmComponent->PowerClockOp = NULL; + break; + case AUDIO_SAPM_MUX: + case AUDIO_SAPM_VIRT_MUX: + case AUDIO_SAPM_VALUE_MUX: + sapmComponent->PowerClockOp = NULL; + break; + case AUDIO_SAPM_ADC: + case AUDIO_SAPM_AIF_OUT: + sapmComponent->PowerClockOp = AudioSapmAdcPowerClock; + break; + case AUDIO_SAPM_DAC: + case AUDIO_SAPM_AIF_IN: + sapmComponent->PowerClockOp = AudioSapmDdcPowerClock; + break; + case AUDIO_SAPM_PGA: + case AUDIO_SAPM_OUT_DRV: + case AUDIO_SAPM_INPUT: + case AUDIO_SAPM_OUTPUT: + case AUDIO_SAPM_MICBIAS: + case AUDIO_SAPM_SPK: + case AUDIO_SAPM_HP: + case AUDIO_SAPM_MIC: + case AUDIO_SAPM_LINE: + sapmComponent->PowerClockOp = NULL; + break; + default: + sapmComponent->PowerClockOp = NULL; + break; + } + + return; +} + int32_t AudioSapmNewComponent(struct AudioCard *audioCard, const struct AudioSapmComponent *component) { struct AudioSapmComponent *sapmComponent = NULL; - if ((audioCard == NULL || audioCard->rtd == NULL || audioCard->rtd->codec == NULL) || (component == NULL)) { + if ((audioCard == NULL || audioCard->rtd == NULL) || (component == NULL)) { ADM_LOG_ERR("input params check error: audioCard=%p, component=%p.", audioCard, component); return HDF_FAILURE; } @@ -279,11 +340,13 @@ int32_t AudioSapmNewComponent(struct AudioCard *audioCard, const struct AudioSap OsalMemFree(sapmComponent); return HDF_FAILURE; } + sapmComponent->codec = audioCard->rtd->codec; + sapmComponent->accessory = audioCard->rtd->accessory; sapmComponent->kcontrolsNum = component->kcontrolsNum; sapmComponent->active = 0; AudioSampCheckPowerCallback(sapmComponent); - sapmComponent->PowerClockOp = NULL; + AudioSampPowerClockCallback(sapmComponent); DListHeadInit(&sapmComponent->sources); DListHeadInit(&sapmComponent->sinks); @@ -411,7 +474,7 @@ static void MixerSetPathStatus(const struct AudioSapmComponent *sapmComponent, s uint32_t invert; uint32_t curValue = 0; - if ((sapmComponent == NULL || sapmComponent->codec == NULL) || (path == NULL) || (mixerCtrl == NULL)) { + if ((sapmComponent == NULL) || (path == NULL) || (mixerCtrl == NULL)) { ADM_LOG_ERR("input params check error: sapmComponent=%p, path=%p, mixerCtrl=%p.", sapmComponent, path, mixerCtrl); return; @@ -422,9 +485,20 @@ static void MixerSetPathStatus(const struct AudioSapmComponent *sapmComponent, s mask = mixerCtrl->mask; invert = mixerCtrl->invert; - ret = AudioCodecReadReg(sapmComponent->codec, reg, &curValue); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("read reg fail!"); + if (sapmComponent->codec != NULL) { + ret = AudioCodecReadReg(sapmComponent->codec, reg, &curValue); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("read reg fail!"); + return; + } + } else if (sapmComponent->accessory != NULL) { + ret = AudioAccessoryReadReg(sapmComponent->accessory, reg, &curValue); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("read reg fail!"); + return; + } + } else { + ADM_LOG_ERR("accessory and codec is null!"); return; } @@ -448,25 +522,21 @@ static int32_t AudioSapmSetPathStatus(const struct AudioSapmComponent *sapmCompo switch (sapmComponent->sapmType) { case AUDIO_SAPM_MIXER: case AUDIO_SAPM_ANALOG_SWITCH: - case AUDIO_SAPM_MIXER_NAMED_CTRL: { + case AUDIO_SAPM_MIXER_NAMED_CTRL: MixerSetPathStatus(sapmComponent, path, (struct AudioMixerControl *)((volatile uintptr_t)sapmComponent->kcontrolNews[i].privateValue)); - } - break; - case AUDIO_SAPM_MUX: { + break; + case AUDIO_SAPM_MUX: MuxSetPathStatus(sapmComponent, path, (struct AudioEnumKcontrol *)((volatile uintptr_t)sapmComponent->kcontrolNews[i].privateValue), i); - } - break; - case AUDIO_SAPM_VALUE_MUX: { + break; + case AUDIO_SAPM_VALUE_MUX: MuxValueSetPathStatus(sapmComponent, path, (struct AudioEnumKcontrol *)((volatile uintptr_t)sapmComponent->kcontrolNews[i].privateValue), i); - } - break; - default: { + break; + default: path->connect = CONNECT_SINK_AND_SOURCE; break; - } } return HDF_SUCCESS; @@ -601,7 +671,7 @@ static int32_t AudioSapmAddRoute(struct AudioCard *audioCard, const struct Audio struct AudioSapmComponent *sapmComponent = NULL; int32_t ret; - if ((audioCard == NULL) || (route == NULL || route->source == NULL || route->sink == NULL)) { + if (audioCard == NULL || route == NULL || route->source == NULL || route->sink == NULL) { ADM_LOG_ERR("input params check error: audioCard=%p, route=%p.", audioCard, route); return HDF_FAILURE; } @@ -1218,6 +1288,9 @@ int32_t AudioSampPowerUp(const struct AudioCard *card) DListHeadInit(&upList); DLIST_FOR_EACH_ENTRY(sapmComponent, &card->components, struct AudioSapmComponent, list) { + if (sapmComponent == NULL) { + continue; + } if (sapmComponent->power == SAPM_POWER_DOWN) { AudioSapmPowerSeqInsert(sapmComponent, &upList, SAPM_POWER_UP); } @@ -1279,19 +1352,22 @@ static void AudioSapmEnterSleep(uintptr_t para) return; } - if (!AudioSapmCheckTime()) { - return; + if (audioCard->standbyMode != AUDIO_SAPM_TURN_STANDBY_NOW) { + if (!AudioSapmCheckTime()) { + return; + } } - DLIST_FOR_EACH_ENTRY(sapmComponent, &audioCard->components, struct AudioSapmComponent, list) { - if (sapmComponent->PowerClockOp != NULL) { - if (g_audioSapmIsStandby == false) { - sapmComponent->PowerClockOp(sapmComponent); - g_audioSapmIsStandby = true; - AudioSapmRefreshTime(true); - } + if (g_audioSapmIsStandby == false) { + DLIST_FOR_EACH_ENTRY(sapmComponent, &audioCard->components, struct AudioSapmComponent, list) { + if (sapmComponent->PowerClockOp != NULL) { + sapmComponent->PowerClockOp(sapmComponent); + AudioSapmRefreshTime(true); + } } + g_audioSapmIsStandby = true; } + if (g_audioSapmIsStandby == true) { if (!AudioSapmCheckTime()) { return; diff --git a/test/unittest/model/audio/include/audio_core_test.h b/test/unittest/model/audio/include/audio_core_test.h index b36a9f99c..0481e9271 100755 --- a/test/unittest/model/audio/include/audio_core_test.h +++ b/test/unittest/model/audio/include/audio_core_test.h @@ -17,25 +17,28 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t AudioSocTestRegisterDai(void); int32_t AudioSocTestRegisterPlatform(void); +int32_t AudioSocTestRegisterDai(void); +int32_t AudioTestRegisterAccessory(void); int32_t AudioTestRegisterCodec(void); -int32_t AudioTestBindDaiLink(void); +int32_t AudioTestRegisterDsp(void); int32_t AudioTestSocDeviceRegister(void); -int32_t AudioTestSocRegisterDsp(void); -int32_t AudioTestRegisterAccessory(void); -int32_t AudioTestUpdateRegBits(void); -int32_t AudioTestAiaoUpdateRegBits(void); +int32_t AudioTestBindDaiLink(void); +int32_t AudioTestUpdateCodecRegBits(void); +int32_t AudioTestUpdateAccessoryRegBits(void); int32_t AudioTestKcontrolGetCodec(void); -int32_t AudioTestAddControls(void); +int32_t AudioTestKcontrolGetAccessory(void); int32_t AudioTestAddControl(void); -int32_t AudioTestDeviceReadReg(void); -int32_t AudioTestAiaoDeviceReadReg(void); -int32_t AudioTestInfoCtrlSw(void); -int32_t AudioTestGetCtrlSw(void); -int32_t AudioTestPutCtrlSw(void); -int32_t AiaoTestGetCtrlSw(void); -int32_t AiaoTestPutCtrlSw(void); +int32_t AudioTestAddControls(void); +int32_t AudioTestCodecReadReg(void); +int32_t AudioTestAccessoryReadReg(void); +int32_t AudioTestCodecWriteReg(void); +int32_t AudioTestAccessoryWriteReg(void); +int32_t AudioTestInfoCtrlOps(void); +int32_t AudioTestCodecGetCtrlOps(void); +int32_t AudioTestAccessoryGetCtrlOps(void); +int32_t AudioTestCodecSetCtrlOps(void); +int32_t AudioTestAccessorySetCtrlOps(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/audio_host_test.h b/test/unittest/model/audio/include/audio_host_test.h index 42160326b..abb05d3ac 100755 --- a/test/unittest/model/audio/include/audio_host_test.h +++ b/test/unittest/model/audio/include/audio_host_test.h @@ -19,7 +19,6 @@ extern "C" { int32_t AudioKcontrolTestGetCodec(void); int32_t GetCardTestInstance(void); -int32_t AudioHostTestDestroy(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/hdf_audio_test.h b/test/unittest/model/audio/include/hdf_audio_test.h index 36a3f34de..9da3251a5 100755 --- a/test/unittest/model/audio/include/hdf_audio_test.h +++ b/test/unittest/model/audio/include/hdf_audio_test.h @@ -20,34 +20,45 @@ extern "C" { typedef enum { AUDIO_DRIVER_TESTGETCODEC, AUDIO_DRIVER_TESTGETCARDINSTANCE, - AUDIO_DRIVER_TESTHOSTDESTROY, AUDIO_DRIVER_TESTGETCCNFIGDATA, - AUDIO_DRIVER_TESTREGISTERDAI, AUDIO_DRIVER_TESTREGISTERPLATFORM, + AUDIO_DRIVER_TESTREGISTERDAI, + AUDIO_DRIVER_TESTREGISTERACCESSORY, AUDIO_DRIVER_TESTREGISTERCODEC, - AUDIO_DRIVER_TESTBINDDAILINK, - AUDIO_DRIVER_TESTDEVICEREGISTER, AUDIO_DRIVER_TESTREGISTERDSP, - AUDIO_DRIVER_TESTREGISTERACCESSORY, - AUDIO_DRIVER_TESTUPDATEREGBITS, - AUDIO_DRIVER_TESTAIAOUPDATEREGBITS, + AUDIO_DRIVER_TESTSOCDEVICEREGISTER, + AUDIO_DRIVER_TESTBINDDAILINK, + AUDIO_DRIVER_TESTUPDATECODECREGBITS, + AUDIO_DRIVER_TESTUPDATEACCESSORYREGBITS, + AUDIO_DRIVER_TESTUPDATECODECAIAOREGBITS, + AUDIO_DRIVER_TESTUPDATEACCESSORYAIAOREGBITS, AUDIO_DRIVER_TESTKCONTROLGETCODEC, - AUDIO_DRIVER_TESTADDCONTROLS, + AUDIO_DRIVER_TESTKCONTROLGETACCESSORY, AUDIO_DRIVER_TESTADDCONTROL, - AUDIO_DRIVER_TESTDEVICEREADREG, - AUDIO_DRIVER_TESTAIAODEVICEREADREG, - AUDIO_DRIVER_TESTINFOCTRLSW, - AUDIO_DRIVER_TESTGETCTRLSW, - AUDIO_DRIVER_TESTPUTCTRLSW, - AUDIO_DRIVER_TESTAIAOGETCTRLSW, - AUDIO_DRIVER_TESTAIAOPUTCTRLSW, + AUDIO_DRIVER_TESTADDCONTROLS, + AUDIO_DRIVER_TESTCODECREADREG, + AUDIO_DRIVER_TESTACCESSORYREADREG, + AUDIO_DRIVER_TESTCODECAIAOREADREG, + AUDIO_DRIVER_TESTACCESSORYAIAOREADREG, + AUDIO_DRIVER_TESTCODECWRITEREG, + AUDIO_DRIVER_TESTACCESSORYWRITEREG, + AUDIO_DRIVER_TESTCODECAIAOWRITEREG, + AUDIO_DRIVER_TESTACCESSORYAIAOWRITEREG, + AUDIO_DRIVER_TESTINFOCTRLOPS, + AUDIO_DRIVER_TESTCODECGETCTRLOPS, + AUDIO_DRIVER_TESTACCESSORYGETCTRLOPS, + AUDIO_DRIVER_TESTCODECAIAOGETCTRLOPS, + AUDIO_DRIVER_TESTACCESSORYAIAOGETCTRLOPS, + AUDIO_DRIVER_TESTCODECSETCTRLOPS, + AUDIO_DRIVER_TESTACCESSORYSETCTRLOPS, + AUDIO_DRIVER_TESTCODECAIAOSETCTRLOPS, + AUDIO_DRIVER_TESTACCESSORYAIAOSETCTRLOPS, AUDIO_DRIVER_TESTNEWCOMPONENT, AUDIO_DRIVER_TESTADDROUTES, AUDIO_DRIVER_TESTNEWCONTROLS, AUDIO_DRIVER_TESTPOWERCOMPONET, AUDIO_DRIVER_TESTREFRESHTIME, AUDIO_DRIVER_TESTSTREAMDISPATCH, - AUDIO_DRIVER_TESTSTREAMDESTORY, } HdfAudioTestCaseCmd; int32_t HdfAudioEntry(HdfTestMsg *msg); diff --git a/test/unittest/model/audio/src/audio_core_test.c b/test/unittest/model/audio/src/audio_core_test.c index 1c2c1a47b..4d10e3390 100755 --- a/test/unittest/model/audio/src/audio_core_test.c +++ b/test/unittest/model/audio/src/audio_core_test.c @@ -8,156 +8,259 @@ #include "audio_core_test.h" #include "audio_core.h" +#include "audio_parse.h" +#include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_core_test +#define AUDIO_CORE_SERVICE_TEST_NAME "hdf_audio_codec_dev0" +#define PLATFORM_TEST_NAME "codec_service_1" +#define PLATFORM_CODEC_TEST_NAME "codec_service_0" +#define ACCESSORY_DAI_TEST_NAME "accessory_dai" +#define DSP_TEST_NAME "dsp_service_0" + +const struct AudioMixerControl g_audioMixerRegParams = { + .reg = 0x2004, /* [0] output volume */ + .rreg = 0x2004, /* register value */ + .shift = 8, /* offset */ + .rshift = 8, /* right offset */ + .min = 0x28, /* min value */ + .max = 0x7F, /* max value */ + .mask = 0x7F, /* mask value */ + .invert = 0, /* invert */ +}; -int32_t AudioSocTestRegisterDai(void) +int32_t AudioSocTestRegisterPlatform(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct DaiData *data = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioSocRegisterDai(device, data); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioSocRegisterDai fail ret = %d", __func__, ret); + if (AudioSocRegisterPlatform(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterPlatform fail", __func__, __LINE__); + return HDF_FAILURE; } + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + struct PlatformData data = { + .drvPlatformName = PLATFORM_TEST_NAME, + }; + if (AudioSocRegisterPlatform(device, &data) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterPlatform fail", __func__); + return HDF_FAILURE; + } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioSocTestRegisterPlatform(void) +int32_t AudioSocTestRegisterDai(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct PlatformData *data = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioSocRegisterPlatform(device, data); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioSocRegisterPlatform fail ret = %d", __func__, ret); + if (AudioSocRegisterDai(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDai fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + struct DaiData data = { + .drvDaiName = ACCESSORY_DAI_TEST_NAME, + }; + if (AudioSocRegisterDai(device, &data) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDai fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestRegisterCodec(void) +int32_t AudioTestRegisterAccessory(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct CodecData *codecData = NULL; - struct DaiData *daiData = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioRegisterCodec(device, codecData, daiData); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioRegisterCodec fail ret = %d", __func__, ret); + if (AudioRegisterAccessory(NULL, NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); + return HDF_FAILURE; } + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + struct AccessoryData data = { + .drvAccessoryName = ACCESSORY_DAI_TEST_NAME, + }; + struct DaiData daiData = { + .drvDaiName = ACCESSORY_DAI_TEST_NAME, + }; + + if (AudioRegisterAccessory(device, &data, &daiData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); + return HDF_FAILURE; + } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestBindDaiLink(void) +int32_t AudioTestRegisterCodec(void) { - int32_t ret; - struct AudioCard *audioCard = NULL; - struct AudioConfigData *configData = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioBindDaiLink(audioCard, configData); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioBindDaiLink fail ret = %d", __func__, ret); + if (AudioRegisterCodec(NULL, NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterCodec fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + struct CodecData codecData = { + .drvCodecName = ACCESSORY_DAI_TEST_NAME, + }; + struct DaiData daiData = { + .drvDaiName = ACCESSORY_DAI_TEST_NAME, + }; + if (AudioRegisterCodec(device, &codecData, &daiData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterCodec fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestSocDeviceRegister(void) +int32_t AudioTestRegisterDsp(void) { - int32_t ret; - void *data = NULL; - enum AudioDeviceType deviceType; - struct HdfDeviceObject *device = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioSocDeviceRegister(device, data, deviceType); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioSocDeviceRegister fail ret = %d", __func__, ret); + if (AudioRegisterDsp(NULL, NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + struct DaiData daiData = { + .drvDaiName = ACCESSORY_DAI_TEST_NAME, + }; + struct DspData dspData = { + .drvDspName = DSP_TEST_NAME, + }; + + if (AudioRegisterDsp(device, &dspData, &daiData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestSocRegisterDsp(void) +int32_t AudioTestSocDeviceRegister(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct DaiData *data = NULL; + struct { + char *name; + } data; + + enum AudioDeviceType deviceType = AUDIO_DAI_DEVICE; HDF_LOGI("%s: enter", __func__); - ret = AudioSocRegisterDsp(device, data); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioSocRegisterDsp fail ret = %d", __func__, ret); + if (AudioSocDeviceRegister(NULL, NULL, deviceType) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + data.name = ACCESSORY_DAI_TEST_NAME; + if (AudioSocDeviceRegister(device, &data, deviceType) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + return HDF_FAILURE; } + deviceType = AUDIO_PLATFORM_DEVICE; + data.name = PLATFORM_TEST_NAME; + if (AudioSocDeviceRegister(device, &data, deviceType) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + return HDF_FAILURE; + } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestRegisterAccessory(void) +int32_t AudioTestBindDaiLink(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct AccessoryData *data = NULL; - struct DaiData *daiData = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioRegisterAccessory(device, data, daiData); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioRegisterAccessory fail ret = %d", __func__, ret); + if (AudioBindDaiLink(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioBindDaiLink fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct AudioCard *card = (struct AudioCard *)OsalMemCalloc(sizeof(struct AudioCard)); + if (card == NULL) { + ADM_LOG_ERR("%s_[%d] Malloc audioCard fail!", __func__, __LINE__); + return HDF_FAILURE; + } + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); + if (AudioFillConfigData(device, &(card->configData)) != HDF_SUCCESS) { + ADM_LOG_ERR("%s_[%d] AudioFillConfigData fail", __func__, __LINE__); + OsalMemFree(card); + card = NULL; + return HDF_FAILURE; } + if (AudioBindDaiLink(card, &(card->configData)) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioBindDaiLink fail", __func__, __LINE__); + OsalMemFree(card); + card = NULL; + return HDF_FAILURE; + } + OsalMemFree(card->rtd); + card->rtd = NULL; + OsalMemFree(card); + card = NULL; HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestUpdateRegBits(void) +int32_t ReadCodecReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val) { - int32_t codecRet; - int32_t accessoryRet; - int32_t value; - void *device = NULL; - struct AudioMixerControl *mixerControl = NULL; - HDF_LOGI("%s: enter", __func__); + return HDF_SUCCESS; +} + +int32_t WriteCodecReg(unsigned long virtualAddress, uint32_t reg, uint32_t val) +{ + return HDF_SUCCESS; +} +int32_t AudioTestUpdateCodecRegBits(void) +{ + int32_t value = 0; + if (AudioUpdateCodecRegBits(NULL, NULL, value) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); + return HDF_FAILURE; + } - codecRet = AudioUpdateRegBits(AUDIO_CODEC_DEVICE, device, mixerControl, value); - accessoryRet = AudioUpdateRegBits(AUDIO_ACCESSORY_DEVICE, device, mixerControl, value); - if (codecRet != HDF_SUCCESS || accessoryRet != HDF_SUCCESS) { - HDF_LOGE("%s: AudioUpdateRegBits fail codecRet = %d, accessoryRet = %d", __func__, codecRet, accessoryRet); + struct CodecData codecData = { + .Read = ReadCodecReg, + .Write = WriteCodecReg, + }; + struct CodecDevice codec; + codec.devCodecName = PLATFORM_CODEC_TEST_NAME; + OsalMutexInit(&codec.mutex); + codec.devData = &codecData; + value = g_audioMixerRegParams.min + 1; + if (AudioUpdateCodecRegBits(&codec, &g_audioMixerRegParams, value) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); + OsalMutexDestroy(&codec.mutex); + return HDF_FAILURE; } + OsalMutexDestroy(&codec.mutex); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAiaoUpdateRegBits(void) +int32_t AudioTestUpdateAccessoryRegBits(void) { - uint32_t reg; - uint32_t mask; - uint32_t shift; - int32_t value; - int32_t ret; - struct CodecDevice *codec = NULL; - HDF_LOGI("%s: enter", __func__); + struct AccessoryDevice *accessory = NULL; + struct AudioMixerControl *mixerControl = NULL; + int32_t value = 0; - ret = AudioAiaoUpdateRegBits(codec, reg, mask, shift, value); + int32_t ret = AudioUpdateAccessoryRegBits(accessory, mixerControl, value); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioAiaoUpdateRegBits fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioTestUpdateAccessoryRegBits fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); @@ -172,7 +275,35 @@ int32_t AudioTestKcontrolGetCodec(void) codecDevice = AudioKcontrolGetCodec(kcontrol); if (codecDevice == NULL) { - HDF_LOGE("%s: AudioKcontrolGetCodec fail!", __func__); + HDF_LOGE("%s_[%d] AudioKcontrolGetCodec fail!", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioTestKcontrolGetAccessory(void) +{ + struct AudioKcontrol *kcontrol = NULL; + struct AccessoryDevice *accessory = AudioKcontrolGetAccessory(kcontrol); + if (accessory == NULL) { + HDF_LOGE("%s_[%d] AudioKcontrolGetAccessory fail!", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioTestAddControl(void) +{ + struct AudioCard *audioCard = NULL; + const struct AudioKcontrol *control = NULL; + struct AudioKcontrol *audioKcontrol = NULL; + HDF_LOGI("%s: enter", __func__); + + audioKcontrol = AudioAddControl(audioCard, control); + if (audioKcontrol == NULL) { + HDF_LOGE("%s_[%d] AudioAddControl fail!", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); @@ -183,143 +314,143 @@ int32_t AudioTestAddControls(void) { struct AudioCard *audioCard = NULL; const struct AudioKcontrol *controls = NULL; - int32_t controlMaxNum = 0; + int32_t controlMaxNum = 0x03; int32_t ret; HDF_LOGI("%s: enter", __func__); ret = AudioAddControls(audioCard, controls, controlMaxNum); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioAddControls fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioAddControls fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAddControl(void) +int32_t AudioTestCodecReadReg(void) { - struct AudioCard *audioCard = NULL; - const struct AudioKcontrol *control = NULL; - struct AudioKcontrol *audioKcontrol = NULL; - HDF_LOGI("%s: enter", __func__); + struct CodecDevice *codec = NULL; + uint32_t reg = 0; + uint32_t val = 0; - audioKcontrol = AudioAddControl(audioCard, control); - if (audioKcontrol == NULL) { - HDF_LOGE("%s: AudioAddControl fail!", __func__); + int32_t ret = AudioCodecReadReg(codec, reg, &val); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecReadReg fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestDeviceReadReg(void) +int32_t AudioTestAccessoryReadReg(void) { - int32_t codecRet; - int32_t acccessoryRet; + struct AccessoryDevice *accessory = NULL; uint32_t reg = 0; + uint32_t val = 0; + + int32_t ret = AudioAccessoryReadReg(accessory, reg, &val); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioAccessoryReadReg fail", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioTestCodecWriteReg(void) +{ struct CodecDevice *codec = NULL; - struct AccessoryDevice *accessory = NULL; - HDF_LOGI("%s: enter", __func__); + uint32_t reg = 0; + uint32_t val = 0; - codecRet = AudioCodecDeviceReadReg(codec, reg); - acccessoryRet = AudioAccessoryDeviceReadReg(accessory, reg); - if (codecRet != HDF_SUCCESS || acccessoryRet != HDF_SUCCESS) { - HDF_LOGE("%s: AudioDeviceReadReg fail codecRet = %d, acccessoryRet = %d", __func__, codecRet, acccessoryRet); + int32_t ret = AudioCodecWriteReg(codec, reg, val); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecWriteReg fail", __func__, __LINE__); } + HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAiaoDeviceReadReg(void) +int32_t AudioTestAccessoryWriteReg(void) { - int32_t ret; + struct AccessoryDevice *accessory = NULL; uint32_t reg = 0; - struct CodecDevice *codec = NULL; - HDF_LOGI("%s: enter", __func__); + uint32_t val = 0; - ret = AudioAiaoDeviceReadReg(codec, reg); + int32_t ret = AudioAccessoryWriteReg(accessory, reg, val); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioAiaoDeviceReadReg fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioAccessoryWriteReg fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestInfoCtrlSw(void) +int32_t AudioTestInfoCtrlOps(void) { - int32_t ret; struct AudioKcontrol *kcontrol = NULL; struct AudioCtrlElemInfo *elemInfo = NULL; - HDF_LOGI("%s: enter", __func__); - ret = AudioInfoCtrlSw(kcontrol, elemInfo); + int32_t ret = AudioInfoCtrlOps(kcontrol, elemInfo); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioInfoCtrlSw fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioInfoCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestGetCtrlSw(void) +int32_t AudioTestCodecGetCtrlOps(void) { - int32_t ret; struct AudioKcontrol *kcontrol = NULL; struct AudioCtrlElemValue *elemValue = NULL; - HDF_LOGI("%s: enter", __func__); - ret = AudioGetCtrlSw(kcontrol, elemValue); + int32_t ret = AudioCodecGetCtrlOps(kcontrol, elemValue); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioGetCtrlSw fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioCodecGetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestPutCtrlSw(void) +int32_t AudioTestAccessoryGetCtrlOps(void) { - int32_t ret; struct AudioKcontrol *kcontrol = NULL; struct AudioCtrlElemValue *elemValue = NULL; - HDF_LOGI("%s: enter", __func__); - ret = AudioPutCtrlSw(kcontrol, elemValue); + int32_t ret = AudioAccessoryGetCtrlOps(kcontrol, elemValue); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AudioPutCtrlSw fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioAccessoryGetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AiaoTestGetCtrlSw(void) +int32_t AudioTestCodecSetCtrlOps(void) { - int32_t ret; struct AudioKcontrol *kcontrol = NULL; struct AudioCtrlElemValue *elemValue = NULL; - HDF_LOGI("%s: enter", __func__); - ret = AiaoGetCtrlSw(kcontrol, elemValue); + int32_t ret = AudioCodecSetCtrlOps(kcontrol, elemValue); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AiaoGetCtrlSw fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioCodecSetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AiaoTestPutCtrlSw(void) +int32_t AudioTestAccessorySetCtrlOps(void) { - int32_t ret; struct AudioKcontrol *kcontrol = NULL; struct AudioCtrlElemValue *elemValue = NULL; - HDF_LOGI("%s: enter", __func__); - ret = AiaoPutCtrlSw(kcontrol, elemValue); + int32_t ret = AudioAccessorySetCtrlOps(kcontrol, elemValue); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AiaoPutCtrlSw fail ret = %d", __func__, ret); + HDF_LOGE("%s_[%d] AudioAccessorySetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); diff --git a/test/unittest/model/audio/src/audio_host_test.c b/test/unittest/model/audio/src/audio_host_test.c index ef4d81c2a..283c2cf02 100755 --- a/test/unittest/model/audio/src/audio_host_test.c +++ b/test/unittest/model/audio/src/audio_host_test.c @@ -8,21 +8,28 @@ #include "audio_host_test.h" #include "audio_host.h" +#include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_host_test +#define KCONTROL_TEST_SERVICE_NAME "dsp_service_0" int32_t AudioKcontrolTestGetCodec(void) { - struct HdfDeviceObject *device = NULL; - struct AudioHost *audioHost = NULL; HDF_LOGI("%s: enter", __func__); - audioHost = AudioHostCreateAndBind(device); - if (audioHost != NULL) { - HDF_LOGE("%s: codecDevice is not NULL", __func__); + if (AudioHostCreateAndBind(NULL) != NULL) { + HDF_LOGE("%s_[%d] codecDevice is not NULL", __func__, __LINE__); return HDF_FAILURE; } + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(KCONTROL_TEST_SERVICE_NAME); + struct AudioHost *audioHost = AudioHostCreateAndBind(device); + if (audioHost == NULL) { + HDF_LOGE("%s_[%d] codecDevice is NULL", __func__, __LINE__); + return HDF_FAILURE; + } + + OsalMemFree(audioHost); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } @@ -52,13 +59,3 @@ int32_t GetCardTestInstance(void) HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } - -int32_t AudioHostTestDestroy(void) -{ - struct AudioHost *host = NULL; - HDF_LOGI("%s: enter", __func__); - - AudioHostDestroy(host); - HDF_LOGI("%s: success", __func__); - return HDF_SUCCESS; -} diff --git a/test/unittest/model/audio/src/audio_parse_test.c b/test/unittest/model/audio/src/audio_parse_test.c index 74c61c61e..24ab294cb 100755 --- a/test/unittest/model/audio/src/audio_parse_test.c +++ b/test/unittest/model/audio/src/audio_parse_test.c @@ -5,22 +5,26 @@ * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ - #include "audio_parse_test.h" #include "audio_parse.h" +#include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_parse_test +#define TEST_PARSE_SERVICE_NAME "hdf_audio_codec_dev0" int32_t AudioFillTestConfigData(void) { - int32_t ret; - struct HdfDeviceObject *device = NULL; - struct AudioConfigData *configData = NULL; HDF_LOGI("%s: enter", __func__); - ret = AudioFillConfigData(device, configData); - if (ret == HDF_SUCCESS) { - HDF_LOGE("%s: AudioFillConfigData fail! ret = %d", __func__, ret); + if (AudioFillConfigData(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d]: AudioFillConfigData fail", __func__, __LINE__); + return HDF_FAILURE; + } + + struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(TEST_PARSE_SERVICE_NAME); + struct AudioConfigData configData; + if (AudioFillConfigData(device, &configData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d]: AudioFillConfigData fail", __func__, __LINE__); return HDF_FAILURE; } diff --git a/test/unittest/model/audio/src/audio_stream_dispatch_test.c b/test/unittest/model/audio/src/audio_stream_dispatch_test.c index 4d9d138c3..2d0f1c89f 100755 --- a/test/unittest/model/audio/src/audio_stream_dispatch_test.c +++ b/test/unittest/model/audio/src/audio_stream_dispatch_test.c @@ -27,14 +27,3 @@ int32_t AudioControlDispatchTestStreamDispatch(void) HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } - -int32_t AudioControlDispatchTestStreamHostDestroy(void) -{ - struct StreamHost *host = NULL; - HDF_LOGI("%s: enter", __func__); - - StreamHostDestroy(host); - - HDF_LOGI("%s: success", __func__); - return HDF_SUCCESS; -} diff --git a/test/unittest/model/audio/src/hdf_audio_test.c b/test/unittest/model/audio/src/hdf_audio_test.c index 72114884b..4af3765bd 100755 --- a/test/unittest/model/audio/src/hdf_audio_test.c +++ b/test/unittest/model/audio/src/hdf_audio_test.c @@ -20,34 +20,37 @@ static HdfTestCaseList g_hdfAudioTestCaseList[] = { {AUDIO_DRIVER_TESTGETCODEC, AudioKcontrolTestGetCodec}, {AUDIO_DRIVER_TESTGETCARDINSTANCE, GetCardTestInstance}, - {AUDIO_DRIVER_TESTHOSTDESTROY, AudioHostTestDestroy}, {AUDIO_DRIVER_TESTGETCCNFIGDATA, AudioFillTestConfigData}, - {AUDIO_DRIVER_TESTREGISTERDAI, AudioSocTestRegisterDai}, + {AUDIO_DRIVER_TESTREGISTERPLATFORM, AudioSocTestRegisterPlatform}, + {AUDIO_DRIVER_TESTREGISTERDAI, AudioSocTestRegisterDai}, + {AUDIO_DRIVER_TESTREGISTERACCESSORY, AudioTestRegisterAccessory}, {AUDIO_DRIVER_TESTREGISTERCODEC, AudioTestRegisterCodec}, + {AUDIO_DRIVER_TESTREGISTERDSP, AudioTestRegisterDsp}, + {AUDIO_DRIVER_TESTSOCDEVICEREGISTER, AudioTestSocDeviceRegister}, {AUDIO_DRIVER_TESTBINDDAILINK, AudioTestBindDaiLink}, - {AUDIO_DRIVER_TESTDEVICEREGISTER, AudioTestSocDeviceRegister}, - {AUDIO_DRIVER_TESTREGISTERDSP, AudioTestSocRegisterDsp}, - {AUDIO_DRIVER_TESTREGISTERACCESSORY, AudioTestRegisterAccessory}, - {AUDIO_DRIVER_TESTUPDATEREGBITS, AudioTestUpdateRegBits}, - {AUDIO_DRIVER_TESTAIAOUPDATEREGBITS, AudioTestAiaoUpdateRegBits}, + {AUDIO_DRIVER_TESTUPDATECODECREGBITS, AudioTestUpdateCodecRegBits}, + {AUDIO_DRIVER_TESTUPDATEACCESSORYREGBITS, AudioTestUpdateAccessoryRegBits}, {AUDIO_DRIVER_TESTKCONTROLGETCODEC, AudioTestKcontrolGetCodec}, - {AUDIO_DRIVER_TESTADDCONTROLS, AudioTestAddControls}, + {AUDIO_DRIVER_TESTKCONTROLGETACCESSORY, AudioTestKcontrolGetAccessory}, {AUDIO_DRIVER_TESTADDCONTROL, AudioTestAddControl}, - {AUDIO_DRIVER_TESTDEVICEREADREG, AudioTestDeviceReadReg}, - {AUDIO_DRIVER_TESTAIAODEVICEREADREG, AudioTestAiaoDeviceReadReg}, - {AUDIO_DRIVER_TESTINFOCTRLSW, AudioTestInfoCtrlSw}, - {AUDIO_DRIVER_TESTGETCTRLSW, AudioTestGetCtrlSw}, - {AUDIO_DRIVER_TESTPUTCTRLSW, AudioTestPutCtrlSw}, - {AUDIO_DRIVER_TESTAIAOGETCTRLSW, AiaoTestGetCtrlSw}, - {AUDIO_DRIVER_TESTAIAOPUTCTRLSW, AiaoTestPutCtrlSw}, + {AUDIO_DRIVER_TESTADDCONTROLS, AudioTestAddControls}, + {AUDIO_DRIVER_TESTCODECREADREG, AudioTestCodecReadReg}, + {AUDIO_DRIVER_TESTACCESSORYREADREG, AudioTestAccessoryReadReg}, + {AUDIO_DRIVER_TESTCODECWRITEREG, AudioTestCodecWriteReg}, + {AUDIO_DRIVER_TESTACCESSORYWRITEREG, AudioTestAccessoryWriteReg}, + {AUDIO_DRIVER_TESTINFOCTRLOPS, AudioTestInfoCtrlOps}, + {AUDIO_DRIVER_TESTCODECGETCTRLOPS, AudioTestCodecGetCtrlOps}, + {AUDIO_DRIVER_TESTACCESSORYGETCTRLOPS, AudioTestAccessoryGetCtrlOps}, + {AUDIO_DRIVER_TESTCODECSETCTRLOPS, AudioTestCodecSetCtrlOps}, + {AUDIO_DRIVER_TESTACCESSORYSETCTRLOPS, AudioTestAccessorySetCtrlOps}, + {AUDIO_DRIVER_TESTNEWCOMPONENT, AudioSapmTestNewComponents}, {AUDIO_DRIVER_TESTADDROUTES, AudioSapmTestAddRoutes}, {AUDIO_DRIVER_TESTNEWCONTROLS, AudioSapmTestNewControls}, {AUDIO_DRIVER_TESTPOWERCOMPONET, AudioSapmTestPowerComponents}, {AUDIO_DRIVER_TESTREFRESHTIME, AudioSapmTestRefreshTime}, {AUDIO_DRIVER_TESTSTREAMDISPATCH, AudioControlDispatchTestStreamDispatch}, - {AUDIO_DRIVER_TESTSTREAMDESTORY, AudioControlDispatchTestStreamHostDestroy}, }; int32_t HdfAudioEntry(HdfTestMsg *msg) -- Gitee From 2af6b50225ca5ef2783654f00d8f1720dbb74c59 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Tue, 2 Nov 2021 14:52:20 +0800 Subject: [PATCH 127/272] fix the bug in gpio_service.c Signed-off-by: jiaziyang --- support/platform/src/gpio/gpio_service.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/platform/src/gpio/gpio_service.c b/support/platform/src/gpio/gpio_service.c index fe746026f..52ee00fef 100644 --- a/support/platform/src/gpio/gpio_service.c +++ b/support/platform/src/gpio/gpio_service.c @@ -198,8 +198,8 @@ static void GpioManagerRelease(struct HdfDeviceObject *device) } gpioMgr->device.hdfDev = NULL; - device->service = NULL; device->service->Dispatch = NULL; + device->service = NULL; HDF_LOGI("GpioManagerRelease: done"); } -- Gitee From 43a18eb85e39da28780e04aad8d33923473e66db Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Wed, 27 Oct 2021 16:59:41 +0800 Subject: [PATCH 128/272] =?UTF-8?q?regulator=E6=A1=86=E6=9E=B6=E4=B8=8A?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- include/platform/regulator_if.h | 207 +++++++ support/platform/include/regulator_core.h | 136 +++++ support/platform/src/regulator_core.c | 623 ++++++++++++++++++++++ support/platform/src/regulator_if.c | 106 ++++ 4 files changed, 1072 insertions(+) create mode 100755 include/platform/regulator_if.h create mode 100755 support/platform/include/regulator_core.h create mode 100755 support/platform/src/regulator_core.c create mode 100755 support/platform/src/regulator_if.c diff --git a/include/platform/regulator_if.h b/include/platform/regulator_if.h new file mode 100755 index 000000000..cb2784690 --- /dev/null +++ b/include/platform/regulator_if.h @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +/** + * @addtogroup REGULATOR + * @{ + * + * @Brief Provides regulator APIs, such as enabling and setting voltage / current. + * + * The REGULATOR module abstracts the regulator functions of different system platforms and provides stable APIs for drivers. + * You can use this module to create / release the regulator device handle, enable regulator, set voltage, current, disable, etc. + * + * @since 1.0 + */ + +/** + * @file regulator_if.h + * + * @brief Declares standard regulator APIs. + * + * @since 1.0 + */ + +#ifndef REGULATOR_IF_H +#define REGULATOR_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @brief Enumerates regulator disableMode. + * + * To disable the mode using the regulator, call the {@ link RegulatorDisable} function. + * + * @since 1.0 + */ + +enum RegulatorDisableMode { + NORMAL_DISABLE, + DEFERRED_DISABLE, + FORCE_DISABLE, + MAX_DISABLE_MODE, +}; + +/** + * @brief Gets a regulator. + * + * This function must be called to get its device handle before operating the regulator. + * + * @param name Indicates regulator name. + * + * @return If the operation is successful, a pointer to the regulator device handle is returned. + * + * @since 1.0 + */ +DevHandle RegulatorGet(const char *name); + +/** + * @brief Releases a regulator. + * + * If you no longer need the regulator, call this function to turn it off and release its device handle to prevent. + * Use memory resources unnecessarily. + * + * @param handle Represents a pointer to the regulator device handle. + * + * @since 1.0 + */ +void RegulatorPut(DevHandle handle); + +/** + * @brief Enables a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @return 0 If the regulator enables successfully; Otherwise, a negative value is returned. + * + * @attention That if the regulator has been enabled before calling this function, calling this function will succeed. + * + * @since 1.0 + */ +int32_t RegulatorEnable(DevHandle handle); + +/** + * @brief Disable a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param disableMode There are three disabled modes. + * @return 0 If the regulator disable successfully; Otherwise, a negative value is returned. + * + * @attention If the regulator device AlwaysOn is true, disabling may fail, depending on the specific mode. + * + * @since 1.0 + */ +int32_t RegulatorDisable(DevHandle handle,int32_t disableMode); + +/** + * @brief Determine whether a regulator is enabled. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @return 0 If the regulator isEnabled successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorIsEnabled(DevHandle handle); + +/** + * @brief Set the voltage value of a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @return 0 If the regulator setVoltage successfully; Otherwise, a negative value is returned. + * + * @attention If the set voltage is not within the range, the setting fails. + * + * @since 1.0 + */ +int32_t RegulatorSetVoltage(DevHandle handle, int32_t voltage); + +/** + * @brief Get a regulator voltage. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param voltage Voltage obtained. + * @return 0 If the regulator get voltage successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetVoltage(DevHandle handle, int32_t *voltage); + +/** + * @brief Set regulator voltage range + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param vmin Minimum value of regulator voltage + * @param vmax Maximum regulator voltage + * @return 0 If the regulator set voltage range successfully; Otherwise, a negative value is returned. + * + * @attention If the setting range exceeds the limit, the setting fails + * + * @since 1.0 + */ +int32_t RegulatorSetVoltageRange(DevHandle handle, int32_t vmin, int32_t vmax); + +/** + * @brief Set the current value of a regulator + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @return 0 If the regulator setCurrent successfully; Otherwise, a negative value is returned. + * + * @attention If the set current is not within the range, the setting fails + * + * @since 1.0 + */ +int32_t RegulatorSetCurrent(DevHandle handle, int32_t current); + +/** + * @brief Get a regulator current + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param voltage Current obtained + * @return 0 If the regulator getCurrent successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetCurrent(DevHandle handle, int32_t *current); + +/** + * @brief Set regulator current range + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param cmin Minimum value of regulator current + * @param cmax Maximum regulator current + * @return 0 If the regulator set current range successfully; Otherwise, a negative value is returned. + * + * @attention If the setting range exceeds the limit, the setting fails + * + * @since 1.0 + */ +int32_t RegulatorSetCurrentRange(DevHandle handle, int32_t cmin, int32_t cmax); + +/** + * @brief Get a regulator status + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. + * @param status Status obtained + * @return 0 If the regulator get status successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetStatus(DevHandle handle, int32_t *status); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* REGULATOR_IF_H */ +/** @} */ diff --git a/support/platform/include/regulator_core.h b/support/platform/include/regulator_core.h new file mode 100755 index 000000000..1542b442a --- /dev/null +++ b/support/platform/include/regulator_core.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef REGULATOR_CORE_H +#define REGULATOR_CORE_H + +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_mutex.h" +#include "osal_spinlock.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define REGULATOR_NUM_MAX 50 +#define REGULATOR_MOUNT_QUANTITY_MAX 10 +#define REGULATOR_NAME_LEN 128 +#define REGULATOR_SLEEP_TIME 500 + +struct RegulatorCntlr; +struct RegulatorMethod; + +enum RegulatorStatus { + REGULATOR_STATUS_ON, + REGULATOR_STATUS_OFF, +}; + +struct RegulatorDesc { + const char *name; + const char *supplyName; + uint32_t minOutPutUv; + uint32_t maxOutPutUv; + uint32_t minOutPutUa; + uint32_t maxOutPutUa; + uint32_t outPutUv; + uint32_t outPutUa; + uint32_t inPutUv; + uint32_t inPutUa; + uint32_t enabledCount; + uint32_t status; +}; + +struct RegulatorConstraint { + bool alwaysOn; + uint32_t maxMountQuantity; + uint32_t minOutPutUv; + uint32_t maxOutPutUv; + uint32_t minOutPutUa; + uint32_t maxOutPutUa; +}; + +struct RegulatorInitdata { + uint32_t initInPutUv; + uint32_t initInPutUa; + uint32_t initOutPutUv; + uint32_t initOutPutUa; +}; + +struct RegulatorTree { + struct RegulatorTree *supply; + struct RegulatorDesc desc; + struct RegulatorConstraint constraint; + struct RegulatorInitdata initData; + struct RegulatorTree *consumer[REGULATOR_MOUNT_QUANTITY_MAX]; +}; + +struct RegulatorCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct RegulatorMethod *ops; + OsalSpinlock spinLock; + struct OsalMutex mutexLock; + struct RegulatorTree *tree; + struct RegulatorTree *rootTree; + void *priv; +}; + +struct RegulatorMethod { + void (*getPriv)(struct RegulatorCntlr *cntlr); + void (*releasePriv)(struct RegulatorCntlr *cntlr); + int32_t (*enable)(struct RegulatorCntlr *cntlr); + int32_t (*disable)(struct RegulatorCntlr *cntlr); + int32_t (*isEnabled)(struct RegulatorCntlr *cntlr); + int32_t (*setVoltage)(struct RegulatorCntlr *cntlr, int32_t voltage); + int32_t (*getVoltage)(struct RegulatorCntlr *cntlr, int32_t *voltage); + int32_t (*setVoltageRange)(struct RegulatorCntlr *cntlr, int32_t vmin, int32_t vmax); + int32_t (*setCurrent)(struct RegulatorCntlr *cntlr, int32_t current); + int32_t (*getCurrent)(struct RegulatorCntlr *cntlr, int32_t *current); + int32_t (*setCurrentRange)(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax); + int32_t (*getStatus)(struct RegulatorCntlr *cntlr, int32_t *status); +}; + +int32_t RegulatorCntlrAdd(struct RegulatorCntlr *cntlr); + +void RegulatorCntlrRemove(struct RegulatorCntlr *cntlr); + +static inline struct RegulatorCntlr *RegulatorCntlrFromDevice(struct HdfDeviceObject *device) +{ + return (device == NULL) ? NULL : (struct RegulatorCntlr *)device->service; +} + +static inline struct HdfDeviceObject *RegulatorCntlrToDevice(struct RegulatorCntlr *cntlr) +{ + return (cntlr == NULL) ? NULL : cntlr->device; +} + +void *RegulatorCntlrGet(const char *name); +void RegulatorGetPrivData(struct RegulatorCntlr *cntlr); +void RegulatorReleasePriv(struct RegulatorCntlr *cntlr); +int32_t RegulatorCntlrEnable(struct RegulatorCntlr *cntlr); +int32_t RegulatorCntlrDisable(struct RegulatorCntlr *cntlr, int32_t disableMode); +int32_t RegulatorCntlrIsEnabled(struct RegulatorCntlr *cntlr); +int32_t RegulatorCntlrSetVoltage(struct RegulatorCntlr *cntlr, int32_t voltage); +int32_t RegulatorCntlrGetVoltage(struct RegulatorCntlr *cntlr, int32_t *voltage); +int32_t RegulatorCntlrSetVoltageRange(struct RegulatorCntlr *cntlr, int32_t vmax, int32_t vmin); +int32_t RegulatorCntlrSetCurrent(struct RegulatorCntlr *cntlr, int32_t current); +int32_t RegulatorCntlrGetCurrent(struct RegulatorCntlr *cntlr, int32_t *current); +int32_t RegulatorCntlrSetCurrentRange(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax); +int32_t RegulatorCntlrGetStatus(struct RegulatorCntlr *cntlr, int32_t *status); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* REGULATOR_CORE_H */ diff --git a/support/platform/src/regulator_core.c b/support/platform/src/regulator_core.c new file mode 100755 index 000000000..bc47f823c --- /dev/null +++ b/support/platform/src/regulator_core.c @@ -0,0 +1,623 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "regulator_core.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "securec.h" + +#define HDF_LOG_TAG regulator_core + +enum RegulatorDisableMode { + NORMAL_DISABLE, + DEFERRED_DISABLE, + FORCE_DISABLE, + MAX_DISABLE_MODE, +}; + +static int32_t RegulatorNormalDisable(struct RegulatorCntlr *cntlr); +static int32_t RegulatorDeferredDisable(struct RegulatorCntlr *cntlr); +static int32_t RegulatorForceDisable(struct RegulatorCntlr *cntlr); + +struct RegulatorTree *RegulatorTreeGet(struct RegulatorCntlr *cntlr, const char *name) +{ + int i; + + for (i = 0; i < REGULATOR_NUM_MAX; i++) { + if (strcmp(name, cntlr->rootTree[i].desc.name) == 0) { + return &cntlr->rootTree[i]; + } + } + + HDF_LOGE("can't get tree!,func:%s",__func__); + return NULL; +} + +void *RegulatorCntlrGet(const char *name) +{ + void *handle; + struct RegulatorCntlr *cntlr; + handle = (void *)DevSvcManagerClntGetService("HDF_PLATFORM_REGULATOR"); + if (handle == NULL) { + HDF_LOGE("RegulatorGetByName: get handle fail!"); + } + RegulatorGetPrivData((struct RegulatorCntlr *)handle); + cntlr = (struct RegulatorCntlr *)handle; + cntlr->tree = RegulatorTreeGet((struct RegulatorCntlr *)handle, name); + + return (void *)handle; +} + +int32_t RegulatorCntlrAdd(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("RegulatorCntlrAdd: cntlr is NULL!"); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->device == NULL) { + HDF_LOGE("RegulatorCntlrAdd: no device associated!"); + return HDF_ERR_INVALID_OBJECT; + } + + ret = OsalSpinInit(&cntlr->spinLock); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorCntlrAdd: spinlock init fail!"); + return ret; + } + + ret = OsalMutexInit(&cntlr->mutexLock); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorCntlrAdd: mutexlock init fail!"); + return ret; + } + + cntlr->device->service = &cntlr->service; + return HDF_SUCCESS; +} + +void RegulatorCntlrRemove(struct RegulatorCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + + if (cntlr->device == NULL) { + HDF_LOGE("RegulatorCntlrRemove: cntlr is NULL!"); + return; + } + + cntlr->device->service = NULL; + (void)OsalMutexDestroy(&cntlr->mutexLock); + (void)OsalSpinDestroy(&cntlr->spinLock); +} + +void RegulatorGetPrivData(struct RegulatorCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + HDF_LOGE("RegulatorGetPrivData: cntlr is NULL!"); + return; + } + if (cntlr->ops->getPriv != NULL) { + cntlr->ops->getPriv(cntlr); + } +} + +void RegulatorReleasePriv(struct RegulatorCntlr *cntlr) +{ + if (cntlr == NULL || cntlr->ops == NULL) { + HDF_LOGE("RegulatorReleasePriv: cntlr is NULL!"); + return; + } + if (cntlr->ops->releasePriv != NULL) { + cntlr->ops->releasePriv(cntlr); + } +} + +int32_t RegulatorCntlrEnable(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->enable == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = RegulatorCntlrIsEnabled(cntlr); + if (ret != HDF_SUCCESS) { + ret = RegulatorCntlrEnable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + } + + ret = cntlr->ops->enable(cntlr); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), + (cntlr->tree->initData.initInPutUv + cntlr->tree->supply->desc.outPutUv)); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + ret = RegulatorCntlrSetVoltage(cntlr, cntlr->tree->initData.initOutPutUv); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + cntlr->tree->desc.status = REGULATOR_STATUS_ON; + cntlr->tree->supply->desc.enabledCount += 1; + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; + + EXIT: + cntlr->tree->constraint.alwaysOn = false; + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; +} + +static int32_t RegulatorNormalDisable(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + + if (cntlr->tree->constraint.alwaysOn != true) { + HDF_LOGE("device always on,func:%s",__func__); + return HDF_FAILURE; + } + + if (cntlr->tree->desc.enabledCount != 0) { + HDF_LOGE("consumer is working,func:%s",__func__); + return HDF_FAILURE; + } + + ret = cntlr->ops->disable(cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + cntlr->tree->desc.outPutUv = 0; + cntlr->tree->desc.status = REGULATOR_STATUS_OFF; + ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), + (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + cntlr->tree->supply->desc.enabledCount -= 1; + cntlr->tree->constraint.alwaysOn = false; + + if (cntlr->tree->supply->desc.enabledCount == 0) { + ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("supply disable failed,func:%s",__func__); + } + } + + return HDF_SUCCESS; +} + +static int32_t RegulatorDeferredDisable(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + int i; + + if (cntlr->tree->constraint.alwaysOn != true) { + HDF_LOGW("device always on,func:%s",__func__); + return HDF_FAILURE; + } + + if (cntlr->tree->desc.enabledCount != 0) { + for (i = 0; i < cntlr->tree->constraint.maxMountQuantity; i++) { + if (cntlr->tree->consumer[i]->constraint.alwaysOn != false) { + HDF_LOGW("consumer device always on,func:%s",__func__); + return HDF_FAILURE; + } + } + OsalSleep(REGULATOR_SLEEP_TIME); + ret = RegulatorForceDisable(cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorForceDisable failed,func:%s",__func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; + } + + ret = cntlr->ops->disable(cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + cntlr->tree->desc.outPutUv = 0; + cntlr->tree->desc.status = REGULATOR_STATUS_OFF; + ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), + (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + cntlr->tree->supply->desc.enabledCount -= 1; + cntlr->tree->constraint.alwaysOn = false; + + if (cntlr->tree->supply->desc.enabledCount == 0) { + ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("supply disable failed,func:%s",__func__); + } + } + + return HDF_SUCCESS; +} + +static int32_t RegulatorForceDisable(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + + ret = cntlr->ops->disable(cntlr); + if (ret != HDF_SUCCESS) { + return HDF_FAILURE; + } + cntlr->tree->desc.outPutUv = 0; + cntlr->tree->desc.status = REGULATOR_STATUS_OFF; + ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), + (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + cntlr->tree->supply->desc.enabledCount -= 1; + cntlr->tree->constraint.alwaysOn = false; + + if (cntlr->tree->supply->desc.enabledCount == 0) { + ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("supply disable failed,func:%s",__func__); + } + } + + return HDF_SUCCESS; +} + +int32_t RegulatorCntlrDisable(struct RegulatorCntlr *cntlr, int32_t disableMode) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->disable == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + switch (disableMode) + { + case NORMAL_DISABLE: + ret = RegulatorNormalDisable(cntlr); + break; + case DEFERRED_DISABLE: + ret = RegulatorDeferredDisable(cntlr); + break; + case FORCE_DISABLE: + ret = RegulatorForceDisable(cntlr); + break; + default: + ret = HDF_FAILURE; + break; + } + + if (ret != HDF_SUCCESS) { + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; +} + +int32_t RegulatorCntlrIsEnabled(struct RegulatorCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->isEnabled == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + if (cntlr->tree->constraint.alwaysOn == true) { + cntlr->tree->desc.status = REGULATOR_STATUS_ON; + return HDF_SUCCESS; + } + + ret = cntlr->ops->isEnabled(cntlr); + if (cntlr->tree->constraint.alwaysOn == false) { + cntlr->tree->desc.status = REGULATOR_STATUS_OFF; + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + + cntlr->tree->desc.status = REGULATOR_STATUS_ON; + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; +} + +int32_t RegulatorCntlrSetVoltage(struct RegulatorCntlr *cntlr, int32_t voltage) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->setVoltage == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = RegulatorCntlrIsEnabled(cntlr); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + if (voltage < cntlr->tree->desc.minOutPutUv || voltage > cntlr->tree->desc.maxOutPutUv) { + goto EXIT; + } + + ret = cntlr->ops->setVoltage(cntlr, voltage); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; + + EXIT: + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; +} + +int32_t RegulatorCntlrGetVoltage(struct RegulatorCntlr *cntlr, int32_t *voltage) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->getVoltage == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = cntlr->ops->getVoltage(cntlr, voltage); + if (ret != HDF_SUCCESS) { + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; +} + +int32_t RegulatorCntlrSetVoltageRange(struct RegulatorCntlr *cntlr, int32_t vmin, int32_t vmax) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->setVoltageRange == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = RegulatorCntlrIsEnabled(cntlr); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + if (vmin < cntlr->tree->constraint.minOutPutUv || vmax > cntlr->tree->constraint.maxOutPutUv) { + goto EXIT; + } + + ret = cntlr->ops->setVoltageRange(cntlr, vmin, vmax); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; + + EXIT: + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; +} + +int32_t RegulatorCntlrSetCurrent(struct RegulatorCntlr *cntlr, int32_t current) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->setCurrent == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = RegulatorCntlrIsEnabled(cntlr); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + if (current < cntlr->tree->desc.minOutPutUa || current > cntlr->tree->desc.maxOutPutUa) { + goto EXIT; + } + + ret = cntlr->ops->setCurrent(cntlr, current); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; + + EXIT: + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; +} + +int32_t RegulatorCntlrGetCurrent(struct RegulatorCntlr *cntlr, int32_t *current) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->getCurrent == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = cntlr->ops->getCurrent(cntlr, current); + if (ret != HDF_SUCCESS) { + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; +} + +int32_t RegulatorCntlrSetCurrentRange(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->setCurrentRange == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = RegulatorCntlrIsEnabled(cntlr); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + if (cmin < cntlr->tree->constraint.minOutPutUa || cmax > cntlr->tree->constraint.maxOutPutUa) { + goto EXIT; + } + + ret = cntlr->ops->setVoltageRange(cntlr, cmin, cmax); + if (ret != HDF_SUCCESS) { + goto EXIT; + } + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return HDF_SUCCESS; + + EXIT: + (void)OsalMutexUnlock(&cntlr->mutexLock); + HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); + return HDF_FAILURE; +} + +int32_t RegulatorCntlrGetStatus(struct RegulatorCntlr *cntlr, int32_t *status) +{ + int32_t ret; + + if (cntlr == NULL) { + HDF_LOGE("func:%s cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (cntlr->ops == NULL || cntlr->ops->getStatus == NULL) { + HDF_LOGE("func:%s ops is NULL!", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { + HDF_LOGE("func:%s OsalMutexLock failed!", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = cntlr->ops->getStatus(cntlr, status); + + (void)OsalMutexUnlock(&cntlr->mutexLock); + return ret; +} \ No newline at end of file diff --git a/support/platform/src/regulator_if.c b/support/platform/src/regulator_if.c new file mode 100755 index 000000000..0e8098458 --- /dev/null +++ b/support/platform/src/regulator_if.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#include "regulator_if.h" +#include "devsvc_manager_clnt.h" +#include "hdf_base.h" +#include "securec.h" +#include "regulator_core.h" + +DevHandle RegulatorGet(const char *name) +{ + return (DevHandle)RegulatorCntlrGet(name); +} + +void RegulatorPut(DevHandle handle) +{ + if (handle == NULL) { + return; + } + RegulatorReleasePriv((struct RegulatorCntlr *)handle); + (void)handle; +} + +int32_t RegulatorEnable(DevHandle handle) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrEnable((struct RegulatorCntlr *)handle); +} + +int32_t RegulatorDisable(DevHandle handle, int32_t disableMode) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrDisable((struct RegulatorCntlr *)handle, disableMode); +} + +int32_t RegulatorIsEnabled(DevHandle handle) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrIsEnabled((struct RegulatorCntlr *)handle); +} + +int32_t RegulatorSetVoltage(DevHandle handle, int32_t voltage) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrSetVoltage((struct RegulatorCntlr *)handle, voltage); +} + +int32_t RegulatorGetVoltage(DevHandle handle, int32_t *voltage) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrGetVoltage((struct RegulatorCntlr *)handle, voltage); +} + +int32_t RegulatorSetVoltageRange(DevHandle handle, int32_t vmin, int32_t vmax) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrSetVoltageRange((struct RegulatorCntlr *)handle, vmin, vmax); +} + +int32_t RegulatorSetCurrent(DevHandle handle, int32_t current) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrSetCurrent((struct RegulatorCntlr *)handle, current); +} + +int32_t RegulatorGetCurrent(DevHandle handle, int32_t *current) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrGetCurrent((struct RegulatorCntlr *)handle, current); +} + +int32_t RegulatorSetCurrentRange(DevHandle handle, int32_t cmin, int32_t cmax) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrSetCurrentRange((struct RegulatorCntlr *)handle, cmin, cmax); +} + +int32_t RegulatorGetStatus(DevHandle handle, int32_t *status) +{ + if (handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return RegulatorCntlrGetStatus((struct RegulatorCntlr *)handle, status); +} \ No newline at end of file -- Gitee From 0f622b25b26c9e9528a0d73a18475922af5d039d Mon Sep 17 00:00:00 2001 From: xu <189278427@qq.com> Date: Tue, 2 Nov 2021 17:12:48 +0800 Subject: [PATCH 129/272] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E8=BF=91?= =?UTF-8?q?=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu <189278427@qq.com> --- .../chipset/proximity/proximity_apds9960.c | 23 ++++++++++--------- .../chipset/proximity/proximity_apds9960.h | 2 +- .../proximity/sensor_proximity_driver.h | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.c b/model/sensor/driver/chipset/proximity/proximity_apds9960.c index d7869fbcf..cace44dd7 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.c +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 189278427@qq.com * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -31,8 +31,6 @@ struct Apds9960DrvData *Apds9960GetDrvData(void) static int32_t ReadApds9960RawData(struct SensorCfgData *data, struct ProximityData *rawData, int64_t *timestamp) { - uint8_t tmp; - uint8_t ldata; OsalTimespec time; (void)memset_s(&time, sizeof(time), 0, sizeof(time)); @@ -45,20 +43,16 @@ static int32_t ReadApds9960RawData(struct SensorCfgData *data, struct ProximityD } *timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; /* unit nanosecond */ - int32_t ret = ReadSensor(&data->busCfg, APDS9960_PROXIMITY_DATA_ADDR, &tmp, sizeof(uint8_t)); + int32_t ret = ReadSensor(&data->busCfg, APDS9960_PROXIMITY_DATA_ADDR, &rawData->stateFlag, sizeof(uint8_t)); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - if (tmp <= APDS9960_PROXIMITY_THRESHOLD) { - rawData->stateFlag = 5; //near state - } else { - rawData->stateFlag = 0; //far state - } return ret; } int32_t ReadApds9960Data(struct SensorCfgData *data) { int32_t ret; + int32_t tmp; struct ProximityData rawData = { 5 }; struct SensorReportEvent event; @@ -72,8 +66,15 @@ int32_t ReadApds9960Data(struct SensorCfgData *data) event.sensorId = SENSOR_TAG_PROXIMITY; event.option = 0; event.mode = SENSOR_WORK_MODE_ON_CHANGE; - event.dataLen = sizeof(rawData); - event.data = (uint8_t *)&rawData; + + if (rawData.stateFlag <= APDS9960_PROXIMITY_THRESHOLD) { + tmp = 5; //far state + } else { + tmp = 0; //near state + } + + event.dataLen = sizeof(tmp); + event.data = (uint8_t *)&tmp; ret = ReportSensorEvent(&event); if (ret != HDF_SUCCESS) { diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.h b/model/sensor/driver/chipset/proximity/proximity_apds9960.h index 080cd7258..6c32197fe 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.h +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 189278427@qq.com * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.h b/model/sensor/driver/proximity/sensor_proximity_driver.h index 0f272de56..0b017903d 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.h +++ b/model/sensor/driver/proximity/sensor_proximity_driver.h @@ -18,7 +18,7 @@ #define PROXIMITY_CHIP_NAME_APDS9960 "apds9960" struct ProximityData { - uint32_t stateFlag; + uint8_t stateFlag; }; struct ProximityOpsCall { -- Gitee From 9c440f1facfdad81fd886fa0afe39ab430e4bd88 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Tue, 2 Nov 2021 17:42:05 +0800 Subject: [PATCH 130/272] Platform dir adjustment Signed-off-by: haizhouyang --- {support/platform => model/storage}/include/mmc/mmc_caps.h | 0 {support/platform => model/storage}/include/mmc/mmc_corex.h | 0 {support/platform => model/storage}/include/mmc/mmc_dispatch.h | 0 {support/platform => model/storage}/include/mmc/mmc_emmc.h | 0 {support/platform => model/storage}/include/mmc/mmc_protocol.h | 0 {support/platform => model/storage}/include/mmc/mmc_sd.h | 0 {support/platform => model/storage}/include/mmc/mmc_sdio.h | 0 {support/platform => model/storage}/src/mmc/emmc_if.c | 0 {support/platform => model/storage}/src/mmc/mmc_core.c | 0 {support/platform => model/storage}/src/mmc/mmc_dispatch.c | 0 {support/platform => model/storage}/src/mmc/mmc_emmc.c | 0 {support/platform => model/storage}/src/mmc/mmc_if.c | 0 {support/platform => model/storage}/src/mmc/mmc_protocol.c | 0 {support/platform => model/storage}/src/mmc/mmc_sdio.c | 0 {support/platform => model/storage}/src/mmc/sdio_if.c | 0 support/platform/include/{ => adc}/adc_core.h | 0 support/platform/include/{ => dma}/dmac_core.h | 0 support/platform/include/{ => fwk}/plat_log.h | 0 support/platform/include/{common => fwk}/platform_core.h | 0 support/platform/include/{common => fwk}/platform_device.h | 0 support/platform/include/{common => fwk}/platform_errno.h | 0 support/platform/include/{common => fwk}/platform_manager.h | 0 support/platform/include/{common => fwk}/platform_queue.h | 0 support/platform/include/{ => i2c}/i2c_core.h | 0 support/platform/include/{ => i2s}/i2s_core.h | 0 support/platform/include/{ => i3c}/i3c_ccc.h | 0 support/platform/include/{ => i3c}/i3c_core.h | 0 support/platform/include/{ => mipi}/mipi_csi_core.h | 0 support/platform/include/{ => mipi}/mipi_csi_dev.h | 0 support/platform/include/{ => mipi}/mipi_dsi_core.h | 0 support/platform/include/{ => pwm}/pwm_core.h | 0 support/platform/include/{ => rtc}/rtc_base.h | 0 support/platform/include/{ => rtc}/rtc_core.h | 0 support/platform/include/{ => spi}/spi_core.h | 0 support/platform/include/{ => uart}/uart_core.h | 0 support/platform/include/{ => watchdog}/watchdog_core.h | 0 support/platform/src/{ => adc}/adc_core.c | 0 support/platform/src/{ => adc}/adc_if.c | 0 support/platform/src/{ => dma}/dmac_core.c | 0 support/platform/src/{common => fwk}/platform_common.c | 0 support/platform/src/{common => fwk}/platform_device.c | 0 support/platform/src/{common => fwk}/platform_manager.c | 0 support/platform/src/{common => fwk}/platform_queue.c | 0 support/platform/src/{ => i2c}/i2c_core.c | 0 support/platform/src/{ => i2c}/i2c_if.c | 0 support/platform/src/{ => i2s}/i2s_core.c | 0 support/platform/src/{ => i2s}/i2s_if.c | 0 support/platform/src/{ => i3c}/i3c_core.c | 0 support/platform/src/{ => i3c}/i3c_if.c | 0 support/platform/src/{ => mipi}/mipi_csi_core.c | 0 support/platform/src/{ => mipi}/mipi_csi_if.c | 0 support/platform/src/{ => mipi}/mipi_dsi_core.c | 0 support/platform/src/{ => mipi}/mipi_dsi_if.c | 0 support/platform/src/{ => pwm}/pwm_core.c | 0 support/platform/src/{ => rtc}/rtc_base.c | 0 support/platform/src/{ => rtc}/rtc_core.c | 0 support/platform/src/{ => rtc}/rtc_if.c | 0 support/platform/src/{ => spi}/spi_core.c | 0 support/platform/src/{ => spi}/spi_if.c | 0 support/platform/src/{ => uart}/uart_core.c | 0 support/platform/src/{ => uart}/uart_if.c | 0 support/platform/src/{ => watchdog}/watchdog_core.c | 0 support/platform/src/{ => watchdog}/watchdog_if.c | 0 test/unittest/platform/virtual/i3c_virtual.c | 2 +- 64 files changed, 1 insertion(+), 1 deletion(-) rename {support/platform => model/storage}/include/mmc/mmc_caps.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_corex.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_dispatch.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_emmc.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_protocol.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_sd.h (100%) rename {support/platform => model/storage}/include/mmc/mmc_sdio.h (100%) rename {support/platform => model/storage}/src/mmc/emmc_if.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_core.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_dispatch.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_emmc.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_if.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_protocol.c (100%) rename {support/platform => model/storage}/src/mmc/mmc_sdio.c (100%) rename {support/platform => model/storage}/src/mmc/sdio_if.c (100%) rename support/platform/include/{ => adc}/adc_core.h (100%) rename support/platform/include/{ => dma}/dmac_core.h (100%) rename support/platform/include/{ => fwk}/plat_log.h (100%) rename support/platform/include/{common => fwk}/platform_core.h (100%) rename support/platform/include/{common => fwk}/platform_device.h (100%) rename support/platform/include/{common => fwk}/platform_errno.h (100%) rename support/platform/include/{common => fwk}/platform_manager.h (100%) rename support/platform/include/{common => fwk}/platform_queue.h (100%) rename support/platform/include/{ => i2c}/i2c_core.h (100%) rename support/platform/include/{ => i2s}/i2s_core.h (100%) rename support/platform/include/{ => i3c}/i3c_ccc.h (100%) mode change 100755 => 100644 rename support/platform/include/{ => i3c}/i3c_core.h (100%) mode change 100755 => 100644 rename support/platform/include/{ => mipi}/mipi_csi_core.h (100%) mode change 100755 => 100644 rename support/platform/include/{ => mipi}/mipi_csi_dev.h (100%) mode change 100755 => 100644 rename support/platform/include/{ => mipi}/mipi_dsi_core.h (100%) rename support/platform/include/{ => pwm}/pwm_core.h (100%) rename support/platform/include/{ => rtc}/rtc_base.h (100%) rename support/platform/include/{ => rtc}/rtc_core.h (100%) rename support/platform/include/{ => spi}/spi_core.h (100%) rename support/platform/include/{ => uart}/uart_core.h (100%) rename support/platform/include/{ => watchdog}/watchdog_core.h (100%) rename support/platform/src/{ => adc}/adc_core.c (100%) rename support/platform/src/{ => adc}/adc_if.c (100%) rename support/platform/src/{ => dma}/dmac_core.c (100%) rename support/platform/src/{common => fwk}/platform_common.c (100%) rename support/platform/src/{common => fwk}/platform_device.c (100%) rename support/platform/src/{common => fwk}/platform_manager.c (100%) rename support/platform/src/{common => fwk}/platform_queue.c (100%) rename support/platform/src/{ => i2c}/i2c_core.c (100%) rename support/platform/src/{ => i2c}/i2c_if.c (100%) rename support/platform/src/{ => i2s}/i2s_core.c (100%) rename support/platform/src/{ => i2s}/i2s_if.c (100%) rename support/platform/src/{ => i3c}/i3c_core.c (100%) rename support/platform/src/{ => i3c}/i3c_if.c (100%) rename support/platform/src/{ => mipi}/mipi_csi_core.c (100%) rename support/platform/src/{ => mipi}/mipi_csi_if.c (100%) rename support/platform/src/{ => mipi}/mipi_dsi_core.c (100%) rename support/platform/src/{ => mipi}/mipi_dsi_if.c (100%) rename support/platform/src/{ => pwm}/pwm_core.c (100%) rename support/platform/src/{ => rtc}/rtc_base.c (100%) rename support/platform/src/{ => rtc}/rtc_core.c (100%) rename support/platform/src/{ => rtc}/rtc_if.c (100%) rename support/platform/src/{ => spi}/spi_core.c (100%) rename support/platform/src/{ => spi}/spi_if.c (100%) rename support/platform/src/{ => uart}/uart_core.c (100%) rename support/platform/src/{ => uart}/uart_if.c (100%) rename support/platform/src/{ => watchdog}/watchdog_core.c (100%) rename support/platform/src/{ => watchdog}/watchdog_if.c (100%) diff --git a/support/platform/include/mmc/mmc_caps.h b/model/storage/include/mmc/mmc_caps.h similarity index 100% rename from support/platform/include/mmc/mmc_caps.h rename to model/storage/include/mmc/mmc_caps.h diff --git a/support/platform/include/mmc/mmc_corex.h b/model/storage/include/mmc/mmc_corex.h similarity index 100% rename from support/platform/include/mmc/mmc_corex.h rename to model/storage/include/mmc/mmc_corex.h diff --git a/support/platform/include/mmc/mmc_dispatch.h b/model/storage/include/mmc/mmc_dispatch.h similarity index 100% rename from support/platform/include/mmc/mmc_dispatch.h rename to model/storage/include/mmc/mmc_dispatch.h diff --git a/support/platform/include/mmc/mmc_emmc.h b/model/storage/include/mmc/mmc_emmc.h similarity index 100% rename from support/platform/include/mmc/mmc_emmc.h rename to model/storage/include/mmc/mmc_emmc.h diff --git a/support/platform/include/mmc/mmc_protocol.h b/model/storage/include/mmc/mmc_protocol.h similarity index 100% rename from support/platform/include/mmc/mmc_protocol.h rename to model/storage/include/mmc/mmc_protocol.h diff --git a/support/platform/include/mmc/mmc_sd.h b/model/storage/include/mmc/mmc_sd.h similarity index 100% rename from support/platform/include/mmc/mmc_sd.h rename to model/storage/include/mmc/mmc_sd.h diff --git a/support/platform/include/mmc/mmc_sdio.h b/model/storage/include/mmc/mmc_sdio.h similarity index 100% rename from support/platform/include/mmc/mmc_sdio.h rename to model/storage/include/mmc/mmc_sdio.h diff --git a/support/platform/src/mmc/emmc_if.c b/model/storage/src/mmc/emmc_if.c similarity index 100% rename from support/platform/src/mmc/emmc_if.c rename to model/storage/src/mmc/emmc_if.c diff --git a/support/platform/src/mmc/mmc_core.c b/model/storage/src/mmc/mmc_core.c similarity index 100% rename from support/platform/src/mmc/mmc_core.c rename to model/storage/src/mmc/mmc_core.c diff --git a/support/platform/src/mmc/mmc_dispatch.c b/model/storage/src/mmc/mmc_dispatch.c similarity index 100% rename from support/platform/src/mmc/mmc_dispatch.c rename to model/storage/src/mmc/mmc_dispatch.c diff --git a/support/platform/src/mmc/mmc_emmc.c b/model/storage/src/mmc/mmc_emmc.c similarity index 100% rename from support/platform/src/mmc/mmc_emmc.c rename to model/storage/src/mmc/mmc_emmc.c diff --git a/support/platform/src/mmc/mmc_if.c b/model/storage/src/mmc/mmc_if.c similarity index 100% rename from support/platform/src/mmc/mmc_if.c rename to model/storage/src/mmc/mmc_if.c diff --git a/support/platform/src/mmc/mmc_protocol.c b/model/storage/src/mmc/mmc_protocol.c similarity index 100% rename from support/platform/src/mmc/mmc_protocol.c rename to model/storage/src/mmc/mmc_protocol.c diff --git a/support/platform/src/mmc/mmc_sdio.c b/model/storage/src/mmc/mmc_sdio.c similarity index 100% rename from support/platform/src/mmc/mmc_sdio.c rename to model/storage/src/mmc/mmc_sdio.c diff --git a/support/platform/src/mmc/sdio_if.c b/model/storage/src/mmc/sdio_if.c similarity index 100% rename from support/platform/src/mmc/sdio_if.c rename to model/storage/src/mmc/sdio_if.c diff --git a/support/platform/include/adc_core.h b/support/platform/include/adc/adc_core.h similarity index 100% rename from support/platform/include/adc_core.h rename to support/platform/include/adc/adc_core.h diff --git a/support/platform/include/dmac_core.h b/support/platform/include/dma/dmac_core.h similarity index 100% rename from support/platform/include/dmac_core.h rename to support/platform/include/dma/dmac_core.h diff --git a/support/platform/include/plat_log.h b/support/platform/include/fwk/plat_log.h similarity index 100% rename from support/platform/include/plat_log.h rename to support/platform/include/fwk/plat_log.h diff --git a/support/platform/include/common/platform_core.h b/support/platform/include/fwk/platform_core.h similarity index 100% rename from support/platform/include/common/platform_core.h rename to support/platform/include/fwk/platform_core.h diff --git a/support/platform/include/common/platform_device.h b/support/platform/include/fwk/platform_device.h similarity index 100% rename from support/platform/include/common/platform_device.h rename to support/platform/include/fwk/platform_device.h diff --git a/support/platform/include/common/platform_errno.h b/support/platform/include/fwk/platform_errno.h similarity index 100% rename from support/platform/include/common/platform_errno.h rename to support/platform/include/fwk/platform_errno.h diff --git a/support/platform/include/common/platform_manager.h b/support/platform/include/fwk/platform_manager.h similarity index 100% rename from support/platform/include/common/platform_manager.h rename to support/platform/include/fwk/platform_manager.h diff --git a/support/platform/include/common/platform_queue.h b/support/platform/include/fwk/platform_queue.h similarity index 100% rename from support/platform/include/common/platform_queue.h rename to support/platform/include/fwk/platform_queue.h diff --git a/support/platform/include/i2c_core.h b/support/platform/include/i2c/i2c_core.h similarity index 100% rename from support/platform/include/i2c_core.h rename to support/platform/include/i2c/i2c_core.h diff --git a/support/platform/include/i2s_core.h b/support/platform/include/i2s/i2s_core.h similarity index 100% rename from support/platform/include/i2s_core.h rename to support/platform/include/i2s/i2s_core.h diff --git a/support/platform/include/i3c_ccc.h b/support/platform/include/i3c/i3c_ccc.h old mode 100755 new mode 100644 similarity index 100% rename from support/platform/include/i3c_ccc.h rename to support/platform/include/i3c/i3c_ccc.h diff --git a/support/platform/include/i3c_core.h b/support/platform/include/i3c/i3c_core.h old mode 100755 new mode 100644 similarity index 100% rename from support/platform/include/i3c_core.h rename to support/platform/include/i3c/i3c_core.h diff --git a/support/platform/include/mipi_csi_core.h b/support/platform/include/mipi/mipi_csi_core.h old mode 100755 new mode 100644 similarity index 100% rename from support/platform/include/mipi_csi_core.h rename to support/platform/include/mipi/mipi_csi_core.h diff --git a/support/platform/include/mipi_csi_dev.h b/support/platform/include/mipi/mipi_csi_dev.h old mode 100755 new mode 100644 similarity index 100% rename from support/platform/include/mipi_csi_dev.h rename to support/platform/include/mipi/mipi_csi_dev.h diff --git a/support/platform/include/mipi_dsi_core.h b/support/platform/include/mipi/mipi_dsi_core.h similarity index 100% rename from support/platform/include/mipi_dsi_core.h rename to support/platform/include/mipi/mipi_dsi_core.h diff --git a/support/platform/include/pwm_core.h b/support/platform/include/pwm/pwm_core.h similarity index 100% rename from support/platform/include/pwm_core.h rename to support/platform/include/pwm/pwm_core.h diff --git a/support/platform/include/rtc_base.h b/support/platform/include/rtc/rtc_base.h similarity index 100% rename from support/platform/include/rtc_base.h rename to support/platform/include/rtc/rtc_base.h diff --git a/support/platform/include/rtc_core.h b/support/platform/include/rtc/rtc_core.h similarity index 100% rename from support/platform/include/rtc_core.h rename to support/platform/include/rtc/rtc_core.h diff --git a/support/platform/include/spi_core.h b/support/platform/include/spi/spi_core.h similarity index 100% rename from support/platform/include/spi_core.h rename to support/platform/include/spi/spi_core.h diff --git a/support/platform/include/uart_core.h b/support/platform/include/uart/uart_core.h similarity index 100% rename from support/platform/include/uart_core.h rename to support/platform/include/uart/uart_core.h diff --git a/support/platform/include/watchdog_core.h b/support/platform/include/watchdog/watchdog_core.h similarity index 100% rename from support/platform/include/watchdog_core.h rename to support/platform/include/watchdog/watchdog_core.h diff --git a/support/platform/src/adc_core.c b/support/platform/src/adc/adc_core.c similarity index 100% rename from support/platform/src/adc_core.c rename to support/platform/src/adc/adc_core.c diff --git a/support/platform/src/adc_if.c b/support/platform/src/adc/adc_if.c similarity index 100% rename from support/platform/src/adc_if.c rename to support/platform/src/adc/adc_if.c diff --git a/support/platform/src/dmac_core.c b/support/platform/src/dma/dmac_core.c similarity index 100% rename from support/platform/src/dmac_core.c rename to support/platform/src/dma/dmac_core.c diff --git a/support/platform/src/common/platform_common.c b/support/platform/src/fwk/platform_common.c similarity index 100% rename from support/platform/src/common/platform_common.c rename to support/platform/src/fwk/platform_common.c diff --git a/support/platform/src/common/platform_device.c b/support/platform/src/fwk/platform_device.c similarity index 100% rename from support/platform/src/common/platform_device.c rename to support/platform/src/fwk/platform_device.c diff --git a/support/platform/src/common/platform_manager.c b/support/platform/src/fwk/platform_manager.c similarity index 100% rename from support/platform/src/common/platform_manager.c rename to support/platform/src/fwk/platform_manager.c diff --git a/support/platform/src/common/platform_queue.c b/support/platform/src/fwk/platform_queue.c similarity index 100% rename from support/platform/src/common/platform_queue.c rename to support/platform/src/fwk/platform_queue.c diff --git a/support/platform/src/i2c_core.c b/support/platform/src/i2c/i2c_core.c similarity index 100% rename from support/platform/src/i2c_core.c rename to support/platform/src/i2c/i2c_core.c diff --git a/support/platform/src/i2c_if.c b/support/platform/src/i2c/i2c_if.c similarity index 100% rename from support/platform/src/i2c_if.c rename to support/platform/src/i2c/i2c_if.c diff --git a/support/platform/src/i2s_core.c b/support/platform/src/i2s/i2s_core.c similarity index 100% rename from support/platform/src/i2s_core.c rename to support/platform/src/i2s/i2s_core.c diff --git a/support/platform/src/i2s_if.c b/support/platform/src/i2s/i2s_if.c similarity index 100% rename from support/platform/src/i2s_if.c rename to support/platform/src/i2s/i2s_if.c diff --git a/support/platform/src/i3c_core.c b/support/platform/src/i3c/i3c_core.c similarity index 100% rename from support/platform/src/i3c_core.c rename to support/platform/src/i3c/i3c_core.c diff --git a/support/platform/src/i3c_if.c b/support/platform/src/i3c/i3c_if.c similarity index 100% rename from support/platform/src/i3c_if.c rename to support/platform/src/i3c/i3c_if.c diff --git a/support/platform/src/mipi_csi_core.c b/support/platform/src/mipi/mipi_csi_core.c similarity index 100% rename from support/platform/src/mipi_csi_core.c rename to support/platform/src/mipi/mipi_csi_core.c diff --git a/support/platform/src/mipi_csi_if.c b/support/platform/src/mipi/mipi_csi_if.c similarity index 100% rename from support/platform/src/mipi_csi_if.c rename to support/platform/src/mipi/mipi_csi_if.c diff --git a/support/platform/src/mipi_dsi_core.c b/support/platform/src/mipi/mipi_dsi_core.c similarity index 100% rename from support/platform/src/mipi_dsi_core.c rename to support/platform/src/mipi/mipi_dsi_core.c diff --git a/support/platform/src/mipi_dsi_if.c b/support/platform/src/mipi/mipi_dsi_if.c similarity index 100% rename from support/platform/src/mipi_dsi_if.c rename to support/platform/src/mipi/mipi_dsi_if.c diff --git a/support/platform/src/pwm_core.c b/support/platform/src/pwm/pwm_core.c similarity index 100% rename from support/platform/src/pwm_core.c rename to support/platform/src/pwm/pwm_core.c diff --git a/support/platform/src/rtc_base.c b/support/platform/src/rtc/rtc_base.c similarity index 100% rename from support/platform/src/rtc_base.c rename to support/platform/src/rtc/rtc_base.c diff --git a/support/platform/src/rtc_core.c b/support/platform/src/rtc/rtc_core.c similarity index 100% rename from support/platform/src/rtc_core.c rename to support/platform/src/rtc/rtc_core.c diff --git a/support/platform/src/rtc_if.c b/support/platform/src/rtc/rtc_if.c similarity index 100% rename from support/platform/src/rtc_if.c rename to support/platform/src/rtc/rtc_if.c diff --git a/support/platform/src/spi_core.c b/support/platform/src/spi/spi_core.c similarity index 100% rename from support/platform/src/spi_core.c rename to support/platform/src/spi/spi_core.c diff --git a/support/platform/src/spi_if.c b/support/platform/src/spi/spi_if.c similarity index 100% rename from support/platform/src/spi_if.c rename to support/platform/src/spi/spi_if.c diff --git a/support/platform/src/uart_core.c b/support/platform/src/uart/uart_core.c similarity index 100% rename from support/platform/src/uart_core.c rename to support/platform/src/uart/uart_core.c diff --git a/support/platform/src/uart_if.c b/support/platform/src/uart/uart_if.c similarity index 100% rename from support/platform/src/uart_if.c rename to support/platform/src/uart/uart_if.c diff --git a/support/platform/src/watchdog_core.c b/support/platform/src/watchdog/watchdog_core.c similarity index 100% rename from support/platform/src/watchdog_core.c rename to support/platform/src/watchdog/watchdog_core.c diff --git a/support/platform/src/watchdog_if.c b/support/platform/src/watchdog/watchdog_if.c similarity index 100% rename from support/platform/src/watchdog_if.c rename to support/platform/src/watchdog/watchdog_if.c diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c index b6c7a2fe5..eae897f9b 100644 --- a/test/unittest/platform/virtual/i3c_virtual.c +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -6,7 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "i3c_core.h" +#include "i3c/i3c_core.h" #include "device_resource_if.h" #include "hdf_device_desc.h" #include "hdf_log.h" -- Gitee From 725bd763d7440e6c3735c8388cd7b21191b7099f Mon Sep 17 00:00:00 2001 From: xu <189278427@qq.com> Date: Tue, 2 Nov 2021 20:09:45 +0800 Subject: [PATCH 131/272] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E8=BF=91?= =?UTF-8?q?=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu <189278427@qq.com> --- model/sensor/driver/chipset/proximity/proximity_apds9960.c | 2 +- model/sensor/driver/chipset/proximity/proximity_apds9960.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.c b/model/sensor/driver/chipset/proximity/proximity_apds9960.c index cace44dd7..955e4024e 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.c +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 189278427@qq.com + * Copyright (c) 2021 xu * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.h b/model/sensor/driver/chipset/proximity/proximity_apds9960.h index 6c32197fe..d1c1eece5 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.h +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 189278427@qq.com + * Copyright (c) 2021 xu * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. -- Gitee From 626d22edc5ec9b9f19635a3266981040b79e3935 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Tue, 2 Nov 2021 13:02:21 +0000 Subject: [PATCH 132/272] code check Signed-off-by: vb6174 --- model/audio/common/src/audio_dma_base.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/model/audio/common/src/audio_dma_base.c b/model/audio/common/src/audio_dma_base.c index c0a06174e..a1e77af48 100644 --- a/model/audio/common/src/audio_dma_base.c +++ b/model/audio/common/src/audio_dma_base.c @@ -1,3 +1,10 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ #include "audio_platform_if.h" int32_t AudioDmaBufAlloc(struct PlatformData *data, enum AudioStreamType streamType) -- Gitee From 22658d6d33c7d1f6f28eb50b889f62d2390ac4c7 Mon Sep 17 00:00:00 2001 From: xu <189278427@qq.com> Date: Wed, 3 Nov 2021 09:59:04 +0800 Subject: [PATCH 133/272] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E8=BF=91?= =?UTF-8?q?=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu <189278427@qq.com> --- OAT.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/OAT.xml b/OAT.xml index 3b80ed211..71a26d531 100644 --- a/OAT.xml +++ b/OAT.xml @@ -61,6 +61,7 @@ Note:If the text contains special characters, please escape them according to th + -- Gitee From f171be996081a6a41c92d658b96853b7ceeab3d2 Mon Sep 17 00:00:00 2001 From: zhang Date: Wed, 3 Nov 2021 10:23:45 +0800 Subject: [PATCH 134/272] modify walk function for HdfDeviceDestruct Signed-off-by: zhang --- core/host/src/hdf_device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index d61036007..487ada2f9 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -39,7 +39,8 @@ void HdfDeviceConstruct(struct HdfDevice *device) void HdfDeviceDestruct(struct HdfDevice *device) { struct HdfDeviceNode *devNode = NULL; - DLIST_FOR_EACH_ENTRY(devNode, &device->devNodes, struct HdfDeviceNode, entry) { + struct HdfDeviceNode *devTmp = NULL; + DLIST_FOR_EACH_ENTRY_SAFE(devNode, devTmp, &device->devNodes, struct HdfDeviceNode, entry) { HdfDeviceNodeDelete(devNode); } DListHeadInit(&device->devNodes); -- Gitee From 7699e0f9941c08cc3bcbf29fefd0e69c69c210a1 Mon Sep 17 00:00:00 2001 From: zhang Date: Wed, 3 Nov 2021 10:30:22 +0800 Subject: [PATCH 135/272] modify walk function for HdfDeviceDestruct Signed-off-by: zhang --- core/host/src/hdf_device.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index 487ada2f9..451faf992 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -39,8 +39,8 @@ void HdfDeviceConstruct(struct HdfDevice *device) void HdfDeviceDestruct(struct HdfDevice *device) { struct HdfDeviceNode *devNode = NULL; - struct HdfDeviceNode *devTmp = NULL; - DLIST_FOR_EACH_ENTRY_SAFE(devNode, devTmp, &device->devNodes, struct HdfDeviceNode, entry) { + struct HdfDeviceNode *devNodeTmp = NULL; + DLIST_FOR_EACH_ENTRY_SAFE(devNode, devNodeTmp, &device->devNodes, struct HdfDeviceNode, entry) { HdfDeviceNodeDelete(devNode); } DListHeadInit(&device->devNodes); -- Gitee From aaf4acfcdb5e8ef5101a6c51298030105a18e3b6 Mon Sep 17 00:00:00 2001 From: xu <189278427@qq.com> Date: Wed, 3 Nov 2021 14:24:41 +0800 Subject: [PATCH 136/272] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E8=BF=91?= =?UTF-8?q?=E5=85=89=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xu <189278427@qq.com> --- model/sensor/driver/proximity/sensor_proximity_driver.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.h b/model/sensor/driver/proximity/sensor_proximity_driver.h index 0b017903d..7a58f4264 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.h +++ b/model/sensor/driver/proximity/sensor_proximity_driver.h @@ -14,9 +14,6 @@ #include "sensor_config_parser.h" #include "sensor_platform_if.h" -#define PROXIMITY_DEFAULT_SAMPLING_200_MS 200000000 -#define PROXIMITY_CHIP_NAME_APDS9960 "apds9960" - struct ProximityData { uint8_t stateFlag; }; -- Gitee From 54f5dac39ed6e51c49ce46a74f2844f7bdaf66e1 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Wed, 3 Nov 2021 07:10:49 +0000 Subject: [PATCH 137/272] code check Signed-off-by: vb6174 --- model/audio/common/include/audio_accessory_base.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/audio/common/include/audio_accessory_base.h b/model/audio/common/include/audio_accessory_base.h index e52b5b5b0..76ccc892c 100755 --- a/model/audio/common/include/audio_accessory_base.h +++ b/model/audio/common/include/audio_accessory_base.h @@ -8,12 +8,12 @@ #ifndef AUDIO_ACCESSORY_BASE_H #define AUDIO_ACCESSORY_BASE_H +#include "audio_control.h" #include "audio_core.h" #include "audio_host.h" -#include "audio_sapm.h" #include "audio_parse.h" -#include "audio_control.h" #include "audio_platform_base.h" +#include "audio_sapm.h" #ifdef __cplusplus #if __cplusplus -- Gitee From af3d1bf1ad5a69c515768846a798dac884fb086a Mon Sep 17 00:00:00 2001 From: kangweijie Date: Wed, 3 Nov 2021 07:55:36 +0000 Subject: [PATCH 138/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/core/module/wifi_base.c | 15 ++++++++------- .../platform/src/message/message_dispatcher.c | 10 ++++------ .../wifi/platform/src/message/message_router.c | 2 +- .../wifi/platform/src/message/nodes/local_node.c | 5 +++-- .../wifi/unittest/message/hdf_queue_test.c | 13 ++++++------- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index e3510e686..bfa6e612f 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -768,11 +768,12 @@ static int32_t WifiCmdSendAction(const RequestContext *context, struct HdfSBuf * static int32_t WifiCmdGetNetworkInfo(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { - (void)context; - (void)reqData; - uint32_t netDevNum = 1; + uint32_t netDevNum; char *defaultIfName = "wlan0"; uint8_t supportMode[PROTOCOL_80211_IFTYPE_NUM] = {0}; + netDevNum = 1; + (void)context; + (void)reqData; if (!HdfSbufWriteUint32(rspData, netDevNum)) { HDF_LOGE("%s: %s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); @@ -808,8 +809,8 @@ static int32_t WifiCmdIsSupportCombo(const RequestContext *context, struct HdfSB static int32_t WifiCmdGetSupportCombo(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { - (void)context; uint8_t isComboValid; + (void)context; if (reqData == NULL || rspData == NULL) { return HDF_ERR_INVALID_PARAM; } @@ -1265,13 +1266,13 @@ static uint32_t GetIftype(struct NetDevice *netdev, uint8_t *iftype) #define MAX_NETDEVICE_COUNT 20 static int32_t WifiCmdGetNetDevInfo(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) { - (void)context; - (void)reqData; uint32_t i; uint32_t netdevNum; uint8_t iftype; struct NetDevice *netDev = NULL; - + (void)context; + (void)reqData; + netdevNum = NetDevGetRegisterCount(); if (!HdfSbufWriteUint32(rspData, netdevNum)) { HDF_LOGE("%s: %s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index c3bbc95b3..65e358c8e 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -281,7 +281,7 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) HDF_STATUS status; ErrorCode errCode; LocalMessageDispatcher *localDispatcher = NULL; - + struct OsalThreadParam config; if (dispatcher == NULL) { return ME_ERROR_NULL_PTR; } @@ -298,11 +298,9 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) break; } dispatcher->status = ME_STATUS_STARTTING; - struct OsalThreadParam config = { - .name = "MessageDispatcher", - .priority = OSAL_THREAD_PRI_DEFAULT, - .stackSize = 0x2000, - }; + config .name = "MessageDispatcher"; + config.priority = OSAL_THREAD_PRI_DEFAULT; + config .stackSize = 0x2000; localDispatcher = (LocalMessageDispatcher *)dispatcher; status = OsalThreadCreate(&localDispatcher->dispatcherThread, RunDispatcher, localDispatcher); if (status != HDF_SUCCESS) { diff --git a/model/network/wifi/platform/src/message/message_router.c b/model/network/wifi/platform/src/message/message_router.c index 0c0b6e9c4..17e295e1c 100644 --- a/model/network/wifi/platform/src/message/message_router.c +++ b/model/network/wifi/platform/src/message/message_router.c @@ -682,9 +682,9 @@ static ErrorCode DoShutdownMessageRouter(void) ErrorCode ShutdownMessageRouter() { - HDF_LOGW("%s:Shutdown router...", __func__); HDF_STATUS status; ErrorCode errCode; + HDF_LOGW("%s:Shutdown router...", __func__); status = OsalMutexTimedLock(&g_routerMutex, HDF_WAIT_FOREVER); if (status != HDF_SUCCESS) { HDF_LOGE("Unable to get lock!status=%d", status); diff --git a/model/network/wifi/platform/src/message/nodes/local_node.c b/model/network/wifi/platform/src/message/nodes/local_node.c index 506d9f890..24b856024 100644 --- a/model/network/wifi/platform/src/message/nodes/local_node.c +++ b/model/network/wifi/platform/src/message/nodes/local_node.c @@ -34,6 +34,7 @@ static void HandleRequestMessage(const RemoteService *service, MessageContext *c LocalNodeService *localNodeService = NULL; localNodeService = (LocalNodeService *)service; struct MessageDef messageDef = { NULL, 0 }; + if (context == NULL || service == NULL) { HDF_LOGE("%s:input is NULL", __func__); return; @@ -50,8 +51,8 @@ static void HandleRequestMessage(const RemoteService *service, MessageContext *c static void HandleResponseMessage(const RemoteService *service, MessageContext *context) { - (void)service; HDF_STATUS status; + (void)service; if (context->requestType < MESSAGE_RSP_START) { return; } @@ -135,8 +136,8 @@ static void DestroyLocalNodeRemoteService(RemoteService *service) RemoteService *CreateLocalNodeService(MessageNode *node, MessageDispatcher *dispatcher, struct ServiceDef *mapper) { LocalNodeService *service = NULL; - (void)node; ErrorCode errCode; + (void)node; if (mapper == NULL) { return NULL; } diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c index feee6d0e8..a22d5f450 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c @@ -136,19 +136,18 @@ int32_t MessageQueueTest003(void) void *p = NULL; PriorityQueue *queue = NULL; int32_t status; + struct OsalThreadParam config; + OSAL_DECLARE_THREAD(pushThread); queue = CreatePriorityQueue(TEST_QUEUE_SIZE, NO_PRIORITY); if (queue == NULL) { HDF_LOGE("%s:Create queue failed!", __func__); return -1; } - OSAL_DECLARE_THREAD(pushThread); + do { - struct OsalThreadParam config = { - .name = "PushQueueWithDelay", - .priority = OSAL_THREAD_PRI_DEFAULT, - .stackSize = 0x1000, - }; - + config.name = "PushQueueWithDelay"; + config .priority = OSAL_THREAD_PRI_DEFAULT; + config.stackSize = 0x1000; status = OsalThreadCreate(&pushThread, RunPushQueue, queue); if (status != HDF_SUCCESS) { HDF_LOGE("%s:OsalThreadCreate failed!status=%d", __func__, status); -- Gitee From 053109b70beb8709263e7c58952f88e75dc232db Mon Sep 17 00:00:00 2001 From: kangweijie Date: Wed, 3 Nov 2021 08:03:27 +0000 Subject: [PATCH 139/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/platform/src/message/message_dispatcher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index 65e358c8e..8f8a70337 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -298,7 +298,7 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) break; } dispatcher->status = ME_STATUS_STARTTING; - config .name = "MessageDispatcher"; + config .name = "MessageDispatcher"; config.priority = OSAL_THREAD_PRI_DEFAULT; config .stackSize = 0x2000; localDispatcher = (LocalMessageDispatcher *)dispatcher; -- Gitee From c753af0c5edf0b7435120585db7ec0b374679a59 Mon Sep 17 00:00:00 2001 From: kangweijie Date: Wed, 3 Nov 2021 08:35:43 +0000 Subject: [PATCH 140/272] Description:C90 warning clean Feature or Bugfix:Feature Binary Source: No Signed-off-by: kangweijie --- model/network/wifi/platform/src/message/message_dispatcher.c | 4 ++-- .../model/network/wifi/unittest/message/hdf_queue_test.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/model/network/wifi/platform/src/message/message_dispatcher.c b/model/network/wifi/platform/src/message/message_dispatcher.c index 8f8a70337..9231270de 100644 --- a/model/network/wifi/platform/src/message/message_dispatcher.c +++ b/model/network/wifi/platform/src/message/message_dispatcher.c @@ -298,9 +298,9 @@ static ErrorCode StartDispatcher(MessageDispatcher *dispatcher) break; } dispatcher->status = ME_STATUS_STARTTING; - config .name = "MessageDispatcher"; + config.name = "MessageDispatcher"; config.priority = OSAL_THREAD_PRI_DEFAULT; - config .stackSize = 0x2000; + config.stackSize = 0x2000; localDispatcher = (LocalMessageDispatcher *)dispatcher; status = OsalThreadCreate(&localDispatcher->dispatcherThread, RunDispatcher, localDispatcher); if (status != HDF_SUCCESS) { diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c index a22d5f450..af57a8ed1 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_queue_test.c @@ -146,7 +146,7 @@ int32_t MessageQueueTest003(void) do { config.name = "PushQueueWithDelay"; - config .priority = OSAL_THREAD_PRI_DEFAULT; + config.priority = OSAL_THREAD_PRI_DEFAULT; config.stackSize = 0x1000; status = OsalThreadCreate(&pushThread, RunPushQueue, queue); if (status != HDF_SUCCESS) { -- Gitee From 82c6de98d0d574433bb02b13a20da035069a51f3 Mon Sep 17 00:00:00 2001 From: yafeng_wang Date: Thu, 4 Nov 2021 20:21:18 +0800 Subject: [PATCH 141/272] delete some useless codes Signed-off-by: yafeng_wang --- model/storage/include/mtd/mtd_core.h | 2 +- .../platform/test/unittest/common/hdf_i3c_test.cpp | 2 -- .../platform/test/unittest/common/hdf_spi_test.cpp | 12 ------------ 3 files changed, 1 insertion(+), 15 deletions(-) diff --git a/model/storage/include/mtd/mtd_core.h b/model/storage/include/mtd/mtd_core.h index 0e449b70f..1e8fd726c 100644 --- a/model/storage/include/mtd/mtd_core.h +++ b/model/storage/include/mtd/mtd_core.h @@ -18,7 +18,7 @@ #define MTD_FLASH_ID_LEN_MAX 8 #define MTD_DEVICE_NUM_MAX 3 -// #define MTD_DEBUG /* open this macro for debug */ +// #define MTD_DEBUG /* open this macro for debug struct MtdDevice; struct MtdDeviceMethod; diff --git a/support/platform/test/unittest/common/hdf_i3c_test.cpp b/support/platform/test/unittest/common/hdf_i3c_test.cpp index 095c0bdd7..ff340826f 100644 --- a/support/platform/test/unittest/common/hdf_i3c_test.cpp +++ b/support/platform/test/unittest/common/hdf_i3c_test.cpp @@ -29,7 +29,6 @@ public: void HdfI3cTest::SetUpTestCase() { - int32_t ret; struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_SETUP_ALL, -1}; HdfTestOpenService(); HdfTestSendMsgToService(&msg); @@ -37,7 +36,6 @@ void HdfI3cTest::SetUpTestCase() void HdfI3cTest::TearDownTestCase() { - int32_t ret; struct HdfTestMsg msg = {TEST_PAL_I3C_TYPE, I3C_TEST_CMD_TEARDOWN_ALL, -1}; HdfTestSendMsgToService(&msg); HdfTestCloseService(); diff --git a/support/platform/test/unittest/common/hdf_spi_test.cpp b/support/platform/test/unittest/common/hdf_spi_test.cpp index 050d053ae..8bc75fefa 100644 --- a/support/platform/test/unittest/common/hdf_spi_test.cpp +++ b/support/platform/test/unittest/common/hdf_spi_test.cpp @@ -27,18 +27,6 @@ enum HdfTestCaseCmd { SPI_PERFORMANCE_TEST, }; -/*enum HdfTestCaseCmd { - SPI_SET_CFG_TEST = 0, - SPI_TRANSFER_TEST, - SPI_WRITE_TEST, - SPI_READ_TEST, - SPI_DMA_TEST, - SPI_INTERRUPT_TEST, - SPI_RELIABILITY_TEST, - SPI_PERFORMANCE_TEST, -}; -*/ - class HdfLiteSpiTest : public testing::Test { public: static void SetUpTestCase(); -- Gitee From e5989f0af85f055686407b5bed94987d34fc69df Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Fri, 5 Nov 2021 15:59:02 +0800 Subject: [PATCH 142/272] =?UTF-8?q?hdmi=5Finfofrme.c=20=E9=A9=BC=E5=B3=B0?= =?UTF-8?q?=E5=91=8A=E8=AD=A6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/src/hdmi/hdmi_infoframe.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 1bc021888..fef6b3071 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -568,7 +568,7 @@ int32_t HdmiAudioInfoframeSend(struct HdmiInfoframe *frame, bool enable) return HdmiInfoframeSend(frame, &infoframe); } -static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAttr *HdrAttr) +static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAttr *hdrAttr) { if (memset_s(drm, sizeof(struct HdmiDrmInfoframe), 0, sizeof(struct HdmiDrmInfoframe)) != EOK) { HDF_LOGE("fill vsif, memset_s fail."); @@ -577,9 +577,9 @@ static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAtt drm->type = HDMI_INFOFRAME_PACKET_TYPE_DRM; drm->len = HDMI_DRM_INFOFRAME_LEN; drm->verNum = HDMI_DRM_INFOFRAME_VERSION; - drm->eotfType = HdrAttr->eotfType; - drm->metadataType = HdrAttr->metadataType; - drm->des = HdrAttr->descriptor; + drm->eotfType = hdrAttr->eotfType; + drm->metadataType = hdrAttr->metadataType; + drm->des = hdrAttr->descriptor; } int32_t HdmiDrmInfoframeSend(struct HdmiInfoframe *frame, bool enable) -- Gitee From 544176a8350381b68d74b928c201698c6ba40386 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Fri, 5 Nov 2021 18:21:07 +0800 Subject: [PATCH 143/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0Audio=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- include/audio/audio_codec_if.h | 3 +- include/audio/audio_dai_if.h | 2 +- .../common/include/audio_accessory_base.h | 1 + model/audio/common/include/audio_codec_base.h | 5 - model/audio/common/include/audio_dsp_base.h | 9 - model/audio/common/src/audio_accessory_base.c | 26 + model/audio/common/src/audio_codec_base.c | 43 -- model/audio/common/src/audio_dsp_base.c | 316 +--------- model/audio/common/src/audio_platform_base.c | 31 +- .../common/audio_accessory_base_test.cpp | 100 ++++ .../unittest/common/audio_codec_base_test.cpp | 71 +++ .../test/unittest/common/audio_common_test.h | 76 +++ .../unittest/common/audio_dai_base_test.cpp | 65 ++ .../unittest/common/audio_dma_base_test.cpp | 101 ++++ .../unittest/common/audio_dsp_base_test.cpp} | 21 +- .../common/audio_platform_base_test.cpp | 167 ++++++ model/audio/core/include/audio_control.h | 11 +- model/audio/core/include/audio_core.h | 42 +- model/audio/core/include/audio_host.h | 12 - model/audio/core/include/audio_parse.h | 1 + model/audio/core/src/audio_core.c | 103 ++-- model/audio/core/src/audio_host.c | 4 +- model/audio/core/src/audio_parse.c | 2 + .../test/unittest/common/audio_common_test.h | 83 +-- .../test/unittest/common/audio_core_test.cpp | 154 +++-- .../test/unittest/common/audio_host_test.cpp | 8 +- .../test/unittest/common/audio_parse_test.cpp | 10 +- .../dispatch/include/audio_control_dispatch.h | 13 +- .../dispatch/include/audio_stream_dispatch.h | 54 +- .../dispatch/src/audio_control_dispatch.c | 2 +- .../dispatch/src/audio_stream_dispatch.c | 524 +++++++++++------ model/audio/sapm/include/audio_sapm.h | 40 -- model/audio/sapm/src/audio_sapm.c | 21 +- .../test/unittest/common/audio_sapm_test.cpp | 51 +- .../audio/include/audio_accessory_base_test.h | 38 ++ .../audio_codec_base_test.h} | 37 +- .../model/audio/include/audio_core_test.h | 55 +- .../model/audio/include/audio_dai_base_test.h | 31 + .../model/audio/include/audio_dma_base_test.h | 37 ++ ..._dispatch_test.h => audio_dsp_base_test.h} | 18 +- .../model/audio/include/audio_host_test.h | 4 +- .../model/audio/include/audio_parse_test.h | 3 +- .../audio/include/audio_platform_base_test.h | 48 ++ .../model/audio/include/audio_sapm_test.h | 16 +- .../model/audio/include/hdf_audio_test.h | 149 +++-- .../audio/src/audio_accessory_base_test.c | 161 +++++ .../model/audio/src/audio_codec_base_test.c | 94 +++ .../model/audio/src/audio_core_test.c | 554 +++++++++++------- .../model/audio/src/audio_dai_base_test.c | 68 +++ .../model/audio/src/audio_dma_base_test.c | 169 ++++++ .../model/audio/src/audio_dsp_base_test.c | 60 ++ .../model/audio/src/audio_host_test.c | 47 +- .../model/audio/src/audio_parse_test.c | 36 +- .../audio/src/audio_platform_base_test.c | 403 +++++++++++++ .../model/audio/src/audio_sapm_test.c | 100 +++- .../unittest/model/audio/src/hdf_audio_test.c | 149 +++-- 56 files changed, 3211 insertions(+), 1238 deletions(-) create mode 100644 model/audio/common/test/unittest/common/audio_accessory_base_test.cpp create mode 100644 model/audio/common/test/unittest/common/audio_codec_base_test.cpp create mode 100644 model/audio/common/test/unittest/common/audio_common_test.h create mode 100644 model/audio/common/test/unittest/common/audio_dai_base_test.cpp create mode 100644 model/audio/common/test/unittest/common/audio_dma_base_test.cpp rename model/audio/{dispatch/test/unittest/common/audio_stream_dispatch_test.cpp => common/test/unittest/common/audio_dsp_base_test.cpp} (53%) mode change 100755 => 100644 create mode 100644 model/audio/common/test/unittest/common/audio_platform_base_test.cpp create mode 100644 test/unittest/model/audio/include/audio_accessory_base_test.h rename test/unittest/model/audio/{src/audio_stream_dispatch_test.c => include/audio_codec_base_test.h} (30%) mode change 100755 => 100644 create mode 100644 test/unittest/model/audio/include/audio_dai_base_test.h create mode 100644 test/unittest/model/audio/include/audio_dma_base_test.h rename test/unittest/model/audio/include/{audio_stream_dispatch_test.h => audio_dsp_base_test.h} (61%) mode change 100755 => 100644 create mode 100644 test/unittest/model/audio/include/audio_platform_base_test.h create mode 100644 test/unittest/model/audio/src/audio_accessory_base_test.c create mode 100644 test/unittest/model/audio/src/audio_codec_base_test.c create mode 100644 test/unittest/model/audio/src/audio_dai_base_test.c create mode 100644 test/unittest/model/audio/src/audio_dma_base_test.c create mode 100644 test/unittest/model/audio/src/audio_dsp_base_test.c create mode 100644 test/unittest/model/audio/src/audio_platform_base_test.c diff --git a/include/audio/audio_codec_if.h b/include/audio/audio_codec_if.h index d18d99da6..3f6aee0ca 100755 --- a/include/audio/audio_codec_if.h +++ b/include/audio/audio_codec_if.h @@ -56,8 +56,7 @@ struct CodecData { struct CodecHost { struct IDeviceIoService service; struct HdfDeviceObject *device; - unsigned long priv; - unsigned long aiaoPriv; + void *priv; }; enum AudioRegParams { diff --git a/include/audio/audio_dai_if.h b/include/audio/audio_dai_if.h index 603e938a5..a000c8a45 100755 --- a/include/audio/audio_dai_if.h +++ b/include/audio/audio_dai_if.h @@ -45,7 +45,7 @@ struct DaiData { struct AudioKcontrol *controls; int numControls; bool daiInitFlag; - uint32_t regDaiBase; + unsigned long regVirtualAddr; struct AudioRegCfgData *regConfig; struct AudioRegCfgGroupNode **regCfgGroup; struct OsalMutex mutex; diff --git a/model/audio/common/include/audio_accessory_base.h b/model/audio/common/include/audio_accessory_base.h index 76ccc892c..2ee01ed99 100755 --- a/model/audio/common/include/audio_accessory_base.h +++ b/model/audio/common/include/audio_accessory_base.h @@ -75,6 +75,7 @@ int32_t AccessoryDeviceCfgGet(struct AccessoryData *data, struct AccessoryTransf int32_t AccessoryDeviceCtrlRegInit(void); int32_t AccessoryDeviceRegRead(const struct AccessoryDevice *codec, uint32_t reg, uint32_t *value); int32_t AccessoryDeviceRegWrite(const struct AccessoryDevice *codec, uint32_t reg, uint32_t value); +int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *accessoryData); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/include/audio_codec_base.h b/model/audio/common/include/audio_codec_base.h index 712a2b73e..c89ce90ad 100755 --- a/model/audio/common/include/audio_codec_base.h +++ b/model/audio/common/include/audio_codec_base.h @@ -19,17 +19,12 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t CodecDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *value); -int32_t CodecDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value); int32_t CodecGetServiceName(const struct HdfDeviceObject *device, const char **drvCodecName); int32_t CodecGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecData *codecData); int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData); int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl); - -int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *codecData); - #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/common/include/audio_dsp_base.h b/model/audio/common/include/audio_dsp_base.h index 535cffdd0..5cf402345 100644 --- a/model/audio/common/include/audio_dsp_base.h +++ b/model/audio/common/include/audio_dsp_base.h @@ -19,15 +19,6 @@ extern "C" { int32_t DspGetServiceName(const struct HdfDeviceObject *device, const char **drvDspName); int32_t DspGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); -int32_t DspLinkDeviceInit(struct AudioCard *card, const struct DaiDevice *device); -int32_t DspDeviceInit(const struct DspDevice *device); -int32_t DspDeviceReadReg(const struct DspDevice *device, uint8_t *buf, uint32_t len); -int32_t DspDeviceWriteReg(const struct DspDevice *device, uint8_t *buf, uint32_t len); -int32_t DspLinkStartup(const struct AudioCard *card, const struct DaiDevice *device); -int32_t DspLinkHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param); -int32_t DspDecodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); -int32_t DspEncodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); -int32_t DspEqualizerActive(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 0c02a7366..29e74532e 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -399,3 +399,29 @@ int32_t AccessoryDeviceRegWrite(const struct AccessoryDevice *codec, uint32_t re AUDIO_DRIVER_LOG_DEBUG("success"); return HDF_SUCCESS; } + +int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *accessoryData) +{ + if (device == NULL) { + AUDIO_DRIVER_LOG_ERR("param is null!"); + return HDF_FAILURE; + } + + if (accessoryData->regConfig != NULL) { + ADM_LOG_ERR("g_codecData regConfig fail!"); + return HDF_FAILURE; + } + + accessoryData->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(accessoryData->regConfig))); + if (accessoryData->regConfig == NULL) { + ADM_LOG_ERR("malloc AudioRegCfgData fail!"); + return HDF_FAILURE; + } + + if (CodecGetRegConfig(device, accessoryData->regConfig) != HDF_SUCCESS) { + ADM_LOG_ERR("CodecGetRegConfig fail!"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 40626ab28..88f13a742 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -13,23 +13,6 @@ #define HDF_LOG_TAG audio_codec_base -int32_t CodecDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val) -{ - if (val == NULL) { - AUDIO_DRIVER_LOG_ERR("param val is null."); - return HDF_FAILURE; - } - - *val = OSAL_READL((void *)((uintptr_t)(virtualAddress + reg))); - return HDF_SUCCESS; -} - -int32_t CodecDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value) -{ - OSAL_WRITEL(value, (void *)((uintptr_t)(virtualAddress + reg))); - return HDF_SUCCESS; -} - int32_t CodecGetServiceName(const struct HdfDeviceObject *device, const char **drvCodecName) { const struct DeviceResourceNode *node = NULL; @@ -272,29 +255,3 @@ int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aia return HDF_SUCCESS; } - -int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *codecData) -{ - if (device == NULL) { - AUDIO_DRIVER_LOG_ERR("param is null!"); - return HDF_FAILURE; - } - - if (codecData->regConfig != NULL) { - ADM_LOG_ERR("g_codecData regConfig fail!"); - return HDF_FAILURE; - } - - codecData->regConfig = (struct AudioRegCfgData *)OsalMemCalloc(sizeof(*(codecData->regConfig))); - if (codecData->regConfig == NULL) { - ADM_LOG_ERR("malloc AudioRegCfgData fail!"); - return HDF_FAILURE; - } - - if (CodecGetRegConfig(device, codecData->regConfig) != HDF_SUCCESS) { - ADM_LOG_ERR("CodecGetRegConfig fail!"); - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} diff --git a/model/audio/common/src/audio_dsp_base.c b/model/audio/common/src/audio_dsp_base.c index fb472fa87..fde2f9b06 100644 --- a/model/audio/common/src/audio_dsp_base.c +++ b/model/audio/common/src/audio_dsp_base.c @@ -6,290 +6,11 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "audio_accessory_base.h" -#include "audio_dsp_if.h" +#include "audio_dsp_base.h" #include "osal_io.h" -#include "spi_if.h" #include "audio_driver_log.h" -#define DEFAULT_SPEED 2000000 -#define BITS_PER_WORD_EIGHT 8 -#define DSP_CS_NUM 1 -#define DSP_SPI_BUS_NUM 1 - -enum DspI2sFormatRegVal { - I2S_SAMPLE_FORMAT_REG_VAL_MSB_24 = 0x2, /* MSB-justified data up to 24 bits */ - I2S_SAMPLE_FORMAT_REG_VAL_24 = 0x3, /* I2S data up to 24 bits */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_16 = 0x4, /* LSB-justified 16-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_18 = 0x5, /* LSB-justified 18-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_20 = 0x6, /* LSB-justified 20-bit data */ - I2S_SAMPLE_FORMAT_REG_VAL_LSB_24 = 0x7, /* LSB-justified 24-bit data */ -}; - -struct SpiDevInfo g_devInfo = { - .busNum = DSP_SPI_BUS_NUM, - .csNum = DSP_CS_NUM, -}; - -int32_t DspLinkStartup(const struct AudioCard *card, const struct DaiDevice *device) -{ - (void)card; - (void)device; - return HDF_SUCCESS; -} - -static int32_t DspCfgI2sFrequency(uint32_t rate, uint16_t *frequency) -{ - switch (rate) { - case I2S_SAMPLE_FREQUENCY_8000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_8000; - break; - case I2S_SAMPLE_FREQUENCY_11025: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_11025; - break; - case I2S_SAMPLE_FREQUENCY_12000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_12000; - break; - case I2S_SAMPLE_FREQUENCY_16000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_16000; - break; - case I2S_SAMPLE_FREQUENCY_22050: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_22050; - break; - case I2S_SAMPLE_FREQUENCY_24000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_24000; - break; - case I2S_SAMPLE_FREQUENCY_32000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_32000; - break; - case I2S_SAMPLE_FREQUENCY_44100: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_44100; - break; - case I2S_SAMPLE_FREQUENCY_48000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_48000; - break; - case I2S_SAMPLE_FREQUENCY_64000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_64000; - break; - case I2S_SAMPLE_FREQUENCY_88200: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_88200; - break; - case I2S_SAMPLE_FREQUENCY_96000: - *frequency = I2S_SAMPLE_FREQUENCY_REG_VAL_96000; - break; - default: - AUDIO_DRIVER_LOG_ERR("rate: %d is not support.", rate); - return HDF_ERR_NOT_SUPPORT; - } - return HDF_SUCCESS; -} - -static int32_t DspSetI2sBitWidth(enum AudioFormat format, uint16_t *bitWidth) -{ - switch (format) { - case AUDIO_FORMAT_PCM_8_BIT: - *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; - break; - case AUDIO_FORMAT_PCM_16_BIT: - *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; - break; - case AUDIO_FORMAT_PCM_24_BIT: - *bitWidth = I2S_SAMPLE_FORMAT_REG_VAL_24; - break; - default: - AUDIO_DRIVER_LOG_ERR("format: %d is not support.", format); - return HDF_ERR_NOT_SUPPORT; - } - return HDF_SUCCESS; -} - -static int DspSetI2sFrequency(uint16_t frequencyVal) -{ - return HDF_SUCCESS; -} - -static int DspSetI2sFormat(uint16_t formatVal) -{ - return HDF_SUCCESS; -} - -int32_t DspLinkHwParams(const struct AudioCard *card, const struct AudioPcmHwParams *param) -{ - int ret; - uint16_t frequency, bitWidth; - (void)card; - - AUDIO_DRIVER_LOG_DEBUG("entry."); - if (param == NULL || param->cardServiceName == NULL) { - AUDIO_DRIVER_LOG_ERR("input param is nullptr."); - return HDF_ERR_INVALID_PARAM; - } - ret = DspCfgI2sFrequency(param->rate, &frequency); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("RateToFrequency fail."); - return HDF_ERR_NOT_SUPPORT; - } - ret = DspSetI2sBitWidth(param->format, &bitWidth); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("FormatToBitWidth fail."); - return HDF_ERR_NOT_SUPPORT; - } - ret = DspSetI2sFrequency(frequency); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("SetDspI2sFs fail."); - return HDF_FAILURE; - } - ret = DspSetI2sFormat(bitWidth); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("SetDspI2sFormat fail."); - return HDF_FAILURE; - } - AUDIO_DRIVER_LOG_DEBUG("DspLinkHwParams: channels = %d, rate = %d, periodSize = %d, \ - periodCount = %d, format = %d, cardServiceName = %s \n", - param->channels, param->rate, param->periodSize, - param->periodCount, (uint32_t)param->format, param->cardServiceName); - AUDIO_DRIVER_LOG_DEBUG("success."); - return HDF_SUCCESS; -} - -static int DspPowerEnable(void) -{ - return HDF_SUCCESS; -} - -static int DspGpioPinInit(void) -{ - return HDF_SUCCESS; -} - -static int DspI2cPinInit(void) -{ - return HDF_SUCCESS; -} - -static int DspI2sInit(void) -{ - return HDF_SUCCESS; -} - -static int DspI2cInit(void) -{ - return HDF_SUCCESS; -} - -/* not init dsp gpio */ -static int DspSpiPinInit(void) -{ - return HDF_FAILURE; -} - -int32_t DspDeviceInit(const struct DspDevice *device) -{ - DevHandle devHandle; - struct SpiCfg devCfg = { - .maxSpeedHz = DEFAULT_SPEED, - .mode = SPI_CLK_POLARITY, - .transferMode = SPI_DMA_TRANSFER, - .bitsPerWord = BITS_PER_WORD_EIGHT, - }; - - if (DspPowerEnable() != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DspPowerEnable: return Error!"); - return HDF_FAILURE; - } - - if (DspGpioPinInit() != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DspGpioPinInit: return Error!"); - return HDF_FAILURE; - } - - if (DspI2cPinInit() != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DspI2cPinInit: return Error!"); - return HDF_FAILURE; - } - - if (DspSpiPinInit() == HDF_SUCCESS) { - devHandle = SpiOpen(&g_devInfo); - if (devHandle == NULL) { - AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); - return HDF_FAILURE; - } - - if (SpiSetCfg(devHandle, &devCfg) != HDF_SUCCESS) { - SpiClose(devHandle); - AUDIO_DRIVER_LOG_ERR("DspDeviceCfg: spi failed!"); - return HDF_FAILURE; - } - SpiClose(devHandle); - } else { - AUDIO_DRIVER_LOG_ERR("Dsp Gpio Pin: not init!"); - } - - if (DspI2cInit() != HDF_SUCCESS) { - return HDF_FAILURE; - } - - if (DspI2sInit() != HDF_SUCCESS) { - return HDF_FAILURE; - } - - return HDF_SUCCESS; -} - -int32_t DspDeviceReadReg(const struct DspDevice *device, uint8_t *buf, uint32_t len) -{ - int32_t ret; - - DevHandle devHandle = SpiOpen(&g_devInfo); - if (devHandle == NULL) { - AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); - return HDF_FAILURE; - } - - ret = SpiRead(devHandle, buf, len); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DspDeviceRead: spi failed!"); - SpiClose(devHandle); - return HDF_FAILURE; - } - - SpiClose(devHandle); - - return HDF_SUCCESS; -} - -int32_t DspDeviceWriteReg(const struct DspDevice *device, uint8_t *buf, uint32_t len) -{ - int32_t ret; - - DevHandle devHandle = SpiOpen(&g_devInfo); - if (devHandle == NULL) { - AUDIO_DRIVER_LOG_ERR("DspDeviceOpen: Spi failed!"); - return HDF_FAILURE; - } - - ret = SpiWrite(devHandle, buf, len); - if (ret != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DspDeviceRead: spi failed!"); - SpiClose(devHandle); - return HDF_FAILURE; - } - - SpiClose(devHandle); - - return HDF_SUCCESS; -} - -int32_t DspLinkDeviceInit(struct AudioCard *card, const struct DaiDevice *device) -{ - if (device == NULL || device->devDaiName == NULL) { - AUDIO_DRIVER_LOG_ERR("input para is nullptr."); - return HDF_FAILURE; - } - AUDIO_DRIVER_LOG_DEBUG("dsp Link device name: %s\n", device->devDaiName); - (void)card; - return HDF_SUCCESS; -} +#define HDF_LOG_TAG audio_dsp_base int32_t DspGetServiceName(const struct HdfDeviceObject *device, const char **drvDspName) { @@ -297,7 +18,7 @@ int32_t DspGetServiceName(const struct HdfDeviceObject *device, const char **drv struct DeviceResourceIface *drsOps = NULL; int32_t ret; - if (device == NULL) { + if (device == NULL || drvDspName == NULL) { AUDIO_DRIVER_LOG_ERR("device is NULL."); return HDF_FAILURE; } @@ -328,7 +49,7 @@ int32_t DspGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiN struct DeviceResourceIface *drsOps = NULL; int32_t ret; - if (device == NULL) { + if (device == NULL || drvDaiName == NULL) { AUDIO_DRIVER_LOG_ERR("input para is null pointer."); return HDF_FAILURE; } @@ -352,32 +73,3 @@ int32_t DspGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiN return HDF_SUCCESS; } - - -int32_t DspDecodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) -{ - (void)card; - (void)buf; - (void)device; - AUDIO_DRIVER_LOG_DEBUG("decode run!!!"); - return HDF_SUCCESS; -} - -int32_t DspEncodeAudioStream(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) -{ - (void)card; - (void)buf; - (void)device; - AUDIO_DRIVER_LOG_DEBUG("encode run!!!"); - return HDF_SUCCESS; -} - - -int32_t DspEqualizerActive(const struct AudioCard *card, const uint8_t *buf, const struct DspDevice *device) -{ - (void)card; - (void)buf; - (void)device; - AUDIO_DRIVER_LOG_DEBUG("equalizer run!!!"); - return HDF_SUCCESS; -} diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index ea0e242f2..2289917e8 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -426,7 +426,6 @@ static int32_t MmapWriteData(struct PlatformData *data, char *tmpBuf) if (data->renderBufInfo.trafBufSize > data->renderBufInfo.cirBufSize) { AUDIO_DRIVER_LOG_ERR("transferFrameSize is tool big."); - OsalMemFree(tmpBuf); return HDF_FAILURE; } @@ -435,7 +434,6 @@ static int32_t MmapWriteData(struct PlatformData *data, char *tmpBuf) data->renderBufInfo.trafBufSize); if (ret != EOK) { AUDIO_DRIVER_LOG_ERR("CopyFromUser failed."); - OsalMemFree(tmpBuf); return HDF_FAILURE; } @@ -443,10 +441,9 @@ static int32_t MmapWriteData(struct PlatformData *data, char *tmpBuf) tmpBuf, data->renderBufInfo.trafBufSize); if (ret != 0) { AUDIO_DRIVER_LOG_ERR("memcpy_s failed."); - OsalMemFree(tmpBuf); return HDF_FAILURE; } - + data->renderBufInfo.wptrOffSet = wPtr + data->renderBufInfo.trafBufSize; data->renderBufInfo.wbufOffSet += data->renderBufInfo.trafBufSize; data->renderBufInfo.framesPosition += data->renderBufInfo.trafBufSize / data->pcmInfo.frameSize; @@ -864,7 +861,7 @@ int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) } switch (cmd) { - case AUDIO_DRV_PCM_IOCTRL_RENDER_START: + case AUDIO_DRV_PCM_IOCTL_RENDER_START: if (AudioDmaSubmit(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPending fail."); return HDF_FAILURE; @@ -881,7 +878,7 @@ int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) data->renderBufInfo.runStatus = PCM_START; break; - case AUDIO_DRV_PCM_IOCTRL_RENDER_STOP: + case AUDIO_DRV_PCM_IOCTL_RENDER_STOP: if (AudioDmaPause(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -893,7 +890,7 @@ int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) data->renderBufInfo.runStatus = PCM_STOP; break; - case AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE: + case AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE: if (AudioDmaPause(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -905,7 +902,7 @@ int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) data->renderBufInfo.runStatus = PCM_PAUSE; break; - case AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME: + case AUDIO_DRV_PCM_IOCTL_RENDER_RESUME: if (AudioDmaResume(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -941,7 +938,7 @@ int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) } switch (cmd) { - case AUDIO_DRV_PCM_IOCTRL_CAPTURE_START: + case AUDIO_DRV_PCM_IOCTL_CAPTURE_START: if (AudioDmaSubmit(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPending fail."); return HDF_FAILURE; @@ -957,7 +954,7 @@ int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) data->captureBufInfo.runStatus = PCM_START; break; - case AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP: + case AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP: if (AudioDmaPause(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -968,7 +965,7 @@ int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) } data->captureBufInfo.runStatus = PCM_STOP; break; - case AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE: + case AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE: if (AudioDmaPause(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -980,7 +977,7 @@ int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) data->captureBufInfo.runStatus = PCM_PAUSE; break; - case AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME: + case AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME: if (AudioDmaResume(data) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("DmaPause fail."); return HDF_FAILURE; @@ -1022,11 +1019,6 @@ int32_t AudioHwParams(const struct AudioCard *card, const struct AudioPcmHwParam return HDF_FAILURE; } - if (AudioDmaRequestChannel(platformData) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("Dma Request Channel fail."); - return HDF_FAILURE; - } - if (AudioFramatToBitWidth(param->format, &platformData->pcmInfo.bitWidth) != HDF_SUCCESS) { return HDF_FAILURE; } @@ -1034,6 +1026,11 @@ int32_t AudioHwParams(const struct AudioCard *card, const struct AudioPcmHwParam return HDF_FAILURE; } + if (AudioDmaRequestChannel(platformData) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("Dma Request Channel fail."); + return HDF_FAILURE; + } + if (param->streamType == AUDIO_RENDER_STREAM) { if (AudioSetRenderBufInfo(platformData, param) != HDF_SUCCESS) { return HDF_FAILURE; diff --git a/model/audio/common/test/unittest/common/audio_accessory_base_test.cpp b/model/audio/common/test/unittest/common/audio_accessory_base_test.cpp new file mode 100644 index 000000000..159dd09cd --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_accessory_base_test.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_common_test.h" +#include +#include "hdf_uhdf_test.h" + +using namespace testing::ext; +namespace { +class AudioAccessoryBaseTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void AudioAccessoryBaseTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void AudioAccessoryBaseTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void AudioAccessoryBaseTest::SetUp() +{ +} + +void AudioAccessoryBaseTest::TearDown() +{ +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_I2cReadWrite, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTI2CREADWRITE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_RegBitsRead, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTREGBITSREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_RegBitsUpdate, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTREGBITSUPDATE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DeviceFrequencyParse, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDEVICEFREQUENCYPARSE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DaiParamsUpdate, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDAIPARAMSUPDATE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DeviceCfgGet, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDEVICECFGGET, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DeviceCtrlRegInit, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDEVICECTRLREGINIT, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DeviceRegRead, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDEVICEREGREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_DeviceRegWrite, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDEVICEREGWRITE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioAccessoryBaseTest, AudioAccessoryBaseTest_AccessoryGetConfigInfo, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTAGETCONFIGINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +} diff --git a/model/audio/common/test/unittest/common/audio_codec_base_test.cpp b/model/audio/common/test/unittest/common/audio_codec_base_test.cpp new file mode 100644 index 000000000..406d6d776 --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_codec_base_test.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_common_test.h" +#include +#include "hdf_uhdf_test.h" + +using namespace testing::ext; + +namespace { +class AudioCodecBaseTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void AudioCodecBaseTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void AudioCodecBaseTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void AudioCodecBaseTest::SetUp() +{ +} + +void AudioCodecBaseTest::TearDown() +{ +} + +HWTEST_F(AudioCodecBaseTest, AudioCodecBaseTest_GetServiceName, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTGETSERVICENAME, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCodecBaseTest, AudioCodecBaseTest_GetDaiName, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTGETDAINAME, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCodecBaseTest, AudioCodecBaseTest_GetConfigInfo, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTGETCONFIGINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCodecBaseTest, AudioCodecBaseTest_SetConfigInfo, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTSETCONFIGINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCodecBaseTest, AudioCodecBaseTest_SetCtlFunc, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTSETCTLFUNC, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +} diff --git a/model/audio/common/test/unittest/common/audio_common_test.h b/model/audio/common/test/unittest/common/audio_common_test.h new file mode 100644 index 000000000..26bcd52cc --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_common_test.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_COMMON_TEST_H +#define AUDIO_COMMON_TEST_H + +#include "hdf_types.h" + +const int32_t g_testAudioType = 701; // 701 is TEST_AUDIO_TYPE + +enum { + TESTI2CREADWRITE = 48, + TESTREGBITSREAD, + TESTREGBITSUPDATE, + TESTDEVICEFREQUENCYPARSE, + TESTDAIPARAMSUPDATE, + TESTDEVICECFGGET, + TESTDEVICECTRLREGINIT, + TESTDEVICEREGREAD, + TESTDEVICEREGWRITE, + TESTAGETCONFIGINFO, + + TESTGETSERVICENAME, + TESTGETDAINAME, + TESTGETCONFIGINFO, + TESTSETCONFIGINFO, + TESTSETCTLFUNC, + + TESTDAIDATAFROMCARD, + TESTDAIGETCONFIGINFO, + TESTDAICHECKSAMPLERATE, + TESTDAISETCONFIGINFO, + + TESTDMABUFALLOC, + TESTDMABUFFREE, + TESTDMAREQUESTCHANNEL, + TESTDMACONFIGCHANNEL, + TESTDMAPREP, + TESTDMASUBMIT, + TESTDMAPENDING, + TESTDMAPAUSE, + TESTDMARESUME, + TESTDMAPOINTER, + + TESTDSPGETSERVICENAME, + TESTDSPGETDAINAME, + + TESTDATAFROMCARD, + TESTBYTESTOFRAMES, + TESTDATABIGENDIANCHANGE, + TESTFRAMATTOBITWIDTH, + TESTSETPCMINFO, + TESTSETRENDERBUFINFO, + TESTSETCAPTUREBUFINFO, + TESTPCMWRITE, + TESTPCMREAD, + TESTPCMMMAPWRITE, + TESTPCMMMAPREAD, + TESTRENDEROPEN, + TESTCAPTUREOPEN, + TESTRENDERCLOSE, + TESTPCMPOINTER, + TESTCAPTURECLOSE, + TESTHWPARAMS, + TESTRENDERPREPARE, + TESTCAPTUREPREPARE, + TESTRENDERTRIGGER, + TESTCAPTURETRIGGER, +}; + +#endif /* AUDIO_COMMON_TEST_H */ diff --git a/model/audio/common/test/unittest/common/audio_dai_base_test.cpp b/model/audio/common/test/unittest/common/audio_dai_base_test.cpp new file mode 100644 index 000000000..d52654186 --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_dai_base_test.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_common_test.h" +#include +#include "hdf_uhdf_test.h" + +using namespace testing::ext; + +namespace { +class AudioDaiBaseTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void AudioDaiBaseTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void AudioDaiBaseTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void AudioDaiBaseTest::SetUp() +{ +} + +void AudioDaiBaseTest::TearDown() +{ +} + +HWTEST_F(AudioDaiBaseTest, AudioDaiBaseTest_DataFromCard, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDAIDATAFROMCARD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDaiBaseTest, AudioDaiBaseTest_GetConfigInfo, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDAIGETCONFIGINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDaiBaseTest, AudioDaiBaseTest_CheckSampleRate, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDAICHECKSAMPLERATE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDaiBaseTest, AudioDaiBaseTest_SetConfigInfo, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDAISETCONFIGINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +} diff --git a/model/audio/common/test/unittest/common/audio_dma_base_test.cpp b/model/audio/common/test/unittest/common/audio_dma_base_test.cpp new file mode 100644 index 000000000..1cfb5fc12 --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_dma_base_test.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_common_test.h" +#include +#include "hdf_uhdf_test.h" + +using namespace testing::ext; + +namespace { +class AudioDmaBaseTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void AudioDmaBaseTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void AudioDmaBaseTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void AudioDmaBaseTest::SetUp() +{ +} + +void AudioDmaBaseTest::TearDown() +{ +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaBufAlloc, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMABUFALLOC, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaBufFree, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMABUFFREE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaRequestChannel, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMAREQUESTCHANNEL, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaConfigChannel, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMACONFIGCHANNEL, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaPrep, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMAPREP, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaSubmit, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMASUBMIT, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaPending, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMAPENDING, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaPause, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMAPAUSE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaResume, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMARESUME, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDmaBaseTest, AudioDmaBaseTest_DmaPointer, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDMAPOINTER, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +} diff --git a/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp b/model/audio/common/test/unittest/common/audio_dsp_base_test.cpp old mode 100755 new mode 100644 similarity index 53% rename from model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp rename to model/audio/common/test/unittest/common/audio_dsp_base_test.cpp index 68b415642..253c23b6d --- a/model/audio/dispatch/test/unittest/common/audio_stream_dispatch_test.cpp +++ b/model/audio/common/test/unittest/common/audio_dsp_base_test.cpp @@ -11,8 +11,9 @@ #include "hdf_uhdf_test.h" using namespace testing::ext; + namespace { -class AudioStreamDispatchTest : public testing::Test { +class AudioDspBaseTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); @@ -20,27 +21,33 @@ public: void TearDown(); }; -void AudioStreamDispatchTest::SetUpTestCase() +void AudioDspBaseTest::SetUpTestCase() { HdfTestOpenService(); } -void AudioStreamDispatchTest::TearDownTestCase() +void AudioDspBaseTest::TearDownTestCase() { HdfTestCloseService(); } -void AudioStreamDispatchTest::SetUp() +void AudioDspBaseTest::SetUp() { } -void AudioStreamDispatchTest::TearDown() +void AudioDspBaseTest::TearDown() { } -HWTEST_F(AudioStreamDispatchTest, AudioStreamDispatchTest001, TestSize.Level1) +HWTEST_F(AudioDspBaseTest, AudioDspBaseTest_DspGetServiceName, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDSPGETSERVICENAME, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioDspBaseTest, AudioDspBaseTest_DspGetDaiName, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTSTREAMDISPATCH, -1}; + struct HdfTestMsg msg = {g_testAudioType, TESTDSPGETDAINAME, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } } diff --git a/model/audio/common/test/unittest/common/audio_platform_base_test.cpp b/model/audio/common/test/unittest/common/audio_platform_base_test.cpp new file mode 100644 index 000000000..552423763 --- /dev/null +++ b/model/audio/common/test/unittest/common/audio_platform_base_test.cpp @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_common_test.h" +#include +#include "hdf_uhdf_test.h" + +using namespace testing::ext; + +namespace { +class AudioPlatformBaseTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void AudioPlatformBaseTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void AudioPlatformBaseTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void AudioPlatformBaseTest::SetUp() +{ +} + +void AudioPlatformBaseTest::TearDown() +{ +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_PlatformDataFromCardTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDATAFROMCARD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioBytesToFramesTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTBYTESTOFRAMES, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioDataBigEndianChangeTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTDATABIGENDIANCHANGE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioFramatToBitWidthTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTFRAMATTOBITWIDTH, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioSetPcmInfoTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTSETPCMINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioSetRenderBufInfoTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTSETRENDERBUFINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioSetCaptureBufInfoTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTSETCAPTUREBUFINFO, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioPcmWriteTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTPCMWRITE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioPcmReadTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTPCMREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioPcmMmapWriteTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTPCMMMAPWRITE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioPcmMmapReadTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTPCMMMAPREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioRenderOpenTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTRENDEROPEN, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioCaptureOpenTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTCAPTUREOPEN, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioRenderCloseTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTRENDERCLOSE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioPcmPointerTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTPCMPOINTER, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioCaptureCloseTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTCAPTURECLOSE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioHwParamsTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTHWPARAMS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioRenderPrepareTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTRENDERPREPARE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioCapturePrepareTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTCAPTUREPREPARE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioRenderTriggerTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTRENDERTRIGGER, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioPlatformBaseTest, AudioPlatformBaseTest_AudioCaptureTriggerTest, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TESTCAPTURETRIGGER, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +} diff --git a/model/audio/core/include/audio_control.h b/model/audio/core/include/audio_control.h index fe418c87e..a8fa1034b 100755 --- a/model/audio/core/include/audio_control.h +++ b/model/audio/core/include/audio_control.h @@ -36,11 +36,6 @@ struct AudioCtrlElemValue { uint32_t value[2]; }; -struct AudioKcontrol; -typedef int32_t (*KconfigInfo_t)(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemInfo *elemInfo); -typedef int32_t (*KconfigGet_t)(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); -typedef int32_t (*KconfigSet_t)(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); - /* mixer control */ struct AudioMixerControl { int32_t min; @@ -58,9 +53,9 @@ struct AudioMixerControl { struct AudioKcontrol { const char *name; /* ASCII name of item */ int32_t iface; - KconfigInfo_t Info; - KconfigGet_t Get; - KconfigSet_t Set; + int32_t (*Info)(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemInfo *elemInfo); + int32_t (*Get)(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); + int32_t (*Set)(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); void *privateData; void *pri; unsigned long privateValue; diff --git a/model/audio/core/include/audio_core.h b/model/audio/core/include/audio_core.h index 762e56be1..aba914d87 100755 --- a/model/audio/core/include/audio_core.h +++ b/model/audio/core/include/audio_core.h @@ -23,44 +23,28 @@ extern "C" { #endif #endif /* __cplusplus */ -#define CHANNEL_MAX_NUM 2 -#define CHANNEL_MIN_NUM 1 +int32_t AudioDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *value); +int32_t AudioDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value); -#define AUDIO_DAI_LINK_COMPLETE 1 -#define AUDIO_DAI_LINK_UNCOMPLETE 0 - -enum AudioDeviceType { - AUDIO_DAI_DEVICE, - AUDIO_DSP_DEVICE, - AUDIO_PLATFORM_DEVICE, - AUDIO_CODEC_DEVICE, - AUDIO_ACCESSORY_DEVICE, - AUDIO_DEVICE_BUTT, -}; - -enum PlayStatus { - STREAM_START = 4, - STREAM_STOP, -}; - -/* Dai registration interface */ -int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *data); -/* Platform registration interface */ -int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *data); -/* Codec registration interface */ +int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *platformData); +int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *daiData); +int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData, struct DaiData *DaiData); int32_t AudioRegisterCodec(struct HdfDeviceObject *device, struct CodecData *codecData, struct DaiData *daiData); +int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, + struct AccessoryData *accessoryData, struct DaiData *daiData); + int32_t AudioBindDaiLink(struct AudioCard *audioCard, const struct AudioConfigData *configData); -int32_t AudioSocDeviceRegister(struct HdfDeviceObject *device, void *data, enum AudioDeviceType deviceType); -int32_t AudioSocRegisterDsp(struct HdfDeviceObject *device, struct DaiData *data); -int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, struct AccessoryData *data, struct DaiData *daiData); + int32_t AudioUpdateCodecRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, uint32_t value); int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, const struct AudioMixerControl *mixerControl, uint32_t value); int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, struct AudioMixerControl *mixerControl, uint32_t value); + +struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol); struct CodecDevice *AudioKcontrolGetCodec(const struct AudioKcontrol *kcontrol); struct AccessoryDevice *AudioKcontrolGetAccessory(const struct AudioKcontrol *kcontrol); -struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol); + int32_t AudioAddControls(struct AudioCard *audioCard, const struct AudioKcontrol *controls, int32_t controlMaxNum); struct AudioKcontrol *AudioAddControl(const struct AudioCard *audioCard, const struct AudioKcontrol *ctl); @@ -86,7 +70,7 @@ int32_t AudioCodecGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioC int32_t AudioCodecSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); int32_t AudioAccessoryGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); int32_t AudioAccessorySetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); -int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData, struct DaiData *DaiData); + int32_t AudioCpuDaiSetCtrlOps(const struct AudioKcontrol *kcontrol, const struct AudioCtrlElemValue *elemValue); int32_t AudioCpuDaiGetCtrlOps(const struct AudioKcontrol *kcontrol, struct AudioCtrlElemValue *elemValue); diff --git a/model/audio/core/include/audio_host.h b/model/audio/core/include/audio_host.h index b4d1aa276..58585e2e7 100755 --- a/model/audio/core/include/audio_host.h +++ b/model/audio/core/include/audio_host.h @@ -24,8 +24,6 @@ extern "C" { #endif #endif /* __cplusplus */ -#define BUFF_SIZE_MAX 64 - #define AUDIO_LIST_HEAD_INIT(name) { &(name), &(name) } #define AUDIO_LIST_HEAD(name) \ @@ -207,16 +205,6 @@ struct AudioRuntimeDeivces { struct AudioHost *AudioHostCreateAndBind(struct HdfDeviceObject *device); -static inline struct HdfDeviceObject *AudioHostToDevice(struct AudioHost *host) -{ - return (host == NULL) ? NULL : host->device; -} - -static inline struct AudioHost *AudioHostFromDevice(struct HdfDeviceObject *device) -{ - return (device == NULL) ? NULL : (struct AudioHost *)device->service; -} - /* Get a sound card instance */ struct AudioCard *GetCardInstance(const char *serviceName); diff --git a/model/audio/core/include/audio_parse.h b/model/audio/core/include/audio_parse.h index cd7c96f06..bba9a8279 100755 --- a/model/audio/core/include/audio_parse.h +++ b/model/audio/core/include/audio_parse.h @@ -42,6 +42,7 @@ enum AudioRegOpsType { AUDIO_CTRL_SAPM_PATAM_GROUP, AUDIO_DAI_STARTUP_PATAM_GROUP, AUDIO_DAI_PATAM_GROUP, + AUDIO_DAI_TRIGGER_GROUP, AUDIO_CTRL_CFG_GROUP, AUDIO_SAPM_COMP_GROUP, AUDIO_SAPM_CFG_GROUP, diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index fa6c5f00f..b1b4b53d5 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -12,12 +12,34 @@ #define HDF_LOG_TAG audio_core +#define CHANNEL_MAX_NUM 2 +#define CHANNEL_MIN_NUM 1 +#define AUDIO_DAI_LINK_COMPLETE 1 +#define AUDIO_DAI_LINK_UNCOMPLETE 0 + AUDIO_LIST_HEAD(daiController); AUDIO_LIST_HEAD(platformController); AUDIO_LIST_HEAD(codecController); AUDIO_LIST_HEAD(dspController); AUDIO_LIST_HEAD(accessoryController); +int32_t AudioDeviceReadReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val) +{ + if (val == NULL) { + AUDIO_DRIVER_LOG_ERR("param val is null."); + return HDF_FAILURE; + } + + *val = OSAL_READL((void *)((uintptr_t)(virtualAddress + reg))); + return HDF_SUCCESS; +} + +int32_t AudioDeviceWriteReg(unsigned long virtualAddress, uint32_t reg, uint32_t value) +{ + OSAL_WRITEL(value, (void *)((uintptr_t)(virtualAddress + reg))); + return HDF_SUCCESS; +} + int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct PlatformData *platformData) { struct PlatformDevice *platformDevice = NULL; @@ -42,12 +64,12 @@ int32_t AudioSocRegisterPlatform(struct HdfDeviceObject *device, struct Platform return HDF_SUCCESS; } -int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *data) +int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *daiData) { struct DaiDevice *dai = NULL; - if ((device == NULL) || (data == NULL)) { - ADM_LOG_ERR("Input params check error: device=%p, data=%p.", device, data); + if ((device == NULL) || (daiData == NULL)) { + ADM_LOG_ERR("Input params check error: device=%p, daiData=%p.", device, daiData); return HDF_ERR_INVALID_OBJECT; } @@ -57,8 +79,8 @@ int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *data return HDF_ERR_MALLOC_FAIL; } - dai->devDaiName = data->drvDaiName; - dai->devData = data; + dai->devDaiName = daiData->drvDaiName; + dai->devData = daiData; dai->device = device; DListInsertHead(&dai->list, &daiController); ADM_LOG_INFO("Register [%s] success.", dai->devDaiName); @@ -66,13 +88,14 @@ int32_t AudioSocRegisterDai(struct HdfDeviceObject *device, struct DaiData *data return HDF_SUCCESS; } -int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, struct AccessoryData *data, struct DaiData *daiData) +int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, + struct AccessoryData *accessoryData, struct DaiData *daiData) { struct AccessoryDevice *accessory = NULL; int32_t ret; - if (device == NULL || data == NULL || daiData == NULL) { - ADM_LOG_ERR("Input params check error: device=%p, data=%p, daiData=%p.", device, data, daiData); + if (device == NULL || accessoryData == NULL || daiData == NULL) { + ADM_LOG_ERR("Input params check error: device=%p, accessoryData=%p, daiData=%p.", device, accessoryData, daiData); return HDF_ERR_INVALID_OBJECT; } @@ -83,11 +106,11 @@ int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, struct AccessoryD } OsalMutexInit(&accessory->mutex); - accessory->devAccessoryName = data->drvAccessoryName; - accessory->devData = data; + accessory->devAccessoryName = accessoryData->drvAccessoryName; + accessory->devData = accessoryData; accessory->device = device; - ret = AudioSocDeviceRegister(device, (void *)daiData, AUDIO_DAI_DEVICE); + ret = AudioSocRegisterDai(device, daiData); if (ret != HDF_SUCCESS) { OsalMemFree(accessory); ADM_LOG_ERR("Register accessory device fail ret=%d", ret); @@ -121,7 +144,7 @@ int32_t AudioRegisterCodec(struct HdfDeviceObject *device, struct CodecData *cod codec->devData = codecData; codec->device = device; - ret = AudioSocDeviceRegister(device, (void *)daiData, AUDIO_DAI_DEVICE); + ret = AudioSocRegisterDai(device, daiData); if (ret != HDF_SUCCESS) { OsalIoUnmap((void *)((uintptr_t)(void*)&(codec->devData->virtualAddress))); OsalMemFree(codec); @@ -155,7 +178,7 @@ int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData dspDev->devData = dspData; dspDev->device = device; - ret = AudioSocDeviceRegister(device, (void *)DaiData, AUDIO_DAI_DEVICE); + ret = AudioSocRegisterDai(device, DaiData ); if (ret != HDF_SUCCESS) { OsalMemFree(dspDev); ADM_LOG_ERR("Register dai device fail ret=%d", ret); @@ -167,47 +190,7 @@ int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData return HDF_SUCCESS; } -int32_t AudioSocDeviceRegister(struct HdfDeviceObject *device, void *data, enum AudioDeviceType deviceType) -{ - struct PlatformData *platformData = NULL; - struct DaiData *daiData = NULL; - int32_t ret; - - if ((device == NULL) || (data == NULL) || (deviceType >= AUDIO_DEVICE_BUTT) || (deviceType < 0)) { - ADM_LOG_ERR("Input params check error: device=%p, data=%p, deviceType=%d.", - device, data, deviceType); - return HDF_ERR_INVALID_OBJECT; - } - - switch (deviceType) { - case AUDIO_DAI_DEVICE: { - daiData = (struct DaiData *)data; - ret = AudioSocRegisterDai(device, daiData); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Register dai device fail ret=%d", ret); - return HDF_FAILURE; - } - break; - } - case AUDIO_PLATFORM_DEVICE: { - platformData = (struct PlatformData *)data; - ret = AudioSocRegisterPlatform(device, platformData); - if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Register dma device fail ret=%d", ret); - return HDF_FAILURE; - } - break; - } - default: { - ADM_LOG_ERR("Invalid device type."); - return HDF_FAILURE; - } - } - - return HDF_SUCCESS; -} - -int32_t AudioSeekPlatformDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) +static int32_t AudioSeekPlatformDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) { struct PlatformDevice *platform = NULL; if (rtd == NULL || configData == NULL) { @@ -230,7 +213,7 @@ int32_t AudioSeekPlatformDevice(struct AudioRuntimeDeivces *rtd, const struct Au return HDF_SUCCESS; } -int32_t AudioSeekCpuDaiDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) +static int32_t AudioSeekCpuDaiDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) { struct DaiDevice *cpuDai = NULL; if (rtd == NULL || configData == NULL) { @@ -257,7 +240,7 @@ int32_t AudioSeekCpuDaiDevice(struct AudioRuntimeDeivces *rtd, const struct Audi return HDF_SUCCESS; } -int32_t AudioSeekCodecDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) +static int32_t AudioSeekCodecDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) { struct CodecDevice *codec = NULL; struct DaiDevice *codecDai = NULL; @@ -288,7 +271,7 @@ int32_t AudioSeekCodecDevice(struct AudioRuntimeDeivces *rtd, const struct Audio return HDF_SUCCESS; } -int32_t AudioSeekAccessoryDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) +static int32_t AudioSeekAccessoryDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) { struct AccessoryDevice *accessory = NULL; struct DaiDevice *accessoryDai = NULL; @@ -321,7 +304,7 @@ int32_t AudioSeekAccessoryDevice(struct AudioRuntimeDeivces *rtd, const struct A return HDF_SUCCESS; } -int32_t AudioSeekDspDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) +static int32_t AudioSeekDspDevice(struct AudioRuntimeDeivces *rtd, const struct AudioConfigData *configData) { struct DspDevice *dsp = NULL; struct DaiDevice *dspDai = NULL; @@ -608,7 +591,7 @@ int32_t AudioDaiReadReg(const struct DaiDevice *dai, uint32_t reg, uint32_t *val ADM_LOG_ERR("Input param is NULL."); return HDF_FAILURE; } - virtualAddress = dai->devData->regDaiBase; + virtualAddress = dai->devData->regVirtualAddr; ret = dai->devData->Read(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("dai device read fail."); @@ -625,7 +608,7 @@ int32_t AudioDaiWriteReg(const struct DaiDevice *dai, uint32_t reg, uint32_t val ADM_LOG_ERR("Input param codec is NULL."); return HDF_FAILURE; } - virtualAddress = dai->devData->regDaiBase; + virtualAddress = dai->devData->regVirtualAddr; ret = dai->devData->Write(virtualAddress, reg, val); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("dai device write fail."); diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index 22f5235cf..c43ca1dc0 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -365,7 +365,7 @@ static int32_t AudioDriverInit(struct HdfDeviceObject *device) ADM_LOG_ERR("device is NULL."); return HDF_ERR_INVALID_OBJECT; } - audioHost = AudioHostFromDevice(device); + audioHost = (struct AudioHost *)device->service; if (audioHost == NULL) { ADM_LOG_ERR("audioHost is NULL."); return HDF_FAILURE; @@ -432,7 +432,7 @@ static void AudioDriverRelease(struct HdfDeviceObject *device) ADM_LOG_ERR("device is NULL."); return; } - audioHost = AudioHostFromDevice(device); + audioHost = (struct AudioHost *)device->service; if (audioHost == NULL) { ADM_LOG_ERR("audioHost is NULL."); return; diff --git a/model/audio/core/src/audio_parse.c b/model/audio/core/src/audio_parse.c index 751b9af2b..732990d70 100755 --- a/model/audio/core/src/audio_parse.c +++ b/model/audio/core/src/audio_parse.c @@ -57,6 +57,7 @@ static char *g_audioRegGroupName[AUDIO_GROUP_MAX] = { "ctrlSapmParamsSeqConfig", "daiStartupSeqConfig", "daiParamsSeqConfig", + "daiTriggerSeqConfig", "controlsConfig", "sapmComponent", "sapmConfig" @@ -364,6 +365,7 @@ static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, ret = ParseAudioAddrItem(parser, regCfgNode, group); break; case AUDIO_DAI_PATAM_GROUP: + case AUDIO_DAI_TRIGGER_GROUP: case AUDIO_CTRL_PATAM_GROUP: case AUDIO_CTRL_SAPM_PATAM_GROUP: case AUDIO_DAI_STARTUP_PATAM_GROUP: diff --git a/model/audio/core/test/unittest/common/audio_common_test.h b/model/audio/core/test/unittest/common/audio_common_test.h index 99441c5b4..8b88a63ab 100755 --- a/model/audio/core/test/unittest/common/audio_common_test.h +++ b/model/audio/core/test/unittest/common/audio_common_test.h @@ -14,39 +14,56 @@ const int32_t g_testAudioType = 701; // 701 is TEST_AUDIO_TYPE enum { - TESTGETCODEC, - TESTGETCARDINSTANCE, - TESTGETCCNFIGDATA, - - TESTREGISTERPLATFORM, - TESTREGISTERDAI, - TESTREGISTERACCESSORY, - TESTREGISTERCODEC, - TESTREGISTERDSP, - TESTSOCDEVICEREGISTER, - TESTBINDDAILINK, - TESTUPDATECODECREGBITS, - TESTUPDATEACCESSORYREGBITS, - TESTKCONTROLGETCODEC, - TESTKCONTROLGETACCESSORY, - TESTADDCONTROL, - TESTADDCONTROLS, - TESTCODECREADREG, - TESTACCESSORYREADREG, - TESTCODECWRITEREG, - TESTACCESSORYWRITEREG, - TESTINFOCTRLOPS, - TESTCODECGETCTRLOPS, - TESTACCESSORYGETCTRLOPS, - TESTCODECSETCTRLOPS, - TESTACCESSORYSETCTRLOPS, - - TESTNEWCOMPONENT, - TESTADDROUTES, - TESTNEWCONTROLS, - TESTPOWERCOMPONET, - TESTREFRESHTIME, - TESTSTREAMDISPATCH, + TEST_AUDIOHOSTCREATEANDBIND = 1, // audio ADM audio_host + TEST_GETCARDINSTANCE = 2, // audio ADM audio_host + + TEST_AUDIOFILLCONFIGDATA = 3, // audio ADM audio_parse + TEST_CODECGETREGCONFIG = 4, // audio ADM audio_parse + + TEST_AUDIODEVICEREADREG = 5, // audio ADM audio_core + TEST_AUDIODEVICEWRITEREG, // audio ADM audio_core + TEST_AUDIOSOCREGISTERPLATFORM, // audio ADM audio_core + TEST_AUDIOSOCREGISTERDAI, // audio ADM audio_core + TEST_AUDIOREGISTERDSP, // audio ADM audio_core + TEST_AUDIOREGISTERCODEC, // audio ADM audio_core + TEST_AUDIOREGISTERACCESSORY, // audio ADM audio_core + TEST_AUDIOBINDDAILINK, // audio ADM audio_core + TEST_AUDIOUPDATECODECREGBITS, // audio ADM audio_core + TEST_AUDIOUPDATEACCESSORYREGBITS, // audio ADM audio_core + TEST_AUDIOUPDATEDAIREGBITS, // audio ADM audio_core + TEST_AUDIOKCONTROLGETCPUDAI, // audio ADM audio_core + TEST_AUDIOKCONTROLGETCODEC, // audio ADM audio_core + TEST_AUDIOKCONTROLGETACCESSORY, // audio ADM audio_core + TEST_AUDIOADDCONTROLS, // audio ADM audio_core + TEST_AUDIOADDCONTROL, // audio ADM audio_core + TEST_AUDIOGETCTRLOPSRREG, // audio ADM audio_core + TEST_AUDIOGETCTRLOPSREG, // audio ADM audio_core + TEST_AUDIOSETCTRLOPSREG, // audio ADM audio_core + TEST_AUDIOSETCTRLOPSRREG, // audio ADM audio_core + TEST_AUDIODAIREADREG, // audio ADM audio_core + TEST_AUDIODAIWRITEREG, // audio ADM audio_core + TEST_AUDIOCODECREADREG, // audio ADM audio_core + TEST_AUDIOCODECWRITEREG, // audio ADM audio_core + TEST_AUDIOACCESSORYREADREG, // audio ADM audio_core + TEST_AUDIOACCESSORYWRITEREG, // audio ADM audio_core + TEST_AUDIOINFOCTRLOPS, // audio ADM audio_core + TEST_AUDIOCODECGETCTRLOPS, // audio ADM audio_core + TEST_AUDIOCODECSETCTRLOPS, // audio ADM audio_core + TEST_AUDIOACCESSORYGETCTRLOPS, // audio ADM audio_core + TEST_AUDIOACCESSORYSETCTRLOPS, // audio ADM audio_core + TEST_AUDIOCPUDAISETCTRLOPS, // audio ADM audio_core + TEST_AUDIOCPUDAIGETCTRLOPS = 37, // audio ADM audio_core + + TEST_AUDIOSAPMNEWCOMPONENTS = 38, // audio ADM audio_sapm + TEST_AUDIOSAPMADDROUTES, // audio ADM audio_sapm + TEST_AUDIOSAPMNEWCONTROLS, // audio ADM audio_sapm + TEST_AUDIOSAPMSLEEP, // audio ADM audio_sapm + TEST_AUDIOSAMPPOWERUP, // audio ADM audio_sapm + TEST_AUDIOSAMPSETPOWERMONITOR, // audio ADM audio_sapm + TEST_AUDIOCODECSAPMSETCTRLOPS, // audio ADM audio_sapm + TEST_AUDIOCODECSAPMGETCTRLOPS, // audio ADM audio_sapm + TEST_AUDIOACCESSORYSAPMSETCTRLOPS, // audio ADM audio_sapm + TEST_AUDIOACCESSORYSAPMGETCTRLOPS = 47, // audio ADM audio_sapm }; #endif /* AUDIO_COMMON_TEST_H */ diff --git a/model/audio/core/test/unittest/common/audio_core_test.cpp b/model/audio/core/test/unittest/common/audio_core_test.cpp index 6d653820a..349feaeb2 100755 --- a/model/audio/core/test/unittest/common/audio_core_test.cpp +++ b/model/audio/core/test/unittest/common/audio_core_test.cpp @@ -38,135 +38,201 @@ void AudioCoreTest::TearDown() { } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterPlatform, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioDeviceReadReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERPLATFORM, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIODEVICEREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterDai, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioDeviceWriteReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERDAI, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIODEVICEWRITEREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterAccessory, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioSocRegisterPlatform, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERACCESSORY, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSOCREGISTERPLATFORM, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_RegisterCodec, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioSocRegisterDai, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERCODEC, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSOCREGISTERDAI, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_SocRegisterDsp, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioRegisterDsp, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREGISTERDSP, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOREGISTERDSP, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_SocDeviceRegister, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioRegisterCodec, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTSOCDEVICEREGISTER, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOREGISTERCODEC, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_BindDaiLink, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioRegisterAccessory, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTBINDDAILINK, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOREGISTERACCESSORY, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateCodecRegBits, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioBindDaiLink, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTUPDATECODECREGBITS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOBINDDAILINK, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_UpdateAccessoryRegBits, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioUpdateCodecRegBits, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTUPDATEACCESSORYREGBITS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOUPDATECODECREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetCodec, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioUpdateAccessoryRegBits, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTKCONTROLGETCODEC, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOUPDATEACCESSORYREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_KcontrolGetAccessory, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioUpdateDaiRegBits, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTKCONTROLGETACCESSORY, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOUPDATEDAIREGBITS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AddControl, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioKcontrolGetCpuDai, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTADDCONTROL, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOKCONTROLGETCPUDAI, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AddControls, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioKcontrolGetCodec, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTADDCONTROLS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOKCONTROLGETCODEC, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecReadReg, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioKcontrolGetAccessory, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTCODECREADREG, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOKCONTROLGETACCESSORY, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryReadReg, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAddControls, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYREADREG, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOADDCONTROLS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecWriteReg, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAddControl, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTCODECWRITEREG, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOADDCONTROL, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryWriteReg, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioGetCtrlOpsRReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYWRITEREG, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOGETCTRLOPSRREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_InfoCtrlOps, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioGetCtrlOpsReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTINFOCTRLOPS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOGETCTRLOPSREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecGetCtrlOps, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioSetCtrlOpsReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTCODECGETCTRLOPS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSETCTRLOPSREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessoryGetCtrlOps, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioSetCtrlOpsRReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYGETCTRLOPS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSETCTRLOPSRREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_CodecSetCtrlOps, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioDaiReadReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTCODECSETCTRLOPS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIODAIREADREG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioCoreTest, AudioCoreTest_AccessorySetCtrlOps, TestSize.Level1) +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioDaiWriteReg, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTACCESSORYSETCTRLOPS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIODAIWRITEREG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCodecReadReg, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECREADREG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCodecWriteReg, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECWRITEREG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAccessoryReadReg, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYREADREG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAccessoryWriteReg, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYWRITEREG, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioInfoCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOINFOCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCodecGetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECGETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCodecSetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECSETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAccessoryGetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYGETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioAccessorySetCtrlOpsTset, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYSETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCpuDaiSetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCPUDAISETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioCoreTest, AudioCoreTest_AudioCpuDaiGetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCPUDAIGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } } diff --git a/model/audio/core/test/unittest/common/audio_host_test.cpp b/model/audio/core/test/unittest/common/audio_host_test.cpp index 119ab6d6c..56b405a1e 100755 --- a/model/audio/core/test/unittest/common/audio_host_test.cpp +++ b/model/audio/core/test/unittest/common/audio_host_test.cpp @@ -39,15 +39,15 @@ void AudioHostTest::TearDown() { } -HWTEST_F(AudioHostTest, AudioHostTest_GetCodec, TestSize.Level1) +HWTEST_F(AudioHostTest, AudioHostTest_AudioHostCreateAndBind, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTGETCODEC, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOHOSTCREATEANDBIND, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioHostTest, AudioHostTest_GetAudioServiceName, TestSize.Level1) +HWTEST_F(AudioHostTest, AudioHostTest_GetCardInstance, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTGETCARDINSTANCE, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_GETCARDINSTANCE, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } } diff --git a/model/audio/core/test/unittest/common/audio_parse_test.cpp b/model/audio/core/test/unittest/common/audio_parse_test.cpp index dd0e5bf7a..2df866aac 100755 --- a/model/audio/core/test/unittest/common/audio_parse_test.cpp +++ b/model/audio/core/test/unittest/common/audio_parse_test.cpp @@ -39,9 +39,15 @@ void AudioParseTest::TearDown() { } -HWTEST_F(AudioParseTest, AudioParseTest_GetConfigData, TestSize.Level1) +HWTEST_F(AudioParseTest, AudioParseTest_AudioFillConfigData, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTGETCCNFIGDATA, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOFILLCONFIGDATA, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioParseTest, AudioParseTest_CodecGetRegConfig, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_CODECGETREGCONFIG, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } } diff --git a/model/audio/dispatch/include/audio_control_dispatch.h b/model/audio/dispatch/include/audio_control_dispatch.h index 2d3959316..ec979a667 100755 --- a/model/audio/dispatch/include/audio_control_dispatch.h +++ b/model/audio/dispatch/include/audio_control_dispatch.h @@ -17,9 +17,6 @@ extern "C" { #endif #endif /* __cplusplus */ - -#define AUDIODRV_CTRL_ELEM_TYPE_INTEGER 2 /* integer type */ - enum ControlDispMethodCmd { AUDIODRV_CTRL_IOCTRL_ELEM_INFO, AUDIODRV_CTRL_IOCTRL_ELEM_READ, @@ -27,12 +24,9 @@ enum ControlDispMethodCmd { AUDIODRV_CTRL_IOCTRL_ELEM_BUTT, }; -typedef int32_t (*ControlDispCmdHandle)(const struct HdfDeviceIoClient *client, - struct HdfSBuf *data, struct HdfSBuf *reply); - struct ControlDispCmdHandleList { enum ControlDispMethodCmd cmd; - ControlDispCmdHandle func; + int32_t (*func)(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply); }; struct ControlHost { @@ -41,11 +35,6 @@ struct ControlHost { void *priv; }; -static inline struct ControlHost *ControlHostFromDevice(struct HdfDeviceObject *device) -{ - return (device == NULL) ? NULL : (struct ControlHost *)device->service; -} - #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/dispatch/include/audio_stream_dispatch.h b/model/audio/dispatch/include/audio_stream_dispatch.h index 3e9a2c654..b586e1c72 100755 --- a/model/audio/dispatch/include/audio_stream_dispatch.h +++ b/model/audio/dispatch/include/audio_stream_dispatch.h @@ -21,39 +21,37 @@ extern "C" { #endif #endif /* __cplusplus */ -#define AUDIO_SERVICE_NAME_MAX_LEN 32 - enum StreamDispMethodCmd { - AUDIO_DRV_PCM_IOCTRL_HW_PARAMS, - AUDIO_DRV_PCM_IOCTRL_RENDER_PREPARE, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_PREPARE, - AUDIO_DRV_PCM_IOCTRL_WRITE, - AUDIO_DRV_PCM_IOCTRL_READ, - AUDIO_DRV_PCM_IOCTRL_RENDER_START, - AUDIO_DRV_PCM_IOCTRL_RENDER_STOP, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_START, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP, - AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE, - AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME, + AUDIO_DRV_PCM_IOCTL_HW_PARAMS, + AUDIO_DRV_PCM_IOCTL_RENDER_PREPARE, + AUDIO_DRV_PCM_IOCTL_CAPTURE_PREPARE, + AUDIO_DRV_PCM_IOCTL_WRITE, + AUDIO_DRV_PCM_IOCTL_READ, + AUDIO_DRV_PCM_IOCTL_RENDER_START, + AUDIO_DRV_PCM_IOCTL_RENDER_STOP, + AUDIO_DRV_PCM_IOCTL_CAPTURE_START, + AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP, + AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE, + AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE, + AUDIO_DRV_PCM_IOCTL_RENDER_RESUME, + AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME, AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER, AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, - AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN, - AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN, - AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE, - AUDIO_DRV_PCM_IOCTRL_BUTT, + AUDIO_DRV_PCM_IOCTL_RENDER_OPEN, + AUDIO_DRV_PCM_IOCTL_RENDER_CLOSE, + AUDIO_DRV_PCM_IOCTL_CAPTURE_OPEN, + AUDIO_DRV_PCM_IOCTL_CAPTURE_CLOSE, + AUDIO_DRV_PCM_IOCTL_DSPDECODE, + AUDIO_DRV_PCM_IOCTL_DSPENCODE, + AUDIO_DRV_PCM_IOCTL_DSPEQUALIZER, + AUDIO_DRV_PCM_IOCTL_BUTT, }; -typedef int32_t (*StreamDispCmdHandle)(const struct HdfDeviceIoClient *client, - struct HdfSBuf *data, struct HdfSBuf *reply); - struct StreamDispCmdHandleList { enum StreamDispMethodCmd cmd; - StreamDispCmdHandle func; + int32_t (*func)(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply); }; struct StreamHost { @@ -62,14 +60,6 @@ struct StreamHost { void *priv; }; -static inline struct StreamHost *StreamHostFromDevice(struct HdfDeviceObject *device) -{ - return (device == NULL) ? NULL : (struct StreamHost *)device->service; -} - -int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, - struct HdfSBuf *data, struct HdfSBuf *reply); - #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/dispatch/src/audio_control_dispatch.c b/model/audio/dispatch/src/audio_control_dispatch.c index 3f8d5fa99..075641041 100755 --- a/model/audio/dispatch/src/audio_control_dispatch.c +++ b/model/audio/dispatch/src/audio_control_dispatch.c @@ -312,7 +312,7 @@ static void AudioControlRelease(struct HdfDeviceObject *device) return; } - controlHost = ControlHostFromDevice(device); + controlHost = (struct ControlHost *)device->service; if (controlHost == NULL) { ADM_LOG_ERR("controlHost is NULL."); return; diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index db6375b5e..504d0084e 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -12,7 +12,14 @@ #define HDF_LOG_TAG audio_stream_dispatch -int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) +#define BUFF_SIZE_MAX 64 + +static inline struct StreamHost *StreamHostFromDevice(struct HdfDeviceObject *device) +{ + return (device == NULL) ? NULL : (struct StreamHost *)device->service; +} + +static int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) { if ((audioCard == NULL) || (params == NULL)) { ADM_LOG_ERR("CpuDai input param is NULL."); @@ -37,7 +44,7 @@ int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPc if (cpuDai->devData->ops->HwParams != NULL) { int ret = cpuDai->devData->ops->HwParams(audioCard, params); if (ret < 0) { - ADM_LOG_ERR("cpuDai hardware params fail ret=%d", ret); + ADM_LOG_ERR("cpuDai hardware params failed ret=%d", ret); return HDF_ERR_IO; } } @@ -45,7 +52,7 @@ int32_t HwCpuDaiDispatch(const struct AudioCard *audioCard, const struct AudioPc return HDF_SUCCESS; } -int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) +static int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) { if ((audioCard == NULL) || (params == NULL)) { ADM_LOG_ERR("CodecDai input param is NULL."); @@ -72,7 +79,7 @@ int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct Audio if (codecDai->devData->ops->HwParams != NULL) { int ret = codecDai->devData->ops->HwParams(audioCard, params); if (ret < 0) { - ADM_LOG_ERR("codecDai hardware params fail ret=%d", ret); + ADM_LOG_ERR("codecDai hardware params failed ret=%d", ret); return HDF_ERR_IO; } } @@ -80,7 +87,33 @@ int32_t HwCodecDaiDispatch(const struct AudioCard *audioCard, const struct Audio return HDF_SUCCESS; } -int32_t HwPlatfromDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) +static int32_t HwDspDaiDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) +{ + if ((audioCard == NULL) || (params == NULL)) { + ADM_LOG_ERR("DspDai input param is NULL."); + return HDF_FAILURE; + } + struct AudioRuntimeDeivces *rtd = audioCard->rtd; + if (rtd == NULL) { + ADM_LOG_ERR("DspDai audioCard rtd is NULL."); + return HDF_FAILURE; + } + struct DaiDevice *dspDai = rtd->dspDai; + if (dspDai == NULL || dspDai->devData == NULL || dspDai->devData->ops == NULL) { + ADM_LOG_ERR("dspDai param is NULL."); + return HDF_FAILURE; + } + if (dspDai->devData->ops->HwParams != NULL) { + int ret = dspDai->devData->ops->HwParams(audioCard, params); + if (ret < 0) { + ADM_LOG_ERR("dspDai hardware params failed ret=%d", ret); + return HDF_ERR_IO; + } + } + return HDF_SUCCESS; +} + +static int32_t HwPlatfromDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) { if ((audioCard == NULL) || (params == NULL)) { ADM_LOG_ERR("Platfrom input param is NULL."); @@ -98,14 +131,14 @@ int32_t HwPlatfromDispatch(const struct AudioCard *audioCard, const struct Audio */ int ret = AudioHwParams(audioCard, params); if (ret < 0) { - ADM_LOG_ERR("platform hardware params fail ret=%d", ret); + ADM_LOG_ERR("platform hardware params failed ret=%d", ret); return HDF_ERR_IO; } return HDF_SUCCESS; } -int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) +static int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct AudioPcmHwParams *params) { if ((audioCard == NULL) || (params == NULL)) { ADM_LOG_ERR("input param is NULL."); @@ -114,63 +147,97 @@ int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct AudioPc /* Traverse through each driver method; Enter if you have, if not, exectue in order */ if (HwCodecDaiDispatch(audioCard, params) != HDF_SUCCESS) { - ADM_LOG_ERR("codec dai hardware params fail."); + ADM_LOG_ERR("codec dai hardware params failed."); return HDF_FAILURE; } if (HwCpuDaiDispatch(audioCard, params) != HDF_SUCCESS) { - ADM_LOG_ERR("cpu dai hardware params fail."); + ADM_LOG_ERR("cpu dai hardware params failed."); return HDF_FAILURE; } if (HwPlatfromDispatch(audioCard, params) != HDF_SUCCESS) { - ADM_LOG_ERR("platform dai hardware params fail."); + ADM_LOG_ERR("platform dai hardware params failed."); return HDF_FAILURE; } + + if (HwDspDaiDispatch(audioCard, params) != HDF_SUCCESS) { + ADM_LOG_ERR("dsp dai hardware params failed."); + return HDF_FAILURE; + } + return HDF_SUCCESS; } -static int32_t AudioDaiDeviceStartup(struct AudioCard *audioCard) +static int32_t CpuDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *cpuDai) { - struct DaiDevice *cpuDai = NULL; - struct DaiDevice *codecDai = NULL; - struct DaiDevice *accessoryDai = NULL; - int ret; - - if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("audioCard is null."); - return HDF_FAILURE; - } - cpuDai = audioCard->rtd->cpuDai; + int32_t ret; if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && cpuDai->devData->ops->Startup != NULL) { ret = cpuDai->devData->ops->Startup(audioCard, cpuDai); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("cpuDai Startup fail."); + ADM_LOG_ERR("cpuDai Startup failed."); return HDF_FAILURE; } } else { ADM_LOG_DEBUG("cpu dai startup is null."); } + return HDF_SUCCESS; +} - codecDai = audioCard->rtd->codecDai; +static int32_t CodecDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *codecDai) +{ + int32_t ret; + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); + return HDF_FAILURE; + } if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL && codecDai->devData->ops->Startup != NULL) { ret = codecDai->devData->ops->Startup(audioCard, codecDai); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("codecDai Startup fail."); + ADM_LOG_ERR("codecDai Startup failed."); return HDF_FAILURE; } } else { ADM_LOG_DEBUG("codec dai startup is null."); } - accessoryDai = audioCard->rtd->accessoryDai; + return HDF_SUCCESS; +} + +static int32_t DspDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *dspDai) +{ + int32_t ret; + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); + return HDF_FAILURE; + } + if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL && + dspDai->devData->ops->Startup != NULL) { + ret = dspDai->devData->ops->Startup(audioCard, dspDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("dspDai Startup failed."); + return HDF_FAILURE; + } + } else { + ADM_LOG_DEBUG("dsp dai startup is null."); + } + return HDF_SUCCESS; +} + +static int32_t AccessoryDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *accessoryDai) +{ + int32_t ret; + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); + return HDF_FAILURE; + } if (accessoryDai != NULL && accessoryDai->devData != NULL && accessoryDai->devData->ops != NULL && accessoryDai->devData->ops->Startup != NULL) { ret = accessoryDai->devData->ops->Startup(audioCard, accessoryDai); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("accessoryDai Startup fail."); + ADM_LOG_ERR("accessoryDai Startup failed."); return HDF_FAILURE; } } else { @@ -179,6 +246,45 @@ static int32_t AudioDaiDeviceStartup(struct AudioCard *audioCard) return HDF_SUCCESS; } +static int32_t AudioDaiDeviceStartup(struct AudioCard *audioCard) +{ + struct DaiDevice *cpuDai = NULL; + struct DaiDevice *codecDai = NULL; + struct DaiDevice *dspDai = NULL; + struct DaiDevice *accessoryDai = NULL; + int32_t ret; + + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); + return HDF_FAILURE; + } + cpuDai = audioCard->rtd->cpuDai; + ret = CpuDaiDevStartup(audioCard, cpuDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("CpuDaiDevStartup failed."); + return HDF_FAILURE; + } + codecDai = audioCard->rtd->codecDai; + ret = CodecDaiDevStartup(audioCard, codecDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("CodecDaiDevStartup failed."); + return HDF_FAILURE; + } + dspDai = audioCard->rtd->dspDai; + ret = DspDaiDevStartup(audioCard, dspDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("DspDaiDevStartup failed."); + return HDF_FAILURE; + } + accessoryDai = audioCard->rtd->accessoryDai; + ret = AccessoryDaiDevStartup(audioCard, accessoryDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("AccessoryDaiDevStartup failed."); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + static int32_t HwParamsDataAnalysis(struct HdfSBuf *reqData, struct AudioPcmHwParams *params) { if ((reqData == NULL) || (params == NULL)) { @@ -252,7 +358,7 @@ static int32_t HwParamsDataAnalysis(struct HdfSBuf *reqData, struct AudioPcmHwPa return HDF_SUCCESS; } -int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioPcmHwParams params; @@ -273,13 +379,11 @@ int32_t StreamHostHwParams(const struct HdfDeviceIoClient *client, struct HdfSBu ADM_LOG_ERR("hwparams data analysis failed ret=%d", ret); return HDF_FAILURE; } - audioCard = GetCardInstance(params.cardServiceName); if (audioCard == NULL) { - ADM_LOG_ERR("get card instance fail."); + ADM_LOG_ERR("get card instance failed."); return HDF_FAILURE; } - ret = HwParamsDispatch(audioCard, ¶ms); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("hwparams dispatch failed ret=%d", ret); @@ -314,14 +418,14 @@ static struct AudioCard *StreamHostGetCardInstance(const struct HdfDeviceIoClien audioCard = GetCardInstance(cardName); if (audioCard == NULL) { - ADM_LOG_ERR("get card instance fail."); + ADM_LOG_ERR("get card instance failed."); return NULL; } return audioCard; } -int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; @@ -338,13 +442,13 @@ int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL) { - ADM_LOG_ERR("CapturePrepare get card instance or rtd fail."); + ADM_LOG_ERR("CapturePrepare get card instance or rtd failed."); return HDF_FAILURE; } ret = AudioCapturePrepare(audioCard); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform CapturePrepare fail ret=%d", ret); + ADM_LOG_ERR("platform CapturePrepare failed ret=%d", ret); return HDF_ERR_IO; } @@ -352,7 +456,7 @@ int32_t StreamHostCapturePrepare(const struct HdfDeviceIoClient *client, struct return HDF_SUCCESS; } -int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { char *cardName = NULL; @@ -371,7 +475,7 @@ int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct Hdf cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX); if (cardName == NULL) { - ADM_LOG_ERR("malloc cardServiceName fail!"); + ADM_LOG_ERR("malloc cardServiceName failed!"); return HDF_FAILURE; } @@ -398,17 +502,17 @@ int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct Hdf audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL) { - ADM_LOG_ERR("StreamHostCaptureOpen get card instance or rtd fail."); + ADM_LOG_ERR("StreamHostCaptureOpen get card instance or rtd failed."); return HDF_FAILURE; } if (AudioCaptureOpen(audioCard) != HDF_SUCCESS) { - ADM_LOG_ERR("platform CaptureOpen fail"); + ADM_LOG_ERR("platform CaptureOpen failed"); return HDF_ERR_IO; } if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) { - ADM_LOG_ERR("Dai Device Startup fail."); + ADM_LOG_ERR("Dai Device Startup failed."); return HDF_FAILURE; } @@ -416,7 +520,7 @@ int32_t StreamHostCaptureOpen(const struct HdfDeviceIoClient *client, struct Hdf return HDF_SUCCESS; } -int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; @@ -433,13 +537,13 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderPrepare get card instance or rtd fail."); + ADM_LOG_ERR("RenderPrepare get card instance or rtd failed."); return HDF_FAILURE; } ret = AudioRenderPrepare(audioCard); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform RenderPrepare fail ret=%d", ret); + ADM_LOG_ERR("platform RenderPrepare failed ret=%d", ret); return HDF_ERR_IO; } @@ -447,7 +551,7 @@ int32_t StreamHostRenderPrepare(const struct HdfDeviceIoClient *client, struct H return HDF_SUCCESS; } -int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { char *cardName = NULL; @@ -466,7 +570,7 @@ int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfS cardName = (char *)OsalMemCalloc(sizeof(char) * BUFF_SIZE_MAX); if (cardName == NULL) { - ADM_LOG_ERR("malloc cardServiceName fail!"); + ADM_LOG_ERR("malloc cardServiceName failed!"); return HDF_FAILURE; } @@ -495,17 +599,17 @@ int32_t StreamHostRenderOpen(const struct HdfDeviceIoClient *client, struct HdfS audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("StreamHostRenderOpen get card instance or rtd fail."); + ADM_LOG_ERR("StreamHostRenderOpen get card instance or rtd failed."); return HDF_FAILURE; } if (AudioRenderOpen(audioCard) != HDF_SUCCESS) { - ADM_LOG_ERR("platform RenderOpen fail."); + ADM_LOG_ERR("platform RenderOpen failed."); return HDF_FAILURE; } if (AudioDaiDeviceStartup(audioCard) != HDF_SUCCESS) { - ADM_LOG_ERR("Dai Device Startup fail."); + ADM_LOG_ERR("Dai Device Startup failed."); return HDF_FAILURE; } @@ -524,7 +628,7 @@ static int32_t StreamTransferWrite(const struct AudioCard *audioCard, struct Aud ret = AudioPcmWrite(audioCard, transfer); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("pcm write fail ret=%d", ret); + ADM_LOG_ERR("pcm write failed ret=%d", ret); return HDF_FAILURE; } @@ -543,7 +647,7 @@ static int32_t StreamTransferMmapWrite(const struct AudioCard *audioCard, const ret = AudioPcmMmapWrite(audioCard, txMmapData); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform write fail ret=%d", ret); + ADM_LOG_ERR("platform write failed ret=%d", ret); return HDF_FAILURE; } @@ -563,7 +667,7 @@ static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const s ret = AudioPcmMmapRead(audioCard, rxMmapData); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform read fail ret=%d", ret); + ADM_LOG_ERR("platform read failed ret=%d", ret); return HDF_FAILURE; } @@ -571,7 +675,7 @@ static int32_t StreamTransferMmapRead(const struct AudioCard *audioCard, const s return HDF_SUCCESS; } -int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioTxData transfer; struct AudioCard *audioCard = NULL; @@ -595,13 +699,13 @@ int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf * audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("get card instance or rtd fail."); + ADM_LOG_ERR("get card instance or rtd failed."); return HDF_FAILURE; } ret = StreamTransferWrite(audioCard, &transfer); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("write reg value fail ret=%d", ret); + ADM_LOG_ERR("write reg value failed ret=%d", ret); return HDF_FAILURE; } @@ -613,7 +717,7 @@ int32_t StreamHostWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf * return HDF_SUCCESS; } -int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; struct AudioRxData rxData; @@ -628,13 +732,13 @@ int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *d audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL) { - ADM_LOG_ERR("get card instance or rtd fail."); + ADM_LOG_ERR("get card instance or rtd failed."); return HDF_FAILURE; } ret = AudioPcmRead(audioCard, &rxData); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("pcm read fail ret=%d", ret); + ADM_LOG_ERR("pcm read failed ret=%d", ret); return HDF_FAILURE; } @@ -643,21 +747,23 @@ int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *d return HDF_FAILURE; } - if (!HdfSbufWriteBuffer(reply, rxData.buf, (uint32_t)(rxData.bufSize))) { - ADM_LOG_ERR("write request data buf failed!"); - return HDF_FAILURE; - } + if (rxData.bufSize !=0) { + if (!HdfSbufWriteBuffer(reply, rxData.buf, (uint32_t)(rxData.bufSize))) { + ADM_LOG_ERR("write request data buf failed!"); + return HDF_FAILURE; + } - if (!HdfSbufWriteUint32(reply, (uint32_t)(rxData.frames))) { - ADM_LOG_ERR("write frames failed!"); - return HDF_FAILURE; + if (!HdfSbufWriteUint32(reply, (uint32_t)(rxData.frames))) { + ADM_LOG_ERR("write frames failed!"); + return HDF_FAILURE; + } } ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioMmapData txMmapData; struct AudioCard *audioCard = NULL; @@ -696,13 +802,13 @@ int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struct HdfSB } audioCard = StreamHostGetCardInstance(client); if (StreamTransferMmapWrite(audioCard, &txMmapData) != HDF_SUCCESS) { - ADM_LOG_ERR("render mmap write reg value fail!"); + ADM_LOG_ERR("render mmap write reg value failed!"); return HDF_FAILURE; } ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; ADM_LOG_DEBUG("entry."); @@ -721,14 +827,14 @@ int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, stru return HDF_FAILURE; } if (!HdfSbufWriteUint64(reply, platformData->renderBufInfo.framesPosition)) { - ADM_LOG_ERR("render mmap write position fail!"); + ADM_LOG_ERR("render mmap write position failed!"); return HDF_FAILURE; } ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { uint64_t mAddress = 0; struct AudioCard *audioCard = NULL; @@ -766,14 +872,14 @@ int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct HdfSBu } audioCard = StreamHostGetCardInstance(client); if (StreamTransferMmapRead(audioCard, &rxMmapData) != HDF_SUCCESS) { - ADM_LOG_ERR("capture mmap read reg value fail!"); + ADM_LOG_ERR("capture mmap read reg value failed!"); return HDF_FAILURE; } ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; ADM_LOG_DEBUG("entry."); @@ -792,84 +898,116 @@ int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struc return HDF_FAILURE; } if (!HdfSbufWriteUint64(reply, platformData->captureBufInfo.framesPosition)) { - ADM_LOG_ERR("render mmap write position fail!"); + ADM_LOG_ERR("render mmap write position failed!"); return HDF_FAILURE; } ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamTriggerRouteImpl(struct AudioCard *audioCard, struct AudioRuntimeDeivces *rtd, + enum StreamDispMethodCmd methodCmd) { - struct AudioRuntimeDeivces *rtd = NULL; + int32_t ret = HDF_SUCCESS; struct DaiDevice *cpuDai = NULL; struct DaiDevice *codecDai = NULL; + struct DaiDevice *dspDai = NULL; + if (audioCard == NULL || rtd == NULL) { + ADM_LOG_ERR("input param is NULL."); + return HDF_FAILURE; + } + cpuDai = rtd->cpuDai; + if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && + cpuDai->devData->ops->Trigger != NULL) { + ret = cpuDai->devData->ops->Trigger(audioCard, methodCmd, cpuDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("cpuDai Trigger failed."); + return HDF_FAILURE; + } + } + codecDai = rtd->codecDai; + if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL && + codecDai->devData->ops->Trigger != NULL) { + ret = codecDai->devData->ops->Trigger(audioCard, methodCmd, codecDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("codecDai Trigger failed."); + return HDF_FAILURE; + } + } + dspDai = rtd->dspDai; + if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL && + dspDai->devData->ops->Trigger != NULL) { + ret = dspDai->devData->ops->Trigger(audioCard, methodCmd, dspDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("dspDai Trigger failed."); + return HDF_FAILURE; + } + } + ADM_LOG_DEBUG("success."); + return HDF_SUCCESS; +} + + +static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); - if (client == NULL) { ADM_LOG_ERR("RenderStart input param is NULL."); return HDF_FAILURE; } - (void)data; (void)reply; - audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderStart get card instance or rtd fail."); + ADM_LOG_ERR("RenderStart get card instance or rtd failed."); return HDF_FAILURE; } rtd = audioCard->rtd; audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER; - - cpuDai = rtd->cpuDai; - if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && - cpuDai->devData->ops->Trigger != NULL) { - cpuDai->devData->ops->Trigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START, cpuDai); - } - - codecDai = rtd->codecDai; - if (codecDai != NULL && codecDai->devData != NULL && codecDai->devData->ops != NULL && - codecDai->devData->ops->Trigger != NULL) { - codecDai->devData->ops->Trigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START, codecDai); + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_START); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; } - - ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_START); + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_START); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform render start fail ret=%d", ret); + ADM_LOG_ERR("platform render start failed ret=%d", ret); return HDF_ERR_IO; } - ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); - if (client == NULL) { ADM_LOG_ERR("CaptureStart input param is NULL."); return HDF_FAILURE; } - (void)data; (void)reply; - audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("CaptureStart get card instance or rtd fail."); + ADM_LOG_ERR("CaptureStart get card instance or rtd failed."); return HDF_FAILURE; } audioCard->standbyMode = AUDIO_SAPM_TURN_STANDBY_LATER; - - ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_START); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_START); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform capture start fail ret=%d", ret); + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_START); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform capture start failed ret=%d", ret); return HDF_ERR_IO; } @@ -877,34 +1015,36 @@ int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct Hd return HDF_SUCCESS; } -int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); - if (client == NULL) { ADM_LOG_ERR("RenderStop input param is NULL."); return HDF_FAILURE; } - (void)reply; - audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderStop get card instance or rtd fail."); + ADM_LOG_ERR("RenderStop get card instance or rtd failed."); return HDF_FAILURE; } - if (!HdfSbufReadUint32(data, &audioCard->standbyMode)) { ADM_LOG_ERR("read request streamType failed!"); return HDF_FAILURE; } - - ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_STOP); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_STOP); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_STOP); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform render stop fail ret=%d", ret); + ADM_LOG_ERR("platform render stop failed ret=%d", ret); return HDF_ERR_IO; } @@ -912,7 +1052,7 @@ int32_t StreamHostRenderStop(const struct HdfDeviceIoClient *client, struct HdfS return HDF_SUCCESS; } -int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; @@ -929,13 +1069,13 @@ int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct Hdf audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderStop get card instance or rtd fail."); + ADM_LOG_ERR("RenderStop get card instance or rtd failed."); return HDF_FAILURE; } ret = AudioRenderClose(audioCard); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform RenderClose fail ret=%d", ret); + ADM_LOG_ERR("platform RenderClose failed ret=%d", ret); return HDF_ERR_IO; } @@ -944,8 +1084,9 @@ int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, struct Hdf } -int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -959,7 +1100,7 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("CaptureStop get card instance or rtd fail."); + ADM_LOG_ERR("CaptureStop get card instance or rtd failed."); return HDF_FAILURE; } @@ -967,10 +1108,15 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf ADM_LOG_ERR("read request streamType failed!"); return HDF_FAILURE; } - - ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform capture stop fail ret=%d", ret); + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform capture stop failed ret=%d", ret); return HDF_ERR_IO; } @@ -978,7 +1124,7 @@ int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct Hdf return HDF_SUCCESS; } -int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; int ret; @@ -994,13 +1140,13 @@ int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct Hd audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("CaptureStop get card instance or rtd fail."); + ADM_LOG_ERR("CaptureStop get card instance or rtd failed."); return HDF_FAILURE; } ret = AudioCaptureClose(audioCard); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform capture close fail ret=%d", ret); + ADM_LOG_ERR("platform capture close failed ret=%d", ret); return HDF_ERR_IO; } @@ -1009,8 +1155,9 @@ int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct Hd } -int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -1025,13 +1172,18 @@ int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct Hdf audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderPause get card instance or rtd fail."); + ADM_LOG_ERR("RenderPause get card instance or rtd failed."); return HDF_FAILURE; } - - ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform render pause fail ret=%d", ret); + ADM_LOG_ERR("platform render pause failed ret=%d", ret); return HDF_ERR_IO; } @@ -1039,9 +1191,10 @@ int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct Hdf return HDF_SUCCESS; } -int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -1056,13 +1209,18 @@ int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct Hd audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("CapturePause get card instance or rtd fail."); + ADM_LOG_ERR("CapturePause get card instance or rtd failed."); return HDF_FAILURE; } - - ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform captur pause fail ret=%d", ret); + ADM_LOG_ERR("platform captur pause failed ret=%d", ret); return HDF_ERR_IO; } @@ -1070,9 +1228,10 @@ int32_t StreamHostCapturePause(const struct HdfDeviceIoClient *client, struct Hd return HDF_SUCCESS; } -int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret; ADM_LOG_DEBUG("entry."); @@ -1087,13 +1246,18 @@ int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct Hd audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("RenderResume get card instance or rtd fail."); + ADM_LOG_ERR("RenderResume get card instance or rtd failed."); return HDF_FAILURE; } - - ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_RENDER_RESUME); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioRenderTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_RENDER_RESUME); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform RenderResume fail ret=%d", ret); + ADM_LOG_ERR("platform RenderResume failed ret=%d", ret); return HDF_ERR_IO; } @@ -1101,9 +1265,10 @@ int32_t StreamHostRenderResume(const struct HdfDeviceIoClient *client, struct Hd return HDF_SUCCESS; } -int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { + struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; int ret = HDF_SUCCESS; ADM_LOG_DEBUG("entry."); @@ -1118,13 +1283,18 @@ int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct H audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("CaptureResume get card instance or rtd fail."); + ADM_LOG_ERR("CaptureResume get card instance or rtd failed."); return HDF_FAILURE; } - - ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME); + rtd = audioCard->rtd; + ret = StreamTriggerRouteImpl(audioCard, rtd, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("platform CaptureResume fail ret=%d", ret); + ADM_LOG_ERR("StreamTriggerRouteImpl failed"); + return HDF_FAILURE; + } + ret = AudioCaptureTrigger(audioCard, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("platform CaptureResume failed ret=%d", ret); return HDF_ERR_IO; } @@ -1132,7 +1302,7 @@ int32_t StreamHostCaptureResume(const struct HdfDeviceIoClient *client, struct H return HDF_SUCCESS; } -int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; @@ -1150,7 +1320,7 @@ int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSB audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("DspDecode get card instance or rtd fail."); + ADM_LOG_ERR("DspDecode get card instance or rtd failed."); return HDF_FAILURE; } rtd = audioCard->rtd; @@ -1163,7 +1333,7 @@ int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSB ret = dspDev->devData->decode(audioCard, (void*)data, dspDev); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("DeCode render pause fail ret=%d", ret); + ADM_LOG_ERR("DeCode render pause failed ret=%d", ret); return HDF_ERR_IO; } @@ -1171,7 +1341,7 @@ int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struct HdfSB return HDF_SUCCESS; } -int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; @@ -1189,7 +1359,7 @@ int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSB audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("DspEncode get card instance or rtd fail."); + ADM_LOG_ERR("DspEncode get card instance or rtd failed."); return HDF_FAILURE; } rtd = audioCard->rtd; @@ -1202,7 +1372,7 @@ int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSB ret = dspDev->devData->encode(audioCard, (void*)data, dspDev); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("EnCode render pause fail ret=%d", ret); + ADM_LOG_ERR("EnCode render pause failed ret=%d", ret); return HDF_ERR_IO; } @@ -1210,7 +1380,7 @@ int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struct HdfSB return HDF_SUCCESS; } -int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, +static int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; @@ -1228,7 +1398,7 @@ int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct Hd audioCard = StreamHostGetCardInstance(client); if (audioCard == NULL || audioCard->rtd == NULL) { - ADM_LOG_ERR("DspEqualizer get card instance or rtd fail."); + ADM_LOG_ERR("DspEqualizer get card instance or rtd failed."); return HDF_FAILURE; } rtd = audioCard->rtd; @@ -1241,7 +1411,7 @@ int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct Hd ret = dspDev->devData->Equalizer(audioCard, (void*)data, dspDev); if (ret != HDF_SUCCESS) { - ADM_LOG_ERR("Equalizer render pause fail ret=%d", ret); + ADM_LOG_ERR("Equalizer render pause failed ret=%d", ret); return HDF_ERR_IO; } @@ -1250,48 +1420,42 @@ int32_t StreamHostDspEqualizer(const struct HdfDeviceIoClient *client, struct Hd } static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { - {AUDIO_DRV_PCM_IOCTRL_HW_PARAMS, StreamHostHwParams}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_PREPARE, StreamHostRenderPrepare}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_PREPARE, StreamHostCapturePrepare}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_OPEN, StreamHostRenderOpen}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_CLOSE, StreamHostRenderClose}, - {AUDIO_DRV_PCM_IOCTRL_WRITE, StreamHostWrite}, - {AUDIO_DRV_PCM_IOCTRL_READ, StreamHostRead}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_START, StreamHostRenderStart}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_STOP, StreamHostRenderStop}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_OPEN, StreamHostCaptureOpen}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_CLOSE, StreamHostCaptureClose}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_START, StreamHostCaptureStart}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_STOP, StreamHostCaptureStop}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_PAUSE, StreamHostRenderPause}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_PAUSE, StreamHostCapturePause}, - {AUDIO_DRV_PCM_IOCTRL_RENDER_RESUME, StreamHostRenderResume}, - {AUDIO_DRV_PCM_IOCTRL_CAPTURE_RESUME, StreamHostCaptureResume}, + {AUDIO_DRV_PCM_IOCTL_WRITE, StreamHostWrite}, + {AUDIO_DRV_PCM_IOCTL_READ, StreamHostRead}, + {AUDIO_DRV_PCM_IOCTL_HW_PARAMS, StreamHostHwParams}, + {AUDIO_DRV_PCM_IOCTL_RENDER_PREPARE, StreamHostRenderPrepare}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_PREPARE, StreamHostCapturePrepare}, + {AUDIO_DRV_PCM_IOCTL_RENDER_OPEN, StreamHostRenderOpen}, + {AUDIO_DRV_PCM_IOCTL_RENDER_CLOSE, StreamHostRenderClose}, + {AUDIO_DRV_PCM_IOCTL_RENDER_START, StreamHostRenderStart}, + {AUDIO_DRV_PCM_IOCTL_RENDER_STOP, StreamHostRenderStop}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_OPEN, StreamHostCaptureOpen}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_CLOSE, StreamHostCaptureClose}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_START, StreamHostCaptureStart}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP, StreamHostCaptureStop}, + {AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE, StreamHostRenderPause}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE, StreamHostCapturePause}, + {AUDIO_DRV_PCM_IOCTL_RENDER_RESUME, StreamHostRenderResume}, + {AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME, StreamHostCaptureResume}, {AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER, StreamHostMmapWrite}, {AUDIO_DRV_PCM_IOCTL_MMAP_BUFFER_CAPTURE, StreamHostMmapRead}, {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, StreamHostMmapPositionWrite}, {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, StreamHostMmapPositionRead}, + {AUDIO_DRV_PCM_IOCTL_DSPDECODE, StreamHostDspDecode}, + {AUDIO_DRV_PCM_IOCTL_DSPENCODE,StreamHostDspEncode}, + {AUDIO_DRV_PCM_IOCTL_DSPEQUALIZER,StreamHostDspEqualizer}, }; -int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, +static int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) { - unsigned int i = 0; - - if ((client == NULL) || (data == NULL) || (reply == NULL)) { - return HDF_ERR_INVALID_PARAM; - } - - if (cmdId >= AUDIO_DRV_PCM_IOCTRL_BUTT || cmdId < 0) { - ADM_LOG_ERR("invalid [cmdId=%d]", cmdId); - return HDF_FAILURE; - } - - for (i = 0; i < sizeof(g_streamDispCmdHandle) / sizeof(g_streamDispCmdHandle[0]); ++i) { + unsigned int count = sizeof(g_streamDispCmdHandle) / sizeof(g_streamDispCmdHandle[0]); + for (int i = 0; i < count; ++i) { if ((cmdId == (int)(g_streamDispCmdHandle[i].cmd)) && (g_streamDispCmdHandle[i].func != NULL)) { return g_streamDispCmdHandle[i].func(client, data, reply); } } + ADM_LOG_ERR("invalid [cmdId=%d]", cmdId); return HDF_FAILURE; } @@ -1303,7 +1467,7 @@ static struct StreamHost *StreamHostCreateAndBind(struct HdfDeviceObject *device struct StreamHost *streamHost = (struct StreamHost *)OsalMemCalloc(sizeof(*streamHost)); if (streamHost == NULL) { - ADM_LOG_ERR("malloc host fail!"); + ADM_LOG_ERR("malloc host failed!"); return NULL; } streamHost->device = device; diff --git a/model/audio/sapm/include/audio_sapm.h b/model/audio/sapm/include/audio_sapm.h index 7d39f43e9..20c0f6568 100755 --- a/model/audio/sapm/include/audio_sapm.h +++ b/model/audio/sapm/include/audio_sapm.h @@ -17,23 +17,6 @@ extern "C" { #endif #endif /* __cplusplus */ -#define SAPM_POLL_TIME 10000 /* 10s */ -#define SAPM_SLEEP_TIME (3 * 60000) /* 3min */ - -#define MIXER_REG_ADDR 10 /* mixer address -- Temporarily defined as this value */ - -#define SAPM_POWER_DOWN 0 -#define SAPM_POWER_UP 1 - -#define CONNECT_CODEC_PIN 1 -#define UNCONNECT_CODEC_PIN 0 - -#define EXIST_EXTERNAL_WIDGET 1 -#define UNEXIST_EXTERNAL_WIDGET 1 - -#define CONNECT_SINK_AND_SOURCE 1 -#define UNCONNECT_SINK_AND_SOURCE 0 - /* sapm widget types */ enum AudioSapmType { AUDIO_SAPM_INPUT = 0, /* input pin */ @@ -66,27 +49,6 @@ enum AudioSapmType { AUDIO_SAPM_SINK, }; -/* component has no PM register bit */ -#define AUDIO_SAPM_NOPM (-1) - -/* dapm stream operations */ -#define AUDIO_SAPM_STREAM_NOP 0x0 -#define AUDIO_SAPM_STREAM_START 0x1 -#define AUDIO_SAPM_STREAM_STOP 0x2 -#define AUDIO_SAPM_STREAM_SUSPEND 0x4 -#define AUDIO_SAPM_STREAM_RESUME 0x8 -#define AUDIO_SAPM_STREAM_PAUSE_PUSH 0x10 -#define AUDIO_SAPM_STREAM_PAUSE_RELEASE 0x20 - -/* sapm event types */ -#define AUDIO_SAPM_PRE_PMU 0x1 /* before component power up */ -#define AUDIO_SAPM_POST_PMU 0x2 /* after component power up */ -#define AUDIO_SAPM_PRE_PMD 0x4 /* before component power down */ -#define AUDIO_SAPM_POST_PMD 0x8 /* after component power down */ -#define AUDIO_SAPM_PRE_REG 0x10 /* before audio path setup */ -#define AUDIO_SAPM_POST_REG 0x20 /* after audio path setup */ -#define AUDIO_SAPM_PRE_POST_PMD (AUDIO_SAPM_PRE_PMD | AUDIO_SAPM_POST_PMD) - enum AudioBiasLevel { AUDIO_BIAS_OFF = 0, AUDIO_BIAS_STANDBY = 1, @@ -206,9 +168,7 @@ int32_t AudioSapmNewComponents(struct AudioCard *audioCard, int32_t AudioSapmAddRoutes(struct AudioCard *audioCard, const struct AudioSapmRoute *route, int32_t routeMaxNum); int32_t AudioSapmNewControls(struct AudioCard *audioCard); -int AudioSapmPowerComponents(struct AudioCard *audioCard); int32_t AudioSapmSleep(const struct AudioCard *audioCard); -uint64_t AudioSapmRefreshTime(bool bRefresh); int32_t AudioSampPowerUp(const struct AudioCard *card); int32_t AudioSampSetPowerMonitor(struct AudioCard *card, bool powerMonitorState); diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index a0d26e327..da7f723bd 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -14,7 +14,23 @@ #define HDF_LOG_TAG audio_sapm +#define SAPM_POLL_TIME 10000 /* 10s */ +#define SAPM_SLEEP_TIME (3 * 60000) /* 3min */ + +#define SAPM_POWER_DOWN 0 +#define SAPM_POWER_UP 1 + +#define CONNECT_CODEC_PIN 1 +#define UNCONNECT_CODEC_PIN 0 + +#define EXIST_EXTERNAL_WIDGET 1 +#define UNEXIST_EXTERNAL_WIDGET 1 + +#define CONNECT_SINK_AND_SOURCE 1 +#define UNCONNECT_SINK_AND_SOURCE 0 + static void AudioSapmEnterSleep(uintptr_t para); +static uint64_t AudioSapmRefreshTime(bool bRefresh); /* power up sequences */ static int32_t g_audioSapmPowerUpSeq[] = { @@ -940,7 +956,7 @@ static void AudioSapmPowerDownSeqRun(const struct DListHead *list) return; } -int AudioSapmPowerComponents(struct AudioCard *audioCard) +static int AudioSapmPowerComponents(struct AudioCard *audioCard) { struct AudioSapmComponent *sapmComponent = NULL; struct DListHead upList; @@ -1254,13 +1270,14 @@ int32_t AudioAccessorySapmSetCtrlOps(const struct AudioKcontrol *kcontrol, const return HDF_SUCCESS; } -uint64_t AudioSapmRefreshTime(bool bRefresh) +static uint64_t AudioSapmRefreshTime(bool bRefresh) { static uint64_t time = 0; if (bRefresh) { time = OsalGetSysTimeMs(); g_audioSapmIsSleep = false; + g_audioSapmIsStandby = false; } return time; } diff --git a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp index d56b40374..a58531925 100755 --- a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp +++ b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp @@ -38,33 +38,64 @@ void AudioSapmTest::TearDown() { } -HWTEST_F(AudioSapmTest, AudioSapmTest001, TestSize.Level1) +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSapmNewComponents, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTNEWCOMPONENT, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAPMNEWCOMPONENTS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest002, TestSize.Level1) +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSapmAddRoutes, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTADDROUTES, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAPMADDROUTES, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest003, TestSize.Level1) +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSapmNewControls, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTNEWCONTROLS, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAPMNEWCONTROLS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest004, TestSize.Level1) +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSapmSleep, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTPOWERCOMPONET, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAPMSLEEP, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -HWTEST_F(AudioSapmTest, AudioSapmTest005, TestSize.Level1) +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSampPowerUp, TestSize.Level1) { - struct HdfTestMsg msg = {g_testAudioType, TESTREFRESHTIME, -1}; + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAMPPOWERUP, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } + +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioSampSetPowerMonitor, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOSAMPSETPOWERMONITOR, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioCodecSapmSetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECSAPMSETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioCodecSapmGetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOCODECSAPMGETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioAccessorySapmSetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYSAPMSETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +HWTEST_F(AudioSapmTest, AudioSapmTest_AudioAccessorySapmGetCtrlOps, TestSize.Level1) +{ + struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYSAPMGETCTRLOPS, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + } diff --git a/test/unittest/model/audio/include/audio_accessory_base_test.h b/test/unittest/model/audio/include/audio_accessory_base_test.h new file mode 100644 index 000000000..b717401cb --- /dev/null +++ b/test/unittest/model/audio/include/audio_accessory_base_test.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_ACCESSORY_BASE_TEST_H +#define AUDIO_ACCESSORY_BASE_TEST_H + +#include "hdf_types.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t AccessoryI2cReadWriteTest(void); +int32_t AccessoryRegBitsReadTest(void); +int32_t AccessoryRegBitsUpdateTest(void); + +int32_t AcessoryDeviceFrequencyParseTest(void); +int32_t AccessoryDaiParamsUpdateTest(void); +int32_t AccessoryDeviceCfgGetTest(void); +int32_t AccessoryDeviceCtrlRegInitTest(void); +int32_t AccessoryDeviceRegReadTest(void); +int32_t AccessoryDeviceRegWriteTest(void); +int32_t AccessoryGetConfigInfoTest(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_ACCESSORY_BASE_TEST_H */ diff --git a/test/unittest/model/audio/src/audio_stream_dispatch_test.c b/test/unittest/model/audio/include/audio_codec_base_test.h old mode 100755 new mode 100644 similarity index 30% rename from test/unittest/model/audio/src/audio_stream_dispatch_test.c rename to test/unittest/model/audio/include/audio_codec_base_test.h index 2d0f1c89f..c91aa271f --- a/test/unittest/model/audio/src/audio_stream_dispatch_test.c +++ b/test/unittest/model/audio/include/audio_codec_base_test.h @@ -5,25 +5,28 @@ * the GPL, or the BSD license, at your option. * See the LICENSE file in the root of this repository for complete details. */ -#include "audio_stream_dispatch_test.h" -#include "audio_stream_dispatch.h" -#define HDF_LOG_TAG audio_host_test +#ifndef AUDIO_CODEC_BASE_TEST_H +#define AUDIO_CODEC_BASE_TEST_H -int32_t AudioControlDispatchTestStreamDispatch(void) -{ - struct HdfDeviceIoClient *client = NULL; - struct HdfSBuf *data = NULL; - struct HdfSBuf *reply = NULL; - int32_t cmdId = 0; - int32_t ret; - HDF_LOGI("%s: enter", __func__); +#include "hdf_types.h" - ret = StreamDispatch(client, cmdId, data, reply); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: (client || cmdId || data ||reply) is NULL", __func__); - } +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ - HDF_LOGI("%s: success", __func__); - return HDF_SUCCESS; +int32_t CodecGetServiceNameTest(void); +int32_t CodecGetDaiNameTest(void); +int32_t CodecGetConfigInfoTest(void); +int32_t CodecSetConfigInfoTest(void); +int32_t CodecSetCtlFuncTest(void); + +#ifdef __cplusplus +#if __cplusplus } +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_CODEC_BASE_TEST_H */ diff --git a/test/unittest/model/audio/include/audio_core_test.h b/test/unittest/model/audio/include/audio_core_test.h index 0481e9271..5f4b72a1e 100755 --- a/test/unittest/model/audio/include/audio_core_test.h +++ b/test/unittest/model/audio/include/audio_core_test.h @@ -17,28 +17,39 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t AudioSocTestRegisterPlatform(void); -int32_t AudioSocTestRegisterDai(void); -int32_t AudioTestRegisterAccessory(void); -int32_t AudioTestRegisterCodec(void); -int32_t AudioTestRegisterDsp(void); -int32_t AudioTestSocDeviceRegister(void); -int32_t AudioTestBindDaiLink(void); -int32_t AudioTestUpdateCodecRegBits(void); -int32_t AudioTestUpdateAccessoryRegBits(void); -int32_t AudioTestKcontrolGetCodec(void); -int32_t AudioTestKcontrolGetAccessory(void); -int32_t AudioTestAddControl(void); -int32_t AudioTestAddControls(void); -int32_t AudioTestCodecReadReg(void); -int32_t AudioTestAccessoryReadReg(void); -int32_t AudioTestCodecWriteReg(void); -int32_t AudioTestAccessoryWriteReg(void); -int32_t AudioTestInfoCtrlOps(void); -int32_t AudioTestCodecGetCtrlOps(void); -int32_t AudioTestAccessoryGetCtrlOps(void); -int32_t AudioTestCodecSetCtrlOps(void); -int32_t AudioTestAccessorySetCtrlOps(void); +int32_t AudioDeviceReadRegTest(void); +int32_t AudioDeviceWriteRegTest(void); +int32_t AudioSocRegisterPlatformTest(void); +int32_t AudioSocRegisterDaiTest(void); +int32_t AudioRegisterDspTest(void); +int32_t AudioRegisterCodecTest(void); +int32_t AudioRegisterAccessoryTest(void); +int32_t AudioBindDaiLinkTest(void); +int32_t AudioUpdateCodecRegBitsTest(void); +int32_t AudioUpdateAccessoryRegBitsTest(void); +int32_t AudioUpdateDaiRegBitsTest(void); +int32_t AudioKcontrolGetCpuDaiTest(void); +int32_t AudioKcontrolGetCodecTest(void); +int32_t AudioKcontrolGetAccessoryTest(void); +int32_t AudioAddControlsTest(void); +int32_t AudioAddControlTest(void); +int32_t AudioGetCtrlOpsRRegTest(void); +int32_t AudioGetCtrlOpsRegTest(void); +int32_t AudioSetCtrlOpsRegTest(void); +int32_t AudioSetCtrlOpsRRegTest(void); +int32_t AudioDaiReadRegTest(void); +int32_t AudioDaiWriteRegTest(void); +int32_t AudioCodecReadRegTest(void); +int32_t AudioCodecWriteRegTest(void); +int32_t AudioAccessoryReadRegTest(void); +int32_t AudioAccessoryWriteRegTest(void); +int32_t AudioInfoCtrlOpsTest(void); +int32_t AudioCodecGetCtrlOpsTest(void); +int32_t AudioCodecSetCtrlOpsTest(void); +int32_t AudioAccessoryGetCtrlOpsTest(void); +int32_t AudioAccessorySetCtrlOpsTset(void); +int32_t AudioCpuDaiSetCtrlOpsTest(void); +int32_t AudioCpuDaiGetCtrlOpsTest(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/audio_dai_base_test.h b/test/unittest/model/audio/include/audio_dai_base_test.h new file mode 100644 index 000000000..ce1e0d4a0 --- /dev/null +++ b/test/unittest/model/audio/include/audio_dai_base_test.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DAI_BASE_TEST_H +#define AUDIO_DAI_BASE_TEST_H + +#include "hdf_types.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t DaiDataFromCardTest(void); +int32_t DaiGetConfigInfoTest(void); +int32_t DaiCheckSampleRateTest(void); +int32_t DaiSetConfigInfoTest(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_DAI_BASE_TEST_H */ diff --git a/test/unittest/model/audio/include/audio_dma_base_test.h b/test/unittest/model/audio/include/audio_dma_base_test.h new file mode 100644 index 000000000..84cb7f95a --- /dev/null +++ b/test/unittest/model/audio/include/audio_dma_base_test.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_DMA_BASE_TEST_H +#define AUDIO_DMA_BASE_TEST_H + +#include "hdf_types.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t AudioDmaBufAllocTest(void); +int32_t AudioDmaBufFreeTest(void); +int32_t AudioDmaRequestChannelTest(void); +int32_t AudioDmaConfigChannelTest(void); +int32_t AudioDmaPrepTest(void); +int32_t AudioDmaSubmitTest(void); +int32_t AudioDmaPendingTest(void); +int32_t AudioDmaPauseTest(void); +int32_t AudioDmaResumeTest(void); +int32_t AudioDmaPointerTest(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_DMA_BASE_TEST_H */ diff --git a/test/unittest/model/audio/include/audio_stream_dispatch_test.h b/test/unittest/model/audio/include/audio_dsp_base_test.h old mode 100755 new mode 100644 similarity index 61% rename from test/unittest/model/audio/include/audio_stream_dispatch_test.h rename to test/unittest/model/audio/include/audio_dsp_base_test.h index 5891ff424..3a30a0d7f --- a/test/unittest/model/audio/include/audio_stream_dispatch_test.h +++ b/test/unittest/model/audio/include/audio_dsp_base_test.h @@ -6,24 +6,24 @@ * See the LICENSE file in the root of this repository for complete details. */ -#ifndef AUDIO_STREAM_DISPATCH_TEST_H -#define AUDIO_STREAM_DISPATCH_TEST_H +#ifndef AUDIO_DSP_BASE_TEST_H +#define AUDIO_DSP_BASE_TEST_H #include "hdf_types.h" #ifdef __cplusplus #if __cplusplus -extern "C" -{ +extern "C" { #endif -#endif -int32_t AudioControlDispatchTestStreamDispatch(void); -int32_t AudioControlDispatchTestStreamHostDestroy(void); +#endif /* __cplusplus */ + +int32_t DspGetServiceNameTest(void); +int32_t DspGetDaiNameTest(void); #ifdef __cplusplus #if __cplusplus } #endif -#endif +#endif /* __cplusplus */ -#endif +#endif /* AUDIO_DSP_BASE_TEST_H */ diff --git a/test/unittest/model/audio/include/audio_host_test.h b/test/unittest/model/audio/include/audio_host_test.h index abb05d3ac..c4e88e6dd 100755 --- a/test/unittest/model/audio/include/audio_host_test.h +++ b/test/unittest/model/audio/include/audio_host_test.h @@ -17,8 +17,8 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t AudioKcontrolTestGetCodec(void); -int32_t GetCardTestInstance(void); +int32_t AudioHostCreateAndBindTest(void); +int32_t GetCardInstanceTest(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/audio_parse_test.h b/test/unittest/model/audio/include/audio_parse_test.h index 1e070050b..30aa73443 100755 --- a/test/unittest/model/audio/include/audio_parse_test.h +++ b/test/unittest/model/audio/include/audio_parse_test.h @@ -17,7 +17,8 @@ extern "C" { #endif #endif /* __cplusplus */ -int32_t AudioFillTestConfigData(void); +int32_t AudioFillConfigDataTest(void); +int32_t CodecGetRegConfigTest(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/audio_platform_base_test.h b/test/unittest/model/audio/include/audio_platform_base_test.h new file mode 100644 index 000000000..f88a37be7 --- /dev/null +++ b/test/unittest/model/audio/include/audio_platform_base_test.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef AUDIO_PLATFORM_BASE_TEST_H +#define AUDIO_PLATFORM_BASE_TEST_H + +#include "hdf_types.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int32_t PlatformDataFromCardTest(void); +int32_t AudioBytesToFramesTest(void); +int32_t AudioDataBigEndianChangeTest(void); +int32_t AudioFramatToBitWidthTest(void); +int32_t AudioSetPcmInfoTest(void); +int32_t AudioSetRenderBufInfoTest(void); +int32_t AudioSetCaptureBufInfoTest(void); +int32_t AudioPcmWriteTest(void); +int32_t AudioPcmReadTest(void); +int32_t AudioPcmMmapWriteTest(void); +int32_t AudioPcmMmapReadTest(void); +int32_t AudioRenderOpenTest(void); +int32_t AudioCaptureOpenTest(void); +int32_t AudioRenderCloseTest(void); +int32_t AudioPcmPointerTest(void); +int32_t AudioCaptureCloseTest(void); +int32_t AudioHwParamsTest(void); +int32_t AudioRenderPrepareTest(void); +int32_t AudioCapturePrepareTest(void); +int32_t AudioRenderTriggerTest(void); +int32_t AudioCaptureTriggerTest(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* AUDIO_PLATFORM_BASE_TEST_H */ diff --git a/test/unittest/model/audio/include/audio_sapm_test.h b/test/unittest/model/audio/include/audio_sapm_test.h index f3666c028..3248b3231 100755 --- a/test/unittest/model/audio/include/audio_sapm_test.h +++ b/test/unittest/model/audio/include/audio_sapm_test.h @@ -17,11 +17,17 @@ extern "C" { #endif #endif -int32_t AudioSapmTestNewComponents(void); -int32_t AudioSapmTestAddRoutes(void); -int32_t AudioSapmTestNewControls(void); -int32_t AudioSapmTestPowerComponents(void); -int32_t AudioSapmTestRefreshTime(void); + +int32_t AudioSapmNewComponentsTest(void); +int32_t AudioSapmAddRoutesTest(void); +int32_t AudioSapmNewControlsTest(void); +int32_t AudioSapmSleepTest(void); +int32_t AudioSampPowerUpTest(void); +int32_t AudioSampSetPowerMonitorTest(void); +int32_t AudioCodecSapmSetCtrlOpsTest(void); +int32_t AudioCodecSapmGetCtrlOpsTest(void); +int32_t AudioAccessorySapmSetCtrlOpsTest(void); +int32_t AudioAccessorySapmGetCtrlOpsTest(void); #ifdef __cplusplus #if __cplusplus diff --git a/test/unittest/model/audio/include/hdf_audio_test.h b/test/unittest/model/audio/include/hdf_audio_test.h index 9da3251a5..572998e1b 100755 --- a/test/unittest/model/audio/include/hdf_audio_test.h +++ b/test/unittest/model/audio/include/hdf_audio_test.h @@ -18,47 +18,114 @@ extern "C" { #endif /* __cplusplus */ typedef enum { - AUDIO_DRIVER_TESTGETCODEC, - AUDIO_DRIVER_TESTGETCARDINSTANCE, - AUDIO_DRIVER_TESTGETCCNFIGDATA, - AUDIO_DRIVER_TESTREGISTERPLATFORM, - AUDIO_DRIVER_TESTREGISTERDAI, - AUDIO_DRIVER_TESTREGISTERACCESSORY, - AUDIO_DRIVER_TESTREGISTERCODEC, - AUDIO_DRIVER_TESTREGISTERDSP, - AUDIO_DRIVER_TESTSOCDEVICEREGISTER, - AUDIO_DRIVER_TESTBINDDAILINK, - AUDIO_DRIVER_TESTUPDATECODECREGBITS, - AUDIO_DRIVER_TESTUPDATEACCESSORYREGBITS, - AUDIO_DRIVER_TESTUPDATECODECAIAOREGBITS, - AUDIO_DRIVER_TESTUPDATEACCESSORYAIAOREGBITS, - AUDIO_DRIVER_TESTKCONTROLGETCODEC, - AUDIO_DRIVER_TESTKCONTROLGETACCESSORY, - AUDIO_DRIVER_TESTADDCONTROL, - AUDIO_DRIVER_TESTADDCONTROLS, - AUDIO_DRIVER_TESTCODECREADREG, - AUDIO_DRIVER_TESTACCESSORYREADREG, - AUDIO_DRIVER_TESTCODECAIAOREADREG, - AUDIO_DRIVER_TESTACCESSORYAIAOREADREG, - AUDIO_DRIVER_TESTCODECWRITEREG, - AUDIO_DRIVER_TESTACCESSORYWRITEREG, - AUDIO_DRIVER_TESTCODECAIAOWRITEREG, - AUDIO_DRIVER_TESTACCESSORYAIAOWRITEREG, - AUDIO_DRIVER_TESTINFOCTRLOPS, - AUDIO_DRIVER_TESTCODECGETCTRLOPS, - AUDIO_DRIVER_TESTACCESSORYGETCTRLOPS, - AUDIO_DRIVER_TESTCODECAIAOGETCTRLOPS, - AUDIO_DRIVER_TESTACCESSORYAIAOGETCTRLOPS, - AUDIO_DRIVER_TESTCODECSETCTRLOPS, - AUDIO_DRIVER_TESTACCESSORYSETCTRLOPS, - AUDIO_DRIVER_TESTCODECAIAOSETCTRLOPS, - AUDIO_DRIVER_TESTACCESSORYAIAOSETCTRLOPS, - AUDIO_DRIVER_TESTNEWCOMPONENT, - AUDIO_DRIVER_TESTADDROUTES, - AUDIO_DRIVER_TESTNEWCONTROLS, - AUDIO_DRIVER_TESTPOWERCOMPONET, - AUDIO_DRIVER_TESTREFRESHTIME, - AUDIO_DRIVER_TESTSTREAMDISPATCH, + AUDIO_ADM_TEST_AUDIOHOSTCREATEANDBIND = 1, // audio ADM audio_host + AUDIO_ADM_TEST_GETCARDINSTANCE = 2, // audio ADM audio_host + + AUDIO_ADM_TEST_AUDIOFILLCONFIGDATA = 3, // audio ADM audio_parse + AUDIO_ADM_TEST_CODECGETREGCONFIG = 4, // audio ADM audio_parse + + AUDIO_ADM_TEST_AUDIODEVICEREADREG = 5, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIODEVICEWRITEREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOSOCREGISTERPLATFORM, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOSOCREGISTERDAI, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOREGISTERDSP, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOREGISTERCODEC, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOREGISTERACCESSORY, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOBINDDAILINK, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOUPDATECODECREGBITS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOUPDATEACCESSORYREGBITS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOUPDATEDAIREGBITS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOKCONTROLGETCPUDAI, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOKCONTROLGETCODEC, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOKCONTROLGETACCESSORY, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOADDCONTROLS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOADDCONTROL, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOGETCTRLOPSRREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOGETCTRLOPSREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOSETCTRLOPSREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOSETCTRLOPSRREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIODAIREADREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIODAIWRITEREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCODECREADREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCODECWRITEREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOACCESSORYREADREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOACCESSORYWRITEREG, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOINFOCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCODECGETCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCODECSETCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOACCESSORYGETCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOACCESSORYSETCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCPUDAISETCTRLOPS, // audio ADM audio_core + AUDIO_ADM_TEST_AUDIOCPUDAIGETCTRLOPS = 37, // audio ADM audio_core + + AUDIO_ADM_TEST_AUDIOSAPMNEWCOMPONENTS = 38, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOSAPMADDROUTES, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOSAPMNEWCONTROLS, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOSAPMSLEEP, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOSAMPPOWERUP, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOSAMPSETPOWERMONITOR, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOCODECSAPMSETCTRLOPS, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOCODECSAPMGETCTRLOPS, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOACCESSORYSAPMSETCTRLOPS, // audio ADM audio_sapm + AUDIO_ADM_TEST_AUDIOACCESSORYSAPMGETCTRLOPS = 47, // audio ADM audio_sapm + + AUDIO_ADM_TEST_I2CREADWRITE, // audio ADM audio_accessory_base + AUDIO_ADM_TEST_REGBITSREAD, + AUDIO_ADM_TEST_REGBITSUPDATE, + AUDIO_ADM_TEST_DEVICEFREQUENCYPARSE, + AUDIO_ADM_TEST_DAIPARAMSUPDATE, + AUDIO_ADM_TEST_DEVICECFGGET, + AUDIO_ADM_TEST_DEVICECTRLREGINIT, + AUDIO_ADM_TEST_DEVICEREGREAD, + AUDIO_ADM_TEST_DEVICEREGWRITE, + AUDIO_ADM_TEST_AGETCONFIGINFO, + + AUDIO_ADM_TEST_GETSERVICENAME, // audio ADM audio_codec_base + AUDIO_ADM_TEST_GETDAINAME, + AUDIO_ADM_TEST_GETCONFIGINFO, + AUDIO_ADM_TEST_SETCONFIGINFO, + AUDIO_ADM_TEST_SETCTLFUNC, + + AUDIO_ADM_TEST_DAIDATAFROMCARD, // audio ADM audio_dai_base + AUDIO_ADM_TEST_DAIGETCONFIGINFO, + AUDIO_ADM_TEST_DAICHECKSAMPLERATE, + AUDIO_ADM_TEST_DAISETCONFIGINFO, + + AUDIO_ADM_TEST_DMABUFALLOC, // audio ADM audio_dma_base + AUDIO_ADM_TEST_DMABUFFREE, + AUDIO_ADM_TEST_DMAREQUESTCHANNEL, + AUDIO_ADM_TEST_DMACONFIGCHANNEL, + AUDIO_ADM_TEST_DMAPREP, + AUDIO_ADM_TEST_DMASUBMIT, + AUDIO_ADM_TEST_DMAPENDING, + AUDIO_ADM_TEST_DMAPAUSE, + AUDIO_ADM_TEST_DMARESUME, + AUDIO_ADM_TEST_DMAPOINTER, + + AUDIO_ADM_TEST_DSPGETSERVICENAME, // audio ADM audio_dsp_base + AUDIO_ADM_TEST_DSPGETDAINAME, + + AUDIO_ADM_TEST_DATAFROMCARD, // audio ADM audio_platform_base + AUDIO_ADM_TEST_BYTESTOFRAMES, + AUDIO_ADM_TEST_DATABIGENDIANCHANGE, + AUDIO_ADM_TEST_FRAMATTOBITWIDTH, + AUDIO_ADM_TEST_SETPCMINFO, + AUDIO_ADM_TEST_SETRENDERBUFINFO, + AUDIO_ADM_TEST_SETCAPTUREBUFINFO, + AUDIO_ADM_TEST_PCMWRITE, + AUDIO_ADM_TEST_PCMREAD, + AUDIO_ADM_TEST_PCMMMAPWRITE, + AUDIO_ADM_TEST_PCMMMAPREAD, + AUDIO_ADM_TEST_RENDEROPEN, + AUDIO_ADM_TEST_CAPTUREOPEN, + AUDIO_ADM_TEST_RENDERCLOSE, + AUDIO_ADM_TEST_PCMPOINTER, + AUDIO_ADM_TEST_CAPTURECLOSE, + AUDIO_ADM_TEST_HWPARAMS, + AUDIO_ADM_TEST_RENDERPREPARE, + AUDIO_ADM_TEST_CAPTUREPREPARE, + AUDIO_ADM_TEST_RENDERTRIGGER, + AUDIO_ADM_TEST_CAPTURETRIGGER, } HdfAudioTestCaseCmd; int32_t HdfAudioEntry(HdfTestMsg *msg); diff --git a/test/unittest/model/audio/src/audio_accessory_base_test.c b/test/unittest/model/audio/src/audio_accessory_base_test.c new file mode 100644 index 000000000..13aac47a6 --- /dev/null +++ b/test/unittest/model/audio/src/audio_accessory_base_test.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_accessory_base_test.h" +#include "audio_accessory_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_accessory_base_test + +static struct AudioMixerControl g_TestReg = { + .min = 0, + .max = 0, + .platformMax = 0, + .mask = 0, + .reg = 0, + .rreg = 0, + .shift= 0, + .rshift = 0, + .invert = 0, + .value = 0, +}; + +int32_t AccessoryI2cReadWriteTest(void) +{ + struct AudioAddrConfig addrConfig; + + if (AccessoryI2cReadWrite(NULL, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AccessoryI2cReadWrite(&addrConfig, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AccessoryRegBitsReadTest(void) +{ + uint32_t regValue = 0; + + if (AccessoryRegBitsRead(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AccessoryRegBitsRead(&g_TestReg, ®Value) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AccessoryRegBitsUpdateTest(void) +{ + if (AccessoryRegBitsUpdate(g_TestReg) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + + +int32_t AcessoryDeviceFrequencyParseTest(void) +{ + uint16_t freq = 0; + if (AcessoryDeviceFrequencyParse(0, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AcessoryDeviceFrequencyParse(0, &freq) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AccessoryDaiParamsUpdateTest(void) +{ + struct DaiParamsVal value; + + value.channelVal = 1; // 1 is dma channel + if (AccessoryDaiParamsUpdate(value) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceCfgGetTest(void) +{ + + struct AccessoryData accessoryData; + struct AccessoryTransferData accessoryTransferData; + if (AccessoryDeviceCfgGet(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + memset(&accessoryData, 0, sizeof(struct AccessoryData)); + memset(&accessoryTransferData, 0, sizeof(struct AccessoryTransferData)); + if (AccessoryDeviceCfgGet(&accessoryData, &accessoryTransferData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceCtrlRegInitTest(void) +{ + if (AccessoryDeviceCtrlRegInit() == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceRegReadTest(void) +{ + uint32_t val; + struct AccessoryDevice codec; + if (AccessoryDeviceRegRead(NULL, 0, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AccessoryDeviceRegRead(&codec, 0, &val) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AccessoryDeviceRegWriteTest(void) +{ + struct AccessoryDevice codec; + if (AccessoryDeviceRegWrite(NULL, 0, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AccessoryDeviceRegWrite(&codec, 0, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AccessoryGetConfigInfoTest(void) +{ + struct HdfDeviceObject device; + struct AccessoryData codecData; + + if (AccessoryGetConfigInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AccessoryGetConfigInfo(&device, &codecData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + diff --git a/test/unittest/model/audio/src/audio_codec_base_test.c b/test/unittest/model/audio/src/audio_codec_base_test.c new file mode 100644 index 000000000..7c90f655a --- /dev/null +++ b/test/unittest/model/audio/src/audio_codec_base_test.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_codec_base_test.h" +#include "audio_codec_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_codec_base_test + +int32_t CodecGetServiceNameTest(void) +{ + struct HdfDeviceObject device; + const char *drvCodecName = ""; + + if (CodecGetServiceName(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (CodecGetServiceName(&device, &drvCodecName) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t CodecGetDaiNameTest(void) +{ + struct HdfDeviceObject device; + const char *drvCodecName = ""; + + if (CodecGetDaiName(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (CodecGetDaiName(&device, &drvCodecName) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t CodecGetConfigInfoTest(void) +{ + struct HdfDeviceObject device; + struct CodecData codecData; + + if (CodecGetConfigInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (CodecGetConfigInfo(&device, &codecData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t CodecSetConfigInfoTest(void) +{ + struct DaiData device; + struct CodecData codecData; + + memset(&device, 0, sizeof(struct DaiData)); + memset(&codecData, 0, sizeof(struct CodecData)); + if (CodecSetConfigInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (CodecSetConfigInfo(&codecData, &device) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t CodecSetCtlFuncTest(void) +{ + struct CodecData codeData; + + if (CodecSetCtlFunc(NULL, NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (CodecSetCtlFunc(&codeData, NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} diff --git a/test/unittest/model/audio/src/audio_core_test.c b/test/unittest/model/audio/src/audio_core_test.c index 4d10e3390..5b4a1910f 100755 --- a/test/unittest/model/audio/src/audio_core_test.c +++ b/test/unittest/model/audio/src/audio_core_test.c @@ -12,13 +12,8 @@ #include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_core_test -#define AUDIO_CORE_SERVICE_TEST_NAME "hdf_audio_codec_dev0" -#define PLATFORM_TEST_NAME "codec_service_1" -#define PLATFORM_CODEC_TEST_NAME "codec_service_0" -#define ACCESSORY_DAI_TEST_NAME "accessory_dai" -#define DSP_TEST_NAME "dsp_service_0" -const struct AudioMixerControl g_audioMixerRegParams = { +static struct AudioMixerControl g_audioTestReg = { .reg = 0x2004, /* [0] output volume */ .rreg = 0x2004, /* register value */ .shift = 8, /* offset */ @@ -29,8 +24,35 @@ const struct AudioMixerControl g_audioMixerRegParams = { .invert = 0, /* invert */ }; -int32_t AudioSocTestRegisterPlatform(void) +static int32_t AudioDeviceReadRegMock(unsigned long virtualAddress, uint32_t reg, uint32_t *value) { + return HDF_SUCCESS; +} + +static int32_t AudioDeviceWriteRegMock(unsigned long virtualAddress, uint32_t reg, uint32_t value) +{ + return HDF_SUCCESS; +} + +int32_t AudioDeviceReadRegTest(void) +{ + int value; + HDF_LOGI("%s: enter", __func__); + return AudioDeviceReadRegMock(0 ,0, &value); + HDF_LOGI("%s: success", __func__); +} + +int32_t AudioDeviceWriteRegTest(void) +{ + HDF_LOGI("%s: enter", __func__); + return AudioDeviceWriteRegMock(0 ,0, 0);; + HDF_LOGI("%s: success", __func__); +} + +int32_t AudioSocRegisterPlatformTest(void) +{ + struct HdfDeviceObject *device = NULL; + struct PlatformData platformData; HDF_LOGI("%s: enter", __func__); if (AudioSocRegisterPlatform(NULL, NULL) == HDF_SUCCESS) { @@ -38,20 +60,20 @@ int32_t AudioSocTestRegisterPlatform(void) return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - struct PlatformData data = { - .drvPlatformName = PLATFORM_TEST_NAME, - }; - if (AudioSocRegisterPlatform(device, &data) != HDF_SUCCESS) { + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + (void)memset_s(&platformData, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); + platformData.drvPlatformName = "dma_service_0"; + if (AudioSocRegisterPlatform(device, &platformData) != HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioSocRegisterPlatform fail", __func__); return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } - -int32_t AudioSocTestRegisterDai(void) +int32_t AudioSocRegisterDaiTest(void) { + struct HdfDeviceObject *device = NULL; + struct DaiData data; HDF_LOGI("%s: enter", __func__); if (AudioSocRegisterDai(NULL, NULL) == HDF_SUCCESS) { @@ -59,10 +81,9 @@ int32_t AudioSocTestRegisterDai(void) return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - struct DaiData data = { - .drvDaiName = ACCESSORY_DAI_TEST_NAME, - }; + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + (void)memset_s(&data, sizeof(struct DaiData), 0, sizeof(struct DaiData)); + data.drvDaiName = "dai_service"; if (AudioSocRegisterDai(device, &data) != HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioSocRegisterDai fail", __func__, __LINE__); return HDF_FAILURE; @@ -72,33 +93,37 @@ int32_t AudioSocTestRegisterDai(void) return HDF_SUCCESS; } -int32_t AudioTestRegisterAccessory(void) +int32_t AudioRegisterDspTest(void) { + struct HdfDeviceObject *device = NULL; + struct DaiData daiData; + struct DspData dspData; HDF_LOGI("%s: enter", __func__); - if (AudioRegisterAccessory(NULL, NULL, NULL) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); + if (AudioRegisterDsp(NULL, NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - struct AccessoryData data = { - .drvAccessoryName = ACCESSORY_DAI_TEST_NAME, - }; - struct DaiData daiData = { - .drvDaiName = ACCESSORY_DAI_TEST_NAME, - }; - - if (AudioRegisterAccessory(device, &data, &daiData) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + (void)memset_s(&daiData, sizeof(struct DspData), 0, sizeof(struct DspData)); + (void)memset_s(&daiData, sizeof(struct DaiData), 0, sizeof(struct DaiData)); + dspData.drvDspName = "dsp_service_0", + daiData.drvDaiName = "dai_service"; + if (AudioRegisterDsp(device, &dspData, &daiData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); return HDF_FAILURE; } + HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestRegisterCodec(void) +int32_t AudioRegisterCodecTest(void) { + struct HdfDeviceObject *device = NULL; + struct DaiData daiData; + struct CodecData codecData; HDF_LOGI("%s: enter", __func__); if (AudioRegisterCodec(NULL, NULL, NULL) == HDF_SUCCESS) { @@ -106,13 +131,11 @@ int32_t AudioTestRegisterCodec(void) return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - struct CodecData codecData = { - .drvCodecName = ACCESSORY_DAI_TEST_NAME, - }; - struct DaiData daiData = { - .drvDaiName = ACCESSORY_DAI_TEST_NAME, - }; + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + (void)memset_s(&codecData, sizeof(struct CodecData), 0, sizeof(struct CodecData)); + (void)memset_s(&daiData, sizeof(struct DaiData), 0, sizeof(struct DaiData)); + codecData.drvCodecName = "codec_dai"; + daiData.drvDaiName = "dai_service"; if (AudioRegisterCodec(device, &codecData, &daiData) != HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioRegisterCodec fail", __func__, __LINE__); return HDF_FAILURE; @@ -122,25 +145,25 @@ int32_t AudioTestRegisterCodec(void) return HDF_SUCCESS; } -int32_t AudioTestRegisterDsp(void) +int32_t AudioRegisterAccessoryTest(void) { + struct HdfDeviceObject *device = NULL; + struct DaiData daiData; + struct AccessoryData accessoryData; HDF_LOGI("%s: enter", __func__); - if (AudioRegisterDsp(NULL, NULL, NULL) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); + if (AudioRegisterAccessory(NULL, NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - struct DaiData daiData = { - .drvDaiName = ACCESSORY_DAI_TEST_NAME, - }; - struct DspData dspData = { - .drvDspName = DSP_TEST_NAME, - }; - - if (AudioRegisterDsp(device, &dspData, &daiData) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioSocRegisterDsp fail", __func__, __LINE__); + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + (void)memset_s(&accessoryData, sizeof(struct AccessoryData), 0, sizeof(struct AccessoryData)); + (void)memset_s(&daiData, sizeof(struct DaiData), 0, sizeof(struct DaiData)); + accessoryData.drvAccessoryName = "accessory_dai"; + daiData.drvDaiName = "dai_service"; + if (AudioRegisterAccessory(device, &accessoryData, &daiData) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioRegisterAccessory fail", __func__, __LINE__); return HDF_FAILURE; } @@ -148,252 +171,325 @@ int32_t AudioTestRegisterDsp(void) return HDF_SUCCESS; } -int32_t AudioTestSocDeviceRegister(void) +int32_t AudioBindDaiLinkTest(void) { - struct { - char *name; - } data; - - enum AudioDeviceType deviceType = AUDIO_DAI_DEVICE; HDF_LOGI("%s: enter", __func__); - if (AudioSocDeviceRegister(NULL, NULL, deviceType) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + if (AudioBindDaiLink(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioBindDaiLink fail", __func__, __LINE__); return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - data.name = ACCESSORY_DAI_TEST_NAME; - if (AudioSocDeviceRegister(device, &data, deviceType) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioUpdateCodecRegBitsTest(void) +{ + struct CodecData codecData; + struct CodecDevice codec; + HDF_LOGI("%s: enter", __func__); + + if (AudioUpdateCodecRegBits(NULL, NULL, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); return HDF_FAILURE; } - deviceType = AUDIO_PLATFORM_DEVICE; - data.name = PLATFORM_TEST_NAME; - if (AudioSocDeviceRegister(device, &data, deviceType) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioSocDeviceRegister fail", __func__, __LINE__); + (void)memset_s(&codecData, sizeof(struct CodecData), 0, sizeof(struct CodecData)); + (void)memset_s(&codec, sizeof(struct CodecDevice), 0, sizeof(struct CodecDevice)); + codecData.Read = AudioDeviceReadRegMock; + codecData.Write = AudioDeviceWriteRegMock, + codec.devCodecName = "codec_service_0"; + OsalMutexInit(&codec.mutex); + codec.devData = &codecData; + if (AudioUpdateCodecRegBits(&codec, &g_audioTestReg, g_audioTestReg.min + 1) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); + OsalMutexDestroy(&codec.mutex); return HDF_FAILURE; } + + OsalMutexDestroy(&codec.mutex); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestBindDaiLink(void) +int32_t AudioUpdateAccessoryRegBitsTest(void) { + struct AccessoryDevice accessory; HDF_LOGI("%s: enter", __func__); - if (AudioBindDaiLink(NULL, NULL) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioBindDaiLink fail", __func__, __LINE__); + if (AudioUpdateAccessoryRegBits(NULL, NULL, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateAccessoryRegBits fail", __func__, __LINE__); return HDF_FAILURE; } - struct AudioCard *card = (struct AudioCard *)OsalMemCalloc(sizeof(struct AudioCard)); - if (card == NULL) { - ADM_LOG_ERR("%s_[%d] Malloc audioCard fail!", __func__, __LINE__); - return HDF_FAILURE; + (void)memset_s(&accessory, sizeof(struct AccessoryDevice), 0, sizeof(struct AccessoryDevice)); + accessory.devAccessoryName = "codec_service_1"; + OsalMutexInit(&accessory.mutex); + if (AudioUpdateAccessoryRegBits(&accessory, &g_audioTestReg, g_audioTestReg.min + 1) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateAccessoryRegBits fail", __func__, __LINE__); + OsalMutexDestroy(&accessory.mutex); } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(AUDIO_CORE_SERVICE_TEST_NAME); - if (AudioFillConfigData(device, &(card->configData)) != HDF_SUCCESS) { - ADM_LOG_ERR("%s_[%d] AudioFillConfigData fail", __func__, __LINE__); - OsalMemFree(card); - card = NULL; + + OsalMutexDestroy(&accessory.mutex); + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioUpdateDaiRegBitsTest(void) +{ + struct DaiDevice dai; + HDF_LOGI("%s: enter", __func__); + + if (AudioUpdateDaiRegBits(NULL, NULL, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateDaiRegBits fail", __func__, __LINE__); return HDF_FAILURE; } - if (AudioBindDaiLink(card, &(card->configData)) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioBindDaiLink fail", __func__, __LINE__); - OsalMemFree(card); - card = NULL; - return HDF_FAILURE; + (void)memset_s(&dai, sizeof(struct DaiDevice), 0, sizeof(struct DaiDevice)); + dai.devDaiName = "dai_service"; + if (AudioUpdateDaiRegBits(&dai, &g_audioTestReg, g_audioTestReg.min + 1) != HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateAccessoryRegBits fail", __func__, __LINE__); } - OsalMemFree(card->rtd); - card->rtd = NULL; - OsalMemFree(card); - card = NULL; + HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t ReadCodecReg(unsigned long virtualAddress, uint32_t reg, uint32_t *val) +int32_t AudioKcontrolGetCpuDaiTest(void) { + struct AudioKcontrol *kcontrol = NULL; + HDF_LOGI("%s: enter", __func__); + + if (AudioKcontrolGetCpuDai(kcontrol) == NULL) { + HDF_LOGE("%s_[%d] AudioKcontrolGetCpuDai fail!", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t WriteCodecReg(unsigned long virtualAddress, uint32_t reg, uint32_t val) +int32_t AudioKcontrolGetCodecTest(void) { + struct AudioKcontrol *kcontrol = NULL; + HDF_LOGI("%s: enter", __func__); + + if (AudioKcontrolGetCodec(kcontrol) == NULL) { + HDF_LOGE("%s_[%d] AudioKcontrolGetCodec fail!", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestUpdateCodecRegBits(void) + +int32_t AudioKcontrolGetAccessoryTest(void) { - int32_t value = 0; - if (AudioUpdateCodecRegBits(NULL, NULL, value) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); - return HDF_FAILURE; + struct AudioKcontrol *kcontrol = NULL; + HDF_LOGI("%s: enter", __func__); + + if (AudioKcontrolGetAccessory(kcontrol) == NULL) { + HDF_LOGE("%s_[%d] AudioKcontrolGetAccessory fail!", __func__, __LINE__); } - struct CodecData codecData = { - .Read = ReadCodecReg, - .Write = WriteCodecReg, - }; - struct CodecDevice codec; - codec.devCodecName = PLATFORM_CODEC_TEST_NAME; - OsalMutexInit(&codec.mutex); - codec.devData = &codecData; - value = g_audioMixerRegParams.min + 1; - if (AudioUpdateCodecRegBits(&codec, &g_audioMixerRegParams, value) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioUpdateCodecRegBits fail", __func__, __LINE__); - OsalMutexDestroy(&codec.mutex); + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioAddControlsTest(void) +{ + HDF_LOGI("%s: enter", __func__); + + if (AudioAddControls(NULL, NULL, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioUpdateDaiRegBits fail", __func__, __LINE__); return HDF_FAILURE; } - OsalMutexDestroy(&codec.mutex); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestUpdateAccessoryRegBits(void) +int32_t AudioAddControlTest(void) { - struct AccessoryDevice *accessory = NULL; - struct AudioMixerControl *mixerControl = NULL; - int32_t value = 0; + struct AudioCard *audioCard = NULL; + struct AudioKcontrol control; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioUpdateAccessoryRegBits(accessory, mixerControl, value); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioTestUpdateAccessoryRegBits fail", __func__, __LINE__); + audioCard = GetCardInstance("hdf_audio_codec_dev0"); + (void)memset_s(&control, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + if (AudioAddControl(audioCard, &control) == NULL) { + HDF_LOGE("%s_[%d] AudioAddControl fail!", __func__, __LINE__); } + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioGetCtrlOpsRRegTest(void) +{ + struct AudioCtrlElemValue elemValue; + struct AudioMixerControl mixerCtrl; + HDF_LOGI("%s: enter", __func__); + + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + (void)memset_s(&mixerCtrl, sizeof(struct AudioMixerControl), 0, sizeof(struct AudioMixerControl)); + AudioGetCtrlOpsRReg(&elemValue, &mixerCtrl, 0); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestKcontrolGetCodec(void) +int32_t AudioGetCtrlOpsRegTest(void) { - struct CodecDevice *codecDevice = NULL; - const struct AudioKcontrol *kcontrol = NULL; + struct AudioCtrlElemValue elemValue; + struct AudioMixerControl mixerCtrl; HDF_LOGI("%s: enter", __func__); - codecDevice = AudioKcontrolGetCodec(kcontrol); - if (codecDevice == NULL) { - HDF_LOGE("%s_[%d] AudioKcontrolGetCodec fail!", __func__, __LINE__); - } + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + (void)memset_s(&mixerCtrl, sizeof(struct AudioMixerControl), 0, sizeof(struct AudioMixerControl)); + AudioGetCtrlOpsReg(&elemValue, &mixerCtrl, 0); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestKcontrolGetAccessory(void) +int32_t AudioSetCtrlOpsRegTest(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AccessoryDevice *accessory = AudioKcontrolGetAccessory(kcontrol); - if (accessory == NULL) { - HDF_LOGE("%s_[%d] AudioKcontrolGetAccessory fail!", __func__, __LINE__); - } + uint32_t value; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + struct AudioMixerControl mixerCtrl; + HDF_LOGI("%s: enter", __func__); + + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + (void)memset_s(&mixerCtrl, sizeof(struct AudioMixerControl), 0, sizeof(struct AudioMixerControl)); + AudioSetCtrlOpsReg(&kcontrol, &elemValue, &mixerCtrl, &value); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAddControl(void) +int32_t AudioSetCtrlOpsRRegTest(void) { - struct AudioCard *audioCard = NULL; - const struct AudioKcontrol *control = NULL; - struct AudioKcontrol *audioKcontrol = NULL; + uint32_t value; + bool updateRReg; + struct AudioCtrlElemValue elemValue; + struct AudioMixerControl mixerCtrl; HDF_LOGI("%s: enter", __func__); - audioKcontrol = AudioAddControl(audioCard, control); - if (audioKcontrol == NULL) { - HDF_LOGE("%s_[%d] AudioAddControl fail!", __func__, __LINE__); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + (void)memset_s(&mixerCtrl, sizeof(struct AudioMixerControl), 0, sizeof(struct AudioMixerControl)); + AudioSetCtrlOpsRReg(&elemValue, &mixerCtrl, &value, &updateRReg); + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioDaiReadRegTest(void) +{ + uint32_t val; + struct DaiDevice dai; + HDF_LOGI("%s: enter", __func__); + + (void)memset_s(&dai, sizeof(struct DaiDevice), 0, sizeof(struct DaiDevice)); + if (AudioDaiReadReg(&dai, 0, &val) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioDaiReadReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAddControls(void) +int32_t AudioDaiWriteRegTest(void) { - struct AudioCard *audioCard = NULL; - const struct AudioKcontrol *controls = NULL; - int32_t controlMaxNum = 0x03; - int32_t ret; + struct DaiDevice dai; HDF_LOGI("%s: enter", __func__); - ret = AudioAddControls(audioCard, controls, controlMaxNum); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioAddControls fail", __func__, __LINE__); + (void)memset_s(&dai, sizeof(struct DaiDevice), 0, sizeof(struct DaiDevice)); + if (AudioDaiWriteReg(&dai, 0, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioDaiWriteReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestCodecReadReg(void) +int32_t AudioCodecReadRegTest(void) { - struct CodecDevice *codec = NULL; - uint32_t reg = 0; - uint32_t val = 0; + uint32_t val; + struct CodecDevice codec; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioCodecReadReg(codec, reg, &val); - if (ret != HDF_SUCCESS) { + (void)memset_s(&codec, sizeof(struct CodecDevice), 0, sizeof(struct CodecDevice)); + if (AudioCodecReadReg(&codec, 0, &val) == HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioCodecReadReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAccessoryReadReg(void) +int32_t AudioCodecWriteRegTest(void) { - struct AccessoryDevice *accessory = NULL; - uint32_t reg = 0; - uint32_t val = 0; + struct CodecDevice codec; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioAccessoryReadReg(accessory, reg, &val); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioAccessoryReadReg fail", __func__, __LINE__); + (void)memset_s(&codec, sizeof(struct CodecDevice), 0, sizeof(struct CodecDevice)); + if (AudioCodecWriteReg(&codec, 0, 0) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecWriteReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestCodecWriteReg(void) +int32_t AudioAccessoryReadRegTest(void) { - struct CodecDevice *codec = NULL; - uint32_t reg = 0; - uint32_t val = 0; + uint32_t val; + struct AccessoryDevice accessory; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioCodecWriteReg(codec, reg, val); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioCodecWriteReg fail", __func__, __LINE__); + (void)memset_s(&accessory, sizeof(struct AccessoryDevice), 0, sizeof(struct AccessoryDevice)); + if (AudioAccessoryReadReg(&accessory, 0, &val) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioAccessoryReadReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAccessoryWriteReg(void) +int32_t AudioAccessoryWriteRegTest(void) { - struct AccessoryDevice *accessory = NULL; - uint32_t reg = 0; - uint32_t val = 0; + struct AccessoryDevice accessory; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioAccessoryWriteReg(accessory, reg, val); - if (ret != HDF_SUCCESS) { + (void)memset_s(&accessory, sizeof(struct AccessoryDevice), 0, sizeof(struct AccessoryDevice)); + if (AudioAccessoryWriteReg(&accessory, 0, 0) == HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioAccessoryWriteReg fail", __func__, __LINE__); + return HDF_FAILURE; } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestInfoCtrlOps(void) +int32_t AudioInfoCtrlOpsTest(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AudioCtrlElemInfo *elemInfo = NULL; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemInfo elemInfo; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioInfoCtrlOps(kcontrol, elemInfo); - if (ret != HDF_SUCCESS) { + if (AudioInfoCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioInfoCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemInfo, sizeof(struct AudioCtrlElemInfo), 0, sizeof(struct AudioCtrlElemInfo)); + if (AudioInfoCtrlOps(&kcontrol, &elemInfo) == HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioInfoCtrlOps fail", __func__, __LINE__); } @@ -401,13 +497,19 @@ int32_t AudioTestInfoCtrlOps(void) return HDF_SUCCESS; } -int32_t AudioTestCodecGetCtrlOps(void) +int32_t AudioCodecGetCtrlOpsTest(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AudioCtrlElemValue *elemValue = NULL; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioCodecGetCtrlOps(kcontrol, elemValue); - if (ret != HDF_SUCCESS) { + if (AudioCodecGetCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecGetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioCodecGetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioCodecGetCtrlOps fail", __func__, __LINE__); } @@ -415,42 +517,100 @@ int32_t AudioTestCodecGetCtrlOps(void) return HDF_SUCCESS; } -int32_t AudioTestAccessoryGetCtrlOps(void) +int32_t AudioCodecSetCtrlOpsTest(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AudioCtrlElemValue *elemValue = NULL; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioAccessoryGetCtrlOps(kcontrol, elemValue); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioAccessoryGetCtrlOps fail", __func__, __LINE__); + if (AudioCodecSetCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecSetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioCodecSetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCodecSetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestCodecSetCtrlOps(void) +int32_t AudioAccessoryGetCtrlOpsTest(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AudioCtrlElemValue *elemValue = NULL; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioCodecSetCtrlOps(kcontrol, elemValue); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AudioCodecSetCtrlOps fail", __func__, __LINE__); + if (AudioAccessoryGetCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioAccessoryGetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioAccessoryGetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioAccessoryGetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t AudioTestAccessorySetCtrlOps(void) +int32_t AudioAccessorySetCtrlOpsTset(void) { - struct AudioKcontrol *kcontrol = NULL; - struct AudioCtrlElemValue *elemValue = NULL; + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); - int32_t ret = AudioAccessorySetCtrlOps(kcontrol, elemValue); - if (ret != HDF_SUCCESS) { + if (AudioAccessorySetCtrlOps(NULL, NULL) == HDF_SUCCESS) { HDF_LOGE("%s_[%d] AudioAccessorySetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioAccessorySetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioAccessorySetCtrlOps fail", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioCpuDaiSetCtrlOpsTest(void) +{ + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); + + if (AudioCpuDaiSetCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCpuDaiSetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioCpuDaiSetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCpuDaiSetCtrlOps fail", __func__, __LINE__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioCpuDaiGetCtrlOpsTest(void) +{ + struct AudioKcontrol kcontrol; + struct AudioCtrlElemValue elemValue; + HDF_LOGI("%s: enter", __func__); + + if (AudioCpuDaiGetCtrlOps(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCpuDaiGetCtrlOps fail", __func__, __LINE__); + return HDF_FAILURE; + } + (void)memset_s(&kcontrol, sizeof(struct AudioKcontrol), 0, sizeof(struct AudioKcontrol)); + (void)memset_s(&elemValue, sizeof(struct AudioCtrlElemValue), 0, sizeof(struct AudioCtrlElemValue)); + if (AudioCpuDaiGetCtrlOps(&kcontrol, &elemValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AudioCpuDaiGetCtrlOps fail", __func__, __LINE__); } HDF_LOGI("%s: success", __func__); diff --git a/test/unittest/model/audio/src/audio_dai_base_test.c b/test/unittest/model/audio/src/audio_dai_base_test.c new file mode 100644 index 000000000..e09ddc325 --- /dev/null +++ b/test/unittest/model/audio/src/audio_dai_base_test.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_dai_base_test.h" +#include "audio_dai_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_dai_base_test + +int32_t DaiDataFromCardTest(void) +{ + struct AudioCard card; + if (DaiDataFromCard(NULL) != NULL) { + return HDF_FAILURE; + } + + memset(&card, 0, sizeof(struct AudioCard)); + if (DaiDataFromCard(&card) != NULL) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t DaiGetConfigInfoTest(void) +{ + struct HdfDeviceObject device; + struct DaiData data; + if (DaiGetConfigInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (DaiGetConfigInfo(&device, &data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t DaiCheckSampleRateTest(void) +{ + if (DaiCheckSampleRate(0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (DaiCheckSampleRate(AUDIO_SAMPLE_RATE_8000) != HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t DaiSetConfigInfoTest(void) +{ + struct DaiData data; + if (DaiSetConfigInfo(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + memset(&data, 0, sizeof(struct DaiData)); + if (DaiSetConfigInfo(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + diff --git a/test/unittest/model/audio/src/audio_dma_base_test.c b/test/unittest/model/audio/src/audio_dma_base_test.c new file mode 100644 index 000000000..e013099c8 --- /dev/null +++ b/test/unittest/model/audio/src/audio_dma_base_test.c @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_dma_base_test.h" +#include "audio_platform_if.h" +#include "audio_dma_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_dma_base_test + +int32_t AudioDmaBufAllocTest(void) +{ + struct PlatformData data; + + memset(&data, 0, sizeof(struct PlatformData)); + + if (AudioDmaBufAlloc(NULL, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaBufAlloc(&data, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaBufFreeTest(void) +{ + struct PlatformData data; + + memset(&data, 0, sizeof(struct PlatformData)); + + if (AudioDmaBufFree(NULL, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaBufFree(&data, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaRequestChannelTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaRequestChannel(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaRequestChannel(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaConfigChannelTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaConfigChannel(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaConfigChannel(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaPrepTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaPrep(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaPrep(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaSubmitTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaSubmit(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaSubmit(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaPendingTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaPending(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaPending(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaPauseTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaPause(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaPause(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaResumeTest(void) +{ + struct PlatformData data; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaResume(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaResume(&data) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioDmaPointerTest(void) +{ + struct PlatformData data; + uint32_t pointer = 0; + memset(&data, 0, sizeof(struct PlatformData)); + if (AudioDmaPointer(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDmaPointer(&data, &pointer) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} diff --git a/test/unittest/model/audio/src/audio_dsp_base_test.c b/test/unittest/model/audio/src/audio_dsp_base_test.c new file mode 100644 index 000000000..8b1601045 --- /dev/null +++ b/test/unittest/model/audio/src/audio_dsp_base_test.c @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_dsp_base_test.h" +#include "audio_dsp_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_dsp_base_test +#define KCONTROL_TEST_SERVICE_NAME "dsp_service_0" + +int32_t DspGetServiceNameTest(void) +{ + struct DeviceResourceAttr attr; + struct DeviceResourceNode node; + struct HdfDeviceObject device; + if (DspGetServiceName(NULL, NULL) == HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("TestDspGetServiceName fail"); + return HDF_FAILURE; + } + + attr.value = KCONTROL_TEST_SERVICE_NAME; + attr.name = "serviceName"; + node.attrData = &attr; + device.property = &node; + if (DspGetServiceName(&device, NULL) == HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("TestDspGetServiceName fail"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t DspGetDaiNameTest(void) +{ + struct DeviceResourceNode node; + struct HdfDeviceObject device; + struct DeviceResourceAttr attr; + + if (DspGetDaiName(NULL, NULL) == HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("TestDspGetDaiName fail"); + return HDF_FAILURE; + } + + attr.value = KCONTROL_TEST_SERVICE_NAME; + attr.name = "dspDaiName"; + node.attrData = &attr; + device.property = &node; + if (DspGetDaiName(&device, NULL) == HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("TestDspGetDaiName fail"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + diff --git a/test/unittest/model/audio/src/audio_host_test.c b/test/unittest/model/audio/src/audio_host_test.c index 283c2cf02..56dcf3cfe 100755 --- a/test/unittest/model/audio/src/audio_host_test.c +++ b/test/unittest/model/audio/src/audio_host_test.c @@ -11,10 +11,23 @@ #include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_host_test -#define KCONTROL_TEST_SERVICE_NAME "dsp_service_0" -int32_t AudioKcontrolTestGetCodec(void) +const static char *g_audioServiceName[] = { + "codec_service_0", + "codec_service_1", + "dma_service_0", + "dai_service", + "audio_service_0", + "audio_service_1", + "render_service", + "capture_service", + "control_service", +}; + +int32_t AudioHostCreateAndBindTest(void) { + int i; + struct HdfDeviceObject *device = NULL; HDF_LOGI("%s: enter", __func__); if (AudioHostCreateAndBind(NULL) != NULL) { @@ -22,37 +35,25 @@ int32_t AudioKcontrolTestGetCodec(void) return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(KCONTROL_TEST_SERVICE_NAME); - struct AudioHost *audioHost = AudioHostCreateAndBind(device); - if (audioHost == NULL) { - HDF_LOGE("%s_[%d] codecDevice is NULL", __func__, __LINE__); - return HDF_FAILURE; + for (i = 0; i < sizeof(g_audioServiceName) / sizeof(g_audioServiceName[0]); ++i) { + device = DevSvcManagerClntGetDeviceObject(g_audioServiceName[i]); + if (AudioHostCreateAndBind(device) == NULL) { + HDF_LOGE("audiohost:%s create and bind fail!", g_audioServiceName[i]); + } } - OsalMemFree(audioHost); HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } -int32_t GetCardTestInstance(void) +int32_t GetCardInstanceTest(void) { int i; - const char *audioServiceName[] = { - "codec_service_0", - "codec_service_1", - "dma_service_0", - "dai_service", - "audio_service_0", - "audio_service_1", - "render_service", - "capture_service", - "control_service", - }; HDF_LOGI("%s: enter", __func__); - for (i = 0; i < sizeof(audioServiceName) / sizeof(audioServiceName[0]); ++i) { - if (GetCardInstance(audioServiceName[i]) == NULL) { - HDF_LOGE("%s: get %s fail!", __func__, audioServiceName[i]); + for (i = 0; i < sizeof(g_audioServiceName) / sizeof(g_audioServiceName[0]); ++i) { + if (GetCardInstance(g_audioServiceName[i]) == NULL) { + HDF_LOGE("%s: get %s fail!", __func__, g_audioServiceName[i]); } } diff --git a/test/unittest/model/audio/src/audio_parse_test.c b/test/unittest/model/audio/src/audio_parse_test.c index 24ab294cb..d324e6815 100755 --- a/test/unittest/model/audio/src/audio_parse_test.c +++ b/test/unittest/model/audio/src/audio_parse_test.c @@ -10,24 +10,44 @@ #include "devsvc_manager_clnt.h" #define HDF_LOG_TAG audio_parse_test -#define TEST_PARSE_SERVICE_NAME "hdf_audio_codec_dev0" -int32_t AudioFillTestConfigData(void) +int32_t AudioFillConfigDataTest(void) { - HDF_LOGI("%s: enter", __func__); + struct HdfDeviceObject *device = NULL; + struct AudioConfigData configData; + HDF_LOGI("enter"); if (AudioFillConfigData(NULL, NULL) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d]: AudioFillConfigData fail", __func__, __LINE__); + HDF_LOGE("AudioFillConfigData fail"); return HDF_FAILURE; } - struct HdfDeviceObject *device = DevSvcManagerClntGetDeviceObject(TEST_PARSE_SERVICE_NAME); - struct AudioConfigData configData; + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); if (AudioFillConfigData(device, &configData) != HDF_SUCCESS) { - HDF_LOGE("%s_[%d]: AudioFillConfigData fail", __func__, __LINE__); + HDF_LOGE("AudioFillConfigData fail"); + return HDF_FAILURE; + } + + HDF_LOGI("success"); + return HDF_SUCCESS; +} + +int32_t CodecGetRegConfigTest(void) +{ + struct HdfDeviceObject *device = NULL; + struct AudioRegCfgData regCfgData; + HDF_LOGI("enter"); + + if (CodecGetRegConfig(NULL, NULL) == HDF_SUCCESS) { + HDF_LOGE("AudioFillConfigData fail"); return HDF_FAILURE; } - HDF_LOGI("%s: success", __func__); + device = DevSvcManagerClntGetDeviceObject("hdf_audio_codec_dev0"); + if (CodecGetRegConfig(device, ®CfgData) != HDF_SUCCESS) { + HDF_LOGE("AudioFillConfigData fail"); + } + + HDF_LOGI("success"); return HDF_SUCCESS; } diff --git a/test/unittest/model/audio/src/audio_platform_base_test.c b/test/unittest/model/audio/src/audio_platform_base_test.c new file mode 100644 index 000000000..7bf217fa6 --- /dev/null +++ b/test/unittest/model/audio/src/audio_platform_base_test.c @@ -0,0 +1,403 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "audio_platform_base_test.h" +#include "audio_stream_dispatch.h" +#include "audio_platform_base.h" +#include "audio_driver_log.h" + +#define HDF_LOG_TAG audio_dsp_base_test + +int32_t PlatformDataFromCardTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (PlatformDataFromCard(NULL) != NULL) { + return HDF_FAILURE; + } + + if (PlatformDataFromCard(&card) != NULL) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioBytesToFramesTest(void) +{ + if (AudioBytesToFrames(0, 0) != 0) { + return HDF_FAILURE; + } + + if (AudioBytesToFrames(1, 1) != 1) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioDataBigEndianChangeTest(void) +{ + char test[32]; + memset(&test, 1, 32); + + if (AudioDataBigEndianChange(NULL, 0, 0) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH8) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH24) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH16) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioFramatToBitWidthTest(void) +{ + unsigned int bitWidth = 0; + + if (AudioFramatToBitWidth(1, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioFramatToBitWidth(AUDIO_FORMAT_PCM_16_BIT, &bitWidth) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (bitWidth != DATA_BIT_WIDTH16) { + return HDF_FAILURE; + } + + bitWidth = 0; + if (AudioFramatToBitWidth(AUDIO_FORMAT_PCM_24_BIT, &bitWidth) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (bitWidth != DATA_BIT_WIDTH24) { + return HDF_FAILURE; + } + + if (AudioFramatToBitWidth(AUDIO_FORMAT_AAC_HE_V1, &bitWidth) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioSetPcmInfoTest(void) +{ + struct PlatformData platformData; + struct AudioPcmHwParams param; + memset(&platformData, 0, sizeof(struct PlatformData)); + memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + + if (AudioSetPcmInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioSetPcmInfo(&platformData, ¶m) != HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioSetRenderBufInfoTest(void) +{ + struct PlatformData data; + struct AudioPcmHwParams param; + memset(&data, 0, sizeof(struct PlatformData)); + memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + + if (AudioSetRenderBufInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioSetRenderBufInfo(&data, ¶m) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioSetCaptureBufInfoTest(void) +{ + struct PlatformData data; + struct AudioPcmHwParams param; + memset(&data, 0, sizeof(struct PlatformData)); + memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + + if (AudioSetCaptureBufInfo(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioSetCaptureBufInfo(&data, ¶m) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioPcmWriteTest(void) +{ + struct AudioCard card; + struct AudioTxData txData; + memset(&card, 0, sizeof(struct AudioCard)); + memset(&txData, 0, sizeof(struct AudioTxData)); + + if (AudioPcmWrite(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioPcmWrite(&card, &txData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioPcmReadTest(void) +{ + struct AudioCard card; + struct AudioRxData rxData; + memset(&card, 0, sizeof(struct AudioCard)); + memset(&rxData, 0, sizeof(struct AudioRxData)); + + if (AudioPcmRead(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioPcmRead(&card, &rxData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioPcmMmapWriteTest(void) +{ + struct AudioCard card; + struct AudioMmapData txMmapData; + memset(&card, 0, sizeof(struct AudioCard)); + memset(&txMmapData, 0, sizeof(struct AudioMmapData)); + + if (AudioPcmMmapWrite(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioPcmMmapWrite(&card, &txMmapData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioPcmMmapReadTest(void) +{ + struct AudioCard card; + struct AudioMmapData rxMmapData; + memset(&card, 0, sizeof(struct AudioCard)); + memset(&rxMmapData, 0, sizeof(struct AudioMmapData)); + + if (AudioPcmMmapRead(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioPcmMmapRead(&card, &rxMmapData) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioRenderOpenTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioRenderOpen(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderOpen(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioCaptureOpenTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioCaptureOpen(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureOpen(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioRenderCloseTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioRenderClose(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderClose(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioPcmPointerTest(void) +{ + uint32_t pointer = 0; + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioPcmPointer(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioPcmPointer(&card, &pointer) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioCaptureCloseTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioCaptureClose(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureClose(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t AudioHwParamsTest(void) +{ + struct AudioCard card; + struct AudioPcmHwParams param; + memset(&card, 0, sizeof(struct AudioCard)); + memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + + if (AudioHwParams(NULL, NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioHwParams(&card, ¶m) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioRenderPrepareTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioRenderPrepare(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderPrepare(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioCapturePrepareTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioCapturePrepare(NULL) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCapturePrepare(&card) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioRenderTriggerTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioRenderTrigger(NULL, AUDIO_DRV_PCM_IOCTL_RENDER_START) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderTrigger(&card, AUDIO_DRV_PCM_IOCTL_RENDER_START) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderTrigger(&card, AUDIO_DRV_PCM_IOCTL_RENDER_STOP) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderTrigger(&card, AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioRenderTrigger(&card, AUDIO_DRV_PCM_IOCTL_RENDER_RESUME) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t AudioCaptureTriggerTest(void) +{ + struct AudioCard card; + memset(&card, 0, sizeof(struct AudioCard)); + + if (AudioCaptureTrigger(NULL, AUDIO_DRV_PCM_IOCTL_CAPTURE_START) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureTrigger(&card, AUDIO_DRV_PCM_IOCTL_CAPTURE_START) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureTrigger(&card, AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureTrigger(&card, AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + if (AudioCaptureTrigger(&card, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME) == HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; + +} + diff --git a/test/unittest/model/audio/src/audio_sapm_test.c b/test/unittest/model/audio/src/audio_sapm_test.c index 40a20d48c..999cd9533 100755 --- a/test/unittest/model/audio/src/audio_sapm_test.c +++ b/test/unittest/model/audio/src/audio_sapm_test.c @@ -10,7 +10,7 @@ #define HDF_LOG_TAG audio_host_test -int32_t AudioSapmTestNewComponents(void) +int32_t AudioSapmNewComponentsTest(void) { struct AudioCard *audioCard = NULL; struct AudioSapmComponent *component = NULL; @@ -27,7 +27,7 @@ int32_t AudioSapmTestNewComponents(void) return HDF_SUCCESS; } -int32_t AudioSapmTestAddRoutes(void) +int32_t AudioSapmAddRoutesTest(void) { struct AudioCard *audioCard = NULL; struct AudioSapmRoute *route = NULL; @@ -44,7 +44,7 @@ int32_t AudioSapmTestAddRoutes(void) return HDF_SUCCESS; } -int32_t AudioSapmTestNewControls(void) +int32_t AudioSapmNewControlsTest(void) { struct AudioCard *audioCard = NULL; int32_t ret; @@ -58,35 +58,111 @@ int32_t AudioSapmTestNewControls(void) HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } +int32_t AudioSapmSleepTest(void) +{ + struct AudioCard *audioCard = NULL; + int32_t ret; + HDF_LOGI("%s: enter", __func__); -int32_t AudioSapmTestPowerComponents(void) + ret = AudioSapmSleep(audioCard); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioSapmSleep is NULL", __func__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioSampPowerUpTest(void) { struct AudioCard *audioCard = NULL; int32_t ret; HDF_LOGI("%s: enter", __func__); - ret = AudioSapmPowerComponents(audioCard); + ret = AudioSampPowerUp(audioCard); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: audioCard is NULL", __func__); + HDF_LOGE("%s: AudioSampPowerUp is NULL", __func__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } +int32_t AudioSampSetPowerMonitorTest(void) +{ + struct AudioCard *audioCard = NULL; + int32_t ret; + HDF_LOGI("%s: enter", __func__); + + ret = AudioSampSetPowerMonitor(audioCard, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioSampSetPowerMonitor is NULL", __func__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} -int32_t AudioSapmTestRefreshTime(void) +int32_t AudioCodecSapmSetCtrlOpsTest(void) { - bool bRefresh = true; - u64 time; + int32_t ret; + struct AudioKcontrol *kcontrol = NULL; + struct AudioCtrlElemValue *elemValue = NULL; HDF_LOGI("%s: enter", __func__); - time = AudioSapmRefreshTime(bRefresh); - if (time == 0) { - HDF_LOGE("%s: error", __func__); + ret = AudioCodecSapmSetCtrlOps(kcontrol, elemValue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioCodecSapmSetCtrlOps is NULL", __func__); } HDF_LOGI("%s: success", __func__); return HDF_SUCCESS; } +int32_t AudioCodecSapmGetCtrlOpsTest(void) +{ + int32_t ret; + struct AudioKcontrol *kcontrol = NULL; + struct AudioCtrlElemValue *elemValue = NULL; + HDF_LOGI("%s: enter", __func__); + + ret = AudioCodecSapmGetCtrlOps(kcontrol, elemValue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioCodecSapmGetCtrlOps is NULL", __func__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioAccessorySapmSetCtrlOpsTest(void) +{ + int32_t ret; + struct AudioKcontrol *kcontrol = NULL; + struct AudioCtrlElemValue *elemValue = NULL; + HDF_LOGI("%s: enter", __func__); + + ret = AudioAccessorySapmSetCtrlOps(kcontrol, elemValue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioAccessorySapmSetCtrlOps is NULL", __func__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} + +int32_t AudioAccessorySapmGetCtrlOpsTest(void) +{ + int32_t ret; + struct AudioKcontrol *kcontrol = NULL; + struct AudioCtrlElemValue *elemValue = NULL; + HDF_LOGI("%s: enter", __func__); + + ret = AudioAccessorySapmGetCtrlOps(kcontrol, elemValue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: AudioAccessorySapmGetCtrlOps is NULL", __func__); + } + + HDF_LOGI("%s: success", __func__); + return HDF_SUCCESS; +} diff --git a/test/unittest/model/audio/src/hdf_audio_test.c b/test/unittest/model/audio/src/hdf_audio_test.c index 4af3765bd..44ade0ff0 100755 --- a/test/unittest/model/audio/src/hdf_audio_test.c +++ b/test/unittest/model/audio/src/hdf_audio_test.c @@ -12,45 +12,126 @@ #include "audio_core_test.h" #include "audio_parse_test.h" #include "audio_sapm_test.h" -#include "audio_stream_dispatch_test.h" +#include "audio_dai_base_test.h" +#include "audio_dma_base_test.h" +#include "audio_dsp_base_test.h" +#include "audio_codec_base_test.h" +#include "audio_platform_base_test.h" +#include "audio_accessory_base_test.h" #define HDF_LOG_TAG hdf_audio_test // add test case entry static HdfTestCaseList g_hdfAudioTestCaseList[] = { - {AUDIO_DRIVER_TESTGETCODEC, AudioKcontrolTestGetCodec}, - {AUDIO_DRIVER_TESTGETCARDINSTANCE, GetCardTestInstance}, - {AUDIO_DRIVER_TESTGETCCNFIGDATA, AudioFillTestConfigData}, - - {AUDIO_DRIVER_TESTREGISTERPLATFORM, AudioSocTestRegisterPlatform}, - {AUDIO_DRIVER_TESTREGISTERDAI, AudioSocTestRegisterDai}, - {AUDIO_DRIVER_TESTREGISTERACCESSORY, AudioTestRegisterAccessory}, - {AUDIO_DRIVER_TESTREGISTERCODEC, AudioTestRegisterCodec}, - {AUDIO_DRIVER_TESTREGISTERDSP, AudioTestRegisterDsp}, - {AUDIO_DRIVER_TESTSOCDEVICEREGISTER, AudioTestSocDeviceRegister}, - {AUDIO_DRIVER_TESTBINDDAILINK, AudioTestBindDaiLink}, - {AUDIO_DRIVER_TESTUPDATECODECREGBITS, AudioTestUpdateCodecRegBits}, - {AUDIO_DRIVER_TESTUPDATEACCESSORYREGBITS, AudioTestUpdateAccessoryRegBits}, - {AUDIO_DRIVER_TESTKCONTROLGETCODEC, AudioTestKcontrolGetCodec}, - {AUDIO_DRIVER_TESTKCONTROLGETACCESSORY, AudioTestKcontrolGetAccessory}, - {AUDIO_DRIVER_TESTADDCONTROL, AudioTestAddControl}, - {AUDIO_DRIVER_TESTADDCONTROLS, AudioTestAddControls}, - {AUDIO_DRIVER_TESTCODECREADREG, AudioTestCodecReadReg}, - {AUDIO_DRIVER_TESTACCESSORYREADREG, AudioTestAccessoryReadReg}, - {AUDIO_DRIVER_TESTCODECWRITEREG, AudioTestCodecWriteReg}, - {AUDIO_DRIVER_TESTACCESSORYWRITEREG, AudioTestAccessoryWriteReg}, - {AUDIO_DRIVER_TESTINFOCTRLOPS, AudioTestInfoCtrlOps}, - {AUDIO_DRIVER_TESTCODECGETCTRLOPS, AudioTestCodecGetCtrlOps}, - {AUDIO_DRIVER_TESTACCESSORYGETCTRLOPS, AudioTestAccessoryGetCtrlOps}, - {AUDIO_DRIVER_TESTCODECSETCTRLOPS, AudioTestCodecSetCtrlOps}, - {AUDIO_DRIVER_TESTACCESSORYSETCTRLOPS, AudioTestAccessorySetCtrlOps}, - - {AUDIO_DRIVER_TESTNEWCOMPONENT, AudioSapmTestNewComponents}, - {AUDIO_DRIVER_TESTADDROUTES, AudioSapmTestAddRoutes}, - {AUDIO_DRIVER_TESTNEWCONTROLS, AudioSapmTestNewControls}, - {AUDIO_DRIVER_TESTPOWERCOMPONET, AudioSapmTestPowerComponents}, - {AUDIO_DRIVER_TESTREFRESHTIME, AudioSapmTestRefreshTime}, - {AUDIO_DRIVER_TESTSTREAMDISPATCH, AudioControlDispatchTestStreamDispatch}, + {AUDIO_ADM_TEST_AUDIOHOSTCREATEANDBIND, AudioHostCreateAndBindTest}, // audio ADM audio_host + {AUDIO_ADM_TEST_GETCARDINSTANCE, GetCardInstanceTest}, // audio ADM audio_host + + {AUDIO_ADM_TEST_AUDIOFILLCONFIGDATA, AudioFillConfigDataTest}, // audio ADM audio_parse + {AUDIO_ADM_TEST_CODECGETREGCONFIG , CodecGetRegConfigTest}, // audio ADM audio_parse + + {AUDIO_ADM_TEST_AUDIODEVICEREADREG, AudioDeviceReadRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIODEVICEWRITEREG, AudioDeviceWriteRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOSOCREGISTERPLATFORM, AudioSocRegisterPlatformTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOSOCREGISTERDAI, AudioSocRegisterDaiTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOREGISTERDSP, AudioRegisterDspTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOREGISTERCODEC, AudioRegisterCodecTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOREGISTERACCESSORY, AudioRegisterAccessoryTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOBINDDAILINK, AudioBindDaiLinkTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOUPDATECODECREGBITS, AudioUpdateCodecRegBitsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOUPDATEACCESSORYREGBITS, AudioUpdateAccessoryRegBitsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOUPDATEDAIREGBITS, AudioUpdateDaiRegBitsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOKCONTROLGETCPUDAI, AudioKcontrolGetCpuDaiTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOKCONTROLGETCODEC, AudioKcontrolGetCodecTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOKCONTROLGETACCESSORY, AudioKcontrolGetAccessoryTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOADDCONTROLS, AudioAddControlsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOADDCONTROL, AudioAddControlTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOGETCTRLOPSRREG, AudioGetCtrlOpsRRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOGETCTRLOPSREG, AudioGetCtrlOpsRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOSETCTRLOPSREG, AudioSetCtrlOpsRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOSETCTRLOPSRREG, AudioSetCtrlOpsRRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIODAIREADREG, AudioDaiReadRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIODAIWRITEREG, AudioDaiWriteRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCODECREADREG, AudioCodecReadRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCODECWRITEREG, AudioCodecWriteRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOACCESSORYREADREG, AudioAccessoryReadRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOACCESSORYWRITEREG, AudioAccessoryWriteRegTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOINFOCTRLOPS, AudioInfoCtrlOpsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCODECGETCTRLOPS, AudioCodecGetCtrlOpsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCODECSETCTRLOPS, AudioCodecSetCtrlOpsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOACCESSORYGETCTRLOPS, AudioAccessoryGetCtrlOpsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOACCESSORYSETCTRLOPS, AudioAccessorySetCtrlOpsTset}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCPUDAISETCTRLOPS, AudioCpuDaiSetCtrlOpsTest}, // audio ADM audio_core + {AUDIO_ADM_TEST_AUDIOCPUDAIGETCTRLOPS, AudioCpuDaiGetCtrlOpsTest}, // audio ADM audio_core + + {AUDIO_ADM_TEST_AUDIOSAPMNEWCOMPONENTS, AudioSapmNewComponentsTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOSAPMADDROUTES, AudioSapmAddRoutesTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOSAPMNEWCONTROLS, AudioSapmNewControlsTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOSAPMSLEEP, AudioSapmSleepTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOSAMPPOWERUP, AudioSampPowerUpTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOSAMPSETPOWERMONITOR, AudioSampSetPowerMonitorTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOCODECSAPMSETCTRLOPS, AudioCodecSapmSetCtrlOpsTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOCODECSAPMGETCTRLOPS, AudioCodecSapmGetCtrlOpsTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOACCESSORYSAPMSETCTRLOPS, AudioAccessorySapmSetCtrlOpsTest}, // audio ADM audio_sapm + {AUDIO_ADM_TEST_AUDIOACCESSORYSAPMGETCTRLOPS, AudioAccessorySapmGetCtrlOpsTest}, // audio ADM audio_sapm + + + {AUDIO_ADM_TEST_I2CREADWRITE, AccessoryI2cReadWriteTest}, + {AUDIO_ADM_TEST_REGBITSREAD, AccessoryRegBitsReadTest}, + {AUDIO_ADM_TEST_REGBITSUPDATE, AccessoryRegBitsUpdateTest}, + {AUDIO_ADM_TEST_DEVICEFREQUENCYPARSE, AcessoryDeviceFrequencyParseTest}, + {AUDIO_ADM_TEST_DAIPARAMSUPDATE, AccessoryDaiParamsUpdateTest}, + {AUDIO_ADM_TEST_DEVICECFGGET, AccessoryDeviceCfgGetTest}, + {AUDIO_ADM_TEST_DEVICECTRLREGINIT, AccessoryDeviceCtrlRegInitTest}, + {AUDIO_ADM_TEST_DEVICEREGREAD, AccessoryDeviceRegReadTest}, + {AUDIO_ADM_TEST_DEVICEREGWRITE, AccessoryDeviceRegWriteTest}, + {AUDIO_ADM_TEST_AGETCONFIGINFO, AccessoryGetConfigInfoTest}, + + {AUDIO_ADM_TEST_GETSERVICENAME, CodecGetServiceNameTest}, + {AUDIO_ADM_TEST_GETDAINAME, CodecGetDaiNameTest}, + {AUDIO_ADM_TEST_GETCONFIGINFO, CodecGetConfigInfoTest}, + {AUDIO_ADM_TEST_SETCONFIGINFO, CodecSetConfigInfoTest}, + {AUDIO_ADM_TEST_SETCTLFUNC, CodecSetCtlFuncTest}, + + {AUDIO_ADM_TEST_DAIDATAFROMCARD, DaiDataFromCardTest}, + {AUDIO_ADM_TEST_DAIGETCONFIGINFO, DaiGetConfigInfoTest}, + {AUDIO_ADM_TEST_DAICHECKSAMPLERATE, DaiCheckSampleRateTest}, + {AUDIO_ADM_TEST_DAISETCONFIGINFO, DaiSetConfigInfoTest}, + + {AUDIO_ADM_TEST_DMABUFALLOC, AudioDmaBufAllocTest}, + {AUDIO_ADM_TEST_DMABUFFREE, AudioDmaBufFreeTest}, + {AUDIO_ADM_TEST_DMAREQUESTCHANNEL, AudioDmaRequestChannelTest}, + {AUDIO_ADM_TEST_DMACONFIGCHANNEL, AudioDmaConfigChannelTest}, + {AUDIO_ADM_TEST_DMAPREP, AudioDmaPrepTest}, + {AUDIO_ADM_TEST_DMASUBMIT, AudioDmaSubmitTest}, + {AUDIO_ADM_TEST_DMAPENDING, AudioDmaPendingTest}, + {AUDIO_ADM_TEST_DMAPAUSE, AudioDmaPauseTest}, + {AUDIO_ADM_TEST_DMARESUME, AudioDmaResumeTest}, + {AUDIO_ADM_TEST_DMAPOINTER, AudioDmaPointerTest}, + + {AUDIO_ADM_TEST_DSPGETSERVICENAME, DspGetServiceNameTest}, + {AUDIO_ADM_TEST_DSPGETDAINAME, DspGetDaiNameTest}, + + {AUDIO_ADM_TEST_DATAFROMCARD, PlatformDataFromCardTest}, + {AUDIO_ADM_TEST_BYTESTOFRAMES, AudioBytesToFramesTest}, + {AUDIO_ADM_TEST_DATABIGENDIANCHANGE, AudioDataBigEndianChangeTest}, + {AUDIO_ADM_TEST_FRAMATTOBITWIDTH, AudioFramatToBitWidthTest}, + {AUDIO_ADM_TEST_SETPCMINFO, AudioSetPcmInfoTest}, + {AUDIO_ADM_TEST_SETRENDERBUFINFO, AudioSetRenderBufInfoTest}, + {AUDIO_ADM_TEST_SETCAPTUREBUFINFO, AudioSetCaptureBufInfoTest}, + {AUDIO_ADM_TEST_PCMWRITE, AudioPcmWriteTest}, + {AUDIO_ADM_TEST_PCMREAD, AudioPcmReadTest}, + {AUDIO_ADM_TEST_PCMMMAPWRITE, AudioPcmMmapWriteTest}, + {AUDIO_ADM_TEST_PCMMMAPREAD, AudioPcmMmapReadTest}, + {AUDIO_ADM_TEST_RENDEROPEN, AudioRenderOpenTest}, + {AUDIO_ADM_TEST_CAPTUREOPEN, AudioCaptureOpenTest}, + {AUDIO_ADM_TEST_RENDERCLOSE, AudioRenderCloseTest}, + {AUDIO_ADM_TEST_PCMPOINTER, AudioPcmPointerTest}, + {AUDIO_ADM_TEST_CAPTURECLOSE, AudioCaptureCloseTest}, + {AUDIO_ADM_TEST_HWPARAMS, AudioHwParamsTest}, + {AUDIO_ADM_TEST_RENDERPREPARE, AudioRenderPrepareTest}, + {AUDIO_ADM_TEST_CAPTUREPREPARE, AudioCapturePrepareTest}, + {AUDIO_ADM_TEST_RENDERTRIGGER, AudioRenderTriggerTest}, + {AUDIO_ADM_TEST_CAPTURETRIGGER, AudioCaptureTriggerTest} }; int32_t HdfAudioEntry(HdfTestMsg *msg) -- Gitee From a2f3962562a649a13f9f9537546eec62a2e4c7d9 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Sat, 6 Nov 2021 10:01:22 +0800 Subject: [PATCH 144/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91=E6=9B=B4?= =?UTF-8?q?=E6=96=B0Audio=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- model/audio/common/src/audio_accessory_base.c | 4 +- .../audio/src/audio_accessory_base_test.c | 59 ++++--------------- 2 files changed, 14 insertions(+), 49 deletions(-) diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 29e74532e..c52c65754 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -146,7 +146,7 @@ int32_t AccessoryRegBitsRead(struct AudioMixerControl *regAttr, uint32_t *regVal { int32_t ret; struct AudioAddrConfig regVal; - if (regAttr == NULL || regAttr->reg < 0) { + if (regAttr == NULL || regAttr->reg < 0 || regValue == NULL) { AUDIO_DRIVER_LOG_ERR("input invalid parameter."); return HDF_ERR_INVALID_PARAM; } @@ -402,7 +402,7 @@ int32_t AccessoryDeviceRegWrite(const struct AccessoryDevice *codec, uint32_t re int32_t AccessoryGetConfigInfo(const struct HdfDeviceObject *device, struct AccessoryData *accessoryData) { - if (device == NULL) { + if (device == NULL || accessoryData == NULL) { AUDIO_DRIVER_LOG_ERR("param is null!"); return HDF_FAILURE; } diff --git a/test/unittest/model/audio/src/audio_accessory_base_test.c b/test/unittest/model/audio/src/audio_accessory_base_test.c index 13aac47a6..986e6b83f 100644 --- a/test/unittest/model/audio/src/audio_accessory_base_test.c +++ b/test/unittest/model/audio/src/audio_accessory_base_test.c @@ -12,52 +12,30 @@ #define HDF_LOG_TAG audio_accessory_base_test -static struct AudioMixerControl g_TestReg = { - .min = 0, - .max = 0, - .platformMax = 0, - .mask = 0, - .reg = 0, - .rreg = 0, - .shift= 0, - .rshift = 0, - .invert = 0, - .value = 0, -}; - int32_t AccessoryI2cReadWriteTest(void) { - struct AudioAddrConfig addrConfig; - if (AccessoryI2cReadWrite(NULL, 0) == HDF_SUCCESS) { return HDF_FAILURE; } - if (AccessoryI2cReadWrite(&addrConfig, 0) == HDF_SUCCESS) { - return HDF_FAILURE; - } return HDF_SUCCESS; } int32_t AccessoryRegBitsReadTest(void) { - uint32_t regValue = 0; - if (AccessoryRegBitsRead(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; } - if (AccessoryRegBitsRead(&g_TestReg, ®Value) == HDF_SUCCESS) { - return HDF_FAILURE; - } - return HDF_SUCCESS; } int32_t AccessoryRegBitsUpdateTest(void) { - if (AccessoryRegBitsUpdate(g_TestReg) == HDF_SUCCESS) { - return HDF_FAILURE; + struct AudioMixerControl regValue; + regValue.reg = 1; // 1 is test reg + if (AccessoryRegBitsUpdate(regValue) == HDF_SUCCESS) { + HDF_LOGE("%s_[%d] AccessoryDaiParamsUpdate fail", __func__, __LINE__); } return HDF_SUCCESS; @@ -66,15 +44,10 @@ int32_t AccessoryRegBitsUpdateTest(void) int32_t AcessoryDeviceFrequencyParseTest(void) { - uint16_t freq = 0; if (AcessoryDeviceFrequencyParse(0, NULL) == HDF_SUCCESS) { return HDF_FAILURE; } - if (AcessoryDeviceFrequencyParse(0, &freq) == HDF_SUCCESS) { - return HDF_FAILURE; - } - return HDF_SUCCESS; } @@ -82,9 +55,9 @@ int32_t AccessoryDaiParamsUpdateTest(void) { struct DaiParamsVal value; - value.channelVal = 1; // 1 is dma channel + value.frequencyVal = 1; // 1 is dma channel if (AccessoryDaiParamsUpdate(value) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDaiParamsUpdate fail", __func__, __LINE__); } return HDF_SUCCESS; @@ -92,25 +65,17 @@ int32_t AccessoryDaiParamsUpdateTest(void) int32_t AccessoryDeviceCfgGetTest(void) { - - struct AccessoryData accessoryData; - struct AccessoryTransferData accessoryTransferData; if (AccessoryDeviceCfgGet(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; } - memset(&accessoryData, 0, sizeof(struct AccessoryData)); - memset(&accessoryTransferData, 0, sizeof(struct AccessoryTransferData)); - if (AccessoryDeviceCfgGet(&accessoryData, &accessoryTransferData) == HDF_SUCCESS) { - return HDF_FAILURE; - } return HDF_SUCCESS; } int32_t AccessoryDeviceCtrlRegInitTest(void) { if (AccessoryDeviceCtrlRegInit() == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDeviceCtrlRegInitTest fail", __func__, __LINE__); } return HDF_SUCCESS; @@ -121,11 +86,11 @@ int32_t AccessoryDeviceRegReadTest(void) uint32_t val; struct AccessoryDevice codec; if (AccessoryDeviceRegRead(NULL, 0, NULL) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDeviceRegRead fail", __func__, __LINE__); } if (AccessoryDeviceRegRead(&codec, 0, &val) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDeviceRegRead fail", __func__, __LINE__); } return HDF_SUCCESS; } @@ -134,11 +99,11 @@ int32_t AccessoryDeviceRegWriteTest(void) { struct AccessoryDevice codec; if (AccessoryDeviceRegWrite(NULL, 0, 0) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDeviceRegWrite fail", __func__, __LINE__);; } if (AccessoryDeviceRegWrite(&codec, 0, 0) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryDeviceRegWrite fail", __func__, __LINE__); } return HDF_SUCCESS; } @@ -153,7 +118,7 @@ int32_t AccessoryGetConfigInfoTest(void) } if (AccessoryGetConfigInfo(&device, &codecData) == HDF_SUCCESS) { - return HDF_FAILURE; + HDF_LOGE("%s_[%d] AccessoryGetConfigInfo fail", __func__, __LINE__); } return HDF_SUCCESS; -- Gitee From f9da986d961c32c7b56cc0a151e719e9cc586fa4 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Sat, 6 Nov 2021 11:45:54 +0800 Subject: [PATCH 145/272] add more ioservice test case Signed-off-by: yuanbo --- .../unittest/common/hdf_ioservice_test.cpp | 110 ++++++++++++------ 1 file changed, 76 insertions(+), 34 deletions(-) diff --git a/core/manager/test/unittest/common/hdf_ioservice_test.cpp b/core/manager/test/unittest/common/hdf_ioservice_test.cpp index 6dd938c08..c200084a3 100644 --- a/core/manager/test/unittest/common/hdf_ioservice_test.cpp +++ b/core/manager/test/unittest/common/hdf_ioservice_test.cpp @@ -6,20 +6,20 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdf_io_service.h" +#include "hdf_log.h" +#include "hdf_power_state.h" +#include "hdf_uhdf_test.h" +#include "osal_time.h" +#include "sample_driver_test.h" #include #include #include #include -#include +#include #include +#include #include -#include -#include "hdf_uhdf_test.h" -#include "hdf_io_service.h" -#include "osal_time.h" -#include "sample_driver_test.h" -#include "hdf_log.h" -#include "hdf_power_state.h" using namespace testing::ext; @@ -58,7 +58,9 @@ void IoServiceTest::SetUpTestCase() listener1.listener.priv = (void *)"listener1"; } -void IoServiceTest::TearDownTestCase() {} +void IoServiceTest::TearDownTestCase() +{ +} void IoServiceTest::SetUp() { @@ -67,15 +69,17 @@ void IoServiceTest::SetUp() eventCount = 0; } -void IoServiceTest::TearDown() {} +void IoServiceTest::TearDown() +{ +} int IoServiceTest::OnDevEventReceived(struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data) { OsalTimespec time; OsalGetTime(&time); - HDF_LOGE("%s: received event[%d] from %s at %" PRIu64 ".%" PRIu64 "", (char *)listener->priv, eventCount++, (char *)service->priv, - time.sec, time.usec); + HDF_LOGE("%s: received event[%d] from %s at %" PRIu64 ".%" PRIu64 "", (char *)listener->priv, eventCount++, + (char *)service->priv, time.sec, time.usec); const char *string = HdfSbufReadString(data); if (string == nullptr) { @@ -88,7 +92,7 @@ int IoServiceTest::OnDevEventReceived(struct HdfDevEventlistener *listener, stru return 0; } -static int SendEvent(struct HdfIoService *serv, const char *eventData) +static int SendEvent(struct HdfIoService *serv, const char *eventData, bool broadcast) { OsalTimespec time; OsalGetTime(&time); @@ -107,6 +111,7 @@ static int SendEvent(struct HdfIoService *serv, const char *eventData) return HDF_DEV_ERR_NO_MEMORY; } + uint32_t cmdId = broadcast ? SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE : SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE; do { if (!HdfSbufWriteString(data, eventData)) { HDF_LOGE("fail to write sbuf"); @@ -114,7 +119,7 @@ static int SendEvent(struct HdfIoService *serv, const char *eventData) break; } - ret = serv->dispatcher->Dispatch(&serv->object, SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE, data, reply); + ret = serv->dispatcher->Dispatch(&serv->object, cmdId, data, reply); if (ret != HDF_SUCCESS) { HDF_LOGE("fail to send service call"); break; @@ -170,7 +175,7 @@ HWTEST_F(IoServiceTest, HdfIoService002, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -189,7 +194,7 @@ HWTEST_F(IoServiceTest, HdfIoService002, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -224,7 +229,7 @@ HWTEST_F(IoServiceTest, HdfIoService003, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -242,7 +247,7 @@ HWTEST_F(IoServiceTest, HdfIoService003, TestSize.Level0) ret = HdfDeviceRegisterEventListener(serv, &listener1.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -268,7 +273,7 @@ HWTEST_F(IoServiceTest, HdfIoService004, TestSize.Level0) int ret = HdfDeviceRegisterEventListener(serv1, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv1, testSvcName); + ret = SendEvent(serv1, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -300,7 +305,7 @@ HWTEST_F(IoServiceTest, HdfIoService005, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -311,7 +316,7 @@ HWTEST_F(IoServiceTest, HdfIoService005, TestSize.Level0) ret = HdfIoServiceGroupAddService(group, serv); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -319,7 +324,6 @@ HWTEST_F(IoServiceTest, HdfIoService005, TestSize.Level0) HdfIoServiceGroupRecycle(group); } - /* * * @tc.name: HdfIoService006 * @tc.desc: service group add remove listener test @@ -348,13 +352,13 @@ HWTEST_F(IoServiceTest, HdfIoService006, TestSize.Level0) ret = HdfIoServiceGroupAddService(group, serv1); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); ASSERT_EQ(1, listener0.eventCount); - ret = SendEvent(serv1, testSvcName); + ret = SendEvent(serv1, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -362,13 +366,13 @@ HWTEST_F(IoServiceTest, HdfIoService006, TestSize.Level0) HdfIoServiceGroupRemoveService(group, serv); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); ASSERT_EQ(2, listener0.eventCount); - ret = SendEvent(serv1, testSvcName); + ret = SendEvent(serv1, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -377,7 +381,7 @@ HWTEST_F(IoServiceTest, HdfIoService006, TestSize.Level0) ret = HdfIoServiceGroupAddService(group, serv); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -388,7 +392,6 @@ HWTEST_F(IoServiceTest, HdfIoService006, TestSize.Level0) HdfIoServiceRecycle(serv1); } - /* * * @tc.name: HdfIoService007 * @tc.desc: duplicate remove group listener @@ -410,7 +413,7 @@ HWTEST_F(IoServiceTest, HdfIoService007, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -447,7 +450,7 @@ HWTEST_F(IoServiceTest, HdfIoService008, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -487,7 +490,7 @@ HWTEST_F(IoServiceTest, HdfIoService009, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -524,7 +527,7 @@ HWTEST_F(IoServiceTest, HdfIoService010, TestSize.Level0) ret = HdfIoServiceGroupRegisterListener(group, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -555,7 +558,7 @@ HWTEST_F(IoServiceTest, HdfIoService011, TestSize.Level0) int ret = HdfDeviceRegisterEventListener(serv, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -584,7 +587,7 @@ HWTEST_F(IoServiceTest, HdfIoService012, TestSize.Level0) int ret = HdfDeviceRegisterEventListener(serv, &listener0.listener); ASSERT_EQ(ret, HDF_SUCCESS); - ret = SendEvent(serv, testSvcName); + ret = SendEvent(serv, testSvcName, false); ASSERT_EQ(ret, HDF_SUCCESS); usleep(eventWaitTimeUs); @@ -633,3 +636,42 @@ HWTEST_F(IoServiceTest, HdfIoService013, TestSize.Level0) HdfIoServiceRecycle(serv); HdfSBufRecycle(data); } + +/* * + * @tc.name: HdfIoService014 + * @tc.desc: multiple clients listen to a service + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(IoServiceTest, HdfIoService014, TestSize.Level0) +{ + struct HdfIoServiceGroup *group = HdfIoServiceGroupObtain(); + ASSERT_NE(group, nullptr); + + struct HdfIoService *serv = HdfIoServiceBind(testSvcName); + ASSERT_NE(serv, nullptr); + serv->priv = (void *)"serv"; + + struct HdfIoService *serv1 = HdfIoServiceBind(testSvcName); + ASSERT_NE(serv1, nullptr); + serv1->priv = (void *)"serv1"; + + int ret = HdfDeviceRegisterEventListener(serv, &listener0.listener); + ASSERT_EQ(ret, HDF_SUCCESS); + + ret = HdfDeviceRegisterEventListener(serv1, &listener1.listener); + ASSERT_EQ(ret, HDF_SUCCESS); + + ret = SendEvent(serv, testSvcName, true); + ASSERT_EQ(ret, HDF_SUCCESS); + + usleep(eventWaitTimeUs); + ASSERT_EQ(1, listener0.eventCount); + ASSERT_EQ(1, listener1.eventCount); + + ret = HdfDeviceUnregisterEventListener(serv, &listener0.listener); + ASSERT_EQ(ret, HDF_SUCCESS); + + ret = HdfDeviceUnregisterEventListener(serv, &listener0.listener); + EXPECT_NE(ret, HDF_SUCCESS); +} \ No newline at end of file -- Gitee From c144380beaab55a2f69fcd31a1d27a095043034b Mon Sep 17 00:00:00 2001 From: wangyipeng Date: Fri, 5 Nov 2021 19:13:38 +0800 Subject: [PATCH 146/272] add hdi-gen function Signed-off-by: wangyipeng --- tools/hdi-gen/Makefile | 70 +++---- tools/hdi-gen/MakefileLinux | 72 +++++++ tools/hdi-gen/MakefileWin | 73 ++++++++ tools/hdi-gen/ast/Makefile | 12 -- tools/hdi-gen/ast/ast_array_type.cpp | 126 +++++++++++-- tools/hdi-gen/ast/ast_array_type.h | 6 + tools/hdi-gen/ast/ast_list_type.cpp | 127 +++++++++++-- tools/hdi-gen/ast/ast_list_type.h | 6 + tools/hdi-gen/ast/ast_union_type.cpp | 82 ++++++-- tools/hdi-gen/codegen/Makefile | 12 -- .../c_client_interface_code_emitter.cpp | 22 ++- .../codegen/c_client_proxy_code_emitter.cpp | 117 ++++++++++-- .../codegen/c_client_proxy_code_emitter.h | 2 + tools/hdi-gen/codegen/c_code_emitter.cpp | 62 ------ tools/hdi-gen/codegen/c_code_emitter.h | 28 +-- tools/hdi-gen/codegen/c_code_generator.cpp | 66 ------- tools/hdi-gen/codegen/c_code_generator.h | 35 ---- .../codegen/c_custom_types_code_emitter.cpp | 78 +++++++- .../codegen/c_custom_types_code_emitter.h | 2 + .../codegen/c_service_driver_code_emitter.cpp | 3 +- .../codegen/c_service_impl_code_emitter.cpp | 8 +- .../c_service_interface_code_emitter.cpp | 10 +- .../codegen/c_service_stub_code_emitter.cpp | 40 +++- tools/hdi-gen/codegen/code_emitter.cpp | 77 ++++++++ tools/hdi-gen/codegen/code_emitter.h | 52 ++++++ tools/hdi-gen/codegen/code_generator.cpp | 176 ++++++++++++++++++ tools/hdi-gen/codegen/code_generator.h | 20 +- .../cpp_client_interface_code_emitter.cpp | 8 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/cpp_code_emitter.cpp | 62 ------ tools/hdi-gen/codegen/cpp_code_emitter.h | 26 +-- tools/hdi-gen/codegen/cpp_code_generator.cpp | 66 ------- tools/hdi-gen/codegen/cpp_code_generator.h | 35 ---- .../codegen/cpp_custom_types_code_emitter.cpp | 3 +- .../cpp_service_driver_code_emitter.cpp | 11 +- .../codegen/cpp_service_impl_code_emitter.cpp | 8 +- .../cpp_service_interface_code_emitter.cpp | 8 +- .../codegen/cpp_service_stub_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/generator_factory.cpp | 36 ---- tools/hdi-gen/codegen/generator_factory.h | 35 ---- .../java_client_interface_code_emitter.cpp | 8 +- .../java_client_proxy_code_emitter.cpp | 8 +- tools/hdi-gen/codegen/java_code_emitter.cpp | 52 ------ tools/hdi-gen/codegen/java_code_emitter.h | 23 +-- tools/hdi-gen/codegen/java_code_generator.cpp | 48 ----- tools/hdi-gen/codegen/java_code_generator.h | 35 ---- tools/hdi-gen/main.cpp | 5 +- tools/hdi-gen/parser/Makefile | 12 -- tools/hdi-gen/parser/module_parser.h | 2 +- tools/hdi-gen/parser/parser.cpp | 24 ++- .../array_test/v1_0/ArrayTypes.idl | 29 +++ .../array_test/v1_0/IArrayTest.idl | 40 ++++ .../kernel_test/data_test/v1_0/DataTypes.idl | 29 +++ .../kernel_test/data_test/v1_0/IDataTest.idl | 40 ++++ .../kernel_test/list_test/v1_0/IListTest.idl | 40 ++++ .../kernel_test/list_test/v1_0/ListTypes.idl | 29 +++ .../struct_test/v1_0/IStructTest.idl | 20 ++ .../struct_test/v1_0/StructTypes.idl | 87 +++++++++ tools/hdi-gen/util/Makefile | 14 -- tools/hdi-gen/util/file.cpp | 23 ++- tools/hdi-gen/util/file.h | 2 + tools/hdi-gen/util/options.cpp | 24 ++- tools/hdi-gen/util/options.h | 14 ++ 63 files changed, 1473 insertions(+), 833 deletions(-) create mode 100755 tools/hdi-gen/MakefileLinux create mode 100755 tools/hdi-gen/MakefileWin delete mode 100755 tools/hdi-gen/ast/Makefile delete mode 100755 tools/hdi-gen/codegen/Makefile delete mode 100755 tools/hdi-gen/codegen/c_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/c_code_generator.h create mode 100755 tools/hdi-gen/codegen/code_emitter.cpp create mode 100755 tools/hdi-gen/codegen/code_emitter.h create mode 100755 tools/hdi-gen/codegen/code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_code_generator.h delete mode 100755 tools/hdi-gen/codegen/generator_factory.cpp delete mode 100755 tools/hdi-gen/codegen/generator_factory.h delete mode 100755 tools/hdi-gen/codegen/java_code_generator.cpp delete mode 100755 tools/hdi-gen/codegen/java_code_generator.h delete mode 100755 tools/hdi-gen/parser/Makefile create mode 100755 tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl create mode 100755 tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl create mode 100755 tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl delete mode 100755 tools/hdi-gen/util/Makefile diff --git a/tools/hdi-gen/Makefile b/tools/hdi-gen/Makefile index 223697901..47499d30c 100755 --- a/tools/hdi-gen/Makefile +++ b/tools/hdi-gen/Makefile @@ -1,46 +1,24 @@ -TARGET = hdi-gen - -PWD:=$(shell pwd) -export BUILD_DIR = $(PWD)/build -export BOUNDS_CHECK_LIB := $(abspath ../../../../third_party/bounds_checking_function) -export INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_LIB)/include -export CXXFLAGS = -std=c++14 -O2 -export Q := @ -export MAKEFLAGS += --no-print-directory - -BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_LIB)/src/*.c) -BOUNDS_CHECK_BUILD := $(BUILD_DIR)/bounds_checking_function -BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_BUILD)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) -BOUNDS_CHECK_TARGET := $(BOUNDS_CHECK_BUILD)/bounds_checking_function.a - -SOURCE := $(wildcard *.cpp) -OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(SOURCE))) - -SUBDIRS = util ast parser codegen -LIBS = $(BUILD_DIR)/codegen/codegen.a $(BUILD_DIR)/parser/parser.a $(BUILD_DIR)/ast/ast.a $(BUILD_DIR)/util/util.a - -all:$(TARGET) - -$(TARGET): $(OBJS) | $(BOUNDS_CHECK_TARGET) - $(Q) for subdir in $(SUBDIRS); do \ - $(MAKE) -C $$subdir || exit 1; \ - done - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ $(LIBS) $(BOUNDS_CHECK_TARGET) - $(Q) echo $(TARGET):build successful. - -$(OBJS):$(SOURCE) - $(Q) mkdir -p $(BUILD_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(BOUNDS_CHECK_TARGET):$(BOUNDS_CHECK_OBJS) - $(Q) echo $(BOUNDS_CHECK_TARGET) - $(Q) ar -rc $@ $^ - -$(BOUNDS_CHECK_BUILD)/%.o : $(BOUNDS_CHECK_LIB)/src/%.c - $(Q) mkdir -p $(BOUNDS_CHECK_BUILD) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -clean: - $(Q) rm -rf $(BUILD_DIR) $(TARGET) - -.PHONY:all clean \ No newline at end of file +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +export TARGET:=hdi-gen +export CXXFLAGS = -std=c++14 -O2 -w +export Q := @ +export MAKEFLAGS += --no-print-directory + +MAKE_FILE_NAME = MakefileLinux +ifeq ($(findstring ;, $(PATH)), ;) + MAKE_FILE_NAME := MakefileWin +endif + +all: + $(Q) echo start build $(TARGET) ... + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) + +clean: + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) clean + +.PHONY: clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileLinux b/tools/hdi-gen/MakefileLinux new file mode 100755 index 000000000..6d5eac498 --- /dev/null +++ b/tools/hdi-gen/MakefileLinux @@ -0,0 +1,72 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +PWD := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) +BUILD_DIR = $(PWD)/build +BOUNDS_CHECK_DIR := $(abspath ../../../../third_party/bounds_checking_function) +INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_DIR)/include + +CODEGEN_SOURCE_DIR := $(PWD)/codegen +CODEGEN_SOURCE := $(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR := $(BUILD_DIR)/codegen +CODEGEN_OBJS := $(addprefix $(CODEGEN_OBJ_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR := $(PWD)/parser +PARSER_SOURCE := $(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR := $(BUILD_DIR)/parser +PARSER_OBJS := $(addprefix $(PARSER_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR := $(PWD)/ast +AST_SOURCE := $(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR := $(BUILD_DIR)/ast +AST_OBJS := $(addprefix $(AST_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR := $(PWD)/util +UTIL_SOURCE := $(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR := $(BUILD_DIR)/util +UTIL_OBJS := $(addprefix $(UTIL_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR := $(abspath ../../../../third_party/bounds_checking_function/src) +BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR := $(BUILD_DIR)/bounds_checking_function +BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_OBJS_DIR)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE := $(wildcard *.cpp) +MAIN_OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all:$(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)/%.o : %.cpp + $(Q) mkdir -p $(BUILD_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)/%.o : $(CODEGEN_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(CODEGEN_OBJ_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)/%.o : $(PARSER_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(PARSER_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)/%.o : $(AST_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(AST_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)/%.o : $(UTIL_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(UTIL_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)/%.o : $(BOUNDS_CHECK_SOURCE_DIR)/%.c + $(Q) mkdir -p $(BOUNDS_CHECK_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) rm -rf $(TARGET) $(BUILD_DIR) + +.PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileWin b/tools/hdi-gen/MakefileWin new file mode 100755 index 000000000..51c1e8156 --- /dev/null +++ b/tools/hdi-gen/MakefileWin @@ -0,0 +1,73 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +PWD:=$(subst /,\, $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))) +BUILD_DIR:=$(PWD)\build +BOUNDS_CHECK_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function) +INCLUDES:=-I $(PWD) -I $(BOUNDS_CHECK_DIR)\include + +CODEGEN_SOURCE_DIR:=$(PWD)\codegen +CODEGEN_SOURCE:=$(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR:=$(BUILD_DIR)\codegen +CODEGEN_OBJS:=$(addprefix $(CODEGEN_OBJ_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR:=$(PWD)\parser +PARSER_SOURCE:=$(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR:=$(BUILD_DIR)\parser +PARSER_OBJS:=$(addprefix $(PARSER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR:=$(PWD)\ast +AST_SOURCE:=$(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR:=$(BUILD_DIR)\ast +AST_OBJS:=$(addprefix $(AST_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR:=$(PWD)\util +UTIL_SOURCE:=$(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR:=$(BUILD_DIR)\util +UTIL_OBJS:=$(addprefix $(UTIL_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function\src) +BOUNDS_CHECK_SOURCE:=$(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR:=$(BUILD_DIR)\bounds_checking_function +BOUNDS_CHECK_OBJS:=$(addprefix $(BOUNDS_CHECK_OBJS_DIR)\, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE:=$(wildcard *.cpp) +MAIN_OBJS:=$(addprefix $(BUILD_DIR)\, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all : $(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)\\%.o : %.cpp + $(Q) if not exist $(BUILD_DIR) (mkdir $(BUILD_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)\\%.o : $(CODEGEN_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(CODEGEN_OBJ_DIR) (mkdir $(CODEGEN_OBJ_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)\\%.o : $(PARSER_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(PARSER_OBJS_DIR) (mkdir $(PARSER_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)\\%.o : $(AST_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(AST_OBJS_DIR) (mkdir $(AST_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)\\%.o : $(UTIL_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(UTIL_OBJS_DIR) (mkdir $(UTIL_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)\\%.o : $(BOUNDS_CHECK_SOURCE_DIR)\\%.c + $(Q) if not exist $(BOUNDS_CHECK_OBJS_DIR) (mkdir $(BOUNDS_CHECK_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) if exist $(TARGET).exe (del $(TARGET).exe) + $(Q) if exist $(BUILD_DIR) (rd /s /q $(BUILD_DIR)) + +.PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/ast/Makefile b/tools/hdi-gen/ast/Makefile deleted file mode 100755 index 04f71251b..000000000 --- a/tools/hdi-gen/ast/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/ast -TARGET = $(OBJS_DIR)/ast.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index e79d33d94..68f91e6fb 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_array_type.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -93,7 +94,12 @@ void ASTArrayType::EmitCWriteVar(const String& parcelName, const String& name, c sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT @@ -122,12 +128,14 @@ void ASTArrayType::EmitCProxyReadVar(const String& parcelName, const String& nam EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); - sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", - name.string(), name.string()); + EmitCProxyReadStrElement(parcelName, name, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&(*%s)[i]", name.string()); elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); @@ -164,11 +172,13 @@ void ASTArrayType::EmitCStubReadVar(const String& parcelName, const String& name EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); sb.Append("\n"); - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + EmitCStubReadStrElement(parcelName, name, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -228,7 +238,12 @@ void ASTArrayType::EmitCMarshalling(const String& name, StringBuilder& sb, const "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %sLen; i++) {\n", name.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + } String elementName = String::Format("(%s)[i]", name.string()); elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); @@ -253,12 +268,33 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); - sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", + name.string(), element.string()); + } } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -335,10 +371,13 @@ void ASTArrayType::EmitMemoryRecycle(const String& name, bool isClient, bool own String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING - || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : String::Format("%s[i]", varName.string()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); @@ -502,5 +541,58 @@ void ASTArrayType::EmitCMallocVar(const String& name, const String& lenName, boo sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).AppendFormat("}\n"); } + +void ASTArrayType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String cpName = String::Format("%sCp", name.string()); + elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), cpName.string()); + sb.Append(prefix + g_tab).AppendFormat("if ((*%s)[i] == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n\n"); + sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s((*%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), cpName.string(), cpName.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + cpName.string()); + sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n"); + } else { + sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + name.string(), name.string()); + } +} + +void ASTArrayType::EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + String element = String::Format("%sCp", name.string()); + String newPrefix = prefix + g_tab + g_tab; + elementType_->EmitCStubReadVar(parcelName, element, sb, newPrefix); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 968b0c82d..2d85836b3 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -81,6 +81,12 @@ private: void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + + void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + AutoPtr elementType_; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index a634ae15c..fed768d38 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_list_type.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -93,7 +94,12 @@ void ASTListType::EmitCWriteVar(const String& parcelName, const String& name, co sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } String elementName = ""; if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT @@ -122,12 +128,14 @@ void ASTListType::EmitCProxyReadVar(const String& parcelName, const String& name EmitCMallocVar(name, lenName, true, gotoLabel, sb, prefix); sb.Append("\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < *%s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < *%s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String cpName = String::Format("%sCp", name.string()); - elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); - sb.Append(prefix).Append(g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", - name.string(), name.string()); + EmitCProxyReadStrElement(parcelName, name, gotoLabel, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&(*%s)[i]", name.string()); elementType_->EmitCProxyReadVar(parcelName, element, true, gotoLabel, sb, prefix + g_tab); @@ -165,11 +173,14 @@ void ASTListType::EmitCStubReadVar(const String& parcelName, const String& name, EmitCMallocVar(name, lenName, false, "errors", sb, prefix + g_tab); sb.Append("\n"); - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sCp", name.string()); - elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); - sb.Append(prefix + g_tab + g_tab).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + EmitCStubReadStrElement(parcelName, name, sb, prefix); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCStubReadVar(parcelName, element, sb, prefix + g_tab + g_tab); @@ -229,7 +240,12 @@ void ASTListType::EmitCMarshalling(const String& name, StringBuilder& sb, const "HDF_LOGE(\"%%{public}s: write %sLen failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("for (i = 0; i < %sLen; i++) {\n", name.string()); + } else { + sb.Append(prefix).AppendFormat("for (uint32_t i = 0; i < %sLen; i++) {\n", name.string()); + } String elementName = String::Format("(%s)[i]", name.string()); elementType_->EmitCMarshalling(elementName, sb, prefix + g_tab); @@ -256,12 +272,32 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons sb.Append(newPrefix).Append("}\n"); freeObjStatements.push_back(String::Format("OsalMemFree(%s);\n", name.string())); - sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(newPrefix).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { String element = String::Format("%sElement", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", + name.string(), element.string()); + } } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -338,9 +374,13 @@ void ASTListType::EmitMemoryRecycle(const String& name, bool isClient, bool owne String lenName = isClient ? String::Format("*%sLen", name.string()) : String::Format("%sLen", name.string()); sb.Append(prefix).AppendFormat("if (%s > 0 && %s != NULL) {\n", lenName.string(), varName.string()); - if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING - || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING || elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("for (i = 0; i < %s; i++) {\n", lenName.string()); + } else { + sb.Append(prefix + g_tab).AppendFormat("for (uint32_t i = 0; i < %s; i++) {\n", lenName.string()); + } + String elementName = isClient ? String::Format("(%s)[i]", varName.string()) : String::Format("%s[i]", varName.string()); elementType_->EmitMemoryRecycle(elementName, false, false, sb, prefix + g_tab + g_tab); @@ -401,5 +441,58 @@ void ASTListType::EmitCMallocVar(const String& name, const String& lenName, bool sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(prefix).AppendFormat("}\n"); } + +void ASTListType::EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const +{ + String cpName = String::Format("%sCp", name.string()); + elementType_->EmitCProxyReadVar(parcelName, cpName, true, gotoLabel, sb, prefix + g_tab); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), cpName.string()); + sb.Append(prefix + g_tab).AppendFormat("if ((*%s)[i] == NULL) {\n", name.string()); + sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n\n"); + sb.Append(prefix + g_tab).AppendFormat("if (strcpy_s((*%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), cpName.string(), cpName.string()); + sb.Append(prefix + g_tab + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + cpName.string()); + sb.Append(prefix + g_tab + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix + g_tab).Append("}\n"); + } else { + sb.Append(prefix + g_tab).AppendFormat("(*%s)[i] = strdup(%sCp);\n", + name.string(), name.string()); + } +} + +void ASTListType::EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const +{ + String element = String::Format("%sCp", name.string()); + String newPrefix = prefix + g_tab + g_tab; + elementType_->EmitCStubReadVar(parcelName, element, sb, newPrefix); + sb.Append("\n"); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).AppendFormat("%s[i] = strdup(%sCp);\n", name.string(), name.string()); + } +} } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index fd90497e2..cb99d1b78 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -79,6 +79,12 @@ private: void EmitCMallocVar(const String& name, const String& lenName, bool isClient, const String& gotoLabel, StringBuilder& sb, const String& prefix) const; + void EmitCProxyReadStrElement(const String& parcelName, const String& name, const String& gotoLabel, + StringBuilder& sb, const String& prefix) const; + + void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, + const String& prefix) const; + AutoPtr elementType_ = nullptr; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_union_type.cpp b/tools/hdi-gen/ast/ast_union_type.cpp index ea1404f65..328b4eabd 100755 --- a/tools/hdi-gen/ast/ast_union_type.cpp +++ b/tools/hdi-gen/ast/ast_union_type.cpp @@ -7,6 +7,7 @@ */ #include "ast/ast_union_type.h" +#include "util/options.h" #include "util/string_builder.h" namespace OHOS { @@ -150,8 +151,13 @@ String ASTUnionType::EmitJavaTypeDecl() const void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", - parcelName.string(), name.string(), EmitCType().string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteBuffer(%s, (const void *)%s, sizeof(%s))) {\n", + parcelName.string(), name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(%s, (const uint8_t *)%s, sizeof(%s))) {\n", + parcelName.string(), name.string(), EmitCType().string()); + } sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -162,10 +168,24 @@ void ASTUnionType::EmitCWriteVar(const String& parcelName, const String& name, c void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), - EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(%s, (const void **)&%s, &len)) {\n", + parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + } + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -176,10 +196,24 @@ void ASTUnionType::EmitCProxyReadVar(const String& parcelName, const String& nam void ASTUnionType::EmitCStubReadVar(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), - EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(%s, (const void **)&%s, &len)) {\n", + parcelName.string(), name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (%s *)HdfSbufReadUnpadBuffer(%s, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), parcelName.string(), EmitCType().string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + } + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -218,8 +252,13 @@ void ASTUnionType::EmitCppReadVar(const String& parcelName, const String& name, void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(data, (const uint8_t *)&%s, sizeof(%s))) {\n", - name.string(), EmitCType().string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteBuffer(data, (const void *)&%s, sizeof(%s))) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("if (!HdfSbufWriteUnpadBuffer(data, (const uint8_t *)&%s, sizeof(%s))) {\n", + name.string(), EmitCType().string()); + } sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("return false;\n"); @@ -229,9 +268,22 @@ void ASTUnionType::EmitCMarshalling(const String& name, StringBuilder& sb, const void ASTUnionType::EmitCUnMarshalling(const String& name, StringBuilder& sb, const String& prefix, std::vector& freeObjStatements) const { - sb.Append(prefix).AppendFormat("const %s *%s = (const %s *)HdfSbufReadUnpadBuffer(data, sizeof(%s));\n", - EmitCType().string(), name.string(), EmitCType().string(), EmitCType().string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(prefix).AppendFormat("%s *%s = NULL;\n", EmitCType().string(), name.string()); + sb.Append(prefix).Append("uint32_t len = 0;\n"); + sb.Append(prefix).AppendFormat("if (!HdfSbufReadBuffer(data, (const void **)&%s, &len)) {\n", name.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || sizeof(%s) != len) {\n", + name.string(), EmitCType().string()); + } else { + sb.Append(prefix).AppendFormat("const %s *%s = (const %s *)HdfSbufReadUnpadBuffer(data, sizeof(%s));\n", + EmitCType().string(), name.string(), EmitCType().string(), EmitCType().string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", name.string()); + } + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("goto errors;\n"); diff --git a/tools/hdi-gen/codegen/Makefile b/tools/hdi-gen/codegen/Makefile deleted file mode 100755 index 64ac5af8d..000000000 --- a/tools/hdi-gen/codegen/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/codegen -TARGET = $(OBJS_DIR)/codegen.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp index 7ddbd0dbb..7c5a628ca 100755 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -87,13 +87,23 @@ void CClientInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) void CClientInterfaceCodeEmitter::EmitForwardDecls(StringBuilder& sb) { - sb.Append("struct HdfRemoteService;\n"); + if (isKernelCode_) { + sb.Append("struct HdfIoService;\n"); + } else { + sb.Append("struct HdfRemoteService;\n"); + } } void CClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) { sb.AppendFormat("struct %s {\n", interfaceName_.string()); - sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + + if (isKernelCode_) { + sb.Append(g_tab).Append("struct HdfIoService *serv;\n"); + } else { + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + } + sb.Append("\n"); EmitInterfaceMethodsDecl(sb, g_tab); sb.Append("};\n"); diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index 21f7e869c..fd93f37b0 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -91,7 +91,11 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() EmitProxyConstruction(sb); if (!isCallbackInterface()) { sb.Append("\n"); - EmitProxyGetMethodImpl(sb); + if (isKernelCode_) { + EmitKernelProxyGetMethodImpl(sb); + } else { + EmitProxyGetMethodImpl(sb); + } sb.Append("\n"); EmitProxyReleaseMethodImpl(sb); } else { @@ -127,7 +131,12 @@ void CClientProxyCodeEmitter::EmitProxyStdlibInclusions(StringBuilder& sb) sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - sb.Append("#include \n"); + + if (isKernelCode_) { + sb.Append("#include \n"); + } else { + sb.Append("#include \n"); + } const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { @@ -145,13 +154,21 @@ void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb) infName_.string(), interfaceName_.string()); sb.Append(g_tab).Append("struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(g_tab).Append("if (self->remote == NULL\n"); - sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher == NULL\n"); - sb.Append(g_tab).Append(g_tab).Append("|| self->remote->dispatcher->Dispatch == NULL) {\n"); + + String remoteName = isKernelCode_ ? "serv" : "remote"; + sb.Append(g_tab).AppendFormat("if (self->%s == NULL\n", remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher == NULL\n", remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher->Dispatch == NULL) {\n", remoteName.string()); sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: obj is null\", __func__);\n"); sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_OBJECT;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + + if (isKernelCode_) { + sb.Append(g_tab).Append("return self->serv->dispatcher->Dispatch"); + sb.Append("((struct HdfObject *)&(self->serv->object), id, data, reply);\n"); + } else { + sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + } sb.Append("}\n"); } @@ -195,8 +212,21 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth { sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); - sb.Append("\n"); + // Local variable definitions must precede all execution statements. + if (isKernelCode_) { + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr type = param->GetType(); + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || + type->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(prefix + g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + + sb.Append("\n"); EmitCreateBuf(sb, prefix + g_tab); sb.Append("\n"); @@ -236,10 +266,15 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth void CClientProxyCodeEmitter::EmitCreateBuf(StringBuilder& sb, const String& prefix) { - sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append("\n"); + if (isKernelCode_) { + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufObtainDefaultSize();\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufObtainDefaultSize();\n"); + } else { + sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + } + sb.Append("\n"); sb.Append(prefix).Append("if (data == NULL || reply == NULL) {\n"); sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); @@ -265,7 +300,24 @@ void CClientProxyCodeEmitter::EmitReadProxyMethodParameter(const AutoPtrGetName().string()); type->EmitCProxyReadVar(parcelName, cloneName, false, gotoLabel, sb, prefix); String leftVar = String::Format("*%s", param->GetName().string()); - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", leftVar.string(), cloneName.string()); + if (isKernelCode_) { + sb.Append("\n"); + sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + leftVar.string(), cloneName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", leftVar.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + leftVar.string(), cloneName.string(), cloneName.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + leftVar.string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", leftVar.string(), cloneName.string()); + } } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { String name = String::Format("*%s", param->GetName().string()); sb.Append(prefix).AppendFormat("%s = (%s*)OsalMemAlloc(sizeof(%s));\n", @@ -371,6 +423,35 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) sb.Append("}\n"); } +void CClientProxyCodeEmitter::EmitKernelProxyGetMethodImpl(StringBuilder& sb) +{ + sb.AppendFormat("struct %s *Hdi%sGet()\n", interfaceName_.string(), infName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct HdfIoService *serv = "); + sb.AppendFormat("HdfIoServiceBind(\"%s\");\n", infName_.string()); + sb.Append(g_tab).Append("if (serv == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + + sb.Append(g_tab).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", + interfaceName_.string(), infName_.string(), interfaceName_.string(), interfaceName_.string()); + sb.Append(g_tab).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: malloc %s instance failed!\", __func__);\n", interfaceName_.string()); + sb.Append(g_tab).Append(g_tab).Append("HdfIoServiceRecycle(serv);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + + sb.Append(g_tab).AppendFormat("%sClient->serv = serv;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("return %sClient;\n", infName_.string()); + sb.Append("}\n"); +} + void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) { sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); @@ -379,7 +460,11 @@ void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + if (isKernelCode_) { + sb.Append(g_tab).Append("HdfIoServiceRecycle(instance->serv);\n"); + } else { + sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + } sb.Append(g_tab).Append("OsalMemFree(instance);\n"); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 42f83cc69..41d78d8df 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -54,6 +54,8 @@ private: void EmitProxyGetMethodImpl(StringBuilder& sb); + void EmitKernelProxyGetMethodImpl(StringBuilder& sb); + void EmitProxyReleaseMethodImpl(StringBuilder& sb); void EmitCbProxyObtainMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index 25edb7165..1845cb523 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -13,68 +13,6 @@ namespace OHOS { namespace HDI { -bool CCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool CCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - - stubName_ = infName_ + "Stub"; - stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - - implName_ = infName_ + "Service"; - implFullName_ = interface_->GetNamespace()->ToString() + implName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void CCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; - stubName_ = ""; - stubFullName_ = ""; - implName_ = ""; - implFullName_ = ""; -} - String CCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index 997cf230e..f9cabda3e 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -11,29 +11,19 @@ #include #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" -#include "util/light_refcount_base.h" #include "util/string.h" #include "util/string_builder.h" namespace OHOS { namespace HDI { -class CCodeEmitter : public LightRefCountBase { +class CCodeEmitter : public CodeEmitter { public: virtual ~CCodeEmitter() = default; - bool OutPut(const AutoPtr& ast, const String& targetDirectory); - static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - void EmitInterfaceMethodCommands(StringBuilder& sb); void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); @@ -65,20 +55,6 @@ protected: } String SpecificationParam(StringBuilder& sb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; - String stubName_; - String stubFullName_; - String implName_; - String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/c_code_generator.cpp b/tools/hdi-gen/codegen/c_code_generator.cpp deleted file mode 100755 index 1ff73ae37..000000000 --- a/tools/hdi-gen/codegen/c_code_generator.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "c_code_generator.h" -#include -#include -#include -#include "codegen/c_client_interface_code_emitter.h" -#include "codegen/c_client_proxy_code_emitter.h" -#include "codegen/c_custom_types_code_emitter.h" -#include "codegen/c_service_driver_code_emitter.h" -#include "codegen/c_service_impl_code_emitter.h" -#include "codegen/c_service_interface_code_emitter.h" -#include "codegen/c_service_stub_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_TYPES: { - emitters_["types"]->OutPut(ast, targetDirectory_); - break; - } - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - emitters_["serviceIface"]->OutPut(ast, targetDirectory_); - emitters_["driver"]->OutPut(ast, targetDirectory_); - emitters_["stub"]->OutPut(ast, targetDirectory_); - emitters_["impl"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void CCodeGenerator::Initializate() -{ - emitters_ = { - {"types", new CCustomTypesCodeEmitter()}, - {"clientIface", new CClientInterfaceCodeEmitter()}, - {"proxy", new CClientProxyCodeEmitter()}, - {"serviceIface", new CServiceInterfaceCodeEmitter()}, - {"driver", new CServiceDriverCodeEmitter()}, - {"stub", new CServiceStubCodeEmitter()}, - {"impl", new CServiceImplCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_code_generator.h b/tools/hdi-gen/codegen/c_code_generator.h deleted file mode 100755 index b878a2a98..000000000 --- a/tools/hdi-gen/codegen/c_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_C_CODE_GENERATOR_H -#define OHOS_HDI_C_CODE_GENERATOR_H - -#include "codegen/c_code_emitter.h" -#include "codegen/code_generator.h" - -namespace OHOS { -namespace HDI { -class CCodeGenerator : public CodeGenerator { -public: - using CCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - CCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - virtual ~CCodeGenerator() = default; - - bool Generate() override; -private: - void Initializate(); - - CCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_C_CODE_GENERATOR_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 4e8f66b28..19d9883ee 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -8,6 +8,7 @@ #include "codegen/c_custom_types_code_emitter.h" #include "util/file.h" +#include "util/options.h" #include "util/logger.h" namespace OHOS { @@ -18,7 +19,8 @@ bool CCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); return false; @@ -210,6 +212,18 @@ void CCustomTypesCodeEmitter::EmitCustomTypeMarshallingImpl(StringBuilder& sb, c sb.AppendFormat("bool %sBlockMarshalling(struct HdfSBuf *data, const %s *%s)\n", type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (isKernelCode_) { + if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY || + memberType->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + for (size_t i = 0; i < type->GetMemberNumber(); i++) { String memberName = type->GetMemberName(i); AutoPtr memberType = type->GetMemberType(i); @@ -231,6 +245,17 @@ void CCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingImpl(StringBuilder& sb, type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + if (isKernelCode_) { + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (memberType->GetTypeKind() == TypeKind::TYPE_ARRAY || + memberType->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return false;\n"); sb.Append(g_tab).Append("}\n"); @@ -256,7 +281,22 @@ void CCustomTypesCodeEmitter::EmitMemberUnmarshalling(const AutoPtr& ty case TypeKind::TYPE_STRING: { String tmpName = String::Format("%sCp", memberName.string()); type->EmitCUnMarshalling(tmpName, sb, g_tab, freeObjStatements_); - sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); + + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(g_tab).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + varName.string(), tmpName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); + sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append("}\n"); + + sb.Append(g_tab).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + varName.string(), tmpName.string(), tmpName.string()); + sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); + sb.Append(g_tab).Append("}\n"); + } else { + sb.Append(g_tab).AppendFormat("%s = strdup(%s);\n", varName.string(), tmpName.string()); + } + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", varName.string()); sb.Append(g_tab).Append(g_tab).Append("goto errors;\n"); sb.Append(g_tab).Append("}\n"); @@ -317,6 +357,17 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.AppendFormat("void %sFree(%s *%s, bool freeSelf)\n", type->GetName().string(), type->EmitCType().string(), objName.string()); sb.Append("{\n"); + + if (isKernelCode_) { + for (size_t i = 0; i < type->GetMemberNumber(); i++) { + AutoPtr memberType = type->GetMemberType(i); + if (NeedEmitInitVar(memberType)) { + sb.Append(g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); @@ -330,6 +381,29 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeImpl(StringBuilder& sb, const Au sb.Append("}\n"); } +bool CCustomTypesCodeEmitter::NeedEmitInitVar(const AutoPtr& type) +{ + if (type == nullptr) { + return false; + } + + if (type->IsArrayType()) { + AutoPtr ArrType = dynamic_cast(type.Get()); + AutoPtr elementType = ArrType->GetElementType(); + if (elementType->IsStringType() || elementType->IsStructType()) { + return true; + } + } else if (type->IsListType()) { + AutoPtr ListType = dynamic_cast(type.Get()); + AutoPtr elementType = ListType->GetElementType(); + if (elementType->IsStringType() || elementType->IsStructType()) { + return true; + } + } + + return false; +} + void CCustomTypesCodeEmitter::EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix) { diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h index 6ae5e3a2b..02282252d 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h @@ -59,6 +59,8 @@ private: void EmitCustomTypeFreeImpl(StringBuilder& sb, const AutoPtr& type); + bool NeedEmitInitVar(const AutoPtr& type); + void EmitCustomTypeMemoryRecycle(const AutoPtr& type, const String& name, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index 3fda364fb..502b3de7a 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -18,7 +18,8 @@ bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); return false; diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index f483b2741..d6f090d87 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp index 01bcf358d..7ee75d035 100755 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -139,7 +139,7 @@ void CServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& void CServiceInterfaceCodeEmitter::EmitInterfaceInstanceMethodDecl(StringBuilder& sb) { - sb.AppendFormat("struct %s *Hdi%sInstance();\n", interfaceName_.string(), infName_.string()); + sb.AppendFormat("struct %s *Hdi%sInstance(void);\n", interfaceName_.string(), infName_.string()); } void CServiceInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& sb) diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index e8c6996cc..c045a6df1 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } @@ -152,6 +152,19 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); + // Local variable definitions must precede all execution statements. + if (isKernelCode_) { + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + AutoPtr type = param->GetType(); + if (type->GetTypeKind() == TypeKind::TYPE_ARRAY || + type->GetTypeKind() == TypeKind::TYPE_LIST) { + sb.Append(prefix + g_tab).Append("uint32_t i = 0;\n"); + break; + } + } + } + String gotoName = "errors"; if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { @@ -203,7 +216,24 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtrGetTypeKind() == TypeKind::TYPE_STRING) { String cloneName = String::Format("%sCp", param->GetName().string()); type->EmitCStubReadVar(parcelName, cloneName, sb, prefix); - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); + if (isKernelCode_) { + sb.Append("\n"); + sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + param->GetName().string(), cloneName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + param->GetName().string(), cloneName.string(), cloneName.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); + } } else if (type->GetTypeKind() == TypeKind::TYPE_INTERFACE) { type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { diff --git a/tools/hdi-gen/codegen/code_emitter.cpp b/tools/hdi-gen/codegen/code_emitter.cpp new file mode 100755 index 000000000..e002b2c8f --- /dev/null +++ b/tools/hdi-gen/codegen/code_emitter.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/code_emitter.h" + +#include "util/logger.h" + +namespace OHOS { +namespace HDI { + +bool CodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) +{ + if (!Reset(ast, targetDirectory, isKernelCode)) { + return false; + } + + EmitCode(); + return true; +} + +bool CodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) +{ + if (ast == nullptr || targetDirectory.Equals("")) { + return false; + } + + CleanData(); + + isKernelCode_ = isKernelCode; + ast_ = ast; + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + interface_ = ast_->GetInterfaceDef(); + interfaceName_ = interface_->GetName(); + interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; + infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; + proxyName_ = infName_ + "Proxy"; + proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; + + stubName_ = infName_ + "Stub"; + stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; + + implName_ = infName_ + "Service"; + implFullName_ = interface_->GetNamespace()->ToString() + implName_; + } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { + infName_ = ast_->GetName(); + } + + if (!ResolveDirectory(targetDirectory)) { + return false; + } + + return true; +} + +void CodeEmitter::CleanData() +{ + isKernelCode_ = false; + ast_ = nullptr; + interface_ = nullptr; + directory_ = ""; + interfaceName_ = ""; + interfaceFullName_ = ""; + infName_ = ""; + proxyName_ = ""; + proxyFullName_ = ""; + stubName_ = ""; + stubFullName_ = ""; + implName_ = ""; + implFullName_ = ""; +} +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/code_emitter.h b/tools/hdi-gen/codegen/code_emitter.h new file mode 100755 index 000000000..7a867460e --- /dev/null +++ b/tools/hdi-gen/codegen/code_emitter.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef OHOS_HDI_CODE_EMITTER_H +#define OHOS_HDI_CODE_EMITTER_H + +#include "ast/ast.h" +#include "util/autoptr.h" +#include "util/light_refcount_base.h" +#include "util/string.h" + +namespace OHOS { +namespace HDI { +class CodeEmitter : public LightRefCountBase { +public: + virtual ~CodeEmitter() = default; + + bool OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode = false); + +protected: + bool Reset(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode); + + void CleanData(); + + virtual bool ResolveDirectory(const String& targetDirectory) = 0; + + virtual void EmitCode() = 0; + + bool isKernelCode_ = false; + AutoPtr ast_ = nullptr; + AutoPtr interface_ = nullptr; + String directory_; + + String interfaceName_; + String interfaceFullName_; + String infName_; + String proxyName_; + String proxyFullName_; + String stubName_; + String stubFullName_; + String implName_; + String implFullName_; +}; +} +} + +#endif // OHOS_HDI_CODE_EMITTER_H diff --git a/tools/hdi-gen/codegen/code_generator.cpp b/tools/hdi-gen/codegen/code_generator.cpp new file mode 100755 index 000000000..ba65e72c0 --- /dev/null +++ b/tools/hdi-gen/codegen/code_generator.cpp @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/code_generator.h" +#include "codegen/c_client_interface_code_emitter.h" +#include "codegen/c_client_proxy_code_emitter.h" +#include "codegen/c_custom_types_code_emitter.h" +#include "codegen/c_service_driver_code_emitter.h" +#include "codegen/c_service_impl_code_emitter.h" +#include "codegen/c_service_interface_code_emitter.h" +#include "codegen/c_service_stub_code_emitter.h" +#include "codegen/cpp_client_interface_code_emitter.h" +#include "codegen/cpp_client_proxy_code_emitter.h" +#include "codegen/cpp_custom_types_code_emitter.h" +#include "codegen/cpp_service_driver_code_emitter.h" +#include "codegen/cpp_service_impl_code_emitter.h" +#include "codegen/cpp_service_interface_code_emitter.h" +#include "codegen/cpp_service_stub_code_emitter.h" +#include "codegen/java_client_interface_code_emitter.h" +#include "codegen/java_client_proxy_code_emitter.h" +#include "util/options.h" + + +namespace OHOS { +namespace HDI { +CodeEmitMap CodeGenerator::cCodeEmitters_ = { + {"types", new CCustomTypesCodeEmitter()}, + {"clientIface", new CClientInterfaceCodeEmitter()}, + {"proxy", new CClientProxyCodeEmitter()}, + {"serviceIface", new CServiceInterfaceCodeEmitter()}, + {"driver", new CServiceDriverCodeEmitter()}, + {"stub", new CServiceStubCodeEmitter()}, + {"impl", new CServiceImplCodeEmitter()}, +}; + +CodeEmitMap CodeGenerator::cppCodeEmitters_ = { + {"types", new CppCustomTypesCodeEmitter()}, + {"clientIface", new CppClientInterfaceCodeEmitter()}, + {"proxy", new CppClientProxyCodeEmitter()}, + {"serviceIface", new CppServiceInterfaceCodeEmitter()}, + {"driver", new CppServiceDriverCodeEmitter()}, + {"stub", new CppServiceStubCodeEmitter()}, + {"impl", new CppServiceImplCodeEmitter()}, +}; + +CodeEmitMap CodeGenerator::javaCodeEmitters_ = { + {"clientIface", new JavaClientInterfaceCodeEmitter()}, + {"proxy", new JavaClientProxyCodeEmitter()}, +}; + +bool CodeGenerator::Generate() +{ + const Options& options = Options::GetInstance(); + + String dir = options.GetGenerationDirectory(); + String language = options.GetTargetLanguage(); + bool isModeKernel = options.DoGenerateKernelCode(); + String codePart = options.GetCodePart(); + + for (auto& astPair : astModule_->GetAllAsts()) { + AutoPtr ast = astPair.second; + if (language.Equals("c")) { + GenerateCCode(ast, dir, codePart, isModeKernel); + } else if (language.Equals("cpp")) { + GenerateCppCode(ast, dir, codePart); + } else if (language.Equals("java")) { + GenerateJavaCode(ast, dir, codePart); + } + } + + return true; +} + +void CodeGenerator::GenerateCCode(const AutoPtr& ast, const String& outDir, const String& codePart, bool isKernel) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: { + cCodeEmitters_["types"]->OutPut(ast, outDir, isKernel); + break; + } + case ASTFileType::AST_IFACE: { + if (codePart.Equals("client")) { + cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); + break; + } else if (codePart.Equals("server")) { + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); + break; + } else { + cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); + } + break; + } + case ASTFileType::AST_ICALLBACK: + // khdf doesn't support callback + cCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cCodeEmitters_["proxy"]->OutPut(ast, outDir); + cCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cCodeEmitters_["driver"]->OutPut(ast, outDir); + cCodeEmitters_["stub"]->OutPut(ast, outDir); + cCodeEmitters_["impl"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +void CodeGenerator::GenerateCppCode(const AutoPtr& ast, const String& outDir, const String& codePart) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_TYPES: + cppCodeEmitters_["types"]->OutPut(ast, outDir); + break; + case ASTFileType::AST_IFACE: { + if (codePart.Equals("client")) { + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + } else if (codePart.Equals("server")) { + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + } else { + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + } + break; + } + case ASTFileType::AST_ICALLBACK: + cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["proxy"]->OutPut(ast, outDir); + cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["driver"]->OutPut(ast, outDir); + cppCodeEmitters_["stub"]->OutPut(ast, outDir); + cppCodeEmitters_["impl"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +void CodeGenerator::GenerateJavaCode(const AutoPtr& ast, const String& outDir, const String& codePart) +{ + switch (ast->GetASTFileType()) { + case ASTFileType::AST_IFACE: + javaCodeEmitters_["clientIface"]->OutPut(ast, outDir); + javaCodeEmitters_["proxy"]->OutPut(ast, outDir); + break; + case ASTFileType::AST_ICALLBACK: + javaCodeEmitters_["clientIface"]->OutPut(ast, outDir); + javaCodeEmitters_["proxy"]->OutPut(ast, outDir); + break; + default: + break; + } +} + +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index 9e001033c..c5f0f59f1 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -9,21 +9,31 @@ #ifndef OHOS_HDI_CODEGENERATOR_H #define OHOS_HDI_CODEGENERATOR_H +#include "codegen/code_emitter.h" #include "ast/ast_module.h" namespace OHOS { namespace HDI { +using CodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; + class CodeGenerator : public LightRefCountBase { public: - CodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : LightRefCountBase(), astModule_(astModule), targetDirectory_(targetDirectory) {} + explicit CodeGenerator(const AutoPtr& astModule) + : LightRefCountBase(), astModule_(astModule), targetDirectory_() {} - virtual ~CodeGenerator() = default; + bool Generate(); +private: + void GenerateCCode(const AutoPtr& ast, const String& outDir, const String& codePart, + bool isKernel); + void GenerateCppCode(const AutoPtr& ast, const String& outDir, const String& codePart); + void GenerateJavaCode(const AutoPtr& ast, const String& outDir, const String& codePart); - virtual bool Generate() = 0; -protected: AutoPtr astModule_; String targetDirectory_; + + static CodeEmitMap cCodeEmitters_; + static CodeEmitMap cppCodeEmitters_; + static CodeEmitMap javaCodeEmitters_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp index bb8941be9..6a85a0d22 100755 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 5ba2bf294..2ef741075 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool CppClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index a0b6d11b5..74b14832e 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -16,68 +16,6 @@ namespace OHOS { namespace HDI { -bool CppCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool CppCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - - stubName_ = infName_ + "Stub"; - stubFullName_ = interface_->GetNamespace()->ToString() + stubName_; - - implName_ = infName_ + "Service"; - implFullName_ = interface_->GetNamespace()->ToString() + implName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void CppCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; - stubName_ = ""; - stubFullName_ = ""; - implName_ = ""; - implFullName_ = ""; -} - String CppCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index 127161dcc..c46a6ff0f 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -10,14 +10,14 @@ #define OHOS_HDI_CPP_CODE_EMITTER_H #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" -#include "util/light_refcount_base.h" #include "util/string.h" #include "util/string_builder.h" namespace OHOS { namespace HDI { -class CppCodeEmitter : public LightRefCountBase { +class CppCodeEmitter : public CodeEmitter { public: virtual ~CppCodeEmitter() = default; @@ -25,14 +25,6 @@ public: static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix); void EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix); @@ -77,20 +69,6 @@ protected: } String SpecificationParam(StringBuilder& sb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; - String stubName_; - String stubFullName_; - String implName_; - String implFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_code_generator.cpp b/tools/hdi-gen/codegen/cpp_code_generator.cpp deleted file mode 100755 index 7adb9e7a9..000000000 --- a/tools/hdi-gen/codegen/cpp_code_generator.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "cpp_code_generator.h" -#include -#include -#include -#include "codegen/cpp_client_interface_code_emitter.h" -#include "codegen/cpp_client_proxy_code_emitter.h" -#include "codegen/cpp_custom_types_code_emitter.h" -#include "codegen/cpp_service_driver_code_emitter.h" -#include "codegen/cpp_service_impl_code_emitter.h" -#include "codegen/cpp_service_interface_code_emitter.h" -#include "codegen/cpp_service_stub_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CppCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_TYPES: { - emitters_["types"]->OutPut(ast, targetDirectory_); - break; - } - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - emitters_["serviceIface"]->OutPut(ast, targetDirectory_); - emitters_["driver"]->OutPut(ast, targetDirectory_); - emitters_["stub"]->OutPut(ast, targetDirectory_); - emitters_["impl"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void CppCodeGenerator::Initializate() -{ - emitters_ = { - {"types", new CppCustomTypesCodeEmitter()}, - {"clientIface", new CppClientInterfaceCodeEmitter()}, - {"proxy", new CppClientProxyCodeEmitter()}, - {"serviceIface", new CppServiceInterfaceCodeEmitter()}, - {"driver", new CppServiceDriverCodeEmitter()}, - {"stub", new CppServiceStubCodeEmitter()}, - {"impl", new CppServiceImplCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_code_generator.h b/tools/hdi-gen/codegen/cpp_code_generator.h deleted file mode 100755 index 5adc37ed4..000000000 --- a/tools/hdi-gen/codegen/cpp_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_CPP_CODE_GENERATOR_H -#define OHOS_HDI_CPP_CODE_GENERATOR_H - -#include "codegen/code_generator.h" -#include "codegen/cpp_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CppCodeGenerator : public CodeGenerator { -public: - using CppCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - CppCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - ~CppCodeGenerator() = default; - - bool Generate() override; -private: - void Initializate(); - - CppCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_CPP_CODE_GENERATOR_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index f6a6d1d4b..248b801ea 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -18,7 +18,8 @@ bool CppCustomTypesCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CppCustomTypesCodeEmitter", "Create '%s' failed!", directory_.string()); return false; diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 1c5dacf16..21a843227 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -18,7 +18,8 @@ bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory return false; } - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); return false; @@ -147,7 +148,13 @@ void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + infName_.string(), infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", + infName_.string()); + sb.Append(g_tab).AppendFormat("%sStubRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index e06b157ad..1d0d0e7d1 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp index 03dbe5bd9..5081476d2 100755 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index a2bfac6bf..aae2b7c4f 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -15,11 +15,11 @@ namespace HDI { bool CppServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/generator_factory.cpp b/tools/hdi-gen/codegen/generator_factory.cpp deleted file mode 100755 index e866efc94..000000000 --- a/tools/hdi-gen/codegen/generator_factory.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/generator_factory.h" -#include "codegen/c_code_generator.h" -#include "codegen/cpp_code_generator.h" -#include "codegen/java_code_generator.h" - -namespace OHOS { -namespace HDI { -GeneratorFactory& GeneratorFactory::GetInstance() -{ - static GeneratorFactory factory; - return factory; -} - -AutoPtr GeneratorFactory::GetCodeGenerator(const AutoPtr& astModule, - const String& targetLanuage, const String& targetDirectory) -{ - if (targetLanuage.Equals("c")) { - return new CCodeGenerator(astModule, targetDirectory); - } else if (targetLanuage.Equals("cpp")) { - return new CppCodeGenerator(astModule, targetDirectory); - } else if (targetLanuage.Equals("java")) { - return new JavaCodeGenerator(astModule, targetDirectory); - } - - return nullptr; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/generator_factory.h b/tools/hdi-gen/codegen/generator_factory.h deleted file mode 100755 index b572cc737..000000000 --- a/tools/hdi-gen/codegen/generator_factory.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_GENERATORFACTORY_H -#define OHOS_HDI_GENERATORFACTORY_H - -#include "ast/ast_module.h" -#include "codegen/code_generator.h" - -namespace OHOS { -namespace HDI { -class GeneratorFactory { -public: - GeneratorFactory(const GeneratorFactory&) = default; - - GeneratorFactory& operator=(const GeneratorFactory&) = default; - - ~GeneratorFactory() = default; - - static GeneratorFactory& GetInstance(); - - AutoPtr GetCodeGenerator(const AutoPtr& astModule, const String& targetLanuage, - const String& targetDirectory); -private: - GeneratorFactory() = default; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_GENERATORFACTORY_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp index 7f1c613c7..14b56a2ed 100755 --- a/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_interface_code_emitter.cpp @@ -16,11 +16,11 @@ namespace HDI { bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp index accefc662..3e3689bb8 100755 --- a/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_client_proxy_code_emitter.cpp @@ -14,11 +14,11 @@ namespace HDI { bool JavaClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string()); + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); } else { return false; } diff --git a/tools/hdi-gen/codegen/java_code_emitter.cpp b/tools/hdi-gen/codegen/java_code_emitter.cpp index b96e34c87..69716cdb2 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.cpp +++ b/tools/hdi-gen/codegen/java_code_emitter.cpp @@ -13,58 +13,6 @@ namespace OHOS { namespace HDI { -bool JavaCodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory) -{ - if (!Reset(ast, targetDirectory)) { - return false; - } - - EmitCode(); - return true; -} - -bool JavaCodeEmitter::Reset(const AutoPtr& ast, const String& targetDirectory) -{ - if (ast == nullptr) { - return false; - } - - if (targetDirectory.Equals("")) { - return false; - } - - CleanData(); - ast_ = ast; - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - interface_ = ast_->GetInterfaceDef(); - interfaceName_ = interface_->GetName(); - interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_; - infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_; - proxyName_ = infName_ + "Proxy"; - proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_; - } else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) { - infName_ = ast_->GetName(); - } - - if (!ResolveDirectory(targetDirectory)) { - return false; - } - - return true; -} - -void JavaCodeEmitter::CleanData() -{ - ast_ = nullptr; - interface_ = nullptr; - directory_ = ""; - interfaceName_ = ""; - interfaceFullName_ = ""; - infName_ = ""; - proxyName_ = ""; - proxyFullName_ = ""; -} - String JavaCodeEmitter::FileName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/java_code_emitter.h b/tools/hdi-gen/codegen/java_code_emitter.h index 32c1a99a3..d8b2360a1 100755 --- a/tools/hdi-gen/codegen/java_code_emitter.h +++ b/tools/hdi-gen/codegen/java_code_emitter.h @@ -10,6 +10,7 @@ #define OHOS_HDI_JAVA_CODE_EMITTER_H #include "ast/ast.h" +#include "codegen/code_emitter.h" #include "util/autoptr.h" #include "util/light_refcount_base.h" #include "util/string.h" @@ -17,22 +18,12 @@ namespace OHOS { namespace HDI { -class JavaCodeEmitter : public LightRefCountBase { +class JavaCodeEmitter : public CodeEmitter { public: virtual ~JavaCodeEmitter() = default; - bool OutPut(const AutoPtr& ast, const String& targetDirectory); - static String FileName(const String& name); protected: - bool Reset(const AutoPtr& ast, const String& targetDirectory); - - void CleanData(); - - virtual bool ResolveDirectory(const String& targetDirectory) = 0; - - virtual void EmitCode() = 0; - bool CreateDirectory(); void EmitLicense(StringBuilder& sb); @@ -46,16 +37,6 @@ protected: String ConstantName(const String& name); String SpecificationParam(StringBuilder& paramSb, const String& prefix); - - AutoPtr ast_ = nullptr; - AutoPtr interface_ = nullptr; - String directory_; - - String interfaceName_; - String interfaceFullName_; - String infName_; - String proxyName_; - String proxyFullName_; }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/java_code_generator.cpp b/tools/hdi-gen/codegen/java_code_generator.cpp deleted file mode 100755 index 5cae08859..000000000 --- a/tools/hdi-gen/codegen/java_code_generator.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "java_code_generator.h" -#include -#include -#include -#include "codegen/java_client_interface_code_emitter.h" -#include "codegen/java_client_proxy_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool JavaCodeGenerator::Generate() -{ - Initializate(); - - for (auto& astPair : astModule_->GetAllAsts()) { - AutoPtr ast = astPair.second; - switch (ast->GetASTFileType()) { - case ASTFileType::AST_IFACE: - case ASTFileType::AST_ICALLBACK: { - emitters_["clientIface"]->OutPut(ast, targetDirectory_); - emitters_["proxy"]->OutPut(ast, targetDirectory_); - break; - } - default: - break; - } - } - return true; -} - -void JavaCodeGenerator::Initializate() -{ - emitters_ = { - {"clientIface", new JavaClientInterfaceCodeEmitter()}, - {"proxy", new JavaClientProxyCodeEmitter()}, - }; -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/java_code_generator.h b/tools/hdi-gen/codegen/java_code_generator.h deleted file mode 100755 index 0274854e1..000000000 --- a/tools/hdi-gen/codegen/java_code_generator.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_JAVA_CODE_GENERATOR_H -#define OHOS_HDI_JAVA_CODE_GENERATOR_H - -#include "codegen/code_generator.h" -#include "codegen/java_code_emitter.h" - -namespace OHOS { -namespace HDI { -class JavaCodeGenerator : public CodeGenerator { -public: - using JavaCodeEmitMap = std::unordered_map, StringHashFunc, StringEqualFunc>; - - JavaCodeGenerator(const AutoPtr& astModule, const String& targetDirectory) - : CodeGenerator(astModule, targetDirectory), emitters_() {} - - ~JavaCodeGenerator() override {}; - - bool Generate() override; -private: - void Initializate(); - - JavaCodeEmitMap emitters_; -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_JAVA_CODE_GENERATOR_H \ No newline at end of file diff --git a/tools/hdi-gen/main.cpp b/tools/hdi-gen/main.cpp index e54e597aa..00c6e8533 100755 --- a/tools/hdi-gen/main.cpp +++ b/tools/hdi-gen/main.cpp @@ -7,7 +7,6 @@ */ #include "codegen/code_generator.h" -#include "codegen/generator_factory.h" #include "parser/module_parser.h" #include "util/file.h" #include "util/logger.h" @@ -57,9 +56,7 @@ int main(int argc, char** argv) return 0; } - AutoPtr codeGen = GeneratorFactory::GetInstance().GetCodeGenerator(astModule, - options.GetTargetLanguage(), options.GetGenerationDirectory()); - if (!codeGen->Generate()) { + if (!CodeGenerator(astModule).Generate()) { Logger::E("hdi-gen", "Generate \"%s\" codes failed.", options.GetTargetLanguage().string()); return -1; } diff --git a/tools/hdi-gen/parser/Makefile b/tools/hdi-gen/parser/Makefile deleted file mode 100755 index 186125b56..000000000 --- a/tools/hdi-gen/parser/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/parser -TARGET = $(OBJS_DIR)/parser.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 934ef45e9..4041d914b 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -9,8 +9,8 @@ #ifndef OHOS_HDI_MODULE_PARSER_H #define OHOS_HDI_MODULE_PARSER_H -#include #include +#include #include "ast/ast_module.h" #include "parser/file_detail.h" #include "util/options.h" diff --git a/tools/hdi-gen/parser/parser.cpp b/tools/hdi-gen/parser/parser.cpp index 26d4f5fdf..4a47a31d4 100755 --- a/tools/hdi-gen/parser/parser.cpp +++ b/tools/hdi-gen/parser/parser.cpp @@ -1223,6 +1223,20 @@ bool Parser::CheckType(int lineNo, int columnNo, const AutoPtr& type) LogError(lineNo, columnNo, String::Format("The sequenceable type is not supported by c language.")); return false; } + + if (options_.DoGenerateKernelCode()) { + switch (type->GetTypeKind()) { + case TypeKind::TYPE_FLOAT: + case TypeKind::TYPE_DOUBLE: + case TypeKind::TYPE_FILEDESCRIPTOR: + case TypeKind::TYPE_INTERFACE: + LogError(lineNo, columnNo, String::Format("The '%s' type is not supported by c language.", + lexer_->DumpToken().string())); + break; + default: + break; + } + } } else if (options_.GetTargetLanguage().Equals("java")) { switch (type->GetTypeKind()) { case TypeKind::TYPE_UCHAR: @@ -1354,8 +1368,14 @@ bool Parser::IsValidTypeName(const String& typeName) */ bool Parser::CheckPackageName(const String& filePath, const String& packageName) { - String pkgToPath = packageName.Replace('.', '/'); - int index = filePath.LastIndexOf('/'); +#ifndef __MINGW32__ + char delimiter = '/'; +#else + char delimiter = '\\'; +#endif + + String pkgToPath = packageName.Replace('.', delimiter); + int index = filePath.LastIndexOf(delimiter); if (index == -1) { return false; } diff --git a/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl b/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl new file mode 100755 index 000000000..404b2de00 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/array_test/v1_0/ArrayTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.array_test.v1_0; + +enum AESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct ASSample +{ + boolean m1; + int m2; + String m4; +}; + +union AUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl b/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl new file mode 100755 index 000000000..b1e5720c1 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/array_test/v1_0/IArrayTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.array_test.v1_0; + +import test.kernel_test.array_test.v1_0.ArrayTypes; + +interface IArrayTest { + + BoolArrayTest([in] boolean[] param1, [out] boolean[] param2); + + ByteArrayTest([in] byte[] param1, [out] byte[] param2); + + ShortArrayTest([in] short[] param1, [out] short[] param2); + + IntArrayTest([in] int[] param1, [out] int[] param2); + + LongArrayTest([in] long[] param1, [out] long[] param2); + + UCharArrayTest([in] unsigned char[] param1, [out] unsigned char[] param2); + + UShortArrayTest([in] unsigned short[] param1, [out] unsigned short[] param2); + + UIntArrayTest([in] unsigned int[] param1, [out] unsigned int[] param2); + + ULongArrayTest([in] unsigned long[] param1, [out] unsigned long[] param2); + + StringArrayTest([in] String[] param1, [out] String[] param2); + + EnumArrayTest([in] enum AESample[] param1, [out] enum AESample[] param2); + + StructArrayTest([in] struct ASSample[] param1, [out] struct ASSample[] param2); + + UnionArrayTest([in] union AUSample[] param1, [out] union AUSample[] param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl b/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl new file mode 100755 index 000000000..08057e249 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/data_test/v1_0/DataTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.data_test.v1_0; + +enum DESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct DSSample +{ + boolean m1; + int m2; + String m4; +}; + +union DUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl b/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl new file mode 100755 index 000000000..442471147 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/data_test/v1_0/IDataTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.data_test.v1_0; + +import test.kernel_test.data_test.v1_0.DataTypes; + +interface IDataTest { + + BoolTest([in] boolean param1, [out] boolean param2); + + ByteTest([in] byte param1, [out] byte param2); + + ShortTest([in] short param1, [out] short param2); + + IntTest([in] int param1, [out] int param2); + + LongTest([in] long param1, [out] long param2); + + UCharTest([in] unsigned char param1, [out] unsigned char param2); + + UShortTest([in] unsigned short param1, [out] unsigned short param2); + + UIntTest([in] unsigned int param1, [out] unsigned int param2); + + ULongTest([in] unsigned long param1, [out] unsigned long param2); + + StringTest([in] String param1, [out] String param2); + + EnumTest([in] enum DESample param1, [out] enum DESample param2); + + StructTest([in] struct DSSample param1, [out] struct DSSample param2); + + UnionTest([in] union DUSample param1, [out] union DUSample param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl b/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl new file mode 100755 index 000000000..ae68dc271 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/list_test/v1_0/IListTest.idl @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.list_test.v1_0; + +import test.kernel_test.list_test.v1_0.ListTypes; + +interface IListTest { + + BoolListTest([in] List param1, [out] List param2); + + ByteListTest([in] List param1, [out] List param2); + + ShortListTest([in] List param1, [out] List param2); + + IntListTest([in] List param1, [out] List param2); + + LongListTest([in] List param1, [out] List param2); + + UCharListTest([in] List param1, [out] List param2); + + UShortListTest([in] List param1, [out] List param2); + + UIntListTest([in] List param1, [out] List param2); + + ULongListTest([in] List param1, [out] List param2); + + StringListTest([in] List param1, [out] List param2); + + EnumListTest([in] List param1, [out] List param2); + + StructListTest([in] List param1, [out] List param2); + + UnionListTest([in] List param1, [out] List param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl b/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl new file mode 100755 index 000000000..f693a321e --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/list_test/v1_0/ListTypes.idl @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.list_test.v1_0; + +enum LESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct LSSample +{ + boolean m1; + int m2; + String m4; +}; + +union LUSample +{ + boolean m1; + int m2; +}; \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl new file mode 100755 index 000000000..4580b0dbb --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/IStructTest.idl @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.struct_test.v1_0; + +import test.kernel_test.struct_test.v1_0.StructTypes; + +interface IStructTest { + SSampleTest([in] struct SSample param1, [out] struct SSample param2); + SSample2Test([in] struct SSample2 param1, [out] struct SSample2 param2); + SSample3Test([in] struct SSample3 param1, [out] struct SSample3 param2); + SSample4Test([in] struct SSample4 param1, [out] struct SSample4 param2); + SSample5Test([in] struct SSample5 param1, [out] struct SSample5 param2); + SSample6Test([in] struct SSample6 param1, [out] struct SSample6 param2); +} \ No newline at end of file diff --git a/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl new file mode 100755 index 000000000..ebecca546 --- /dev/null +++ b/tools/hdi-gen/test/kernel_test/struct_test/v1_0/StructTypes.idl @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +package test.kernel_test.struct_test.v1_0; + +enum ESample +{ + MEM_ONE, + MEM_TWO, + MEM_THREE, +}; + +struct SSample +{ + boolean m1; + int m2; + String m4; +}; + +union USample +{ + boolean m1; + int m2; +}; + +struct SSample2 +{ + boolean m1; + byte m2; + short m3; + int m4; + long m5; + unsigned char m6; + unsigned short m7; + unsigned int m8; + unsigned long m9; +}; + +struct SSample3 +{ + String m1; + enum ESample m2; + struct SSample2 m3; +}; + +struct SSample4 +{ + boolean[] m1; + byte[] m2; + short[] m3; + int[] m4; + long[] m5; + unsigned char[] m6; + unsigned short[] m7; + unsigned int[] m8; + unsigned long[] m9; + String[] m12; + enum ESample[] m13; + struct SSample[] m14; +}; + +struct SSample5 +{ + List m1; + List m2; + List m3; + List m4; + List m5; + List m6; + List m7; + List m8; + List m9; + List m12; + List m13; + List m14; +}; + +struct SSample6 { + union USample m1; + union USample[] m2; + List m3; +}; \ No newline at end of file diff --git a/tools/hdi-gen/util/Makefile b/tools/hdi-gen/util/Makefile deleted file mode 100755 index dfae7c273..000000000 --- a/tools/hdi-gen/util/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -OBJS_DIR:=$(BUILD_DIR)/util -TARGET = $(OBJS_DIR)/util.a -SOURCE:=$(wildcard *.cpp) -OBJS:=$(patsubst %.cpp, $(OBJS_DIR)/%.o, $(SOURCE)) - - - -$(TARGET):$(OBJS) - $(Q) echo $(TARGET) - $(Q) ar -rc $@ $^ - -$(OBJS_DIR)/%.o:%.cpp - $(Q) mkdir -p $(dir $@) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ \ No newline at end of file diff --git a/tools/hdi-gen/util/file.cpp b/tools/hdi-gen/util/file.cpp index 319c4d3f4..faaa51d92 100755 --- a/tools/hdi-gen/util/file.cpp +++ b/tools/hdi-gen/util/file.cpp @@ -182,16 +182,26 @@ bool File::CreateParentDir(const String& path) } int pos = 1; - while ((pos = path.IndexOf('/', pos)) != -1) { - String partPath = path.Substring(0, pos); +#ifndef __MINGW32__ + char Separator = '/'; +#else + char Separator = '\\'; +#endif + + while ((pos = path.IndexOf(Separator, pos)) != -1) { + String partPath = path.Substring(0, pos); struct stat st; if (stat(partPath.string(), &st) < 0) { if (errno != ENOENT) { return false; } +#ifndef __MINGW32__ if (mkdir(partPath.string(), S_IRWXU | S_IRWXG | S_IRWXO) < 0) { +#else + if (mkdir(partPath.string()) < 0) { +#endif return false; } } else if (!S_ISDIR(st.st_mode)) { @@ -202,6 +212,15 @@ bool File::CreateParentDir(const String& path) return true; } +String File::AdapterPath(const String& path) +{ +#ifndef __MINGW32__ + return path; +#else + return path.Replace('/', '\\'); +#endif +} + size_t File::GetHashKey() { StringBuilder fileStr; diff --git a/tools/hdi-gen/util/file.h b/tools/hdi-gen/util/file.h index dec9279ab..94de48c83 100755 --- a/tools/hdi-gen/util/file.h +++ b/tools/hdi-gen/util/file.h @@ -60,6 +60,8 @@ public: static bool CreateParentDir(const String& path); + static String AdapterPath(const String& path); + size_t GetHashKey(); static constexpr unsigned int READ = 0x1; diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 9f547c5a3..6d872ea32 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -20,9 +20,13 @@ const char* Options::optSupportArgs = "c:d:"; static struct option g_longOpts[] = { {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, + {"mode-k", no_argument, nullptr, 'k'}, + {"mode-u", no_argument, nullptr, 'u'}, {"gen-c", no_argument, nullptr, 'C'}, {"gen-cpp", no_argument, nullptr, 'P'}, {"gen-java", no_argument, nullptr, 'J'}, + {"client", no_argument, nullptr, 'a'}, + {"server", no_argument, nullptr, 'b'}, {"hash", no_argument, nullptr, 'H'}, {"dump-ast", no_argument, nullptr, 'D'}, {nullptr, 0, nullptr, 0} @@ -34,7 +38,7 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, char * const argv[]) +Options& Options::Parse(int argc, char* const argv[]) { program_ = argv[0]; opterr = 1; @@ -57,6 +61,12 @@ Options& Options::Parse(int argc, char * const argv[]) case 'v': doShowVersion_ = true; break; + case 'k': + doModeKernel_ = true; + break; + case 'u': + doModeKernel_ = false; + break; case 'C': doGenerateCode_ = true; targetLanguage_ = "c"; @@ -69,6 +79,14 @@ Options& Options::Parse(int argc, char * const argv[]) doGenerateCode_ = true; targetLanguage_ = "java"; break; + case 'a': + doGeneratePart_ = true; + codePart_ = "client"; + break; + case 'b': + doGeneratePart_ = true; + codePart_ = "server"; + break; case 'H': doGetHashKey_ = true; break; @@ -139,9 +157,13 @@ void Options::ShowUsage() const " --hash Display hash key of the idl file\n" " --dump-ast Display the AST of the compiled file\n" " -c Compile the .idl file\n" + " --mode-k Generate kernel-mode ioservice stub code\n" + " --mode-u Generate user-mode ioservice stub code\n" " --gen-c Generate C codes\n" " --gen-cpp Generate C++ codes\n" " --gen-java Generate Java codes\n" + " --client Generate client codes\n" + " --server Generate server codes\n" " -d Place generated codes into \n"); } } // namespace HDI diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index a8f8a7c45..0b31b04d7 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -55,6 +55,11 @@ public: return doGenerateCode_; } + inline bool DoGenerateKernelCode() const + { + return doModeKernel_; + } + inline bool HasErrors() const { return !errors_.empty(); @@ -70,6 +75,11 @@ public: return targetLanguage_; } + inline String GetCodePart() const + { + return codePart_; + } + inline String GetGenerationDirectory() const { return generationDirectory_; @@ -85,6 +95,7 @@ private: Options() : program_(), sourceFilePath_(), targetLanguage_(), + codePart_("all"), generationDirectory_(), illegalOptions_(), errors_(), @@ -107,6 +118,7 @@ private: String program_; String sourceFilePath_; String targetLanguage_; + String codePart_; String generationDirectory_; String illegalOptions_; std::vector errors_; @@ -117,6 +129,8 @@ private: bool doDumpAST_ = false; bool doGetHashKey_ = false; bool doGenerateCode_ = false; + bool doModeKernel_ = false; + bool doGeneratePart_ = false; bool doOutDir_ = false; }; } // namespace HDI -- Gitee From 17f7406a98591bc19f8817d59879a027b62d4ac9 Mon Sep 17 00:00:00 2001 From: yufengs Date: Mon, 8 Nov 2021 17:08:46 +0800 Subject: [PATCH 147/272] Modify CI bug Signed-off-by: yufengs Change-Id: I1acb08c87a871e8c9db4850a9df9f529659744ab --- model/usb/src/usb_ddk_pnp_loader.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index 65e39e7a7..d19fbffb9 100755 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -109,7 +109,7 @@ static bool UsbDdkPnpLoaderMatchDevice(const struct UsbPnpNotifyMatchInfoTable * static void UsbDdkPnpLoaderMatchHandle(const struct UsbPnpNotifyMatchInfoTable *dev, int8_t index, struct UsbPnpMatchIdTable *id, bool flag) { - if ((id->pnpMatchFlag == false) && (flag == true)) { + if ((!id->pnpMatchFlag) && flag) { if (!(id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS)) { id->interfaceClass[id->interfaceClassLength++] = dev->interfaceInfo[index].interfaceClass; } @@ -170,7 +170,8 @@ static bool UsbDdkPnpLoaderMatchFlag(const struct UsbPnpNotifyMatchInfoTable *de bool ret = true; uint32_t offset; - if (UsbDdkPnpLoaderMatchFlagFirst(id) == false) { + if (!UsbDdkPnpLoaderMatchFlagFirst(id)) { + ret = false; goto OUT; } @@ -282,11 +283,11 @@ static bool UsbDdkPnpLoaderMatchOneIdIntf(const struct UsbPnpNotifyMatchInfoTabl } maskFlag = UsbDdkPnpLoaderMatchInterface(dev, index, id); - if (UsbDdkPnpLoaderMatchFlag(dev, index, id, maskFlag) != true) { + if (!UsbDdkPnpLoaderMatchFlag(dev, index, id, maskFlag)) { return false; } - if (id->pnpMatchFlag == false) { + if (!id->pnpMatchFlag) { id->pnpMatchFlag = true; } else { return false; -- Gitee From 393dc15427d164acb1bba19270d6613d89023646 Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 9 Nov 2021 11:39:56 +0800 Subject: [PATCH 148/272] modify_code Signed-off-by: chenchong --- model/sensor/driver/als/sensor_als_driver.c | 4 ++-- model/sensor/driver/chipset/als/als_bh1745.c | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c index 5208a28e4..e2b1c3f95 100755 --- a/model/sensor/driver/als/sensor_als_driver.c +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -300,7 +300,7 @@ BASE_CONFIG_EXIT: (void)memset_s(&drvData->alsCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&drvData->alsCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&drvData->alsCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; + return drvData->alsCfg; } void AlsReleaseCfgData(struct SensorCfgData *alsCfg) @@ -346,7 +346,7 @@ void AlsReleaseDriver(struct HdfDeviceObject *device) struct AlsDrvData *drvData = (struct AlsDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - if (drvData->detectFlag) { + if (drvData->detectFlag && drvData->alsCfg != NULL) { AlsReleaseCfgData(drvData->alsCfg); } diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index b1fc82fc6..2832402e4 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -190,7 +190,8 @@ int32_t Bh1745InitDriver(struct HdfDeviceObject *device) } drvData->sensorCfg = AlsCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating alscfg failed because detection failed", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -218,8 +219,10 @@ void Bh1745ReleaseDriver(struct HdfDeviceObject *device) struct Bh1745DrvData *drvData = (struct Bh1745DrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - AlsReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; + if (drvData->sensorCfg != NULL) { + AlsReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } OsalMemFree(drvData); } -- Gitee From 84a36d4dea9c8ca2f4e7598a7fb1e96ad859188e Mon Sep 17 00:00:00 2001 From: Caoruihong Date: Wed, 3 Nov 2021 15:48:22 +0800 Subject: [PATCH 149/272] feat(build): simplify hc-gen build Signed-off-by: Caoruihong Change-Id: Ie351052c98b975ea217ab2a51a6861e34654237e --- tools/hc-gen/BUILD.gn | 20 ++++++++ tools/hc-gen/build_hcs.py | 102 -------------------------------------- tools/hc-gen/hc_gen.gni | 67 +++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 102 deletions(-) create mode 100644 tools/hc-gen/BUILD.gn delete mode 100755 tools/hc-gen/build_hcs.py create mode 100644 tools/hc-gen/hc_gen.gni diff --git a/tools/hc-gen/BUILD.gn b/tools/hc-gen/BUILD.gn new file mode 100644 index 000000000..a1340fe01 --- /dev/null +++ b/tools/hc-gen/BUILD.gn @@ -0,0 +1,20 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +action("build_hc_gen") { + script = "/usr/bin/env" + if (defined(ohos_lite)) { + script = "//build/lite/run_shell_cmd.py" + } + outputs = [ "$target_out_dir/hc-gen" ] + args = [ + "make", + "-j", + "-C", + rebase_path("."), + "BUILD_DIR=" + rebase_path(target_out_dir), + ] +} diff --git a/tools/hc-gen/build_hcs.py b/tools/hc-gen/build_hcs.py deleted file mode 100755 index d67bbd240..000000000 --- a/tools/hc-gen/build_hcs.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# -# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of Willow Garage, Inc. nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. - -import fcntl -import os -import sys -import argparse -import platform -import subprocess -import time - -_LOCK_FILE_NAME = "._lock" -_BUILD_DIR = 'build' -_LOCK_FILE = '' - - -def lock(): - global _LOCK_FILE - global _BUILD_DIR - global _LOCK_FILE_NAME - if not os.path.exists(_BUILD_DIR): - os.mkdir(_BUILD_DIR) - lock_file = os.path.join(_BUILD_DIR, _LOCK_FILE_NAME) - if not os.path.exists(lock_file): - with open(lock_file, 'w') as l_file: - l_file.write("lock") - l_file.close - print('hc-gen lock file ' + lock_file) - _LOCK_FILE = open(lock_file, 'r') - fcntl.flock(_LOCK_FILE.fileno(), fcntl.LOCK_EX) - - -def unlock(): - global _LOCK_FILE - _LOCK_FILE.close() - - -def exec_command(cmd): - process = subprocess.Popen(cmd) - process.wait() - ret_code = process.returncode - - if ret_code != 0: - raise Exception("{} failed, return code is {}".format(cmd, ret_code)) - - -def make_hc_gen(current_dir): - exec_command(['make', '-C', current_dir, '-j8']) - - -def prepare(current_dir): - make_hc_gen(current_dir) - - -def main(argv): - lock() - current_dir = os.path.split(os.path.realpath(__file__))[0] - hc_gen = os.path.join(current_dir, 'build', 'hc-gen') - - host_hc_gen = argv[1] - if (os.path.exists(host_hc_gen)): - build_hcs_cmd = argv[1:] - else: - prepare(current_dir) - build_hcs_cmd = [hc_gen] + argv[1:] - - prepare(current_dir) - exec_command(build_hcs_cmd) - unlock() - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/tools/hc-gen/hc_gen.gni b/tools/hc-gen/hc_gen.gni new file mode 100644 index 000000000..9a842baad --- /dev/null +++ b/tools/hc-gen/hc_gen.gni @@ -0,0 +1,67 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +template("hc_gen") { + assert(defined(invoker.sources), "sources are must") + action_foreach(target_name) { + deps = [ "//drivers/framework/tools/hc-gen:build_hc_gen" ] + script = "/usr/bin/env" + if (defined(ohos_lite)) { + script = "//build/lite/run_shell_cmd.py" + } + sources = invoker.sources + if (defined(invoker.hc_gen_hex) && invoker.hc_gen_hex) { + hc_flags = [ + "-b", + "-i", + "-a", + ] + output_suffix = "_hex.c" + output_suffix2 = ".hcb" + } else if (defined(invoker.hc_gen_c) && invoker.hc_gen_c) { + hc_flags = [ "-t" ] + output_suffix = ".c" + output_suffix2 = ".h" + } else { + hc_flags = [] + output_suffix = ".hcb" + } + if (defined(invoker.outputs)) { + outputs = invoker.outputs + } else { + outputs = [ "$target_gen_dir/{{source_name_part}}$output_suffix" ] + } + if (defined(output_suffix2)) { + outputs += [ "$target_gen_dir/{{source_name_part}}$output_suffix2" ] + } + assert(get_path_info(outputs[0], "file") == + "{{source_name_part}}$output_suffix", + "unexpected outputs: " + outputs[0]) + output_dir = get_path_info(outputs[0], "dir") + args = [ rebase_path(get_path_info("//drivers/framework/tools/hc-gen/", + "out_dir") + "/hc-gen") ] + args += hc_flags + args += [ + "-o", + rebase_path("$output_dir/{{source_name_part}}"), + "{{source}}", + ] + } +} + +template("hc_gen_c") { + hc_gen_c = true + hc_gen(target_name) { + forward_variables_from(invoker, "*") + } +} + +template("hc_gen_hex") { + hc_gen_hex = true + hc_gen(target_name) { + forward_variables_from(invoker, "*") + } +} -- Gitee From 29e3ab3c77ba40b7b6ae8c82c6222eb5bf8597bf Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Mon, 8 Nov 2021 17:36:00 +0800 Subject: [PATCH 150/272] =?UTF-8?q?120=E8=A1=8C=E5=91=8A=E8=AD=A6=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/src/dma/dmac_core.c | 2 +- support/platform/src/hdmi/hdmi_cec.c | 54 +++++++--- support/platform/src/hdmi/hdmi_edid.c | 100 +++++++++++++------ support/platform/src/hdmi/hdmi_infoframe.c | 9 +- support/platform/src/i3c/i3c_core.c | 7 +- test/unittest/platform/common/i3c_test.c | 32 ++---- test/unittest/platform/common/pwm_test.c | 12 +-- test/unittest/platform/virtual/i3c_virtual.c | 20 +++- 8 files changed, 146 insertions(+), 90 deletions(-) diff --git a/support/platform/src/dma/dmac_core.c b/support/platform/src/dma/dmac_core.c index c5d529f0b..f620772d2 100644 --- a/support/platform/src/dma/dmac_core.c +++ b/support/platform/src/dma/dmac_core.c @@ -279,7 +279,7 @@ static inline size_t DmacAlignedTransMax(size_t maxSize, uint8_t srcWidth, uint8 size_t ret; uint8_t maxWidth = (srcWidth >= destWidth) ? srcWidth : destWidth; - ret = (maxWidth == 0) ? maxSize : maxSize - (maxSize % maxWidth); + ret = ((maxWidth == 0) ? maxSize : (maxSize - (maxSize % maxWidth))); #ifdef DMA_CORE_DEBUG HDF_LOGD("%s: max:%zu, srcwidth:%u, dstwidth:%u, alignedmax:%zu", __func__, maxSize, srcWidth, destWidth, ret); #endif diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index e3b4f0b23..aad1ddb6f 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -147,7 +147,8 @@ static struct HdmiCecMsgLenInfo *HdmiCecGetMsgLenInfo(uint8_t opcode) static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) { - uint8_t info = (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0xf); /* Progremmed Info or Not Progremmed Error Info. */ + /* Progremmed Info or Not Progremmed Error Info. */ + uint8_t info = (msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0xf); /* Progremmed Indicator Check. */ if ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0x10) > 0) { @@ -354,7 +355,7 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H data[DATA_ZEROTH_OFFSET_ELEMENT] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | (digital->system); if (digital->method == HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL) { data[DATA_FIRST_OFFSET_ELEMENT] = (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | - (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); + (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK; data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT; data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK; @@ -403,7 +404,9 @@ static void HdmiCecEncodingRecordOnDigital(struct HdmiCecMsg *msg, struct HdmiCe msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_ON_DIGITAL_MSG_PARAM_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_RECORD_ON; msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = HDMI_CEC_RECORD_SRC_DIGITAL; - HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), HDMI_CEC_DIGITAL_SERVICE_ID_LEN, digital); + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), + HDMI_CEC_DIGITAL_SERVICE_ID_LEN, + digital); } static void HdmiCecEncodingRecordOnAnalog(struct HdmiCecMsg *msg, @@ -509,7 +512,9 @@ void HdmiCecEncodingClearAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCec { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER; - HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -521,14 +526,18 @@ static void HdmiCecEncodingDigitalTimerInfo(uint8_t *data, uint8_t len, struct H return; } HdmiCecEncodingCommTimerInfo(data, HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->commInfo)); - HdmiCecEncodingDigitalServiceId(&data[DATA_SEVENTH_OFFSET_ELEMENT], len - HDMI_CEC_COMM_TIMER_INFO_LEN, &(info->id)); + HdmiCecEncodingDigitalServiceId(&data[DATA_SEVENTH_OFFSET_ELEMENT], + len - HDMI_CEC_COMM_TIMER_INFO_LEN, + &(info->id)); } void HdmiCecEncodingClearDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDigitalTimerInfo *info, bool response) { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER; - HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_DIGITAL_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -550,7 +559,9 @@ void HdmiCecEncodingClearExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCec { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER; - HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS; } @@ -560,7 +571,9 @@ void HdmiCecEncodingSetAnalogueTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecAn { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER; - HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, info); + HdmiCecEncodingAnalogueTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_ANALOGUE_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -570,7 +583,9 @@ void HdmiCecEncodingSetDigitalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecDig { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_DIGITAL_TIMER; - HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_DIGITAL_TIMER_INFO_LEN, info); + HdmiCecEncodingDigitalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_DIGITAL_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -580,7 +595,9 @@ void HdmiCecEncodingSetExternalTimerMsg(struct HdmiCecMsg *msg, struct HdmiCecEx { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER; - HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, info); + HdmiCecEncodingExternalTimerInfo(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_EXTERNAL_TIMER_INFO_LEN, + info); if (response == true) { msg->rspMsg = HDMI_CEC_OPCODE_TIMER_STATUS; } @@ -792,7 +809,9 @@ void HdmiCecEncodingSelectDigitalServiceMsg(struct HdmiCecMsg *msg, struct HdmiC { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE; - HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, digital); + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT]), + HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, + digital); } void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecTunerDeviceInfo *info) @@ -807,8 +826,9 @@ void HdmiCecEncodingTunerDeviceStatusMsg(struct HdmiCecMsg *msg, struct HdmiCecT msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = info->data.analog.bcstSystem; } else { msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_DIG_PARAM_LEN); - HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, - &(info->data.digital)); + HdmiCecEncodingDigitalServiceId(&(msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]), + HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN, + &(info->data.digital)); } } @@ -983,8 +1003,9 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe break; case HDMI_CEC_UI_CMD_TUNE_FUNCTION: msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN; - msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | - (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (cmd->addOperands.channel.format << + HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK); msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); @@ -1427,7 +1448,8 @@ static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast) static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { - uint16_t phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) | msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]); + uint16_t phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) | + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]); (void)cntlr; (void)txMsg; diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index e53b6b27a..ec6711b31 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -87,7 +87,9 @@ static int32_t HdmiEdidVendorInfoPhase(struct HdmiEdid *edid) struct HdmiEdidFirstBlockInfo *block = (struct HdmiEdidFirstBlockInfo *)edid->raw; /* Manufacturer Name */ - data = (block->vendorName[UINT8_ARRAY_TElEMENT_0] << HDMI_EDID_MANUFACRURER_NAME_SHIFT) | (block->vendorName[UINT8_ARRAY_TElEMENT_1]); + data = (block->vendorName[UINT8_ARRAY_TElEMENT_0] << + HDMI_EDID_MANUFACRURER_NAME_SHIFT) | + (block->vendorName[UINT8_ARRAY_TElEMENT_1]); for (i = 0; i < HDMI_EDID_MANUFACRURER_NAME_MAX_LEN - 1; i++) { tmpData = (data & (HDMI_EDID_MANUFACRURER_NAME_CHAR_MARK << (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i))); tmpData = (tmpData >> (HDMI_EDID_MANUFACRURER_NAME_CHAR_SHIFT * i)); @@ -98,7 +100,9 @@ static int32_t HdmiEdidVendorInfoPhase(struct HdmiEdid *edid) } /* Product Code */ - data = (block->productCode[UINT8_ARRAY_TElEMENT_1] << HDMI_EDID_PRODUCT_CODE_SHIFT) | (block->productCode[UINT8_ARRAY_TElEMENT_0]); + data = (block->productCode[UINT8_ARRAY_TElEMENT_1] << + HDMI_EDID_PRODUCT_CODE_SHIFT) | + (block->productCode[UINT8_ARRAY_TElEMENT_0]); sinkCap->vendorInfo.productCode = data; /* Serial Number */ @@ -225,11 +229,14 @@ static int32_t HdmiEdidStandardTimingPhase(struct HdmiEdid *edid) * Unused fields in this section shall be set to 01h, 01h. */ for (i = 0; i < HDMI_EDID_STANDARD_TIMING_COUNT; i++) { - if (data[UINT8_ARRAY_TElEMENT_0] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG || data[UINT8_ARRAY_TElEMENT_1] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG) { - sinkCap->stdTimingsInfo[i].horizPixel = (data[UINT8_ARRAY_TElEMENT_0] + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE) * - HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_FACTOR; - sinkCap->stdTimingsInfo[i].refreshRate = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK) + - HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_BASE; + if (data[UINT8_ARRAY_TElEMENT_0] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG || + data[UINT8_ARRAY_TElEMENT_1] != HDMI_EDID_STANDARD_TIMING_UNUSED_FLAG) { + sinkCap->stdTimingsInfo[i].horizPixel = (data[UINT8_ARRAY_TElEMENT_0] + + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_BASE) * + HDMI_EDID_STANDARD_TIMING_HORIZ_PIXEL_FACTOR; + sinkCap->stdTimingsInfo[i].refreshRate = (data[UINT8_ARRAY_TElEMENT_1] & + HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_MARK) + + HDMI_EDID_STANDARD_TIMING_REFRESH_RATE_BASE; aspectRatio = (data[UINT8_ARRAY_TElEMENT_1] & HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_MARK) >> HDMI_EDID_STANDARD_TIMING_ASPECT_RATE_SHIFT; sinkCap->stdTimingsInfo[i].vertPixel = @@ -297,7 +304,9 @@ static void HdmiEdidDetailedTimingDescriptorPhase(struct HdmiSinkDeviceCapabilit } perTiming = &cap->preTimingInfo[cap->preTimingCnt]; - pixelClock = (block->pixelClk[UINT8_ARRAY_TElEMENT_1] << HDMI_ONE_BYTE_SHIFT) | (block->pixelClk[UINT8_ARRAY_TElEMENT_0]); + pixelClock = (block->pixelClk[UINT8_ARRAY_TElEMENT_1] << + HDMI_ONE_BYTE_SHIFT) | + (block->pixelClk[UINT8_ARRAY_TElEMENT_0]); if (pixelClock == 0) { HDF_LOGD(" pixel clock is 0. preTimingCnt = %d", cap->preTimingCnt); return; @@ -341,7 +350,9 @@ static void HdmiEdidDetailedTiming(struct HdmiSinkDeviceCapability *sinkCap, uin /* * Monitor Descriptor flag: data0/data1/data2 is 0x00. */ - if (data[UINT8_ARRAY_TElEMENT_0] == 0x00 && data[UINT8_ARRAY_TElEMENT_1] == 0x00 && data[UINT8_ARRAY_TElEMENT_2] == 0x00) { + if (data[UINT8_ARRAY_TElEMENT_0] == 0x00 && + data[UINT8_ARRAY_TElEMENT_1] == 0x00 && + data[UINT8_ARRAY_TElEMENT_2] == 0x00) { HdmiEdidMonitorDescriptorPhase(sinkCap, data, len); return; } @@ -515,9 +526,13 @@ static int32_t HdmiEdidExtAudioDataBlockPhase(struct HdmiSinkDeviceCapability *s sinkCap->audioInfo[sinkCap->audioInfoCnt].channels = (data[UINT8_ARRAY_TElEMENT_0] & HDMI_EDID_EXTENSION_AUDIO_MAX_CHANNEL_MARK) + 1; /* byte1: Sample Rate */ - HdmiEdidExtAdbSampleRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[UINT8_ARRAY_TElEMENT_1], formatCode); + HdmiEdidExtAdbSampleRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), + data[UINT8_ARRAY_TElEMENT_1], + formatCode); /* byte2: bit depth or maximum bit rate */ - HdmiEdidExtAdbDepthAndMaxRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), data[UINT8_ARRAY_TElEMENT_2], formatCode); + HdmiEdidExtAdbDepthAndMaxRatePhase(&(sinkCap->audioInfo[sinkCap->audioInfoCnt]), + data[UINT8_ARRAY_TElEMENT_2], + formatCode); sinkCap->audioInfoCnt++; } return HDF_SUCCESS; @@ -712,11 +727,14 @@ static void HdmiEdidVsdbVicAnd3dInfoPhase(struct HdmiSinkDeviceCapability *sinkC return; } sinkCap->vsdbInfo._3dPresent = (data[UINT8_ARRAY_TElEMENT_12] & HDMI_BIT7_MARK) ? true : false; - sinkCap->vsdbInfo._3dMultiPresent = - (data[UINT8_ARRAY_TElEMENT_12] & HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; + sinkCap->vsdbInfo._3dMultiPresent = (data[UINT8_ARRAY_TElEMENT_12] & + HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> + HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; if (len >= 14) { - hdmiVicLen = (data[UINT8_ARRAY_TElEMENT_13] & HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; + hdmiVicLen = (data[UINT8_ARRAY_TElEMENT_13] & + HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> + HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; hdmi3dLen = (data[UINT8_ARRAY_TElEMENT_13] & HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK); } @@ -1021,33 +1039,49 @@ static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability return; } sinkCap->dolbyCap.oui = oui; - sinkCap->dolbyCap.version = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; + sinkCap->dolbyCap.version = (data[UINT8_ARRAY_TElEMENT_4] & + HDMI_EDID_VSVDB_DOLBY_VERSION_MARK) >> HDMI_EDID_VSVDB_DOLBY_VERSION_SHIFT; sinkCap->dolbyCap.yuv422 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT0_MARK) ? true : false; sinkCap->dolbyCap.b2160p60 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT1_MARK) ? true : false; if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_0) { sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT2_MARK) ? true : false; - sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_6] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.redY = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_7] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenX = ((data[UINT8_ARRAY_TElEMENT_8] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_9] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenY = (data[UINT8_ARRAY_TElEMENT_8] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_10] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueX = ((data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_12] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueY = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_13] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteX = ((data[UINT8_ARRAY_TElEMENT_14] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_15] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteY = (data[UINT8_ARRAY_TElEMENT_14] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_16] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_17] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_18] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.maxLuminance = - (data[UINT8_ARRAY_TElEMENT_17] & HDMI_LOWER_NIBBLE_MARK) | (data[UINT8_ARRAY_TElEMENT_19] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.dMajorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & + HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_6] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.redY = (data[UINT8_ARRAY_TElEMENT_5] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_7] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenX = ((data[UINT8_ARRAY_TElEMENT_8] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_9] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenY = (data[UINT8_ARRAY_TElEMENT_8] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_10] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueX = ((data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_12] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueY = (data[UINT8_ARRAY_TElEMENT_11] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_13] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteX = ((data[UINT8_ARRAY_TElEMENT_14] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_15] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteY = (data[UINT8_ARRAY_TElEMENT_14] & HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_16] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_17] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_18] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.maxLuminance = (data[UINT8_ARRAY_TElEMENT_17] & HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_19] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.dMajorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT; sinkCap->dolbyCap.dMinorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_LOWER_NIBBLE_MARK); return; } if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_1) { - sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; + sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> + HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; sinkCap->dolbyCap.maxLuminance = ((data[UINT8_ARRAY_TElEMENT_5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); sinkCap->dolbyCap.colorimetry = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT0_MARK) ? true : false; diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index fef6b3071..784a66c30 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -69,14 +69,17 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, data[UINT8_ARRAY_TElEMENT_6] = HDMI_IEEE_OUI_1_4_3RD; vsifContent = &(vs->vsifContent.vsif); userContent = &(vs->vsifContent.userVsif); - data[UINT8_ARRAY_TElEMENT_7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; + data[UINT8_ARRAY_TElEMENT_7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << + HDMI_VENDOR_1_4_FORMAT_SHIFT; if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_4K) { data[UINT8_ARRAY_TElEMENT_8] = vsifContent->vic; return HDF_SUCCESS; } else if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_3D) { - data[UINT8_ARRAY_TElEMENT_8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; + data[UINT8_ARRAY_TElEMENT_8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << + HDMI_VENDOR_3D_STRUCTURE_SHIFT; } - data[UINT8_ARRAY_TElEMENT_9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << HDMI_VENDOR_3D_EXT_DATA_SHIFT; + data[UINT8_ARRAY_TElEMENT_9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << + HDMI_VENDOR_3D_EXT_DATA_SHIFT; if (vsifContent->_3dMetaPresent == false) { if (userContent->len == 0 || (userContent->len + lenght) > len) { return HDF_SUCCESS; diff --git a/support/platform/src/i3c/i3c_core.c b/support/platform/src/i3c/i3c_core.c index 9239b28b6..12d3f8f41 100755 --- a/support/platform/src/i3c/i3c_core.c +++ b/support/platform/src/i3c/i3c_core.c @@ -277,7 +277,7 @@ int32_t I3cDeviceAdd(struct I3cDevice *device) head = I3cDeviceListGet(); DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, struct I3cDevice, list) { if (pos == NULL) { // empty list - break; + break; } if ((pos->pid == device->pid) && (pos->cntlr == device->cntlr)) { I3cDeviceListPut(); @@ -475,7 +475,6 @@ int32_t I3cCntlrI2cTransfer(struct I3cCntlr *cntlr, struct I3cMsg *msgs, int16_t return HDF_ERR_INVALID_OBJECT; } - if (cntlr->ops == NULL || cntlr->ops->i2cTransfer == NULL) { HDF_LOGE("%s: ops or i2ctransfer is null", __func__); return HDF_ERR_NOT_SUPPORT; @@ -590,6 +589,10 @@ int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc fun continue; } ibi = (struct I3cIbiInfo *)OsalMemCalloc(sizeof(*ibi)); + if (ibi == NULL) { + HDF_LOGE("func:%s ibi is NULL!",__func__); + return HDF_ERR_MALLOC_FAIL; + } ibi->ibiFunc = func; ibi->payload = payload; ibi->data = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * payload); diff --git a/test/unittest/platform/common/i3c_test.c b/test/unittest/platform/common/i3c_test.c index 4ecd50490..49fc7f08f 100644 --- a/test/unittest/platform/common/i3c_test.c +++ b/test/unittest/platform/common/i3c_test.c @@ -191,8 +191,7 @@ int32_t I3cTestTransfer(void *param) struct I3cTester *tester = NULL; int32_t ret; tester = I3cTesterGet(); -/* *((int32_t *)param) = 1; -return HDF_SUCCESS; */ + if (tester == NULL) { HDF_LOGE("%s: Get tester failed!", __func__); *((int32_t *)param) = 1; @@ -415,7 +414,7 @@ static struct I3cTestEntry g_multiThreadEntry[] = { int32_t I3cTestMultiThread(void *param) { uint32_t i; - int32_t ret = HDF_ERR_NOT_SUPPORT; + int32_t ret; for (i = 0; i < sizeof(g_multiThreadEntry) / sizeof(g_multiThreadEntry[0]); i++) { if (g_multiThreadEntry[i].func == NULL) { @@ -444,6 +443,10 @@ int32_t I3cTestReliability(void *param) return HDF_ERR_INVALID_OBJECT; } config = (struct I3cConfig *)OsalMemCalloc(sizeof(*config)); + if (config == NULL) { + HDF_LOGE("func:%s config is NULL!",__func__); + return HDF_ERR_MALLOC_FAIL; + } config->busMode = I3C_BUS_HDR_MODE; config->curMaster = NULL; // invalid handle @@ -504,25 +507,4 @@ int32_t I3cTestExecute(int cmd) __EXIT__: HDF_LOGI("[%s][======cmd:%d====ret:%d======]", __func__, cmd, ret); return ret; -} - -void I3cTestExecuteAll(void) -{ - int32_t i; - int32_t ret; - int32_t fails = 0; - - /* setup env for all test cases */ - (void)I3cTestExecute(I3C_TEST_CMD_SETUP_ALL); - - for (i = 0; i < I3C_TEST_CMD_SETUP_ALL; i++) { - ret = I3cTestExecute(i); - fails += (ret != HDF_SUCCESS) ? 1 : 0; - } - - /* teardown env for all test cases */ - (void)I3cTestExecute(I3C_TEST_CMD_TEARDOWN_ALL); - - HDF_LOGI("I3cTestExecuteALL: **********PASS:%d FAIL:%d************\n\n", - I3C_TEST_CMD_RELIABILITY + 1 - fails, fails); -} +} \ No newline at end of file diff --git a/test/unittest/platform/common/pwm_test.c b/test/unittest/platform/common/pwm_test.c index 57ab34a3b..3d29a2a6f 100644 --- a/test/unittest/platform/common/pwm_test.c +++ b/test/unittest/platform/common/pwm_test.c @@ -44,7 +44,7 @@ static int32_t PwmSetConfigTest(struct PwmTest *test) HDF_LOGI("%s: enter. Test [PwmSetConfig].", __func__); number = test->cfg.number; - test->cfg.number = (number > 0) ? 0: TEST_WAVES_NUMBER; + test->cfg.number = ((number > 0) ? 0: TEST_WAVES_NUMBER); HDF_LOGI("%s: Set number %u.", __func__, test->cfg.number); ret = PwmSetConfig(test->handle, &(test->cfg)); if (ret != HDF_SUCCESS) { @@ -333,11 +333,11 @@ static int32_t PwmTestEntry(struct PwmTest *test, int32_t cmd) } // At first test case. if (cmd == PWM_SET_PERIOD_TEST) { - ret = PwmGetConfig(test->handle, &(test->originCfg)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); - return HDF_FAILURE; - } + ret = PwmGetConfig(test->handle, &(test->originCfg)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: [PwmGetConfig] failed, ret %d.", __func__, ret); + return HDF_FAILURE; + } } for (i = 0; i < sizeof(g_pwmTestFunc) / sizeof(g_pwmTestFunc[0]); i++) { if (cmd == g_pwmTestFunc[i].type && g_pwmTestFunc[i].Func != NULL) { diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c index eae897f9b..8811810cd 100644 --- a/test/unittest/platform/virtual/i3c_virtual.c +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -66,7 +66,8 @@ static inline uint16_t VirtualI3cGetIbiDeviceAddr(void) return ibiSimulator.deviceAddr; } -static int32_t VirtualI3cXferI2cOneMsgPolling(const struct VirtualI3cCntlr *virtual, const struct VirtualI3cTransferData *td) +static int32_t VirtualI3cXferI2cOneMsgPolling(const struct VirtualI3cCntlr *virtual, + const struct VirtualI3cTransferData *td) { struct I3cMsg *msg = &td->msgs[td->index]; @@ -191,6 +192,10 @@ static void VirtualI3cHotJoin(struct VirtualI3cCntlr *virtual) deviceAddr = VirtualI3cGetIbiDeviceAddr(); device = (struct I3cDevice *)OsalMemCalloc(sizeof(*device)); + if (device == NULL) { + HDF_LOGE("func:%s device is NULL!",__func__); + return; + } device->cntlr = &virtual->cntlr; device->addr = deviceAddr; device->type = I3C_CNTLR_I3C_DEVICE; @@ -247,11 +252,15 @@ static int32_t I3cIbiHandle(uint32_t irq, void *data) return VirtualI3cReservedAddrWorker(virtual, ibiAddr); } else { HDF_LOGD("%s: Calling I3cCntlrIbiCallback...", __func__); + device = GetDeviceByAddr(&virtual->cntlr, ibiAddr); + if (device == NULL) { + HDF_LOGE("func:%s device is NULL!",__func__); + return HDF_ERR_MALLOC_FAIL; + } if (device->ibi->payload > VIRTUAL_I3C_TEST_STR_LEN) { /* Put the string "Hello I3C!" into IBI buffer */ *device->ibi->data = *testStr; } - device = GetDeviceByAddr(&virtual->cntlr, ibiAddr); return I3cCntlrIbiCallback(device); } @@ -264,14 +273,17 @@ static inline void SoftInterruptTrigger(struct VirtualI3cCntlr *virtual, uint16_ VirtualI3cSetIbiSimulator(I3C_HOT_JOIN_ADDR, ibiDeviceAddr); HDF_LOGE("%s: IrqNum: %d", __func__, virtual->IrqNum); - (void)I3cIbiHandle(virtual->IrqNum, (void *)virtual); // Simulate soft interrupt through direct call + /* Simulate soft interrupt through direct call */ + if (I3cIbiHandle(virtual->IrqNum, (void *)virtual) != HDF_SUCCESS) { + HDF_LOGE("%s: Call I3cIbiHandle failed!", __func__); + } } static int32_t VirtualI3cHotJoinSimulator(void) { uint16_t busId; struct I3cCntlr *cntlr = NULL; - struct VirtualI3cCntlr *virtual; + struct VirtualI3cCntlr *virtual = NULL; for (busId = 0; busId < I3C_CNTLR_MAX; busId++) { cntlr = I3cCntlrGet(busId); -- Gitee From 625d510fe9d8815fe244915e9386b9a14740f5ea Mon Sep 17 00:00:00 2001 From: vb6174 Date: Tue, 9 Nov 2021 18:41:19 +0800 Subject: [PATCH 151/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91code=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- include/audio/audio_accessory_if.h | 96 +++++-- include/audio/audio_codec_if.h | 129 +++++---- include/audio/audio_dai_if.h | 157 ++++++++-- include/audio/audio_dsp_if.h | 171 +++++++++-- include/audio/audio_platform_if.h | 270 ++++++++++++------ .../common/include/audio_platform_base.h | 31 +- model/audio/common/src/audio_accessory_base.c | 2 +- model/audio/common/src/audio_codec_base.c | 12 +- model/audio/common/src/audio_dai_base.c | 4 - model/audio/common/src/audio_dma_base.c | 2 - model/audio/common/src/audio_dsp_base.c | 1 - model/audio/common/src/audio_platform_base.c | 170 +++++------ model/audio/core/src/audio_parse.c | 16 +- .../dispatch/src/audio_stream_dispatch.c | 8 +- 14 files changed, 737 insertions(+), 332 deletions(-) diff --git a/include/audio/audio_accessory_if.h b/include/audio/audio_accessory_if.h index bd753a630..6f7ebaf38 100755 --- a/include/audio/audio_accessory_if.h +++ b/include/audio/audio_accessory_if.h @@ -18,37 +18,85 @@ extern "C" { #endif #endif /* __cplusplus */ +/** + * @brief Defines Accessory Codec device name and data. + * + * @since 1.0 + * @version 1.0 + */ struct AccessoryDevice { - const char *devAccessoryName; - struct AccessoryData *devData; - struct HdfDeviceObject *device; - struct DListHead list; - struct OsalMutex mutex; -}; - -struct AudioAccessoryOps { - const char *devAccessoryName; - struct AccessoryData *devData; - struct HdfDeviceObject *device; - struct DListHead list; + const char *devAccessoryName; /**< Accesssory device name */ + struct AccessoryData *devData; /**< Accesssory private data */ + struct HdfDeviceObject *device; /**< HDF device */ + struct DListHead list; /**< Accesssory list */ + struct OsalMutex mutex; /**< Accesssory mutex */ }; -/* Accessory host is defined in accessory driver */ +/** + * @brief Defines Accessory host in audio driver. + * + * @since 1.0 + * @version 1.0 + */ struct AccessoryHost { - struct IDeviceIoService service; // accessory service - struct HdfDeviceObject *device; // accessory deovce - void *priv; // accessory private data + struct IDeviceIoService service; /**< Services provided by Accesssory */ + struct HdfDeviceObject *device; /**< HDF device */ + void *priv; /**< Accesssory private data interface */ }; +/** + * @brief Defines Accesssory private data. + * + * @since 1.0 + * @version 1.0 + */ struct AccessoryData { - const char *drvAccessoryName; - /* Accessory driver callbacks */ - int32_t (*Init)(struct AudioCard *, const struct AccessoryDevice *device); - int32_t (*Read)(const struct AccessoryDevice *, uint32_t, uint32_t *); - int32_t (*Write)(const struct AccessoryDevice *, uint32_t, uint32_t); - const struct AudioKcontrol *controls; - int numControls; - struct AudioRegCfgData* regConfig; + const char *drvAccessoryName; /**< Accesssory driver name */ + + /** + * @brief Defines Accesssory device init. + * + * @param audioCard Indicates a audio card device. + * @param accesssory Indicates a Accesssory device. + * + * @return Returns 0 if Accesssory device init success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Init)(struct AudioCard *audioCard, const struct AccessoryDevice *accesssory); + + /** + * @brief Defines Accesssory device reg read. + * + * @param accesssory Indicates a accesssory device. + * @param reg Indicates read reg address. + * @param value Indicates read reg value. + * + * @return Returns 0 if accesssory device read reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Read)(const struct AccessoryDevice *accesssory, uint32_t reg, uint32_t *value); + + /** + * @brief Defines accesssory device reg write. + * + * @param accesssory Indicates a accesssory device. + * @param reg Indicates write reg address. + * @param value Indicates write reg value. + * + * @return Returns 0 if accesssory device write reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Write)(const struct AccessoryDevice *accesssory, uint32_t reg, uint32_t value); + + const struct AudioKcontrol *controls; /**< Accesssory control structure array pointer */ + int numControls; /**< Accesssory controls the number of structure array elements */ + struct AudioRegCfgData* regConfig; /**< Accesssory registers configured in HCS */ }; #ifdef __cplusplus diff --git a/include/audio/audio_codec_if.h b/include/audio/audio_codec_if.h index 3f6aee0ca..f8fc8be27 100755 --- a/include/audio/audio_codec_if.h +++ b/include/audio/audio_codec_if.h @@ -18,66 +18,91 @@ extern "C" { #endif #endif /* __cplusplus */ -#define AUDIODRV_CTL_ELEM_IFACE_DAC 0 /* virtual dac device */ -#define AUDIODRV_CTL_ELEM_IFACE_ADC 1 /* virtual adc device */ -#define AUDIODRV_CTL_ELEM_IFACE_GAIN 2 /* virtual adc device */ -#define AUDIODRV_CTL_ELEM_IFACE_MIXER 3 /* virtual mixer device */ -#define AUDIODRV_CTL_ELEM_IFACE_ACODEC 4 /* Acodec device */ -#define AUDIODRV_CTL_ELEM_IFACE_PGA 5 /* PGA device */ -#define AUDIODRV_CTL_ELEM_IFACE_AIAO 6 /* AIAO device */ - +/** + * @brief Defines Codec device name and data. + * + * @since 1.0 + * @version 1.0 + */ struct CodecDevice { - const char *devCodecName; - struct CodecData *devData; - struct HdfDeviceObject *device; - struct DListHead list; - struct OsalMutex mutex; + const char *devCodecName; /**< Codec device name */ + struct CodecData *devData; /**< Codec module private data */ + struct HdfDeviceObject *device; /**< HDF device */ + struct DListHead list; /**< Codec list */ + struct OsalMutex mutex; /**< Codec mutex */ }; -/* codec related definitions */ +/** + * @brief Defines Codec private data. + * + * @since 1.0 + * @version 1.0 + */ struct CodecData { - const char *drvCodecName; - /* Codec driver callbacks */ - int32_t (*Init)(struct AudioCard *, struct CodecDevice *); - int32_t (*Read)(unsigned long, uint32_t, uint32_t *); - int32_t (*Write)(unsigned long, uint32_t, uint32_t); - struct AudioKcontrol *controls; - int numControls; - struct AudioSapmComponent *sapmComponents; - int numSapmComponent; - const struct AudioSapmRoute *sapmRoutes; - int numSapmRoutes; - unsigned long virtualAddress; // IoRemap Address - struct AudioRegCfgData *regConfig; - struct AudioRegCfgGroupNode **regCfgGroup; -}; + const char *drvCodecName; /**< Codec driver name */ -/* Codec host is defined in codec driver */ -struct CodecHost { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - void *priv; -}; + /** + * @brief Defines Codec device init. + * + * @param audioCard Indicates a audio card device. + * @param codec Indicates a codec device. + * + * @return Returns 0 if codec device init success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Init)(struct AudioCard *audioCard, struct CodecDevice *codec); + + /** + * @brief Defines Codec device reg read. + * + * @param virtualAddress Indicates base reg IoRemap address. + * @param reg Indicates reg offset. + * @param value Indicates read reg value. + * + * @return Returns 0 if codec device read reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Read)(unsigned long virtualAddress, uint32_t reg, uint32_t *value); + + /** + * @brief Defines Codec device reg write. + * + * @param virtualAddress Indicates base reg IoRemap address. + * @param reg Indicates reg offset. + * @param value Indicates write reg value. + * + * @return Returns 0 if codec device write reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Write)(unsigned long virtualAddress, uint32_t reg, uint32_t value); -enum AudioRegParams { - PLAYBACK_VOLUME = 0, - CAPTURE_VOLUME, - PLAYBACK_MUTE, - CAPTURE_MUTE, - LEFT_GAIN, - RIGHT_GAIN, - EXTERNAL_CODEC_ENABLE, - INTERNALLY_CODEC_ENABLE, - RENDER_CHANNEL_MODE, - CAPTRUE_CHANNEL_MODE, - S_NORMAL_AP01_P_HIFI, + struct AudioKcontrol *controls; /**< Codec control structure array pointer */ + int numControls; /**< Number of array elements of Codec controls */ + struct AudioSapmComponent *sapmComponents; /**< Codec power management component array pointer */ + int numSapmComponent; /**< Number of array elements of codec power management component */ + const struct AudioSapmRoute *sapmRoutes; /**< Codec power management route array pointer */ + int numSapmRoutes; /**< Number of power management route array elements */ + unsigned long virtualAddress; /**< Codec base reg IoRemap address */ + struct AudioRegCfgData *regConfig; /**< Codec registers configured in HCS */ + struct AudioRegCfgGroupNode **regCfgGroup; /**< Codec register group configured in HCS */ }; -enum SapmRegParams { - LPGA_MIC = 0, - RPGA_MIC, - DACL2DACR, - DACR2DACL, +/** + * @brief Defines Codec host in audio driver. + * + * @since 1.0 + * @version 1.0 + */ +struct CodecHost { + struct IDeviceIoService service; /**< Services provided by codec */ + struct HdfDeviceObject *device; /**< HDF device */ + void *priv; /**< Codec private data interface */ }; #ifdef __cplusplus diff --git a/include/audio/audio_dai_if.h b/include/audio/audio_dai_if.h index a000c8a45..9863800be 100755 --- a/include/audio/audio_dai_if.h +++ b/include/audio/audio_dai_if.h @@ -9,53 +9,148 @@ #ifndef AUDIO_DAI_IF_H #define AUDIO_DAI_IF_H +#include "audio_host.h" +#include "audio_parse.h" +#include "audio_control.h" + #ifdef __cplusplus #if __cplusplus extern "C" { #endif #endif /* __cplusplus */ -#include "audio_host.h" -#include "audio_parse.h" -#include "audio_control.h" - +/** + * @brief Defines Dai device name and data. + * + * @since 1.0 + * @version 1.0 + */ struct DaiDevice { - const char *devDaiName; - struct DaiData *devData; - struct HdfDeviceObject *device; - struct DListHead list; + const char *devDaiName; /**< Dai device name */ + struct DaiData *devData; /**< Dai module private data */ + struct HdfDeviceObject *device; /**< HDF device */ + struct DListHead list; /**< Dai list */ }; +/** + * @brief Defines Dai operation function set. + * + * @since 1.0 + * @version 1.0 + */ struct AudioDaiOps { - int32_t (*Startup)(const struct AudioCard *, const struct DaiDevice *); - int32_t (*HwParams)(const struct AudioCard *, const struct AudioPcmHwParams *); - int32_t (*Trigger)(const struct AudioCard *, int, const struct DaiDevice *); + /** + * @brief Defines Dai device start up function. + * + * @param audioCard Indicates a audio card device. + * @param dai Indicates a dai device. + * + * @return Returns 0 if dai device start up success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Startup)(const struct AudioCard *audioCard, const struct DaiDevice *dai); + + /** + * @brief Defines Dai device hardware param set function. + * + * @param audioCard Indicates a audio card device. + * @param param Indicates pcm param set. + * + * @return Returns 0 if dai pcm param set success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*HwParams)(const struct AudioCard *audioCard, const struct AudioPcmHwParams *param); + + /** + * @brief Defines Dai device trigger function. + * + * @param audioCard Indicates a audio card device. + * @param cmd Indicates a Command id. + * @param dai Indicates a dai device. + * + * @return Returns 0 if dai device trigger success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Trigger)(const struct AudioCard *audioCard, int cmd, const struct DaiDevice *dai); }; +/** + * @brief Defines dai private data. + * + * @since 1.0 + * @version 1.0 + */ struct DaiData { - const char *drvDaiName; - /* DAI driver callbacks */ - int32_t (*DaiInit)(struct AudioCard *, const struct DaiDevice *); - int32_t (*Read)(unsigned long, uint32_t, uint32_t *); - int32_t (*Write)(unsigned long, uint32_t, uint32_t); - /* ops */ - const struct AudioDaiOps *ops; - /* DAI DMA data */ - struct PcmInfo pcmInfo; - struct AudioKcontrol *controls; - int numControls; - bool daiInitFlag; - unsigned long regVirtualAddr; - struct AudioRegCfgData *regConfig; - struct AudioRegCfgGroupNode **regCfgGroup; - struct OsalMutex mutex; + const char *drvDaiName; /**< dai driver name */ + + /** + * @brief Defines Dai device init. + * + * @param audioCard Indicates a audio card device. + * @param dai Indicates a dai device. + * + * @return Returns 0 if dai device init success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DaiInit)(struct AudioCard *audioCard, const struct DaiDevice *dai); + + /** + * @brief Defines Dai device reg read. + * + * @param virtualAddress Indicates base reg IoRemap address. + * @param reg Indicates reg offset. + * @param value Indicates read reg value. + * + * @return Returns 0 if dai device read reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Read)(unsigned long virtualAddress, uint32_t reg, uint32_t * value); + + /** + * @brief Defines Dai device reg write. + * + * @param virtualAddress Indicates base reg IoRemap address. + * @param reg Indicates reg offset. + * @param value Indicates write reg value. + * + * @return Returns 0 if dai device write reg success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Write)(unsigned long virtualAddress, uint32_t reg, uint32_t value); + + const struct AudioDaiOps *ops; /**< dai set of operation functions */ + struct PcmInfo pcmInfo; /**< dai pcm info */ + struct AudioKcontrol *controls; /**< dai control structure array pointer */ + int numControls; /**< dai controls the number of structure array elements */ + bool daiInitFlag; /**< dai init flag */ + unsigned long regVirtualAddr; /**< dai base reg IoRemap address */ + struct AudioRegCfgData *regConfig; /**< dai registers configured in HCS */ + struct AudioRegCfgGroupNode **regCfgGroup; /**< dai register group configured in HCS */ + struct OsalMutex mutex; /**< dai mutex */ }; -/* Dai host is defined in dai driver */ +/** + * @brief Defines Dai host in audio driver. + * + * @since 1.0 + * @version 1.0 + */ struct DaiHost { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - void *priv; + struct IDeviceIoService service; /**< Services provided by dai */ + struct HdfDeviceObject *device; /**< HDF device */ + void *priv; /**< Dai private data interface */ }; #ifdef __cplusplus diff --git a/include/audio/audio_dsp_if.h b/include/audio/audio_dsp_if.h index 31d42a88e..acb695ef0 100755 --- a/include/audio/audio_dsp_if.h +++ b/include/audio/audio_dsp_if.h @@ -15,35 +15,168 @@ extern "C" { #endif #endif /* __cplusplus */ +/** + * @brief Defines Dsp device name and data. + * + * @since 1.0 + * @version 1.0 + */ struct DspDevice { - const char *devDspName; - struct DspData *devData; - struct HdfDeviceObject *device; - struct DListHead list; + const char *devDspName; /**< Dsp device name */ + struct DspData *devData; /**< Dsp module private data */ + struct HdfDeviceObject *device; /**< HDF device */ + struct DListHead list; /**< Dsp list */ }; +/** + * @brief Defines Dsp operation function set. + * + * @since 1.0 + * @version 1.0 + */ struct AudioDspOps { - int32_t (*Startup)(const struct AudioCard *, const struct DspDevice *); - int32_t (*HwParams)(const struct AudioCard *, const struct AudioPcmHwParams *, const struct DspDevice *); - int32_t (*Trigger)(struct AudioCard *, int, struct DspDevice *); + /** + * @brief Defines Dsp device start up function. + * + * @param audioCard Indicates a audio card device. + * @param dsp Indicates a dsp device. + * + * @return Returns 0 if Dsp device start up success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Startup)(const struct AudioCard *audioCard, const struct DspDevice *dsp); + + /** + * @brief Defines Dsp device hardware param function. + * + * @param audioCard Indicates a audio card device. + * @param param Indicates pcm params set. + * + * @return Returns 0 if dsp param set success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*HwParams)(const struct AudioCard *audioCard, const struct AudioPcmHwParams *param); + + /** + * @brief Defines Dsp device trigger function. + * + * @param audioCard Indicates a audio card device. + * @param dsp Indicates a dsp device. + * + * @return Returns 0 if dsp device trigger success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Trigger)(struct AudioCard *audioCard, int, struct DspDevice *dsp); }; -/* Dsp host is defined in dsp driver */ +/** + * @brief Defines Dsp host in audio driver. + * + * @since 1.0 + * @version 1.0 + */ struct DspHost { - struct IDeviceIoService service; // dsp service - struct HdfDeviceObject *device; // dsp device - void *priv; // dsp private data + struct IDeviceIoService service; /**< Services provided by dsp */ + struct HdfDeviceObject *device; /**< HDF device */ + void *priv; /**< Dsp private data interface */ }; +/** + * @brief Defines dsp private data. + * + * @since 1.0 + * @version 1.0 + */ struct DspData { - const char *drvDspName; - /* dsp driver callbacks */ - int32_t (*DspInit)(const struct DspDevice *device); - int32_t (*Read)(const struct DspDevice *, uint8_t *, uint32_t); - int32_t (*Write)(const struct DspDevice *, uint8_t *, uint32_t); - int32_t (*decode)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); - int32_t (*encode)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); - int32_t (*Equalizer)(const struct AudioCard *, const uint8_t *, const struct DspDevice *); + const char *drvDspName; /**< Dsp driver name */ + + /** + * @brief Defines Dsp device init. + * + * @param dsp Indicates a Dsp device. + * + * @return Returns 0 if dsp device init success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DspInit)(const struct DspDevice *dsp); + + /** + * @brief Defines Dsp device msgs read. + * + * @param dsp Indicates a dsp device. + * @param msgs Indicates transfer msgs data. + * @param len Indicates msgs length. + * + * @return Returns 0 if dsp device read msgs success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Read)(const struct DspDevice *dsp, void *msgs, uint32_t len); + + /** + * @brief Defines Dsp device msgs write. + * + * @param dsp Indicates a dsp device. + * @param msgs Indicates transfer msgs data. + * @param len Indicates msgs length. + * + * @return Returns 0 if dsp device write msgs success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Write)(const struct DspDevice *dsp, void *msgs, uint32_t len); + + /** + * @brief Defines Dsp device decode. + * + * @param audioCard Indicates a audio card. + * @param buf Indicates decode pcm buffer data. + * @param dsp Indicates a dsp device. + * + * @return Returns 0 if Dsp device decode success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Decode)(const struct AudioCard *audioCard, const uint8_t *buf, const struct DspDevice *dsp); + + /** + * @brief Defines Dsp device encode. + * + * @param audioCard audioCard Indicates a audio card. + * @param buf Indicates encode pcm buffer data. + * @param dsp Indicates a dsp device. + * + * @return Returns 0 if Dsp device encode success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Encode)(const struct AudioCard *audioCard, const uint8_t *buf, const struct DspDevice *dsp); + + /** + * @brief Defines Dsp device equalizer. + * + * @param audioCard audioCard Indicates a audio card. + * @param buf Indicates equalizer pcm buffer data. + * @param dsp Indicates a dsp device. + * + * @return Returns 0 if Dsp device equalizer success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*Equalizer)(const struct AudioCard *audioCard, const uint8_t *buf, const struct DspDevice *dsp); }; #ifdef __cplusplus diff --git a/include/audio/audio_platform_if.h b/include/audio/audio_platform_if.h index 586a57cd9..c880672cb 100755 --- a/include/audio/audio_platform_if.h +++ b/include/audio/audio_platform_if.h @@ -10,6 +10,7 @@ #define AUDIO_PLATFORM_IF_H #include "audio_host.h" +#include "audio_platform_base.h" #ifdef __cplusplus #if __cplusplus @@ -17,111 +18,194 @@ extern "C" { #endif #endif /* __cplusplus */ -#define I2S_IOCFG2_BASE1 0x0020 -#define I2S_IOCFG2_BASE2 0x0024 -#define I2S_IOCFG2_BASE3 0x0028 -#define I2S_IOCFG2_BASE4 0x002C -#define I2S_IOCFG2_BASE5 0x0030 - -#define I2S_IOCFG2_BASE1_VAL 0x663 -#define I2S_IOCFG2_BASE2_VAL 0x673 -#define I2S_IOCFG2_BASE3_VAL 0x573 -#define I2S_IOCFG2_BASE4_VAL 0x473 -#define I2S_IOCFG2_BASE5_VAL 0x433 - -#define I2S_IOCFG3_BASE1 0x44 -#define I2S_IOCFG3_BASE1_VAL 0x0600 - -#define GPIO_BASE1 0x2010 -#define GPIO_BASE2 0x2400 -#define GPIO_BASE3 0x2010 - -#define GPIO_BASE2_VAL 0x000000ff -#define GPIO_BASE3_VAL 0x00000000 - -#define IOCFG2_BASE_ADDR 0x112F0000 -#define IOCFG3_BASE_ADDR 0x10FF0000 -#define GPIO_BASE_ADDR 0x120D0000 -#define BASE_ADDR_REMAP_SIZE 0x10000 - -enum PcmStatus { - PCM_STOP = 0, - PCM_PAUSE, - PCM_START, -}; - -struct CircleBufInfo { - uint32_t cirBufSize; - uint32_t trafBufSize; - uint32_t period; - uint32_t periodSize; - uint32_t periodCount; - unsigned long phyAddr; - uint32_t *virtAddr; - uint32_t wbufOffSet; - uint32_t wptrOffSet; - uint32_t rbufOffSet; - uint32_t rptrOffSet; - enum PcmStatus runStatus; - uint32_t chnId; - uint32_t enable; - struct OsalMutex buffMutex; - uint32_t framesPosition; - uint32_t pointer; - uint32_t periodsMax; - uint32_t periodsMin; - uint32_t cirBufMax; - uint32_t curTrafSize; -}; - +/** + * @brief Defines paltform private data. + * + * @since 1.0 + * @version 1.0 + */ struct PlatformData { - const char *drvPlatformName; - /* platform driver callbacks */ - int32_t (*PlatformInit)(const struct AudioCard *, const struct PlatformDevice *); - /* platform stream ops */ - struct AudioDmaOps *ops; - struct CircleBufInfo renderBufInfo; - struct CircleBufInfo captureBufInfo; - struct PcmInfo pcmInfo; - bool platformInitFlag; - struct AudioMmapData mmapData; - uint32_t mmapLoopCount; - void *dmaPrv; + const char *drvPlatformName; /**< Platform module name */ + + /** + * @brief Defines platform device init. + * + * @param audioCard Indicates a audio card device. + * @param platform Indicates a platform device. + * + * @return Returns 0 if Platform device init success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*PlatformInit)(const struct AudioCard *audioCard, const struct PlatformDevice *platform); + + struct AudioDmaOps *ops; /**< Platform module private data */ + struct CircleBufInfo renderBufInfo; /**< Render pcm stream transfer */ + struct CircleBufInfo captureBufInfo; /**< Capture pcm stream transfer */ + struct PcmInfo pcmInfo; /**< Pcm stream info */ + bool platformInitFlag; /**< Platform init flag */ + struct AudioMmapData mmapData; /**< Mmap mode transfer data */ + uint32_t mmapLoopCount; /**< Loop count for mmap mode pcm stream */ + void *dmaPrv; /**< Platform dma private data */ }; -/* dma related definitions */ +/** + * @brief Defines Dma operation function set. + * + * @since 1.0 + * @version 1.0 + */ struct AudioDmaOps { - int32_t (*DmaBufAlloc)(struct PlatformData *, enum AudioStreamType); - int32_t (*DmaBufFree)(struct PlatformData *, enum AudioStreamType); - int32_t (*DmaRequestChannel)(struct PlatformData *); - int32_t (*DmaConfigChannel)(struct PlatformData *); - int32_t (*DmaPrep)(struct PlatformData *); - int32_t (*DmaSubmit)(struct PlatformData *); - int32_t (*DmaPending)(struct PlatformData *); - int32_t (*DmaPause)(struct PlatformData *); - int32_t (*DmaResume)(struct PlatformData *); - int32_t (*DmaPointer)(struct PlatformData *, uint32_t *); + /** + * @brief Defines Dma buff alloc. + * + * @param platformData Indicates dma device. + * @param streamType Indicates capture or render. + * + * @return Returns 0 if dma buffer alloc success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaBufAlloc)(struct PlatformData *platformData, enum AudioStreamType streamType); + + /** + * @brief Defines dma buffer free. + * + * @param platformData Indicates dma device. + * @param streamType Indicates capture or render. + * + * @return Returns 0 if dma buffer free success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaBufFree)(struct PlatformData *platformData, enum AudioStreamType streamType); + + /** + * @brief Defines dma request channel. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if dma request channel success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaRequestChannel)(struct PlatformData *platformData); + + /** + * @brief Defines dma channel config. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if dma channel config set success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaConfigChannel)(struct PlatformData *platformData); + + /** + * @brief Defines dma prepare function. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if dma device prep set success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaPrep)(struct PlatformData *platformData); + + /** + * @brief Defines dma submit function. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if dma device submit succes; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaSubmit)(struct PlatformData *platformData); + + /** + * @brief Defines dma pending function. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if dma pending success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaPending)(struct PlatformData *platformData); + + /** + * @brief Defines pcm stream transfer pause. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if pcm stream transfer pause success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaPause)(struct PlatformData *platformData); + + /** + * @brief Defines pcm stream transfer resume. + * + * @param platformData Indicates dma device. + * + * @return Returns 0 if pcm stream transfer resume success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaResume)(struct PlatformData *platformData); + + /** + * @brief Defines Get the function of the current playback or recording position. + * + * @param platformData Indicates dma device. + * @param pointer Indicates dma pointer. + * + * @return Returns 0 if dma device pointer position get success; returns a non-zero value otherwise. + * + * @since 1.0 + * @version 1.0 + */ + int32_t (*DmaPointer)(struct PlatformData *platformData, uint32_t *pointer); }; +/** + * @brief Defines Dai device name and data. + * + * @since 1.0 + * @version 1.0 + */ struct PlatformDevice { - const char *devPlatformName; - struct PlatformData *devData; - struct HdfDeviceObject *device; - struct DListHead list; + const char *devPlatformName; /**< Platform device name */ + struct PlatformData *devData; /**< Platform module private data */ + struct HdfDeviceObject *device; /**< HDF device */ + struct DListHead list; /**< Platform list */ }; -/* Platform host is defined in platform driver */ +/** + * @brief Defines Platform host in audio driver. + * + * @since 1.0 + * @version 1.0 + */ struct PlatformHost { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - void *priv; + struct IDeviceIoService service; /**< Services provided by patform */ + struct HdfDeviceObject *device; /**< HDF device */ + void *priv; /**< Platform private data interface */ }; -static inline struct PlatformHost *PlatformHostFromDevice(struct HdfDeviceObject *device) -{ - return (device == NULL) ? NULL : (struct PlatformHost *)device->service; -} - #ifdef __cplusplus #if __cplusplus } diff --git a/model/audio/common/include/audio_platform_base.h b/model/audio/common/include/audio_platform_base.h index 0a6215ccd..b895710b8 100755 --- a/model/audio/common/include/audio_platform_base.h +++ b/model/audio/common/include/audio_platform_base.h @@ -9,7 +9,6 @@ #ifndef AUDIO_PLATFORM_BASE_H #define AUDIO_PLATFORM_BASE_H -#include "audio_platform_if.h" #include "audio_host.h" #ifdef __cplusplus @@ -31,6 +30,36 @@ enum DataBitWidth { DATA_BIT_WIDTH32 = 32, /* 32 bit witdth */ }; +enum PcmStatus { + PCM_STOP = 0, /* pcm stream stop flag */ + PCM_PAUSE, /* pcm stream pause flag */ + PCM_START, /* pcm stream start flag */ +}; + +struct CircleBufInfo { + uint32_t cirBufSize; /* Current DMA cache size */ + uint32_t trafBufSize; /* PCM data per transmission default size */ + uint32_t period; /* not used */ + uint32_t periodSize; /* DMA cache period size */ + uint32_t periodCount; /* Number of DMA cache periods */ + unsigned long phyAddr; /* DMA cache physical address */ + uint32_t *virtAddr; /* DMA cache virtual address */ + uint32_t wbufOffSet; /* DMA cache write address offset */ + uint32_t wptrOffSet; /* DMA cache write pointer offset */ + uint32_t rbufOffSet; /* DMA cache read address offset */ + uint32_t rptrOffSet; /* DMA cache read pointer offset */ + enum PcmStatus runStatus; /* PCM status */ + uint32_t chnId; /* Channel ID */ + uint32_t enable; /* Enable identification */ + struct OsalMutex buffMutex; /* mutex */ + uint32_t framesPosition; /* Frame position */ + uint32_t pointer; /* Read/write pointer position during playback and recording */ + uint32_t periodsMax; /* Maximum number of periods */ + uint32_t periodsMin; /* Minimum number of periods */ + uint32_t cirBufMax; /* Size of DMA cache requested */ + uint32_t curTrafSize; /* The size of each actual transmission of PCM data */ +}; + unsigned int SysReadl(unsigned long addr); void SysWritel(unsigned long addr, unsigned int value); diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index c52c65754..747c9d942 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -166,7 +166,7 @@ int32_t AccessoryRegBitsRead(struct AudioMixerControl *regAttr, uint32_t *regVal regAttr->value = regAttr->max - regAttr->value; } AUDIO_DRIVER_LOG_DEBUG("regAddr=0x%x, regValue=0x%x, currBitsValue=0x%x", - regAttr->reg, regVal.value,regAttr->value); + regAttr->reg, regVal.value, regAttr->value); AUDIO_DRIVER_LOG_DEBUG("mask=0x%x, shift=%d, max=0x%x,min=0x%x, invert=%d", regAttr->mask, regAttr->shift, regAttr->max, regAttr->min, regAttr->invert); AUDIO_DRIVER_LOG_DEBUG("success."); diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 88f13a742..0666e7443 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -121,7 +121,7 @@ static int32_t SapmCtrlToSapmComp(struct AudioSapmComponent *sapmComponents, return HDF_SUCCESS; } -static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData,struct AudioRegCfgGroupNode ** regCfgGroup) +static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData, struct AudioRegCfgGroupNode **regCfgGroup) { uint16_t index; @@ -139,8 +139,8 @@ static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData,struct AudioReg return HDF_FAILURE; } - struct AudioKcontrol *audioSapmControls = (struct AudioKcontrol *)OsalMemCalloc - (regCfgGroup[AUDIO_SAPM_CFG_GROUP]->itemNum * sizeof(struct AudioKcontrol)); + struct AudioKcontrol *audioSapmControls = (struct AudioKcontrol *)OsalMemCalloc( + regCfgGroup[AUDIO_SAPM_CFG_GROUP]->itemNum * sizeof(struct AudioKcontrol)); if (audioSapmControls == NULL) { AUDIO_DRIVER_LOG_ERR("OsalMemCalloc failed."); return HDF_FAILURE; @@ -164,10 +164,10 @@ static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData,struct AudioReg } for (index = 0; index < codeData->numSapmComponent; index++) { - if (SapmCtrlToSapmComp(codeData->sapmComponents ,sapmCompItem, index)) { + if (SapmCtrlToSapmComp(codeData->sapmComponents, sapmCompItem, index)) { OsalMemFree(audioSapmControls); return HDF_FAILURE; - } + } if (sapmCompItem[index].kcontrolsNum) { codeData->sapmComponents[index].kcontrolNews = @@ -233,7 +233,7 @@ int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData) int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl) { - uint32_t index = 0; + uint32_t index; if (codeData == NULL || codeData->regConfig == NULL || aiaoGetCtrl == NULL || aiaoSetCtrl == NULL) { AUDIO_DRIVER_LOG_ERR("input para is NULL."); diff --git a/model/audio/common/src/audio_dai_base.c b/model/audio/common/src/audio_dai_base.c index bdface250..240ba1121 100644 --- a/model/audio/common/src/audio_dai_base.c +++ b/model/audio/common/src/audio_dai_base.c @@ -6,12 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "audio_host.h" #include "audio_core.h" -#include "audio_parse.h" #include "audio_driver_log.h" -#include "audio_dai_if.h" -#include "osal_io.h" struct DaiData *DaiDataFromCard(const struct AudioCard *card) { diff --git a/model/audio/common/src/audio_dma_base.c b/model/audio/common/src/audio_dma_base.c index a1e77af48..214edc684 100644 --- a/model/audio/common/src/audio_dma_base.c +++ b/model/audio/common/src/audio_dma_base.c @@ -86,5 +86,3 @@ int32_t AudioDmaPointer(struct PlatformData *data, uint32_t *pointer) } return HDF_FAILURE; } - - diff --git a/model/audio/common/src/audio_dsp_base.c b/model/audio/common/src/audio_dsp_base.c index fde2f9b06..3fb0c38ca 100644 --- a/model/audio/common/src/audio_dsp_base.c +++ b/model/audio/common/src/audio_dsp_base.c @@ -7,7 +7,6 @@ */ #include "audio_dsp_base.h" -#include "osal_io.h" #include "audio_driver_log.h" #define HDF_LOG_TAG audio_dsp_base diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 2289917e8..611f57480 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -361,7 +361,7 @@ static int32_t PcmReadData(struct PlatformData *data, struct AudioRxData *rxData if (!data->pcmInfo.isBigEndian) { if (rxData->buf == NULL || AudioDataBigEndianChange(rxData->buf, data->captureBufInfo.curTrafSize, - data->pcmInfo.bitWidth) != HDF_SUCCESS) { + data->pcmInfo.bitWidth) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); return HDF_FAILURE; } @@ -470,7 +470,8 @@ static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) uint32_t totalSize = data->mmapData.totalBufferFrames * data->pcmInfo.frameSize; uint32_t lastBuffSize = ((totalSize % MIN_PERIOD_SIZE) == 0) ? MIN_PERIOD_SIZE : (totalSize % MIN_PERIOD_SIZE); - uint32_t loopTimes = (lastBuffSize == MIN_PERIOD_SIZE) ? (totalSize / MIN_PERIOD_SIZE) : (totalSize / MIN_PERIOD_SIZE + 1); + uint32_t loopTimes = (lastBuffSize == MIN_PERIOD_SIZE) ? + (totalSize / MIN_PERIOD_SIZE) : (totalSize / MIN_PERIOD_SIZE + 1); data->mmapLoopCount = 0; char *tmpBuf = OsalMemCalloc(MIN_PERIOD_SIZE); @@ -573,13 +574,13 @@ static int32_t MmapReadData(struct PlatformData *data, const struct AudioMmapDat return HDF_FAILURE; } } - + if (CopyToUser((char *)rxMmapData->memoryAddress + offset, - (char *)(data->captureBufInfo.virtAddr) + rPtr, data->captureBufInfo.curTrafSize) != 0) { - AUDIO_DRIVER_LOG_ERR("CopyToUser failed."); - return HDF_FAILURE; + (char *)(data->captureBufInfo.virtAddr) + rPtr, data->captureBufInfo.curTrafSize) != 0) { + AUDIO_DRIVER_LOG_ERR("CopyToUser failed."); + return HDF_FAILURE; } - + // 4. update rptr data->captureBufInfo.rptrOffSet += data->captureBufInfo.curTrafSize; if (data->captureBufInfo.rptrOffSet >= data->captureBufInfo.cirBufSize) { @@ -642,7 +643,6 @@ int32_t AudioMmapReadTransfer(const struct AudioCard *card, const struct AudioMm AUDIO_DRIVER_LOG_ERR("MmapReadData fail."); return HDF_FAILURE; } - offset += data->captureBufInfo.curTrafSize; } while (offset < totalSize && data->captureBufInfo.runStatus != 0); @@ -847,71 +847,109 @@ int32_t AudioCaptureClose(const struct AudioCard *card) return AudioCaptureBuffFree(platformData); } -int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) +static int32_t AudioPcmPending(struct AudioCard *card) { - if (card == NULL) { - AUDIO_DRIVER_LOG_ERR("param is invalid."); - return HDF_ERR_INVALID_PARAM; + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; } + if (AudioDmaSubmit(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + + if (AudioDmaPending(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPending fail."); + return HDF_FAILURE; + } + + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t AudioPcmPause(struct AudioCard *card) +{ struct PlatformData *data = PlatformDataFromCard(card); if (data == NULL) { AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); return HDF_FAILURE; } - switch (cmd) { - case AUDIO_DRV_PCM_IOCTL_RENDER_START: - if (AudioDmaSubmit(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPending fail."); - return HDF_FAILURE; - } + if (AudioDmaPause(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } - if (AudioDmaPending(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPending fail."); - return HDF_FAILURE; - } + if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t AudioPcmResume(struct AudioCard *card) +{ + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + if (AudioDmaResume(data) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + return HDF_FAILURE; + } + + if (AudioSampPowerUp(card) != HDF_SUCCESS) { + return HDF_FAILURE; + } + if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} - if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { +int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) +{ + struct PlatformData *data = PlatformDataFromCard(card); + if (data == NULL) { + AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); + return HDF_FAILURE; + } + + switch (cmd) { + case AUDIO_DRV_PCM_IOCTL_RENDER_START: + if (AudioPcmPending(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPending fail."); return HDF_FAILURE; } data->renderBufInfo.runStatus = PCM_START; break; case AUDIO_DRV_PCM_IOCTL_RENDER_STOP: - if (AudioDmaPause(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); - return HDF_FAILURE; - } - - if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + if (AudioPcmPause(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPause fail."); return HDF_FAILURE; } data->renderBufInfo.runStatus = PCM_STOP; break; case AUDIO_DRV_PCM_IOCTL_RENDER_PAUSE: - if (AudioDmaPause(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); - return HDF_FAILURE; - } - - if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + if (AudioPcmPause(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPause fail."); return HDF_FAILURE; } data->renderBufInfo.runStatus = PCM_PAUSE; break; case AUDIO_DRV_PCM_IOCTL_RENDER_RESUME: - if (AudioDmaResume(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); - return HDF_FAILURE; - } - - if (AudioSampPowerUp(card) != HDF_SUCCESS) { - return HDF_FAILURE; - } - if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + if (AudioPcmResume(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmResume fail."); return HDF_FAILURE; } @@ -926,11 +964,6 @@ int32_t AudioRenderTrigger(struct AudioCard *card, int cmd) int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) { - if (card == NULL) { - AUDIO_DRIVER_LOG_ERR("param is invalid."); - return HDF_ERR_INVALID_PARAM; - } - struct PlatformData *data = PlatformDataFromCard(card); if (data == NULL) { AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); @@ -939,56 +972,35 @@ int32_t AudioCaptureTrigger(struct AudioCard *card, int cmd) switch (cmd) { case AUDIO_DRV_PCM_IOCTL_CAPTURE_START: - if (AudioDmaSubmit(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPending fail."); - return HDF_FAILURE; - } - if (AudioDmaPending(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPending fail."); - return HDF_FAILURE; - } - - if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { + if (AudioPcmPending(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPending fail."); return HDF_FAILURE; } data->captureBufInfo.runStatus = PCM_START; break; case AUDIO_DRV_PCM_IOCTL_CAPTURE_STOP: - if (AudioDmaPause(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + if (AudioPcmPause(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPause fail."); return HDF_FAILURE; } - if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { - return HDF_FAILURE; - } data->captureBufInfo.runStatus = PCM_STOP; break; case AUDIO_DRV_PCM_IOCTL_CAPTURE_PAUSE: - if (AudioDmaPause(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); - return HDF_FAILURE; - } - - if (AudioSampSetPowerMonitor(card, true) != HDF_SUCCESS) { + if (AudioPcmPause(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmPause fail."); return HDF_FAILURE; } data->captureBufInfo.runStatus = PCM_PAUSE; break; case AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME: - if (AudioDmaResume(data) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("DmaPause fail."); + if (AudioPcmResume(card) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioPcmResume fail."); return HDF_FAILURE; } - if (AudioSampPowerUp(card) != HDF_SUCCESS) { - return HDF_FAILURE; - } - if (AudioSampSetPowerMonitor(card, false) != HDF_SUCCESS) { - return HDF_FAILURE; - } data->captureBufInfo.runStatus = PCM_START; break; default: @@ -1136,5 +1148,3 @@ int32_t AudioPcmPointer(const struct AudioCard *card, uint32_t *pointer) return HDF_SUCCESS; } - - diff --git a/model/audio/core/src/audio_parse.c b/model/audio/core/src/audio_parse.c index 732990d70..6670cf42a 100755 --- a/model/audio/core/src/audio_parse.c +++ b/model/audio/core/src/audio_parse.c @@ -324,7 +324,7 @@ static int32_t ParseAudioAddrItem(struct DeviceResourceIface *parser, const stru } static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, - const struct DeviceResourceNode *regCfgNode, struct AudioRegCfgGroupNode** groupNode, uint32_t index) + const struct DeviceResourceNode *regCfgNode, struct AudioRegCfgGroupNode **groupNode, uint32_t index) { int32_t ret = HDF_FAILURE; struct AudioRegCfgGroupNode *group = NULL; @@ -335,18 +335,6 @@ static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, return HDF_FAILURE; } - group = *groupNode; - if (group != NULL) { - if (group->regCfgItem != NULL) { - OsalMemFree(group->regCfgItem); - } - - if (group->ctrlCfgItem != NULL) { - OsalMemFree(group->ctrlCfgItem); - } - OsalMemFree(group); - } - group = (struct AudioRegCfgGroupNode*)OsalMemCalloc(sizeof(*group)); if (group == NULL) { ADM_LOG_ERR("malloc audio reg config group failed"); @@ -355,7 +343,7 @@ static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, *groupNode = group; (*groupNode)->groupIndex = index; - switch(index){ + switch (index) { case AUDIO_CTRL_CFG_GROUP: case AUDIO_SAPM_CFG_GROUP: ret = ParseAudioCtrlItem(parser, regCfgNode, group); diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index 504d0084e..bb4f135ae 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -1326,12 +1326,12 @@ static int32_t StreamHostDspDecode(const struct HdfDeviceIoClient *client, struc rtd = audioCard->rtd; dspDev = rtd->dsp; - if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->decode == NULL) { + if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->Decode == NULL) { ADM_LOG_ERR("audioCard rtd dsp is NULL."); return HDF_FAILURE; } - ret = dspDev->devData->decode(audioCard, (void*)data, dspDev); + ret = dspDev->devData->Decode(audioCard, (void*)data, dspDev); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("DeCode render pause failed ret=%d", ret); return HDF_ERR_IO; @@ -1365,12 +1365,12 @@ static int32_t StreamHostDspEncode(const struct HdfDeviceIoClient *client, struc rtd = audioCard->rtd; dspDev = rtd->dsp; - if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->encode == NULL) { + if (dspDev == NULL || dspDev->devData == NULL || dspDev->devData->Encode == NULL) { ADM_LOG_ERR("audioCard rtd dsp is NULL."); return HDF_FAILURE; } - ret = dspDev->devData->encode(audioCard, (void*)data, dspDev); + ret = dspDev->devData->Encode(audioCard, (void*)data, dspDev); if (ret != HDF_SUCCESS) { ADM_LOG_ERR("EnCode render pause failed ret=%d", ret); return HDF_ERR_IO; -- Gitee From 1e347ebbda431e4d449697904237512b96c10df7 Mon Sep 17 00:00:00 2001 From: Caoruihong Date: Wed, 10 Nov 2021 09:52:39 +0800 Subject: [PATCH 152/272] feat(build): support hc-gen specified output name Signed-off-by: Caoruihong Change-Id: I06b3bebab4f30353167c8fa220cc87359012873e --- tools/hc-gen/hc_gen.gni | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/tools/hc-gen/hc_gen.gni b/tools/hc-gen/hc_gen.gni index 9a842baad..225ab42f2 100644 --- a/tools/hc-gen/hc_gen.gni +++ b/tools/hc-gen/hc_gen.gni @@ -6,7 +6,19 @@ template("hc_gen") { assert(defined(invoker.sources), "sources are must") - action_foreach(target_name) { + if (defined(invoker.outputs)) { + foreach(o, invoker.outputs) { + if (o == string_replace(o, "{{", "")) { + specified_output_name = true + } + } + } + if (defined(specified_output_name) && specified_output_name) { + target_type = "action" + } else { + target_type = "action_foreach" + } + target(target_type, target_name) { deps = [ "//drivers/framework/tools/hc-gen:build_hc_gen" ] script = "/usr/bin/env" if (defined(ohos_lite)) { @@ -35,19 +47,20 @@ template("hc_gen") { outputs = [ "$target_gen_dir/{{source_name_part}}$output_suffix" ] } if (defined(output_suffix2)) { - outputs += [ "$target_gen_dir/{{source_name_part}}$output_suffix2" ] + outputs += [ string_replace(outputs[0], output_suffix, output_suffix2) ] + } + if (target_type == "action") { + src = rebase_path(sources[0], root_build_dir) + } else { + src = "{{source}}" } - assert(get_path_info(outputs[0], "file") == - "{{source_name_part}}$output_suffix", - "unexpected outputs: " + outputs[0]) - output_dir = get_path_info(outputs[0], "dir") args = [ rebase_path(get_path_info("//drivers/framework/tools/hc-gen/", "out_dir") + "/hc-gen") ] args += hc_flags args += [ "-o", - rebase_path("$output_dir/{{source_name_part}}"), - "{{source}}", + rebase_path(string_replace(outputs[0], output_suffix, "")), + src, ] } } -- Gitee From a786ef88b69c9108d9b234890531849413c1fe3b Mon Sep 17 00:00:00 2001 From: vb6174 Date: Wed, 10 Nov 2021 15:30:28 +0800 Subject: [PATCH 153/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91code=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- include/audio/audio_codec_if.h | 2 +- include/audio/audio_dsp_if.h | 4 +- include/audio/audio_platform_if.h | 14 +++---- model/audio/common/include/audio_codec_base.h | 2 +- model/audio/common/src/audio_accessory_base.c | 11 +++-- model/audio/common/src/audio_codec_base.c | 17 +++++--- model/audio/common/src/audio_dai_base.c | 4 ++ model/audio/common/src/audio_platform_base.c | 19 ++++----- model/audio/core/include/audio_core.h | 3 +- model/audio/core/include/audio_parse.h | 9 ++-- model/audio/core/src/audio_core.c | 2 +- model/audio/core/src/audio_parse.c | 23 +++++----- .../dispatch/src/audio_stream_dispatch.c | 42 ++++++++++++++----- model/audio/sapm/src/audio_sapm.c | 21 ++++++---- 14 files changed, 106 insertions(+), 67 deletions(-) diff --git a/include/audio/audio_codec_if.h b/include/audio/audio_codec_if.h index f8fc8be27..5ebe453bd 100755 --- a/include/audio/audio_codec_if.h +++ b/include/audio/audio_codec_if.h @@ -52,7 +52,7 @@ struct CodecData { * @since 1.0 * @version 1.0 */ - int32_t (*Init)(struct AudioCard *audioCard, struct CodecDevice *codec); + int32_t (*Init)(struct AudioCard *audioCard, const struct CodecDevice *codec); /** * @brief Defines Codec device reg read. diff --git a/include/audio/audio_dsp_if.h b/include/audio/audio_dsp_if.h index acb695ef0..8e39def5d 100755 --- a/include/audio/audio_dsp_if.h +++ b/include/audio/audio_dsp_if.h @@ -120,7 +120,7 @@ struct DspData { * @since 1.0 * @version 1.0 */ - int32_t (*Read)(const struct DspDevice *dsp, void *msgs, uint32_t len); + int32_t (*Read)(const struct DspDevice *dsp, const void *msgs, const uint32_t len); /** * @brief Defines Dsp device msgs write. @@ -134,7 +134,7 @@ struct DspData { * @since 1.0 * @version 1.0 */ - int32_t (*Write)(const struct DspDevice *dsp, void *msgs, uint32_t len); + int32_t (*Write)(const struct DspDevice *dsp, const void *msgs, const uint32_t len); /** * @brief Defines Dsp device decode. diff --git a/include/audio/audio_platform_if.h b/include/audio/audio_platform_if.h index c880672cb..bb6e09896 100755 --- a/include/audio/audio_platform_if.h +++ b/include/audio/audio_platform_if.h @@ -68,7 +68,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaBufAlloc)(struct PlatformData *platformData, enum AudioStreamType streamType); + int32_t (*DmaBufAlloc)(struct PlatformData *platformData, const enum AudioStreamType streamType); /** * @brief Defines dma buffer free. @@ -81,7 +81,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaBufFree)(struct PlatformData *platformData, enum AudioStreamType streamType); + int32_t (*DmaBufFree)(struct PlatformData *platformData, const enum AudioStreamType streamType); /** * @brief Defines dma request channel. @@ -93,7 +93,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaRequestChannel)(struct PlatformData *platformData); + int32_t (*DmaRequestChannel)(const struct PlatformData *platformData); /** * @brief Defines dma channel config. @@ -105,7 +105,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaConfigChannel)(struct PlatformData *platformData); + int32_t (*DmaConfigChannel)(const struct PlatformData *platformData); /** * @brief Defines dma prepare function. @@ -117,7 +117,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaPrep)(struct PlatformData *platformData); + int32_t (*DmaPrep)(const struct PlatformData *platformData); /** * @brief Defines dma submit function. @@ -129,7 +129,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaSubmit)(struct PlatformData *platformData); + int32_t (*DmaSubmit)(const struct PlatformData *platformData); /** * @brief Defines dma pending function. @@ -165,7 +165,7 @@ struct AudioDmaOps { * @since 1.0 * @version 1.0 */ - int32_t (*DmaResume)(struct PlatformData *platformData); + int32_t (*DmaResume)(const struct PlatformData *platformData); /** * @brief Defines Get the function of the current playback or recording position. diff --git a/model/audio/common/include/audio_codec_base.h b/model/audio/common/include/audio_codec_base.h index c89ce90ad..c404017fa 100755 --- a/model/audio/common/include/audio_codec_base.h +++ b/model/audio/common/include/audio_codec_base.h @@ -23,7 +23,7 @@ int32_t CodecGetServiceName(const struct HdfDeviceObject *device, const char **d int32_t CodecGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecData *codecData); int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData); -int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl); +int32_t CodecSetCtlFunc(struct CodecData *codeData,const void *aiaoGetCtrl,const void *aiaoSetCtrl); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 747c9d942..6fcdd465a 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -108,6 +108,8 @@ int32_t AccessoryI2cReadWrite(struct AudioAddrConfig *regAttr, uint16_t rwFlag) int16_t transferMsgCount = 1; uint8_t regs[I2C_REG_LEN]; struct I2cMsg msgs[I2C_MSG_NUM]; + (void)memset_s(msgs, sizeof(struct I2cMsg) * I2C_MSG_NUM, 0, sizeof(struct I2cMsg) * I2C_MSG_NUM); + AUDIO_DRIVER_LOG_DEBUG("entry.\n"); if (regAttr == NULL || rwFlag < 0 || rwFlag > 1) { AUDIO_DRIVER_LOG_ERR("invalid parameter."); @@ -298,9 +300,10 @@ int32_t AcessoryDeviceFrequencyParse(uint32_t rate, uint16_t *freq) int32_t AccessoryDeviceCfgGet(struct AccessoryData *accessoryData, struct AccessoryTransferData *accessoryTransferData) { - int32_t ret, index; - struct AudioControlConfig *ctlcfgItem = NULL; - uint32_t audioCfgCtrlCount; + int32_t ret; + int32_t index; + int32_t audioCfgCtrlCount; + ret = (accessoryData == NULL || accessoryData->regConfig == NULL || accessoryTransferData == NULL); if (ret) { AUDIO_DRIVER_LOG_ERR("input para is NULL."); @@ -317,7 +320,7 @@ int32_t AccessoryDeviceCfgGet(struct AccessoryData *accessoryData, AUDIO_DRIVER_LOG_ERR("parsing params is NULL."); return HDF_FAILURE; } - ctlcfgItem = g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; + struct AudioControlConfig *ctlcfgItem = g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; audioCfgCtrlCount = g_audioRegCfgGroupNode[AUDIO_CTRL_CFG_GROUP]->itemNum; g_audioControls = (struct AudioKcontrol *)OsalMemCalloc(audioCfgCtrlCount * sizeof(struct AudioKcontrol)); accessoryTransferData->accessoryRegCfgGroupNode = g_audioRegCfgGroupNode; diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 0666e7443..b247b2aaa 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -101,14 +101,14 @@ int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecDat return HDF_SUCCESS; } -static int32_t SapmCtrlToSapmComp(struct AudioSapmComponent *sapmComponents, - struct AudioSapmCtrlConfig *sapmCompItem, uint16_t index) +static int32_t SapmCtrlToSapmComp(struct AudioSapmComponent *sapmComponents, + const struct AudioSapmCtrlConfig *sapmCompItem, uint16_t index) { if (sapmComponents == NULL || sapmCompItem == NULL) { AUDIO_DRIVER_LOG_ERR("input para is NULL."); return HDF_FAILURE; } - + sapmComponents[index].componentName = g_audioSapmCompNameList[sapmCompItem[index].compNameIndex]; sapmComponents[index].reg = sapmCompItem[index].reg; @@ -231,7 +231,7 @@ int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData) return HDF_SUCCESS; } -int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aiaoSetCtrl) +int32_t CodecSetCtlFunc(struct CodecData *codeData,const void *aiaoGetCtrl,const void *aiaoSetCtrl) { uint32_t index; if (codeData == NULL || codeData->regConfig == NULL || @@ -240,9 +240,14 @@ int32_t CodecSetCtlFunc(struct CodecData *codeData, void *aiaoGetCtrl, void *aia return HDF_FAILURE; } struct AudioRegCfgGroupNode **regCfgGroup = codeData->regConfig->audioRegParams; + if (regCfgGroup == NULL || regCfgGroup[AUDIO_CTRL_CFG_GROUP] == NULL) { + AUDIO_DRIVER_LOG_ERR("regCfgGroup or regCfgGroup[AUDIO_CTRL_CFG_GROUP] is NULL."); + return HDF_FAILURE; + } + struct AudioControlConfig *compItem = regCfgGroup[AUDIO_CTRL_CFG_GROUP]->ctrlCfgItem; - if (regCfgGroup == NULL || compItem == NULL) { - AUDIO_DRIVER_LOG_ERR("regCfgGroup or compItem is NULL."); + if (compItem == NULL) { + AUDIO_DRIVER_LOG_ERR("compItem is NULL."); return HDF_FAILURE; } diff --git a/model/audio/common/src/audio_dai_base.c b/model/audio/common/src/audio_dai_base.c index 240ba1121..3f470cfaf 100644 --- a/model/audio/common/src/audio_dai_base.c +++ b/model/audio/common/src/audio_dai_base.c @@ -98,6 +98,10 @@ int32_t DaiSetConfigInfo(struct DaiData *data) for (index = 0; index < data->numControls; index++) { data->controls[index].iface = item[index].iface; + if (item[index].arrayIndex >= AUDIO_CTRL_LIST_MAX) { + AUDIO_DRIVER_LOG_ERR("Array super index."); + return HDF_FAILURE; + } data->controls[index].name = g_audioControlsList[item[index].arrayIndex]; data->controls[index].Info = AudioInfoCtrlOps; data->controls[index].privateValue = (unsigned long)&patRegCfgItemTmp[index]; diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 611f57480..ecaa409b4 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -207,14 +207,14 @@ int32_t AudioSetCaptureBufInfo(struct PlatformData *data, const struct AudioPcmH int32_t AudioWriteProcBigEndian(const struct PlatformData *data, struct AudioTxData *txData) { - uint64_t buffSize; + uint32_t buffSize; if (data == NULL || txData == NULL || txData->buf == NULL) { AUDIO_DRIVER_LOG_ERR("input param is null."); return HDF_FAILURE; } - buffSize = txData->frames * data->pcmInfo.frameSize; + buffSize = (uint32_t)txData->frames * data->pcmInfo.frameSize; if (data->pcmInfo.isBigEndian) { if (AudioDataBigEndianChange(txData->buf, buffSize, data->pcmInfo.bitWidth) != HDF_SUCCESS) { AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); @@ -228,12 +228,11 @@ static enum CriBuffStatus AudioDmaBuffStatus(const struct AudioCard *card) { uint32_t dataAvailable; uint32_t residual; - uint32_t pointer; - struct PlatformData *data = NULL; + uint32_t pointer = 0; uint32_t wptr; uint32_t rptr; - data = PlatformDataFromCard(card); + struct PlatformData *data = PlatformDataFromCard(card); if (data == NULL || data->ops == NULL) { AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); return HDF_FAILURE; @@ -468,7 +467,7 @@ static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) return HDF_FAILURE; } - uint32_t totalSize = data->mmapData.totalBufferFrames * data->pcmInfo.frameSize; + uint32_t totalSize = (uint32_t)data->mmapData.totalBufferFrames * data->pcmInfo.frameSize; uint32_t lastBuffSize = ((totalSize % MIN_PERIOD_SIZE) == 0) ? MIN_PERIOD_SIZE : (totalSize % MIN_PERIOD_SIZE); uint32_t loopTimes = (lastBuffSize == MIN_PERIOD_SIZE) ? (totalSize / MIN_PERIOD_SIZE) : (totalSize / MIN_PERIOD_SIZE + 1); @@ -596,21 +595,21 @@ int32_t AudioMmapReadTransfer(const struct AudioCard *card, const struct AudioMm uint32_t offset = 0; enum CriBuffStatus status; uint32_t timeout = 0; - struct PlatformData *data = NULL; - if (!card || !rxMmapData || !rxMmapData->memoryAddress || rxMmapData->totalBufferFrames <= 0) { + if (card == NULL || rxMmapData == NULL || rxMmapData->memoryAddress == NULL || + rxMmapData->totalBufferFrames <= 0) { AUDIO_DRIVER_LOG_ERR("param is invalid."); return HDF_ERR_INVALID_PARAM; } - data = PlatformDataFromCard(card); + struct PlatformData *data = PlatformDataFromCard(card); if (data == NULL) { AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); return HDF_FAILURE; } uint32_t frameSize = data->pcmInfo.frameSize; - uint32_t totalSize = rxMmapData->totalBufferFrames * frameSize; + uint32_t totalSize = (uint32_t)rxMmapData->totalBufferFrames * frameSize; data->captureBufInfo.pointer = 0; data->captureBufInfo.curTrafSize = data->captureBufInfo.trafBufSize; if (data->captureBufInfo.virtAddr == NULL) { diff --git a/model/audio/core/include/audio_core.h b/model/audio/core/include/audio_core.h index aba914d87..30faa241d 100755 --- a/model/audio/core/include/audio_core.h +++ b/model/audio/core/include/audio_core.h @@ -39,7 +39,8 @@ int32_t AudioUpdateCodecRegBits(struct CodecDevice *codec, const struct AudioMixerControl *mixerControl, uint32_t value); int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, const struct AudioMixerControl *mixerControl, uint32_t value); -int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, struct AudioMixerControl *mixerControl, uint32_t value); +int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, const struct AudioMixerControl *mixerControl, + uint32_t value); struct DaiDevice *AudioKcontrolGetCpuDai(const struct AudioKcontrol *kcontrol); struct CodecDevice *AudioKcontrolGetCodec(const struct AudioKcontrol *kcontrol); diff --git a/model/audio/core/include/audio_parse.h b/model/audio/core/include/audio_parse.h index bba9a8279..e66b3b7e5 100755 --- a/model/audio/core/include/audio_parse.h +++ b/model/audio/core/include/audio_parse.h @@ -19,19 +19,22 @@ extern "C" { #endif /* __cplusplus */ #define AUDIO_CONFIG_MAX_ITEM 100 +#define AUDIO_CTRL_LIST_MAX 10 +#define AUDIO_SAPM_COMP_NAME_LIST_MAX 9 +#define AUDIO_SAPM_CFG_NAME_LIST_MAX 4 -static const char *g_audioControlsList[] = { +static const char *g_audioControlsList[AUDIO_CTRL_LIST_MAX] = { "Main Playback Volume", "Main Capture Volume", "Playback Mute", "Capture Mute", "Mic Left Gain", "Mic Right Gain", "External Codec Enable", "Internally Codec Enable", "Render Channel Mode", "Captrue Channel Mode" }; -static char *g_audioSapmCompNameList[] = { +static char *g_audioSapmCompNameList[AUDIO_SAPM_COMP_NAME_LIST_MAX] = { "ADCL", "ADCR", "DACL", "DACR", "LPGA", "RPGA", "SPKL", "SPKR", "MIC" }; -static char *g_audioSapmCfgNameList[] = { +static char *g_audioSapmCfgNameList[AUDIO_SAPM_CFG_NAME_LIST_MAX] = { "LPGA MIC Switch", "RPGA MIC Switch", "Dacl enable", "Dacr enable" }; diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index b1b4b53d5..6dc781861 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -439,7 +439,7 @@ int32_t AudioUpdateAccessoryRegBits(struct AccessoryDevice *accessory, return HDF_SUCCESS; } -int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, struct AudioMixerControl *mixerControl, uint32_t value) +int32_t AudioUpdateDaiRegBits(const struct DaiDevice *dai, const struct AudioMixerControl *mixerControl, uint32_t value) { int32_t ret; uint32_t curValue = 0; diff --git a/model/audio/core/src/audio_parse.c b/model/audio/core/src/audio_parse.c index 6670cf42a..245140705 100755 --- a/model/audio/core/src/audio_parse.c +++ b/model/audio/core/src/audio_parse.c @@ -129,7 +129,7 @@ static uint32_t GetAudioRegGroupNameIndex(const char *name) return index; } -static uint32_t* GetRegArray(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, +static uint32_t* GetRegArray(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, struct AudioRegCfgGroupNode* group, uint32_t indexMax) { int32_t ret; @@ -151,7 +151,7 @@ static uint32_t* GetRegArray(struct DeviceResourceIface *parser, const struct De return NULL; } - group->itemNum = (num + 1) / indexMax; + group->itemNum = num / indexMax; uint32_t *buf = (uint32_t *)OsalMemCalloc(sizeof(uint32_t) * num); if (buf == NULL) { @@ -168,7 +168,7 @@ static uint32_t* GetRegArray(struct DeviceResourceIface *parser, const struct De return buf; } -static int32_t ParseAudioRegItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, +static int32_t ParseAudioRegItem(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, struct AudioRegCfgGroupNode* group) { int32_t step; @@ -211,7 +211,7 @@ static int32_t ParseAudioRegItem(struct DeviceResourceIface *parser, const struc return HDF_SUCCESS; } -static int32_t ParseAudioSapmItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, +static int32_t ParseAudioSapmItem(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, struct AudioRegCfgGroupNode* group) { int32_t step; @@ -253,7 +253,7 @@ static int32_t ParseAudioSapmItem(struct DeviceResourceIface *parser, const stru } -static int32_t ParseAudioCtrlItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, +static int32_t ParseAudioCtrlItem(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, struct AudioRegCfgGroupNode* group) { int32_t step; @@ -289,14 +289,14 @@ static int32_t ParseAudioCtrlItem(struct DeviceResourceIface *parser, const stru return HDF_SUCCESS; } -static int32_t ParseAudioAddrItem(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, +static int32_t ParseAudioAddrItem(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regNode, struct AudioRegCfgGroupNode* group) { int32_t step; - int32_t index = group->groupIndex; + int32_t index; - if (parser == NULL || regNode == NULL || g_audioRegGroupName[index] == NULL || group == NULL) { - ADM_LOG_ERR("Input para check error: groupName=%p", g_audioRegGroupName[index]); + if (parser == NULL || regNode == NULL || group == NULL) { + ADM_LOG_ERR("Input para check error."); return HDF_FAILURE; } @@ -315,7 +315,6 @@ static int32_t ParseAudioAddrItem(struct DeviceResourceIface *parser, const stru for (index = 0; index < group->itemNum; ++index) { step = AUDIO_ADDR_CFG_INDEX_MAX * index; - group->addrCfgItem[index].addr = buf[step + AUDIO_ADDR_CFG_REG_INDEX]; group->addrCfgItem[index].value = buf[step + AUDIO_ADDR_CFG_VALUE_INDEX]; } @@ -323,7 +322,7 @@ static int32_t ParseAudioAddrItem(struct DeviceResourceIface *parser, const stru return HDF_SUCCESS; } -static int32_t ParseAudioRegGroup(struct DeviceResourceIface *parser, +static int32_t ParseAudioRegGroup(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode, struct AudioRegCfgGroupNode **groupNode, uint32_t index) { int32_t ret = HDF_FAILURE; @@ -394,7 +393,7 @@ static void ReleaseAudioAllRegConfig(struct AudioRegCfgData *config) } } -static int32_t ParseAudioAttr(struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, +static int32_t ParseAudioAttr(const struct DeviceResourceIface *parser, const struct DeviceResourceNode *attrNode, struct AudioIdInfo *config) { int32_t ret; diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index bb4f135ae..68cfbdbe5 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -14,7 +14,7 @@ #define BUFF_SIZE_MAX 64 -static inline struct StreamHost *StreamHostFromDevice(struct HdfDeviceObject *device) +static inline struct StreamHost *StreamHostFromDevice(const struct HdfDeviceObject *device) { return (device == NULL) ? NULL : (struct StreamHost *)device->service; } @@ -169,9 +169,13 @@ static int32_t HwParamsDispatch(const struct AudioCard *audioCard, const struct return HDF_SUCCESS; } -static int32_t CpuDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *cpuDai) +static int32_t CpuDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *cpuDai) { int32_t ret; + if (audioCard == NULL || audioCard->rtd == NULL) { + ADM_LOG_ERR("audioCard is null."); + return HDF_FAILURE; + } if (cpuDai != NULL && cpuDai->devData != NULL && cpuDai->devData->ops != NULL && cpuDai->devData->ops->Startup != NULL) { ret = cpuDai->devData->ops->Startup(audioCard, cpuDai); @@ -185,7 +189,7 @@ static int32_t CpuDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *c return HDF_SUCCESS; } -static int32_t CodecDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *codecDai) +static int32_t CodecDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *codecDai) { int32_t ret; if (audioCard == NULL || audioCard->rtd == NULL) { @@ -206,7 +210,7 @@ static int32_t CodecDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice return HDF_SUCCESS; } -static int32_t DspDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *dspDai) +static int32_t DspDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *dspDai) { int32_t ret; if (audioCard == NULL || audioCard->rtd == NULL) { @@ -226,7 +230,7 @@ static int32_t DspDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *d return HDF_SUCCESS; } -static int32_t AccessoryDaiDevStartup(struct AudioCard *audioCard, struct DaiDevice *accessoryDai) +static int32_t AccessoryDaiDevStartup(const struct AudioCard *audioCard, const struct DaiDevice *accessoryDai) { int32_t ret; if (audioCard == NULL || audioCard->rtd == NULL) { @@ -246,7 +250,7 @@ static int32_t AccessoryDaiDevStartup(struct AudioCard *audioCard, struct DaiDev return HDF_SUCCESS; } -static int32_t AudioDaiDeviceStartup(struct AudioCard *audioCard) +static int32_t AudioDaiDeviceStartup(const struct AudioCard *audioCard) { struct DaiDevice *cpuDai = NULL; struct DaiDevice *codecDai = NULL; @@ -779,6 +783,10 @@ static int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struc } txMmapData.memoryAddress = (void *)((uintptr_t)mAddress); + if (txMmapData.memoryAddress == NULL) { + ADM_LOG_ERR("txMmapData.memoryAddress is NULL."); + return HDF_FAILURE; + } if (!HdfSbufReadInt32(data, (uint32_t *)&(txMmapData.memoryFd))) { ADM_LOG_ERR("render mmap read request memory fd failed!"); @@ -849,6 +857,10 @@ static int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct return HDF_FAILURE; } rxMmapData.memoryAddress = (void *)((uintptr_t)mAddress); + if (rxMmapData.memoryAddress == NULL) { + ADM_LOG_ERR("rxMmapData.memoryAddress is NULL."); + return HDF_FAILURE; + } if (!HdfSbufReadInt32(data, (uint32_t *)&(rxMmapData.memoryFd))) { ADM_LOG_ERR("capture mmap read request memory fd failed!"); @@ -905,12 +917,13 @@ static int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client return HDF_SUCCESS; } -static int32_t StreamTriggerRouteImpl(struct AudioCard *audioCard, struct AudioRuntimeDeivces *rtd, +static int32_t StreamTriggerRouteImpl(const struct AudioCard *audioCard, const struct AudioRuntimeDeivces *rtd, enum StreamDispMethodCmd methodCmd) { int32_t ret = HDF_SUCCESS; struct DaiDevice *cpuDai = NULL; struct DaiDevice *codecDai = NULL; + struct DaiDevice *accessoryDai = NULL; struct DaiDevice *dspDai = NULL; if (audioCard == NULL || rtd == NULL) { ADM_LOG_ERR("input param is NULL."); @@ -934,6 +947,15 @@ static int32_t StreamTriggerRouteImpl(struct AudioCard *audioCard, struct AudioR return HDF_FAILURE; } } + accessoryDai = rtd->accessoryDai; + if (accessoryDai != NULL && accessoryDai->devData != NULL && accessoryDai->devData->ops != NULL && + accessoryDai->devData->ops->Trigger != NULL) { + ret = accessoryDai->devData->ops->Trigger(audioCard, methodCmd, accessoryDai); + if (ret != HDF_SUCCESS) { + ADM_LOG_ERR("accessoryDai Trigger failed."); + return HDF_FAILURE; + } + } dspDai = rtd->dspDai; if (dspDai != NULL && dspDai->devData != NULL && dspDai->devData->ops != NULL && dspDai->devData->ops->Trigger != NULL) { @@ -943,11 +965,9 @@ static int32_t StreamTriggerRouteImpl(struct AudioCard *audioCard, struct AudioR return HDF_FAILURE; } } - ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } - static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; @@ -1447,10 +1467,10 @@ static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { }; static int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, - struct HdfSBuf *data, struct HdfSBuf *reply) + struct HdfSBuf *data, struct HdfSBuf *reply) { unsigned int count = sizeof(g_streamDispCmdHandle) / sizeof(g_streamDispCmdHandle[0]); - for (int i = 0; i < count; ++i) { + for (unsigned int i = 0; i < count; ++i) { if ((cmdId == (int)(g_streamDispCmdHandle[i].cmd)) && (g_streamDispCmdHandle[i].func != NULL)) { return g_streamDispCmdHandle[i].func(client, data, reply); } diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index da7f723bd..7d4fe632b 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -84,7 +84,7 @@ static int32_t ConnectedInputEndPoint(const struct AudioSapmComponent *sapmCompo { struct AudioSapmpath *path = NULL; int32_t count = 0; - int32_t endPointVal = 1; + const int32_t endPointVal = 1; if (sapmComponent == NULL) { ADM_LOG_ERR("input param sapmComponent is NULL."); @@ -114,7 +114,7 @@ static int32_t ConnectedOutputEndPoint(const struct AudioSapmComponent *sapmComp { struct AudioSapmpath *path = NULL; int32_t count = 0; - int32_t endPointVal = 1; + const int32_t endPointVal = 1; if (sapmComponent == NULL) { ADM_LOG_ERR("input param sapmComponent is NULL."); @@ -404,7 +404,7 @@ static void MuxSetPathStatus(const struct AudioSapmComponent *sapmComponent, str int32_t ret; uint32_t val = 0; int32_t item; - uint32_t reg = 0; + const uint32_t reg = 0; uint32_t shift; if ((sapmComponent == NULL || sapmComponent->codec == NULL) || (path == NULL || path->name == NULL) || @@ -443,7 +443,7 @@ static void MuxValueSetPathStatus(const struct AudioSapmComponent *sapmComponent int32_t ret; uint32_t val = 0; uint32_t item; - uint32_t reg = 0; + const uint32_t reg = 0; uint32_t shift; if ((sapmComponent == NULL || sapmComponent->codec == NULL) || (path == NULL || path->name == NULL) || (enumKtl == NULL || enumKtl->texts == NULL)) { @@ -756,7 +756,7 @@ int32_t AudioSapmAddRoutes(struct AudioCard *audioCard, const struct AudioSapmRo return HDF_SUCCESS; } -int32_t AudioSapmNewMixerControls(struct AudioSapmComponent *sapmComponent, struct AudioCard *audioCard) +int32_t AudioSapmNewMixerControls(const struct AudioSapmComponent *sapmComponent, struct AudioCard *audioCard) { struct AudioSapmpath *path = NULL; int32_t i; @@ -768,7 +768,8 @@ int32_t AudioSapmNewMixerControls(struct AudioSapmComponent *sapmComponent, stru for (i = 0; i < sapmComponent->kcontrolsNum; i++) { DLIST_FOR_EACH_ENTRY(path, &sapmComponent->sources, struct AudioSapmpath, listSink) { - if (path->name == NULL || sapmComponent->kcontrolNews[i].name == NULL) { + if (path->name == NULL || sapmComponent->kcontrolNews == NULL + || sapmComponent->kcontrolNews[i].name == NULL) { continue; } @@ -958,6 +959,7 @@ static void AudioSapmPowerDownSeqRun(const struct DListHead *list) static int AudioSapmPowerComponents(struct AudioCard *audioCard) { + int32_t ret; struct AudioSapmComponent *sapmComponent = NULL; struct DListHead upList; struct DListHead downList; @@ -978,7 +980,10 @@ static int AudioSapmPowerComponents(struct AudioCard *audioCard) } if (g_audioSapmIsStandby && sapmComponent->PowerClockOp != NULL) { - sapmComponent->PowerClockOp(sapmComponent); + ret = sapmComponent->PowerClockOp(sapmComponent); + if (ret != HDF_SUCCESS) { + continue; + } } AudioSapmSetPower(audioCard, sapmComponent, sapmComponent->newPower, &upList, &downList); @@ -1327,7 +1332,7 @@ int32_t AudioSampSetPowerMonitor(struct AudioCard *card, bool powerMonitorState) return HDF_SUCCESS; } -static void AudioSapmEnterSleepSub(uintptr_t para, struct AudioSapmComponent *sapmComponent) +static void AudioSapmEnterSleepSub(const uintptr_t para, struct AudioSapmComponent *sapmComponent) { struct DListHead downList; struct AudioCard *audioCard = (struct AudioCard *)para; -- Gitee From 292e72b04e83c923c358162081a4f8daa8354142 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Thu, 11 Nov 2021 10:59:13 +0800 Subject: [PATCH 154/272] modify sensor code Signed-off-by: jifengfei --- model/sensor/driver/accel/sensor_accel_driver.c | 4 ++-- model/sensor/driver/barometer/sensor_barometer_driver.c | 4 ++-- model/sensor/driver/chipset/accel/accel_bmi160.c | 9 ++++++--- model/sensor/driver/chipset/barometer/barometer_bmp180.c | 9 ++++++--- model/sensor/driver/chipset/magnetic/magnetic_lsm303.c | 9 ++++++--- .../sensor/driver/chipset/proximity/proximity_apds9960.c | 9 ++++++--- model/sensor/driver/magnetic/sensor_magnetic_driver.c | 4 ++-- model/sensor/driver/proximity/sensor_proximity_driver.c | 4 ++-- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/model/sensor/driver/accel/sensor_accel_driver.c b/model/sensor/driver/accel/sensor_accel_driver.c index 7f9a88370..dca54870a 100644 --- a/model/sensor/driver/accel/sensor_accel_driver.c +++ b/model/sensor/driver/accel/sensor_accel_driver.c @@ -299,7 +299,7 @@ BASE_CONFIG_EXIT: (void)memset_s(&drvData->accelCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&drvData->accelCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&drvData->accelCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; + return drvData->accelCfg; } void AccelReleaseCfgData(struct SensorCfgData *accelCfg) @@ -346,7 +346,7 @@ void AccelReleaseDriver(struct HdfDeviceObject *device) struct AccelDrvData *drvData = (struct AccelDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - if (drvData->detectFlag) { + if (drvData->detectFlag && drvData->accelCfg != NULL) { AccelReleaseCfgData(drvData->accelCfg); } diff --git a/model/sensor/driver/barometer/sensor_barometer_driver.c b/model/sensor/driver/barometer/sensor_barometer_driver.c index 5712c3651..79f5d38f6 100644 --- a/model/sensor/driver/barometer/sensor_barometer_driver.c +++ b/model/sensor/driver/barometer/sensor_barometer_driver.c @@ -300,7 +300,7 @@ BASE_CONFIG_EXIT: sizeof(struct SensorBasicInfo)); (void)memset_s(&drvData->barometerCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&drvData->barometerCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; + return drvData->barometerCfg; } void BarometerReleaseCfgData(struct SensorCfgData *barometerCfg) @@ -347,7 +347,7 @@ void BarometerReleaseDriver(struct HdfDeviceObject *device) struct BarometerDrvData *drvData = (struct BarometerDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - if (drvData->detectFlag) { + if (drvData->detectFlag && drvData->barometerCfg != NULL) { BarometerReleaseCfgData(drvData->barometerCfg); } diff --git a/model/sensor/driver/chipset/accel/accel_bmi160.c b/model/sensor/driver/chipset/accel/accel_bmi160.c index b39d7bc4c..2ee5764f8 100644 --- a/model/sensor/driver/chipset/accel/accel_bmi160.c +++ b/model/sensor/driver/chipset/accel/accel_bmi160.c @@ -187,7 +187,8 @@ int32_t Bmi160InitDriver(struct HdfDeviceObject *device) } drvData->sensorCfg = AccelCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating accelcfg failed because detection failed", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -215,8 +216,10 @@ void Bmi160ReleaseDriver(struct HdfDeviceObject *device) struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - AccelReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; + if (drvData->sensorCfg != NULL) { + AccelReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } OsalMemFree(drvData); } diff --git a/model/sensor/driver/chipset/barometer/barometer_bmp180.c b/model/sensor/driver/chipset/barometer/barometer_bmp180.c index 947c51a28..3c5f150e1 100644 --- a/model/sensor/driver/chipset/barometer/barometer_bmp180.c +++ b/model/sensor/driver/chipset/barometer/barometer_bmp180.c @@ -367,7 +367,8 @@ int32_t Bmp180InitDriver(struct HdfDeviceObject *device) } drvData->sensorCfg = BarometerCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating barometercfg failed because detection failed", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -395,8 +396,10 @@ void Bmp180ReleaseDriver(struct HdfDeviceObject *device) struct Bmp180DrvData *drvData = (struct Bmp180DrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - BarometerReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; + if (drvData->sensorCfg != NULL) { + BarometerReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } OsalMemFree(drvData); } diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c index 4726b7671..ba554632a 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c @@ -188,7 +188,8 @@ int32_t Lsm303InitDriver(struct HdfDeviceObject *device) } drvData->sensorCfg = MagneticCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating magneticcfg failed because detection failed", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -216,8 +217,10 @@ void Lsm303ReleaseDriver(struct HdfDeviceObject *device) struct Lsm303DrvData *drvData = (struct Lsm303DrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - MagneticReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; + if (drvData->sensorCfg != NULL) { + MagneticReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } OsalMemFree(drvData); } diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.c b/model/sensor/driver/chipset/proximity/proximity_apds9960.c index 955e4024e..1fbc5bfe0 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.c +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.c @@ -156,7 +156,8 @@ int32_t Apds996InitDriver(struct HdfDeviceObject *device) } drvData->sensorCfg = ProximityCreateCfgData(device->property); - if (drvData->sensorCfg == NULL) { + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating proximitycfg failed because detection failed", __func__); return HDF_ERR_NOT_SUPPORT; } @@ -185,8 +186,10 @@ void Apds996ReleaseDriver(struct HdfDeviceObject *device) struct Apds9960DrvData *drvData = (struct Apds9960DrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - ProximityReleaseCfgData(drvData->sensorCfg); - drvData->sensorCfg = NULL; + if (drvData->sensorCfg != NULL) { + ProximityReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } OsalMemFree(drvData); } diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index c614ba33b..441f038d3 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -308,7 +308,7 @@ BASE_CONFIG_EXIT: (void)memset_s(&drvData->magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&drvData->magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; + return drvData->magneticCfg; } void MagneticReleaseCfgData(struct SensorCfgData *magneticCfg) @@ -355,7 +355,7 @@ void MagneticReleaseDriver(struct HdfDeviceObject *device) struct MagneticDrvData *drvData = (struct MagneticDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - if (drvData->detectFlag) { + if (drvData->detectFlag && drvData->magneticCfg != NULL) { MagneticReleaseCfgData(drvData->magneticCfg); } diff --git a/model/sensor/driver/proximity/sensor_proximity_driver.c b/model/sensor/driver/proximity/sensor_proximity_driver.c index 14de57291..9d4e770c3 100644 --- a/model/sensor/driver/proximity/sensor_proximity_driver.c +++ b/model/sensor/driver/proximity/sensor_proximity_driver.c @@ -303,7 +303,7 @@ BASE_CONFIG_EXIT: 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&drvData->proximityCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); (void)memset_s(&drvData->proximityCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); - return NULL; + return drvData->proximityCfg; } void ProximityReleaseCfgData(struct SensorCfgData *proximityCfg) @@ -351,7 +351,7 @@ void ProximityReleaseDriver(struct HdfDeviceObject *device) struct ProximityDrvData *drvData = (struct ProximityDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - if (drvData->detectFlag) { + if (drvData->detectFlag && drvData->proximityCfg != NULL) { ProximityReleaseCfgData(drvData->proximityCfg); } -- Gitee From f2e46679e82e9c77bf0a006ec7b3e239df5987b2 Mon Sep 17 00:00:00 2001 From: s00442234 Date: Thu, 11 Nov 2021 15:00:07 +0800 Subject: [PATCH 155/272] add platform regulator Signed-off-by: s00442234 --- include/platform/regulator_if.h | 357 +++++----- .../include/regulator/regulator_core.h | 197 ++++++ .../include/regulator/regulator_tree_mgr.h | 55 ++ support/platform/include/regulator_core.h | 136 ---- .../platform/src/regulator/regulator_core.c | 626 ++++++++++++++++++ support/platform/src/regulator/regulator_if.c | 184 +++++ .../src/regulator/regulator_tree_mgr.c | 354 ++++++++++ support/platform/src/regulator_core.c | 623 ----------------- support/platform/src/regulator_if.c | 106 --- .../unittest/common/hdf_regulator_test.cpp | 168 +++++ test/unittest/common/hdf_main_test.c | 6 + .../unittest/platform/common/regulator_test.c | 396 +++++++++++ .../unittest/platform/common/regulator_test.h | 62 ++ .../platform/hdf_regulator_entry_test.c | 31 + .../platform/hdf_regulator_entry_test.h | 16 + .../platform/virtual/regulator_virtual.c | 284 ++++++++ 16 files changed, 2529 insertions(+), 1072 deletions(-) create mode 100755 support/platform/include/regulator/regulator_core.h create mode 100755 support/platform/include/regulator/regulator_tree_mgr.h delete mode 100755 support/platform/include/regulator_core.h create mode 100755 support/platform/src/regulator/regulator_core.c create mode 100755 support/platform/src/regulator/regulator_if.c create mode 100755 support/platform/src/regulator/regulator_tree_mgr.c delete mode 100755 support/platform/src/regulator_core.c delete mode 100755 support/platform/src/regulator_if.c create mode 100755 support/platform/test/unittest/common/hdf_regulator_test.cpp create mode 100755 test/unittest/platform/common/regulator_test.c create mode 100755 test/unittest/platform/common/regulator_test.h create mode 100755 test/unittest/platform/hdf_regulator_entry_test.c create mode 100755 test/unittest/platform/hdf_regulator_entry_test.h create mode 100755 test/unittest/platform/virtual/regulator_virtual.c diff --git a/include/platform/regulator_if.h b/include/platform/regulator_if.h index cb2784690..d40091382 100755 --- a/include/platform/regulator_if.h +++ b/include/platform/regulator_if.h @@ -1,207 +1,150 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -/** - * @addtogroup REGULATOR - * @{ - * - * @Brief Provides regulator APIs, such as enabling and setting voltage / current. - * - * The REGULATOR module abstracts the regulator functions of different system platforms and provides stable APIs for drivers. - * You can use this module to create / release the regulator device handle, enable regulator, set voltage, current, disable, etc. - * - * @since 1.0 - */ - -/** - * @file regulator_if.h - * - * @brief Declares standard regulator APIs. - * - * @since 1.0 - */ - -#ifndef REGULATOR_IF_H -#define REGULATOR_IF_H - -#include "hdf_platform.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -/** - * @brief Enumerates regulator disableMode. - * - * To disable the mode using the regulator, call the {@ link RegulatorDisable} function. - * - * @since 1.0 - */ - -enum RegulatorDisableMode { - NORMAL_DISABLE, - DEFERRED_DISABLE, - FORCE_DISABLE, - MAX_DISABLE_MODE, -}; - -/** - * @brief Gets a regulator. - * - * This function must be called to get its device handle before operating the regulator. - * - * @param name Indicates regulator name. - * - * @return If the operation is successful, a pointer to the regulator device handle is returned. - * - * @since 1.0 - */ -DevHandle RegulatorGet(const char *name); - -/** - * @brief Releases a regulator. - * - * If you no longer need the regulator, call this function to turn it off and release its device handle to prevent. - * Use memory resources unnecessarily. - * - * @param handle Represents a pointer to the regulator device handle. - * - * @since 1.0 - */ -void RegulatorPut(DevHandle handle); - -/** - * @brief Enables a regulator. - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @return 0 If the regulator enables successfully; Otherwise, a negative value is returned. - * - * @attention That if the regulator has been enabled before calling this function, calling this function will succeed. - * - * @since 1.0 - */ -int32_t RegulatorEnable(DevHandle handle); - -/** - * @brief Disable a regulator. - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param disableMode There are three disabled modes. - * @return 0 If the regulator disable successfully; Otherwise, a negative value is returned. - * - * @attention If the regulator device AlwaysOn is true, disabling may fail, depending on the specific mode. - * - * @since 1.0 - */ -int32_t RegulatorDisable(DevHandle handle,int32_t disableMode); - -/** - * @brief Determine whether a regulator is enabled. - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @return 0 If the regulator isEnabled successfully; Otherwise, a negative value is returned. - * - * @since 1.0 - */ -int32_t RegulatorIsEnabled(DevHandle handle); - -/** - * @brief Set the voltage value of a regulator. - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @return 0 If the regulator setVoltage successfully; Otherwise, a negative value is returned. - * - * @attention If the set voltage is not within the range, the setting fails. - * - * @since 1.0 - */ -int32_t RegulatorSetVoltage(DevHandle handle, int32_t voltage); - -/** - * @brief Get a regulator voltage. - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param voltage Voltage obtained. - * @return 0 If the regulator get voltage successfully; Otherwise, a negative value is returned. - * - * @since 1.0 - */ -int32_t RegulatorGetVoltage(DevHandle handle, int32_t *voltage); - -/** - * @brief Set regulator voltage range - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param vmin Minimum value of regulator voltage - * @param vmax Maximum regulator voltage - * @return 0 If the regulator set voltage range successfully; Otherwise, a negative value is returned. - * - * @attention If the setting range exceeds the limit, the setting fails - * - * @since 1.0 - */ -int32_t RegulatorSetVoltageRange(DevHandle handle, int32_t vmin, int32_t vmax); - -/** - * @brief Set the current value of a regulator - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @return 0 If the regulator setCurrent successfully; Otherwise, a negative value is returned. - * - * @attention If the set current is not within the range, the setting fails - * - * @since 1.0 - */ -int32_t RegulatorSetCurrent(DevHandle handle, int32_t current); - -/** - * @brief Get a regulator current - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param voltage Current obtained - * @return 0 If the regulator getCurrent successfully; Otherwise, a negative value is returned. - * - * @since 1.0 - */ -int32_t RegulatorGetCurrent(DevHandle handle, int32_t *current); - -/** - * @brief Set regulator current range - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param cmin Minimum value of regulator current - * @param cmax Maximum regulator current - * @return 0 If the regulator set current range successfully; Otherwise, a negative value is returned. - * - * @attention If the setting range exceeds the limit, the setting fails - * - * @since 1.0 - */ -int32_t RegulatorSetCurrentRange(DevHandle handle, int32_t cmin, int32_t cmax); - -/** - * @brief Get a regulator status - * - * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorGet}. - * @param status Status obtained - * @return 0 If the regulator get status successfully; Otherwise, a negative value is returned. - * - * @since 1.0 - */ -int32_t RegulatorGetStatus(DevHandle handle, int32_t *status); - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* REGULATOR_IF_H */ -/** @} */ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + + +#ifndef REGULATOR_IF_H +#define REGULATOR_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/* regulator status on or off */ +enum RegulatorStatus { + REGULATOR_STATUS_ON = 1, + REGULATOR_STATUS_OFF, +}; + +/* regulator mode, set voltage or current */ +enum RegulatorChangeMode { + REGULATOR_CHANGE_VOLTAGE = 1, + REGULATOR_CHANGE_CURRENT, +}; +/** + * @brief Gets a regulator. + * + * This function must be called to get its device handle before operating the regulator. + * + * @param name Indicates regulator name. + * + * @return If the operation is successful, a pointer to the regulator device handle is returned. + * + * @since 1.0 + */ +DevHandle RegulatorOpen(const char *name); +/** + * @brief Releases a regulator. + * + * If you no longer need the regulator, call this function to release it + * + * @param handle Represents a pointer to the regulator device handle. + * + * @since 1.0 + */ +void RegulatorClose(DevHandle handle); +/** + * @brief Enables a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @return 0 If the regulator enables successfully; Otherwise, a negative value is returned. + * + * @attention That if the regulator has been enabled before calling this function, calling this function will succeed. + * + * @since 1.0 + */ +int32_t RegulatorEnable(DevHandle handle); +/** + * @brief Disable a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @return 0 If the regulator disable successfully; Otherwise, a negative value is returned. + * + * @attention If the regulator status alwayson is true or there is regulator child not disable, disabling fail + * + * @since 1.0 + */ +int32_t RegulatorDisable(DevHandle handle); +/** + * @brief Force disable a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @return 0 If the regulator disable successfully; Otherwise, a negative value is returned. + * + * @attention No matter whether the status of the regulator is alwayson or the status of the child is enable, the regulator is disabled. + * + * @since 1.0 + */ +int32_t RegulatorForceDisable(DevHandle handle); +/** + * @brief Set the output voltage range of a regulator. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @param minUv Represents minimum voltage + * @param minUv Represents maximum voltage + * @return 0 If the regulator setVoltage successfully; Otherwise, a negative value is returned. + * + * @attention If the set voltage is not within the contrants, the setting fails. + * + * @since 1.0 + */ +int32_t RegulatorSetVoltage(DevHandle handle, uint32_t minUv, uint32_t maxUv); +/** + * @brief Get a regulator voltage. + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @param voltage Voltage obtained. + * @return 0 If the regulator get voltage successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetVoltage(DevHandle handle, uint32_t *voltage); +/** + * @brief Set regulator current range + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @param minUa Minimum current + * @param maxUa Maximum current + * @return 0 If the regulator set current range successfully; Otherwise, a negative value is returned. + * + * @attention If the setting range exceeds the limit, the setting fails + * + * @since 1.0 + */ +int32_t RegulatorSetCurrent(DevHandle handle, uint32_t minUa, uint32_t maxUa); +/** + * @brief Get a regulator current + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @param voltage Current obtained + * @return 0 If the regulator getCurrent successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetCurrent(DevHandle handle, uint32_t *current); +/** + * @brief Get a regulator status + * + * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. + * @param status Status obtained, enable or disable + * @return 0 If the regulator get status successfully; Otherwise, a negative value is returned. + * + * @since 1.0 + */ +int32_t RegulatorGetStatus(DevHandle handle, uint32_t *status); +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* REGULATOR_IF_H */ +/** @} */ \ No newline at end of file diff --git a/support/platform/include/regulator/regulator_core.h b/support/platform/include/regulator/regulator_core.h new file mode 100755 index 000000000..8c9a0e550 --- /dev/null +++ b/support/platform/include/regulator/regulator_core.h @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef REGULATOR_CORE_H +#define REGULATOR_CORE_H + +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_mutex.h" +#include "regulator_if.h" + + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +//#define REGULATOR_PRINTK_OPEN 1 +#ifdef REGULATOR_PRINTK_OPEN +#define REGULATOR_PRINT_LOG_DBG(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_PRINT_LOG_INF(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_PRINT_LOG_ERR(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#else +#define REGULATOR_PRINT_LOG_DBG(fmt, arg...) HDF_LOGD_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#define REGULATOR_PRINT_LOG_INF(fmt, arg...) HDF_LOGI_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#define REGULATOR_PRINT_LOG_ERR(fmt, arg...) HDF_LOGE_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#endif + +#define CHECK_NULL_PTR_RETURN_VALUE(ptr, ret) do { \ + if ((ptr) == NULL) { \ + REGULATOR_PRINT_LOG_ERR("%s:line %d pointer is null and return ret", __func__, __LINE__); \ + return (ret); \ + } \ +} while (0) + +#define CHECK_NULL_PTR_RETURN(ptr) do { \ + if ((ptr) == NULL) { \ + REGULATOR_PRINT_LOG_ERR("%s:line %d pointer is null and return", __func__, __LINE__); \ + return; \ + } \ +} while (0) + +#define CHECK_PARSER_RESULT_RETURN_VALUE(ret, str) do { \ + if (ret != HDF_SUCCESS) { \ + REGULATOR_PRINT_LOG_ERR("%s:line %d %s fail, ret = %d!", __func__, __LINE__, str, ret); \ + return HDF_FAILURE; \ + } \ +} while (0) + +struct RegulatorStatusChangeInfo { + const char *name; + uint32_t status; +}; +/** + * @brief Defines a callback that will be invoked when a regulator's status change. + * + */ +typedef int32_t (*RegulatorStatusChangecb)(struct RegulatorStatusChangeInfo *); + +struct RegulatorConstraints { + uint8_t alwaysOn; /* the regulator is alwaysOn */ + uint8_t mode; /* mode: voltage or current */ + uint32_t minUv; /* min voltage that can be set by the regulator */ + uint32_t maxUv; /* max voltage that can be set by the regulator */ + uint32_t minUa; /* min current that can be set by the regulator */ + uint32_t maxUa; /* max current that can be set by the regulator */ +}; + +struct RegulatorDesc { + const char *name; /* regulator name */ + const char *parentName; /* regulator parent name */ + struct RegulatorConstraints constraints; /* the regulator constraint info */ + uint32_t minUv; /* min voltage */ + uint32_t maxUv; /* min voltage */ + uint32_t minUa; /* min current */ + uint32_t maxUa; /* max current */ + uint32_t status; /* the regulator's status, on or off */ + int useCount; + int consumerRegNums; /* the regulator's consumer nums */ + RegulatorStatusChangecb cb; /* when regulator status change, can notify by call cb */ +}; + +struct RegulatorNode { + struct RegulatorDesc regulatorInfo; + struct DListHead node; + struct RegulatorMethod *ops; + void *priv; + struct OsalMutex lock; +}; + +struct RegulatorMethod { + int32_t (*enable)(struct RegulatorNode *node); + int32_t (*disable)(struct RegulatorNode *node); + int32_t (*setVoltage)(struct RegulatorNode *node, uint32_t minUv, uint32_t maxUv); + int32_t (*getVoltage)(struct RegulatorNode *node, uint32_t *voltage); + int32_t (*setCurrent)(struct RegulatorNode *node, uint32_t minUa, uint32_t maxUa); + int32_t (*getCurrent)(struct RegulatorNode *node, uint32_t *current); + int32_t (*getStatus)(struct RegulatorNode *node, uint32_t *status); +}; + +/** + * @brief Find and return a regulator controller by regulator info + * @param info Indicates regulator info. + * @return a regulator controller + */ +struct RegulatorNode *RegulatorNodeOpen(const char *name); +int32_t RegulatorNodeClose(struct RegulatorNode *node); +/** + * @brief add a regulator controller to manager list + * @param node Indicates a regulator controller. + * @constraints: first add parent, then add child + * @return success or fail + */ +int32_t RegulatorNodeAdd(struct RegulatorNode *node); +/** + * @brief remove all regulator controllers + * @param + * @return success or fail + */ +int32_t RegulatorNodeRemoveAll(void); +/** + * @brief enable a regulator + * @param node Indicates a regulator controller. + * @return success or fail + */ +int32_t RegulatorNodeEnable(struct RegulatorNode *node); +/** + * @brief disable a regulator if it's downstream node all close, if alwayson is true,forbid disable + * @param node Indicates a regulator controller. + * @return success or fail + */ +int32_t RegulatorNodeDisable(struct RegulatorNode *node); +/** + * @brief disable a regulator regardless of whether there is an downstream node + * @param node Indicates a regulator controller. + * @return success or fail + */ +int32_t RegulatorNodeForceDisable(struct RegulatorNode *node); +/** + * @brief set regulator voltage + * @param node Indicates a regulator controller. + * @param minUv min voltage + * @param maxUv max voltage + * @return success or fail + */ +int32_t RegulatorNodeSetVoltage(struct RegulatorNode *node, uint32_t minUv, uint32_t maxUv); +/** + * @brief get regulator voltage + * @param node Indicates a regulator controller. + * @param voltage regulator voltage + * @return success or fail + */ +int32_t RegulatorNodeGetVoltage(struct RegulatorNode *node, uint32_t *voltage); +/** + * @brief set regulator current + * @param node Indicates a regulator controller. + * @param minUa min current + * @param maxUa max current + * @return success or fail + */ +int32_t RegulatorNodeSetCurrent(struct RegulatorNode *node, uint32_t minUA, uint32_t maxUA); +/** + * @brief get regulator current + * @param node Indicates a regulator controller. + * @param current regulator current + * @return success or fail + */ +int32_t RegulatorNodeGetCurrent(struct RegulatorNode *node, uint32_t *current); +/** + * @brief get regulator status + * @param node Indicates a regulator controller. + * @param status regulator status,enable or disable + * @return success or fail + */ +int32_t RegulatorNodeGetStatus(struct RegulatorNode *node, uint32_t *status); +/** + * @brief register regulator's callback when it's status change + * @param node Indicates a regulator controller. + * @param cb callback function + * @return success or fail + */ +int32_t RegulatorNodeRegisterStatusChangeCb(struct RegulatorNode *node, RegulatorStatusChangecb cb); +int32_t RegulatorNodeStatusCb(struct RegulatorNode *node); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* REGULATOR_CORE_H */ diff --git a/support/platform/include/regulator/regulator_tree_mgr.h b/support/platform/include/regulator/regulator_tree_mgr.h new file mode 100755 index 000000000..5d71483a3 --- /dev/null +++ b/support/platform/include/regulator/regulator_tree_mgr.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef REGULATOR_TREE_MGR_H +#define REGULATOR_TREE_MGR_H + +#include "regulator_core.h" +#include "hdf_log.h" +#include "hdf_base.h" +#include "osal_mutex.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +struct RegulatorChildNode { + struct RegulatorNode * child; + struct DListHead node; +}; + +struct RegulatorTreeInfo { + const char *name; /* regulator name */ + struct RegulatorNode * parent; /* regulator parent info */ + struct DListHead node; + struct DListHead childHead; /* child regulator list */ +}; + +struct RegulatorTreeManager { + struct DListHead treeMgrHead; + struct OsalMutex lock; +}; + +int RegulatorTreeManagerInit(void); +int RegulatorTreeManagerDestory(void); +int RegulatorTreeNodeRemoveAll(void); +int RegulatorTreeSet(const char *name, struct RegulatorNode *child, struct RegulatorNode *parent); +void RegulatorTreePrint(void); +struct RegulatorNode * RegulatorTreeGetParent(const char *name); +int32_t RegulatorTreeChildForceDisable(struct RegulatorNode *node); +bool RegulatorTreeIsAllChildDisable(const char *name); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* REGULATOR_TREE_MGR_H */ diff --git a/support/platform/include/regulator_core.h b/support/platform/include/regulator_core.h deleted file mode 100755 index 1542b442a..000000000 --- a/support/platform/include/regulator_core.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef REGULATOR_CORE_H -#define REGULATOR_CORE_H - -#include "hdf_base.h" -#include "hdf_device_desc.h" -#include "osal_mutex.h" -#include "osal_spinlock.h" - - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif -#endif /* __cplusplus */ - -#define REGULATOR_NUM_MAX 50 -#define REGULATOR_MOUNT_QUANTITY_MAX 10 -#define REGULATOR_NAME_LEN 128 -#define REGULATOR_SLEEP_TIME 500 - -struct RegulatorCntlr; -struct RegulatorMethod; - -enum RegulatorStatus { - REGULATOR_STATUS_ON, - REGULATOR_STATUS_OFF, -}; - -struct RegulatorDesc { - const char *name; - const char *supplyName; - uint32_t minOutPutUv; - uint32_t maxOutPutUv; - uint32_t minOutPutUa; - uint32_t maxOutPutUa; - uint32_t outPutUv; - uint32_t outPutUa; - uint32_t inPutUv; - uint32_t inPutUa; - uint32_t enabledCount; - uint32_t status; -}; - -struct RegulatorConstraint { - bool alwaysOn; - uint32_t maxMountQuantity; - uint32_t minOutPutUv; - uint32_t maxOutPutUv; - uint32_t minOutPutUa; - uint32_t maxOutPutUa; -}; - -struct RegulatorInitdata { - uint32_t initInPutUv; - uint32_t initInPutUa; - uint32_t initOutPutUv; - uint32_t initOutPutUa; -}; - -struct RegulatorTree { - struct RegulatorTree *supply; - struct RegulatorDesc desc; - struct RegulatorConstraint constraint; - struct RegulatorInitdata initData; - struct RegulatorTree *consumer[REGULATOR_MOUNT_QUANTITY_MAX]; -}; - -struct RegulatorCntlr { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - struct RegulatorMethod *ops; - OsalSpinlock spinLock; - struct OsalMutex mutexLock; - struct RegulatorTree *tree; - struct RegulatorTree *rootTree; - void *priv; -}; - -struct RegulatorMethod { - void (*getPriv)(struct RegulatorCntlr *cntlr); - void (*releasePriv)(struct RegulatorCntlr *cntlr); - int32_t (*enable)(struct RegulatorCntlr *cntlr); - int32_t (*disable)(struct RegulatorCntlr *cntlr); - int32_t (*isEnabled)(struct RegulatorCntlr *cntlr); - int32_t (*setVoltage)(struct RegulatorCntlr *cntlr, int32_t voltage); - int32_t (*getVoltage)(struct RegulatorCntlr *cntlr, int32_t *voltage); - int32_t (*setVoltageRange)(struct RegulatorCntlr *cntlr, int32_t vmin, int32_t vmax); - int32_t (*setCurrent)(struct RegulatorCntlr *cntlr, int32_t current); - int32_t (*getCurrent)(struct RegulatorCntlr *cntlr, int32_t *current); - int32_t (*setCurrentRange)(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax); - int32_t (*getStatus)(struct RegulatorCntlr *cntlr, int32_t *status); -}; - -int32_t RegulatorCntlrAdd(struct RegulatorCntlr *cntlr); - -void RegulatorCntlrRemove(struct RegulatorCntlr *cntlr); - -static inline struct RegulatorCntlr *RegulatorCntlrFromDevice(struct HdfDeviceObject *device) -{ - return (device == NULL) ? NULL : (struct RegulatorCntlr *)device->service; -} - -static inline struct HdfDeviceObject *RegulatorCntlrToDevice(struct RegulatorCntlr *cntlr) -{ - return (cntlr == NULL) ? NULL : cntlr->device; -} - -void *RegulatorCntlrGet(const char *name); -void RegulatorGetPrivData(struct RegulatorCntlr *cntlr); -void RegulatorReleasePriv(struct RegulatorCntlr *cntlr); -int32_t RegulatorCntlrEnable(struct RegulatorCntlr *cntlr); -int32_t RegulatorCntlrDisable(struct RegulatorCntlr *cntlr, int32_t disableMode); -int32_t RegulatorCntlrIsEnabled(struct RegulatorCntlr *cntlr); -int32_t RegulatorCntlrSetVoltage(struct RegulatorCntlr *cntlr, int32_t voltage); -int32_t RegulatorCntlrGetVoltage(struct RegulatorCntlr *cntlr, int32_t *voltage); -int32_t RegulatorCntlrSetVoltageRange(struct RegulatorCntlr *cntlr, int32_t vmax, int32_t vmin); -int32_t RegulatorCntlrSetCurrent(struct RegulatorCntlr *cntlr, int32_t current); -int32_t RegulatorCntlrGetCurrent(struct RegulatorCntlr *cntlr, int32_t *current); -int32_t RegulatorCntlrSetCurrentRange(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax); -int32_t RegulatorCntlrGetStatus(struct RegulatorCntlr *cntlr, int32_t *status); - -#ifdef __cplusplus -#if __cplusplus -} -#endif -#endif /* __cplusplus */ - -#endif /* REGULATOR_CORE_H */ diff --git a/support/platform/src/regulator/regulator_core.c b/support/platform/src/regulator/regulator_core.c new file mode 100755 index 000000000..14493ad33 --- /dev/null +++ b/support/platform/src/regulator/regulator_core.c @@ -0,0 +1,626 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "regulator_core.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "securec.h" +#include "regulator_tree_mgr.h" + +#define HDF_LOG_TAG regulator_core + +struct RegulatorManager { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct DListHead regulatorHead; + struct OsalMutex lock; +}; + +static struct RegulatorManager *g_regulatorManager = NULL; + +struct RegulatorNode *RegulatorNodeOpen(const char *name) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, NULL); + struct RegulatorNode *pos = NULL; + + struct RegulatorManager *manager = g_regulatorManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, NULL); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeOpen: lock regulator manager fail!"); + return NULL; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + if(strcmp(name, pos->regulatorInfo.name) == 0) { + HDF_LOGD("RegulatorNodeOpen:[%s] SUCCESS", name); + (void)OsalMutexUnlock(&manager->lock); + return pos; + } + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGE("RegulatorNodeOpen: No %s regulator exist", name); + return NULL; +} + +int32_t RegulatorNodeClose(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_OBJECT); + return HDF_SUCCESS; +} + +void RegulatorNodeListPrint(void) +{ + struct RegulatorNode *pos = NULL; + + struct RegulatorManager *manager = g_regulatorManager; + CHECK_NULL_PTR_RETURN(manager); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeListPrint: lock regulator manager fail!"); + return; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + HDF_LOGI("RegulatorNodeListPrint: name[%s], [%d][%d][%d], [%d][%d]--[%d][%d]", + pos->regulatorInfo.name, pos->regulatorInfo.status, + pos->regulatorInfo.constraints.alwaysOn, pos->regulatorInfo.constraints.mode, + pos->regulatorInfo.minUv, pos->regulatorInfo.maxUv, + pos->regulatorInfo.minUa, pos->regulatorInfo.maxUa); + if (pos->regulatorInfo.parentName != NULL) { + HDF_LOGI("RegulatorNodeListPrint:parentName[%s]", pos->regulatorInfo.parentName); + } + } + + (void)OsalMutexUnlock(&manager->lock); + RegulatorTreePrint(); +} + +int32_t RegulatorNodeSetParent(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + struct RegulatorNode *pos = NULL; + struct RegulatorManager *manager = g_regulatorManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeSetParent: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + // parent set + if ((node->regulatorInfo.parentName != NULL) + && (strlen(node->regulatorInfo.parentName) > 0)) { + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + if (strcmp(node->regulatorInfo.parentName, pos->regulatorInfo.name) == 0) { + if (RegulatorTreeSet(node->regulatorInfo.name, node, pos) != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorTreeSet failed", __func__); + (void)OsalMutexUnlock(&manager->lock); + return HDF_FAILURE; + } else { + HDF_LOGI("%s:regulator [%s] RegulatorTreeSet success", __func__, node->regulatorInfo.name); + (void)OsalMutexUnlock(&manager->lock); + return HDF_SUCCESS; + } + } + } + + HDF_LOGE("%s: RegulatorTreeSet find %s parent %s error", + __func__, node->regulatorInfo.name, node->regulatorInfo.parentName); + (void)OsalMutexUnlock(&manager->lock); + return HDF_FAILURE; + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGE("%s: the node %s no need to set parent", __func__, node->regulatorInfo.name); + return HDF_SUCCESS; +} +/********************************** +*1. complete up and down management topology +*2. process alwayson +***********************************/ +int32_t RegulatorNodeInitProcess(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + + // parent or child set + if (RegulatorNodeSetParent(node) != HDF_SUCCESS) { + HDF_LOGE("%s: node %s RegulatorNodeSetParent fail", __func__, node->regulatorInfo.name); + return HDF_FAILURE; + } + + // if alwaysOn is true, process + if (node->regulatorInfo.constraints.alwaysOn) { + if (node->regulatorInfo.constraints.mode == REGULATOR_CHANGE_CURRENT) { + RegulatorNodeSetCurrent(node, node->regulatorInfo.constraints.minUa, node->regulatorInfo.constraints.maxUa); + } else if(node->regulatorInfo.constraints.mode == REGULATOR_CHANGE_VOLTAGE) { + RegulatorNodeSetVoltage(node, node->regulatorInfo.constraints.minUv, node->regulatorInfo.constraints.maxUv); + } + RegulatorNodeEnable(node); + } + + HDF_LOGD("%s: the node %s init success", __func__, node->regulatorInfo.name); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeAdd(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + struct RegulatorNode *pos = NULL; + struct RegulatorManager *manager = g_regulatorManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + if (strcmp(node->regulatorInfo.name, pos->regulatorInfo.name) == 0) { + HDF_LOGE("%s: regulatorInfo[%s] existed", __func__, node->regulatorInfo.name); + return HDF_FAILURE; + } + } + + // init node info + node->regulatorInfo.cb = NULL; + node->regulatorInfo.useCount = 0; + node->regulatorInfo.status = REGULATOR_STATUS_OFF; + node->regulatorInfo.useCount = 0; + if (OsalMutexInit(&node->lock) != HDF_SUCCESS) { + HDF_LOGE("%s: OsalMutexInit %s failed", __func__, node->regulatorInfo.name); + return HDF_FAILURE; + } + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorManagerAddNode: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + DListInsertTail(&node->node, &manager->regulatorHead); + (void)OsalMutexUnlock(&manager->lock); + + if (RegulatorNodeInitProcess(node) != HDF_SUCCESS) { + HDF_LOGE("%s: node %s RegulatorNodeInitProcess fail", __func__, node->regulatorInfo.name); + return HDF_FAILURE; + } + + HDF_LOGI("%s: add regulator name[%s] success", __func__, node->regulatorInfo.name); + RegulatorNodeListPrint(); + return HDF_SUCCESS; +} +int32_t RegulatorNodeRemoveAll(void) +{ + if (RegulatorTreeNodeRemoveAll() != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeRemoveAll: RegulatorTreeNodeRemoveAll failed"); + return HDF_FAILURE; + } + + struct RegulatorNode *pos = NULL; + struct RegulatorManager *manager = g_regulatorManager; + if (manager == NULL) { + HDF_LOGE("RegulatorNodeRemoveAll: regulator manager null!"); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeRemoveAll: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + DListRemove(&pos->node); + (void)OsalMutexDestroy(&pos->lock); + OsalMemFree(pos); + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("%s: remove all regulator success", __func__); + return HDF_SUCCESS; +} +int32_t RegulatorNodeStatusCb(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(node->regulatorInfo.cb, HDF_SUCCESS); + struct RegulatorStatusChangeInfo info; + memset_s(&info, sizeof(struct RegulatorStatusChangeInfo), 0, sizeof(struct RegulatorStatusChangeInfo)); + + info.status = node->regulatorInfo.status; + info.name = node->regulatorInfo.name; + HDF_LOGI("%s: Cb %s %d", __func__, info.name, info.status); + + return node->regulatorInfo.cb(&info); +} +int32_t RegulatorNodeEnable(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + if (node->regulatorInfo.status == REGULATOR_STATUS_ON) { + HDF_LOGD("RegulatorNodeEnable: %s status on", node->regulatorInfo.name); + return HDF_SUCCESS; + } + + if (OsalMutexLock(&node->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeEnable: lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + + if((node->regulatorInfo.parentName != NULL) && (strlen(node->regulatorInfo.parentName) > 0)) { + struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if (parent == NULL) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeEnable: %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + if (RegulatorNodeEnable(parent) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeEnable: %s failed", parent->regulatorInfo.name); + return HDF_FAILURE; + } + } + + // first enable + if (node->ops->enable(node) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("enable: %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + node->regulatorInfo.status = REGULATOR_STATUS_ON; + RegulatorNodeStatusCb(node); + + (void)OsalMutexUnlock(&node->lock); + HDF_LOGD("RegulatorNodeEnable: %s success", node->regulatorInfo.name); + return HDF_SUCCESS; +} + +static int32_t RegulatorNodeDisable(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + if ((node->regulatorInfo.status == REGULATOR_STATUS_OFF) || (node->regulatorInfo.constraints.alwaysOn)) { + HDF_LOGI("RegulatorNodeDisable: %s [%d][%d], unsatisfied closing adjusment", + node->regulatorInfo.name, node->regulatorInfo.status, node->regulatorInfo.constraints.alwaysOn); + return HDF_SUCCESS; + } + + if (OsalMutexLock(&node->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeDisable: lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + + if(!RegulatorTreeIsAllChildDisable(node->regulatorInfo.name)){ + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeDisable:there is %s child not disable ", node->regulatorInfo.name); + return HDF_FAILURE; + } + + // the regulator no user, can disable + if (node->ops->disable(node) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeDisable:disable %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + node->regulatorInfo.status = REGULATOR_STATUS_OFF; + RegulatorNodeStatusCb(node); + HDF_LOGD("RegulatorNodeDisable:disable %s success", node->regulatorInfo.name); + + // set parent + if(strlen(node->regulatorInfo.parentName) != 0) { + struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if (parent == NULL) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeDisable: %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + if (RegulatorNodeDisable(parent) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeDisable: %s failed", parent->regulatorInfo.name); + return HDF_FAILURE; + } + } + + (void)OsalMutexUnlock(&node->lock); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeForceDisable(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + if (OsalMutexLock(&node->lock) != HDF_SUCCESS) { + HDF_LOGE(": lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + + if (node->regulatorInfo.status == REGULATOR_STATUS_OFF) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGI(": %s useCount[%d] has been closed", + node->regulatorInfo.name, node->regulatorInfo.useCount); + return HDF_SUCCESS; + } + + // if the regulator force disable ,set all child node disable + if (RegulatorTreeChildForceDisable(node)) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorTreeConsumerForceDisable: %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + + if (node->ops->disable(node) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeDisable:disable %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + node->regulatorInfo.status = REGULATOR_STATUS_OFF; + RegulatorNodeStatusCb(node); + HDF_LOGD(":regulator %s force disable success", node->regulatorInfo.name); + + // set parent + if(strlen(node->regulatorInfo.parentName) != 0) { + struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if (parent == NULL) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE(": %s failed", node->regulatorInfo.name); + return HDF_FAILURE; + } + if (RegulatorNodeDisable(parent) != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE(": %s failed", parent->regulatorInfo.name); + return HDF_FAILURE; + } + } + + (void)OsalMutexUnlock(&node->lock); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeSetVoltage(struct RegulatorNode *node, uint32_t minUv, uint32_t maxUv) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + if (node->regulatorInfo.constraints.mode != REGULATOR_CHANGE_VOLTAGE) { + HDF_LOGE("RegulatorNodeSetVoltage: %s mode %d invalid!", + node->regulatorInfo.name, node->regulatorInfo.constraints.mode); + return HDF_FAILURE; + } + + if (minUv == node->regulatorInfo.minUv && maxUv == node->regulatorInfo.maxUv) { + HDF_LOGD("RegulatorNodeSetVoltage: %s voltage", node->regulatorInfo.name); + return HDF_SUCCESS; + } + + if ((minUv > maxUv) || + (minUv < node->regulatorInfo.constraints.minUv || + maxUv > node->regulatorInfo.constraints.maxUv)) { + HDF_LOGE("RegulatorNodeSetVoltage: %s Uv [%d, %d] invalid!", + node->regulatorInfo.name, minUv, maxUv); + return HDF_FAILURE; + } + + if (OsalMutexLock(&node->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeSetVoltage: lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + + int ret = node->ops->setVoltage(node, minUv, maxUv); + if (ret != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeSetVoltage: setVoltage %s fail!", node->regulatorInfo.name); + return HDF_FAILURE; + } + + node->regulatorInfo.minUv = minUv; + node->regulatorInfo.maxUv = maxUv; + (void)OsalMutexUnlock(&node->lock); + + HDF_LOGD("RegulatorNodeSetVoltage: %s voltage[%d, %d] success", + node->regulatorInfo.name, minUv, maxUv); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeGetVoltage(struct RegulatorNode *node, uint32_t *voltage) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(voltage, HDF_ERR_INVALID_PARAM); + + if (node->regulatorInfo.constraints.mode != REGULATOR_CHANGE_VOLTAGE) { + HDF_LOGE("RegulatorNodeSetVoltage: %s mode %d invalid!", + node->regulatorInfo.name, node->regulatorInfo.constraints.mode); + return HDF_FAILURE; + } + + int ret = node->ops->getVoltage(node, voltage); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeGetVoltage: getVoltage %s fail!", node->regulatorInfo.name); + return HDF_FAILURE; + } + + HDF_LOGD("RegulatorNodeGetVoltage: %s voltage[%d] success", + node->regulatorInfo.name, *voltage); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeSetCurrent(struct RegulatorNode *node, uint32_t minUA, uint32_t maxUA) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + if (node->regulatorInfo.constraints.mode != REGULATOR_CHANGE_CURRENT) { + HDF_LOGE("RegulatorNodeSetVoltage: %s mode %d invalid!", + node->regulatorInfo.name, node->regulatorInfo.constraints.mode); + return HDF_FAILURE; + } + + if (minUA == node->regulatorInfo.minUa && maxUA == node->regulatorInfo.maxUa) { + HDF_LOGD("RegulatorNodeSetCurrent: %s [%d, %d] [%d, %d]", node->regulatorInfo.name, + minUA, maxUA, node->regulatorInfo.minUa, node->regulatorInfo.maxUa); + return HDF_SUCCESS; + } + + if ((minUA > maxUA) || + (minUA < node->regulatorInfo.constraints.minUa || + maxUA > node->regulatorInfo.constraints.maxUa)) { + HDF_LOGE("RegulatorNodeSetCurrent: %s UA [%d, %d] invalid!", + node->regulatorInfo.name, minUA, maxUA); + return HDF_FAILURE; + } + + if (OsalMutexLock(&node->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeSetCurrent: lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + + int ret = node->ops->setCurrent(node, minUA, maxUA); + if (ret != HDF_SUCCESS) { + (void)OsalMutexUnlock(&node->lock); + HDF_LOGE("RegulatorNodeSetCurrent: setCurrent %s fail!", node->regulatorInfo.name); + return HDF_FAILURE; + } + + node->regulatorInfo.minUa = minUA; + node->regulatorInfo.maxUa = maxUA; + (void)OsalMutexUnlock(&node->lock); + + HDF_LOGD("RegulatorNodeSetCurrent: %s UA[%d, %d] SUCCESS", + node->regulatorInfo.name, minUA, maxUA); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeGetCurrent(struct RegulatorNode *node, uint32_t *current) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_OBJECT); + CHECK_NULL_PTR_RETURN_VALUE(current, HDF_ERR_INVALID_OBJECT); + if (node->regulatorInfo.constraints.mode != REGULATOR_CHANGE_CURRENT) { + HDF_LOGE("RegulatorNodeSetVoltage: %s mode %d invalid!", + node->regulatorInfo.name, node->regulatorInfo.constraints.mode); + return HDF_FAILURE; + } + + int ret = node->ops->getCurrent(node, current); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeGetVoltage: getCurrent %s fail!", node->regulatorInfo.name); + return HDF_FAILURE; + } + + HDF_LOGD("RegulatorNodeGetVoltage: %s current[%d] success", + node->regulatorInfo.name, *current); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeGetStatus(struct RegulatorNode *node, uint32_t *status) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_OBJECT); + CHECK_NULL_PTR_RETURN_VALUE(status, HDF_ERR_INVALID_OBJECT); + if (node->ops->getStatus(node, status) != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeGetStatus: getStatus %s fail!", node->regulatorInfo.name); + return HDF_FAILURE; + } + + HDF_LOGD("RegulatorNodeGetStatus: %s status[%d] success", + node->regulatorInfo.name, *status); + return HDF_SUCCESS; +} + +int32_t RegulatorNodeRegisterStatusChangeCb(struct RegulatorNode *node, RegulatorStatusChangecb cb) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_OBJECT); + CHECK_NULL_PTR_RETURN_VALUE(cb, HDF_ERR_INVALID_OBJECT); + node->regulatorInfo.cb = cb; + return HDF_SUCCESS; +} + +int32_t RegulatorTreeInfoInit(struct RegulatorNode *node) +{ + struct RegulatorNode *pos = NULL; + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_OBJECT); + struct RegulatorManager *manager = g_regulatorManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_ERR_INVALID_OBJECT); + + if ((node->regulatorInfo.parentName != NULL) + && (strlen(node->regulatorInfo.parentName) > 0)) { + DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { + if (strcmp(node->regulatorInfo.parentName, pos->regulatorInfo.name) == 0) { + if (RegulatorTreeSet(node->regulatorInfo.name, node, pos) != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorTreeSet failed", __func__); + return HDF_FAILURE; + } else { + HDF_LOGI("%s:regulator [%s] RegulatorTreeSet success", __func__, node->regulatorInfo.name); + return HDF_SUCCESS; + } + } + } + + HDF_LOGE("%s: RegulatorTreeSet find %s parent %s error", + __func__, node->regulatorInfo.name, node->regulatorInfo.parentName); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t RegulatorManagerBind(struct HdfDeviceObject *device) +{ + int32_t ret; + struct RegulatorManager *manager = NULL; + + HDF_LOGI("RegulatorManagerBind: Enter!"); + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_OBJECT); + + manager = (struct RegulatorManager *)OsalMemCalloc(sizeof(*manager)); + if (manager == NULL) { + HDF_LOGE("RegulatorManagerBind: malloc manager fail!"); + return HDF_ERR_MALLOC_FAIL; + } + + ret = OsalMutexInit(&manager->lock); + if (ret != HDF_SUCCESS) { + HDF_LOGE("RegulatorManagerBind: mutex init fail:%d", ret); + OsalMemFree(manager); + return HDF_FAILURE; + } + + manager->device = device; + device->service = &manager->service; + DListHeadInit(&manager->regulatorHead); + g_regulatorManager = manager; + + if (RegulatorTreeManagerInit() != HDF_SUCCESS) { + HDF_LOGE("RegulatorManagerBind: RegulatorTreeManagerInit init fail"); + OsalMemFree(manager); + return HDF_FAILURE; + } + HDF_LOGI("RegulatorManagerBind: success!"); + return HDF_SUCCESS; +} + +static int32_t RegulatorManagerInit(struct HdfDeviceObject *device) +{ + (void)device; + + HDF_LOGI("RegulatorManagerInit: success!"); + return HDF_SUCCESS; +} + +static void RegulatorManagerRelease(struct HdfDeviceObject *device) +{ + HDF_LOGI("RegulatorManagerRelease: enter"); + CHECK_NULL_PTR_RETURN(device); + + if (RegulatorNodeRemoveAll() != HDF_SUCCESS) { + HDF_LOGE("RegulatorNodeRemoveAll failed"); + return; + } + + struct RegulatorManager *manager = (struct RegulatorManager *)device->service; + CHECK_NULL_PTR_RETURN(manager); + OsalMutexDestroy(&manager->lock); + OsalMemFree(manager); + g_regulatorManager = NULL; + + if (RegulatorTreeManagerDestory() != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeManagerDestory failed"); + return; + } +} + +struct HdfDriverEntry g_regulatorManagerEntry = { + .moduleVersion = 1, + .Bind = RegulatorManagerBind, + .Init = RegulatorManagerInit, + .Release = RegulatorManagerRelease, + .moduleName = "HDF_PLATFORM_REGULATOR_MANAGER", +}; +HDF_INIT(g_regulatorManagerEntry); diff --git a/support/platform/src/regulator/regulator_if.c b/support/platform/src/regulator/regulator_if.c new file mode 100755 index 000000000..eede5e363 --- /dev/null +++ b/support/platform/src/regulator/regulator_if.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#include "regulator_if.h" +#include "devsvc_manager_clnt.h" +#include "hdf_log.h" +#include "hdf_base.h" +#include "regulator_core.h" + +DevHandle RegulatorOpen(const char *name) +{ + if (name == NULL) { + HDF_LOGE("%s: name is null", __func__); + return NULL; + } + + return (DevHandle)RegulatorNodeOpen(name); +} + +void RegulatorClose(DevHandle handle) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return; + } + + if (RegulatorNodeClose(node) != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeClose fail", __func__); + return; + } +} + +int32_t RegulatorEnable(DevHandle handle) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeEnable(node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeEnable fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorDisable(DevHandle handle) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeDisable(node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeDisable fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorForceDisable(DevHandle handle) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeForceDisable(node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeForceDisable fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorSetVoltage(DevHandle handle, uint32_t minUv, uint32_t maxUv) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return HDF_FAILURE; + } + + if (minUv > maxUv) { + HDF_LOGE("RegulatorSetVoltage: %s Uv [%d, %d] invalid!", + node->regulatorInfo.name, minUv, maxUv); + return HDF_FAILURE; + } + + int ret = RegulatorNodeSetVoltage(node, minUv, maxUv); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorSetVoltage fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorGetVoltage(DevHandle handle, uint32_t *voltage) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL || voltage == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeGetVoltage(node, voltage); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeGetVoltage fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorSetCurrent(DevHandle handle, uint32_t minUa, uint32_t maxUa) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL) { + HDF_LOGE("%s: node is null", __func__); + return HDF_FAILURE; + } + + if (minUa > maxUa) { + HDF_LOGE("RegulatorSetCurrent: %s Ua [%d, %d] invalid!", + node->regulatorInfo.name, minUa, maxUa); + return HDF_FAILURE; + } + + int ret = RegulatorNodeSetCurrent(node, minUa, maxUa); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeSetCurrent fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorGetCurrent(DevHandle handle, uint32_t *current) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL || current == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeGetCurrent(node, current); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeGetCurrent fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int32_t RegulatorGetStatus(DevHandle handle, uint32_t *status) +{ + struct RegulatorNode *node = (struct RegulatorNode *)handle; + if (node == NULL || status == NULL) { + HDF_LOGE("%s: param is null", __func__); + return HDF_FAILURE; + } + + int ret = RegulatorNodeGetStatus(node, status); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorNodeGetStatus fail", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} diff --git a/support/platform/src/regulator/regulator_tree_mgr.c b/support/platform/src/regulator/regulator_tree_mgr.c new file mode 100755 index 000000000..f3180c422 --- /dev/null +++ b/support/platform/src/regulator/regulator_tree_mgr.c @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "regulator_tree_mgr.h" +#include "osal_mem.h" +#include "securec.h" + +static struct RegulatorTreeManager *g_regulatorTreeManager = NULL; +static int RegulatorChildNodeAdd(struct RegulatorTreeInfo *pRegulator, struct RegulatorNode *child) +{ + CHECK_NULL_PTR_RETURN_VALUE(pRegulator, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(child, HDF_ERR_INVALID_PARAM); + + struct RegulatorChildNode *nodeInfo = NULL; + + nodeInfo = (struct RegulatorChildNode *)OsalMemCalloc(sizeof(*nodeInfo)); + if (nodeInfo == NULL) { + HDF_LOGE("%s: OsalMemCalloc failed", __func__); + return HDF_FAILURE; + } + nodeInfo->child = child; + + DListInsertTail(&nodeInfo->node, &pRegulator->childHead); + HDF_LOGI("RegulatorChildNodeAdd: add %s child node success!", pRegulator->name); + return HDF_SUCCESS; +} +void RegulatorChildListDestroy(struct RegulatorTreeInfo *pRegulator) +{ + CHECK_NULL_PTR_RETURN(pRegulator); + struct RegulatorChildNode *nodeInfo = NULL; + + DLIST_FOR_EACH_ENTRY(nodeInfo, &pRegulator->childHead, struct RegulatorChildNode, node) { + DListRemove(&nodeInfo->node); + OsalMemFree(nodeInfo); + } +} +struct RegulatorNode * RegulatorTreeGetParent(const char *name) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, NULL); + + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, NULL); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeGetParent: lock regulator manager fail!"); + return NULL; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + if (strcmp(pos->name, name) == 0) { + if (pos->parent == NULL) { + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeGetParent: %s no parent", name); + return NULL; + } + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeGetParent: get %s parent %s success!", + name, pos->parent->regulatorInfo.name); + return pos->parent; + } + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeGetParent: no %s Tree node", name); + return NULL; +} + +static struct DListHead *RegulatorTreeGetChild(const char *name) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, NULL); + + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, NULL); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeGetChild: lock regulator manager fail!"); + return NULL; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + if (strcmp(pos->name, name) == 0) { + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeGetChild: get %s child success!", name); + return (&pos->childHead); + } + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGE("RegulatorTreeGetChild: get %s child failed!", name); + return NULL; +} + +bool RegulatorTreeIsAllChildDisable(const char *name) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, true); + struct DListHead *pList = RegulatorTreeGetChild(name); + CHECK_NULL_PTR_RETURN_VALUE(pList, true); + + struct RegulatorChildNode *nodeInfo = NULL; + DLIST_FOR_EACH_ENTRY(nodeInfo, pList, struct RegulatorChildNode, node) { + if (nodeInfo->child->regulatorInfo.status == REGULATOR_STATUS_ON) { + HDF_LOGI("RegulatorTreeIsAllChildDisable:%s's child %s on!", name, nodeInfo->child->regulatorInfo.name); + return false; + } + } + + HDF_LOGI("RegulatorTreeIsAllChildDisable:%s's all child off!", name); + return true; +} + +int32_t RegulatorTreeChildForceDisable(struct RegulatorNode *node) +{ + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + struct DListHead *pList = RegulatorTreeGetChild(node->regulatorInfo.name); + CHECK_NULL_PTR_RETURN_VALUE(pList, HDF_ERR_INVALID_PARAM); + + struct RegulatorChildNode *nodeInfo = NULL; + DLIST_FOR_EACH_ENTRY(nodeInfo, pList, struct RegulatorChildNode, node) { + if (RegulatorTreeChildForceDisable(nodeInfo->child) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeChildForceDisable: %s fail!", nodeInfo->child->regulatorInfo.name); + return HDF_FAILURE; + } + + if (OsalMutexLock(&nodeInfo->child->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeChildForceDisable: lock regulator %s fail!", node->regulatorInfo.name); + return HDF_ERR_DEVICE_BUSY; + } + if (nodeInfo->child->regulatorInfo.status == REGULATOR_STATUS_ON) { + nodeInfo->child->ops->disable(nodeInfo->child); + nodeInfo->child->regulatorInfo.status = REGULATOR_STATUS_OFF; + RegulatorNodeStatusCb(nodeInfo->child); + } + (void)OsalMutexUnlock(&nodeInfo->child->lock); + HDF_LOGI("RegulatorTreeChildForceDisable: child %s ForceDisable success!", nodeInfo->child->regulatorInfo.name); + } + + return HDF_SUCCESS; +} + +// if Tree regulator node not exist, then add +static int32_t RegulatorTreeManagerNodeInit(const char *name) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, HDF_FAILURE); + + struct RegulatorTreeInfo *nodeInfo = NULL; + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSetParent: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + if (strcmp(pos->name, name) == 0) { + HDF_LOGI("node %s has exists!", name); + (void)OsalMutexUnlock(&manager->lock); + return HDF_SUCCESS; + } + } + + nodeInfo = (struct RegulatorTreeInfo *)OsalMemCalloc(sizeof(*nodeInfo)); + CHECK_NULL_PTR_RETURN_VALUE(nodeInfo, HDF_FAILURE); + + DListHeadInit(&nodeInfo->childHead); + nodeInfo->name = name; + + DListInsertTail(&nodeInfo->node, &manager->treeMgrHead); + (void)OsalMutexUnlock(&manager->lock); + + HDF_LOGI("RegulatorTreeManagerNodeInit: init %s node success!", name); + return HDF_SUCCESS; +} + +static int RegulatorTreeSetParent(const char *name, struct RegulatorNode *parent) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(parent, HDF_ERR_INVALID_PARAM); + + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSetParent: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + if (strcmp(pos->name, name) == 0) { + pos->parent = parent; + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeSetParent: set %s parent success!", name); + return HDF_SUCCESS; + } + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeSetParent:%s does not exist!", name); + return HDF_FAILURE; +} +static int RegulatorTreeSetChild(const char *name, struct RegulatorNode *child) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(child, HDF_ERR_INVALID_PARAM); + + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSetChild: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + if (strcmp(pos->name, name) == 0) { + if (RegulatorChildNodeAdd(pos, child) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSetChild: RegulatorChildNodeAdd fail!"); + (void)OsalMutexUnlock(&manager->lock); + return HDF_FAILURE; + } + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeSetChild: set %s parent success!", name); + return HDF_SUCCESS; + } + } + + (void)OsalMutexUnlock(&manager->lock); + HDF_LOGI("RegulatorTreeSetChild:%s does not exist!", name); + return HDF_FAILURE; +} + +int RegulatorTreeSet(const char *name, struct RegulatorNode *child, struct RegulatorNode *parent) +{ + CHECK_NULL_PTR_RETURN_VALUE(name, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(child, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(parent, HDF_ERR_INVALID_PARAM); + + if (RegulatorTreeManagerNodeInit(name) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSet: RegulatorTreeManagerNodeInit %s fail!", name); + return HDF_FAILURE; + } + if (RegulatorTreeSetParent(name, parent) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSet: RegulatorTreeSetParent %s fail!", name); + return HDF_FAILURE; + } + + if (RegulatorTreeManagerNodeInit(parent->regulatorInfo.name) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSet: RegulatorTreeManagerNodeInit %s fail!", parent->regulatorInfo.name); + return HDF_FAILURE; + } + if (RegulatorTreeSetChild(parent->regulatorInfo.name, child) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeSet: RegulatorTreeSetChild %s fail!", name); + return HDF_FAILURE; + } + + HDF_LOGI("RegulatorTreeSet: set [%s], parent[%s] success!", + name, parent->regulatorInfo.name); + return HDF_SUCCESS; +} +static void RegulatorTreePrintChild(const char *name, struct DListHead *childHead) +{ + CHECK_NULL_PTR_RETURN(childHead); + CHECK_NULL_PTR_RETURN(name); + + struct RegulatorChildNode *nodeInfo = NULL; + + DLIST_FOR_EACH_ENTRY(nodeInfo, childHead, struct RegulatorChildNode, node) { + HDF_LOGI("RegulatorTreePrintChild: %s's child %s !", + name, nodeInfo->child->regulatorInfo.name); + } +} + +static void RegulatorTreePrint(void) +{ + struct RegulatorTreeInfo *pos = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN(manager); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreePrint: lock regulator manager fail!"); + return; + } + + DLIST_FOR_EACH_ENTRY(pos, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + HDF_LOGI("RegulatorTreePrint %s info IN ---->", pos->name); + if (pos->parent != NULL) { + HDF_LOGI("RegulatorTreePrint %s info, parent name[%s]", + pos->name, pos->parent->regulatorInfo.name); + } + + RegulatorTreePrintChild(pos->name, &pos->childHead); + HDF_LOGI("RegulatorTreePrint %s info out---->", pos->name); + } + (void)OsalMutexUnlock(&manager->lock); +} + +int RegulatorTreeNodeRemoveAll(void) +{ + struct RegulatorTreeInfo *nodeInfo = NULL; + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeNodeRemoveAll: lock regulator manager fail!"); + return HDF_ERR_DEVICE_BUSY; + } + + DLIST_FOR_EACH_ENTRY(nodeInfo, &manager->treeMgrHead, struct RegulatorTreeInfo, node) { + RegulatorChildListDestroy(nodeInfo); + DListRemove(&nodeInfo->node); + OsalMemFree(nodeInfo); + } + + (void)OsalMutexUnlock(&manager->lock); + return HDF_SUCCESS; +} + +int RegulatorTreeManagerDestory(void) +{ + RegulatorTreeNodeRemoveAll(); + + struct RegulatorTreeManager *manager = g_regulatorTreeManager; + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + OsalMutexDestroy(&manager->lock); + OsalMemFree(manager); + g_regulatorTreeManager = NULL; + return HDF_SUCCESS; +} + +int RegulatorTreeManagerInit(void) +{ + struct RegulatorTreeManager * manager = (struct RegulatorTreeManager *)OsalMemCalloc(sizeof(struct RegulatorTreeManager)); + CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); + + if (OsalMutexInit(&manager->lock) != HDF_SUCCESS) { + HDF_LOGE("RegulatorTreeManagerInit: mutex init fail"); + OsalMemFree(manager); + return HDF_FAILURE; + } + + DListHeadInit(&manager->treeMgrHead); + g_regulatorTreeManager = manager; + return HDF_SUCCESS; +} diff --git a/support/platform/src/regulator_core.c b/support/platform/src/regulator_core.c deleted file mode 100755 index bc47f823c..000000000 --- a/support/platform/src/regulator_core.c +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "regulator_core.h" -#include "hdf_log.h" -#include "osal_mem.h" -#include "osal_time.h" -#include "securec.h" - -#define HDF_LOG_TAG regulator_core - -enum RegulatorDisableMode { - NORMAL_DISABLE, - DEFERRED_DISABLE, - FORCE_DISABLE, - MAX_DISABLE_MODE, -}; - -static int32_t RegulatorNormalDisable(struct RegulatorCntlr *cntlr); -static int32_t RegulatorDeferredDisable(struct RegulatorCntlr *cntlr); -static int32_t RegulatorForceDisable(struct RegulatorCntlr *cntlr); - -struct RegulatorTree *RegulatorTreeGet(struct RegulatorCntlr *cntlr, const char *name) -{ - int i; - - for (i = 0; i < REGULATOR_NUM_MAX; i++) { - if (strcmp(name, cntlr->rootTree[i].desc.name) == 0) { - return &cntlr->rootTree[i]; - } - } - - HDF_LOGE("can't get tree!,func:%s",__func__); - return NULL; -} - -void *RegulatorCntlrGet(const char *name) -{ - void *handle; - struct RegulatorCntlr *cntlr; - handle = (void *)DevSvcManagerClntGetService("HDF_PLATFORM_REGULATOR"); - if (handle == NULL) { - HDF_LOGE("RegulatorGetByName: get handle fail!"); - } - RegulatorGetPrivData((struct RegulatorCntlr *)handle); - cntlr = (struct RegulatorCntlr *)handle; - cntlr->tree = RegulatorTreeGet((struct RegulatorCntlr *)handle, name); - - return (void *)handle; -} - -int32_t RegulatorCntlrAdd(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("RegulatorCntlrAdd: cntlr is NULL!"); - return HDF_ERR_INVALID_OBJECT; - } - - if (cntlr->device == NULL) { - HDF_LOGE("RegulatorCntlrAdd: no device associated!"); - return HDF_ERR_INVALID_OBJECT; - } - - ret = OsalSpinInit(&cntlr->spinLock); - if (ret != HDF_SUCCESS) { - HDF_LOGE("RegulatorCntlrAdd: spinlock init fail!"); - return ret; - } - - ret = OsalMutexInit(&cntlr->mutexLock); - if (ret != HDF_SUCCESS) { - HDF_LOGE("RegulatorCntlrAdd: mutexlock init fail!"); - return ret; - } - - cntlr->device->service = &cntlr->service; - return HDF_SUCCESS; -} - -void RegulatorCntlrRemove(struct RegulatorCntlr *cntlr) -{ - if (cntlr == NULL) { - return; - } - - if (cntlr->device == NULL) { - HDF_LOGE("RegulatorCntlrRemove: cntlr is NULL!"); - return; - } - - cntlr->device->service = NULL; - (void)OsalMutexDestroy(&cntlr->mutexLock); - (void)OsalSpinDestroy(&cntlr->spinLock); -} - -void RegulatorGetPrivData(struct RegulatorCntlr *cntlr) -{ - if (cntlr == NULL || cntlr->ops == NULL) { - HDF_LOGE("RegulatorGetPrivData: cntlr is NULL!"); - return; - } - if (cntlr->ops->getPriv != NULL) { - cntlr->ops->getPriv(cntlr); - } -} - -void RegulatorReleasePriv(struct RegulatorCntlr *cntlr) -{ - if (cntlr == NULL || cntlr->ops == NULL) { - HDF_LOGE("RegulatorReleasePriv: cntlr is NULL!"); - return; - } - if (cntlr->ops->releasePriv != NULL) { - cntlr->ops->releasePriv(cntlr); - } -} - -int32_t RegulatorCntlrEnable(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->enable == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = RegulatorCntlrIsEnabled(cntlr); - if (ret != HDF_SUCCESS) { - ret = RegulatorCntlrEnable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - } - - ret = cntlr->ops->enable(cntlr); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), - (cntlr->tree->initData.initInPutUv + cntlr->tree->supply->desc.outPutUv)); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - ret = RegulatorCntlrSetVoltage(cntlr, cntlr->tree->initData.initOutPutUv); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - cntlr->tree->desc.status = REGULATOR_STATUS_ON; - cntlr->tree->supply->desc.enabledCount += 1; - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; - - EXIT: - cntlr->tree->constraint.alwaysOn = false; - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; -} - -static int32_t RegulatorNormalDisable(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - - if (cntlr->tree->constraint.alwaysOn != true) { - HDF_LOGE("device always on,func:%s",__func__); - return HDF_FAILURE; - } - - if (cntlr->tree->desc.enabledCount != 0) { - HDF_LOGE("consumer is working,func:%s",__func__); - return HDF_FAILURE; - } - - ret = cntlr->ops->disable(cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - cntlr->tree->desc.outPutUv = 0; - cntlr->tree->desc.status = REGULATOR_STATUS_OFF; - ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), - (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - cntlr->tree->supply->desc.enabledCount -= 1; - cntlr->tree->constraint.alwaysOn = false; - - if (cntlr->tree->supply->desc.enabledCount == 0) { - ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("supply disable failed,func:%s",__func__); - } - } - - return HDF_SUCCESS; -} - -static int32_t RegulatorDeferredDisable(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - int i; - - if (cntlr->tree->constraint.alwaysOn != true) { - HDF_LOGW("device always on,func:%s",__func__); - return HDF_FAILURE; - } - - if (cntlr->tree->desc.enabledCount != 0) { - for (i = 0; i < cntlr->tree->constraint.maxMountQuantity; i++) { - if (cntlr->tree->consumer[i]->constraint.alwaysOn != false) { - HDF_LOGW("consumer device always on,func:%s",__func__); - return HDF_FAILURE; - } - } - OsalSleep(REGULATOR_SLEEP_TIME); - ret = RegulatorForceDisable(cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("RegulatorForceDisable failed,func:%s",__func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; - } - - ret = cntlr->ops->disable(cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - cntlr->tree->desc.outPutUv = 0; - cntlr->tree->desc.status = REGULATOR_STATUS_OFF; - ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), - (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - cntlr->tree->supply->desc.enabledCount -= 1; - cntlr->tree->constraint.alwaysOn = false; - - if (cntlr->tree->supply->desc.enabledCount == 0) { - ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("supply disable failed,func:%s",__func__); - } - } - - return HDF_SUCCESS; -} - -static int32_t RegulatorForceDisable(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - - ret = cntlr->ops->disable(cntlr); - if (ret != HDF_SUCCESS) { - return HDF_FAILURE; - } - cntlr->tree->desc.outPutUv = 0; - cntlr->tree->desc.status = REGULATOR_STATUS_OFF; - ret = RegulatorCntlrSetVoltage((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName), - (cntlr->tree->supply->desc.outPutUv - cntlr->tree->desc.inPutUv)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - cntlr->tree->supply->desc.enabledCount -= 1; - cntlr->tree->constraint.alwaysOn = false; - - if (cntlr->tree->supply->desc.enabledCount == 0) { - ret = RegulatorNormalDisable((struct RegulatorCntlr *)RegulatorCntlrGet(cntlr->tree->desc.supplyName)); - if (ret != HDF_SUCCESS) { - HDF_LOGE("supply disable failed,func:%s",__func__); - } - } - - return HDF_SUCCESS; -} - -int32_t RegulatorCntlrDisable(struct RegulatorCntlr *cntlr, int32_t disableMode) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->disable == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - switch (disableMode) - { - case NORMAL_DISABLE: - ret = RegulatorNormalDisable(cntlr); - break; - case DEFERRED_DISABLE: - ret = RegulatorDeferredDisable(cntlr); - break; - case FORCE_DISABLE: - ret = RegulatorForceDisable(cntlr); - break; - default: - ret = HDF_FAILURE; - break; - } - - if (ret != HDF_SUCCESS) { - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; -} - -int32_t RegulatorCntlrIsEnabled(struct RegulatorCntlr *cntlr) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->isEnabled == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - if (cntlr->tree->constraint.alwaysOn == true) { - cntlr->tree->desc.status = REGULATOR_STATUS_ON; - return HDF_SUCCESS; - } - - ret = cntlr->ops->isEnabled(cntlr); - if (cntlr->tree->constraint.alwaysOn == false) { - cntlr->tree->desc.status = REGULATOR_STATUS_OFF; - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - - cntlr->tree->desc.status = REGULATOR_STATUS_ON; - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; -} - -int32_t RegulatorCntlrSetVoltage(struct RegulatorCntlr *cntlr, int32_t voltage) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->setVoltage == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = RegulatorCntlrIsEnabled(cntlr); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - if (voltage < cntlr->tree->desc.minOutPutUv || voltage > cntlr->tree->desc.maxOutPutUv) { - goto EXIT; - } - - ret = cntlr->ops->setVoltage(cntlr, voltage); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; - - EXIT: - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; -} - -int32_t RegulatorCntlrGetVoltage(struct RegulatorCntlr *cntlr, int32_t *voltage) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->getVoltage == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = cntlr->ops->getVoltage(cntlr, voltage); - if (ret != HDF_SUCCESS) { - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; -} - -int32_t RegulatorCntlrSetVoltageRange(struct RegulatorCntlr *cntlr, int32_t vmin, int32_t vmax) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->setVoltageRange == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = RegulatorCntlrIsEnabled(cntlr); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - if (vmin < cntlr->tree->constraint.minOutPutUv || vmax > cntlr->tree->constraint.maxOutPutUv) { - goto EXIT; - } - - ret = cntlr->ops->setVoltageRange(cntlr, vmin, vmax); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; - - EXIT: - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; -} - -int32_t RegulatorCntlrSetCurrent(struct RegulatorCntlr *cntlr, int32_t current) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->setCurrent == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = RegulatorCntlrIsEnabled(cntlr); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - if (current < cntlr->tree->desc.minOutPutUa || current > cntlr->tree->desc.maxOutPutUa) { - goto EXIT; - } - - ret = cntlr->ops->setCurrent(cntlr, current); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; - - EXIT: - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; -} - -int32_t RegulatorCntlrGetCurrent(struct RegulatorCntlr *cntlr, int32_t *current) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->getCurrent == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = cntlr->ops->getCurrent(cntlr, current); - if (ret != HDF_SUCCESS) { - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; -} - -int32_t RegulatorCntlrSetCurrentRange(struct RegulatorCntlr *cntlr, int32_t cmin, int32_t cmax) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->setCurrentRange == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = RegulatorCntlrIsEnabled(cntlr); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - if (cmin < cntlr->tree->constraint.minOutPutUa || cmax > cntlr->tree->constraint.maxOutPutUa) { - goto EXIT; - } - - ret = cntlr->ops->setVoltageRange(cntlr, cmin, cmax); - if (ret != HDF_SUCCESS) { - goto EXIT; - } - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return HDF_SUCCESS; - - EXIT: - (void)OsalMutexUnlock(&cntlr->mutexLock); - HDF_LOGE("func:%s failed!,line:%d", __func__, __LINE__); - return HDF_FAILURE; -} - -int32_t RegulatorCntlrGetStatus(struct RegulatorCntlr *cntlr, int32_t *status) -{ - int32_t ret; - - if (cntlr == NULL) { - HDF_LOGE("func:%s cntlr is NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (cntlr->ops == NULL || cntlr->ops->getStatus == NULL) { - HDF_LOGE("func:%s ops is NULL!", __func__); - return HDF_ERR_NOT_SUPPORT; - } - - if (OsalMutexLock(&cntlr->mutexLock) != HDF_SUCCESS) { - HDF_LOGE("func:%s OsalMutexLock failed!", __func__); - return HDF_ERR_DEVICE_BUSY; - } - - ret = cntlr->ops->getStatus(cntlr, status); - - (void)OsalMutexUnlock(&cntlr->mutexLock); - return ret; -} \ No newline at end of file diff --git a/support/platform/src/regulator_if.c b/support/platform/src/regulator_if.c deleted file mode 100755 index 0e8098458..000000000 --- a/support/platform/src/regulator_if.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ -#include "regulator_if.h" -#include "devsvc_manager_clnt.h" -#include "hdf_base.h" -#include "securec.h" -#include "regulator_core.h" - -DevHandle RegulatorGet(const char *name) -{ - return (DevHandle)RegulatorCntlrGet(name); -} - -void RegulatorPut(DevHandle handle) -{ - if (handle == NULL) { - return; - } - RegulatorReleasePriv((struct RegulatorCntlr *)handle); - (void)handle; -} - -int32_t RegulatorEnable(DevHandle handle) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrEnable((struct RegulatorCntlr *)handle); -} - -int32_t RegulatorDisable(DevHandle handle, int32_t disableMode) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrDisable((struct RegulatorCntlr *)handle, disableMode); -} - -int32_t RegulatorIsEnabled(DevHandle handle) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrIsEnabled((struct RegulatorCntlr *)handle); -} - -int32_t RegulatorSetVoltage(DevHandle handle, int32_t voltage) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrSetVoltage((struct RegulatorCntlr *)handle, voltage); -} - -int32_t RegulatorGetVoltage(DevHandle handle, int32_t *voltage) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrGetVoltage((struct RegulatorCntlr *)handle, voltage); -} - -int32_t RegulatorSetVoltageRange(DevHandle handle, int32_t vmin, int32_t vmax) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrSetVoltageRange((struct RegulatorCntlr *)handle, vmin, vmax); -} - -int32_t RegulatorSetCurrent(DevHandle handle, int32_t current) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrSetCurrent((struct RegulatorCntlr *)handle, current); -} - -int32_t RegulatorGetCurrent(DevHandle handle, int32_t *current) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrGetCurrent((struct RegulatorCntlr *)handle, current); -} - -int32_t RegulatorSetCurrentRange(DevHandle handle, int32_t cmin, int32_t cmax) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrSetCurrentRange((struct RegulatorCntlr *)handle, cmin, cmax); -} - -int32_t RegulatorGetStatus(DevHandle handle, int32_t *status) -{ - if (handle == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - return RegulatorCntlrGetStatus((struct RegulatorCntlr *)handle, status); -} \ No newline at end of file diff --git a/support/platform/test/unittest/common/hdf_regulator_test.cpp b/support/platform/test/unittest/common/hdf_regulator_test.cpp new file mode 100755 index 000000000..237d390ad --- /dev/null +++ b/support/platform/test/unittest/common/hdf_regulator_test.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdf_uhdf_test.h" +#include "hdf_io_service_if.h" + +using namespace testing::ext; + +enum RegulatorTestCmd { + REGULATOR_ENABLE_TEST, + REGULATOR_DISABLE_TEST, + REGULATOR_FORCE_DISABLE_TEST, + REGULATOR_SET_VOLTAGE_TEST, + REGULATOR_GET_VOLTAGE_TEST, + REGULATOR_SET_CURRENT_TEST, + REGULATOR_GET_CURRENT_TEST, + REGULATOR_GET_STATUS_TEST, + REGULATOR_MULTI_THREAD_TEST, + REGULATOR_RELIABILITY_TEST, +}; + +class HdfLiteRegulatorTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfLiteRegulatorTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void HdfLiteRegulatorTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void HdfLiteRegulatorTest::SetUp() +{ +} + +void HdfLiteRegulatorTest::TearDown() +{ +} +/** + * @tc.name: RegulatorTestEnable001 + * @tc.desc: regulator enable test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestEnable001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_ENABLE_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestDisable001 + * @tc.desc: regulator disable test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestDisable001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_DISABLE_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestForceDisable001 + * @tc.desc: regulator force disable test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestForceDisable001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_FORCE_DISABLE_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestSetVoltage001 + * @tc.desc: regulator set voltage test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestSetVoltage001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_SET_VOLTAGE_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestGetVoltage001 + * @tc.desc: regulator get voltage test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestGetVoltage001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_GET_VOLTAGE_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestSetCurrent001 + * @tc.desc: regulator set current test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestSetCurrent001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_SET_CURRENT_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestGetCurrent001 + * @tc.desc: regulator get current test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestGetCurrent001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_GET_CURRENT_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestGetCurrent001 + * @tc.desc: regulator get status test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestGetStatus001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_GET_STATUS_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestMultiThread001 + * @tc.desc: regulator multi thread test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestMultiThread001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_MULTI_THREAD_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +/** + * @tc.name: RegulatorTestReliability001 + * @tc.desc: regulator Reliability test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteRegulatorTest, RegulatorTestReliability001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_REGULATOR_TYPE, REGULATOR_RELIABILITY_TEST, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 7a33d356a..839c8e05a 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -23,6 +23,9 @@ #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I2S) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I2S) #include "hdf_i2s_entry_test.h" #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_REGULATOR) || defined(CONFIG_DRIVERS_HDF_PLATFORM_REGULATOR) +#include "hdf_regulator_entry_test.h" +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) #include "hdf_adc_entry_test.h" #endif @@ -86,6 +89,9 @@ HdfTestFuncList g_hdfTestFuncList[] = { #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I2S) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I2S) { TEST_PAL_I2S_TYPE, HdfI2sUnitTestEntry }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_REGULATOR) || defined(CONFIG_DRIVERS_HDF_PLATFORM_REGULATOR) + { TEST_PAL_REGULATOR_TYPE, HdfRegulatorUnitTestEntry }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) { TEST_PAL_ADC_TYPE, HdfAdcTestEntry }, #endif diff --git a/test/unittest/platform/common/regulator_test.c b/test/unittest/platform/common/regulator_test.c new file mode 100755 index 000000000..12dcd3a3e --- /dev/null +++ b/test/unittest/platform/common/regulator_test.c @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "regulator_test.h" +#include +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_log.h" +#include "regulator_if.h" +#include "osal_mem.h" +#include "osal_test_type.h" +#include "osal_thread.h" +#include "osal_time.h" + +#define HDF_LOG_TAG regulator_test_c + +struct RegulatorTestFunc { + enum RegulatorTestCmd type; + int32_t (*Func)(struct RegulatorTest *test); +}; + +static int32_t RegulatorEnableTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + RegulatorEnable(test->handle); + return HDF_SUCCESS; +} + +static int32_t RegulatorDisableTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + RegulatorDisable(test->handle); + return HDF_SUCCESS; +} +static int32_t RegulatorForceDisableTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + RegulatorForceDisable(test->handle); + return HDF_SUCCESS; +} +static int32_t RegulatorSetVoltageTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (test->mode != REGULATOR_CHANGE_VOLTAGE) { + return HDF_SUCCESS; + } + + HDF_LOGD("%s: UV[%d, %d]", __func__, test->maxUv, test->minUv); + if (RegulatorSetVoltage(test->handle, test->minUv, test->maxUv) != HDF_SUCCESS) { + HDF_LOGE("%s:[%d, %d] test fail", __func__, test->maxUv, test->minUv); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} +static int32_t RegulatorGetVoltageTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (test->mode != REGULATOR_CHANGE_VOLTAGE) { + return HDF_SUCCESS; + } + + if (RegulatorGetVoltage(test->handle, &test->uv) != HDF_SUCCESS) { + HDF_LOGE("%s: test fail", __func__); + return HDF_FAILURE; + } + + HDF_LOGD("%s: UV[%d]", __func__, test->uv); + return HDF_SUCCESS; +} +static int32_t RegulatorSetCurrentTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (test->mode != REGULATOR_CHANGE_CURRENT) { + return HDF_SUCCESS; + } + + HDF_LOGD("%s: Ua[%d, %d]", __func__, test->minUa, test->maxUa); + if (RegulatorSetCurrent(test->handle, test->minUa, test->maxUa) != HDF_SUCCESS) { + HDF_LOGE("%s:[%d, %d] test fail", __func__, test->minUa, test->maxUa); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} +static int32_t RegulatorGetCurrentTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (test->mode != REGULATOR_CHANGE_CURRENT) { + return HDF_SUCCESS; + } + + if (RegulatorGetCurrent(test->handle, &test->ua) != HDF_SUCCESS) { + HDF_LOGE("%s: test fail", __func__); + return HDF_FAILURE; + } + + HDF_LOGD("%s: Ua[%d]", __func__, test->ua); + return HDF_SUCCESS; +} +static int32_t RegulatorGetStatusTest(struct RegulatorTest *test) +{ + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (RegulatorGetStatus(test->handle, &test->status) != HDF_SUCCESS) { + HDF_LOGE("%s: test fail", __func__); + return HDF_FAILURE; + } + + if ((test->status != REGULATOR_STATUS_ON) && (test->status != REGULATOR_STATUS_OFF)) { + HDF_LOGE("%s: regulator status invalid %d", __func__, test->status); + return HDF_FAILURE; + } + + HDF_LOGD("%s: status[%d]", __func__, test->status); + return HDF_SUCCESS; +} +static int RegulatorTestThreadFunc(void *param) +{ + DevHandle handle = RegulatorOpen("regulator_virtual_1"); + if (handle == NULL) { + HDF_LOGE("%s: regulator test get handle fail", __func__); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + + if (RegulatorSetVoltage(handle, 250, 2500) != HDF_SUCCESS) { + HDF_LOGE("%s:test fail", __func__); + RegulatorClose(handle); + *((int32_t *)param) = 1; + return HDF_FAILURE; + } + + RegulatorClose(handle); + *((int32_t *)param) = 1; + return HDF_SUCCESS; +} + +int32_t RegulatorTestMultiThread(struct RegulatorTest *test) +{ + int32_t ret; + struct OsalThread thread1, thread2; + struct OsalThreadParam cfg1, cfg2; + int32_t count1, count2; + + count1 = count2 = 0; + + ret = OsalThreadCreate(&thread1, (OsalThreadEntry)RegulatorTestThreadFunc, (void *)&count1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadCreate(&thread2, (OsalThreadEntry)RegulatorTestThreadFunc, (void *)&count2); + if (ret != HDF_SUCCESS) { + (void)OsalThreadDestroy(&thread1); + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + cfg1.name = "RegulatorTestThread-1"; + cfg2.name = "RegulatorTestThread-2"; + cfg1.priority = cfg2.priority = OSAL_THREAD_PRI_DEFAULT; + cfg1.stackSize = cfg2.stackSize = REGULATOR_TEST_STACK_SIZE; + + ret = OsalThreadStart(&thread1, &cfg1); + if (ret != HDF_SUCCESS) { + (void)OsalThreadDestroy(&thread1); + (void)OsalThreadDestroy(&thread2); + HDF_LOGE("start test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadStart(&thread2, &cfg2); + if (ret != HDF_SUCCESS) { + (void)OsalThreadDestroy(&thread1); + (void)OsalThreadDestroy(&thread2); + HDF_LOGE("start test thread2 fail:%d", ret); + return HDF_FAILURE; + } + + while (count1 == 0 || count2 == 0) { + HDF_LOGE("waitting testing Regulator thread finish..."); + OsalMSleep(REGULATOR_TEST_WAIT_TIMES); + } + + (void)OsalThreadDestroy(&thread1); + (void)OsalThreadDestroy(&thread2); + return HDF_SUCCESS; +} + +int32_t RegulatorTestReliability(struct RegulatorTest *test) +{ + HDF_LOGD("RegulatorTestReliability: test for Regulator ..."); + if (test == NULL || test->handle == NULL) { + HDF_LOGE("%s: test null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + RegulatorSetVoltage(test->handle, 250, 50); + RegulatorSetCurrent(test->handle, 250, 50); + RegulatorGetCurrent(test->handle, NULL); + return HDF_SUCCESS; +} + +static struct RegulatorTestFunc g_regulatorTestFunc[] = { + {REGULATOR_ENABLE_TEST, RegulatorEnableTest}, + {REGULATOR_DISABLE_TEST, RegulatorDisableTest}, + {REGULATOR_FORCE_DISABLE_TEST, RegulatorForceDisableTest}, + {REGULATOR_SET_VOLTAGE_TEST, RegulatorSetVoltageTest}, + {REGULATOR_GET_VOLTAGE_TEST, RegulatorGetVoltageTest}, + {REGULATOR_SET_CURRENT_TEST, RegulatorSetCurrentTest}, + {REGULATOR_GET_CURRENT_TEST, RegulatorGetCurrentTest}, + {REGULATOR_GET_STATUS_TEST, RegulatorGetStatusTest}, + {REGULATOR_MULTI_THREAD_TEST, RegulatorTestMultiThread}, + {REGULATOR_RELIABILITY_TEST, RegulatorTestReliability}, +}; + +static int32_t RegulatorTestEntry(struct RegulatorTest *test, int32_t cmd) +{ + int32_t i; + int32_t ret = HDF_ERR_NOT_SUPPORT; + + HDF_LOGD("regulator test-- -- -- -- -- -->%s: enter cmd %d", __func__, cmd); + + if (test == NULL || test->name == NULL) { + HDF_LOGE("%s: test null cmd %d", __func__, cmd); + return HDF_ERR_INVALID_OBJECT; + } + + if (cmd != REGULATOR_MULTI_THREAD_TEST) { + test->handle = RegulatorOpen(test->name); + if (test->handle == NULL) { + HDF_LOGE("%s: regulator test get handle fail", __func__); + return HDF_FAILURE; + } + } + + for (i = 0; i < sizeof(g_regulatorTestFunc) / sizeof(g_regulatorTestFunc[0]); i++) { + if (cmd == g_regulatorTestFunc[i].type && g_regulatorTestFunc[i].Func != NULL) { + ret = g_regulatorTestFunc[i].Func(test); + HDF_LOGD("%s: cmd %d ret %d", __func__, cmd, ret); + break; + } + } + + if (cmd != REGULATOR_MULTI_THREAD_TEST) { + RegulatorClose(test->handle); + } + return ret; +} + +static int32_t RegulatorTestBind(struct HdfDeviceObject *device) +{ + static struct RegulatorTest test; + HDF_LOGD("RegulatorTestBind in\r\n"); + + if (device != NULL) { + device->service = &test.service; + } else { + HDF_LOGE("%s: device is NULL", __func__); + } + + HDF_LOGD("RegulatorTestBind out\r\n"); + return HDF_SUCCESS; +} + +static int32_t RegulatorTestInitFromHcs(struct RegulatorTest *test, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *face = NULL; + + face = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (face == NULL) { + HDF_LOGE("%s: face is null", __func__); + return HDF_FAILURE; + } + if (face->GetUint32 == NULL || face->GetUint32Array == NULL) { + HDF_LOGE("%s: GetUint32 or GetUint32Array not support", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + ret = face->GetString(node, "name", &(test->name), "ERROR"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read name fail!", __func__); + return HDF_FAILURE; + } + + ret = face->GetUint8(node, "mode", &test->mode, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read mode fail!", __func__); + return HDF_FAILURE; + } + + ret = face->GetUint32(node, "minUv", &test->minUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUv fail!", __func__); + return HDF_FAILURE; + } + + ret = face->GetUint32(node, "maxUv", &test->maxUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUv fail!", __func__); + return HDF_FAILURE; + } + + ret = face->GetUint32(node, "minUa", &test->minUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUa fail!", __func__); + return HDF_FAILURE; + } + + ret = face->GetUint32(node, "maxUa", &test->maxUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUa fail!", __func__); + return HDF_FAILURE; + } + + HDF_LOGD("regulator test init:[%s][%d]--[%d][%d]--[%d][%d]!", + test->name, test->mode, test->minUv, test->maxUv, test->minUa, test->maxUa); + + return HDF_SUCCESS; +} + +static int32_t RegulatorTestInit(struct HdfDeviceObject *device) +{ + struct RegulatorTest *test = NULL; + + HDF_LOGD("RegulatorTestInit in\r\n"); + + if (device == NULL || device->service == NULL || device->property == NULL) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + test = (struct RegulatorTest *)device->service; + + if (RegulatorTestInitFromHcs(test, device->property) != HDF_SUCCESS) { + HDF_LOGE("%s: RegulatorTestInitFromHcs failed", __func__); + return HDF_FAILURE; + } + + test->TestEntry = RegulatorTestEntry; + HDF_LOGD("%s: success", __func__); + + return HDF_SUCCESS; +} + +static void RegulatorTestRelease(struct HdfDeviceObject *device) +{ + (void)device; +} + +struct HdfDriverEntry g_regulatorTestEntry = { + .moduleVersion = 1, + .Bind = RegulatorTestBind, + .Init = RegulatorTestInit, + .Release = RegulatorTestRelease, + .moduleName = "PLATFORM_REGULATOR_TEST", +}; +HDF_INIT(g_regulatorTestEntry); diff --git a/test/unittest/platform/common/regulator_test.h b/test/unittest/platform/common/regulator_test.h new file mode 100755 index 000000000..bd8a7ddd7 --- /dev/null +++ b/test/unittest/platform/common/regulator_test.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef REGULATOR_TEST_H +#define REGULATOR_TEST_H + +#include "hdf_device_desc.h" +#include "hdf_platform.h" + +#ifdef REGULATOR_TEST_PRINTK_OPEN +#define REGULATOR_TEST_PRINT_LOG_DBG(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_TEST_PRINT_LOG_INF(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_TEST_PRINT_LOG_ERR(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#else +#define REGULATOR_TEST_PRINT_LOG_DBG(fmt, arg...) HDF_LOGD_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#define REGULATOR_TEST_PRINT_LOG_INF(fmt, arg...) HDF_LOGI_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#define REGULATOR_TEST_PRINT_LOG_ERR(fmt, arg...) HDF_LOGE_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) +#endif + +enum RegulatorTestCmd { + REGULATOR_ENABLE_TEST, + REGULATOR_DISABLE_TEST, + REGULATOR_FORCE_DISABLE_TEST, + REGULATOR_SET_VOLTAGE_TEST, + REGULATOR_GET_VOLTAGE_TEST, + REGULATOR_SET_CURRENT_TEST, + REGULATOR_GET_CURRENT_TEST, + REGULATOR_GET_STATUS_TEST, + REGULATOR_MULTI_THREAD_TEST, + REGULATOR_RELIABILITY_TEST, +}; + +#define REGULATOR_TEST_STACK_SIZE (1024 * 100) +#define REGULATOR_TEST_WAIT_TIMES 200 + +struct RegulatorTest { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + int32_t (*TestEntry)(struct RegulatorTest *test, int32_t cmd); + DevHandle handle; + const char *name; + uint32_t maxUv; + uint32_t minUv; + uint32_t maxUa; + uint32_t minUa; + uint32_t uv; + uint32_t ua; + uint32_t status; + uint8_t mode; +}; + +static inline struct RegulatorTest *GetRegulatorTest(void) +{ + return (struct RegulatorTest *)DevSvcManagerClntGetService("REGULATOR_TEST"); +} + +#endif /* REGULATOR_TEST_H */ diff --git a/test/unittest/platform/hdf_regulator_entry_test.c b/test/unittest/platform/hdf_regulator_entry_test.c new file mode 100755 index 000000000..4e57cb63f --- /dev/null +++ b/test/unittest/platform/hdf_regulator_entry_test.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_regulator_entry_test.h" +#include "hdf_log.h" +#include "regulator_if.h" +#include "regulator_test.h" + +#define HDF_LOG_TAG hdf_regulator_entry_test + +int32_t HdfRegulatorUnitTestEntry(HdfTestMsg *msg) +{ + struct RegulatorTest *test = NULL; + + if (msg == NULL) { + return HDF_FAILURE; + } + test = GetRegulatorTest(); + if (test == NULL || test->TestEntry == NULL) { + HDF_LOGE("%s: tester is NULL!\n", __func__); + msg->result = HDF_FAILURE; + return HDF_FAILURE; + } + msg->result = test->TestEntry(test, msg->subCmd); + return msg->result; +} diff --git a/test/unittest/platform/hdf_regulator_entry_test.h b/test/unittest/platform/hdf_regulator_entry_test.h new file mode 100755 index 000000000..229df5453 --- /dev/null +++ b/test/unittest/platform/hdf_regulator_entry_test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_REGULATOR_ENTRY_TEST_H +#define HDF_REGULATOR_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfRegulatorUnitTestEntry(HdfTestMsg *msg); + +#endif /* HDF_REGULATOR_ENTRY_TEST_H */ diff --git a/test/unittest/platform/virtual/regulator_virtual.c b/test/unittest/platform/virtual/regulator_virtual.c new file mode 100755 index 000000000..ff01c9337 --- /dev/null +++ b/test/unittest/platform/virtual/regulator_virtual.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + + /* hcs topology for example +dev ---+-> Regulator-1(voltage) -+-> Regulator-2(voltage) -+-> Regulator-3(voltage) -+-> Regulator-4(voltage) + | | + | | -+-> Regulator-5(voltage) -+-> Regulator-6(voltage) -+-> Regulator-7(voltage) -+-> Regulator-8(voltage) + | | + | | -+-> Regulator-9 + | + ---+-> Regulator-10(current) + | + | + ---+-> Regulator-11(current) -+-> Regulator-12(current) -+-> Regulator-14(current) + | | + | | -+-> Regulator-13(current) +*/ + +#include "device_resource_if.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_io.h" +#include "osal_mem.h" +#include "osal_spinlock.h" +#include "regulator/regulator_core.h" +#include "string.h" + +#define HDF_LOG_TAG regulator_virtual + +static int32_t VirtualRegulatorEnable(struct RegulatorNode *node) +{ + if (node == NULL) { + HDF_LOGE("VirtualRegulatorEnable node null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + node->regulatorInfo.status = REGULATOR_STATUS_ON; + HDF_LOGD("VirtualRegulatorEnable %s success !\n", node->regulatorInfo.name); + return HDF_SUCCESS; +} + +int32_t VirtualRegulatorDisable(struct RegulatorNode *node) +{ + if (node == NULL) { + HDF_LOGE("VirtualRegulatorDisable node null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + node->regulatorInfo.status = REGULATOR_STATUS_OFF; + HDF_LOGD("VirtualRegulatorDisable %s success !\n", node->regulatorInfo.name); + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorSetVoltage(struct RegulatorNode *node, uint32_t minUv, uint32_t maxUv) +{ + if (node == NULL) { + HDF_LOGE("VirtualRegulatorEnable node null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + HDF_LOGD("VirtualRegulatorSetVoltage %s [%d, %d] success!\n", + node->regulatorInfo.name, minUv, maxUv); + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorGetVoltage(struct RegulatorNode *node, uint32_t *voltage) +{ + if (node == NULL || voltage == NULL) { + HDF_LOGE("VirtualRegulatorGetVoltage param null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + *voltage = 2500; + HDF_LOGD("VirtualRegulatorGetVoltage get %s %d success !\n", node->regulatorInfo.name, *voltage); + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorSetCurrent(struct RegulatorNode *node, uint32_t minUa, uint32_t maxUa) +{ + if (node == NULL) { + HDF_LOGE("VirtualRegulatorSetCurrent node null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + HDF_LOGD("VirtualRegulatorSetCurrent %s [%d, %d] success!\n", + node->regulatorInfo.name, minUa, maxUa); + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorGetCurrent(struct RegulatorNode *node, uint32_t *current) +{ + if (node == NULL || current == NULL) { + HDF_LOGE("VirtualRegulatorGetCurrent param null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + *current = 2500; + HDF_LOGD("VirtualRegulatorGetCurrent get %s %d success !\n", node->regulatorInfo.name, *current); + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorGetStatus(struct RegulatorNode *node, uint32_t *status) +{ + if (node == NULL || status == NULL) { + HDF_LOGE("VirtualRegulatorGetStatus param null\n"); + return HDF_ERR_INVALID_OBJECT; + } + + *status = node->regulatorInfo.status; + HDF_LOGD("VirtualRegulatorGetStatus get %s %d success !\n", node->regulatorInfo.name, *status); + return HDF_SUCCESS; +} + +static struct RegulatorMethod g_method = { + .enable = VirtualRegulatorEnable, + .disable = VirtualRegulatorDisable, + .setVoltage = VirtualRegulatorSetVoltage, + .getVoltage = VirtualRegulatorGetVoltage, + .setCurrent = VirtualRegulatorSetCurrent, + .getCurrent = VirtualRegulatorGetCurrent, + .getStatus = VirtualRegulatorGetStatus, +}; + +static int32_t VirtualRegulatorReadHcs(struct RegulatorNode *regNode, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + HDF_LOGD("VirtualRegulatorReadHcs enter:"); + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetString == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetString(node, "name", &(regNode->regulatorInfo.name), "ERROR"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read name fail!", __func__); + return HDF_FAILURE; + } + if (regNode->regulatorInfo.name != NULL) { + HDF_LOGD("VirtualRegulatorReadHcs:name[%s]", regNode->regulatorInfo.name); + } else { + HDF_LOGE("VirtualRegulatorReadHcs:name NULL"); + return HDF_FAILURE; + } + + ret = drsOps->GetString(node, "parentName", &(regNode->regulatorInfo.parentName), "ERROR"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read parentName fail!", __func__); + return HDF_FAILURE; + } + if (regNode->regulatorInfo.parentName != NULL) { + HDF_LOGD("VirtualRegulatorReadHcs:parentName[%s]", regNode->regulatorInfo.parentName); + } + + HDF_LOGD("VirtualRegulatorReadHcs enter:"); + regNode->regulatorInfo.constraints.alwaysOn = drsOps->GetBool(node, "alwaysOn"); + HDF_LOGD("VirtualRegulatorReadHcs:alwaysOn[%d]", regNode->regulatorInfo.constraints.alwaysOn); + + ret = drsOps->GetUint8(node, "mode", ®Node->regulatorInfo.constraints.mode, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read mode fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "minUv", ®Node->regulatorInfo.constraints.minUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUv fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "maxUv", ®Node->regulatorInfo.constraints.maxUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUv fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "minUa", ®Node->regulatorInfo.constraints.minUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUa fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "maxUa", ®Node->regulatorInfo.constraints.maxUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUa fail!", __func__); + return HDF_FAILURE; + } + + HDF_LOGD("regulatorInfo:[%s][%d][%d]--[%d][%d]--[%d][%d]!", + regNode->regulatorInfo.name, regNode->regulatorInfo.constraints.alwaysOn, regNode->regulatorInfo.constraints.mode, + regNode->regulatorInfo.constraints.minUv, regNode->regulatorInfo.constraints.maxUv, + regNode->regulatorInfo.constraints.minUa, regNode->regulatorInfo.constraints.maxUa); + + return HDF_SUCCESS; +} + +static int32_t VirtualRegulatorParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct RegulatorNode *regNode = NULL; + (void)device; + + regNode = (struct RegulatorNode *)OsalMemCalloc(sizeof(*regNode)); + if (regNode == NULL) { + HDF_LOGE("%s: malloc node fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + HDF_LOGD("VirtualRegulatorParseAndInit"); + + ret = VirtualRegulatorReadHcs(regNode, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read drs fail! ret:%d", __func__, ret); + goto __ERR__; + } + + regNode->priv = (void *)node; + regNode->ops = &g_method; + + ret = RegulatorNodeAdd(regNode); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add regulator controller fail:%d!", __func__, ret); + goto __ERR__; + } + return HDF_SUCCESS; + +__ERR__: + HDF_LOGE("%s:fail ret:%d", __func__, ret); + if (regNode != NULL) { + OsalMemFree(regNode); + regNode = NULL; + } + return ret; +} + +static int32_t VirtualRegulatorInit(struct HdfDeviceObject *device) +{ + int32_t ret = HDF_SUCCESS; + const struct DeviceResourceNode *childNode = NULL; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = VirtualRegulatorParseAndInit(device, childNode); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:VirtualRegulatorParseAndInit fail", __func__); + RegulatorNodeRemoveAll(); + return HDF_FAILURE; + } + } + + return HDF_SUCCESS; +} + +static void VirtualRegulatorRelease(struct HdfDeviceObject *device) +{ + HDF_LOGI("%s: enter", __func__); + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return; + } + + RegulatorNodeRemoveAll(); +} + +struct HdfDriverEntry g_regulatorDriverEntry = { + .moduleVersion = 1, + .moduleName = "virtual_regulator_driver", + .Init = VirtualRegulatorInit, + .Release = VirtualRegulatorRelease, +}; +HDF_INIT(g_regulatorDriverEntry); -- Gitee From 525842b66e0035aae2b72274c19238ee4fae7a76 Mon Sep 17 00:00:00 2001 From: chenpan0560 Date: Thu, 11 Nov 2021 14:50:45 +0800 Subject: [PATCH 156/272] Add scan interface and enable interface, modified test module creation problem Signed-off-by: chenpan0560 --- .../command_line/hdf_add_handler.py | 206 +++++++++--------- .../command_line/hdf_defconfig_patch.py | 4 +- .../command_line/hdf_get_handler.py | 13 ++ .../command_line/hdf_linux_scann.py | 110 ++++++++++ .../command_line/hdf_liteos_scann.py | 120 ++++++++++ .../hdf_model_enable_operation.py | 193 ++++++++++++++++ .../command_line/hdf_set_handler.py | 22 +- .../command_line/hdf_vendor_kconfig_file.py | 2 +- tools/hdf_dev_eco_tool/hdf_tool_settings.py | 4 + tools/hdf_dev_eco_tool/hdf_utils.py | 2 +- .../hdf_dev_eco_tool/resources/settings.json | 5 - .../templates/lite/device_info_hcs.template | 22 +- .../templates/lite/hdf_driver.c.template | 22 +- 13 files changed, 594 insertions(+), 131 deletions(-) create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_liteos_scann.py create mode 100755 tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py index 7aeb77e81..b4ac9059a 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_add_handler.py @@ -63,12 +63,12 @@ class HdfAddHandler(HdfCommandHandlerBase): self.parser.add_argument("--action_type", help=' '.join(self.handlers.keys()), required=True) - self.parser.add_argument("--root_dir", required=True) # 路径 - self.parser.add_argument("--vendor_name") # 厂商 - self.parser.add_argument("--module_name") # 模块名 - self.parser.add_argument("--driver_name") # 驱动名称 - self.parser.add_argument("--board_name") # 板子名称 - self.parser.add_argument("--kernel_name") # 内核名称 + self.parser.add_argument("--root_dir", required=True) + self.parser.add_argument("--vendor_name") + self.parser.add_argument("--module_name") + self.parser.add_argument("--driver_name") + self.parser.add_argument("--board_name") + self.parser.add_argument("--kernel_name") self.args = self.parser.parse_args(args) @staticmethod @@ -114,90 +114,98 @@ class HdfAddHandler(HdfCommandHandlerBase): args_tuple = self.get_args() root, vendor, module, driver, board, kernel = args_tuple - converter = hdf_utils.WordsConverter(self.args.module_name) - driver_name_converter = hdf_utils.WordsConverter(self.args.driver_name) - framework_hdf = hdf_utils.get_vendor_hdf_dir_framework(root) - if not os.path.exists(framework_hdf): - raise HdfToolException( - ' framework model path "%s" not exist' % - framework_hdf, CommandErrorCode.TARGET_NOT_EXIST) - # 在 framework 目录下创建对应的 module 的文件目录用于存放 .c 驱动文件 - framework_drv_root_dir = hdf_utils.get_drv_root_dir( - root, vendor, module) - if os.path.exists(framework_drv_root_dir): - raise HdfToolException('module "%s" already exist' % module, - CommandErrorCode.TARGET_ALREADY_EXIST) - os.makedirs(framework_drv_root_dir) + board_list = HdfToolSettings().get_board_list() + if board in board_list: + converter = hdf_utils.WordsConverter(self.args.module_name) + driver_name_converter = hdf_utils.WordsConverter( + self.args.driver_name) + framework_hdf = hdf_utils.get_vendor_hdf_dir_framework(root) + if not os.path.exists(framework_hdf): + raise HdfToolException( + ' framework model path "%s" not exist' % + framework_hdf, CommandErrorCode.TARGET_NOT_EXIST) + # framework create file .c + framework_drv_root_dir = hdf_utils.get_drv_root_dir( + root, vendor, module) + if os.path.exists(framework_drv_root_dir): + raise HdfToolException('module "%s" already exist' % module, + CommandErrorCode.TARGET_ALREADY_EXIST) + os.makedirs(framework_drv_root_dir) - # 创建 .c 模板驱动 - state, driver_file_path = self._add_driver_handler(*args_tuple) - if not state: - raise HdfToolException( - 'create drivers file fail "%s" ' % - driver_file_path.split("\\")[-1]) - adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(root, kernel) - if not os.path.exists(adapter_hdf): - raise HdfToolException( - ' adapter model path "%s" not exist' % - adapter_hdf, CommandErrorCode.TARGET_NOT_EXIST) + # create .c template driver file + state, driver_file_path = self._add_driver_handler(*args_tuple) + if not state: + raise HdfToolException( + 'create drivers file fail "%s" ' % + driver_file_path.split("\\")[-1]) + adapter_hdf = hdf_utils.get_vendor_hdf_dir_adapter(root, kernel) + if not os.path.exists(adapter_hdf): + raise HdfToolException( + ' adapter model path "%s" not exist' % + adapter_hdf, CommandErrorCode.TARGET_NOT_EXIST) - # 创建 adapter 路径下的 module 文件夹 - adapter_model_path = os.path.join(adapter_hdf, 'model', module) - if not os.path.exists(adapter_model_path): - os.makedirs(adapter_model_path) + # create module folder under the adapter path + adapter_model_path = os.path.join(adapter_hdf, 'model', module) + if not os.path.exists(adapter_model_path): + os.makedirs(adapter_model_path) - data_model = { - "module_upper_case": converter.upper_case(), - "module_lower_case": converter.lower_case(), - "driver_file_name": ("%s_driver.c" % - driver_name_converter.lower_case()), - "driver_name": driver_name_converter.lower_case() - } - # 创建 adapter 下的 module中的三个文件 - if kernel == 'liteos': - file_path, model_level_config_file_path = \ - self._add_module_handler_liteos( - framework_hdf, adapter_model_path, - data_model, converter, *args_tuple) - elif kernel == "linux": - file_path, model_level_config_file_path = \ - self._add_module_handler_linux( - framework_hdf, adapter_model_path, - data_model, *args_tuple) + data_model = { + "module_upper_case": converter.upper_case(), + "module_lower_case": converter.lower_case(), + "driver_file_name": ("%s_driver.c" % + driver_name_converter.lower_case()), + "driver_name": driver_name_converter.lower_case() + } + + # create files in the module under the adapter + if kernel == 'liteos': + file_path, model_level_config_file_path = \ + self._add_module_handler_liteos( + framework_hdf, adapter_model_path, + data_model, converter, *args_tuple) + + elif kernel == "linux": + file_path, model_level_config_file_path = \ + self._add_module_handler_linux( + framework_hdf, adapter_model_path, + data_model, *args_tuple) + else: + file_path = {} + model_level_config_file_path = {} + config_item = { + 'module_name': module, + 'module_path': file_path, + 'driver_name': "%s_driver.c" % driver, + 'driver_file_path': driver_file_path, + 'enabled': True + } + config_file_out = { + 'module_name': module, + 'module_path': file_path, + 'driver_name': "%s_driver.c" % driver, + 'driver_file_path': driver_file_path, + 'module_level_config_path': model_level_config_file_path + } + config_file = hdf_utils.read_file( + os.path.join('resources', 'create_model.config')) + config_file_json = json.loads(config_file) + config_file_json[module] = config_file_out + if platform.system() == "Windows": + config_file_replace = json.dumps(config_file_json, indent=4).\ + replace(root.replace('\\', '\\\\') + '\\\\', "") + hdf_utils.write_file( + os.path.join('resources', 'create_model.config'), + config_file_replace.replace('\\\\', '/')) + if platform.system() == "Linux": + config_file_replace = json.dumps(config_file_json, indent=4).\ + replace(root + '/', "") + hdf_utils.write_file( + os.path.join('resources', 'create_model.config'), + config_file_replace) + return json.dumps(config_item) else: - file_path = {} - model_level_config_file_path = {} - config_item = { - 'module_name': module, - 'module_path': file_path, - 'driver_name': "%s_driver.c" % driver, - 'driver_file_path': driver_file_path, - 'enabled': True - } - config_file_out = { - 'module_name': module, - 'module_path': file_path, - 'driver_name': driver_file_path.split("\\")[-1], - 'driver_file_path': driver_file_path, - 'module_level_config_path': model_level_config_file_path - } - config_file = hdf_utils.read_file( - os.path.join('resources', 'create_model.config')) - config_file_json = json.loads(config_file) - config_file_json[module] = config_file_out - if platform.system() == "Windows": - config_file_replace = json.dumps(config_file_json, indent=4).\ - replace(root.replace('\\', '\\\\') + '\\\\', "") - hdf_utils.write_file( - os.path.join('resources', 'create_model.config'), - config_file_replace.replace('\\\\', '/')) - if platform.system() == "Linux": - config_file_replace = json.dumps(config_file_json, indent=4).\ - replace(root + '/', "") - hdf_utils.write_file( - os.path.join('resources', 'create_model.config'), - config_file_replace) - return json.dumps(config_item) + raise HdfToolException( + 'supported boards name : %s not exits ' % board) def _add_module_handler_liteos(self, framework_hdf, adapter_model_path, data_model, converter, *args_tuple): @@ -205,8 +213,9 @@ class HdfAddHandler(HdfCommandHandlerBase): liteos_file_path = {} liteos_level_config_file_path = {} liteos_file_name = ['BUILD.gn', 'Kconfig', 'Makefile'] - template_path = "/".join([framework_hdf] + ["tools", - "hdf_dev_eco_tool", "resources", "templates", "lite"]) + template_path = "/".join([framework_hdf] + + ["tools", "hdf_dev_eco_tool", + "resources", "templates", "lite"]) for file_name in liteos_file_name: for i in os.listdir(template_path): if i.find(file_name.split(".")[0]) > 0: @@ -214,29 +223,28 @@ class HdfAddHandler(HdfCommandHandlerBase): self._render(os.path.join(template_path, i), out_path, data_model) liteos_file_path[file_name] = out_path - # 修改 liteos 下的 Kconfig 文件 + + # Modify Kconfig file vendor_k = HdfVendorKconfigFile(root, vendor, kernel, path="") vendor_k_path = vendor_k.add_module([module, 'Kconfig']) liteos_level_config_file_path[module+"_Kconfig"] = vendor_k_path - # 修改 liteos 下的 hdf_lite.mk 文件 + # Modify hdf_lite.mk file vendor_mk = HdfVendorMkFile(root, vendor) vendor_mk_path = vendor_mk.add_module(module) liteos_level_config_file_path[module + "_hdf_lite"] = vendor_mk_path - # 修改 liteos 下的 Build.gn 文件 + # Modify Build.gn file vendor_gn = HdfVendorBuildFile(root, vendor) vendor_gn_path = vendor_gn.add_module(module) liteos_level_config_file_path[module + "Build"] = vendor_gn_path - # 修改 vendor/hisilicon/hispark_taurus/hdf_config/ - # device_info 下的 device_info.hcs 文件 + # Modify config file device_info = HdfDeviceInfoHcsFile( root, vendor, module, board, driver, path="") hcs_file_path = device_info.add_model_hcs_file_config() liteos_file_path["devices_info.hcs"] = hcs_file_path - # 修改 dot_configs 的配置文件 dot_file_list = hdf_utils.get_dot_configs_path(root, vendor, board) template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" new_demo_config = Template(template_string).substitute( @@ -267,24 +275,24 @@ class HdfAddHandler(HdfCommandHandlerBase): self._render(os.path.join(template_path, i), out_path, data_model) linux_file_path[file_name] = out_path - # 修改 linux 下的 Kconfig 文件 + + # Modify Kconfig file vendor_k = HdfVendorKconfigFile(root, vendor, kernel, path="") vendor_k_path = vendor_k.add_module([module, 'Kconfig']) linux_level_config_file_path[module + "_Kconfig"] = vendor_k_path - # 修改 linux 下的 Makefile 文件 + # Modify Makefile file vendor_mk = HdfVendorMakeFile(root, vendor, kernel, path='') vendor_mk_path = vendor_mk.add_module(data_model) linux_level_config_file_path[module + "_Makefile"] = vendor_mk_path - # 修改 vendor/hisilicon/hispark_taurus_linux/ - # hdf_config/device_info 下的 device_info.hcs 文件 + # device_info.hcs device_info = HdfDeviceInfoHcsFile( root, vendor, module, board, driver, path="") hcs_file_path = device_info.add_model_hcs_file_config() linux_file_path["devices_info.hcs"] = hcs_file_path - # 修改 dot_configs 的配置文件 + # dot_configs config file template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" new_demo_config = Template(template_string).substitute(data_model) defconfig_patch = HdfDefconfigAndPatch( diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py index e0d1cdb0c..4e33656f0 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_defconfig_patch.py @@ -66,7 +66,7 @@ class HdfDefconfigAndPatch(object): if not os.path.isdir(new_path): self.find_file(new_path, files) else: - self.add_module(new_path, files=[]) + self.add_module(new_path, files=files) return files def delete_module(self, path): @@ -98,6 +98,7 @@ class HdfDefconfigAndPatch(object): if line.find("CONFIG_DRIVERS_HDF_INPUT=y") >= 0: insert_index = index elif line.find(self.new_demo_config) >= 0: + files.remove(path) state = True if not state: if path.split(".")[-1] != "patch": @@ -108,3 +109,4 @@ class HdfDefconfigAndPatch(object): "+" + self.new_demo_config) with open(path, "w", encoding=codetype) as fwrite: fwrite.writelines(data) + return files diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py index e12ca7798..9309be4b6 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py @@ -35,7 +35,9 @@ import os import json from .hdf_command_handler_base import HdfCommandHandlerBase +from .hdf_linux_scann import HdfLinuxScan from .hdf_lite_mk_file import HdfLiteMkFile +from .hdf_liteos_scann import HdfLiteScan from .hdf_vendor_kconfig_file import HdfVendorKconfigFile from .hdf_module_kconfig_file import HdfModuleKconfigFile from .hdf_driver_config_file import HdfDriverConfigFile @@ -64,6 +66,7 @@ class HdfGetHandler(HdfCommandHandlerBase): 'drv_config_file': self._get_drv_config_file_handler, 'hdf_tool_core_version': self._get_version_handler, 'model_list': self._get_model_dict, + 'model_scan': self._mode_scan, 'version': self.__get_version, } self.parser.add_argument("--action_type", @@ -213,3 +216,13 @@ class HdfGetHandler(HdfCommandHandlerBase): else: model_file_path[key] = path_dict return model_file_path + + def _mode_scan(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("board_name") + root, vendor, _, _, board, _ = self.get_args() + if board.split("_")[-1] != "linux": + return HdfLiteScan(root=root, vendor=vendor, board=board).get_model_scan() + else: + return HdfLinuxScan(root=root, vendor=vendor, board=board).get_model_scan() \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py b/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py new file mode 100755 index 000000000..1033a214f --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +import json +import os +import re + +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfLinuxScan(object): + def __init__(self, root, vendor, board): + self.root = root + self.vendor = vendor + self.board = board + self.kernel = "linux" + + self.Makefile_path = hdf_utils.get_vendor_makefile_path( + root, kernel="linux") + if not os.path.exists(self.Makefile_path): + raise HdfToolException('Makefile: %s not exist' % self.Makefile_path, + CommandErrorCode.TARGET_NOT_EXIST) + + self.framework_dir = hdf_utils.get_module_dir(self.root, vendor) + if not os.path.exists(self.framework_dir): + raise HdfToolException('file: %s not exist' % self.framework_dir, + CommandErrorCode.TARGET_NOT_EXIST) + + self.hcs_path = hdf_utils.get_hcs_file_path( + self.root, self.vendor, self.board) + if not os.path.exists(self.hcs_path): + raise HdfToolException('file: %s not exist' % self.hcs_path, + CommandErrorCode.TARGET_NOT_EXIST) + self.contents = hdf_utils.read_file_lines(self.Makefile_path) + self.re_temp2 = r'model/[a-z 0-9]+' + + def scan_makefile(self): + model_list = [] + for i in self.contents: + result = re.search(self.re_temp2, i) + if result: + model_name = result.group().split('/')[-1] + if model_name not in model_list: + model_list.append(model_name) + return list(set(model_list)) + + def _get_model_file_dict(self): + model_file_dict = {} + for model_name in self.scan_makefile(): + model_file_dict[model_name] = [] + path = os.path.join(self.framework_dir, model_name) + for root_path, dirs, files in os.walk(path): + for file in files: + model_file_dict[model_name].append( + os.path.join(root_path, file)) + return model_file_dict + + def get_model_scan(self): + model_dict = {} + linux_model_info = {} + model_list = self.scan_makefile() + for model_name in model_list: + adapter_model_path = os.path.join( + hdf_utils.get_vendor_hdf_dir_adapter( + self.root, self.kernel), 'model', model_name) + if os.path.exists(adapter_model_path): + model_dict[model_name] = {} + model_config_list = [] + for roots, dirs, files in os.walk(adapter_model_path): + for file in files: + model_config_list.append(os.path.join(roots, file)) + model_dict[model_name]["model_configs"] = model_config_list + model_dict[model_name]['model_drivers'] = \ + self._get_model_file_dict()[model_name] + + linux_model_info["model_dict"] = model_dict + linux_model_info["linux_hcs"] = self.hcs_path + + return json.dumps(linux_model_info, indent=4) \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_liteos_scann.py b/tools/hdf_dev_eco_tool/command_line/hdf_liteos_scann.py new file mode 100755 index 000000000..473a36f57 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_liteos_scann.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +import json +import os +import re + +from .hdf_command_error_code import CommandErrorCode +from hdf_tool_exception import HdfToolException +import hdf_utils + + +class HdfLiteScan(object): + def __init__(self, root, vendor, board): + self.root = root + self.vendor = vendor + self.board = board + + self.build_path = hdf_utils.get_vendor_gn_path(self.root) + if not os.path.exists(self.build_path): + raise HdfToolException('file: %s not exist' % self.build_path, + CommandErrorCode.TARGET_NOT_EXIST) + + self.framework_dir = hdf_utils.get_module_dir(self.root, vendor) + if not os.path.exists(self.framework_dir): + raise HdfToolException('file: %s not exist' % self.framework_dir, + CommandErrorCode.TARGET_NOT_EXIST) + + self.hcs_path = hdf_utils.get_hcs_file_path(self.root, vendor, board) + if not os.path.exists(self.hcs_path): + raise HdfToolException('file: %s not exist' % self.hcs_path, + CommandErrorCode.TARGET_NOT_EXIST) + self.contents = hdf_utils.read_file_lines(self.build_path) + self.re_temp = r"^group" + self.re_temp2 = r'"model/[a-z 0-9]+' + + def scan_build(self): + start_index = 0 + end_index = 0 + state = 0 + for index, line in enumerate(self.contents): + if re.compile(self.re_temp).match(line): + start_index = index + state += 1 + elif line.strip() == "{" and start_index > 0: + state += 1 + elif line.strip() == "}" and start_index > 0: + state -= 1 + if state == 0: + end_index = index + 1 + + model_list = [] + for i in self.contents[start_index: end_index]: + model_name = re.compile(self.re_temp2).match(i.strip()) + if model_name: + model_list.append(model_name.group().split('/')[-1]) + return list(set(model_list)) + + def _get_model_file_dict(self): + model_file_dict = {} + for model_name in self.scan_build(): + model_file_dict[model_name] = [] + path = os.path.join(self.framework_dir, model_name) + for root_path, dirs, files in os.walk(path): + for file in files: + model_file_dict[model_name].append( + os.path.join(root_path, file)) + return model_file_dict + + def get_model_scan(self): + model_dict = {} + liteos_model_info = {} + model_list = self.scan_build() + for model_name in model_list: + adapter_model_path = os.path.join( + hdf_utils.get_vendor_hdf_dir_adapter(root=self.root), + 'model', model_name) + if os.path.exists(adapter_model_path): + model_dict[model_name] = {} + model_config_list = [] + for roots, dirs, files in os.walk(adapter_model_path): + for file in files: + model_config_list.append(os.path.join(roots, file)) + model_dict[model_name]["model_configs"] = model_config_list + model_dict[model_name]['model_drivers'] = \ + self._get_model_file_dict()[model_name] + + liteos_model_info["model_dict"] = model_dict + liteos_model_info["liteos_hcs"] = self.hcs_path + + return json.dumps(liteos_model_info, indent=4) \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py b/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py new file mode 100755 index 000000000..6e5d37e74 --- /dev/null +++ b/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +import os +from string import Template +import hdf_utils + +from .hdf_linux_scann import HdfLinuxScan +from .hdf_liteos_scann import HdfLiteScan + + +class EnableOperation(object): + def __init__(self, root, vendor, board, model): + self.root = root + self.vendor = vendor + self.board = board + self.model = model + self.liteos_model_name = HdfLiteScan(self.root, self.vendor, self.board).scan_build() + self.linux_model_name = HdfLinuxScan(self.root, self.vendor, self.board).scan_makefile() + + def disable_model_liteos(self): + dot_file_list = hdf_utils.get_dot_configs_path(self.root, self.vendor, self.board) + old_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set\n" + new_demo_config = Template(new_template_string).substitute( + {"module_upper_case": self.model.upper()}) + old_demo_config = Template(old_template_string).substitute( + {"module_upper_case": self.model.upper()}) + + if self.model not in self.liteos_model_name: + return False + for dot_file in dot_file_list: + file_lines = hdf_utils.read_file_lines(dot_file) + for index, line in enumerate(file_lines): + if old_demo_config == line.strip(): + file_lines[index] = new_demo_config + hdf_utils.write_file_lines(dot_file, file_lines) + return True + + def enable_model_liteos(self): + dot_file_list = hdf_utils.get_dot_configs_path(self.root, self.vendor, self.board) + new_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set" + new_demo_config = Template(new_template_string).substitute( + {"module_upper_case": self.model.upper()}) + old_demo_config = Template(old_template_string).substitute( + {"module_upper_case": self.model.upper()}) + + if self.model not in self.liteos_model_name: + return False + for dot_file in dot_file_list: + file_lines = hdf_utils.read_file_lines(dot_file) + for index, line in enumerate(file_lines): + if old_demo_config == line.strip(): + file_lines[index] = new_demo_config + hdf_utils.write_file_lines(dot_file, file_lines) + return True + + def operation_enable(self): + if self.board.split("_")[-1] != "linux": + try: + if self.enable_model_liteos(): + return "success(liteos) enable %s" % self.model + else: + return "%s model_name is not liteos type" % self.model + except Exception: + raise "failure(liteos) enable %s" % self.model + + else: + try: + if self.enable_model_linux(): + return "success(linux) enable %s" % self.model + else: + return "%s model_name is not linux type" % self.model + except Exception: + raise "failure(linux) enable %s" % self.model + + def operation_disable(self): + if self.board.split("_")[-1] != "linux": + try: + if self.disable_model_liteos(): + return "success(liteos) disable %s" % self.model + else: + return "%s model_name is not liteos type" % self.model + except Exception: + raise "failure(liteos) disable %s" % self.model + else: + try: + if self.disable_model_linux(): + return "success(linux) enable %s" % self.model + else: + return "%s model_name is not linux type" % self.model + except Exception: + raise "failure(linux) disable %s" % self.model + + def get_config_config(self, kernel): + return os.path.join(self.root, "kernel", kernel, "config") + + def get_config_patch(self, kernel): + return os.path.join(self.root, "kernel", kernel, "patches") + + def _get_file_patch(self, patch, endswitch, split_sign): + file_path = [] + for roots, dirs, files in os.walk(patch): + if endswitch == "defconfig": + files_list = list(filter(lambda x: x.split(split_sign)[-1] == endswitch, files)) + else: + files_list = list(filter(lambda x: x == endswitch, files)) + for file in files_list: + file_path.append(os.path.join(roots, file)) + return file_path + + def _get_config_linux(self): + config_path = self.get_config_config(kernel="linux") + config_path_list = self._get_file_patch(patch=config_path, endswitch="defconfig", split_sign="_") + + patch_path = self.get_config_patch(kernel="linux") + patch_path_list = self._get_file_patch(patch=patch_path, endswitch="hi3516dv300.patch", split_sign=".") + config_path_list.extend(patch_path_list) + + return config_path_list + + def _replace_operation(self, new_string, old_string, file_path): + new_demo_config = Template(new_string).substitute( + {"module_upper_case": self.model.upper()}) + old_demo_config = Template(old_string).substitute( + {"module_upper_case": self.model.upper()}) + + file_lines = hdf_utils.read_file_lines(file_path) + for index, line in enumerate(file_lines): + if old_demo_config == line.strip(): + file_lines[index] = new_demo_config + hdf_utils.write_file_lines(file_path, file_lines) + return True + + def disable_model_linux(self): + if self.model not in self.linux_model_name: + return False + file_path_list = self._get_config_linux() + for file_path in file_path_list: + if file_path.split("_")[-1] == "defconfig": + old_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" + else: + old_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" + self._replace_operation(new_string=new_template_string, old_string=old_template_string, + file_path=file_path) + return True + + def enable_model_linux(self): + if self.model not in self.linux_model_name: + return False + file_path_list = self._get_config_linux() + for file_path in file_path_list: + if file_path.split("_")[-1] == "defconfig": + new_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case} is not set" + else: + new_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set" + self._replace_operation(new_string=new_template_string, old_string=old_template_string, + file_path=file_path) + return True diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py index 5e296978c..a06ff1b46 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py @@ -38,6 +38,7 @@ import argparse from .hdf_command_handler_base import HdfCommandHandlerBase from .hdf_command_error_code import CommandErrorCode from .hdf_dot_config_file import HdfDotConfigFile +from .hdf_model_enable_operation import EnableOperation from .hdf_vendor_kconfig_file import HdfVendorKconfigFile from .hdf_vendor_mk_file import HdfVendorMkFile from .hdf_lite_mk_file import HdfLiteMkFile @@ -60,7 +61,9 @@ class HdfSetHandler(HdfCommandHandlerBase): 'current_vendor': self._set_current_vendor_handler, 'current_board': self._set_current_board_handler, 'vendor_new_name': self._set_vendor_new_name_handler, - 'drivers_state': self._set_drivers_state_handler + 'drivers_state': self._set_drivers_state_handler, + 'model_enable': self._enable_operation, + 'model_disable': self._disable_operation, } self.parser.add_argument("--action_type", help=' '.join(self.handlers.keys()), @@ -68,6 +71,7 @@ class HdfSetHandler(HdfCommandHandlerBase): self.parser.add_argument("--root_dir", required=True) self.parser.add_argument("--vendor_name") self.parser.add_argument("--board_name") + self.parser.add_argument("--module_name") self.parser.add_argument("--new_vendor_name") self.parser.add_argument("--all_drivers", nargs='*', action=ConfigItemsAction) @@ -142,3 +146,19 @@ class HdfSetHandler(HdfCommandHandlerBase): dot_config.save() for orig_dot_config_ in orig_dot_configs: orig_dot_config_.save() + + def _enable_operation(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("board_name") + self.check_arg_raise_if_not_exist("module_name") + root, vendor, model, _, board, _ = self.get_args() + return EnableOperation(root=root, vendor=vendor, board=board, model=model).operation_enable() + + def _disable_operation(self): + self.check_arg_raise_if_not_exist("root_dir") + self.check_arg_raise_if_not_exist("vendor_name") + self.check_arg_raise_if_not_exist("board_name") + self.check_arg_raise_if_not_exist("module_name") + root, vendor, model, _, board, _ = self.get_args() + return EnableOperation(root=root, vendor=vendor, board=board, model=model).operation_disable() \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py index 2359dab2c..a7071413d 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_vendor_kconfig_file.py @@ -91,7 +91,7 @@ class HdfVendorKconfigFile(object): def add_module(self, module_to_k_path_parts): module_k_part = '/'.join(module_to_k_path_parts) - index, line = self._find_line(module_k_part) + index, line = self._find_line("model/"+module_k_part) if line: return line = '\n%s/%s"\n' % (self.line_prefix, module_k_part) diff --git a/tools/hdf_dev_eco_tool/hdf_tool_settings.py b/tools/hdf_dev_eco_tool/hdf_tool_settings.py index d1f72412a..fff1c21a4 100755 --- a/tools/hdf_dev_eco_tool/hdf_tool_settings.py +++ b/tools/hdf_dev_eco_tool/hdf_tool_settings.py @@ -122,3 +122,7 @@ class HdfToolSettings(object): if board_name in self.settings[key]: return self.settings[key][board_name]["patch_and_config"] return '' + + def get_board_list(self): + key = self.supported_boards_key + return list(self.settings[key].keys()) diff --git a/tools/hdf_dev_eco_tool/hdf_utils.py b/tools/hdf_dev_eco_tool/hdf_utils.py index b7efd6473..58c098e4b 100755 --- a/tools/hdf_dev_eco_tool/hdf_utils.py +++ b/tools/hdf_dev_eco_tool/hdf_utils.py @@ -240,7 +240,7 @@ def get_dot_configs_path(root, vendor, board): return [os.path.join(path, i) for i in os.listdir(path)] -def get_module_dir(root, vendor, module): +def get_module_dir(root, vendor, module=""): return os.path.join(get_vendor_hdf_dir_framework(root), 'model', module) diff --git a/tools/hdf_dev_eco_tool/resources/settings.json b/tools/hdf_dev_eco_tool/resources/settings.json index ecbf0e137..c38733ee5 100755 --- a/tools/hdf_dev_eco_tool/resources/settings.json +++ b/tools/hdf_dev_eco_tool/resources/settings.json @@ -10,11 +10,6 @@ "hispark_taurus_linux": { "patch_and_config": ["hi3516dv300.patch", "hi3516dv300_small_defconfig", "hi3516dv300_standard_defconfig", "small_common_defconfig", "standard_common_defconfig"] - }, - "hispark_aries": { - "board_parent_path": "vendor/hisilicon/hispark_aries", - "dot_config_path": "kernel/liteos_a/tools/build/config", - "dot_configs": ["hispark_aries_clang_release.config", "hispark_aries_release.config", "hispark_aries_debug_shell.config"] } }, "drivers_path_relative_to_vendor": "drivers/framework", diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template b/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template index edf95d033..edcb42bc5 100755 --- a/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/device_info_hcs.template @@ -1,15 +1,15 @@ ${model_name} :: host{ - hostName = "${model_name}_host"; - priority = 100; - device_${model_name} :: device { - device0 :: deviceNode { - policy = 2; - priority= 100; - preload = 0; - permission = 0664; - moduleName = "${driver_name}_driver"; - serviceName = "${driver_name}_service"; - deviceMatchAttr = ""; + hostName = "${model_name}_host"; // Host name. The host node is used to store a certain type of drivers. + priority = 100; //Host startup priority (0-200). A larger value indicates a lower priority. The default value 100 is recommended. If the priorities are the same, the host loading sequence is random. + device_${model_name} :: device { // Device node of sample + device0 :: deviceNode { // DeviceNode of the sample driver + policy = 2; // Driver service release policy. For details, see section Driver Service Management. + priority= 100; // Driver startup priority (0-200). A larger value indicates a lower priority. The default value 100 is recommended. If the priorities are the same, the device loading sequence is random. + preload = 0; // On-demand loading of the driver. For details, see "NOTE" at the end of this section. + permission = 0664; // Permission for the driver to create device nodes. + moduleName = "${driver_name}_driver"; // Driver name. The value of this field must be the same as the value of moduleName in the driver entry structure. + serviceName = "${driver_name}_service"; // Name of the service released by the driver. The name must be unique. + deviceMatchAttr = ""; // Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. } } } diff --git a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template index 9d890166d..3ec5439c8 100755 --- a/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template +++ b/tools/hdf_dev_eco_tool/resources/templates/lite/hdf_driver.c.template @@ -1,34 +1,32 @@ -#include "hdf_device_desc.h" // HDF框架对驱动开放相关能力接口的头文件 -#include "hdf_log.h" // HDF 框架提供的日志接口头文件 +#include "hdf_device_desc.h" // Header file that describes the APIs provided by the HDF to the driver. +#include "hdf_log.h" // Header file that describes the log APIs provided by the HDF. -#define HDF_LOG_TAG ${driver_lower_case}_driver // 打印日志所包含的标签,如果不定义则用默认定义的HDF_TAG标签 +#define HDF_LOG_TAG ${driver_lower_case}_driver // Tag contained in logs. If no tag is not specified, the default HDF_TAG is used. -//驱动服务结构的定义 +// The driver service struct definition struct ITestDriverService { - struct IDeviceIoService ioService; // 服务结构的首个成员必须是IDeviceIoService类型的成员 - //以下可添加自定义的驱动的服务接口 + struct IDeviceIoService ioService; // The first member of the service structure must be a member of type IDeviceIoService }; -//驱动对外提供的服务能力,将相关的服务接口绑定到HDF框架 +// The driver service interface must be bound to the HDF for you to use the service capability. static int32_t Hdf${driver_upper_camel_case}DriverBind(struct HdfDeviceObject *deviceObject) { - // deviceObject为HDF框架给每一个驱动创建的设备对象,用来保存设备相关的私有数据和服务接口 HDF_LOGI("${driver_lower_case} driver bind success"); return 0; } -// 驱动自身业务初始的接口 +// Initialize the driver service. static int32_t Hdf${driver_upper_camel_case}DriverInit(struct HdfDeviceObject *deviceObject) { HDF_LOGI("Hello world"); return 0; } -// 驱动资源释放的接口 +// Release the driver resources. static void Hdf${driver_upper_camel_case}DriverRelease(struct HdfDeviceObject *deviceObject) { HDF_LOGI("${driver_lower_case} driver Release success"); return; } -// 定义驱动入口的对象,必须为HdfDriverEntry(在hdf_device_desc.h中定义)类型的全局变量 +// Define the object of the driver entry. The object must be a global variable of the HdfDriverEntry type (defined in hdf_device_desc.h). struct HdfDriverEntry g_${driver_lower_case}DriverEntry = { .moduleVersion = 1, .moduleName = "${driver_lower_case}_driver", @@ -37,5 +35,5 @@ struct HdfDriverEntry g_${driver_lower_case}DriverEntry = { .Release = Hdf${driver_upper_camel_case}DriverRelease, }; -// 调用HDF_INIT将驱动入口注册到HDF框架中,在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动,当Init调用异常时,HDF框架会调用Release释放驱动资源并退出。 +// Call HDF_INIT to register the driver entry with the HDF framework. When loading the driver, call the Bind function and then the Init function. If the Init function fails to be called, the HDF will call Release to release the driver resource and exit. HDF_INIT(g_${driver_lower_case}DriverEntry); -- Gitee From 5d310d397273330bcc244b127c284bb5798e8bfc Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 11 Nov 2021 18:50:55 +0800 Subject: [PATCH 157/272] add hcs macro config Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_macro_cases.c | 393 ++++++++++++++++++ .../hcs_parser/unittest/hcs_macro_cases.h | 39 ++ .../hcs_parser/unittest/hcs_parser_test.c | 15 + .../hcs_parser/unittest/hcs_parser_test.h | 14 + tools/hc-gen/src/macro_gen.cpp | 278 +++++++++++++ tools/hc-gen/src/macro_gen.h | 57 +++ tools/hc-gen/src/main.cpp | 6 + tools/hc-gen/src/option.cpp | 14 +- tools/hc-gen/src/option.h | 3 + tools/hc-gen/test/update_case.py | 29 +- .../test/unittest/common/hdf_config_test.cpp | 183 ++++++++ 11 files changed, 1029 insertions(+), 2 deletions(-) create mode 100755 test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c create mode 100755 test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.h create mode 100755 tools/hc-gen/src/macro_gen.cpp create mode 100755 tools/hc-gen/src/macro_gen.h diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c new file mode 100755 index 000000000..100d5fca0 --- /dev/null +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c @@ -0,0 +1,393 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hcs_config_test.h" +#include "hdf_macro_test.h" +#include "hdf_log.h" +#include "hcs_macro.h" + +#define HDF_LOG_TAG hcs_macro_cases + +#define AUDIO_INFO_NODE_SMARTPA_ADDR 65536 +#define AUDIO_INFO_NODE_SMARTPA_NUM 1 +#define AUDIO_INFO_NODE_BUILDIN_PRIMARY_MIC_EXIST 1 +#define AUDIO_INFO_NODE_BUILDIN_SECOND_MIC_EXIST 1 +#define AUDIO_INFO_NODE_VOICE_LEVEL 256 +#define AUDIO_INFO_NODE_U64_DATA 0x100000000 +#define FP_NODE_U32_IDX_SIZE 3 +#define FP_INFO_NODE_STR_LIST_SIZE 3 +#define DATA_TEST_NODE_FOUR_DATA_SIZE 4 +#define DATA_TEST_NODE_U8_DATA_SIZE 8 +#define DATA_TEST_NODE_U16_DATA_SIZE 8 +#define BOARD_ID_DATA_SIZE 2 +#define MODEM_ID_DATA_SIZE 2 +#define BOARD_ID_VALUE 8000 + +#define CHECK_STRING_EQU(part1, part2) \ + if (strcmp(part1, part2)) { \ + HDF_LOGE("%s %s %d\n", part1, part2, __LINE__); \ + return HDF_FAILURE; \ + } + +#define CHECK_INT_EQU(part1, part2) \ + if (part1 != part2) { \ + HDF_LOGE("%d\n", __LINE__); \ + return HDF_FAILURE; \ + } + +#define fp_child_deal(node) \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].child.status); + +#define fp_deal(node) \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ + node##_foreach_child(fp_child_deal); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ + index++; + +#define fp_deal_(node) fp_deal(node) + +#define fp_child_deal_vargs(node, fpArgs, idx) \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].child.status); + +#define fp_deal_vargs(node, fpArgs, idx) \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ + node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ + idx++; + +#define fp_deal_vargs_(node, fpArgs, idx) fp_deal_vargs(node, fpArgs, idx) + +struct oneChild { + const char *status; +}; +struct fingerprint { + const char *product; + const char *chip; + struct oneChild child; + const char *status; +}; + +#define AUDIO_INFO_NODE HCS_NODE(HCS_ROOT, audio_info) +#define FP_INFO_NODE HCS_NODE(HCS_ROOT, fingerprint_info) +#define FP_INFO_ONE_NODE HCS_NODE(FP_INFO_NODE, fingerprint_one) +#define FP_INFO_TWO_NODE HCS_NODE(FP_INFO_NODE, fingerprint_two) +#define DATA_TYPE_TEST_NODE HCS_NODE(HCS_ROOT, data_type_test) +#define FP_INFO_THREE_NODE HCS_NODE(HCS_ROOT, fingerprint_three) +#define FP_INFO_AUDIO_NODE HCS_NODE(FP_INFO_NODE, audio_info) + +static struct fingerprint fpData[] = { + { "test", "one", { "ok" }, "ok" }, + { "test", "two", { "ok" }, "disable" }, + { "test", "three", { "ok" }, "disable" } +}; + +static int TraversalInfoReadU32(void) +{ + const uint32_t infoReadU32[] = { 1, 256, 65536 }; + const uint32_t infoReadU32Gen[] = HCS_ARRAYS(HCS_NODE(FP_INFO_NODE, read_u32_index)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(FP_INFO_NODE, read_u32_index)); i++) { + CHECK_INT_EQU(infoReadU32Gen[i], infoReadU32[i]); + } + + return HDF_SUCCESS; +} + +static int TraversalStringListNames(void) +{ + const char *stringListNames[] = {"first", "second", "third"}; + const char *stringListNamesGen[] = HCS_ARRAYS(HCS_NODE(FP_INFO_NODE, string_list_names)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(FP_INFO_NODE, string_list_names)); i++) { + CHECK_STRING_EQU(stringListNamesGen[i], stringListNames[i]); + } + + return HDF_SUCCESS; +} + +static int TraversalReadFourDatas(void) +{ + const uint64_t readFourDatas[] = { 0x1, 0x100, 0x10000, 0x100000000 }; + const uint64_t readFourDatasGen[] = HCS_ARRAYS(HCS_NODE(DATA_TYPE_TEST_NODE, read_four_data_type)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, read_four_data_type)); i++) { + CHECK_INT_EQU(readFourDatasGen[i], readFourDatas[i]); + } + + return HDF_SUCCESS; +} + +static int TraversalTestU8ElemData(void) +{ + const uint8_t testU8ElemData[] = { 0, 1, 2, 3, 4, 5, 6, 7 }; + const uint8_t testU8ElemDataGen[] = HCS_ARRAYS(HCS_NODE(DATA_TYPE_TEST_NODE, test_u8_elem_data)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, test_u8_elem_data)); i++) { + CHECK_INT_EQU(testU8ElemDataGen[i], testU8ElemData[i]); + } + + return HDF_SUCCESS; +} +static int TraversalTestU16ElemData(void) +{ + const uint16_t testU16ElemData[] = { 0, 1, 2, 3, 4, 5, 256, 257 }; + const uint16_t testU16ElemDataGen[] = HCS_ARRAYS(HCS_NODE(DATA_TYPE_TEST_NODE, test_u16_elem_data)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, test_u16_elem_data)); i++) { + CHECK_INT_EQU(testU16ElemDataGen[i], testU16ElemData[i]); + } + + return HDF_SUCCESS; +} +static int TraversalBoardId(void) +{ + const uint32_t boardId[] = { 65536, 256 }; + const uint32_t boardIdGen[] = HCS_ARRAYS(HCS_NODE(HCS_ROOT, board_id)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(HCS_ROOT, board_id)); i++) { + CHECK_INT_EQU(boardIdGen[i], boardId[i]); + } + + return HDF_SUCCESS; +} +static int TraversalModemId(void) +{ + const uint32_t modemId[] = { 0xF6B40136, 0x0 }; + const uint32_t modemIdGen[] = HCS_ARRAYS(HCS_NODE(HCS_ROOT, modem_id)); + int i; + + for (i = 0; i < HCS_ARRAYS_SIZE(HCS_NODE(HCS_ROOT, modem_id)); i++) { + CHECK_INT_EQU(modemIdGen[i], modemId[i]); + } + + return HDF_SUCCESS; +} + +static int TraversalAudio(void) +{ + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, match_attr), "hw,hw_audio_info"); + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, pa_identifier), "smartpakit"); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, smartpa_addr), AUDIO_INFO_NODE_SMARTPA_ADDR); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, smartpa_num), AUDIO_INFO_NODE_SMARTPA_NUM); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, builtin_primary_mic_exist), AUDIO_INFO_NODE_BUILDIN_PRIMARY_MIC_EXIST); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, builtin_second_mic_exist), AUDIO_INFO_NODE_BUILDIN_SECOND_MIC_EXIST); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, voice_vol_level), AUDIO_INFO_NODE_VOICE_LEVEL); + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, cust_name), "audio_custom_v2"); + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, dual_smartpa_delay), "true"); + CHECK_INT_EQU(HCS_PROP(AUDIO_INFO_NODE, read_u64data), AUDIO_INFO_NODE_U64_DATA); + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, status), "ok"); + + return HDF_SUCCESS; +} + +static int TraversalFPFingerInfo(void) +{ + int index = 0; + fp_deal_(HCS_NODE(FP_INFO_NODE, finger_info)); + return HDF_SUCCESS; +} + +static int TraversalFPAudio(void) +{ + CHECK_STRING_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, match_attr), "hw,hw_audio_info"); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, pa_identifier), "smartpakit"); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, smartpa_addr), AUDIO_INFO_NODE_SMARTPA_ADDR); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, smartpa_num), AUDIO_INFO_NODE_SMARTPA_NUM); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, builtin_primary_mic_exist), AUDIO_INFO_NODE_BUILDIN_PRIMARY_MIC_EXIST); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, builtin_second_mic_exist), AUDIO_INFO_NODE_BUILDIN_SECOND_MIC_EXIST); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, voice_vol_level), AUDIO_INFO_NODE_VOICE_LEVEL); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, cust_name), "audio_custom_v2"); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, dual_smartpa_delay), "true"); + CHECK_INT_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, read_u64data), AUDIO_INFO_NODE_U64_DATA); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_AUDIO_NODE, status), "ok"); + return HDF_SUCCESS; +} + +static int TraversalFPOne(void) +{ + int index = 0; + fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_one)); + index = 0; + fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_one), fpData, index); + return HDF_SUCCESS; +} + +static int TraversalFPTwo(void) +{ + int index = 1; + fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_two)); + index = 1; + fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_two), fpData, index); + return HDF_SUCCESS; +} + +static int TraversalPringerprintThree(void) +{ + int index = 2; + fp_deal_(HCS_NODE(HCS_ROOT, fingerprint_three)); + index = 2; + fp_deal_vargs_(HCS_NODE(HCS_ROOT, fingerprint_three), fpData, index); + return HDF_SUCCESS; +} + +static int TraversalFPInfo(void) +{ + CHECK_STRING_EQU(HCS_PROP(FP_INFO_NODE, match_attr), "hw,hw_fingerprint_info"); + CHECK_INT_EQU(TraversalInfoReadU32(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalFPFingerInfo(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalFPAudio(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalFPOne(), HDF_SUCCESS); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_NODE, dual_fingerprint), "false"); + CHECK_INT_EQU(TraversalFPTwo(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalStringListNames(), HDF_SUCCESS); + CHECK_STRING_EQU(HCS_PROP(FP_INFO_NODE, status), "ok"); + + return HDF_SUCCESS; +} + +static int TraversalDataTypeTest(void) +{ + CHECK_STRING_EQU(HCS_PROP(DATA_TYPE_TEST_NODE, match_attr), "hw,data_type_test"); + CHECK_INT_EQU(TraversalReadFourDatas(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalTestU8ElemData(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalTestU16ElemData(), HDF_SUCCESS); + return HDF_SUCCESS; +} + +int HcsMacroGetOneNode(void) +{ + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, match_attr), "hw,hw_audio_info"); + return HDF_SUCCESS; +} + +int HcsMacroCheckNodeExists(void) +{ +#if HCS_NODE_EXISTS(AUDIO_INFO_NODE) + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, match_attr), "hw,hw_audio_info"); + return HDF_SUCCESS; +#else + return HDF_FAILURE; +#endif +} + +int HcsMacroCheckNodeNotExists(void) +{ +#if HCS_NODE_EXISTS(HCS_NODE(AUDIO_INFO_NODE, node_not_exists)) + return HDF_FAILURE; +#else + return HDF_SUCCESS; +#endif +} + +int HcsMacroCheckPropExists(void) +{ +#if HCS_NODE_HAS_PROP(AUDIO_INFO_NODE, match_attr) + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, match_attr), "hw,hw_audio_info"); + return HDF_SUCCESS; +#else + return HDF_FAILURE; +#endif +} + +int HcsMacroCheckPropNotExists(void) +{ +#if HCS_NODE_HAS_PROP(AUDIO_INFO_NODE, prop_not_exists) + return HDF_FAILURE; +#else + return HDF_SUCCESS; +#endif +} + +int HcsMacroGetOneNodeProp(void) +{ + CHECK_STRING_EQU(HCS_PROP(AUDIO_INFO_NODE, pa_identifier), "smartpakit"); + return HDF_SUCCESS; +} + +int HcsMacroTraversalOneNode(void) +{ + return TraversalAudio(); +} + +int HcsMacroGetArraySize(void) +{ + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(FP_INFO_NODE, read_u32_index)), FP_NODE_U32_IDX_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(FP_INFO_NODE, string_list_names)), FP_INFO_NODE_STR_LIST_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, read_four_data_type)), DATA_TEST_NODE_FOUR_DATA_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, test_u8_elem_data)), DATA_TEST_NODE_U8_DATA_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(DATA_TYPE_TEST_NODE, test_u16_elem_data)), DATA_TEST_NODE_U16_DATA_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(HCS_ROOT, board_id)), BOARD_ID_DATA_SIZE); + CHECK_INT_EQU(HCS_ARRAYS_SIZE(HCS_NODE(HCS_ROOT, modem_id)), MODEM_ID_DATA_SIZE); + return HDF_SUCCESS; +} + +int HcsMacroGetArrayElement(void) +{ + const uint32_t infoReadU32[] = { 1, 256, 65536 }; + const uint32_t infoReadU32Gen[] = HCS_ARRAYS(HCS_NODE(FP_INFO_NODE, read_u32_index)); + + CHECK_INT_EQU(infoReadU32Gen[0], infoReadU32[0]); + + return HDF_SUCCESS; +} + +int HcsMacroTraversalOneArray(void) +{ + return TraversalInfoReadU32(); +} + +int HcsMacroTraversalAllArray(void) +{ + CHECK_INT_EQU(TraversalInfoReadU32(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalStringListNames(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalReadFourDatas(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalTestU8ElemData(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalTestU16ElemData(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalBoardId(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalModemId(), HDF_SUCCESS); + return HDF_SUCCESS; +} + +int HcsMacroTraversalOneNodeChild(void) +{ + int index = 0; + + HCS_FOREACH_CHILD(FP_INFO_NODE, fp_deal); + return HDF_SUCCESS; +} + +int HcsMacroTraversalOneNodeChildVargs(void) +{ + int index = 0; + + HCS_FOREACH_CHILD_VARGS(FP_INFO_NODE, fp_deal_vargs, fpData, index); + return HDF_SUCCESS; +} + +int HcsMacroGetOneFile(void) +{ + CHECK_STRING_EQU(HCS_PROP(HCS_ROOT, match_attr), "test,config"); + CHECK_INT_EQU(TraversalAudio(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalFPInfo(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalDataTypeTest(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalBoardId(), HDF_SUCCESS); + CHECK_STRING_EQU(HCS_PROP(HCS_ROOT, support_Device), "TP LCD Sensor"); + CHECK_INT_EQU(TraversalPringerprintThree(), HDF_SUCCESS); + CHECK_INT_EQU(TraversalModemId(), HDF_SUCCESS); + CHECK_INT_EQU(HCS_PROP(HCS_ROOT, boardId), BOARD_ID_VALUE); + + return HDF_SUCCESS; +} diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.h b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.h new file mode 100755 index 000000000..e6f20857e --- /dev/null +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HCS_MACRO_CASES_H +#define HCS_MACRO_CASES_H + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +int HcsMacroGetOneNode(void); +int HcsMacroCheckNodeExists(void); +int HcsMacroCheckNodeNotExists(void); +int HcsMacroCheckPropExists(void); +int HcsMacroCheckPropNotExists(void); +int HcsMacroGetOneNodeProp(void); +int HcsMacroTraversalOneNode(void); +int HcsMacroGetArraySize(void); +int HcsMacroGetArrayElement(void); +int HcsMacroTraversalOneArray(void); +int HcsMacroTraversalAllArray(void); +int HcsMacroTraversalOneNodeChild(void); +int HcsMacroTraversalOneNodeChildVargs(void); +int HcsMacroGetOneFile(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* HCS_MACRO_CASES_H */ diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c index c08aa37e2..75043da26 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c @@ -8,6 +8,7 @@ #include "hcs_parser_test.h" #include "hcs_config_test.h" +#include "hcs_macro_cases.h" // add test case entry HdfTestCaseList g_hdfConfigTestCaseList[] = { @@ -52,6 +53,20 @@ HdfTestCaseList g_hdfConfigTestCaseList[] = { { HDF_GET_STRING_ARRAY_ELEM_ATTR_VALUE_002, HcsTestGetStringArrayElemFail }, { HDF_GET_NODE_BY_ATTR_REF_001, HcsTestGetNodeAttrRefSuccess }, { HDF_GET_NODE_BY_ATTR_REF_002, HcsTestGetNodeAttrRefFail }, + { HDF_MACRO_GET_ONE_NODE, HcsMacroGetOneNode }, + { HDF_MACRO_CHECK_NODE_EXISTS, HcsMacroCheckNodeExists }, + { HDF_MACRO_CHECK_NODE_NOT_EXISTS, HcsMacroCheckNodeNotExists }, + { HDF_MACRO_GET_ONE_NODE_PROP, HcsMacroCheckPropExists }, + { HDF_MACRO_CHECK_NODE_PROP_EXISTS, HcsMacroCheckPropNotExists }, + { HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, HcsMacroGetOneNodeProp }, + { HDF_MACRO_TRAVERSAL_ONE_NODE, HcsMacroTraversalOneNode }, + { HDF_MACRO_GET_ARRAY_SIZE, HcsMacroGetArraySize }, + { HDF_MACRO_GET_ONE_ARRAY_ELEMENT, HcsMacroGetArrayElement }, + { HDF_MACRO_TRAVERSAL_ONE_ARRAY, HcsMacroTraversalOneArray }, + { HDF_MACRO_TRAVERSAL_ALL_ARRAY, HcsMacroTraversalAllArray }, + { HDF_MACRO_TRAVERSAL_NODE_CHILD, HcsMacroTraversalOneNodeChild }, + { HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, HcsMacroTraversalOneNodeChildVargs }, + { HDF_MACRO_GET_ONE_FILE, HcsMacroGetOneFile }, }; int32_t HdfConfigEntry(HdfTestMsg *msg) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h index da78c08b8..aeee6d02e 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h @@ -53,6 +53,20 @@ enum HdfConfigTestCaseCmd { HDF_GET_STRING_ARRAY_ELEM_ATTR_VALUE_002, HDF_GET_NODE_BY_ATTR_REF_001, HDF_GET_NODE_BY_ATTR_REF_002, + HDF_MACRO_GET_ONE_NODE, + HDF_MACRO_CHECK_NODE_EXISTS, + HDF_MACRO_CHECK_NODE_NOT_EXISTS, + HDF_MACRO_GET_ONE_NODE_PROP, + HDF_MACRO_CHECK_NODE_PROP_EXISTS, + HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, + HDF_MACRO_TRAVERSAL_ONE_NODE, + HDF_MACRO_GET_ARRAY_SIZE, + HDF_MACRO_GET_ONE_ARRAY_ELEMENT, + HDF_MACRO_TRAVERSAL_ONE_ARRAY, + HDF_MACRO_TRAVERSAL_ALL_ARRAY, + HDF_MACRO_TRAVERSAL_NODE_CHILD, + HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, + HDF_MACRO_GET_ONE_FILE, }; int32_t HdfConfigEntry(HdfTestMsg *msg); diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp new file mode 100755 index 000000000..650b400e5 --- /dev/null +++ b/tools/hc-gen/src/macro_gen.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "macro_gen.h" +#include +#include "file.h" +#include "logger.h" + +using namespace OHOS::Hardware; + +constexpr static const char *FILE_HEAD_COMMENT = \ + "/*\n" \ + " * This is an automatically generated HDF config file. Do not modify it manually.\n" \ + " */\n\n"; + +MacroGen::MacroGen(std::shared_ptr ast) : Generator(ast) +{ +} + +const std::string &MacroGen::ToUpperString(std::string &str) +{ + for (char &c : str) { + c = static_cast(toupper(c)); + } + + return str; +} + +bool MacroGen::HeaderTopOutput() +{ + ofs_ << FILE_HEAD_COMMENT; + std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << "#ifndef " << headerMacro << '\n'; + ofs_ << "#define " << headerMacro << '\n'; + ofs_ << "\r\n#include \"hdf_base.h\"\n"; + + return true; +} + +bool MacroGen::HeaderBottomOutput() +{ + std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << "\n#endif // " << headerMacro << '\n'; + ofs_.close(); + return true; +} + +bool MacroGen::Output() +{ + if (!Initialize()) { + return false; + } + if (!TemplateNodeSeparate()) { + return false; + } + if (!HeaderTopOutput()) { + return false; + } + + if (!NodeWalk()) { + return false; + } + if (!HeaderBottomOutput()) { + return false; + } + return true; +} + +bool MacroGen::Initialize() +{ + auto opt = Option::Instance(); + std::string outFileName = Option::Instance().GetOutputName(); + if (outFileName.empty()) { + outFileName = Option::Instance().GetSourceNameBase(); + } + outFileName = Util::File::StripSuffix(outFileName).append(".h"); + outFileName_ = Util::File::FileNameBase(outFileName); + if (outFileName.find(".h") == std::string::npos) { + outFileName.append(".h"); + } + + ofs_.open(outFileName, std::ofstream::out | std::ofstream::binary); + if (!ofs_.is_open()) { + Logger().Error() << "failed to open output file: " << outFileName; + return false; + } + Logger().Debug() << "output: " << outFileName << outFileName_ << '\n'; + + return true; +} + +bool MacroGen::TemplateNodeSeparate() +{ + return ast_->WalkBackward([this](std::shared_ptr &object, uint32_t depth) { + if (object->IsNode() && ConfigNode::CastFrom(object)->GetNodeType() == NODE_TEMPLATE) { + object->Separate(); + return NOERR; + } + return NOERR; + }); +} + +std::string MacroGen::GenFullName(uint32_t depth, const std::shared_ptr &node, const std::string &sep) +{ + std::string name; + for (int i = 0; i < depth; i++) { + name.append(nodeNameMap_[i]).append(sep); + } + name.append(node->Name()); + return name; +} + +bool MacroGen::GenArray(const std::string &arrName, uint32_t &arrSize, uint32_t type, const std::shared_ptr &node) +{ + static uint32_t index = 0; + std::string tmp(arrName); + const uint32_t ELEMENT_PER_LINE = 8; + + if (index == 0) { + ofs_ << "#define " << tmp.append("_data {"); + } + + if (index % ELEMENT_PER_LINE == 0) { + ofs_ << " \\\n "; + } + + if (type == PARSEROP_STRING) { + ofs_ << '"' << node->StringValue() << '"'; + } else { + ofs_ << node->IntegerValue(); + } + + index++; + if (index == arrSize) { + index = 0; + arrSize = 0; + ofs_ << " \\\n}\n"; + } else { + if (index % ELEMENT_PER_LINE == 0) { + ofs_ << ","; + } else { + ofs_ << ", "; + } + } + + return true; +} + +bool MacroGen::GenNodeForeach(uint32_t depth, const std::shared_ptr &node) +{ + std::list subList; + auto child = node->Child(); + uint32_t count = 0; + + Logger().Debug() << "node:" << node->Name() << " child:" << " depth:" << depth; + while (child != nullptr) { + if (child->IsNode()) { + Logger().Debug() << " " << child->Name(); + subList.push_back(GenFullName(depth + 1, child, "_")); + count++; + } + child = child->Next(); + } + + ofs_ << "// hcs node macros: " << GenFullName(depth, node, "/") << std::endl; + ofs_ << "#define " << GenFullName(depth, node, "_").append("_exists 1") << std::endl; + if (count) { + uint32_t index = count; + std::list::iterator iter; + + ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child(func)") << " \\\n"; + for (iter = subList.begin(); iter != subList.end(); iter++) { + index--; + if (index) { + ofs_ << " " << "func(" << *iter << ") \\\n"; + } else { + ofs_ << " " << "func(" << *iter << ")\n"; + } + } + ofs_ << std::endl; + + index = count; + ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child_vargs(func, ...)") << " \\\n"; + for (iter = subList.begin(); iter != subList.end(); iter++) { + index--; + if (index) { + ofs_ << " " << "func(" << *iter << ", __VA_ARGS__) \\\n"; + } else { + ofs_ << " " << "func(" << *iter << ", __VA_ARGS__)\n"; + } + } + ofs_ << std::endl; + } + + return true; +} + +std::string MacroGen::GenRefObjName(uint32_t depth, const std::shared_ptr &object) +{ + std::string name(object->StringValue()); + if (name.find(".") == std::string::npos) { + name = GenFullName(depth - 1, object, "_").append(object->StringValue()); + } else { + for (char &c : name) { + if (c == '.') { + c = '_'; + } + } + } + return name; +} + +bool MacroGen::NodeWalk() +{ + return ast_->WalkForward([this](std::shared_ptr ¤t, uint32_t depth) { + auto type = current->Type(); + static std::string nodeName; + static std::string arrayName; + static uint32_t arraySize = 0; + static uint32_t arrayType = 0; + + Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth << " arraySize:" << std::dec << arraySize << '\n'; + switch (type) { + case PARSEROP_UINT8: + case PARSEROP_UINT16: + case PARSEROP_UINT32: + case PARSEROP_UINT64: { + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << current->IntegerValue() << std::endl; + } + break; + } + case PARSEROP_STRING: + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << '"' << current->StringValue() << '"' << std::endl; + } + break; + case PARSEROP_CONFTERM: + ofs_ << "#define " << GenFullName(depth, current, "_") << "_exists 1" << std::endl; + ofs_ << "#define " << GenFullName(depth, current, "_"); + break; + case PARSEROP_CONFNODE: { + if (nodeName != current->Name()) { + ofs_ << std::endl; + } + nodeName = current->Name(); + nodeNameMap_[depth] = nodeName; + GenNodeForeach(depth, current); + break; + } + case PARSEROP_ARRAY: { + std::shared_ptr parent(current->Parent()); + arraySize = ConfigArray::CastFrom(current)->ArraySize(); + arrayType = ConfigArray::CastFrom(current)->ArrayType(); + ofs_ << "_array_size " << arraySize << std::endl; + arrayName = GenFullName(depth - 1, parent, "_"); + break; + } + case PARSEROP_NODEREF: { + ofs_ << " " << GenRefObjName(depth, current) << std::endl; + break; + } + default: + break; + } + + return NOERR; + }); +} diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h new file mode 100755 index 000000000..38fc1591a --- /dev/null +++ b/tools/hc-gen/src/macro_gen.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + + +#ifndef HC_GEN_MACRO_GEN_H +#define HC_GEN_MACRO_GEN_H + +#include +#include "generator.h" +#include + +namespace OHOS { +namespace Hardware { + +class MacroGen : public Generator { +public: + explicit MacroGen(std::shared_ptr ast); + + ~MacroGen() override = default; + + bool Output() override; + +private: + bool Initialize(); + + bool TemplateNodeSeparate(); + + std::string GenFullName(uint32_t depth, const std::shared_ptr &node, const std::string &sep); + + bool GenNodeForeach(uint32_t depth, const std::shared_ptr &node); + + bool NodeWalk(); + + bool HeaderTopOutput(); + + bool HeaderBottomOutput(); + + const std::string &ToUpperString(std::string &str); + + bool GenArray(const std::string &name, uint32_t &arrSize, uint32_t type, const std::shared_ptr &node); + + std::string GenRefObjName(uint32_t depth, const std::shared_ptr &object); + + const std::string &TypeToStr(uint32_t type); + + std::ofstream ofs_; + std::string outFileName_; + std::map nodeNameMap_; +}; +} // Hardware +} // OHOS +#endif // HC_GEN_MACRO_GEN_H diff --git a/tools/hc-gen/src/main.cpp b/tools/hc-gen/src/main.cpp index 6e994a4ac..f35979eef 100644 --- a/tools/hc-gen/src/main.cpp +++ b/tools/hc-gen/src/main.cpp @@ -8,6 +8,7 @@ #include "bytecode_gen.h" #include "decompile.h" +#include "macro_gen.h" #include "option.h" #include "parser.h" #include "text_gen.h" @@ -53,6 +54,11 @@ int main(int argc, char *argv[]) return EFAIL; } } + if (option.ShouldGenMacroConfig()) { + if (!MacroGen(parser.GetAst()).Output()) { + return EFAIL; + } + } return 0; } diff --git a/tools/hc-gen/src/option.cpp b/tools/hc-gen/src/option.cpp index 148644ab3..88576278a 100644 --- a/tools/hc-gen/src/option.cpp +++ b/tools/hc-gen/src/option.cpp @@ -27,7 +27,7 @@ Option &Option::Instance() } static constexpr int OPTION_END = -1; -static constexpr const char *HCS_SUPPORT_ARGS = "o:ap:bditvVh"; +static constexpr const char *HCS_SUPPORT_ARGS = "o:ap:bditmvVh"; Option &Option::Parse(int argc, char **argv) { @@ -71,6 +71,12 @@ bool Option::ParseOptions(int argc, char **argv) case 't': shouldGenTextConfig_ = true; shouldGenByteCodeConfig_ = false; + shouldGenMacroConfig_ = false; + break; + case 'm': + shouldGenTextConfig_ = false; + shouldGenByteCodeConfig_ = false; + shouldGenMacroConfig_ = true; break; case 'p': symbolNamePrefix_ = optarg; @@ -111,6 +117,7 @@ void Option::ShowUsage() ShowOption("-a", "hcb align with four bytes"); ShowOption("-b", "output binary output, default enable"); ShowOption("-t", "output config in C language source file style"); + ShowOption("-m", "output config in macro file style"); ShowOption("-i", "output binary hex dump in C language source file style"); ShowOption("-p ", "prefix of generated symbol name"); ShowOption("-d", "decompile hcb to hcs"); @@ -155,6 +162,11 @@ bool Option::ShouldGenTextConfig() const return shouldGenTextConfig_; } +bool Option::ShouldGenMacroConfig() const +{ + return shouldGenMacroConfig_; +} + bool Option::ShouldGenBinaryConfig() const { return shouldGenByteCodeConfig_; diff --git a/tools/hc-gen/src/option.h b/tools/hc-gen/src/option.h index de7389be1..8a4522dc9 100644 --- a/tools/hc-gen/src/option.h +++ b/tools/hc-gen/src/option.h @@ -39,6 +39,8 @@ public: bool ShouldGenTextConfig() const; + bool ShouldGenMacroConfig() const; + bool ShouldGenBinaryConfig() const; bool ShouldGenHexDump() const; @@ -70,6 +72,7 @@ private: bool showVersion_ = false; bool shouldAlign_ = false; bool shouldGenTextConfig_ = false; + bool shouldGenMacroConfig_ = false; bool shouldGenByteCodeConfig_ = true; bool showGenHexDump_ = false; bool shouldDecompile_ = false; diff --git a/tools/hc-gen/test/update_case.py b/tools/hc-gen/test/update_case.py index 292ee0ab8..bbfee99e1 100755 --- a/tools/hc-gen/test/update_case.py +++ b/tools/hc-gen/test/update_case.py @@ -169,6 +169,32 @@ def build_text(hcgen_path, case_name): os.rename(target_file + '.h', target_file + '.h.gen') return True +def build_macro(hcgen_path, case_name): + source_file = os.path.join(WORK_DIR, case_name, 'case.hcs') + target_file = os.path.join(WORK_DIR, case_name, 'macro') + command = "%s -m -o %s %s" % (hcgen_path, target_file, source_file) + status, output = subprocess.getstatusoutput(command) + if case_name.endswith('_ei'): + if status == 0: + print("CASE_ERROR:error identify case " + + case_name + " expect build fail but success at macro mode") + print(output) + return False + elif status != 0: + print("CASE_ERROR:case " + case_name + + " expect build success but failed at macro mode") + print(output) + return False + output = output.replace(WORK_DIR, ".").replace('\\', '/') \ + .replace(ERROR_COLOR_PREFIX, "") \ + .replace(ERROR_COLOR_END, "").strip() + + save_compile_result('macro', case_name, status, output) + + if status == 0: + os.rename(target_file + '.h', target_file + '.h.gen') + return True + def build_cases(hcgen_path, cases): index = 1 @@ -177,7 +203,8 @@ def build_cases(hcgen_path, cases): print('[%02d/%d] build %s' % (index, len(cases), case)) text_compile = build_text(hcgen_path, case) binary_compile = build_binary(hcgen_path, case) - if not text_compile or not binary_compile: + macro_compile = build_macro(hcgen_path, case) + if not text_compile or not binary_compile or not macro_compile: failed_cases.append(case) index += 1 diff --git a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp index 75f6541c1..1a5df911c 100644 --- a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp +++ b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp @@ -64,6 +64,20 @@ enum HdfTestCaseCmd { HDF_GET_STRING_ARRAY_ELEM_ATTR_VALUE_002, HDF_GET_NODE_BY_ATTR_REF_001, HDF_GET_NODE_BY_ATTR_REF_002, + HDF_MACRO_GET_ONE_NODE, + HDF_MACRO_CHECK_NODE_EXISTS, + HDF_MACRO_CHECK_NODE_NOT_EXISTS, + HDF_MACRO_GET_ONE_NODE_PROP, + HDF_MACRO_CHECK_NODE_PROP_EXISTS, + HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, + HDF_MACRO_TRAVERSAL_ONE_NODE, + HDF_MACRO_GET_ARRAY_SIZE, + HDF_MACRO_GET_ONE_ARRAY_ELEMENT, + HDF_MACRO_TRAVERSAL_ONE_ARRAY, + HDF_MACRO_TRAVERSAL_ALL_ARRAY, + HDF_MACRO_TRAVERSAL_NODE_CHILD, + HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, + HDF_MACRO_GET_ONE_FILE, }; class HdfConfigTest : public testing::Test { @@ -582,7 +596,176 @@ HWTEST_F(HdfConfigTest, HslTestGetNodeAttrRefSuccess001, TestSize.Level1) HWTEST_F(HdfConfigTest, HslTestGetNodeAttrRefFail001, TestSize.Level1) { struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_GET_NODE_BY_ATTR_REF_002, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_GET_ONE_NODE test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroGetOneNode, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_GET_ONE_NODE, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_CHECK_NODE_EXISTS test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroCheckNodeExists, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_CHECK_NODE_EXISTS, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_CHECK_NODE_NOT_EXISTS test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroCheckNodeNotExists, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_CHECK_NODE_NOT_EXISTS, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_GET_ONE_NODE_PROP test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroGetOneNodeProp, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_GET_ONE_NODE_PROP, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_CHECK_NODE_PROP_EXISTS test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroCheckNodePropExists, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_CHECK_NODE_PROP_EXISTS, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroCheckNodePropNotExists, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_TRAVERSAL_ONE_NODE test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalOneNode, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_TRAVERSAL_ONE_NODE, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_GET_ARRAY_SIZE test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroGetArraySize, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_GET_ARRAY_SIZE, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_GET_ONE_ARRAY_ELEMENT test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroGetOneArrayElevent, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_GET_ONE_ARRAY_ELEMENT, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_TRAVERSAL_ONE_ARRAY test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalOneArray, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_TRAVERSAL_ONE_ARRAY, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_TRAVERSAL_ALL_ARRAY test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalAllArray, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_TRAVERSAL_ALL_ARRAY, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_TRAVERSAL_NODE_CHILD test + * @tc.type: FUNC + * @tc.require: AR000GGTQK + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalNodeChild, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_TRAVERSAL_NODE_CHILD, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS test + * @tc.type: FUNC + * @tc.require: SR000GGTQI + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalNodeChildVargs, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, HDF_MSG_RESULT_DEFAULT}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: HslTestMacroGetOneNode + * @tc.desc: HDF_MACRO_GET_ONE_FILE test + * @tc.type: FUNC + * @tc.require: SR000GGTQI + */ +HWTEST_F(HdfConfigTest, HslTestMacroTraversalOneFile, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_CONFIG_TYPE, HDF_MACRO_GET_ONE_FILE, HDF_MSG_RESULT_DEFAULT}; printf("HdfConfigTest last enter\n\r"); EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } + }; -- Gitee From 0f921e188a8c0ef922404f9ee00ccbfdaa79775e Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 11 Nov 2021 19:06:20 +0800 Subject: [PATCH 158/272] add hcs macro config Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_parser_test.c | 26 +- .../hcs_parser/unittest/hcs_parser_test.h | 2 +- tools/hc-gen/src/macro_gen.cpp | 234 +++++++++--------- 3 files changed, 131 insertions(+), 131 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c index 75043da26..d2cb04601 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.c @@ -54,19 +54,19 @@ HdfTestCaseList g_hdfConfigTestCaseList[] = { { HDF_GET_NODE_BY_ATTR_REF_001, HcsTestGetNodeAttrRefSuccess }, { HDF_GET_NODE_BY_ATTR_REF_002, HcsTestGetNodeAttrRefFail }, { HDF_MACRO_GET_ONE_NODE, HcsMacroGetOneNode }, - { HDF_MACRO_CHECK_NODE_EXISTS, HcsMacroCheckNodeExists }, - { HDF_MACRO_CHECK_NODE_NOT_EXISTS, HcsMacroCheckNodeNotExists }, - { HDF_MACRO_GET_ONE_NODE_PROP, HcsMacroCheckPropExists }, - { HDF_MACRO_CHECK_NODE_PROP_EXISTS, HcsMacroCheckPropNotExists }, - { HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, HcsMacroGetOneNodeProp }, - { HDF_MACRO_TRAVERSAL_ONE_NODE, HcsMacroTraversalOneNode }, - { HDF_MACRO_GET_ARRAY_SIZE, HcsMacroGetArraySize }, - { HDF_MACRO_GET_ONE_ARRAY_ELEMENT, HcsMacroGetArrayElement }, - { HDF_MACRO_TRAVERSAL_ONE_ARRAY, HcsMacroTraversalOneArray }, - { HDF_MACRO_TRAVERSAL_ALL_ARRAY, HcsMacroTraversalAllArray }, - { HDF_MACRO_TRAVERSAL_NODE_CHILD, HcsMacroTraversalOneNodeChild }, - { HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, HcsMacroTraversalOneNodeChildVargs }, - { HDF_MACRO_GET_ONE_FILE, HcsMacroGetOneFile }, + { HDF_MACRO_CHECK_NODE_EXISTS, HcsMacroCheckNodeExists }, + { HDF_MACRO_CHECK_NODE_NOT_EXISTS, HcsMacroCheckNodeNotExists }, + { HDF_MACRO_GET_ONE_NODE_PROP, HcsMacroCheckPropExists }, + { HDF_MACRO_CHECK_NODE_PROP_EXISTS, HcsMacroCheckPropNotExists }, + { HDF_MACRO_CHECK_NODE_PROP_NOT_EXISTS, HcsMacroGetOneNodeProp }, + { HDF_MACRO_TRAVERSAL_ONE_NODE, HcsMacroTraversalOneNode }, + { HDF_MACRO_GET_ARRAY_SIZE, HcsMacroGetArraySize }, + { HDF_MACRO_GET_ONE_ARRAY_ELEMENT, HcsMacroGetArrayElement }, + { HDF_MACRO_TRAVERSAL_ONE_ARRAY, HcsMacroTraversalOneArray }, + { HDF_MACRO_TRAVERSAL_ALL_ARRAY, HcsMacroTraversalAllArray }, + { HDF_MACRO_TRAVERSAL_NODE_CHILD, HcsMacroTraversalOneNodeChild }, + { HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, HcsMacroTraversalOneNodeChildVargs }, + { HDF_MACRO_GET_ONE_FILE, HcsMacroGetOneFile }, }; int32_t HdfConfigEntry(HdfTestMsg *msg) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h index aeee6d02e..12ffe49e0 100644 --- a/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h +++ b/test/unittest/utils/hcs_parser/unittest/hcs_parser_test.h @@ -63,7 +63,7 @@ enum HdfConfigTestCaseCmd { HDF_MACRO_GET_ARRAY_SIZE, HDF_MACRO_GET_ONE_ARRAY_ELEMENT, HDF_MACRO_TRAVERSAL_ONE_ARRAY, - HDF_MACRO_TRAVERSAL_ALL_ARRAY, + HDF_MACRO_TRAVERSAL_ALL_ARRAY, HDF_MACRO_TRAVERSAL_NODE_CHILD, HDF_MACRO_TRAVERSAL_NODE_CHILD_VARGS, HDF_MACRO_GET_ONE_FILE, diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index 650b400e5..273cf1c3f 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -33,21 +33,21 @@ const std::string &MacroGen::ToUpperString(std::string &str) bool MacroGen::HeaderTopOutput() { - ofs_ << FILE_HEAD_COMMENT; - std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << FILE_HEAD_COMMENT; + std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); ofs_ << "#ifndef " << headerMacro << '\n'; ofs_ << "#define " << headerMacro << '\n'; - ofs_ << "\r\n#include \"hdf_base.h\"\n"; + ofs_ << "\r\n#include \"hdf_base.h\"\n"; - return true; + return true; } bool MacroGen::HeaderBottomOutput() { - std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); - ofs_ << "\n#endif // " << headerMacro << '\n'; - ofs_.close(); - return true; + std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << "\n#endif // " << headerMacro << '\n'; + ofs_.close(); + return true; } bool MacroGen::Output() @@ -58,14 +58,14 @@ bool MacroGen::Output() if (!TemplateNodeSeparate()) { return false; } - if (!HeaderTopOutput()) { + if (!HeaderTopOutput()) { return false; } - if (!NodeWalk()) { + if (!NodeWalk()) { return false; } - if (!HeaderBottomOutput()) { + if (!HeaderBottomOutput()) { return false; } return true; @@ -76,9 +76,9 @@ bool MacroGen::Initialize() auto opt = Option::Instance(); std::string outFileName = Option::Instance().GetOutputName(); if (outFileName.empty()) { - outFileName = Option::Instance().GetSourceNameBase(); + outFileName = Option::Instance().GetSourceNameBase(); } - outFileName = Util::File::StripSuffix(outFileName).append(".h"); + outFileName = Util::File::StripSuffix(outFileName).append(".h"); outFileName_ = Util::File::FileNameBase(outFileName); if (outFileName.find(".h") == std::string::npos) { outFileName.append(".h"); @@ -107,111 +107,111 @@ bool MacroGen::TemplateNodeSeparate() std::string MacroGen::GenFullName(uint32_t depth, const std::shared_ptr &node, const std::string &sep) { - std::string name; - for (int i = 0; i < depth; i++) { - name.append(nodeNameMap_[i]).append(sep); - } - name.append(node->Name()); - return name; + std::string name; + for (int i = 0; i < depth; i++) { + name.append(nodeNameMap_[i]).append(sep); + } + name.append(node->Name()); + return name; } bool MacroGen::GenArray(const std::string &arrName, uint32_t &arrSize, uint32_t type, const std::shared_ptr &node) { - static uint32_t index = 0; - std::string tmp(arrName); - const uint32_t ELEMENT_PER_LINE = 8; + static uint32_t index = 0; + std::string tmp(arrName); + const uint32_t ELEMENT_PER_LINE = 8; - if (index == 0) { - ofs_ << "#define " << tmp.append("_data {"); - } + if (index == 0) { + ofs_ << "#define " << tmp.append("_data {"); + } if (index % ELEMENT_PER_LINE == 0) { - ofs_ << " \\\n "; - } + ofs_ << " \\\n "; + } - if (type == PARSEROP_STRING) { - ofs_ << '"' << node->StringValue() << '"'; - } else { - ofs_ << node->IntegerValue(); - } + if (type == PARSEROP_STRING) { + ofs_ << '"' << node->StringValue() << '"'; + } else { + ofs_ << node->IntegerValue(); + } - index++; - if (index == arrSize) { - index = 0; - arrSize = 0; - ofs_ << " \\\n}\n"; - } else { - if (index % ELEMENT_PER_LINE == 0) { - ofs_ << ","; - } else { - ofs_ << ", "; - } - } + index++; + if (index == arrSize) { + index = 0; + arrSize = 0; + ofs_ << " \\\n}\n"; + } else { + if (index % ELEMENT_PER_LINE == 0) { + ofs_ << ","; + } else { + ofs_ << ", "; + } + } - return true; + return true; } bool MacroGen::GenNodeForeach(uint32_t depth, const std::shared_ptr &node) { - std::list subList; - auto child = node->Child(); - uint32_t count = 0; + std::list subList; + auto child = node->Child(); + uint32_t count = 0; - Logger().Debug() << "node:" << node->Name() << " child:" << " depth:" << depth; + Logger().Debug() << "node:" << node->Name() << " child:" << " depth:" << depth; while (child != nullptr) { - if (child->IsNode()) { - Logger().Debug() << " " << child->Name(); - subList.push_back(GenFullName(depth + 1, child, "_")); - count++; - } + if (child->IsNode()) { + Logger().Debug() << " " << child->Name(); + subList.push_back(GenFullName(depth + 1, child, "_")); + count++; + } child = child->Next(); } ofs_ << "// hcs node macros: " << GenFullName(depth, node, "/") << std::endl; ofs_ << "#define " << GenFullName(depth, node, "_").append("_exists 1") << std::endl; - if (count) { - uint32_t index = count; - std::list::iterator iter; + if (count) { + uint32_t index = count; + std::list::iterator iter; - ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child(func)") << " \\\n"; - for (iter = subList.begin(); iter != subList.end(); iter++) { - index--; - if (index) { - ofs_ << " " << "func(" << *iter << ") \\\n"; - } else { - ofs_ << " " << "func(" << *iter << ")\n"; - } - } - ofs_ << std::endl; + ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child(func)") << " \\\n"; + for (iter = subList.begin(); iter != subList.end(); iter++) { + index--; + if (index) { + ofs_ << " " << "func(" << *iter << ") \\\n"; + } else { + ofs_ << " " << "func(" << *iter << ")\n"; + } + } + ofs_ << std::endl; - index = count; - ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child_vargs(func, ...)") << " \\\n"; - for (iter = subList.begin(); iter != subList.end(); iter++) { - index--; - if (index) { - ofs_ << " " << "func(" << *iter << ", __VA_ARGS__) \\\n"; - } else { - ofs_ << " " << "func(" << *iter << ", __VA_ARGS__)\n"; - } - } - ofs_ << std::endl; - } + index = count; + ofs_ << "#define " << GenFullName(depth, node, "_").append("_foreach_child_vargs(func, ...)") << " \\\n"; + for (iter = subList.begin(); iter != subList.end(); iter++) { + index--; + if (index) { + ofs_ << " " << "func(" << *iter << ", __VA_ARGS__) \\\n"; + } else { + ofs_ << " " << "func(" << *iter << ", __VA_ARGS__)\n"; + } + } + ofs_ << std::endl; + } - return true; + return true; } std::string MacroGen::GenRefObjName(uint32_t depth, const std::shared_ptr &object) { std::string name(object->StringValue()); - if (name.find(".") == std::string::npos) { - name = GenFullName(depth - 1, object, "_").append(object->StringValue()); - } else { - for (char &c : name) { - if (c == '.') { - c = '_'; - } - } - } + if (name.find(".") == std::string::npos) { + name = GenFullName(depth - 1, object, "_").append(object->StringValue()); + } else { + for (char &c : name) { + if (c == '.') { + c = '_'; + } + } + } return name; } @@ -219,50 +219,50 @@ bool MacroGen::NodeWalk() { return ast_->WalkForward([this](std::shared_ptr ¤t, uint32_t depth) { auto type = current->Type(); - static std::string nodeName; - static std::string arrayName; - static uint32_t arraySize = 0; - static uint32_t arrayType = 0; + static std::string nodeName; + static std::string arrayName; + static uint32_t arraySize = 0; + static uint32_t arrayType = 0; - Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth << " arraySize:" << std::dec << arraySize << '\n'; + Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth << " arraySize:" << std::dec << arraySize << '\n'; switch (type) { case PARSEROP_UINT8: case PARSEROP_UINT16: case PARSEROP_UINT32: case PARSEROP_UINT64: { - if (arraySize != 0) { - GenArray(arrayName, arraySize, arrayType, current); - } else { - ofs_ << " " << current->IntegerValue() << std::endl; - } + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << current->IntegerValue() << std::endl; + } break; } case PARSEROP_STRING: - if (arraySize != 0) { - GenArray(arrayName, arraySize, arrayType, current); - } else { - ofs_ << " " << '"' << current->StringValue() << '"' << std::endl; - } + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << '"' << current->StringValue() << '"' << std::endl; + } break; case PARSEROP_CONFTERM: - ofs_ << "#define " << GenFullName(depth, current, "_") << "_exists 1" << std::endl; - ofs_ << "#define " << GenFullName(depth, current, "_"); + ofs_ << "#define " << GenFullName(depth, current, "_") << "_exists 1" << std::endl; + ofs_ << "#define " << GenFullName(depth, current, "_"); break; case PARSEROP_CONFNODE: { - if (nodeName != current->Name()) { - ofs_ << std::endl; - } - nodeName = current->Name(); - nodeNameMap_[depth] = nodeName; - GenNodeForeach(depth, current); + if (nodeName != current->Name()) { + ofs_ << std::endl; + } + nodeName = current->Name(); + nodeNameMap_[depth] = nodeName; + GenNodeForeach(depth, current); break; } case PARSEROP_ARRAY: { - std::shared_ptr parent(current->Parent()); + std::shared_ptr parent(current->Parent()); arraySize = ConfigArray::CastFrom(current)->ArraySize(); - arrayType = ConfigArray::CastFrom(current)->ArrayType(); - ofs_ << "_array_size " << arraySize << std::endl; - arrayName = GenFullName(depth - 1, parent, "_"); + arrayType = ConfigArray::CastFrom(current)->ArrayType(); + ofs_ << "_array_size " << arraySize << std::endl; + arrayName = GenFullName(depth - 1, parent, "_"); break; } case PARSEROP_NODEREF: { @@ -272,7 +272,7 @@ bool MacroGen::NodeWalk() default: break; } - + return NOERR; }); } -- Gitee From 6af44780b7e337768f3d23be57ebc0bd71b46f62 Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 11 Nov 2021 19:18:55 +0800 Subject: [PATCH 159/272] add hcs macro config Signed-off-by: zhang --- utils/include/hcs_macro.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 utils/include/hcs_macro.h diff --git a/utils/include/hcs_macro.h b/utils/include/hcs_macro.h new file mode 100755 index 000000000..6f0714b8f --- /dev/null +++ b/utils/include/hcs_macro.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HCS_MACRO_H +#define HCS_MACRO_H + +// define utils macro +#define HCS_CAT(part1, part2) part1 ## part2 +#define HCS_ROOT root + +// define macro for module +#define HCS_NODE_EXISTS(node) HCS_CAT(node, _exists) +#define HCS_NODE(parent, node) HCS_CAT(parent, _##node) +#define HCS_NODE_HAS_PROP(node, prop) HCS_CAT(node, _##prop##_exists) +#define HCS_PROP(node, prop) HCS_CAT(node, _##prop) + +#define HCS_FOREACH_CHILD(node, func) \ + HCS_CAT(node, _foreach_child)(func) + +#define HCS_FOREACH_CHILD_VARGS(node, func, ...) \ + HCS_CAT(node, _foreach_child_vargs)(func, __VA_ARGS__) + +#define HCS_ARRAYS(arrays_node) HCS_CAT(arrays_node, _data) + +#define HCS_ARRAYS_SIZE(arrays_node) HCS_CAT(arrays_node, _array_size) + +#endif // HCS_MACRO_H \ No newline at end of file -- Gitee From 57118b922c95ccd42c366480bc1758f01ea0304f Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 11 Nov 2021 19:27:13 +0800 Subject: [PATCH 160/272] add hcs macro config Signed-off-by: zhang --- tools/hc-gen/src/macro_gen.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 38fc1591a..7e4981af2 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -30,19 +30,19 @@ private: bool TemplateNodeSeparate(); - std::string GenFullName(uint32_t depth, const std::shared_ptr &node, const std::string &sep); + std::string GenFullName(uint32_t depth, const std::shared_ptr &node, const std::string &sep); - bool GenNodeForeach(uint32_t depth, const std::shared_ptr &node); + bool GenNodeForeach(uint32_t depth, const std::shared_ptr &node); bool NodeWalk(); - bool HeaderTopOutput(); + bool HeaderTopOutput(); - bool HeaderBottomOutput(); + bool HeaderBottomOutput(); - const std::string &ToUpperString(std::string &str); + const std::string &ToUpperString(std::string &str); - bool GenArray(const std::string &name, uint32_t &arrSize, uint32_t type, const std::shared_ptr &node); + bool GenArray(const std::string &name, uint32_t &arrSize, uint32_t type, const std::shared_ptr &node); std::string GenRefObjName(uint32_t depth, const std::shared_ptr &object); @@ -50,7 +50,7 @@ private: std::ofstream ofs_; std::string outFileName_; - std::map nodeNameMap_; + std::map nodeNameMap_; }; } // Hardware } // OHOS -- Gitee From 71825250878fdf2056c238a6dc85dd03d1cc219c Mon Sep 17 00:00:00 2001 From: lzl Date: Thu, 11 Nov 2021 11:47:43 +0000 Subject: [PATCH 161/272] modify mmc read/write problem Signed-off-by: lzl --- support/platform/src/mmc/mmc_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/support/platform/src/mmc/mmc_core.c b/support/platform/src/mmc/mmc_core.c index 68493eb6c..b8397ff61 100644 --- a/support/platform/src/mmc/mmc_core.c +++ b/support/platform/src/mmc/mmc_core.c @@ -1101,7 +1101,7 @@ ssize_t MmcDeviceRead(struct MmcDevice *mmc, uint8_t *buf, size_t startSec, size } MmcDeviceFillRwInfo(&info, buf, false, curStartSec, readSec); if (mmc->cntlr->detecting == true) { - ret = MmcSendReadWriteBlocks(mmc->cntlr, &info); + ret = HDF_FAILURE; } else { cmd.data = &data; MmcSetupReadWriteBlocksCmd(mmc, &cmd, &info); @@ -1146,7 +1146,7 @@ ssize_t MmcDeviceWrite(struct MmcDevice *mmc, uint8_t *buf, size_t startSec, siz } MmcDeviceFillRwInfo(&info, buf, true, curStartSec, writeSec); if (mmc->cntlr->detecting == true) { - ret = MmcSendReadWriteBlocks(mmc->cntlr, &info); + ret = HDF_FAILURE; } else { cmd.data = &data; MmcSetupReadWriteBlocksCmd(mmc, &cmd, &info); -- Gitee From d006583bfd84a36c613b4a9d47314977320e5b43 Mon Sep 17 00:00:00 2001 From: zhang Date: Fri, 12 Nov 2021 10:21:25 +0800 Subject: [PATCH 162/272] add hcs macro config Signed-off-by: zhang --- {utils/include => include/utils}/hcs_macro.h | 0 tools/hc-gen/src/macro_gen.h | 2 -- 2 files changed, 2 deletions(-) rename {utils/include => include/utils}/hcs_macro.h (100%) diff --git a/utils/include/hcs_macro.h b/include/utils/hcs_macro.h similarity index 100% rename from utils/include/hcs_macro.h rename to include/utils/hcs_macro.h diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 7e4981af2..647bf60bf 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -46,8 +46,6 @@ private: std::string GenRefObjName(uint32_t depth, const std::shared_ptr &object); - const std::string &TypeToStr(uint32_t type); - std::ofstream ofs_; std::string outFileName_; std::map nodeNameMap_; -- Gitee From af8288fbcbec633f399585ff7d3d87f07e527fa5 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 12 Nov 2021 03:01:03 +0000 Subject: [PATCH 163/272] =?UTF-8?q?Description:=20p2p=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8B=86=E5=88=86=20Feature=20or=20Bugfix:Feature=20Binary=20S?= =?UTF-8?q?ource:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- include/wifi/wifi_mac80211_ops.h | 30 +- include/wifi/wifi_module.h | 1 + model/network/wifi/core/components/p2p/p2p.c | 402 ++++++++++++++++++ model/network/wifi/core/components/p2p/p2p.h | 15 + model/network/wifi/core/module/wifi_base.c | 334 --------------- model/network/wifi/core/module/wifi_module.c | 2 + .../wifi/platform/include/hdf_wlan_services.h | 18 +- 7 files changed, 447 insertions(+), 355 deletions(-) create mode 100755 model/network/wifi/core/components/p2p/p2p.c create mode 100755 model/network/wifi/core/components/p2p/p2p.h diff --git a/include/wifi/wifi_mac80211_ops.h b/include/wifi/wifi_mac80211_ops.h index aa26a666d..52c81b50b 100644 --- a/include/wifi/wifi_mac80211_ops.h +++ b/include/wifi/wifi_mac80211_ops.h @@ -589,20 +589,6 @@ struct HdfMac80211BaseOps { */ int32_t (*GetHwCapability)(NetDevice *netDev, struct WlanHwCapability **capability); - int32_t (*RemainOnChannel)(NetDevice *netDev, WifiOnChannel *onChannel); - - int32_t (*CancelRemainOnChannel)(NetDevice *netDev); - - int32_t (*ProbeReqReport)(NetDevice *netDev, int32_t report); - - int32_t (*AddIf)(NetDevice *netDev, WifiIfAdd *ifAdd); - - int32_t (*RemoveIf)(NetDevice *netDev, WifiIfRemove *ifRemove); - - int32_t (*SetApWpsP2pIe)(NetDevice *netDev, WifiAppIe *appIe); - - int32_t (*GetDriverFlag)(struct NetDevice *netDev, WifiGetDrvFlags **params); - int32_t (*SendAction)(struct NetDevice *netDev, WifiActionData *actionData); int32_t (*GetIftype)(struct NetDevice *netDev, uint8_t *iftype); @@ -792,5 +778,21 @@ struct HdfMac80211APOps { int32_t (*GetAssociatedStasInfo)(NetDevice *netDev, WifiStaInfo *staInfo, uint32_t num); }; +struct HdfMac80211P2POps { + int32_t (*RemainOnChannel)(NetDevice *netDev, WifiOnChannel *onChannel); + + int32_t (*CancelRemainOnChannel)(NetDevice *netDev); + + int32_t (*ProbeReqReport)(NetDevice *netDev, int32_t report); + + int32_t (*AddIf)(NetDevice *netDev, WifiIfAdd *ifAdd); + + int32_t (*RemoveIf)(NetDevice *netDev, WifiIfRemove *ifRemove); + + int32_t (*SetApWpsP2pIe)(NetDevice *netDev, WifiAppIe *appIe); + + int32_t (*GetDriverFlag)(struct NetDevice *netDev, WifiGetDrvFlags **params); +}; + #endif // WIFI_MAC80211_OPS_H /** @} */ diff --git a/include/wifi/wifi_module.h b/include/wifi/wifi_module.h index 6bb836c2d..bb2d85d96 100644 --- a/include/wifi/wifi_module.h +++ b/include/wifi/wifi_module.h @@ -163,6 +163,7 @@ struct HdfChipDriver { struct HdfMac80211BaseOps *ops; /**< MAC address for the basic feature */ struct HdfMac80211STAOps *staOps; /**< MAC address for the STA feature */ struct HdfMac80211APOps *apOps; /**< MAC address for the AP feature */ + struct HdfMac80211P2POps *p2pOps; /**< MAC address for the P2Pfeature */ void *priv; /**< Private data of the chip driver */ /** * @brief Initializes a chip driver. diff --git a/model/network/wifi/core/components/p2p/p2p.c b/model/network/wifi/core/components/p2p/p2p.c new file mode 100755 index 000000000..3078ed37d --- /dev/null +++ b/model/network/wifi/core/components/p2p/p2p.c @@ -0,0 +1,402 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "p2p.h" +#include +#include +#include "message/message_router.h" +#include "message/sidecar.h" +#include "wifi_base.h" +#include "wifi_mac80211_ops.h" +#include "hdf_wlan_services.h" +#include "hdf_wlan_utils.h" + +#define HDF_LOG_TAG HDF_WIFI_CORE + +#ifdef __cplusplus +extern "C" { +#endif +static int32_t RemainOnChannel(struct NetDevice *netdev, WifiOnChannel *onChannel) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, RemainOnChannel); + return chipDriver->p2pOps->RemainOnChannel(netdev, onChannel); +} + +static int32_t WifiCmdRemainOnChannel(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + WifiOnChannel wifiOnChannel = {0}; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + if (!HdfSbufReadUint32(reqData, &(wifiOnChannel.freq))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "freq"); + return HDF_FAILURE; + } + if (!HdfSbufReadUint32(reqData, &(wifiOnChannel.duration))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "duration"); + return HDF_FAILURE; + } + ret = RemainOnChannel(netdev, &wifiOnChannel); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to remain on channel,%d", __func__, ret); + } + return ret; +} + +static int32_t ProbeReqReport(struct NetDevice *netdev, int32_t report) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, ProbeReqReport); + return chipDriver->p2pOps->ProbeReqReport(netdev, report); +} + +static int32_t WifiCmdProbeReqReport(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + int32_t report; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + if (!HdfSbufReadInt32(reqData, &(report))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "report"); + return HDF_FAILURE; + } + + ret = ProbeReqReport(netdev, report); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to probe req report,%d", __func__, ret); + } + return ret; +} + +static int32_t CancelRemainOnChannel(struct NetDevice *netdev) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, CancelRemainOnChannel); + return chipDriver->p2pOps->CancelRemainOnChannel(netdev); +} + +static int32_t WifiCmdCancelRemainOnChannel(const RequestContext *context, struct HdfSBuf *reqData, + struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + + ret = CancelRemainOnChannel(netdev); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); + } + return ret; +} + +static int32_t AddIf(struct NetDevice *netdev, WifiIfAdd *ifAdd) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, AddIf); + return chipDriver->p2pOps->AddIf(netdev, ifAdd); +} + +static int32_t WifiCmdAddIf(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + WifiIfAdd ifAdd = {0}; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + + if (!HdfSbufReadUint8(reqData, &(ifAdd.type))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "type"); + return HDF_FAILURE; + } + + ret = AddIf(netdev, &ifAdd); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); + } + return ret; +} + +static int32_t RemoveIf(struct NetDevice *netdev, WifiIfRemove *ifRemove) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, RemoveIf); + return chipDriver->p2pOps->RemoveIf(netdev, ifRemove); +} + +static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + WifiIfRemove *ifRemove = NULL; + uint32_t dataSize; + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + + dataSize = 0; + if (!HdfSbufReadBuffer(reqData, (const void **)&(ifRemove), &dataSize) || dataSize != sizeof(WifiIfRemove)) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + ret = RemoveIf(netdev, ifRemove); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to remove interface,%d", __func__, ret); + } + return ret; +} + +static int32_t SetApWpsP2pIe(struct NetDevice *netdev, WifiAppIe *appIe) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, SetApWpsP2pIe); + return chipDriver->p2pOps->SetApWpsP2pIe(netdev, appIe); +} + +static int32_t WifiCmdSetApWpsP2pIe(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + WifiAppIe appIe = {0}; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + + if (!HdfSbufReadUint32(reqData, &(appIe.ieLen))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ieLen"); + return HDF_FAILURE; + } + if (!HdfSbufReadUint8(reqData, &(appIe.appIeType))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "appIeType"); + return HDF_FAILURE; + } + if (!HdfSbufReadBuffer(reqData, (const void**)&(appIe.ie), &(appIe.ieLen))) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "appIeType"); + return HDF_FAILURE; + } + ret = SetApWpsP2pIe(netdev, &appIe); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to setapwpsp2pie,%d", __func__, ret); + } + return ret; +} + +int32_t GetDriverFlag (struct NetDevice *netdev, WifiGetDrvFlags **params) +{ + struct HdfChipDriver *chipDriver = GetChipDriver(netdev); + if (chipDriver == NULL) { + HDF_LOGE("%s:bad net device found!", __func__); + return HDF_FAILURE; + } + + RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->p2pOps, GetDriverFlag); + return chipDriver->p2pOps->GetDriverFlag(netdev, params); +} + +static int32_t WifiCmdGetDriverFlag(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) +{ + int32_t ret; + struct NetDevice *netdev = NULL; + const char *ifName = NULL; + WifiGetDrvFlags *params = NULL; + + (void)context; + if (reqData == NULL || rspData == NULL) { + return HDF_ERR_INVALID_PARAM; + } + ifName = HdfSbufReadString(reqData); + if (ifName == NULL) { + HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); + return HDF_FAILURE; + } + netdev = NetDeviceGetInstByName(ifName); + if (netdev == NULL) { + HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); + return HDF_FAILURE; + } + + ret = GetDriverFlag(netdev, ¶ms); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: fail to getdriverflag,%d", __func__, ret); + } + + if (!HdfSbufWriteUint64(rspData, params->drvFlags)) { + HDF_LOGE("%s:%s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); + ret = HDF_ERR_IO; + } + + HDF_LOGE("WifiCmdGetDriverFlag:%llx", params->drvFlags); + return ret; +} + +static struct MessageDef g_wifiP2pFeatureCmds[] = { + DUEMessage(CMD_P2P_PROBE_REQ_REPORT, WifiCmdProbeReqReport, 0), + DUEMessage(CMD_P2P_REMAIN_ON_CHANNEL, WifiCmdRemainOnChannel, 0), + DUEMessage(CMD_P2P_CANCEL_REMAIN_ON_CHANNEL, WifiCmdCancelRemainOnChannel, 0), + DUEMessage(CMD_P2P_ADD_IF, WifiCmdAddIf, 0), + DUEMessage(CMD_P2P_REMOVE_IF, WifiCmdRemoveIf, 0), + DUEMessage(CMD_P2P_SET_AP_WPS_P2P_IE, WifiCmdSetApWpsP2pIe, 0), + DUEMessage(CMD_P2P_GET_DRIVER_FLAGS, WifiCmdGetDriverFlag, 0), +}; +ServiceDefine(P2PService, P2P_SERVICE_ID, g_wifiP2pFeatureCmds); + +static Service *g_p2pService = NULL; + +int32_t P2pInit(struct WifiFeature *feature) +{ + (void)feature; + if (g_p2pService == NULL) { + ServiceCfg cfg = { + .dispatcherId = DEFAULT_DISPATCHER_ID + }; + g_p2pService = CreateService(P2PService, &cfg); + if (g_p2pService == NULL) { + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} + +int32_t P2pDeinit(struct WifiFeature *feature) +{ + (void)feature; + if (g_p2pService != NULL && g_p2pService->Destroy != NULL) { + g_p2pService->Destroy(g_p2pService); + g_p2pService = NULL; + } + return HDF_SUCCESS; +} + +struct WifiFeature g_wifiP2PFeature = { + .name = "p2p", + .init = P2pInit, + .deInit = P2pDeinit +}; + +struct WifiFeature *GetWifiP2pFeature(void) +{ + return &g_wifiP2PFeature; +} + +#ifdef __cplusplus +} +#endif diff --git a/model/network/wifi/core/components/p2p/p2p.h b/model/network/wifi/core/components/p2p/p2p.h new file mode 100755 index 000000000..62ede39b0 --- /dev/null +++ b/model/network/wifi/core/components/p2p/p2p.h @@ -0,0 +1,15 @@ +#ifndef HDFLITE_P2P_H +#define HDFLITE_P2P_H + +#include "wifi_module.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct WifiFeature *GetWifiP2pFeature(void); + +#ifdef __cplusplus +} +#endif +#endif // HDFLITE_P2P_H diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index bfa6e612f..c3822c353 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -1296,333 +1296,6 @@ static int32_t WifiCmdGetNetDevInfo(const RequestContext *context, struct HdfSBu return HDF_SUCCESS; } -static int32_t RemainOnChannel(struct NetDevice *netdev, WifiOnChannel *onChannel) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, RemainOnChannel); - return chipDriver->ops->RemainOnChannel(netdev, onChannel); -} - -static int32_t WifiCmdRemainOnChannel(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - WifiOnChannel wifiOnChannel = {0}; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - if (!HdfSbufReadUint32(reqData, &(wifiOnChannel.freq))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "freq"); - return HDF_FAILURE; - } - if (!HdfSbufReadUint32(reqData, &(wifiOnChannel.duration))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "duration"); - return HDF_FAILURE; - } - ret = RemainOnChannel(netdev, &wifiOnChannel); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to remain on channel,%d", __func__, ret); - } - return ret; -} - -static int32_t ProbeReqReport(struct NetDevice *netdev, int32_t report) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, ProbeReqReport); - return chipDriver->ops->ProbeReqReport(netdev, report); -} - -static int32_t WifiCmdProbeReqReport(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - int32_t report; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - if (!HdfSbufReadInt32(reqData, &(report))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "report"); - return HDF_FAILURE; - } - - ret = ProbeReqReport(netdev, report); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to probe req report,%d", __func__, ret); - } - return ret; -} - -static int32_t CancelRemainOnChannel(struct NetDevice *netdev) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, CancelRemainOnChannel); - return chipDriver->ops->CancelRemainOnChannel(netdev); -} - -static int32_t WifiCmdCancelRemainOnChannel(const RequestContext *context, struct HdfSBuf *reqData, - struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - - ret = CancelRemainOnChannel(netdev); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); - } - return ret; -} - -static int32_t AddIf(struct NetDevice *netdev, WifiIfAdd *ifAdd) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, AddIf); - return chipDriver->ops->AddIf(netdev, ifAdd); -} - -static int32_t WifiCmdAddIf(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - WifiIfAdd ifAdd = {0}; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - - if (!HdfSbufReadUint8(reqData, &(ifAdd.type))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "type"); - return HDF_FAILURE; - } - - ret = AddIf(netdev, &ifAdd); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to cancel remain on channel,%d", __func__, ret); - } - return ret; -} - -static int32_t RemoveIf(struct NetDevice *netdev, WifiIfRemove *ifRemove) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, RemoveIf); - return chipDriver->ops->RemoveIf(netdev, ifRemove); -} - -static int32_t WifiCmdRemoveIf(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - WifiIfRemove *ifRemove = NULL; - uint32_t dataSize; - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - - dataSize = 0; - if (!HdfSbufReadBuffer(reqData, (const void **)&(ifRemove), &dataSize) || dataSize != sizeof(WifiIfRemove)) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - ret = RemoveIf(netdev, ifRemove); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to remove interface,%d", __func__, ret); - } - return ret; -} - -static int32_t SetApWpsP2pIe(struct NetDevice *netdev, WifiAppIe *appIe) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, SetApWpsP2pIe); - return chipDriver->ops->SetApWpsP2pIe(netdev, appIe); -} - -static int32_t WifiCmdSetApWpsP2pIe(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - WifiAppIe appIe = {0}; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - - if (!HdfSbufReadUint32(reqData, &(appIe.ieLen))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ieLen"); - return HDF_FAILURE; - } - if (!HdfSbufReadUint8(reqData, &(appIe.appIeType))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "appIeType"); - return HDF_FAILURE; - } - if (!HdfSbufReadBuffer(reqData, (const void**)&(appIe.ie), &(appIe.ieLen))) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "appIeType"); - return HDF_FAILURE; - } - ret = SetApWpsP2pIe(netdev, &appIe); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to setapwpsp2pie,%d", __func__, ret); - } - return ret; -} - -int32_t GetDriverFlag (struct NetDevice *netdev, WifiGetDrvFlags **params) -{ - struct HdfChipDriver *chipDriver = GetChipDriver(netdev); - if (chipDriver == NULL) { - HDF_LOGE("%s:bad net device found!", __func__); - return HDF_FAILURE; - } - - RETURN_IF_CHIPOPS_NOT_IMPLEMENT(chipDriver->ops, GetDriverFlag); - return chipDriver->ops->GetDriverFlag(netdev, params); -} - -static int32_t WifiCmdGetDriverFlag(const RequestContext *context, struct HdfSBuf *reqData, struct HdfSBuf *rspData) -{ - int32_t ret; - struct NetDevice *netdev = NULL; - const char *ifName = NULL; - WifiGetDrvFlags *params = NULL; - - (void)context; - if (reqData == NULL || rspData == NULL) { - return HDF_ERR_INVALID_PARAM; - } - ifName = HdfSbufReadString(reqData); - if (ifName == NULL) { - HDF_LOGE("%s: %s!ParamName=%s", __func__, ERROR_DESC_READ_REQ_FAILED, "ifName"); - return HDF_FAILURE; - } - netdev = NetDeviceGetInstByName(ifName); - if (netdev == NULL) { - HDF_LOGE("%s: netdev not found!ifName=%s", __func__, ifName); - return HDF_FAILURE; - } - - ret = GetDriverFlag(netdev, ¶ms); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: fail to getdriverflag,%d", __func__, ret); - } - - if (!HdfSbufWriteUint64(rspData, params->drvFlags)) { - HDF_LOGE("%s:%s!", __func__, ERROR_DESC_WRITE_RSP_FAILED); - ret = HDF_ERR_IO; - } - - HDF_LOGE("WifiCmdGetDriverFlag:%llx", params->drvFlags); - return ret; -} - static struct MessageDef g_wifiBaseFeatureCmds[] = { DUEMessage(CMD_BASE_NEW_KEY, WifiCmdNewKey, 0), DUEMessage(CMD_BASE_DEL_KEY, WifiCmdDelKey, 0), @@ -1649,13 +1322,6 @@ static struct MessageDef g_wifiBaseFeatureCmds[] = { DUEMessage(CMD_BASE_GET_IFNAMES, WifiCmdGetIfNamesByChipId, 0), DUEMessage(CMD_BASE_RESET_DRIVER, WifiCmdResetDriver, 0), DUEMessage(CMD_BASE_GET_NETDEV_INFO, WifiCmdGetNetDevInfo, 0), - DUEMessage(CMD_P2P_PROBE_REQ_REPORT, WifiCmdProbeReqReport, 0), - DUEMessage(CMD_P2P_REMAIN_ON_CHANNEL, WifiCmdRemainOnChannel, 0), - DUEMessage(CMD_P2P_CANCEL_REMAIN_ON_CHANNEL, WifiCmdCancelRemainOnChannel, 0), - DUEMessage(CMD_P2P_ADD_IF, WifiCmdAddIf, 0), - DUEMessage(CMD_P2P_REMOVE_IF, WifiCmdRemoveIf, 0), - DUEMessage(CMD_P2P_SET_AP_WPS_P2P_IE, WifiCmdSetApWpsP2pIe, 0), - DUEMessage(CMD_P2P_GET_DRIVER_FLAGS, WifiCmdGetDriverFlag, 0), DUEMessage(CMD_BASE_DO_RESET_PRIVATE, WifiCmdDoResetChip, 0), }; ServiceDefine(BaseService, BASE_SERVICE_ID, g_wifiBaseFeatureCmds); diff --git a/model/network/wifi/core/module/wifi_module.c b/model/network/wifi/core/module/wifi_module.c index 061478f05..8f76769a6 100644 --- a/model/network/wifi/core/module/wifi_module.c +++ b/model/network/wifi/core/module/wifi_module.c @@ -10,6 +10,7 @@ #include "wifi_base.h" #include "ap.h" #include "sta.h" +#include "p2p.h" #include "hdf_wlan_config.h" #include "securec.h" @@ -39,6 +40,7 @@ static int32_t InitFeatures(struct WifiModule *module) module->feList.fe[HDF_WIFI_FEATURE_AP] = GetWifiApFeature(); module->feList.fe[HDF_WIFI_FEATURE_STA] = GetWifiStaFeature(); + module->feList.fe[HDF_WIFI_FEATURE_P2P] = GetWifiP2pFeature(); for (i = 0; i < HDF_WIFI_FEATURE_NUM; i++) { if ((module->moduleConfig.hslConfig->featureMap & (1 << i)) && module->feList.fe[i] != NULL) { diff --git a/model/network/wifi/platform/include/hdf_wlan_services.h b/model/network/wifi/platform/include/hdf_wlan_services.h index 47fb1b8b5..6e49bfc73 100644 --- a/model/network/wifi/platform/include/hdf_wlan_services.h +++ b/model/network/wifi/platform/include/hdf_wlan_services.h @@ -14,6 +14,7 @@ enum PlatformServiceID { BASE_SERVICE_ID, AP_SERVICE_ID, STA_SERVICE_ID, + P2P_SERVICE_ID, AUTO_ALLOC_SERVICE_ID_START = 300 }; @@ -43,13 +44,6 @@ enum BaseCommands { CMD_BASE_GET_IFNAMES, CMD_BASE_RESET_DRIVER, CMD_BASE_GET_NETDEV_INFO = 25, - CMD_P2P_PROBE_REQ_REPORT = 26, - CMD_P2P_REMAIN_ON_CHANNEL, - CMD_P2P_CANCEL_REMAIN_ON_CHANNEL, - CMD_P2P_ADD_IF, - CMD_P2P_REMOVE_IF, - CMD_P2P_SET_AP_WPS_P2P_IE, - CMD_P2P_GET_DRIVER_FLAGS, CMD_BASE_DO_RESET_PRIVATE, }; @@ -70,4 +64,14 @@ enum STACommands { CMD_STA_SET_SCAN_MAC_ADDR }; +enum P2PCommands { + CMD_P2P_PROBE_REQ_REPORT = 0, + CMD_P2P_REMAIN_ON_CHANNEL, + CMD_P2P_CANCEL_REMAIN_ON_CHANNEL, + CMD_P2P_ADD_IF, + CMD_P2P_REMOVE_IF, + CMD_P2P_SET_AP_WPS_P2P_IE, + CMD_P2P_GET_DRIVER_FLAGS +}; + #endif \ No newline at end of file -- Gitee From 46d9fa9d4275aca8d8768c323d2aab1486c58ae6 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 12 Nov 2021 06:25:06 +0000 Subject: [PATCH 164/272] =?UTF-8?q?Description:=20p2p=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8B=86=E5=88=86=20Feature=20or=20Bugfix:Feature=20Binary=20S?= =?UTF-8?q?ource:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- model/network/wifi/core/components/p2p/p2p.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/model/network/wifi/core/components/p2p/p2p.h b/model/network/wifi/core/components/p2p/p2p.h index 62ede39b0..be36bc23e 100755 --- a/model/network/wifi/core/components/p2p/p2p.h +++ b/model/network/wifi/core/components/p2p/p2p.h @@ -1,3 +1,11 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + #ifndef HDFLITE_P2P_H #define HDFLITE_P2P_H -- Gitee From 91c74aad530218a22df4e95e5ff99fb03bc968a7 Mon Sep 17 00:00:00 2001 From: chenchong Date: Fri, 12 Nov 2021 16:08:54 +0800 Subject: [PATCH 165/272] modify_code Signed-off-by: chenchong --- .../sensor/driver/chipset/gyro/gyro_bmi160.c | 103 ++++++-- .../sensor/driver/chipset/gyro/gyro_bmi160.h | 9 +- model/sensor/driver/gyro/sensor_gyro_driver.c | 250 ++++++++---------- model/sensor/driver/gyro/sensor_gyro_driver.h | 15 +- 4 files changed, 214 insertions(+), 163 deletions(-) diff --git a/model/sensor/driver/chipset/gyro/gyro_bmi160.c b/model/sensor/driver/chipset/gyro/gyro_bmi160.c index e4a8c3665..f29c1f426 100644 --- a/model/sensor/driver/chipset/gyro/gyro_bmi160.c +++ b/model/sensor/driver/chipset/gyro/gyro_bmi160.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -8,11 +8,21 @@ #include "gyro_bmi160.h" #include +#include "osal_mem.h" #include "osal_time.h" #include "sensor_gyro_driver.h" #include "sensor_config_controller.h" #include "sensor_device_manager.h" +#define HDF_LOG_TAG gyro_bmi160_c + +static struct Bmi160DrvData *g_bmi160DrvData = NULL; + +struct Bmi160DrvData *Bmi160GetDrvData(void) +{ + return g_bmi160DrvData; +} + /* IO config for int-pin and I2C-pin */ #define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c #define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 @@ -95,8 +105,7 @@ int32_t ReadBmi160GyroData(struct SensorCfgData *data) ret = ReportSensorEvent(&event); return ret; } - -static int32_t InitBmi160Gyro(struct SensorCfgData *data) +static int32_t InitBmi160(struct SensorCfgData *data) { int32_t ret; @@ -123,30 +132,94 @@ static int32_t InitGyroPreConfig(void) return HDF_SUCCESS; } -int32_t DetectGyroBim160Chip(struct SensorCfgData *data) +static int32_t DispatchBMI160(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t Bmi160BindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc Bmi160 drv data fail", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchBMI160; + drvData->device = device; + device->service = &drvData->ioService; + g_bmi160DrvData = drvData; + + return HDF_SUCCESS; +} + +int32_t Bmi160InitDriver(struct HdfDeviceObject *device) { int32_t ret; struct GyroOpsCall ops; - CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); - if (strcmp(GYRO_CHIP_NAME_BMI160, data->sensorAttr.chipName) != 0) { - return HDF_SUCCESS; - } + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + ret = InitGyroPreConfig(); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: init BMI160 bus mux config", __func__); + HDF_LOGE("%s: Init BMI160 bus mux config", __func__); return HDF_FAILURE; } - if (DetectSensorDevice(data) != HDF_SUCCESS) { - return HDF_FAILURE; + + drvData->sensorCfg = GyroCreateCfgData(device->property); + if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) { + HDF_LOGD("%s: Creating gyrocfg failed because detection failed", __func__); + return HDF_ERR_NOT_SUPPORT; } - ops.Init = InitBmi160Gyro; + + ops.Init = NULL; ops.ReadData = ReadBmi160GyroData; - ret = RegisterGyroChipOps(&ops); + ret = GyroRegisterChipOps(&ops); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Register BMI160 gyro failed", __func__); + return HDF_FAILURE; + } + + ret = InitBmi160(drvData->sensorCfg); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: register BMI160 gyro failed", __func__); - (void)ReleaseSensorBusHandle(&data->busCfg); + HDF_LOGE("%s: Init BMI160 gyro failed", __func__); return HDF_FAILURE; } + return HDF_SUCCESS; } + +void Bmi160ReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->sensorCfg != NULL) { + GyroReleaseCfgData(drvData->sensorCfg); + drvData->sensorCfg = NULL; + } + + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_gyroBmi160DevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_GYRO_BMI160", + .Bind = Bmi160BindDriver, + .Init = Bmi160InitDriver, + .Release = Bmi160ReleaseDriver, +}; + +HDF_INIT(g_gyroBmi160DevEntry); diff --git a/model/sensor/driver/chipset/gyro/gyro_bmi160.h b/model/sensor/driver/chipset/gyro/gyro_bmi160.h index 5e71e306f..564952c84 100644 --- a/model/sensor/driver/chipset/gyro/gyro_bmi160.h +++ b/model/sensor/driver/chipset/gyro/gyro_bmi160.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -9,6 +9,7 @@ #ifndef GYRO_BMI160_H #define GYRO_BMI160_H +#include "sensor_gyro_driver.h" #include "sensor_config_parser.h" /* GYRO DATA REGISTERS ADDR */ @@ -51,4 +52,10 @@ int32_t DetectGyroBim160Chip(struct SensorCfgData *data); int32_t ReadBmi160Data(struct SensorCfgData *data); +struct Bmi160DrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + struct SensorCfgData *sensorCfg; +}; + #endif /* GYRO_BMI160_H */ diff --git a/model/sensor/driver/gyro/sensor_gyro_driver.c b/model/sensor/driver/gyro/sensor_gyro_driver.c index 3e827ae35..afe06db52 100644 --- a/model/sensor/driver/gyro/sensor_gyro_driver.c +++ b/model/sensor/driver/gyro/sensor_gyro_driver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -8,7 +8,6 @@ #include "sensor_gyro_driver.h" #include -#include "gyro_bmi160.h" #include "hdf_base.h" #include "hdf_device_desc.h" #include "osal_math.h" @@ -21,10 +20,6 @@ #define HDF_GYRO_WORK_QUEUE_NAME "hdf_gyro_work_queue" -static struct GyroDetectIfList g_gyroDetectIfList[] = { - {GYRO_CHIP_NAME_BMI160, DetectGyroBim160Chip}, -}; - static struct GyroDrvData *g_gyroDrvData = NULL; static struct GyroDrvData *GyroGetDrvData(void) @@ -34,14 +29,13 @@ static struct GyroDrvData *GyroGetDrvData(void) static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; -int32_t RegisterGyroChipOps(const struct GyroOpsCall *ops) +int32_t GyroRegisterChipOps(const struct GyroOpsCall *ops) { - struct GyroDrvData *drvData = NULL; + struct GyroDrvData *drvData = GyroGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(ops, HDF_ERR_INVALID_PARAM); - drvData = GyroGetDrvData(); - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); drvData->ops.Init = ops->Init; drvData->ops.ReadData = ops->ReadData; return HDF_SUCCESS; @@ -49,16 +43,18 @@ int32_t RegisterGyroChipOps(const struct GyroOpsCall *ops) static void GyroDataWorkEntry(void *arg) { - int32_t ret; - struct GyroDrvData *drvData = (struct GyroDrvData *)arg; + struct GyroDrvData *drvData = NULL; + + drvData = (struct GyroDrvData *)arg; CHECK_NULL_PTR_RETURN(drvData); - CHECK_NULL_PTR_RETURN(drvData->ops.ReadData); - ret = drvData->ops.ReadData(drvData->gyroCfg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro read data failed", __func__); + if (drvData->ops.ReadData == NULL) { + HDF_LOGI("%s: Gyro ReadData function NULl", __func__); return; } + if (drvData->ops.ReadData(drvData->gyroCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Gyro read data failed", __func__); + } } static void GyroTimerEntry(uintptr_t arg) @@ -69,48 +65,32 @@ static void GyroTimerEntry(uintptr_t arg) CHECK_NULL_PTR_RETURN(drvData); if (!HdfAddWork(&drvData->gyroWorkQueue, &drvData->gyroWork)) { - HDF_LOGE("%s: gyro add work queue failed", __func__); + HDF_LOGE("%s: Gyro add work queue failed", __func__); } interval = OsalDivS64(drvData->interval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); interval = (interval < SENSOR_TIMER_MIN_TIME) ? SENSOR_TIMER_MIN_TIME : interval; ret = OsalTimerSetTimeout(&drvData->gyroTimer, interval); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro modify time failed", __func__); + HDF_LOGE("%s: Gyro modify time failed", __func__); } } -static int32_t InitGyroData(void) +static int32_t InitGyroData(struct GyroDrvData *drvData) { - struct GyroDrvData *drvData = GyroGetDrvData(); - int32_t ret; - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - - if (drvData->initStatus) { - return HDF_SUCCESS; - } - if (HdfWorkQueueInit(&drvData->gyroWorkQueue, HDF_GYRO_WORK_QUEUE_NAME) != HDF_SUCCESS) { - HDF_LOGE("%s: gyro init work queue failed", __func__); + HDF_LOGE("%s: Gyro init work queue failed", __func__); return HDF_FAILURE; } if (HdfWorkInit(&drvData->gyroWork, GyroDataWorkEntry, drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: gyro create thread failed", __func__); - return HDF_FAILURE; - } - - CHECK_NULL_PTR_RETURN_VALUE(drvData->ops.Init, HDF_ERR_INVALID_PARAM); - - ret = drvData->ops.Init(drvData->gyroCfg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro create thread failed", __func__); + HDF_LOGE("%s: Gyro create thread failed", __func__); return HDF_FAILURE; } drvData->interval = SENSOR_TIMER_MIN_TIME; - drvData->initStatus = true; drvData->enable = false; + drvData->detectFlag = false; return HDF_SUCCESS; } @@ -124,25 +104,25 @@ static int32_t SetGyroEnable(void) CHECK_NULL_PTR_RETURN_VALUE(drvData->gyroCfg, HDF_ERR_INVALID_PARAM); if (drvData->enable) { - HDF_LOGE("%s: gyro sensor is enabled", __func__); + HDF_LOGE("%s: Gyro sensor is enabled", __func__); return HDF_SUCCESS; } ret = SetSensorRegCfgArray(&drvData->gyroCfg->busCfg, drvData->gyroCfg->regCfgGroup[SENSOR_ENABLE_GROUP]); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro sensor enable config failed", __func__); + HDF_LOGE("%s: Gyro sensor enable config failed", __func__); return ret; } ret = OsalTimerCreate(&drvData->gyroTimer, SENSOR_TIMER_MIN_TIME, GyroTimerEntry, (uintptr_t)drvData); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro create timer failed[%d]", __func__, ret); + HDF_LOGE("%s: Gyro create timer failed[%d]", __func__, ret); return ret; } ret = OsalTimerStartLoop(&drvData->gyroTimer); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro start timer failed[%d]", __func__, ret); + HDF_LOGE("%s: Gyro start timer failed[%d]", __func__, ret); return ret; } drvData->enable = true; @@ -159,22 +139,23 @@ static int32_t SetGyroDisable(void) CHECK_NULL_PTR_RETURN_VALUE(drvData->gyroCfg, HDF_ERR_INVALID_PARAM); if (!drvData->enable) { - HDF_LOGE("%s: gyro sensor had disable", __func__); + HDF_LOGE("%s: Gyro sensor had disable", __func__); return HDF_SUCCESS; } ret = SetSensorRegCfgArray(&drvData->gyroCfg->busCfg, drvData->gyroCfg->regCfgGroup[SENSOR_DISABLE_GROUP]); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro sensor disable config failed", __func__); + HDF_LOGE("%s: Gyro sensor disable config failed", __func__); return ret; } ret = OsalTimerDelete(&drvData->gyroTimer); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: gyro delete timer failed", __func__); + HDF_LOGE("%s: Gyro delete timer failed", __func__); return ret; } drvData->enable = false; + return HDF_SUCCESS; } @@ -214,13 +195,13 @@ static int32_t DispatchGyro(struct HdfDeviceIoClient *client, return HDF_SUCCESS; } -int32_t BindGyroDriver(struct HdfDeviceObject *device) +int32_t GyroBindDriver(struct HdfDeviceObject *device) { CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); struct GyroDrvData *drvData = (struct GyroDrvData *)OsalMemCalloc(sizeof(*drvData)); if (drvData == NULL) { - HDF_LOGE("%s: malloc gyro drv data fail!", __func__); + HDF_LOGE("%s: Malloc gyro drv data fail!", __func__); return HDF_ERR_MALLOC_FAIL; } @@ -231,11 +212,9 @@ int32_t BindGyroDriver(struct HdfDeviceObject *device) return HDF_SUCCESS; } -static int32_t InitGyroOps(struct SensorDeviceInfo *deviceInfo) +static int32_t InitGyroOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) { - struct GyroDrvData *drvData = GyroGetDrvData(); - - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); deviceInfo->ops.Enable = SetGyroEnable; deviceInfo->ops.Disable = SetGyroDisable; @@ -244,149 +223,148 @@ static int32_t InitGyroOps(struct SensorDeviceInfo *deviceInfo) deviceInfo->ops.SetOption = SetGyroOption; if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), - &drvData->gyroCfg->sensorInfo, sizeof(drvData->gyroCfg->sensorInfo)) != EOK) { - HDF_LOGE("%s: copy sensor info failed", __func__); + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); return HDF_FAILURE; } return HDF_SUCCESS; } -static int32_t InitGyroAfterConfig(void) +static int32_t InitGyroAfterDetected(struct SensorCfgData *config) { struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); - if (InitGyroData() != HDF_SUCCESS) { - HDF_LOGE("%s: init gyro config failed", __func__); + if (InitGyroOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init gyro ops failed", __func__); return HDF_FAILURE; } - if (InitGyroOps(&deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: init gyro ops failed", __func__); + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add gyro device failed", __func__); return HDF_FAILURE; } - if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { - HDF_LOGE("%s: add gyro device failed", __func__); + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor register failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorAllRegConfig(config); return HDF_FAILURE; } - return HDF_SUCCESS; } -static int32_t DetectGyroChip(void) +struct SensorCfgData *GyroCreateCfgData(const struct DeviceResourceNode *node) { - int32_t num; - int32_t ret; - int32_t loop; struct GyroDrvData *drvData = GyroGetDrvData(); - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(drvData->gyroCfg, HDF_ERR_INVALID_PARAM); - - num = sizeof(g_gyroDetectIfList) / sizeof(g_gyroDetectIfList[0]); - for (loop = 0; loop < num; ++loop) { - if (g_gyroDetectIfList[loop].DetectChip != NULL) { - ret = g_gyroDetectIfList[loop].DetectChip(drvData->gyroCfg); - if (ret == HDF_SUCCESS) { - drvData->detectFlag = true; - return HDF_SUCCESS; - } - } + if (drvData == NULL || node == NULL) { + HDF_LOGE("%s: Gyro node pointer NULL", __func__); + return NULL; } - HDF_LOGE("%s: detect gyro device failed", __func__); - drvData->detectFlag = false; - return HDF_FAILURE; -} - -int32_t InitGyroDriver(struct HdfDeviceObject *device) -{ - CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); - struct GyroDrvData *drvData = (struct GyroDrvData *)device->service; - CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); - if (drvData->detectFlag) { - HDF_LOGE("%s: gyro sensor have detected", __func__); - return HDF_SUCCESS; + HDF_LOGE("%s: Gyro sensor have detected", __func__); + return NULL; } - drvData->gyroCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->gyroCfg)); if (drvData->gyroCfg == NULL) { - HDF_LOGE("%s: malloc sensor config data failed", __func__); - return HDF_FAILURE; + HDF_LOGE("%s: Gyro gyroCfg pointer NULL", __func__); + return NULL; } - drvData->gyroCfg->regCfgGroup = &g_regCfgGroup[0]; - - if (GetSensorBaseConfigData(device->property, drvData->gyroCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: get sensor base config failed", __func__); + if (GetSensorBaseConfigData(node, drvData->gyroCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); goto BASE_CONFIG_EXIT; } - // if return failure, hdf framework go to next detect sensor - if (DetectGyroChip() != HDF_SUCCESS) { - HDF_LOGE("%s: gyro sensor detect device no exist", __func__); - goto DETECT_CHIP_EXIT; - } - drvData->detectFlag = true; - - if (ParseSensorRegConfig(drvData->gyroCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: detect sensor device failed", __func__); - goto REG_CONFIG_EXIT; + if (DetectSensorDevice(drvData->gyroCfg) != HDF_SUCCESS) { + HDF_LOGI("%s: Gyro sensor detect device no exist", __func__); + drvData->detectFlag = false; + goto BASE_CONFIG_EXIT; } - if (InitGyroAfterConfig() != HDF_SUCCESS) { - HDF_LOGE("%s: init gyro after config failed", __func__); + drvData->detectFlag = true; + if (InitGyroAfterDetected(drvData->gyroCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Gyro sensor detect device no exist", __func__); goto INIT_EXIT; } - - HDF_LOGI("%s: init gyro driver success", __func__); - return HDF_SUCCESS; + return drvData->gyroCfg; INIT_EXIT: - (void)DeleteSensorDevice(&drvData->gyroCfg->sensorInfo); -REG_CONFIG_EXIT: - ReleaseSensorAllRegConfig(drvData->gyroCfg); (void)ReleaseSensorBusHandle(&drvData->gyroCfg->busCfg); -DETECT_CHIP_EXIT: - drvData->detectFlag = false; BASE_CONFIG_EXIT: drvData->gyroCfg->root = NULL; - drvData->gyroCfg->regCfgGroup = NULL; - OsalMemFree(drvData->gyroCfg); - drvData->gyroCfg = NULL; - return HDF_FAILURE; + (void)memset_s(&drvData->gyroCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&drvData->gyroCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&drvData->gyroCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); + return drvData->gyroCfg; +} + +void GyroReleaseCfgData(struct SensorCfgData *gyroCfg) +{ + CHECK_NULL_PTR_RETURN(gyroCfg); + + (void)DeleteSensorDevice(&gyroCfg->sensorInfo); + ReleaseSensorAllRegConfig(gyroCfg); + (void)ReleaseSensorBusHandle(&gyroCfg->busCfg); + + gyroCfg->root = NULL; + (void)memset_s(&gyroCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); + (void)memset_s(&gyroCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&gyroCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); +} + +int32_t GyroInitDriver(struct HdfDeviceObject *device) +{ + HDF_LOGE("%s: cclog ----> 1111111111111111 ", __func__); + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct GyroDrvData *drvData = (struct GyroDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitGyroData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init gyro config failed", __func__); + return HDF_FAILURE; + } + + drvData->gyroCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->gyroCfg)); + if (drvData->gyroCfg == NULL) { + HDF_LOGE("%s: Malloc gyro config data failed", __func__); + return HDF_FAILURE; + } + + drvData->gyroCfg->regCfgGroup = &g_regCfgGroup[0]; + + HDF_LOGI("%s: Init gyro driver success", __func__); + return HDF_SUCCESS; } -void ReleaseGyroDriver(struct HdfDeviceObject *device) +void GyroReleaseDriver(struct HdfDeviceObject *device) { CHECK_NULL_PTR_RETURN(device); struct GyroDrvData *drvData = (struct GyroDrvData *)device->service; CHECK_NULL_PTR_RETURN(drvData); - (void)DeleteSensorDevice(&drvData->gyroCfg->sensorInfo); - drvData->detectFlag = false; - - if (drvData->gyroCfg != NULL) { - drvData->gyroCfg->root = NULL; - drvData->gyroCfg->regCfgGroup = NULL; - ReleaseSensorAllRegConfig(drvData->gyroCfg); - (void)ReleaseSensorBusHandle(&drvData->gyroCfg->busCfg); - OsalMemFree(drvData->gyroCfg); - drvData->gyroCfg = NULL; + if (drvData->detectFlag && drvData->gyroCfg != NULL) { + GyroReleaseCfgData(drvData->gyroCfg); } - drvData->initStatus = false; + OsalMemFree(drvData->gyroCfg); + drvData->gyroCfg = NULL; + + HdfWorkDestroy(&drvData->gyroWork); + HdfWorkQueueDestroy(&drvData->gyroWorkQueue); + OsalMemFree(drvData); } struct HdfDriverEntry g_sensorGyroDevEntry = { .moduleVersion = 1, .moduleName = "HDF_SENSOR_GYRO", - .Bind = BindGyroDriver, - .Init = InitGyroDriver, - .Release = ReleaseGyroDriver, + .Bind = GyroBindDriver, + .Init = GyroInitDriver, + .Release = GyroReleaseDriver, }; HDF_INIT(g_sensorGyroDevEntry); diff --git a/model/sensor/driver/gyro/sensor_gyro_driver.h b/model/sensor/driver/gyro/sensor_gyro_driver.h index bb63e10d3..6e64f9632 100644 --- a/model/sensor/driver/gyro/sensor_gyro_driver.h +++ b/model/sensor/driver/gyro/sensor_gyro_driver.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. @@ -15,9 +15,6 @@ #include "sensor_config_parser.h" #include "sensor_platform_if.h" -#define GYRO_DEFAULT_SAMPLING_200_MS 200000000 -#define GYRO_CHIP_NAME_BMI160 "bmi160" - enum GyroAxisNum { GYRO_X_AXIS = 0, GYRO_Y_AXIS = 1, @@ -41,11 +38,6 @@ struct GyroData { int32_t z; }; -struct GyroDetectIfList { - char *chipName; - int32_t (*DetectChip)(struct SensorCfgData *data); -}; - struct GyroOpsCall { int32_t (*Init)(struct SensorCfgData *data); int32_t (*ReadData)(struct SensorCfgData *data); @@ -59,12 +51,13 @@ struct GyroDrvData { OsalTimer gyroTimer; bool detectFlag; bool enable; - bool initStatus; int64_t interval; struct SensorCfgData *gyroCfg; struct GyroOpsCall ops; }; -int32_t RegisterGyroChipOps(const struct GyroOpsCall *ops); +int32_t GyroRegisterChipOps(const struct GyroOpsCall *ops); +struct SensorCfgData *GyroCreateCfgData(const struct DeviceResourceNode *node); +void GyroReleaseCfgData(struct SensorCfgData *sensorCfgData); #endif /* SENSOR_GYRO_DRIVER_H */ -- Gitee From 1d507dea28a9f968763c111910072b211004da85 Mon Sep 17 00:00:00 2001 From: wangyipeng Date: Fri, 12 Nov 2021 16:21:01 +0800 Subject: [PATCH 166/272] modify warnings Signed-off-by: wangyipeng --- tools/hdi-gen/ast/ast_array_type.cpp | 44 ++++--- tools/hdi-gen/ast/ast_array_type.h | 3 + tools/hdi-gen/ast/ast_list_type.cpp | 42 ++++--- tools/hdi-gen/ast/ast_list_type.h | 3 + .../codegen/c_service_stub_code_emitter.cpp | 46 ++++--- .../codegen/c_service_stub_code_emitter.h | 3 + tools/hdi-gen/codegen/code_emitter.cpp | 1 - tools/hdi-gen/codegen/code_generator.cpp | 1 - .../codegen/cpp_service_stub_code_emitter.cpp | 1 - tools/hdi-gen/util/options.cpp | 116 ++++++++++-------- tools/hdi-gen/util/options.h | 8 +- 11 files changed, 155 insertions(+), 113 deletions(-) diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index 68f91e6fb..a2a1ec630 100755 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -276,25 +276,7 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - if (Options::GetInstance().DoGenerateKernelCode()) { - sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", - name.string(), element.string()); - sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); - sb.Append(newPrefix).Append("}\n\n"); - - sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", - name.string(), element.string(), element.string()); - sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", - element.string()); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); - sb.Append(newPrefix).Append("}\n"); - } else { - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); - } + EmitCStringElementUnMarshalling(name, sb, newPrefix, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -314,6 +296,30 @@ void ASTArrayType::EmitCUnMarshalling(const String& name, StringBuilder& sb, con freeObjStatements.pop_back(); } +void ASTArrayType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, + std::vector& freeObjStatements) const +{ + String element = String::Format("%sElement", name.string()); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", + name.string(), element.string()); + } +} + void ASTArrayType::EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { diff --git a/tools/hdi-gen/ast/ast_array_type.h b/tools/hdi-gen/ast/ast_array_type.h index 2d85836b3..7cc0ffe81 100755 --- a/tools/hdi-gen/ast/ast_array_type.h +++ b/tools/hdi-gen/ast/ast_array_type.h @@ -87,6 +87,9 @@ private: void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix) const; + void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, + std::vector& freeObjStatements) const; + AutoPtr elementType_; }; } // namespace HDI diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index fed768d38..e8ce1aeb9 100755 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -280,24 +280,7 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons } if (elementType_->GetTypeKind() == TypeKind::TYPE_STRING) { - String element = String::Format("%sElement", name.string()); - elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); - if (Options::GetInstance().DoGenerateKernelCode()) { - sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", - name.string(), element.string()); - sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); - sb.Append(newPrefix).Append("}\n\n"); - sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", - name.string(), element.string(), element.string()); - sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", - element.string()); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); - sb.Append(newPrefix).Append("}\n"); - } else { - sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", - name.string(), element.string()); - } + EmitCStringElementUnMarshalling(name, sb, newPrefix, freeObjStatements); } else if (elementType_->GetTypeKind() == TypeKind::TYPE_STRUCT) { String element = String::Format("&%s[i]", name.string()); elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); @@ -317,6 +300,29 @@ void ASTListType::EmitCUnMarshalling(const String& name, StringBuilder& sb, cons freeObjStatements.pop_back(); } +void ASTListType::EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, + std::vector& freeObjStatements) const +{ + String element = String::Format("%sElement", name.string()); + elementType_->EmitCUnMarshalling(element, sb, newPrefix + g_tab, freeObjStatements); + if (Options::GetInstance().DoGenerateKernelCode()) { + sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + name.string(), element.string()); + sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); + sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix).Append("}\n\n"); + sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + name.string(), element.string(), element.string()); + sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + element.string()); + sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix).Append("}\n"); + } else { + sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", + name.string(), element.string()); + } +} + void ASTListType::EmitCppMarshalling(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix, unsigned int innerLevel) const { diff --git a/tools/hdi-gen/ast/ast_list_type.h b/tools/hdi-gen/ast/ast_list_type.h index cb99d1b78..a0ab05eba 100755 --- a/tools/hdi-gen/ast/ast_list_type.h +++ b/tools/hdi-gen/ast/ast_list_type.h @@ -85,6 +85,9 @@ private: void EmitCStubReadStrElement(const String& parcelName, const String& name, StringBuilder& sb, const String& prefix) const; + void EmitCStringElementUnMarshalling(const String& name, StringBuilder& sb, const String& newPrefix, + std::vector& freeObjStatements) const; + AutoPtr elementType_ = nullptr; }; } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index c045a6df1..66bc51eb0 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -214,26 +214,7 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr type = param->GetType(); if (type->GetTypeKind() == TypeKind::TYPE_STRING) { - String cloneName = String::Format("%sCp", param->GetName().string()); - type->EmitCStubReadVar(parcelName, cloneName, sb, prefix); - if (isKernelCode_) { - sb.Append("\n"); - sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", - param->GetName().string(), cloneName.string()); - sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n\n"); - sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", - param->GetName().string(), cloneName.string(), cloneName.string()); - sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", - param->GetName().string()); - sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("goto errors;\n"); - sb.Append(prefix).Append("}\n"); - } else { - sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); - } + EmitReadCStringStubMethodParameter(param, parcelName, sb, prefix, type); } else if (type->GetTypeKind() == TypeKind::TYPE_INTERFACE) { type->EmitCStubReadVar(parcelName, param->GetName(), sb, prefix); } else if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { @@ -265,6 +246,31 @@ void CServiceStubCodeEmitter::EmitReadStubMethodParameter(const AutoPtr& param, + const String& parcelName, StringBuilder& sb, const String& prefix, AutoPtr& type) +{ + String cloneName = String::Format("%sCp", param->GetName().string()); + type->EmitCStubReadVar(parcelName, cloneName, sb, prefix); + if (isKernelCode_) { + sb.Append("\n"); + sb.Append(prefix).AppendFormat("%s = (char*)OsalMemCalloc(strlen(%s) + 1);\n", + param->GetName().string(), cloneName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", param->GetName().string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (strcpy_s(%s, (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", + param->GetName().string(), cloneName.string(), cloneName.string()); + sb.Append(prefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", + param->GetName().string()); + sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("goto errors;\n"); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("%s = strdup(%s);\n", param->GetName().string(), cloneName.string()); + } +} + void CServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& method, const String& gotoLabel, StringBuilder& sb, const String& prefix) { diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 6d24f5ee9..fdde479f0 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -42,6 +42,9 @@ private: void EmitReadStubMethodParameter(const AutoPtr& param, const String& parcelName, StringBuilder& sb, const String& prefix); + void EmitReadCStringStubMethodParameter(const AutoPtr& param, const String& parcelName, + StringBuilder& sb, const String& prefix, AutoPtr& type); + void EmitStubCallMethod(const AutoPtr& method, const String& gotoLabel, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/code_emitter.cpp b/tools/hdi-gen/codegen/code_emitter.cpp index e002b2c8f..3f1c70283 100755 --- a/tools/hdi-gen/codegen/code_emitter.cpp +++ b/tools/hdi-gen/codegen/code_emitter.cpp @@ -12,7 +12,6 @@ namespace OHOS { namespace HDI { - bool CodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) { if (!Reset(ast, targetDirectory, isKernelCode)) { diff --git a/tools/hdi-gen/codegen/code_generator.cpp b/tools/hdi-gen/codegen/code_generator.cpp index ba65e72c0..00d13adc4 100755 --- a/tools/hdi-gen/codegen/code_generator.cpp +++ b/tools/hdi-gen/codegen/code_generator.cpp @@ -171,6 +171,5 @@ void CodeGenerator::GenerateJavaCode(const AutoPtr& ast, const String& outD break; } } - } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index aae2b7c4f..23e5c464f 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -84,7 +84,6 @@ void CppServiceStubCodeEmitter::EmitStubDecl(StringBuilder& sb) EmitStubUsingNamespace(sb); sb.Append("\n"); sb.AppendFormat("class %s {\n", stubName_.string()); - sb.Append("public:\n"); EmitStubBody(sb, g_tab); sb.Append("};\n"); diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 6d872ea32..a20a74509 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -46,63 +46,75 @@ Options& Options::Parse(int argc, char* const argv[]) int optIndex = 0; while ((op = getopt_long(argc, argv, optSupportArgs, g_longOpts, &optIndex)) != OPT_END) { - switch (op) { - case 'c': - doCompile_ = true; - sourceFilePath_ = optarg; - break; - case 'd': - doOutDir_ = true; - generationDirectory_ = optarg; - break; - case 'h': - doShowUsage_ = true; - break; - case 'v': - doShowVersion_ = true; - break; - case 'k': - doModeKernel_ = true; - break; - case 'u': - doModeKernel_ = false; - break; - case 'C': - doGenerateCode_ = true; - targetLanguage_ = "c"; - break; - case 'P': - doGenerateCode_ = true; - targetLanguage_ = "cpp"; - break; - case 'J': - doGenerateCode_ = true; - targetLanguage_ = "java"; - break; - case 'a': - doGeneratePart_ = true; - codePart_ = "client"; - break; - case 'b': - doGeneratePart_ = true; - codePart_ = "server"; - break; - case 'H': - doGetHashKey_ = true; - break; - case 'D': - doDumpAST_ = true; - break; - case '?': - default: - doShowUsage_ = true; - break; - } + SetOptionData(op); } CheckOptions(); return *this; } +void Options::SetOptionData(char op) +{ + switch (op) { + case 'c': + doCompile_ = true; + sourceFilePath_ = optarg; + break; + case 'd': + doOutDir_ = true; + generationDirectory_ = optarg; + break; + case 'h': + doShowUsage_ = true; + break; + case 'v': + doShowVersion_ = true; + break; + case 'k': + doModeKernel_ = true; + break; + case 'u': + doModeKernel_ = false; + break; + case 'C': + SetLanguage("c"); + break; + case 'P': + SetLanguage("cpp"); + break; + case 'J': + SetLanguage("java"); + break; + case 'a': + SetCodePart("client"); + break; + case 'b': + SetCodePart("server"); + break; + case 'H': + doGetHashKey_ = true; + break; + case 'D': + doDumpAST_ = true; + break; + case '?': + default: + doShowUsage_ = true; + break; + } +} + +void Options::SetLanguage(String language) +{ + doGenerateCode_ = true; + targetLanguage_ = language; +} + +void Options::SetCodePart(String part) +{ + doGeneratePart_ = true; + codePart_ = part; +} + void Options::CheckOptions() { if (doShowUsage_ || doShowVersion_) { diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index 0b31b04d7..f5e410d4a 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -106,7 +106,13 @@ private: doGetHashKey_(false), doGenerateCode_(false), doOutDir_(false) {} - + + void SetOptionData(char op); + + void SetLanguage(String language); + + void SetCodePart(String part); + void CheckOptions(); static const char* optSupportArgs; -- Gitee From 5ad6eeaa0bf732d6f9f83f53f0874181b71d8620 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Mon, 8 Nov 2021 17:23:13 +0800 Subject: [PATCH 167/272] add thenew pinctrl framework files Signed-off-by: jiaziyang --- include/platform/pin_if.h | 141 +++++++ support/platform/include/pin/pin_core.h | 84 ++++ support/platform/src/pin/pin_core.c | 394 ++++++++++++++++++ support/platform/src/pin/pin_if.c | 107 +++++ .../test/unittest/common/hdf_pin_test.cpp | 135 ++++++ test/unittest/common/hdf_main_test.c | 6 + test/unittest/common/hdf_main_test.h | 2 +- test/unittest/include/hdf_uhdf_test.h | 4 +- .../platform/common/pin_driver_test.c | 116 ++++++ test/unittest/platform/common/pin_test.c | 372 +++++++++++++++++ test/unittest/platform/common/pin_test.h | 55 +++ test/unittest/platform/hdf_pin_entry_test.c | 26 ++ test/unittest/platform/hdf_pin_entry_test.h | 16 + 13 files changed, 1455 insertions(+), 3 deletions(-) create mode 100644 include/platform/pin_if.h create mode 100644 support/platform/include/pin/pin_core.h create mode 100644 support/platform/src/pin/pin_core.c create mode 100644 support/platform/src/pin/pin_if.c create mode 100644 support/platform/test/unittest/common/hdf_pin_test.cpp create mode 100644 test/unittest/platform/common/pin_driver_test.c create mode 100644 test/unittest/platform/common/pin_test.c create mode 100644 test/unittest/platform/common/pin_test.h create mode 100644 test/unittest/platform/hdf_pin_entry_test.c create mode 100644 test/unittest/platform/hdf_pin_entry_test.h diff --git a/include/platform/pin_if.h b/include/platform/pin_if.h new file mode 100644 index 000000000..74c816ac3 --- /dev/null +++ b/include/platform/pin_if.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +/** + * @file pin_if.h + * + * @brief Declares the standard pin interface functions. + * + * @since 1.0 + */ + +#ifndef PIN_IF_H +#define PIN_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +/** + * @brief Enumerates pin pull types. + * + * @since 1.0 + */ +enum PinPullType { + PIN_PULL_NONE = 0, /*< SET PIN SUSPEND >*/ + PIN_PULL_UP = 1, /*< SET PIN RESISTANCE UP >*/ + PIN_PULL_DOWN = 2, /*< SET PIN RESISTANCE DOWN >*/ +}; +/** + * @brief Obtains the handle of a pin. + * + * You must call this function before setting a pin properties. + * + * @param pinName Indicates the pin which you want to setting properties. + * + * @return Returns the pointer to the {@link DevHandle} of the pin controller which to get a pin if the operation is successful; + * returns NULL otherwise. + * @since 1.0 + */ +DevHandle PinGet(const char *pinName); + +/** + * @brief Releases the handle of a pin. + * + * If you no longer need to access the pin, you should call this function to close its handle so as + * to release unused memory resources. + * + * @param handle Indicates the pointer to the device handle of the pin. + * + * @since 1.0 + */ +void PinPut(DevHandle handle); + +/** + * @brief Set the pin pullType configuration. + * + * You can call this function when you need to set the pin pull configuration. + * @param handle Indicates the pointer to the device handle of the pin. + * @param pullType Indicates the type of pin pull. + * + * @return Returns 0 if set the pin Pull configuration operation is successfully; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinSetPull(DevHandle handle, enum PinPullType pullType); + +/** + * @brief Get the pin pullType configuration. + * + * You can call this function when you need to get the pin pull configuration. + * + * @param handle Indicates the pointer to the device handle of the pin. + * @param pullType Indicates the pointer of the Pin Pull Type. + * @return Returns 0 if get the pin Pull configuration operation is successfully; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType); + +/** + * @brief Set the pin strength configuration. + * + * You can call this function when you need to set the pin strength configuration. + * @param handle Indicates the pointer to the device handle of the pin. + * @param strength Indicates the value of pin strength. + * + * @return Returns 0 if set the pin strength configuration operation is successfully; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinSetStrength(DevHandle handle, uint32_t strength); + +/** + * @brief Get the pin strength configuration. + * + * You can call this function when you need to get the pin strength configuration. + * + * @param handle Indicates the pointer to the device handle of the pin. + * @param strength Indicates the pointer of the Pin strength value. + * @return Returns 0 if get the pin strength configuration operation is successfully; Returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinGetStrength(DevHandle handle, uint32_t *strength); + +/** + * @brief Set the pin function configuration. + * + * You can call this function when you need to set the pin function configuration. + * + * @param handle Indicates the pointer to the device handle of the pin description. + * @param funcName Indicates the pointer of the pin function. + * @return Returns 0 if set the pin function configuration operation is successfully; returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinSetFunc(DevHandle handle, const char *funcName); + +/** + * @brief Get the pin function configuration. + * + * You can call this function when you need to get the pin function configuration. + * + * @param handle Indicates the pointer to the device handle of the pin description. + * @param funcName Indicates the double pointer of the pin function. + * @return Returns 0 if get the pin function configuration operation is successfully; returns a negative value otherwise. + * @since 1.0 + */ +int32_t PinGetFunc(DevHandle handle, const char **funcName); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* PIN_IF_H */ diff --git a/support/platform/include/pin/pin_core.h b/support/platform/include/pin/pin_core.h new file mode 100644 index 000000000..c90d811bf --- /dev/null +++ b/support/platform/include/pin/pin_core.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#ifndef PIN_CORE_H +#define PIN_CORE_H + +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_dlist.h" +#include "pin_if.h" +#include "osal_spinlock.h" +#include "osal_atomic.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct PinCntlr; +struct PinCntlrMethod; +struct PinDesc; + +struct PinDesc { + const char *pinName; + void *priv; +}; + +struct PinCntlr { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct PinCntlrMethod *method; + struct DListHead list; + OsalSpinlock spin; + uint16_t number; + uint16_t pinCount; + struct PinDesc *pins; + void *priv; +}; + +struct PinCntlrMethod { + int32_t (*SetPinPull)(struct PinCntlr *cntlr, uint32_t index, enum PinPullType pullType); + int32_t (*GetPinPull)(struct PinCntlr *cntlr, uint32_t index, enum PinPullType *pullType); + int32_t (*SetPinStrength)(struct PinCntlr *cntlr, uint32_t index, uint32_t strength); + int32_t (*GetPinStrength)(struct PinCntlr *cntlr, uint32_t index, uint32_t *strength); + int32_t (*SetPinFunc)(struct PinCntlr *cntlr, uint32_t index, const char *funcName); + int32_t (*GetPinFunc)(struct PinCntlr *cntlr, uint32_t index, const char **funcName); +}; + +int32_t PinCntlrAdd(struct PinCntlr *cntlr); + +void PinCntlrRemove(struct PinCntlr *cntlr); + +struct PinDesc *PinCntlrGetPinDescByName(const char *pinName); + +struct PinCntlr *PinCntlrGetByNumber(uint16_t number); + +struct PinCntlr *PinCntlrGetByPin(struct PinDesc *desc); + +void PinCntlrPutPin(struct PinDesc *desc); + +int32_t PinCntlrSetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, enum PinPullType pullType); + +int32_t PinCntlrGetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, enum PinPullType *pullType); + +int32_t PinCntlrSetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, uint32_t strength); + +int32_t PinCntlrGetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, uint32_t *strength); + +int32_t PinCntlrSetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, const char *funcName); + +int32_t PinCntlrGetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, const char **funcName); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* PIN_CORE_H */ diff --git a/support/platform/src/pin/pin_core.c b/support/platform/src/pin/pin_core.c new file mode 100644 index 000000000..4bfde118b --- /dev/null +++ b/support/platform/src/pin/pin_core.c @@ -0,0 +1,394 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "pin_core.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_sem.h" +#include "securec.h" + +#define HDF_LOG_TAG pin_core + +#define MAX_CNT_PER_CNTLR 20 + +static struct DListHead g_cntlrList; +static OsalSpinlock g_listLock; +static uint32_t g_irqSave; + +static struct DListHead *PinCntlrListGet(void) +{ + static struct DListHead *list = NULL; + uint32_t irqSave; + if (list == NULL) { + list = &g_cntlrList; + DListHeadInit(list); + OsalSpinInit(&g_listLock); + } + while (OsalSpinLockIrqSave(&g_listLock, &irqSave) != HDF_SUCCESS); + g_irqSave = irqSave; + return list; +} + +static void PinCntlrListPut(void) +{ + (void)OsalSpinUnlockIrqRestore(&g_listLock, &g_irqSave); +} + +int32_t PinCntlrAdd(struct PinCntlr *cntlr) +{ + struct DListHead *list = NULL; + + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL) { + HDF_LOGE("%s: no method supplied!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->pinCount >= MAX_CNT_PER_CNTLR) { + HDF_LOGE("%s: invalid pinCount:%u", __func__, cntlr->pinCount); + return HDF_ERR_INVALID_PARAM; + } + + OsalSpinInit(&cntlr->spin); + + list = PinCntlrListGet(); + + DListHeadInit(&cntlr->list); + DListInsertTail(&cntlr->list, list); + PinCntlrListPut(); + + return HDF_SUCCESS; +} + +void PinCntlrRemove(struct PinCntlr *cntlr) +{ + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL!", __func__); + return; + } + + (void)PinCntlrListGet(); + DListRemove(&cntlr->list); + PinCntlrListPut(); + (void)OsalSpinDestroy(&cntlr->spin); +} + +struct PinDesc *PinCntlrGetPinDescByName(const char *pinName) +{ + struct DListHead *list = NULL; + struct PinCntlr *cntlr = NULL; + struct PinCntlr *tmp = NULL; + int32_t num; + + list = PinCntlrListGet(); + + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + for (num = 0; num < cntlr->pinCount; num++) { + if (cntlr->pins[num].pinName == NULL) { + continue; + } + if (!strcmp(cntlr->pins[num].pinName, pinName)) { + PinCntlrListPut(); + HDF_LOGI("%s: cntlr->pins[%d].pinName is %s!", __func__, num, cntlr->pins[num].pinName); + return &cntlr->pins[num]; + } + } + } + PinCntlrListPut(); + HDF_LOGE("%s: pinName:%s doesn't matching!", __func__, pinName); + return NULL; +} + +struct PinCntlr *PinCntlrGetByNumber(uint16_t number) +{ + struct DListHead *list = NULL; + struct PinCntlr *cntlr = NULL; + struct PinCntlr *tmp = NULL; + list = PinCntlrListGet(); + + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + if(cntlr->number == number) { + PinCntlrListPut(); + HDF_LOGI("%s: get cntlr by number success!", __func__); + return cntlr; + } + } + PinCntlrListPut(); + HDF_LOGE("%s: get cntlr by number error!", __func__); + return NULL; +} + +struct PinCntlr *PinCntlrGetByPin(struct PinDesc *desc) +{ + struct DListHead *list = NULL; + struct PinCntlr *cntlr = NULL; + struct PinCntlr *tmp = NULL; + int32_t num; + + list = PinCntlrListGet(); + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + for (num = 0; num pinCount; num++) { + if (desc == &cntlr->pins[num]) { + PinCntlrListPut(); + HDF_LOGI("%s: get cntlr by desc success!", __func__); + return cntlr; + } + } + } + PinCntlrListPut(); + HDF_LOGE("%s: pinCtrl:%s not in any controllers!", __func__, desc->pinName); + return NULL; +} + +static int32_t GetPinIndex(struct PinCntlr *cntlr, struct PinDesc *desc) +{ + int32_t index, ret; + + for (index = 0; index < cntlr->pinCount; index++) { + if (cntlr->pins[index].pinName == NULL) { + HDF_LOGE("%s: cntlr->pin[index].pinName is NULL!", __func__); + break; + } + ret = strcmp(cntlr->pins[index].pinName, desc->pinName); + if (ret == 0) { + HDF_LOGI("%s: get pin index:%d success!", __func__, index); + return index; + } + } + HDF_LOGE("%s: get pin index failed!", __func__); + return HDF_ERR_INVALID_PARAM; +} + +void PinCntlrPutPin(struct PinDesc *desc) +{ + (void)desc; +} + +int32_t PinCntlrSetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, + enum PinPullType pullType) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->SetPinPull == NULL) { + HDF_LOGE("%s: method or SetPinPull is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index fail!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->SetPinPull(cntlr, index, pullType); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + return ret; +} + +int32_t PinCntlrGetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, + enum PinPullType *pullType) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->GetPinPull == NULL) { + HDF_LOGE("%s: method or GetPinPull is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (pullType == NULL) { + HDF_LOGE("%s: pullType is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->GetPinPull(cntlr, index, pullType); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + + return ret; +} + +int32_t PinCntlrSetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, + uint32_t strength) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->SetPinStrength == NULL) { + HDF_LOGE("%s: method or SetStrength is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index fail!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->SetPinStrength(cntlr, index, strength); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + return ret; +} + +int32_t PinCntlrGetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, + uint32_t *strength) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->GetPinStrength == NULL) { + HDF_LOGE("%s: method or GetStrength is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (strength == NULL) { + HDF_LOGE("%s: strength is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->GetPinStrength(cntlr, index, strength); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + + return ret; +} + +int32_t PinCntlrSetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, + const char *funcName) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->SetPinFunc == NULL) { + HDF_LOGE("%s: method or SetPinFunc is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (funcName == NULL) { + HDF_LOGE("%s: invalid funcName pointer", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->SetPinFunc(cntlr, index, funcName); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + return ret; +} + +int32_t PinCntlrGetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, + const char **funcName) +{ + int32_t ret; + uint32_t index; + uint32_t irqSave; + + if (cntlr == NULL) { + HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->method == NULL || cntlr->method->GetPinFunc == NULL) { + HDF_LOGE("%s: method or SetPinFunc is NULL", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (desc == NULL) { + HDF_LOGE("%s: desc is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + index = (uint32_t)GetPinIndex(cntlr, desc); + if (index < HDF_SUCCESS) { + HDF_LOGE("%s: get pin index failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + (void)OsalSpinLockIrqSave(&cntlr->spin, &irqSave); + ret = cntlr->method->GetPinFunc(cntlr, index, funcName); + (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); + return ret; +} \ No newline at end of file diff --git a/support/platform/src/pin/pin_if.c b/support/platform/src/pin/pin_if.c new file mode 100644 index 000000000..2f00840cc --- /dev/null +++ b/support/platform/src/pin/pin_if.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "pin_if.h" +#include "devsvc_manager_clnt.h" +#include "pin_core.h" +#include "hdf_base.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG pin_if + +DevHandle PinGet(const char *pinName) +{ + return (DevHandle)PinCntlrGetPinDescByName(pinName); +} + +void PinPut(DevHandle handle) +{ + if (handle == NULL) { + HDF_LOGE("%s: handle is NULL!", __func__); + return; + } + return PinCntlrPutPin((struct PinDesc *)handle); +} + +int32_t PinSetPull(DevHandle handle, enum PinPullType pullType) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrSetPinPull(cntlr, (struct PinDesc *)handle, pullType); +} + +int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrGetPinPull(cntlr, (struct PinDesc *)handle, pullType); +} + +int32_t PinSetStrength(DevHandle handle, uint32_t strength) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrSetPinStrength(cntlr, (struct PinDesc *)handle, strength); +} + +int32_t PinGetStrength(DevHandle handle, uint32_t *strength) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrGetPinStrength(cntlr, (struct PinDesc *)handle, strength); +} + +int32_t PinSetFunc(DevHandle handle, const char *funcName) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrSetPinFunc(cntlr, (struct PinDesc *)handle, funcName); +} + +int32_t PinGetFunc(DevHandle handle, const char **funcName) +{ + struct PinCntlr *cntlr = NULL; + + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + cntlr = PinCntlrGetByPin((struct PinDesc *)handle); + return PinCntlrGetPinFunc(cntlr, (struct PinDesc *)handle, funcName); +} \ No newline at end of file diff --git a/support/platform/test/unittest/common/hdf_pin_test.cpp b/support/platform/test/unittest/common/hdf_pin_test.cpp new file mode 100644 index 000000000..321b9b460 --- /dev/null +++ b/support/platform/test/unittest/common/hdf_pin_test.cpp @@ -0,0 +1,135 @@ +/* Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdf_uhdf_test.h" +#include "hdf_io_service_if.h" +#include "pin_test.h" + +using namespace testing::ext; + +class HdfPinTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfPinTest::SetUpTestCase() +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETUP_ALL, -1}; + HdfTestOpenService(); + HdfTestSendMsgToService(&msg); + +} + +void HdfPinTest::TearDownTestCase() +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_TEARDOWN_ALL, -1}; + HdfTestSendMsgToService(&msg); + HdfTestCloseService(); + +} + +void HdfPinTest::SetUp() +{ +} + +void HdfPinTest::TearDown() +{ +} + +/** + * @tc.name: PinTestSetGetPinPull001 + * @tc.desc: Pin set get pin Pull test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfPinTest, PinSetGetPull001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETGETPULL, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: PinTestGetPinPull001 + * @tc.desc: Pin get pin Pull test + * @tc.type: FUNC + * @tc.require: NA + */ +/*HWTEST_F(HdfPinTest, PinGetPull001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETPULL, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +*/ +/** + * @tc.name: PinTestSetGetStrength001 + * @tc.desc: Pin set get pin Strength test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfPinTest, PinSetGetStrength001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETGETSTRENGTH, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: PinTestGetStrength001 + * @tc.desc: Pin get pin Strength test + * @tc.type: FUNC + * @tc.require: NA + */ +/*HWTEST_F(HdfPinTest, PinGetStrength001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETSTRENGTH, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +*/ +/** + * @tc.name: PinSetGetPinFunc001 + * @tc.desc: Pin set get pin func test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfPinTest, PinSetGetPinFunc001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETGETFUNC, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: PinGetPinFunc001 + * @tc.desc: Pin getpinfunc test + * @tc.type: FUNC + * @tc.require: NA + */ +/*HWTEST_F(HdfPinTest, PinGetPinFunc001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETFUNC, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} +*/ +/** + * @tc.name: PinReliabilityTest001 + * @tc.desc: Pin function test + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(HdfPinTest, PinReliabilityTest001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_RELIABILITY, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} \ No newline at end of file diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index 7a33d356a..58119bc31 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -17,6 +17,9 @@ #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO) || defined(CONFIG_DRIVERS_HDF_PLATFORM_GPIO) #include "hdf_gpio_entry_test.h" #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_PIN) || defined(CONFIG_DRIVERS_HDF_PLATFORM_PIN) +#include "hdf_pin_entry_test.h" +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I2C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I2C) #include "hdf_i2c_entry_test.h" #endif @@ -80,6 +83,9 @@ HdfTestFuncList g_hdfTestFuncList[] = { #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO) || defined(CONFIG_DRIVERS_HDF_PLATFORM_GPIO) { TEST_PAL_GPIO_TYPE, HdfGpioTestEntry }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_PIN) || defined(CONFIG_DRIVERS_HDF_PLATFORM_PIN) + { TEST_PAL_PIN_TYPE, HdfPinTestEntry }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I2C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I2C) { TEST_PAL_I2C_TYPE, HdfI2cTestEntry }, #endif diff --git a/test/unittest/common/hdf_main_test.h b/test/unittest/common/hdf_main_test.h index 4c005a131..fc4cd43eb 100644 --- a/test/unittest/common/hdf_main_test.h +++ b/test/unittest/common/hdf_main_test.h @@ -38,7 +38,7 @@ typedef enum { TEST_PAL_I2C_TYPE = 0, TEST_PAL_SPI_TYPE = 1, TEST_PAL_GPIO_TYPE = 2, - TEST_PAL_PINCTRL_TYPE = 3, + TEST_PAL_PIN_TYPE = 3, TEST_PAL_CLOCK_TYPE = 4, TEST_PAL_REGULATOR_TYPE = 5, TEST_PAL_MIPI_DSI_TYPE = 6, diff --git a/test/unittest/include/hdf_uhdf_test.h b/test/unittest/include/hdf_uhdf_test.h index 73a762633..41f419f7a 100644 --- a/test/unittest/include/hdf_uhdf_test.h +++ b/test/unittest/include/hdf_uhdf_test.h @@ -34,7 +34,7 @@ enum HdfTestSubModuleCmd { TEST_PAL_I2C_TYPE = 0, TEST_PAL_SPI_TYPE = 1, TEST_PAL_GPIO_TYPE = 2, - TEST_PAL_PINCTRL_TYPE = 3, + TEST_PAL_PIN_TYPE = 3, TEST_PAL_CLOCK_TYPE = 4, TEST_PAL_REGULATOR_TYPE = 5, TEST_PAL_MIPI_DSI_TYPE = 6, @@ -78,4 +78,4 @@ int HdfTestSendMsgToService(struct HdfTestMsg *msg); } #endif /* __cplusplus */ -#endif // HDF_UHDF_TEST_H \ No newline at end of file +#endif // HDF_UHDF_TEST_H diff --git a/test/unittest/platform/common/pin_driver_test.c b/test/unittest/platform/common/pin_driver_test.c new file mode 100644 index 000000000..9f99572ef --- /dev/null +++ b/test/unittest/platform/common/pin_driver_test.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "pin_test.h" +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "string.h" + +#define HDF_LOG_TAG pin_driver_test_c + +static struct PinTestConfig g_config; + +static int32_t PinTestDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + if (cmd == 0) { + if (reply == NULL) { + HDF_LOGE("%s: reply is null!", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufWriteBuffer(reply, &g_config, sizeof(g_config))) { + HDF_LOGE("%s: write reply failed", __func__); + return HDF_ERR_IO; + } + } else { + return HDF_ERR_NOT_SUPPORT; + } + + return HDF_SUCCESS; +} +static int32_t PinTestReadConfig(struct PinTestConfig *config, const struct DeviceResourceNode *node) +{ + int32_t ret; + const char *funcName = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetString == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return HDF_FAILURE; + } + ret = drsOps->GetString(node, "pinName", &config->pinName, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read pinName failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "strengthNum", &config->strengthNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read StrengthNum failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "PullTypeNum", &config->PullTypeNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read PullTypeNum failed", __func__); + return ret; + } + + ret = drsOps->GetString(node, "funcName", &funcName, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read funcName failed", __func__); + return ret; + } + stpcpy(config->funcNameBuf, funcName); + return HDF_SUCCESS; +} + +static int32_t PinTestBind(struct HdfDeviceObject *device) +{ + int32_t ret; + static struct IDeviceIoService service; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or config is null!", __func__); + return HDF_ERR_IO; + } + ret = PinTestReadConfig(&g_config, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed", __func__); + return ret; + } + service.Dispatch = PinTestDispatch; + device->service = &service; + return HDF_SUCCESS; +} + +static int32_t PinTestInit(struct HdfDeviceObject *device) +{ + (void)device; + return HDF_SUCCESS; +} + +static void PinTestRelease(struct HdfDeviceObject *device) +{ + if (device != NULL) { + device->service = NULL; + } + HDF_LOGI("%s: Done!", __func__); + return; +} + +struct HdfDriverEntry g_pinTestEntry = { + .moduleVersion = 1, + .Bind = PinTestBind, + .Init = PinTestInit, + .Release = PinTestRelease, + .moduleName = "PLATFORM_PIN_TEST", +}; +HDF_INIT(g_pinTestEntry); \ No newline at end of file diff --git a/test/unittest/platform/common/pin_test.c b/test/unittest/platform/common/pin_test.c new file mode 100644 index 000000000..4d3f65286 --- /dev/null +++ b/test/unittest/platform/common/pin_test.c @@ -0,0 +1,372 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "pin_test.h" +#include "pin_if.h" +#include "hdf_base.h" +#include "hdf_io_service_if.h" +#include "hdf_log.h" +#include "securec.h" +#include "osal_mem.h" +#include "osal_time.h" + +#define HDF_LOG_TAG pin_test_c + +#define PIN_FUNC_NAME_LENGTH 30 + +struct PinCfgs { + enum PinPullType pullTypeNum; + uint32_t strengthNum; + const char *funcName; +} g_oldPinCfg; + +struct PinTestEntry { + int cmd; + int32_t (*func)(void); + const char *name; +}; + +static int32_t PinTestGetTestConfig(struct PinTestConfig *config) +{ + int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = NULL; + const void *buf = NULL; + uint32_t len; + + HDF_LOGD("%s: enter", __func__); + service = HdfIoServiceBind("PIN_TEST"); + if (service == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + reply = HdfSBufObtain(sizeof(*config) + sizeof(uint64_t)); + if (reply == NULL) { + HDF_LOGE("%s: Failed to obtain reply", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = service->dispatcher->Dispatch(&service->object, 0, NULL, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Remote dispatch failed", __func__); + return ret; + } + + if (!HdfSbufReadBuffer(reply, &buf, &len)) { + HDF_LOGE("%s: Read buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (len != sizeof(*config)) { + HDF_LOGE("%s: Config size:%zu, read size:%u", __func__, sizeof(*config), len); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (memcpy_s(config, sizeof(*config), buf, sizeof(*config)) != EOK) { + HDF_LOGE("%s: Memcpy buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + HdfSBufRecycle(reply); + HDF_LOGD("%s: Done", __func__); + return HDF_SUCCESS; +} + +struct PinTester *PinTesterGet(void) +{ + int32_t ret; + static struct PinTester tester; + static bool hasInit = false; + + if (hasInit) { + return &tester; + } + HDF_LOGI("%s: enter", __func__); + if (hasInit) { + return &tester; + } + ret = PinTestGetTestConfig(&tester.config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed:%d", __func__, ret); + return NULL; + } + tester.handle = PinGet(tester.config.pinName); + if (tester.handle == NULL) { + HDF_LOGE("%s: open pin:%s failed", __func__, tester.config.pinName); + return NULL; + } + hasInit = true; + HDF_LOGD("%s: Done", __func__); + return &tester; +} + +static int32_t PinSetGetPullTest(void) +{ + struct PinTester *tester = NULL; + int32_t ret; + enum PinPullType getPullTypeNum; + + tester = PinTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + ret = PinSetPull(tester->handle, tester->config.PullTypeNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin set pull failed!, pinName:%s", __func__, tester->config.pinName); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin set pull success!, PullTypeNum:%d", __func__,tester->config.PullTypeNum); + ret = PinGetPull(tester->handle, &getPullTypeNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin get pull failed!, pinName:%s", __func__, tester->config.pinName); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin get pull success!, PullTypeNum:%d", __func__,getPullTypeNum); + if (tester->config.PullTypeNum != getPullTypeNum) { + HDF_LOGE("%s: Pin set pull:%d, but Pin get pull:%u", __func__, tester->config.PullTypeNum, getPullTypeNum); + } + HDF_LOGD("%s: done", __func__); + return HDF_SUCCESS; +} + +static int32_t PinSetGetStrengthTest(void) +{ + struct PinTester *tester = NULL; + int32_t ret; + uint32_t getStrengthNum; + + tester = PinTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + ret = PinSetStrength(tester->handle, tester->config.strengthNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin set strength failed!, pinName:%s", __func__, tester->config.pinName); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin set strength success!,strengthNum:%d", __func__, tester->config.strengthNum); + ret = PinGetStrength(tester->handle, &getStrengthNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin get pull failed!, pinName:%s", __func__, tester->config.pinName); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin get pull success!, strengthNum:%d", __func__, getStrengthNum); + if (tester->config.strengthNum != getStrengthNum) { + HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d", __func__, tester->config.strengthNum, getStrengthNum); + } + HDF_LOGD("%s: done", __func__); + return HDF_SUCCESS; +} + +static int32_t PinSetGetFuncTest(void) +{ + struct PinTester *tester = NULL; + int32_t ret; + + tester = PinTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: Get tester failed!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + ret = PinSetFunc(tester->handle, (const char *)tester->config.funcNameBuf); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin set function failed!, pinName:%s,functionName:%s", __func__, + tester->config.pinName, tester->config.funcNameBuf); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin set function success!, pinName:%s,functionName:%s", __func__, + tester->config.pinName, tester->config.funcNameBuf); + ret = PinGetFunc(tester->handle, &tester->config.funcName); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Pin get function failed!, pinName:%s,functionName:%s", __func__, + tester->config.pinName, tester->config.funcName); + return HDF_FAILURE; + } + HDF_LOGI("%s: Pin get function success!, pinName:%s,functionName:%s", __func__, + tester->config.pinName, tester->config.funcName); + if (strcmp((const char *)tester->config.funcNameBuf, tester->config.funcName) != 0) { + HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", __func__, tester->config.funcNameBuf, tester->config.funcName); + } + HDF_LOGD("%s: done", __func__); + return HDF_SUCCESS; +} + +int32_t PinTestSetUpAll(void) +{ + int32_t ret; + struct PinTester *tester = NULL; + struct PinTestConfig *cfg = NULL; + + HDF_LOGD("%s: enter!", __func__); + tester = PinTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester fail!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + tester->total = PIN_TEST_CMD_MAX; + tester->fails = 0; + + cfg = &tester->config; + HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", __func__, + cfg->pinName,cfg->PullTypeNum, cfg->strengthNum); + ret = PinGetPull(tester->handle , &g_oldPinCfg.pullTypeNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get pullTypeNum failed!", __func__); + return ret; + } + ret = PinGetStrength(tester->handle, &g_oldPinCfg.strengthNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get strengthNum failed!", __func__); + return ret; + } + g_oldPinCfg.funcName = (char *)OsalMemCalloc(PIN_FUNC_NAME_LENGTH * sizeof(char)); + if (g_oldPinCfg.funcName == NULL) { + HDF_LOGE("%s: alloc g_oldPinCfg.funcName failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + tester->config.funcName = (char *)OsalMemCalloc(PIN_FUNC_NAME_LENGTH * sizeof(char)); + if (tester->config.funcName == NULL) { + HDF_LOGE("%s: alloc tester->config.funcName failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + ret = PinGetFunc(tester->handle, &g_oldPinCfg.funcName); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get funcName failed!", __func__); + return ret; + } + HDF_LOGI(":%s old funcName:%s", __func__, g_oldPinCfg.funcName); + HDF_LOGD("%s: exit!", __func__); + + return HDF_SUCCESS; +} + +int32_t PinTestTearDownAll(void) +{ + int32_t ret; + struct PinTester *tester = NULL; + + HDF_LOGD("%s: enter!", __func__); + tester = PinTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester fail!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + ret = PinSetPull(tester->handle , g_oldPinCfg.pullTypeNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: set pullTypeNum failed!", __func__); + return ret; + } + ret = PinSetStrength(tester->handle , g_oldPinCfg.strengthNum); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: set strengthNum failed!", __func__); + return ret; + } + ret = PinSetFunc(tester->handle , g_oldPinCfg.funcName); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: set funcName failed!", __func__); + return ret; + } + HDF_LOGD("%s: exit!", __func__); + + return HDF_SUCCESS; +} + +int32_t PinTestSetUpSingle(void) +{ + return HDF_SUCCESS; +} + +int32_t PinTestTearDownSingle(void) +{ + return HDF_SUCCESS; +} + +int32_t PinTestReliability(void) +{ + struct PinTester *tester = NULL; + + HDF_LOGI("%s: enter", __func__); + tester = PinTesterGet(); + if (tester == NULL || tester->handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + HDF_LOGD("%s: test dfr for PinSetPull ...", __func__); + // invalid handle + (void)PinSetPull(NULL, tester->config.PullTypeNum); + (void)PinGetPull(NULL, &tester->config.PullTypeNum); + (void)PinSetStrength(NULL, tester->config.strengthNum); + (void)PinGetStrength(NULL, &tester->config.strengthNum); + (void)PinSetFunc(NULL, (const char *)tester->config.funcNameBuf); + (void)PinGetFunc(NULL, &tester->config.funcName); + // invalid strengthNum + (void)PinSetStrength(tester->handle, -1); + (void)PinGetStrength(tester->handle, NULL); + // invalid FuncName + (void)PinSetFunc(tester->handle, NULL); + HDF_LOGD("%s:test done.All completed!", __func__); + + return HDF_SUCCESS; +} + +static struct PinTestEntry g_entry[] = { + { PIN_TEST_CMD_SETGETPULL, PinSetGetPullTest, "PinSetGetPullTest" }, + { PIN_TEST_CMD_SETGETSTRENGTH, PinSetGetStrengthTest, "PinSetGetStrengthTest" }, + { PIN_TEST_CMD_SETGETFUNC, PinSetGetFuncTest, "PinSetGetFuncTest" }, + { PIN_TEST_CMD_RELIABILITY, PinTestReliability, "PinTestReliability" }, + { PIN_TEST_CMD_SETUP_ALL, PinTestSetUpAll, "PinTestSetUpAll" }, + { PIN_TEST_CMD_TEARDOWN_ALL, PinTestTearDownAll, "PinTestTearDownAll" }, +}; + +int32_t PinTestExecute(int cmd) +{ + uint32_t i; + int32_t ret = HDF_ERR_NOT_SUPPORT; + + if(cmd > PIN_TEST_CMD_MAX) { + HDF_LOGE("%s: invalid cmd:%d", __func__, cmd); + ret = HDF_ERR_NOT_SUPPORT; + goto __EXIT__; + } + + for (i = 0; i < sizeof(g_entry) / sizeof(g_entry[0]); i++) { + if (g_entry[i].cmd != cmd || g_entry[i].func == NULL) { + continue; + } + ret = g_entry[i].func(); + break; + } + +__EXIT__: + HDF_LOGE("[%s][======cmd:%d====ret:%d======]", __func__, cmd, ret); + return ret; +} + +void PinTestExecuteAll(void) +{ + int32_t i; + int32_t ret; + int32_t fails = 0; + + /* setup env for all test cases */ + (void)PinTestExecute(PIN_TEST_CMD_SETUP_ALL); + + for (i = 0; i < PIN_TEST_CMD_SETUP_ALL; i++) { + ret = PinTestExecute(i); + fails += (ret != HDF_SUCCESS) ? 1 : 0; + } + + /* teardown env for all test cases */ + (void)PinTestExecute(PIN_TEST_CMD_TEARDOWN_ALL); + + HDF_LOGI("%s: **********PASS:%d FAIL:%d************\n\n", + __func__, PIN_TEST_CMD_RELIABILITY + 1 - fails, fails); +} \ No newline at end of file diff --git a/test/unittest/platform/common/pin_test.h b/test/unittest/platform/common/pin_test.h new file mode 100644 index 000000000..6dddb9abe --- /dev/null +++ b/test/unittest/platform/common/pin_test.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef PIN_TEST_H +#define PIN_TEST_H + +#include "pin_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct PinTestConfig { + const char *pinName; + char funcNameBuf[30]; + const char *funcName; + enum PinPullType PullTypeNum; + uint32_t strengthNum; +}; + +struct PinTester { + struct PinTestConfig config; + DevHandle handle; + uint16_t total; + uint16_t fails; +}; + +enum PinTestCmd { + PIN_TEST_CMD_SETGETPULL = 0, + PIN_TEST_CMD_SETGETSTRENGTH = 1, + PIN_TEST_CMD_SETGETFUNC = 2, + PIN_TEST_CMD_RELIABILITY = 3, + PIN_TEST_CMD_SETUP_ALL = 4, + PIN_TEST_CMD_TEARDOWN_ALL = 5, + PIN_TEST_CMD_SETUP_SINGLE = 6, + PIN_TEST_CMD_TEARDOWN_SINGLE = 7, + PIN_TEST_CMD_MAX = 8, +}; + +int32_t PinTestExecute(int cmd); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* PIN_TEST_H */ diff --git a/test/unittest/platform/hdf_pin_entry_test.c b/test/unittest/platform/hdf_pin_entry_test.c new file mode 100644 index 000000000..b159fcd36 --- /dev/null +++ b/test/unittest/platform/hdf_pin_entry_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_pin_entry_test.h" +#include "hdf_log.h" +#include "pin_test.h" + +#define HDF_LOG_TAG hdf_pin_entry_test + +int32_t HdfPinTestEntry(HdfTestMsg *msg) +{ + HDF_LOGD("%s: enter", __func__); + + if (msg == NULL) { + return HDF_FAILURE; + } + + msg->result = PinTestExecute(msg->subCmd); + + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/test/unittest/platform/hdf_pin_entry_test.h b/test/unittest/platform/hdf_pin_entry_test.h new file mode 100644 index 000000000..eac3848cd --- /dev/null +++ b/test/unittest/platform/hdf_pin_entry_test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_PIN_ENTRY_TEST_H +#define HDF_PIN_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfPinTestEntry(HdfTestMsg *msg); + +#endif /* HDF_PIN_ENTRY_TEST_H */ \ No newline at end of file -- Gitee From a6d75ac258ae20b6e2b10b3a1acba5dbd29edb36 Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 13 Nov 2021 11:26:35 +0800 Subject: [PATCH 168/272] add hcs macro config Signed-off-by: zhang --- tools/hc-gen/hc_gen.gni | 12 ++++++++++++ tools/hc-gen/src/macro_gen.cpp | 13 ++++++------- tools/hc-gen/src/macro_gen.h | 1 - 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/tools/hc-gen/hc_gen.gni b/tools/hc-gen/hc_gen.gni index 225ab42f2..ce153e3ab 100644 --- a/tools/hc-gen/hc_gen.gni +++ b/tools/hc-gen/hc_gen.gni @@ -37,10 +37,14 @@ template("hc_gen") { hc_flags = [ "-t" ] output_suffix = ".c" output_suffix2 = ".h" + } else if (defined(invoker.hc_gen_macro) && invoker.hc_gen_macro) { + hc_flags = [ "-m" ] + output_suffix = ".h" } else { hc_flags = [] output_suffix = ".hcb" } + if (defined(invoker.outputs)) { outputs = invoker.outputs } else { @@ -54,6 +58,7 @@ template("hc_gen") { } else { src = "{{source}}" } + args = [ rebase_path(get_path_info("//drivers/framework/tools/hc-gen/", "out_dir") + "/hc-gen") ] args += hc_flags @@ -78,3 +83,10 @@ template("hc_gen_hex") { forward_variables_from(invoker, "*") } } + +template("hc_gen_macro") { + hc_gen_macro = true + hc_gen(target_name) { + forward_variables_from(invoker, "*") + } +} diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index 273cf1c3f..e42896e00 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -118,15 +118,14 @@ std::string MacroGen::GenFullName(uint32_t depth, const std::shared_ptr &node) { static uint32_t index = 0; - std::string tmp(arrName); const uint32_t ELEMENT_PER_LINE = 8; if (index == 0) { - ofs_ << "#define " << tmp.append("_data {"); + ofs_ << "#define " << arrName << "_data {"; } if (index % ELEMENT_PER_LINE == 0) { - ofs_ << " \\\n "; + ofs_ << " \\\n" << TAB; } if (type == PARSEROP_STRING) { @@ -177,9 +176,9 @@ bool MacroGen::GenNodeForeach(uint32_t depth, const std::shared_ptr & for (iter = subList.begin(); iter != subList.end(); iter++) { index--; if (index) { - ofs_ << " " << "func(" << *iter << ") \\\n"; + ofs_ << TAB << "func(" << *iter << ") \\\n"; } else { - ofs_ << " " << "func(" << *iter << ")\n"; + ofs_ << TAB << "func(" << *iter << ")\n"; } } ofs_ << std::endl; @@ -189,9 +188,9 @@ bool MacroGen::GenNodeForeach(uint32_t depth, const std::shared_ptr & for (iter = subList.begin(); iter != subList.end(); iter++) { index--; if (index) { - ofs_ << " " << "func(" << *iter << ", __VA_ARGS__) \\\n"; + ofs_ << TAB << "func(" << *iter << ", __VA_ARGS__) \\\n"; } else { - ofs_ << " " << "func(" << *iter << ", __VA_ARGS__)\n"; + ofs_ << TAB << "func(" << *iter << ", __VA_ARGS__)\n"; } } ofs_ << std::endl; diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 647bf60bf..8785b94a8 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -24,7 +24,6 @@ public: ~MacroGen() override = default; bool Output() override; - private: bool Initialize(); -- Gitee From f97c1dae375976275333f8482145f3d218180cee Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Fri, 12 Nov 2021 16:48:44 +0800 Subject: [PATCH 169/272] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/include/hdmi/hdmi_edid.h | 2 +- support/platform/src/hdmi/hdmi_cec.c | 125 ++++++++++-------- support/platform/src/hdmi/hdmi_edid.c | 19 +-- support/platform/src/hdmi/hdmi_hdr.c | 2 +- support/platform/src/hdmi/hdmi_infoframe.c | 59 ++++++--- .../test/unittest/common/hdf_hdmi_test.cpp | 5 +- test/unittest/platform/common/i2s_test.c | 7 +- 7 files changed, 128 insertions(+), 91 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_edid.h b/support/platform/include/hdmi/hdmi_edid.h index 12629e4ca..5678ab977 100644 --- a/support/platform/include/hdmi/hdmi_edid.h +++ b/support/platform/include/hdmi/hdmi_edid.h @@ -406,7 +406,7 @@ struct HdmiEdidExtVsdbInfo { uint8_t interlacedVideoLatency; uint8_t interlacedAudioLatency; bool _3dPresent; - bool _3dMultiPresent; + uint8_t _3dMultiPresent; bool support3dType[HDMI_VS_VIDEO_3D_BUTT]; }; diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index aad1ddb6f..9716d4a9a 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -24,68 +24,68 @@ struct HdmiCecHandleMsgFuncMap { struct HdmiCecMsgLenInfo g_cecMsg[] = { { HDMI_CEC_OPCODE_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ACTIVE_SOURCE_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_IMAGE_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TEXT_VIEW_ON, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_INACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_INACTIVE_SOURCE_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REQUEST_ACTIVE_SOURCE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_ROUTING_CHANGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_CHANGE_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_ROUTING_INFORMATION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ROUTING_INFORMATIO_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_SET_STREAM_PATH, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_STREAM_PATH_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_STANDBY, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_RECORD_OFF, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_RECORD_ON, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_SOURCE_TYPE_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_RECORD_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_RECORD_STATUS_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_RECORD_TV_SCREEN, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_CLEAR_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_CLEAR_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_CLEAR_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_ANALOGUE_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_ANALOGUE_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_DIGITAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DIGITAL_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_EXTERNAL_TIMER, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_EXTERNAL_TIMER_INFO_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_TIMER_PROGRAM_TITLE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TIMER_CLEARED_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_CLEARED_STATUS_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TIMER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MIN_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_CEC_VERSION_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GET_CEC_VERSION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_PHYSICAL_ADDRESS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_PHYSICAL_ADDRESS_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_SET_MENU_LANGUAGE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_MENU_LANGUAGE_MSG_PARAM_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_REPORT_FEATURES, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_FEATURES_MSG_PARAM_MIN_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_GIVE_FEATURES, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_DECK_CONTROL, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_CONTROL_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DECK_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_DECK_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_DECK_STATUS_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_PLAY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_PLAY_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_GIVE_TUNER_DEVICE_STATU_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SELECT_ANALOGUE_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_ANALOGUE_SERVICE_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SELECT_DIGITAL_SERVICE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SELECT_DIGITAL_SERVICE_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TUNER_DEVICE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TUNER_DEVICE_STATUS_MSG_ANA_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TUNER_STEP_DECREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_TUNER_STEP_INCREMENT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_DEVICE_VENDOR_ID_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_DEVICE_VENDOR_ID, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_VENDOR_COMMAND, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_VENDOR_COMMAND_WITH_ID, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_VENDOR_ID_LEN), HDMI_CEC_MSG_ALL }, @@ -95,30 +95,30 @@ struct HdmiCecMsgLenInfo g_cecMsg[] = { { HDMI_CEC_OPCODE_GIVE_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_OSD_NAME, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_MENU_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_REQUEST_MSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_MENU_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_MENU_STATUS_MSG_PARAM_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_USER_CONTROL_PRESSED, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_UI_COMMAND_LEN), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_USER_CONTROL_RELEASED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_DEVICE_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_POWER_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_POWER_STATUS_MSG_PARA_LEN), - HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_2_0 }, + HDMI_CEC_MSG_DIRECTED_OR_BROADCAST_2_0 }, { HDMI_CEC_OPCODE_FEATURE_ABORT, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_FEATURE_ABORT_MSG_PARA_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_ABORT, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REQUEST_SHORT_AUDIO_DESCRIPTOR, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_SYSTEM_AUDIO_MODE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_MODE_REQUEST_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SYSTEM_AUDIO_MODE_STATUS, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SYSTEM_AUDIO_STATUS_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_SET_AUDIO_RATE, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_SET_AUDIO_RATE_PARAM_LEN), - HDMI_CEC_MSG_DIRECTED }, + HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_INITIATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_ARC_INITIATED, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_REPORT_ARC_TERMINATION, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, @@ -127,9 +127,9 @@ struct HdmiCecMsgLenInfo g_cecMsg[] = { { HDMI_CEC_OPCODE_TERMINATE_ARC, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_DIRECTED }, { HDMI_CEC_OPCODE_CDC_MESSAGE, HDMI_CEC_GET_MSG_LEN(0), HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_REQUEST_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REQUEST_CURRENT_LATENCY_MSG_LEN), - HDMI_CEC_MSG_BROADCAST }, + HDMI_CEC_MSG_BROADCAST }, { HDMI_CEC_OPCODE_REPORT_CURRENT_LATENCY, HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_CURRENT_LATENCY_MSG_PARAM_MIN_LEN), - HDMI_CEC_MSG_BROADCAST } + HDMI_CEC_MSG_BROADCAST } }; static struct HdmiCecMsgLenInfo *HdmiCecGetMsgLenInfo(uint8_t opcode) @@ -152,9 +152,9 @@ static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) /* Progremmed Indicator Check. */ if ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0x10) > 0) { - if ((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC || - info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE) && - msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN)) { + if (((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC) || + (info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE)) && + (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN))) { HDF_LOGD("check Timer_Status(Indicator) Msg fail."); return false; } @@ -352,10 +352,12 @@ static void HdmiCecEncodingDigitalServiceId(uint8_t *data, uint8_t len, struct H return; } - data[DATA_ZEROTH_OFFSET_ELEMENT] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | (digital->system); + data[DATA_ZEROTH_OFFSET_ELEMENT] = (digital->method << HDMI_CEC_DIGITAL_SERVICE_ID_METHOD_SHIFT) | + (digital->system); if (digital->method == HDMI_CEC_SERVICE_ID_METHOD_BY_CHANNEL) { - data[DATA_FIRST_OFFSET_ELEMENT] = (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | - (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); + data[DATA_FIRST_OFFSET_ELEMENT] = + (digital->systemData.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | + (digital->systemData.channel.major >> HDMI_ONE_BYTE_SHIFT); data[DATA_SECOND_OFFSET_ELEMENT] = digital->systemData.channel.major & HDMI_ONE_BYTE_MARK; data[DATA_THIRD_OFFSET_ELEMENT] = digital->systemData.channel.minor >> HDMI_ONE_BYTE_SHIFT; data[DATA_FORTH_OFFSET_ELEMENT] = digital->systemData.channel.minor & HDMI_ONE_BYTE_MARK; @@ -1005,7 +1007,7 @@ void HdmiCecEncodingUserControlPrtessedMsg(struct HdmiCecMsg *msg, struct HdmiCe msg->len += HDMI_CEC_CHANNEL_IDENTIFIER_LEN; msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (cmd->addOperands.channel.format << HDMI_CEC_CHANNEL_NUMBER_FORMAT_SHIFT) | - (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); + (cmd->addOperands.channel.major >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = (cmd->addOperands.channel.major & HDMI_ONE_BYTE_MARK); msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (cmd->addOperands.channel.minor >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (cmd->addOperands.channel.minor & HDMI_ONE_BYTE_MARK); @@ -1075,7 +1077,7 @@ void HdmiCecEncodingReportAudioStatusMsg(struct HdmiCecMsg *msg, uint8_t audioMu msg->len = HDMI_CEC_GET_MSG_LEN(HDMI_CEC_REPORT_AUDIO_STATUSMSG_PARAM_LEN); msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT] = HDMI_CEC_OPCODE_REPORT_AUDIO_STATUS; msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (audioMuteStatus << HDMI_CEC_AUDIO_MUTE_STATUS_SHIFT) | - (audioVolumeStatus & HDMI_CEC_AUDIO_VOLUME_STATUS_MARK); + (audioVolumeStatus & HDMI_CEC_AUDIO_VOLUME_STATUS_MARK); } void HdmiCecEncodingRequestShortAudioDescriptorMsg(struct HdmiCecMsg *msg, @@ -1219,7 +1221,8 @@ void HdmiCecEncodingReportCurrentLatencyMsg(struct HdmiCecMsg *msg, msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); msg->data[HDMI_CEC_MSG_DATA_FORTH_ELEMENT] = info->videoLatency; - msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) | (info->audioOutputCompensated); + msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (info->lowLatencyMode << HDMI_CEC_LOW_LATENCY_MODE_SHIFT) | + (info->audioOutputCompensated); /* Operand[Audio Output Delay] is only present when [Audio Output Compensated] is 3. */ if (info->audioOutputCompensated == HDMI_CEC_AUDIO_OUTPUT_COMPENSATED_PARTIAL_DELAY) { msg->len++; @@ -1258,9 +1261,9 @@ void HdmiCdcEncodingHecReportStateMsg(struct HdmiCecMsg *msg, uint16_t initiator msg->data[HDMI_CEC_MSG_DATA_FIFTH_ELEMENT] = (phyAddr >> HDMI_ONE_BYTE_SHIFT); msg->data[HDMI_CEC_MSG_DATA_SIXTH_ELEMENT] = (phyAddr & HDMI_ONE_BYTE_MARK); msg->data[HDMI_CEC_MSG_DATA_SEVENTH_ELEMENT] = (state->hecFuncState << HDMI_CDC_HEC_FUNC_STATE_SHIFT) | - (state->hostFuncState << HDMI_CDC_HOST_FUNC_STATE_SHIFT) | - (state->encFuncState << HDMI_CDC_ENC_FUNC_STATE_SHIFT) | - (state->cdcErrCode); + (state->hostFuncState << HDMI_CDC_HOST_FUNC_STATE_SHIFT) | + (state->encFuncState << HDMI_CDC_ENC_FUNC_STATE_SHIFT) | + (state->cdcErrCode); if (state->haveHecField == true) { msg->len = HDMI_CDC_GET_MSG_LEN(HDMI_CDC_HEC_REPORT_STATE_MSG_PARAM_MAX_LEN); msg->data[HDMI_CEC_MSG_DATA_EIGHTH_ELEMENT] = (state->hecField >> HDMI_ONE_BYTE_SHIFT); @@ -1448,8 +1451,10 @@ static bool HdmiCecMsgIgnore(uint8_t opcode, bool unregistered, bool broadcast) static void HdmiCecHandleReportPhyAddressMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { - uint16_t phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) | - msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]); + uint16_t phyAddr; + + phyAddr = ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] << HDMI_ONE_BYTE_SHIFT) | + msg->data[HDMI_CEC_MSG_DATA_THIRD_ELEMENT]); (void)cntlr; (void)txMsg; @@ -1496,8 +1501,8 @@ static void HdmiCecHandleGivePhyAddressMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { /* Ignore for CEC switches using addr 15. */ - if (cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH && - HdmiCecGetMsgDestination(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) { + if ((cntlr->cec->info.primaryDeviceType == HDMI_CEC_DEVICE_TYPE_PURE_CEC_SWITCH) && + (HdmiCecGetMsgDestination(msg) == HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST)) { return; } @@ -1511,7 +1516,9 @@ static void HdmiCecHandleGiveDeviceVendorIdMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.vendorId == HDMI_CEC_VENDOR_ID_UNKNOWN) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], + HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1540,7 +1547,9 @@ static void HdmiCecHandleGiveOsdNameMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.osdName[0] == 0) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], + HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1557,7 +1566,9 @@ static void HdmiCecHandleGiveFeaturesMsg(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg, struct HdmiCecMsg *txMsg) { if (cntlr->cec->info.cecVersion < HDMI_CEC_VERSION_2_0) { - HdmiCecEncodingFeatureAbortMsg(txMsg, msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); + HdmiCecEncodingFeatureAbortMsg(txMsg, + msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT], + HDMI_CEC_ABORT_UNRECOGNIZED_OPCODE); if (HdmiCecSendMsg(cntlr, txMsg) != HDF_SUCCESS) { HDF_LOGE("feature abort msg send fail"); } @@ -1668,12 +1679,12 @@ int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg) destination = HdmiCecGetMsgDestination(msg); opcode = msg->data[HDMI_CEC_MSG_DATA_FIRST_ELEMENT]; /* Check if this message is for us. */ - if (initiator != HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST && - HdmiCecLogAddrValid(cntlr->cec, initiator) == true) { + if ((initiator != HDMI_CEC_LOG_ADDR_UNREGISTERED_OR_BROADCAST) && + (HdmiCecLogAddrValid(cntlr->cec, initiator) == true)) { return HDF_ERR_INVALID_PARAM; } - if (HdmiCecIsBroadcastMsg(msg) == false && - HdmiCecLogAddrValid(cec, destination) == false) { + if ((HdmiCecIsBroadcastMsg(msg) == false) && + (HdmiCecLogAddrValid(cec, destination) == false)) { HDF_LOGD("this cec msg is not for us!"); return HDF_ERR_INVALID_PARAM; } @@ -1683,8 +1694,8 @@ int32_t HdmiCecReceivedMsg(struct HdmiCec *cec, struct HdmiCecMsg *msg) } /* CDC Only devices should ignore non-CDC messages. */ - if (HdmiCecIsCdcOnlyDevice(cec) == true && - opcode != HDMI_CEC_OPCODE_CDC_MESSAGE) { + if ((HdmiCecIsCdcOnlyDevice(cec) == true) && + (opcode != HDMI_CEC_OPCODE_CDC_MESSAGE)) { HDF_LOGD("this cec msg is not cdc msg."); return HDF_ERR_NOT_SUPPORT; } diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index ec6711b31..7dd5d34d6 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -585,9 +585,11 @@ static int32_t HdmiEdidExtVideoDataBlockPhase(struct HdmiSinkDeviceCapability *s static void HdmiEdidVsdbCecPhyAddrPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data, uint8_t len) { if (len >= 5) { - sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrA = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT; sinkCap->vsdbInfo.cecAddr.phyAddrB = (data[UINT8_ARRAY_TElEMENT_3] & HDMI_LOWER_NIBBLE_MARK); - sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->vsdbInfo.cecAddr.phyAddrC = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT; sinkCap->vsdbInfo.cecAddr.phyAddrD = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_LOWER_NIBBLE_MARK); sinkCap->vsdbInfo.cecAddr.addrValid = (sinkCap->vsdbInfo.cecAddr.phyAddrA != HDMI_EDID_EXTENSION_VSDB_CEC_INVALID_ADDR) && @@ -683,7 +685,7 @@ static void HdmiEdidVsdb3dStructureInfoPhase(struct HdmiSinkDeviceCapability *si * If 3D_Multi_present is 1 or 2, 3D_Struct_ALL_15...0 is present and assigns 3D formats to * all of the VICs listed in the first 16 entries in the EDID. */ - if ((sinkCap->vsdbInfo._3dMultiPresent & HDMI_EDID_EXTENSION_VSDB_3D_STR_INVALID_MARK) == 0) { + if (((sinkCap->vsdbInfo._3dMultiPresent) & HDMI_EDID_EXTENSION_VSDB_3D_STR_INVALID_MARK) == 0) { return; } /* see hdmi spec 1.4 table H-8. */ @@ -728,13 +730,13 @@ static void HdmiEdidVsdbVicAnd3dInfoPhase(struct HdmiSinkDeviceCapability *sinkC } sinkCap->vsdbInfo._3dPresent = (data[UINT8_ARRAY_TElEMENT_12] & HDMI_BIT7_MARK) ? true : false; sinkCap->vsdbInfo._3dMultiPresent = (data[UINT8_ARRAY_TElEMENT_12] & - HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> - HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; + HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_MARK) >> + HDMI_EDID_EXTENSION_VSDB_3D_MULTI_PRESENT_SHIFT; if (len >= 14) { hdmiVicLen = (data[UINT8_ARRAY_TElEMENT_13] & - HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> - HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; + HDMI_EDID_EXTENSION_VSDB_VIC_LEN_MARK) >> + HDMI_EDID_EXTENSION_VSDB_VIC_LEN_SHIFT; hdmi3dLen = (data[UINT8_ARRAY_TElEMENT_13] & HDMI_EDID_EXTENSION_VSDB_3D_LEN_MARK); } @@ -801,7 +803,8 @@ static void HdmiEdidHfVsdb21Phase(struct HdmiSinkDeviceCapability *sinkCap, uint sinkCap->hfVsdbInfo.dscInfo.dsc20bpc = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT1_MARK) ? true : false; sinkCap->hfVsdbInfo.dscInfo.dsc16bpc = (data[UINT8_ARRAY_TElEMENT_10] & HDMI_BIT0_MARK) ? true : false; sinkCap->hfVsdbInfo.dscInfo.dscMaxSlices = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_LOWER_NIBBLE_MARK); - sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> HDMI_NIBBLE_SHIFT; + sinkCap->hfVsdbInfo.dscInfo.dscMaxFrlRate = (data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT; sinkCap->hfVsdbInfo.dscInfo.dscTotalChunkKBytes = (data[UINT8_ARRAY_TElEMENT_12] & 0x3F); } diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c index 588366ad9..02874fb55 100644 --- a/support/platform/src/hdmi/hdmi_hdr.c +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -225,7 +225,7 @@ int32_t HdmiHdrAttrHandle(struct HdmiHdr *hdr, struct HdmiHdrAttr *curAttr) if (ret != HDF_SUCCESS) { return ret; } - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi & commAttr->drm)); + (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->drm)); _SEND_INFOFRAME: (void)HdmiAviInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->avi)); diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 784a66c30..790fe71b1 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -78,7 +78,7 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, data[UINT8_ARRAY_TElEMENT_8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; } - data[UINT8_ARRAY_TElEMENT_9] = (vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << + data[UINT8_ARRAY_TElEMENT_9] = ((uint8_t)vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << HDMI_VENDOR_3D_EXT_DATA_SHIFT; if (vsifContent->_3dMetaPresent == false) { if (userContent->len == 0 || (userContent->len + lenght) > len) { @@ -127,11 +127,14 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe } /* PB2 */ buff[UINT8_ARRAY_TElEMENT_1] |= (avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; - buff[UINT8_ARRAY_TElEMENT_1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << + HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; buff[UINT8_ARRAY_TElEMENT_1] |= (avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); /* PB3 */ - buff[UINT8_ARRAY_TElEMENT_2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << HDMI_AVI_EXT_COLORIMETRY_SHIFT; - buff[UINT8_ARRAY_TElEMENT_2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << + HDMI_AVI_EXT_COLORIMETRY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << + HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; buff[UINT8_ARRAY_TElEMENT_2] |= (avi->nups & HDMI_AVI_NUPS_RANGE_MARK); if (avi->itc == true) { buff[UINT8_ARRAY_TElEMENT_2] |= (1 << HDMI_AVI_IT_CONTENT_SHIFT); @@ -139,8 +142,9 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe /* PB4 */ buff[UINT8_ARRAY_TElEMENT_3] = avi->vic; /* PB5 */ - buff[UINT8_ARRAY_TElEMENT_4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_4] |= (avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << + HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; buff[UINT8_ARRAY_TElEMENT_4] |= (avi->pixelRepetitionFactor & HDMI_AVI_PIXEL_REPETION_FACTOR_MARK); /* PB6 */ buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)(avi->topBar & HDMI_AVI_BAR_MODE_MARK); @@ -220,14 +224,16 @@ static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infofra buff[UINT8_ARRAY_TElEMENT_0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; buff[UINT8_ARRAY_TElEMENT_0] |= (audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); /* PB2 */ - buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << + HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); /* PB3 */ - buff[UINT8_ARRAY_TElEMENT_2] |= (audio->codingExtType & HDMI_AUDIO_CXT_MARK); + buff[UINT8_ARRAY_TElEMENT_2] |= ((uint8_t)audio->codingExtType & HDMI_AUDIO_CXT_MARK); /* PB4 */ buff[UINT8_ARRAY_TElEMENT_3] |= audio->channelAllocation; /* PB5 */ - buff[UINT8_ARRAY_TElEMENT_4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << + HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; buff[UINT8_ARRAY_TElEMENT_4] |= (audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); if (audio->dmInh == true) { buff[UINT8_ARRAY_TElEMENT_4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); @@ -262,27 +268,33 @@ static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe /* PB3 */ buff[UINT8_ARRAY_TElEMENT_2] = (uint8_t)(des->displayPrimaries0X & HDMI_DRM_METADATA_MARK); /* PB4 */ - buff[UINT8_ARRAY_TElEMENT_3] = (uint8_t)((des->displayPrimaries0X >> HDMI_DRM_METADATA_SHIFT) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_3] = (uint8_t)((des->displayPrimaries0X >> HDMI_DRM_METADATA_SHIFT) & + HDMI_DRM_METADATA_MARK); /* PB5 */ buff[UINT8_ARRAY_TElEMENT_4] = (uint8_t)(des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK); /* PB6 */ - buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)((des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)((des->displayPrimaries0Y & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB7 */ buff[UINT8_ARRAY_TElEMENT_6] = (uint8_t)(des->displayPrimaries1X & HDMI_DRM_METADATA_MARK); /* PB8 */ - buff[UINT8_ARRAY_TElEMENT_7] = (uint8_t)((des->displayPrimaries1X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_7] = (uint8_t)((des->displayPrimaries1X & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB9 */ buff[UINT8_ARRAY_TElEMENT_8] = (uint8_t)(des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK); /* PB10 */ - buff[UINT8_ARRAY_TElEMENT_9] = (uint8_t)((des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_9] = (uint8_t)((des->displayPrimaries1Y & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB11 */ buff[UINT8_ARRAY_TElEMENT_10] = (uint8_t)(des->displayPrimaries2X & HDMI_DRM_METADATA_MARK); /* PB12 */ - buff[UINT8_ARRAY_TElEMENT_11] = (uint8_t)((des->displayPrimaries2X & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_11] = (uint8_t)((des->displayPrimaries2X & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB13 */ buff[UINT8_ARRAY_TElEMENT_12] = (uint8_t)(des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK); /* PB14 */ - buff[UINT8_ARRAY_TElEMENT_13] = (uint8_t)((des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_13] = (uint8_t)((des->displayPrimaries2Y & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB15 */ buff[UINT8_ARRAY_TElEMENT_14] = (uint8_t)(des->whitePointX & HDMI_DRM_METADATA_MARK); /* PB16 */ @@ -294,19 +306,23 @@ static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe /* PB19 */ buff[UINT8_ARRAY_TElEMENT_18] = (uint8_t)(des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); /* PB20 */ - buff[UINT8_ARRAY_TElEMENT_19] = (uint8_t)((des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_19] = (uint8_t)((des->maxDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB21 */ buff[UINT8_ARRAY_TElEMENT_20] = (uint8_t)(des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK); /* PB22 */ - buff[UINT8_ARRAY_TElEMENT_21] = (uint8_t)((des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_21] = (uint8_t)((des->minDisplayMasteringLuminance & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB23 */ buff[UINT8_ARRAY_TElEMENT_22] = (uint8_t)(des->maxContentLightLevel & HDMI_DRM_METADATA_MARK); /* PB24 */ - buff[UINT8_ARRAY_TElEMENT_23] = (uint8_t)((des->maxContentLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_23] = (uint8_t)((des->maxContentLightLevel & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); /* PB25 */ buff[UINT8_ARRAY_TElEMENT_24] = (uint8_t)(des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK); /* PB26 */ - buff[UINT8_ARRAY_TElEMENT_25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); + buff[UINT8_ARRAY_TElEMENT_25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & + HDMI_DRM_METADATA_MARK); HdmiInfoframeFillCheckSum(data, lenght); return HDF_SUCCESS; } @@ -704,8 +720,9 @@ int32_t HdmiVsInfoframeSend(struct HdmiInfoframe *frame, bool enable, bool dolby return HdmiInfoframeSend(frame, &infoframe); } -static void HdmiFillSpdInfoframe(struct HdmiSpdInfoframe *spd, char *vendorName, - char *productName, enum HdmiSpdSdi sdi) +static void HdmiFillSpdInfoframe(struct HdmiSpdInfoframe *spd, + const char *vendorName, const char *productName, + enum HdmiSpdSdi sdi) { uint32_t len, length; diff --git a/support/platform/test/unittest/common/hdf_hdmi_test.cpp b/support/platform/test/unittest/common/hdf_hdmi_test.cpp index 93278dae1..1bce4e047 100644 --- a/support/platform/test/unittest/common/hdf_hdmi_test.cpp +++ b/support/platform/test/unittest/common/hdf_hdmi_test.cpp @@ -58,8 +58,9 @@ void HdfLiteHdmiTest::TearDown() static void HdmiUserHpdHandle(void *data, bool hpd) { - (void)data; - + if (data == NULL) { + printf("data is null"); + } if (hpd == true) { printf("HdmiUserHpdHandle: hpd."); } else { diff --git a/test/unittest/platform/common/i2s_test.c b/test/unittest/platform/common/i2s_test.c index 241417cac..9415b9b52 100644 --- a/test/unittest/platform/common/i2s_test.c +++ b/test/unittest/platform/common/i2s_test.c @@ -209,7 +209,12 @@ static int32_t I2sReadTest(struct I2sTest *test) return HDF_FAILURE; } - if (memcpy_s(test->wbuf, test->len, test->rbuf, test->len) != EOK) { + if (test->len > I2S_DATA_BUF_SIZE) { + HDF_LOGE("%s:I2sRead read data too large \n", __func__); + return HDF_FAILURE; + } + + if (memcpy_s(test->wbuf, I2S_DATA_BUF_SIZE, test->rbuf, test->len) != EOK) { HDF_LOGE("%s: memcpy buf failed", __func__); return HDF_ERR_IO; } -- Gitee From 8bcb63e79df5570b97e33bacaae77b9a3cd825d9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 9 Nov 2021 19:26:07 +0800 Subject: [PATCH 170/272] Code relocation Signed-off-by: YOUR_NAME --- sample/config/device_info/device_info.hcs | 38 ++ sample/config/gpio/gpio_config.hcs | 15 + sample/config/spi/spi_config.hcs | 19 + sample/config/uart/uart_config.hcs | 15 + sample/platform/gpio/BUILD.gn | 11 + sample/platform/gpio/Kconfig | 12 + sample/platform/gpio/dispatch/BUILD.gn | 45 +++ sample/platform/gpio/dispatch/gpio_if.c | 128 +++++++ sample/platform/gpio/dispatch/gpio_if.h | 42 ++ .../gpio/dispatch/hello_gpio_dispatch.c | 46 +++ .../gpio/include/gpio_dispatch_sample.h | 23 ++ .../platform/gpio/include/gpio_pl061_sample.h | 75 ++++ sample/platform/gpio/src/BUILD.gn | 23 ++ .../platform/gpio/src/gpio_dispatch_sample.c | 119 ++++++ sample/platform/gpio/src/gpio_pl061_sample.c | 30 ++ sample/platform/gpio/src/gpio_sample.c | 359 ++++++++++++++++++ sample/platform/spi/BUILD.gn | 11 + sample/platform/spi/Kconfig | 12 + sample/platform/spi/dispatch/BUILD.gn | 45 +++ .../spi/dispatch/hello_spi_dispatch.c | 43 +++ sample/platform/spi/dispatch/spi_if.c | 87 +++++ sample/platform/spi/dispatch/spi_if.h | 39 ++ .../spi/include/spi_dispatch_sample.h | 21 + .../platform/spi/include/spi_pl022_sample.h | 118 ++++++ sample/platform/spi/include/spi_sample.h | 18 + sample/platform/spi/src/BUILD.gn | 23 ++ sample/platform/spi/src/spi_dispatch_sample.c | 58 +++ sample/platform/spi/src/spi_pl022_sample.c | 338 +++++++++++++++++ sample/platform/spi/src/spi_sample.c | 355 +++++++++++++++++ sample/platform/uart/BUILD.gn | 14 + sample/platform/uart/Kconfig | 12 + sample/platform/uart/dev/BUILD.gn | 41 ++ sample/platform/uart/dev/hello_uart_dev.c | 38 ++ sample/platform/uart/dispatch/BUILD.gn | 44 +++ .../uart/dispatch/hello_uart_dispatch.c | 34 ++ sample/platform/uart/dispatch/uart_if.c | 97 +++++ sample/platform/uart/dispatch/uart_if.h | 29 ++ sample/platform/uart/include/buf_fifo.h | 36 ++ .../platform/uart/include/uart_dev_sample.h | 35 ++ .../uart/include/uart_dispatch_sample.h | 20 + .../platform/uart/include/uart_pl011_sample.h | 243 ++++++++++++ sample/platform/uart/src/BUILD.gn | 22 ++ sample/platform/uart/src/buf_fifo.c | 24 ++ sample/platform/uart/src/uart_dev_sample.c | 191 ++++++++++ .../platform/uart/src/uart_dispatch_sample.c | 67 ++++ sample/platform/uart/src/uart_pl011_sample.c | 90 +++++ sample/platform/uart/src/uart_sample.c | 344 +++++++++++++++++ 47 files changed, 3549 insertions(+) create mode 100755 sample/config/device_info/device_info.hcs create mode 100755 sample/config/gpio/gpio_config.hcs create mode 100755 sample/config/spi/spi_config.hcs create mode 100755 sample/config/uart/uart_config.hcs create mode 100755 sample/platform/gpio/BUILD.gn create mode 100755 sample/platform/gpio/Kconfig create mode 100755 sample/platform/gpio/dispatch/BUILD.gn create mode 100755 sample/platform/gpio/dispatch/gpio_if.c create mode 100755 sample/platform/gpio/dispatch/gpio_if.h create mode 100755 sample/platform/gpio/dispatch/hello_gpio_dispatch.c create mode 100755 sample/platform/gpio/include/gpio_dispatch_sample.h create mode 100755 sample/platform/gpio/include/gpio_pl061_sample.h create mode 100755 sample/platform/gpio/src/BUILD.gn create mode 100755 sample/platform/gpio/src/gpio_dispatch_sample.c create mode 100755 sample/platform/gpio/src/gpio_pl061_sample.c create mode 100755 sample/platform/gpio/src/gpio_sample.c create mode 100755 sample/platform/spi/BUILD.gn create mode 100755 sample/platform/spi/Kconfig create mode 100755 sample/platform/spi/dispatch/BUILD.gn create mode 100755 sample/platform/spi/dispatch/hello_spi_dispatch.c create mode 100755 sample/platform/spi/dispatch/spi_if.c create mode 100755 sample/platform/spi/dispatch/spi_if.h create mode 100755 sample/platform/spi/include/spi_dispatch_sample.h create mode 100755 sample/platform/spi/include/spi_pl022_sample.h create mode 100755 sample/platform/spi/include/spi_sample.h create mode 100755 sample/platform/spi/src/BUILD.gn create mode 100755 sample/platform/spi/src/spi_dispatch_sample.c create mode 100755 sample/platform/spi/src/spi_pl022_sample.c create mode 100755 sample/platform/spi/src/spi_sample.c create mode 100755 sample/platform/uart/BUILD.gn create mode 100755 sample/platform/uart/Kconfig create mode 100755 sample/platform/uart/dev/BUILD.gn create mode 100755 sample/platform/uart/dev/hello_uart_dev.c create mode 100755 sample/platform/uart/dispatch/BUILD.gn create mode 100755 sample/platform/uart/dispatch/hello_uart_dispatch.c create mode 100755 sample/platform/uart/dispatch/uart_if.c create mode 100755 sample/platform/uart/dispatch/uart_if.h create mode 100755 sample/platform/uart/include/buf_fifo.h create mode 100755 sample/platform/uart/include/uart_dev_sample.h create mode 100755 sample/platform/uart/include/uart_dispatch_sample.h create mode 100755 sample/platform/uart/include/uart_pl011_sample.h create mode 100755 sample/platform/uart/src/BUILD.gn create mode 100755 sample/platform/uart/src/buf_fifo.c create mode 100755 sample/platform/uart/src/uart_dev_sample.c create mode 100755 sample/platform/uart/src/uart_dispatch_sample.c create mode 100755 sample/platform/uart/src/uart_pl011_sample.c create mode 100755 sample/platform/uart/src/uart_sample.c diff --git a/sample/config/device_info/device_info.hcs b/sample/config/device_info/device_info.hcs new file mode 100755 index 000000000..091cf61d1 --- /dev/null +++ b/sample/config/device_info/device_info.hcs @@ -0,0 +1,38 @@ +root { + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_gpio :: device { + device1 :: deviceNode { + policy = 2; + priority = 10; + permission = 0660; + moduleName = "GPIO_SAMPLE"; + serviceName = "GPIO_SAMPLE"; + deviceMatchAttr = "sample_gpio"; + } + } + device_uart :: device { + device5 :: deviceNode { + policy = 2; + priority = 10; + permission = 0660; + moduleName = "UART_SAMPLE"; + serviceName = "HDF_PLATFORM_UART_5"; + deviceMatchAttr = "sample_uart_5"; + } + } + device_spi :: device { + device3 :: deviceNode { + policy = 2; + priority = 60; + permission = 0660; + moduleName = "SPI_SAMPLE"; + serviceName = "HDF_PLATFORM_SPI_3"; + deviceMatchAttr = "sample_spi_3"; + } + } + } + } +} diff --git a/sample/config/gpio/gpio_config.hcs b/sample/config/gpio/gpio_config.hcs new file mode 100755 index 000000000..a7be88262 --- /dev/null +++ b/sample/config/gpio/gpio_config.hcs @@ -0,0 +1,15 @@ +root { + platform { + gpio_config { + gpio_sample { + match_attr = "sample_gpio"; + groupNum = 12; + bitNum = 8; + regBase = 0x120d0000; + regStep = 0x1000; + irqStart = 48; + irqShare = 0; + } + } + } +} \ No newline at end of file diff --git a/sample/config/spi/spi_config.hcs b/sample/config/spi/spi_config.hcs new file mode 100755 index 000000000..29064ea0d --- /dev/null +++ b/sample/config/spi/spi_config.hcs @@ -0,0 +1,19 @@ +root { + platform { + spi_config { + spi_sample { + serviceName = "SPI_SAMPLE"; + match_attr = "sample_spi_3"; + transferMode = 0; + busNum = 0; + clkRate = 100000000; + bitsPerWord = 8; + mode = 19; + speed = 2000000; + fifoSize = 256; + numCs = 1; + regBase = 0x120c0000; + } + } + } +} \ No newline at end of file diff --git a/sample/config/uart/uart_config.hcs b/sample/config/uart/uart_config.hcs new file mode 100755 index 000000000..2ea8900bb --- /dev/null +++ b/sample/config/uart/uart_config.hcs @@ -0,0 +1,15 @@ +root { + platform { + uart_sample { + num = 5; + base = 0x120a0000; // UART base register address + irqNum = 38; + baudrate = 115200; + uartClk = 24000000; // 24 M + wlen = 0x60; // 8 bit width + parity = 0; + stopBit = 0; + match_attr = "sample_uart_5"; + } + } +} diff --git a/sample/platform/gpio/BUILD.gn b/sample/platform/gpio/BUILD.gn new file mode 100755 index 000000000..7578ab231 --- /dev/null +++ b/sample/platform/gpio/BUILD.gn @@ -0,0 +1,11 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//build/lite/config/component/lite_component.gni") + +lite_component("hello_gpio_sample") { + features = [ "dispatch:hello_gpio_dispatch" ] +} diff --git a/sample/platform/gpio/Kconfig b/sample/platform/gpio/Kconfig new file mode 100755 index 000000000..dc445d847 --- /dev/null +++ b/sample/platform/gpio/Kconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +config DRIVERS_HDF_PLATFORM_GPIO_SAMPLE + bool "Enable HDF platform gpio sample driver" + default n + depends on DRIVERS_HDF_PLATFORM + help + Answer Y to enable HDF platform gpio sample driver. diff --git a/sample/platform/gpio/dispatch/BUILD.gn b/sample/platform/gpio/dispatch/BUILD.gn new file mode 100755 index 000000000..06291325d --- /dev/null +++ b/sample/platform/gpio/dispatch/BUILD.gn @@ -0,0 +1,45 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +HDF_FRAMEWORKS = "//drivers/framework" + +executable("hello_gpio_dispatch") { + sources = [ + "gpio_if.c", + "hello_gpio_dispatch.c", + ] + + include_dirs = [ + "$HDF_FRAMEWORKS/ability/sbuf/include", + "$HDF_FRAMEWORKS/core/shared/include", + "$HDF_FRAMEWORKS/core/host/include", + "$HDF_FRAMEWORKS/core/master/include", + "$HDF_FRAMEWORKS/include/core", + "$HDF_FRAMEWORKS/include/utils", + "$HDF_FRAMEWORKS/utils/include", + "$HDF_FRAMEWORKS/include/osal", + "//drivers/adapter/uhdf/posix/include", + "//third_party/bounds_checking_function/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", + "//drivers/framework/support/platform/include/gpio", + ] + + deps = [ + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//drivers/adapter/uhdf/manager:hdf_core", + "//drivers/adapter/uhdf/posix:hdf_posix_osal", + ] + + public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] + defines = [ "__USER__" ] + + cflags = [ + "-Wall", + "-Wextra", + "-Wno-format", + "-Wno-format-extra-args", + ] +} diff --git a/sample/platform/gpio/dispatch/gpio_if.c b/sample/platform/gpio/dispatch/gpio_if.c new file mode 100755 index 000000000..dadccd698 --- /dev/null +++ b/sample/platform/gpio/dispatch/gpio_if.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_if.h" +#include "hdf_log.h" +#include "hdf_io_service_if.h" + +#define HDF_LOG_TAG gpio_if + +static struct HdfIoService *GetIoService() +{ + static struct HdfIoService *ioService = NULL; + if (ioService != NULL) { + return ioService; + } + + ioService = HdfIoServiceBind(GPIO_SERVICE_NAME); + if (ioService == NULL) { + HDF_LOGE("Failed to get service %s", GPIO_SERVICE_NAME); + } + return ioService; +} + +static int32_t GpioOperate(enum GpioOps ops, uint16_t gpio, uint16_t val) +{ + int ret = HDF_FAILURE; + struct HdfIoService *service = GetIoService(); + if (service == NULL) { + return ret; + } + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + HDF_LOGE("Failed to obtain sBuf"); + return ret; + } + + if (!HdfSbufWriteUint16(data, gpio) || !HdfSbufWriteUint16(data, val)) { + HDF_LOGE("Failed to write sBuf"); + HdfSBufRecycle(data); + return HDF_FAILURE; + } + ret = service->dispatcher->Dispatch(&service->object, ops, data, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Failed to send service call, ret: %d", ret); + } + HdfSBufRecycle(data); + return ret; +} + +static int32_t GpioQuery(enum GpioOps ops, uint16_t gpio, uint16_t *val) +{ + int ret = HDF_FAILURE; + struct HdfIoService *service = GetIoService(); + if (service == NULL) { + return ret; + } + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); + if (data == NULL || reply == NULL) { + HDF_LOGE("Failed to obtain sBuf"); + return ret; + } + + if (!HdfSbufWriteUint16(data, gpio)) { + HDF_LOGE("Failed to write data sBuf"); + goto __ERR__; + } + ret = service->dispatcher->Dispatch(&service->object, ops, data, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Failed to send service call"); + goto __ERR__; + + } + if (!HdfSbufReadUint16(reply, val)) { + HDF_LOGE("Failed to read reply sBuf"); + goto __ERR__; + } + goto __ERR__; + + __ERR__: + HdfSBufRecycle(data); + HdfSBufRecycle(reply); + return ret; +} + +int32_t GpioOpen() +{ + struct HdfIoService *ioService = GetIoService(); + if (ioService == NULL) { + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t GpioSetDir(uint16_t gpio, uint16_t dir) +{ + return GpioOperate(GPIO_OPS_SET_DIR, gpio, dir); +} + +int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) +{ + return GpioQuery(GPIO_OPS_GET_DIR, gpio, dir); +} + +int32_t GpioWrite(uint16_t gpio, uint16_t val) +{ + return GpioOperate(GPIO_OPS_WRITE, gpio, val); +} + +int32_t GpioRead(uint16_t gpio, uint16_t *val) +{ + return GpioQuery(GPIO_OPS_READ, gpio, val); +} + +int32_t GpioClose() +{ + struct HdfIoService *ioService = GetIoService(); + if (ioService == NULL) { + return HDF_FAILURE; + } + HdfIoServiceRecycle(ioService); + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/sample/platform/gpio/dispatch/gpio_if.h b/sample/platform/gpio/dispatch/gpio_if.h new file mode 100755 index 000000000..4efb7870f --- /dev/null +++ b/sample/platform/gpio/dispatch/gpio_if.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef GPIO_IF_H +#define GPIO_IF_H + +#include + +#define GPIO_SERVICE_NAME "GPIO_SAMPLE" + +enum GpioValue { + GPIO_VAL_LOW = 0, + GPIO_VAL_HIGH = 1, + GPIO_VAL_ERR, +}; + +enum GpioDirType { + GPIO_DIR_IN = 0, + GPIO_DIR_OUT = 1, + GPIO_DIR_ERR, +}; + +enum GpioOps { + GPIO_OPS_SET_DIR = 1, + GPIO_OPS_GET_DIR, + GPIO_OPS_WRITE, + GPIO_OPS_READ +}; + +int32_t GpioOpen(); +int32_t GpioClose(); +int32_t GpioSetDir(uint16_t gpio, uint16_t dir); +int32_t GpioGetDir(uint16_t gpio, uint16_t *dir); +int32_t GpioWrite(uint16_t gpio, uint16_t val); +int32_t GpioRead(uint16_t gpio, uint16_t *val); + +#endif // GPIO_IF_H \ No newline at end of file diff --git a/sample/platform/gpio/dispatch/hello_gpio_dispatch.c b/sample/platform/gpio/dispatch/hello_gpio_dispatch.c new file mode 100755 index 000000000..c242acd06 --- /dev/null +++ b/sample/platform/gpio/dispatch/hello_gpio_dispatch.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_if.h" +#include "hdf_log.h" +#include "hdf_base.h" + +#define HDF_LOG_TAG hello_gpio_dispatch +#define GPIO_PIN 11 + +int main() +{ + uint16_t dir; + uint16_t val; + if (GpioOpen() != HDF_SUCCESS) { + HDF_LOGE("%s: GpioOpen failed", __func__); + return HDF_FAILURE; + } + if (GpioSetDir(GPIO_PIN, GPIO_DIR_IN) != HDF_SUCCESS) { + HDF_LOGE("%s: GpioSetDir failed, gpio %u, dir %u", __func__, GPIO_PIN, GPIO_DIR_IN); + return HDF_FAILURE; + } + if (GpioWrite(GPIO_PIN, GPIO_VAL_HIGH) != HDF_SUCCESS) { + HDF_LOGE("%s: GpioWrite failed, gpio %u, val %u", __func__, GPIO_PIN, GPIO_VAL_HIGH); + return HDF_FAILURE; + } + if (GpioGetDir(GPIO_PIN, &dir) != HDF_SUCCESS) { + HDF_LOGE("%s: GpioGetDir failed, gpio %u", __func__, GPIO_PIN); + return HDF_FAILURE; + } + if (GpioRead(GPIO_PIN, &val) != HDF_SUCCESS) { + HDF_LOGE("%s: GpioRead failed, gpio %u", __func__, GPIO_PIN); + return HDF_FAILURE; + } + if (GpioClose() != HDF_SUCCESS) { + HDF_LOGE("%s: GpioClose failed", __func__); + return HDF_FAILURE; + } + HDF_LOGD("GPIO %u direction is set to %u, value is set to %u", GPIO_PIN, dir, val); + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/sample/platform/gpio/include/gpio_dispatch_sample.h b/sample/platform/gpio/include/gpio_dispatch_sample.h new file mode 100755 index 000000000..cd33dc127 --- /dev/null +++ b/sample/platform/gpio/include/gpio_dispatch_sample.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef GPIO_DISPATCH_SAMPLE_H +#define GPIO_DISPATCH_SAMPLE_H + +#include "gpio_pl061_sample.h" + +enum GpioOps { + GPIO_OPS_SET_DIR = 1, + GPIO_OPS_GET_DIR, + GPIO_OPS_WRITE, + GPIO_OPS_READ +}; + +int32_t SampleGpioDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply); + +#endif // GPIO_DISPATCH_SAMPLE_H diff --git a/sample/platform/gpio/include/gpio_pl061_sample.h b/sample/platform/gpio/include/gpio_pl061_sample.h new file mode 100755 index 000000000..b133a7bd8 --- /dev/null +++ b/sample/platform/gpio/include/gpio_pl061_sample.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef GPIO_PL061_SAMPLE_H +#define GPIO_PL061_SAMPLE_H + +#include "gpio_core.h" +#include "gpio_if.h" +#include "osal.h" + +#define GROUP_MAX 32 +#define BIT_MAX 16 + +#define GPIO_DATA(base, bit) ((base) + 0x000 + (1 << ((bit) + 2))) +#define GPIO_DIR(base) ((base) + 0x400) +#define GPIO_IS(base) ((base) + 0x404) +#define GPIO_IBE(base) ((base) + 0x408) +#define GPIO_IEV(base) ((base) + 0x40C) +#define GPIO_IE(base) ((base) + 0x410) +#define GPIO_RIS(base) ((base) + 0x414) +#define GPIO_MIS(base) ((base) + 0x418) +#define GPIO_IC(base) ((base) + 0x41C) + +struct GpioGroup { + volatile unsigned char *regBase; + unsigned int index; + OsalSpinlock lock; +}; + +struct Pl061GpioCntlr { + struct GpioCntlr cntlr; + volatile unsigned char *regBase; + uint32_t phyBase; + uint32_t regStep; + uint32_t irqStart; + uint16_t groupNum; + uint16_t bitNum; + uint8_t irqShare; + struct GpioGroup *groups; +}; + +static struct Pl061GpioCntlr g_samplePl061GpioCntlr = { + .groups = NULL, + .groupNum = GROUP_MAX, + .bitNum = BIT_MAX, +}; + +static inline struct Pl061GpioCntlr *ToPl061GpioCntlr(struct GpioCntlr *cntlr) +{ + return (struct Pl061GpioCntlr *)cntlr; +} + +static inline uint16_t Pl061ToGroupNum(uint16_t gpio) +{ + return (uint16_t)(gpio / g_samplePl061GpioCntlr.bitNum); +} + +static inline uint16_t Pl061ToBitNum(uint16_t gpio) +{ + return (uint16_t)(gpio % g_samplePl061GpioCntlr.bitNum); +} + +static inline uint16_t Pl061ToGpioNum(uint16_t group, uint16_t bit) +{ + return (uint16_t)(group * g_samplePl061GpioCntlr.bitNum + bit); +} + +int32_t Pl061GetGroupByGpioNum(struct GpioCntlr *cntlr, uint16_t gpio, + struct GpioGroup **group); +#endif // GPIO_PL061_SAMPLE_H diff --git a/sample/platform/gpio/src/BUILD.gn b/sample/platform/gpio/src/BUILD.gn new file mode 100755 index 000000000..847987af1 --- /dev/null +++ b/sample/platform/gpio/src/BUILD.gn @@ -0,0 +1,23 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//drivers/adapter/khdf/liteos/hdf.gni") + +module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO_SAMPLE) +module_name = "hdf_gpio_sample" +hdf_driver(module_name) { + FRAMEWORK_GPIO_ROOT = "//drivers/framework/sample/platform/gpio/src" + sources = [ + "$FRAMEWORK_GPIO_ROOT/gpio_dispatch_sample.c", + "$FRAMEWORK_GPIO_ROOT/gpio_pl061_sample.c", + "$FRAMEWORK_GPIO_ROOT/gpio_sample.c", + ] + + include_dirs = [ + "//drivers/framework/sample/platform/gpio/include/", + "//drivers/framework/support/platform/include/gpio", + ] +} diff --git a/sample/platform/gpio/src/gpio_dispatch_sample.c b/sample/platform/gpio/src/gpio_dispatch_sample.c new file mode 100755 index 000000000..b93746ff5 --- /dev/null +++ b/sample/platform/gpio/src/gpio_dispatch_sample.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_dispatch_sample.h" + +#define HDF_LOG_TAG gpio_dispatch_sample + +static int32_t SampleGpioSetDir(struct GpioCntlr *cntlr, struct HdfSBuf *data) +{ + uint16_t gpio; + uint16_t dir; + if (!HdfSbufReadUint16(data, &gpio) || !HdfSbufReadUint16(data, &dir)) { + HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (cntlr->ops->setDir == NULL) { + HDF_LOGE("%s: cntlr->ops->setDir is NULL", __func__); + return HDF_DEV_ERR_OP; + } + return cntlr->ops->setDir(cntlr, gpio, dir); +} + +static int32_t SampleGpioGetDir(struct GpioCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t dir; + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (cntlr->ops->getDir == NULL) { + HDF_LOGE("%s: cntlr->ops->getDir is NULL", __func__); + return HDF_DEV_ERR_OP; + } + ret = cntlr->ops->getDir(cntlr, gpio, &dir); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: cntlr->ops->getDir failed, ret: %d", __func__, ret); + return ret; + } + if (!HdfSbufWriteUint16(reply, dir)) { + HDF_LOGE("%s: HdfSbufWriteUint16 failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, struct HdfSBuf *data) +{ + uint16_t gpio; + uint16_t val; + if (!HdfSbufReadUint16(data, &gpio) || !HdfSbufReadUint16(data, &val)) { + HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (cntlr->ops->write == NULL) { + HDF_LOGE("%s: cntlr->ops->read is NULL", __func__); + return HDF_DEV_ERR_OP; + } + return cntlr->ops->write(cntlr, gpio, val); +} + +static int32_t SampleGpioRead(struct GpioCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + uint16_t gpio; + uint16_t val; + if (!HdfSbufReadUint16(data, &gpio)) { + HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (cntlr->ops->read == NULL) { + HDF_LOGE("%s: cntlr->ops->read is NULL", __func__); + return HDF_DEV_ERR_OP; + } + ret = cntlr->ops->read(cntlr, gpio, &val); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: cntlr->ops->read failed, ret: %d", __func__, ret); + return ret; + } + if (!HdfSbufWriteUint16(reply, val)) { + HDF_LOGE("%s: HdfSbufWriteUint16 failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t SampleGpioDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + if (client == NULL || client->device == NULL) { + HDF_LOGE("%s: client or client->device is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + struct GpioCntlr *cntlr = (struct GpioCntlr *)client->device->service; + if (cntlr == NULL || cntlr->ops == NULL) { + HDF_LOGE("%s: cntlr or cntlr->ops is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + switch (cmdId) { + case GPIO_OPS_SET_DIR: + return SampleGpioSetDir(cntlr, data); + case GPIO_OPS_GET_DIR: + return SampleGpioGetDir(cntlr, data, reply); + case GPIO_OPS_WRITE: + return SampleGpioWrite(cntlr, data); + case GPIO_OPS_READ: + return SampleGpioRead(cntlr, data, reply); + default: + HDF_LOGE("%s: invalid cmdId %d", __func__, cmdId); + return HDF_FAILURE; + } +} \ No newline at end of file diff --git a/sample/platform/gpio/src/gpio_pl061_sample.c b/sample/platform/gpio/src/gpio_pl061_sample.c new file mode 100755 index 000000000..fb8252b74 --- /dev/null +++ b/sample/platform/gpio/src/gpio_pl061_sample.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_pl061_sample.h" +#include "osal_irq.h" + +#define HDF_LOG_TAG gpio_pl061_sample + +int32_t Pl061GetGroupByGpioNum(struct GpioCntlr *cntlr, uint16_t gpio, struct GpioGroup **group) +{ + struct Pl061GpioCntlr *pl061 = NULL; + uint16_t groupIndex = Pl061ToGroupNum(gpio); + + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + pl061 = ToPl061GpioCntlr(cntlr); + if (groupIndex >= pl061->groupNum) { + HDF_LOGE("%s: err group index:%u", __func__, groupIndex); + return HDF_ERR_INVALID_PARAM; + } + *group = &pl061->groups[groupIndex]; + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/sample/platform/gpio/src/gpio_sample.c b/sample/platform/gpio/src/gpio_sample.c new file mode 100755 index 000000000..344929f2d --- /dev/null +++ b/sample/platform/gpio/src/gpio_sample.c @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio_dispatch_sample.h" +#include "gpio_pl061_sample.h" +#include "device_resource_if.h" +#include "hdf_device_desc.h" +#include "gpio_if.h" +#include "osal.h" +#include "osal_io.h" +#include "gpio_core.h" + +#define HDF_LOG_TAG gpio_sample + +/* HdfDriverEntry hook function prototypes */ +static int32_t SampleGpioDriverBind(struct HdfDeviceObject *device); +static int32_t SampleGpioDriverInit(struct HdfDeviceObject *device); +static void SampleGpioDriverRelease(struct HdfDeviceObject *device); + +/* HdfDriverEntry definition */ +struct HdfDriverEntry g_sampleGpioDriverEntry = { + .moduleVersion = 1, + .moduleName = "GPIO_SAMPLE", + .Bind = SampleGpioDriverBind, + .Init = SampleGpioDriverInit, + .Release = SampleGpioDriverRelease, +}; + +/* Init HdfDriverEntry */ +HDF_INIT(g_sampleGpioDriverEntry); + +/* GPIO function prototypes */ +static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t val); +static int32_t SampleGpioRead(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *val); +static int32_t SampleGpioSetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t dir); +static int32_t SampleGpioGetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *dir); + +/* GpioMethod definition */ +struct GpioMethod g_sampleGpioMethod = { + .request = NULL, + .release = NULL, + .write = SampleGpioWrite, + .read = SampleGpioRead, + .setDir = SampleGpioSetDirection, + .getDir = SampleGpioGetDirection, + .toIrq = NULL, + .setIrq = NULL, + .unsetIrq = NULL, + .enableIrq = NULL, + .disableIrq = NULL, +}; + +/* Private function prototypes */ +/* Read GPIO device resource */ +static int32_t GetGpioDeviceResource(struct Pl061GpioCntlr *cntlr, const struct DeviceResourceNode *node); +/* Init GPIO controller memory */ +static int32_t InitGpioCntlrMem(struct Pl061GpioCntlr *cntlr); +/* Release GPIO controller memory */ +static void ReleaseGpioCntlrMem(struct Pl061GpioCntlr *cntlr); + +/* HdfDriverEntry hook function implementations */ +static int32_t SampleGpioDriverBind(struct HdfDeviceObject *device) +{ + HDF_LOGD("%s: Enter", __func__); + struct Pl061GpioCntlr *pl061Cntlr = &g_samplePl061GpioCntlr; + pl061Cntlr->cntlr.device = device; + device->service = &(pl061Cntlr->cntlr.service); + pl061Cntlr->cntlr.device->service->Dispatch = SampleGpioDispatch; + return HDF_SUCCESS; +} + +static int32_t SampleGpioDriverInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct Pl061GpioCntlr *pl061Cntlr = &g_samplePl061GpioCntlr; + + HDF_LOGD("%s: Enter", __func__); + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property NULL!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + ret = GetGpioDeviceResource(pl061Cntlr, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get gpio device resource fail:%d", __func__, ret); + return ret; + } + + if (pl061Cntlr->groupNum > GROUP_MAX || pl061Cntlr->groupNum <= 0 || pl061Cntlr->bitNum > BIT_MAX || + pl061Cntlr->bitNum <= 0) { + HDF_LOGE("%s: invalid groupNum:%u or bitNum:%u", __func__, pl061Cntlr->groupNum, + pl061Cntlr->bitNum); + return HDF_ERR_INVALID_PARAM; + } + + pl061Cntlr->regBase = OsalIoRemap(pl061Cntlr->phyBase, pl061Cntlr->groupNum * pl061Cntlr->regStep); + if (pl061Cntlr->regBase == NULL) { + HDF_LOGE("%s: err remap phy:0x%x", __func__, pl061Cntlr->phyBase); + return HDF_ERR_IO; + } + + ret = InitGpioCntlrMem(pl061Cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: err init cntlr mem:%d", __func__, ret); + OsalIoUnmap((void *)pl061Cntlr->regBase); + pl061Cntlr->regBase = NULL; + return ret; + } + pl061Cntlr->cntlr.count = pl061Cntlr->groupNum * pl061Cntlr->bitNum; + pl061Cntlr->cntlr.priv = (void *)device->property; + pl061Cntlr->cntlr.ops = &g_sampleGpioMethod; + ret = GpioCntlrAdd(&pl061Cntlr->cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: err add controller: %d", __func__, ret); + return ret; + } + HDF_LOGI("%s: dev service:%s init success!", __func__, HdfDeviceGetServiceName(device)); + return ret; +} + +static void SampleGpioDriverRelease(struct HdfDeviceObject *device) +{ + struct GpioCntlr *gpioCntlr = NULL; + struct Pl061GpioCntlr *pl061GpioCntlr = NULL; + + HDF_LOGD("%s: Enter", __func__); + if (device == NULL) { + HDF_LOGE("%s: device is null!", __func__); + return; + } + + gpioCntlr = GpioCntlrFromDevice(device); + if (gpioCntlr == NULL) { + HDF_LOGE("%s: no service bound!", __func__); + return; + } + GpioCntlrRemove(gpioCntlr); + + pl061GpioCntlr = (struct Pl061GpioCntlr *)gpioCntlr; + ReleaseGpioCntlrMem(pl061GpioCntlr); + OsalIoUnmap((void *)pl061GpioCntlr->regBase); + pl061GpioCntlr->regBase = NULL; +} + +/* Private function implementations */ +static int32_t GetGpioDeviceResource(struct Pl061GpioCntlr *cntlr, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *dri = NULL; + + dri = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (dri == NULL || dri->GetUint8 == NULL || dri->GetUint16 == NULL || dri->GetUint32 == NULL) { + HDF_LOGE("%s: invalid dri ops fail!", __func__); + return HDF_FAILURE; + } + + ret = dri->GetUint32(node, "regBase", &cntlr->phyBase, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regBase fail!", __func__); + return ret; + } + + ret = dri->GetUint32(node, "regStep", &cntlr->regStep, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regStep fail!", __func__); + return ret; + } + + ret = dri->GetUint16(node, "groupNum", &cntlr->groupNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read groupNum fail!", __func__); + return ret; + } + + ret = dri->GetUint16(node, "bitNum", &cntlr->bitNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read bitNum fail!", __func__); + return ret; + } + + ret = dri->GetUint32(node, "irqStart", &cntlr->irqStart, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read irqStart fail!", __func__); + return ret; + } + + ret = dri->GetUint8(node, "irqShare", &cntlr->irqShare, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read irqShare fail!", __func__); + return ret; + } + + return HDF_SUCCESS; +} + +static int32_t InitGpioCntlrMem(struct Pl061GpioCntlr *cntlr) +{ + size_t groupMemSize; + struct GpioGroup *groups = NULL; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + groupMemSize = sizeof(struct GpioGroup) * cntlr->groupNum; + groups = (struct GpioGroup *)OsalMemCalloc(groupMemSize); + if (groups == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + cntlr->groups = groups; + + for (uint16_t i = 0; i < cntlr->groupNum; i++) { + groups[i].index = i; + groups[i].regBase = cntlr->regBase + (i * cntlr->regStep); + if (OsalSpinInit(&groups[i].lock) != HDF_SUCCESS) { + for (; i > 0; i--) { + (void)OsalSpinDestroy(&groups[i - 1].lock); + } + OsalMemFree(groups); + return HDF_FAILURE; + } + } + return HDF_SUCCESS; +} + +static void ReleaseGpioCntlrMem(struct Pl061GpioCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + if (cntlr->groups != NULL) { + for (uint16_t i = 0; i < cntlr->groupNum; i++) { + (void)OsalSpinDestroy(&cntlr->groups[i].lock); + } + OsalMemFree(cntlr->groups); + cntlr->groups = NULL; + } +} + +/* GPIO function implementations */ +static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t val) +{ + HDF_LOGD("%s: Enter", __func__); + + int32_t ret; + uint32_t irqSave; + unsigned int valCur; + unsigned int bitNum = Pl061ToBitNum(gpio); + volatile unsigned char *addr = NULL; + struct GpioGroup *group = NULL; + + ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); + if (ret != HDF_SUCCESS) { + return ret; + } + + addr = GPIO_DATA(group->regBase, bitNum); + if (OsalSpinLockIrqSave(&group->lock, &irqSave) != HDF_SUCCESS) { + return HDF_ERR_DEVICE_BUSY; + } + valCur = OSAL_READL(addr); + if (val == GPIO_VAL_LOW) { + valCur &= ~(1 << bitNum); + } else { + valCur |= (1 << bitNum); + } + OSAL_WRITEL(valCur, addr); + (void)OsalSpinUnlockIrqRestore(&group->lock, &irqSave); + HDF_LOGD("%s: gpio:%u, val:%u", __func__, gpio, val); + return HDF_SUCCESS; +} + +static int32_t SampleGpioRead(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *val) +{ + HDF_LOGD("%s: Enter", __func__); + + int32_t ret; + unsigned int valCur; + volatile unsigned char *addr = NULL; + unsigned int bitNum = Pl061ToBitNum(gpio); + struct GpioGroup *group = NULL; + + ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); + if (ret != HDF_SUCCESS) { + return ret; + } + + addr = GPIO_DATA(group->regBase, bitNum); + valCur = OSAL_READL(addr); + if (valCur & (1 << bitNum)) { + *val = GPIO_VAL_HIGH; + } else { + *val = GPIO_VAL_LOW; + } + HDF_LOGD("%s: gpio:%u, val:%u", __func__, gpio, *val); + return HDF_SUCCESS; +} + +static int32_t SampleGpioSetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t dir) +{ + HDF_LOGD("%s: Enter", __func__); + + int32_t ret; + uint32_t irqSave; + unsigned int val; + volatile unsigned char *addr = NULL; + unsigned int bitNum = Pl061ToBitNum(gpio); + struct GpioGroup *group = NULL; + + HDF_LOGD("%s: gpio:%u, dir:%d", __func__, gpio, dir); + ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); + if (ret != HDF_SUCCESS) { + return ret; + } + + addr = GPIO_DIR(group->regBase); + if (OsalSpinLockIrqSave(&group->lock, &irqSave) != HDF_SUCCESS) { + return HDF_ERR_DEVICE_BUSY; + } + val = OSAL_READL(addr); + if (dir == GPIO_DIR_IN) { + val &= ~(1 << bitNum); + } else if (dir == GPIO_DIR_OUT) { + val |= 1 << bitNum; + } + OSAL_WRITEL(val, addr); + (void)OsalSpinUnlockIrqRestore(&group->lock, &irqSave); + return HDF_SUCCESS; +} +static int32_t SampleGpioGetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *dir) +{ + HDF_LOGD("%s: Enter", __func__); + + int32_t ret; + unsigned int val; + volatile unsigned char *addr = NULL; + unsigned int bitNum = Pl061ToBitNum(gpio); + struct GpioGroup *group = NULL; + + HDF_LOGD("%s: gpio:%u, dir:%p", __func__, gpio, dir); + ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); + if (ret != HDF_SUCCESS) { + return ret; + } + + addr = GPIO_DIR(group->regBase); + val = OSAL_READL(addr); + if (val & (1 << bitNum)) { + *dir = GPIO_DIR_OUT; + } else { + *dir = GPIO_DIR_IN; + } + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/sample/platform/spi/BUILD.gn b/sample/platform/spi/BUILD.gn new file mode 100755 index 000000000..8781560bb --- /dev/null +++ b/sample/platform/spi/BUILD.gn @@ -0,0 +1,11 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//build/lite/config/component/lite_component.gni") + +lite_component("hello_spi_sample") { + features = [ "dispatch:hello_spi_dispatch" ] +} diff --git a/sample/platform/spi/Kconfig b/sample/platform/spi/Kconfig new file mode 100755 index 000000000..5141be9d2 --- /dev/null +++ b/sample/platform/spi/Kconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +config DRIVERS_HDF_PLATFORM_SPI_SAMPLE + bool "Enable HDF platform spi sample driver" + default n + depends on DRIVERS_HDF_PLATFORM + help + Answer Y to enable HDF platform spi sample driver. diff --git a/sample/platform/spi/dispatch/BUILD.gn b/sample/platform/spi/dispatch/BUILD.gn new file mode 100755 index 000000000..cb5a2aeb4 --- /dev/null +++ b/sample/platform/spi/dispatch/BUILD.gn @@ -0,0 +1,45 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +HDF_FRAMEWORKS = "//drivers/framework" + +executable("hello_spi_dispatch") { + sources = [ + "hello_spi_dispatch.c", + "spi_if.c", + ] + + include_dirs = [ + "$HDF_FRAMEWORKS/ability/sbuf/include", + "$HDF_FRAMEWORKS/core/shared/include", + "$HDF_FRAMEWORKS/core/host/include", + "$HDF_FRAMEWORKS/core/master/include", + "$HDF_FRAMEWORKS/include/core", + "$HDF_FRAMEWORKS/include/platform", + "$HDF_FRAMEWORKS/include/utils", + "$HDF_FRAMEWORKS/utils/include", + "$HDF_FRAMEWORKS/include/osal", + "//drivers/adapter/uhdf/posix/include", + "//third_party/bounds_checking_function/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", + ] + + deps = [ + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//drivers/adapter/uhdf/manager:hdf_core", + "//drivers/adapter/uhdf/posix:hdf_posix_osal", + ] + + public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] + defines = [ "__USER__" ] + + cflags = [ + "-Wall", + "-Wextra", + "-Wno-format", + "-Wno-format-extra-args", + ] +} diff --git a/sample/platform/spi/dispatch/hello_spi_dispatch.c b/sample/platform/spi/dispatch/hello_spi_dispatch.c new file mode 100755 index 000000000..30492d67b --- /dev/null +++ b/sample/platform/spi/dispatch/hello_spi_dispatch.c @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "spi_if.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG hello_spi_dispatch + +int main() +{ + int32_t ret; + struct SpiDevInfo spiDevInfo; /* SPI device descriptor */ + struct DevHandle *spiHandle = NULL; /* SPI device handle */ + spiDevInfo.busNum = 3; /* SPI device bus number */ + spiDevInfo.csNum = 0; /* SPI device CS number */ + spiHandle = SpiOpen(&spiDevInfo); + if (spiHandle == NULL) { + HDF_LOGE("SpiOpen failed"); + return HDF_FAILURE; + } + + uint8_t wbuff[1] = {0x12}; + uint8_t rbuff[1] = {0}; + struct SpiMsg msg; /* Custom message to be transferred */ + msg.wbuf = wbuff; /* Pointer to the data to write */ + msg.rbuf = rbuff; /* Pointer to the data to read */ + msg.len = 1; /* The length of the data to be read or written is 1 bits. */ + msg.csChange = 1; /* Disable the CS before the next transfer. */ + msg.delayUs = 0; /* No delay before the next transfer */ + msg.speed = 115200; /* Speed of this transfer */ + ret = SpiTransfer(spiHandle, &msg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("SpiTransfer failed, ret %d", ret); + return ret; + } + SpiClose(spiHandle); + return ret; +} \ No newline at end of file diff --git a/sample/platform/spi/dispatch/spi_if.c b/sample/platform/spi/dispatch/spi_if.c new file mode 100755 index 000000000..be0958362 --- /dev/null +++ b/sample/platform/spi/dispatch/spi_if.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "spi_if.h" +#include "osal_mem.h" +#include "hdf_io_service_if.h" +#include "hdf_log.h" +#include "securec.h" + +#define HDF_LOG_TAG spi_if + +DevHandle SpiOpen(const struct SpiDevInfo *info) +{ + int32_t ret; + void *devHandle = NULL; + uint32_t port; + char *serviceName = NULL; + + if (info == NULL) { + HDF_LOGW("info is NULL"); + return NULL; + } + port = info->busNum; + + serviceName = (char *)OsalMemCalloc(MAX_DEV_NAME_SIZE + 1); + if (serviceName == NULL) { + HDF_LOGE("Failed to OsalMemCalloc serviceName"); + return NULL; + } + ret = snprintf_s(serviceName, MAX_DEV_NAME_SIZE + 1, MAX_DEV_NAME_SIZE, SPI_DEV_SERVICE_NAME_PREFIX, port); + if (ret < 0) { + HDF_LOGE("Failed to snprintf_s"); + OsalMemFree(serviceName); + return NULL; + } + devHandle = (void *)HdfIoServiceBind(serviceName); + OsalMemFree(serviceName); + return devHandle; +} + +void SpiClose(DevHandle handle) +{ + if (handle == NULL) { + HDF_LOGW("handle is NULL"); + return; + } + struct HdfIoService *service = (struct HdfIoService *)handle; + HdfIoServiceRecycle(service); + OsalMemFree(handle); +} + +int32_t SpiTransfer(DevHandle handle, struct SpiMsg *msgs) +{ + int32_t ret; + if (handle == NULL || msgs == NULL) { + HDF_LOGW("handle or msgs is NULL"); + return HDF_ERR_INVALID_PARAM; + } + struct HdfIoService *service = (struct HdfIoService *)handle; + if (service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { + HDF_LOGE("service->dispatcher or service->dispatcher->Dispatch is NULL"); + return HDF_FAILURE; + } + + struct HdfSBuf *sBuf = HdfSBufObtainDefaultSize(); + if (sBuf == NULL) { + HDF_LOGE("Failed to obtain sBuf"); + return HDF_FAILURE; + } + + if (!HdfSbufWriteBuffer(sBuf, msgs, sizeof(struct SpiMsg))) { + HDF_LOGE("Failed to write sbuf"); + HdfSBufRecycle(sBuf); + return HDF_FAILURE; + } + ret = service->dispatcher->Dispatch(&service->object, SPI_TRANSFER, sBuf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Failed to send service call"); + } + HdfSBufRecycle(sBuf); + return ret; +} diff --git a/sample/platform/spi/dispatch/spi_if.h b/sample/platform/spi/dispatch/spi_if.h new file mode 100755 index 000000000..544c5174f --- /dev/null +++ b/sample/platform/spi/dispatch/spi_if.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SPI_IF_H +#define SPI_IF_H + +#include "hdf_platform.h" + +#define SPI_DEV_SERVICE_NAME_PREFIX "HDF_PLATFORM_SPI_%u" +#define MAX_DEV_NAME_SIZE 32 + +struct SpiDevInfo { + uint32_t busNum; + uint32_t csNum; +}; + +struct SpiMsg { + uint8_t *wbuf; + uint8_t *rbuf; + uint32_t len; + uint32_t speed; + uint16_t delayUs; + uint8_t csChange; +}; + +enum { + SPI_TRANSFER = 1 +}; + +DevHandle SpiOpen(const struct SpiDevInfo *info); +void SpiClose(DevHandle handle); +int32_t SpiTransfer(DevHandle handle, struct SpiMsg *msgs); + +#endif // SPI_IF_H diff --git a/sample/platform/spi/include/spi_dispatch_sample.h b/sample/platform/spi/include/spi_dispatch_sample.h new file mode 100755 index 000000000..e1de74540 --- /dev/null +++ b/sample/platform/spi/include/spi_dispatch_sample.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SPI_DISPATCH_SAMPLE_H +#define SPI_DISPATCH_SAMPLE_H + +#include "spi_pl022_sample.h" +#include "spi_core.h" + +enum { + SPI_TRANSFER = 1 +}; + +int32_t SampleSpiDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply); + +#endif // SPI_DISPATCH_SAMPLE_H diff --git a/sample/platform/spi/include/spi_pl022_sample.h b/sample/platform/spi/include/spi_pl022_sample.h new file mode 100755 index 000000000..95e12a832 --- /dev/null +++ b/sample/platform/spi/include/spi_pl022_sample.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SPI_PL022_SAMPLE_H +#define SPI_PL022_SAMPLE_H + +#include "spi_if.h" +#include "osal.h" + +/* ********** spi reg offset define start *************** */ +#define REG_SPI_PL022_CR0 0x00 +#define SPI_PL022_CR0_SCR_SHIFT 8 +#define SPI_PL022_CR0_SPH_SHIFT 7 +#define SPI_PL022_CR0_SPO_SHIFT 6 +#define SPI_PL022_CR0_FRF_SHIFT 4 +#define SPI_PL022_CR0_DSS_SHIFT 0 +#define SPI_PL022_CR0_SCR (0xff << 8) /* clkout=clk/(cpsdvsr*(scr+1)) */ +#define SPI_PL022_CR0_SPH (0x1 << 7) /* spi phase */ +#define SPI_PL022_CR0_SPO (0x1 << 6) /* spi clk polarity */ +#define SPI_PL022_CR0_FRF (0x3 << 4) /* frame format set */ +#define SPI_PL022_CR0_DSS (0xf << 0) /* data bits width */ + +#define REG_SPI_PL022_CR1 0x04 +#define SPI_PL022_CR1_WAIT_EN_SHIFT 15 +#define SPI_PL022_CR1_WAIT_VAL_SHIFT 8 +#define SPI_PL022_CR1_ALT_SHIFT 6 +#define SPI_PL022_CR1_BIG_END_SHIFT 4 +#define SPI_PL022_CR1_MS_SHIFT 2 +#define SPI_PL022_CR1_SSE_SHIFT 1 +#define SPI_PL022_CR1_LBN_SHIFT 0 +#define SPI_PL022_CR1_WAIT_EN (0x1 << 15) +#define SPI_PL022_CR1_WAIT_VAL (0x7f << 8) + +/* alt mode:spi enable csn is select; spi disable csn is cancel */ +#define SPI_PL022_CR1_ALT (0x1 << 6) +#define SPI_PL022_CR1_BIG_END (0x1 << 4) /* big end or little */ +#define SPI_PL022_CR1_MS (0x1 << 2) /* cntlr-device mode */ +#define SPI_PL022_CR1_SSE (0x1 << 1) /* spi enable set */ +#define SPI_PL022_CR1_LBM (0x1 << 0) /* loopback mode */ + +#define REG_SPI_PL022_DR 0x08 + +#define REG_SPI_PL022_SR 0x0c +#define SPI_PL022_SR_BSY_SHIFT 4 +#define SPI_PL022_SR_RFF_SHIFT 3 +#define SPI_PL022_SR_RNE_SHIFT 2 +#define SPI_PL022_SR_TNF_SHIFT 1 +#define SPI_PL022_SR_TFE_SHIFT 0 +#define SPI_PL022_SR_BSY (0x1 << 4) /* spi busy flag */ +#define SPI_PL022_SR_RFF (0x1 << 3) /* Whether to send fifo is full */ +#define SPI_PL022_SR_RNE (0x1 << 2) /* Whether to send fifo is no empty */ +#define SPI_PL022_SR_TNF (0x1 << 1) /* Whether to send fifo is no full */ +#define SPI_PL022_SR_TFE (0x1 << 0) /* Whether to send fifo is empty */ + +#define REG_SPI_PL022_CPSR 0x10 +#define SPI_PL022_CPSR_CPSDVSR_SHIFT 0 +#define SPI_PL022_CPSR_CPSDVSR (0xff << 0) /* even 2~254 */ + +#define REG_SPI_PL022_IMSC 0x14 +#define REG_SPI_PL022_RIS 0x18 +#define REG_SPI_PL022_MIS 0x1c +#define REG_SPI_PL022_ICR 0x20 + +#define REG_SPI_CRG 0x120100e4 /* CRG_REG_BASE(0x12010000) + 0x0e4 */ +#define SPI_CRG_CLK_EN 0 +#define SPI_CRG_CLK_RST 0 + +#define REG_SPI_MISC_CTRL 0x12030024 /* MISC_REG_BASE(0x12030000) + 0x24 */ +#define SPI_MISC_CTRL_CS 0 +#define SPI_MISC_CTRL_CS_SHIFT 0 +/* ********** spi reg offset define end *************** */ + +#define MAX_WAIT 5000 +#define DEFAULT_SPEED 2000000 + +#define SCR_MAX 255 +#define SCR_MIN 0 +#define CPSDVSR_MAX 254 +#define CPSDVSR_MIN 2 +#define SPI_CS_ACTIVE 0 +#define SPI_CS_INACTIVE 1 +#define TWO_BYTES 2 +#define BITS_PER_WORD_MIN 4 +#define BITS_PER_WORD_DEFAULT 8 +#define BITS_PER_WORD_MAX 16 + +struct Pl022SpiCntlr { + struct SpiCntlr *cntlr; + struct DListHead deviceList; + volatile unsigned char *regBase; + uint32_t busNum; + uint32_t numCs; + uint32_t curCs; + uint32_t speed; + uint32_t fifoSize; + uint32_t clkRate; + uint32_t maxSpeedHz; + uint32_t minSpeedHz; + uint32_t regCrg; + uint32_t clkEnBit; + uint32_t clkRstBit; + uint32_t regMiscCtrl; + uint32_t miscCtrlCsShift; + uint32_t miscCtrlCs; + uint16_t mode; + uint8_t bitsPerWord; + uint8_t transferMode; +}; + +int ConfigPl022SpiCntlr(struct Pl022SpiCntlr *cntlr); +int32_t TransferOneMessage(struct Pl022SpiCntlr *cntlr, struct SpiMsg *msg); + +#endif // SPI_PL022_SAMPLE_H diff --git a/sample/platform/spi/include/spi_sample.h b/sample/platform/spi/include/spi_sample.h new file mode 100755 index 000000000..64b32bfcf --- /dev/null +++ b/sample/platform/spi/include/spi_sample.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SPI_SAMPLE_H +#define SPI_SAMPLE_H + +#include "spi_core.h" + +int32_t SampleSpiCntlrTransfer(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count); +int32_t SampleSpiCntlrSetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg); +int32_t SampleSpiCntlrGetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg); + +#endif // SPI_SAMPLE_H diff --git a/sample/platform/spi/src/BUILD.gn b/sample/platform/spi/src/BUILD.gn new file mode 100755 index 000000000..1aa16f223 --- /dev/null +++ b/sample/platform/spi/src/BUILD.gn @@ -0,0 +1,23 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//drivers/adapter/khdf/liteos/hdf.gni") + +module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_SPI_SAMPLE) +module_name = "hdf_spi_sample" +hdf_driver(module_name) { + FRAMEWORK_SPI_ROOT = "//drivers/framework/sample/platform/spi/src" + sources = [ + "$FRAMEWORK_SPI_ROOT/spi_dispatch_sample.c", + "$FRAMEWORK_SPI_ROOT/spi_pl022_sample.c", + "$FRAMEWORK_SPI_ROOT/spi_sample.c", + ] + + include_dirs = [ + "//drivers/framework/sample/platform/spi/include/", + "//drivers/framework/support/platform/include/spi", + ] +} diff --git a/sample/platform/spi/src/spi_dispatch_sample.c b/sample/platform/spi/src/spi_dispatch_sample.c new file mode 100755 index 000000000..99bf1d7d5 --- /dev/null +++ b/sample/platform/spi/src/spi_dispatch_sample.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "spi_dispatch_sample.h" +#include "spi_sample.h" +#include "hdf_log.h" +#include "hdf_sbuf.h" + +#define HDF_LOG_TAG spi_dispatch_sample + +static int32_t SampleSpiTransfer(struct SpiCntlr *cntlr, struct HdfSBuf *txBuf) +{ + HDF_LOGD("%s: Enter", __func__); + uint32_t readSize = sizeof(struct SpiMsg); + struct SpiMsg *msg = NULL; + + if (cntlr == NULL || cntlr->priv == NULL || txBuf == NULL) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufReadBuffer(txBuf, (const void **)&msg, &readSize)) { + HDF_LOGE("%s: Failed to read sbuf", __func__); + return HDF_DEV_ERR_NO_MEMORY; + } + + if (SampleSpiCntlrTransfer(cntlr, msg, msg->len) != HDF_SUCCESS) { + HDF_LOGE("%s: SampleSpiCntlrTransfer error", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t SampleSpiDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + if (client == NULL || client->device == NULL) { + HDF_LOGE("%s: client or client->device is NULL", __func__); + return HDF_FAILURE; + } + + struct SpiCntlr *cntlr = (struct SpiCntlr *)client->device->service; + if (cntlr == NULL || cntlr->method == NULL) { + HDF_LOGE("%s: cntlr or cntlr->method is NULL", __func__); + return HDF_FAILURE; + } + + switch (cmdId) { + case SPI_TRANSFER: + return SampleSpiTransfer(cntlr, data); + default: + HDF_LOGE("%s: invalid cmdId %d", __func__, cmdId); + return HDF_FAILURE; + } +} \ No newline at end of file diff --git a/sample/platform/spi/src/spi_pl022_sample.c b/sample/platform/spi/src/spi_pl022_sample.c new file mode 100755 index 000000000..58ae8d24e --- /dev/null +++ b/sample/platform/spi/src/spi_pl022_sample.c @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "spi_pl022_sample.h" +#include "osal_io.h" + +#define HDF_LOG_TAG spi_pl022_sample + +/* Private function prototypes */ +static int Pl022SampleSetCs(struct Pl022SpiCntlr *cntlr, uint32_t cs, uint32_t flag); +static int Pl022SampleFlushFifo(const struct Pl022SpiCntlr *cntlr); +static int Pl022SampleTxRx8(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg); +static int Pl022SampleTxRx16(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg); +static void Pl022SampleEnableCntlr(const struct Pl022SpiCntlr *cntlr); +static void Pl022SampleConfigCPSR(const struct Pl022SpiCntlr *cntlr, uint32_t cpsdvsr); +static void Pl022SampleConfigCR0(const struct Pl022SpiCntlr *cntlr, uint32_t scr); +static void Pl022SampleConfigCR1(const struct Pl022SpiCntlr *cntlr); +static int32_t Pl022SampleCfgCs(struct Pl022SpiCntlr *cntlr, uint32_t cs); +static void Pl022SampleDisableCntlr(const struct Pl022SpiCntlr *cntlr); +static int Pl022SampleCheckTimeout(const struct Pl022SpiCntlr *cntlr); + +int ConfigPl022SpiCntlr(struct Pl022SpiCntlr *cntlr) +{ + uint32_t tmp; + uint32_t scr; + uint32_t cpsdvsr; + + Pl022SampleEnableCntlr(cntlr); + /* Check if we can provide the requested rate */ + if (cntlr->speed > cntlr->maxSpeedHz) { + cntlr->speed = cntlr->maxSpeedHz; + } + /* Min possible */ + if ((cntlr->speed < cntlr->minSpeedHz) || (cntlr->speed == 0)) { + HDF_LOGE("%s: cntlr->speed is %u not support, max %u, min %u", __func__, + cntlr->speed, cntlr->maxSpeedHz, cntlr->minSpeedHz); + return HDF_FAILURE; + } + /* Check if we can provide the requested bits_per_word */ + if ((cntlr->bitsPerWord < BITS_PER_WORD_MIN) || (cntlr->bitsPerWord > BITS_PER_WORD_MAX)) { + HDF_LOGE("%s: cntlr->bitsPerWord is %u not support", __func__, cntlr->bitsPerWord); + return HDF_FAILURE; + } + /* compute spi speed, speed=clk/(cpsdvsr*(scr+1)) */ + tmp = (cntlr->clkRate) / (cntlr->speed); + if (tmp < CPSDVSR_MIN) { + cpsdvsr = CPSDVSR_MIN; + scr = 0; + } else if (tmp <= CPSDVSR_MAX) { + cpsdvsr = tmp & (~0x1); + scr = (tmp / cpsdvsr) - 1; + } else { + cpsdvsr = CPSDVSR_MAX; + scr = (tmp / cpsdvsr) - 1; + } + /* config SPICPSR register */ + Pl022SampleConfigCPSR(cntlr, cpsdvsr); + /* config SPICR0 register */ + Pl022SampleConfigCR0(cntlr, scr); + /* config SPICR1 register */ + Pl022SampleConfigCR1(cntlr); + return HDF_SUCCESS; +} + +int32_t TransferOneMessage(struct Pl022SpiCntlr *cntlr, struct SpiMsg *msg) +{ + int32_t ret; + + if (msg->speed != 0) { + cntlr->speed = msg->speed; + } + ret = ConfigPl022SpiCntlr(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + ret = Pl022SampleSetCs(cntlr, cntlr->curCs, SPI_CS_ACTIVE); + if (ret != HDF_SUCCESS) { + return ret; + } + ret = Pl022SampleFlushFifo(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + if (cntlr->bitsPerWord <= BITS_PER_WORD_DEFAULT) { + ret = Pl022SampleTxRx8(cntlr, msg); + } else { + ret = Pl022SampleTxRx16(cntlr, msg); + } + if (ret || msg->csChange) { + Pl022SampleSetCs(cntlr, cntlr->curCs, SPI_CS_INACTIVE); + } + return ret; +} + +/* Private function implementations */ +static int Pl022SampleSetCs(struct Pl022SpiCntlr *cntlr, uint32_t cs, uint32_t flag) +{ + if (Pl022SampleCfgCs(cntlr, cs) != HDF_SUCCESS) { + return HDF_FAILURE; + } + if (flag == SPI_CS_ACTIVE) { + Pl022SampleEnableCntlr(cntlr); + } else { + Pl022SampleDisableCntlr(cntlr); + } + return HDF_SUCCESS; +} + +static int Pl022SampleFlushFifo(const struct Pl022SpiCntlr *cntlr) +{ + uint32_t value; + uint32_t ret; + uint32_t tmp = 0; + + ret = Pl022SampleCheckTimeout(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + while (true) { + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); + if (!(value & SPI_PL022_SR_RNE)) { + break; + } + if (tmp++ > cntlr->fifoSize) { + HDF_LOGE("%s: spi transfer check rx fifo wait timeout", __func__); + return HDF_ERR_TIMEOUT; + } + OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); + } + return HDF_SUCCESS; +} + +static int Pl022SampleTxRx8(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg) +{ + uint32_t len = msg->len; + uint32_t tmpLen; + uint32_t count; + const uint8_t *tx = (const uint8_t *)(msg->wbuf); + uint8_t *rx = (uint8_t *)(msg->rbuf); + uint8_t value; + uint32_t ret; + + if (tx == NULL && rx == NULL) { + return HDF_ERR_INVALID_PARAM; + } + while (len > 0) { + if (len > cntlr->fifoSize) { + tmpLen = cntlr->fifoSize; + } else { + tmpLen = len; + } + len -= tmpLen; + /* write fifo */ + count = tmpLen; + value = 0; + while (count > 0) { + if (tx != NULL) { + value = *tx++; + } + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); + count -= 1; + OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); + } + ret = Pl022SampleCheckTimeout(cntlr); + if (ret != HDF_SUCCESS) { + return ret; + } + /* read fifo */ + count = tmpLen; + while (count > 0) { + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); + if (rx != NULL) { + *rx++ = value; + } + count -= 1; + OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); + } + } + return HDF_SUCCESS; +} + +static int Pl022SampleTxRx16(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg) +{ + uint32_t len = msg->len; + uint32_t tmpLen; + uint32_t count; + const uint16_t *tx = (const uint16_t *)(msg->wbuf); + uint16_t *rx = (uint16_t *)(msg->rbuf); + uint16_t value; + uint32_t ret; + + if (tx == NULL && rx == NULL) { + return HDF_ERR_INVALID_PARAM; + } + while (len > 0) { + ret = cntlr->fifoSize * TWO_BYTES; + if (len > ret) { + tmpLen = ret; + } else { + tmpLen = len; + } + len -= tmpLen; + /* write fifo */ + count = tmpLen; + value = 0; + while (count >= TWO_BYTES) { + if (tx != NULL) { + value = *tx++; + } + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); + count -= TWO_BYTES; + } + ret = Pl022SampleCheckTimeout(cntlr); + if (ret != 0) { + return ret; + } + /* read fifo */ + count = tmpLen; + while (count >= TWO_BYTES) { + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); + if (rx != NULL) { + *rx++ = value; + } + count -= TWO_BYTES; + } + } + return 0; +} + +static void Pl022SampleEnableCntlr(const struct Pl022SpiCntlr *cntlr) +{ + uint32_t value; + + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); + value |= SPI_PL022_CR1_SSE; + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); +} + +static void Pl022SampleConfigCPSR(const struct Pl022SpiCntlr *cntlr, uint32_t cpsdvsr) +{ + uint32_t value; + + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CPSR); + value &= ~SPI_PL022_CPSR_CPSDVSR; + value |= cpsdvsr << SPI_PL022_CPSR_CPSDVSR_SHIFT; + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CPSR); +} + +static void Pl022SampleConfigCR0(const struct Pl022SpiCntlr *cntlr, uint32_t scr) +{ + uint32_t tmp; + uint32_t value; + + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR0); + value &= ~SPI_PL022_CR0_DSS; + value |= (cntlr->bitsPerWord - 1) << SPI_PL022_CR0_DSS_SHIFT; + value &= ~SPI_PL022_CR0_FRF; + value &= ~SPI_PL022_CR0_SPO; + tmp = (!!(cntlr->mode & SPI_CLK_POLARITY)) ? (1 << SPI_PL022_CR0_SPO_SHIFT) : 0; + value |= tmp; + value &= ~SPI_PL022_CR0_SPH; + tmp = (!!(cntlr->mode & SPI_CLK_PHASE)) ? (1 << SPI_PL022_CR0_SPH_SHIFT) : 0; + value |= tmp; + value &= ~SPI_PL022_CR0_SCR; + value |= (scr << SPI_PL022_CR0_SCR_SHIFT); + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR0); +} + +static void Pl022SampleConfigCR1(const struct Pl022SpiCntlr *cntlr) +{ + uint32_t tmp; + uint32_t value; + + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); + value &= ~SPI_PL022_CR1_LBM; + tmp = (!!(cntlr->mode & SPI_MODE_LOOP)) ? (1 << SPI_PL022_CR1_LBN_SHIFT) : 0; + value |= tmp; + value &= ~SPI_PL022_CR1_MS; + value &= ~SPI_PL022_CR1_BIG_END; + tmp = (!!(cntlr->mode & SPI_MODE_LSBFE)) ? (1 << SPI_PL022_CR1_BIG_END_SHIFT) : 0; + value |= tmp; + value &= ~SPI_PL022_CR1_ALT; + value |= 0x1 << SPI_PL022_CR1_ALT_SHIFT; + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); +} + +static int32_t Pl022SampleCfgCs(struct Pl022SpiCntlr *cntlr, uint32_t cs) +{ + uint32_t value; + uint32_t miscCtrlCs; + + if ((cs + 1) > cntlr->numCs) { + HDF_LOGE("%s: cs %u is big than cntlr csNum %u", __func__, cs, cntlr->numCs); + return HDF_FAILURE; + } + if (cntlr->numCs == 1) { + return HDF_SUCCESS; + } + miscCtrlCs = (UINTPTR)(cntlr->regBase) + REG_SPI_MISC_CTRL; + value = OSAL_READL(miscCtrlCs); + value &= ~miscCtrlCs; + value |= (cs << cntlr->miscCtrlCsShift); + OSAL_WRITEL(value, miscCtrlCs); + return HDF_SUCCESS; +} + +static void Pl022SampleDisableCntlr(const struct Pl022SpiCntlr *cntlr) +{ + uint32_t value; + + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); + value &= ~SPI_PL022_CR1_SSE; + OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); +} + +static int Pl022SampleCheckTimeout(const struct Pl022SpiCntlr *cntlr) +{ + uint32_t value; + uint32_t tmp = 0; + + while (true) { + value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); + if ((value & SPI_PL022_SR_TFE) && (!(value & SPI_PL022_SR_BSY))) { + break; + } + if (tmp++ > MAX_WAIT) { + HDF_LOGE("%s: spi transfer wait timeout", __func__); + return HDF_ERR_TIMEOUT; + } + OsalUDelay(1); + } + return HDF_SUCCESS; +} \ No newline at end of file diff --git a/sample/platform/spi/src/spi_sample.c b/sample/platform/spi/src/spi_sample.c new file mode 100755 index 000000000..526792364 --- /dev/null +++ b/sample/platform/spi/src/spi_sample.c @@ -0,0 +1,355 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "spi_sample.h" +#include "spi_pl022_sample.h" +#include "spi_dispatch_sample.h" +#include "device_resource_if.h" +#include "hdf_base.h" +#include "osal_mem.h" +#include "hdf_log.h" +#include "spi_core.h" +#include "los_vm_zone.h" + +#define HDF_LOG_TAG spi_sample + +/* HdfDriverEntry hook function prototypes */ +static int32_t SampleSpiDriverBind(struct HdfDeviceObject *device); +static int32_t SampleSpiDriverInit(struct HdfDeviceObject *device); +static void SampleSpiDriverRelease(struct HdfDeviceObject *device); + +/* SpiCntlrMethod definition */ +struct SpiCntlrMethod g_sampleSpiMethod = { + .Transfer = SampleSpiCntlrTransfer, + .SetCfg = SampleSpiCntlrSetCfg, + .GetCfg = SampleSpiCntlrGetCfg, +}; + +/* HdfDriverEntry definition */ +struct HdfDriverEntry g_sampleSpiDriverEntry = { + .moduleVersion = 1, + .moduleName = "SPI_SAMPLE", + .Bind = SampleSpiDriverBind, + .Init = SampleSpiDriverInit, + .Release = SampleSpiDriverRelease, +}; + +/* Init HdfDriverEntry */ +HDF_INIT(g_sampleSpiDriverEntry); + +/* Private function prototypes */ +static int InitSpiDevice(struct SpiCntlr *cntlr, const struct DeviceResourceNode *property); +static int ConfigSpiDevice(struct Pl022SpiCntlr *pl022Cntlr); +static int32_t InitSpiDeviceResource(struct Pl022SpiCntlr *pl022Cntlr, const struct DeviceResourceNode *node); +static int32_t CreateSpiDev(struct Pl022SpiCntlr *pl022Cntlr); +static void ReleaseSpiDev(struct Pl022SpiCntlr *pl022Cntlr); +static struct SpiDev *FindDeviceByCsNum(const struct Pl022SpiCntlr *pl022Cntlr, uint32_t cs); + +/* HdfDriverEntry hook function implementations */ +static int32_t SampleSpiDriverBind(struct HdfDeviceObject *device) +{ + HDF_LOGD("%s: Enter", __func__); + struct SpiCntlr *cntlr = NULL; + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + cntlr = SpiCntlrCreate(device); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is NULL", __func__); + return HDF_FAILURE; + } + + cntlr->service.Dispatch = SampleSpiDispatch; + return HDF_SUCCESS; +} + +static int32_t SampleSpiDriverInit(struct HdfDeviceObject *device) +{ + HDF_LOGD("%s: Enter", __func__); + int ret; + struct SpiCntlr *cntlr = NULL; + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or device->property is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + cntlr = SpiCntlrFromDevice(device); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + ret = InitSpiDevice(cntlr, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: InitSpiDevice failed", __func__); + return ret; + } + ret = ConfigSpiDevice(cntlr->priv); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: ConfigSpiDevice failed", __func__); + return ret; + } + return ret; +} + +static void SampleSpiDriverRelease(struct HdfDeviceObject *device) +{ + HDF_LOGD("%s: Enter", __func__); + struct SpiCntlr *cntlr = NULL; + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return; + } + cntlr = SpiCntlrFromDevice(device); + if (cntlr == NULL) { + HDF_LOGE("%s: cntlr is null", __func__); + return; + } + if (cntlr->priv != NULL) { + ReleaseSpiDev((struct Pl022SpiCntlr *)cntlr->priv); + } + SpiCntlrDestroy(cntlr); +} + +/* SPI function implementations */ +int32_t SampleSpiCntlrTransfer(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count) +{ + HDF_LOGD("%s: Enter", __func__); + int ret; + struct Pl022SpiCntlr *pl022Cntlr = NULL; + struct SpiDev *spiDev = NULL; + + if (cntlr == NULL || cntlr->priv == NULL || msg == NULL || count == 0) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; + spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); + if (spiDev == NULL) { + HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); + return HDF_FAILURE; + } + pl022Cntlr->mode = spiDev->cfg.mode; + pl022Cntlr->transferMode = spiDev->cfg.transferMode; + pl022Cntlr->bitsPerWord = spiDev->cfg.bitsPerWord; + pl022Cntlr->maxSpeedHz = spiDev->cfg.maxSpeedHz; + pl022Cntlr->curCs = spiDev->csNum; + for (uint32_t i = 0; i < count; i++) { + ret = TransferOneMessage(pl022Cntlr, &(msg[i])); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: transfer error", __func__); + return ret; + } + } + return ret; +} + +int32_t SampleSpiCntlrSetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) +{ + HDF_LOGD("%s: Enter", __func__); + struct Pl022SpiCntlr *pl022Cntlr = NULL; + struct SpiDev *spiDev = NULL; + + if (cntlr == NULL || cntlr->priv == NULL || cfg == NULL) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; + spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); + if (spiDev == NULL) { + HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); + return HDF_FAILURE; + } + spiDev->cfg.mode = cfg->mode; + spiDev->cfg.transferMode = cfg->transferMode; + spiDev->cfg.bitsPerWord = cfg->bitsPerWord; + if ((cfg->bitsPerWord < BITS_PER_WORD_MIN) || (cfg->bitsPerWord > BITS_PER_WORD_MAX)) { + HDF_LOGE("%s: bitsPerWord %u not support, use default bitsPerWord %u", + __func__, cfg->bitsPerWord, BITS_PER_WORD_DEFAULT); + spiDev->cfg.bitsPerWord = BITS_PER_WORD_DEFAULT; + } + if (cfg->maxSpeedHz != 0) { + spiDev->cfg.maxSpeedHz = cfg->maxSpeedHz; + } + return HDF_SUCCESS; +} + +int32_t SampleSpiCntlrGetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) +{ + HDF_LOGD("%s: Enter", __func__); + struct Pl022SpiCntlr *pl022Cntlr = NULL; + struct SpiDev *spiDev = NULL; + + if (cntlr == NULL || cntlr->priv == NULL || cfg == NULL) { + HDF_LOGE("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; + spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); + if (spiDev == NULL) { + HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); + return HDF_FAILURE; + } + cfg->mode = spiDev->cfg.mode; + cfg->transferMode = spiDev->cfg.transferMode; + cfg->bitsPerWord = spiDev->cfg.bitsPerWord; + cfg->maxSpeedHz = spiDev->cfg.maxSpeedHz; + return HDF_SUCCESS; +} + +/* Private function implementations */ +static int InitSpiDevice(struct SpiCntlr *cntlr, const struct DeviceResourceNode *property) +{ + int ret; + struct Pl022SpiCntlr *pl022Cntlr = NULL; + + pl022Cntlr = (struct Pl022SpiCntlr *)OsalMemCalloc(sizeof(*pl022Cntlr)); + if (pl022Cntlr == NULL) { + HDF_LOGE("%s: OsalMemCalloc error", __func__); + return HDF_FAILURE; + } + ret = InitSpiDeviceResource(pl022Cntlr, property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: InitSpiDeviceResource error", __func__); + OsalMemFree(pl022Cntlr); + return HDF_FAILURE; + } + pl022Cntlr->maxSpeedHz = (pl022Cntlr->clkRate) / ((SCR_MIN + 1) * CPSDVSR_MIN); + pl022Cntlr->minSpeedHz = (pl022Cntlr->clkRate) / ((SCR_MAX + 1) * CPSDVSR_MAX); + DListHeadInit(&pl022Cntlr->deviceList); + pl022Cntlr->cntlr = cntlr; + cntlr->priv = pl022Cntlr; + cntlr->busNum = pl022Cntlr->busNum; + cntlr->method = &g_sampleSpiMethod; + ret = CreateSpiDev(pl022Cntlr); + if (ret != HDF_SUCCESS) { + ReleaseSpiDev(pl022Cntlr); + return ret; + } + return HDF_SUCCESS; +} + +static int ConfigSpiDevice(struct Pl022SpiCntlr *pl022Cntlr) +{ + int ret; + + ret = ConfigPl022SpiCntlr(pl022Cntlr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: HiPl022Config error", __func__); + } + return ret; +} + +static int32_t InitSpiDeviceResource(struct Pl022SpiCntlr *pl022Cntlr, const struct DeviceResourceNode *node) +{ + uint32_t tmp; + struct DeviceResourceIface *resIf = NULL; + + resIf = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (resIf == NULL || resIf->GetUint8 == NULL || resIf->GetUint16 == NULL || resIf->GetUint32 == NULL) { + HDF_LOGE("%s: resource is invalid", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint32(node, "regBase", &tmp, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read regBase fail", __func__); + return HDF_FAILURE; + } + pl022Cntlr->regBase = (void *)(uintptr_t)(IO_DEVICE_ADDR(tmp)); + if (resIf->GetUint32(node, "busNum", &pl022Cntlr->busNum, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read busNum fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint32(node, "numCs", &pl022Cntlr->numCs, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read numCs fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint32(node, "speed", &pl022Cntlr->speed, DEFAULT_SPEED) != HDF_SUCCESS) { + HDF_LOGE("%s: read speed fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint32(node, "fifoSize", &pl022Cntlr->fifoSize, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read fifoSize fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint32(node, "clkRate", &pl022Cntlr->clkRate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read clkRate fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint16(node, "mode", &pl022Cntlr->mode, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read mode fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint8(node, "bitsPerWord", &pl022Cntlr->bitsPerWord, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read bitsPerWord fail", __func__); + return HDF_FAILURE; + } + if (resIf->GetUint8(node, "transferMode", &pl022Cntlr->transferMode, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: read comMode fail", __func__); + return HDF_FAILURE; + } + pl022Cntlr->regCrg = REG_SPI_CRG; + pl022Cntlr->clkEnBit = SPI_CRG_CLK_EN; + pl022Cntlr->clkRstBit = SPI_CRG_CLK_RST; + pl022Cntlr->regMiscCtrl = REG_SPI_MISC_CTRL; + pl022Cntlr->miscCtrlCs = SPI_MISC_CTRL_CS; + pl022Cntlr->miscCtrlCsShift = SPI_MISC_CTRL_CS_SHIFT; + return HDF_SUCCESS; +} + +static int32_t CreateSpiDev(struct Pl022SpiCntlr *pl022Cntlr) +{ + uint32_t i; + struct SpiDev *device = NULL; + + for (i = 0; i < pl022Cntlr->numCs; i++) { + device = (struct SpiDev *)OsalMemCalloc(sizeof(*device)); + if (device == NULL) { + HDF_LOGE("%s: OsalMemCalloc error", __func__); + return HDF_FAILURE; + } + device->cntlr = pl022Cntlr->cntlr; + device->csNum = i; + device->cfg.bitsPerWord = pl022Cntlr->bitsPerWord; + device->cfg.transferMode = pl022Cntlr->transferMode; + device->cfg.maxSpeedHz = pl022Cntlr->maxSpeedHz; + device->cfg.mode = pl022Cntlr->mode; + DListHeadInit(&device->list); + DListInsertTail(&device->list, &pl022Cntlr->deviceList); + } + return HDF_SUCCESS; +} + +static void ReleaseSpiDev(struct Pl022SpiCntlr *pl022Cntlr) +{ + struct SpiDev *dev = NULL; + struct SpiDev *tmpDev = NULL; + + DLIST_FOR_EACH_ENTRY_SAFE(dev, tmpDev, &(pl022Cntlr->deviceList), struct SpiDev, list) { + if (dev != NULL) { + DListRemove(&(dev->list)); + OsalMemFree(dev); + } + } + OsalMemFree(pl022Cntlr); +} + +static struct SpiDev *FindDeviceByCsNum(const struct Pl022SpiCntlr *pl022Cntlr, uint32_t cs) +{ + struct SpiDev *dev = NULL; + struct SpiDev *tmpDev = NULL; + + if (pl022Cntlr == NULL || pl022Cntlr->numCs <= cs) { + return NULL; + } + DLIST_FOR_EACH_ENTRY_SAFE(dev, tmpDev, &(pl022Cntlr->deviceList), struct SpiDev, list) { + if (dev->csNum == cs) { + break; + } + } + return dev; +} \ No newline at end of file diff --git a/sample/platform/uart/BUILD.gn b/sample/platform/uart/BUILD.gn new file mode 100755 index 000000000..9404df097 --- /dev/null +++ b/sample/platform/uart/BUILD.gn @@ -0,0 +1,14 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//build/lite/config/component/lite_component.gni") + +lite_component("hello_uart_sample") { + features = [ + "dev:hello_uart", + "dispatch:hello_uart_dispatch", + ] +} diff --git a/sample/platform/uart/Kconfig b/sample/platform/uart/Kconfig new file mode 100755 index 000000000..2a317abf3 --- /dev/null +++ b/sample/platform/uart/Kconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +config DRIVERS_HDF_PLATFORM_UART_SAMPLE + bool "Enable HDF platform uart sample driver" + default n + depends on DRIVERS_HDF_PLATFORM + help + Answer Y to enable HDF platform uart sample driver. diff --git a/sample/platform/uart/dev/BUILD.gn b/sample/platform/uart/dev/BUILD.gn new file mode 100755 index 000000000..25f7815c0 --- /dev/null +++ b/sample/platform/uart/dev/BUILD.gn @@ -0,0 +1,41 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +HDF_FRAMEWORKS = "//drivers/framework" + +executable("hello_uart") { + sources = [ "hello_uart_dev.c" ] + + include_dirs = [ + "$HDF_FRAMEWORKS/ability/sbuf/include", + "$HDF_FRAMEWORKS/core/shared/include", + "$HDF_FRAMEWORKS/core/host/include", + "$HDF_FRAMEWORKS/core/master/include", + "$HDF_FRAMEWORKS/include/core", + "$HDF_FRAMEWORKS/include/utils", + "$HDF_FRAMEWORKS/utils/include", + "$HDF_FRAMEWORKS/include/osal", + "//drivers/adapter/uhdf/posix/include", + "//third_party/bounds_checking_function/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", + ] + + deps = [ + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//drivers/adapter/uhdf/manager:hdf_core", + "//drivers/adapter/uhdf/posix:hdf_posix_osal", + ] + + public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] + defines = [ "__USER__" ] + + cflags = [ + "-Wall", + "-Wextra", + "-Wno-format", + "-Wno-format-extra-args", + ] +} diff --git a/sample/platform/uart/dev/hello_uart_dev.c b/sample/platform/uart/dev/hello_uart_dev.c new file mode 100755 index 000000000..ffacc5df0 --- /dev/null +++ b/sample/platform/uart/dev/hello_uart_dev.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include "hdf_log.h" + +#define HDF_LOG_TAG hello_uart +#define INFO_SIZE 16 + +int main(void) +{ + int ret; + int fd; + const char info[INFO_SIZE] = {" HELLO UART! "}; + + fd = open("/dev/uartdev-5", O_RDWR); + if (fd < 0) { + HDF_LOGE("uartdev-5 open failed %d", fd); + return -1; + } + ret = write(fd, info, INFO_SIZE); + if (ret != 0) { + HDF_LOGE("write uartdev-5 ret is %d", ret); + } + ret = close(fd); + if (ret != 0) { + HDF_LOGE("uartdev-5 close failed %d", fd); + return -1; + } + return ret; +} \ No newline at end of file diff --git a/sample/platform/uart/dispatch/BUILD.gn b/sample/platform/uart/dispatch/BUILD.gn new file mode 100755 index 000000000..6813ed10c --- /dev/null +++ b/sample/platform/uart/dispatch/BUILD.gn @@ -0,0 +1,44 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +HDF_FRAMEWORKS = "//drivers/framework" + +executable("hello_uart_dispatch") { + sources = [ + "hello_uart_dispatch.c", + "uart_if.c", + ] + + include_dirs = [ + "$HDF_FRAMEWORKS/ability/sbuf/include", + "$HDF_FRAMEWORKS/core/shared/include", + "$HDF_FRAMEWORKS/core/host/include", + "$HDF_FRAMEWORKS/core/master/include", + "$HDF_FRAMEWORKS/include/core", + "$HDF_FRAMEWORKS/include/utils", + "$HDF_FRAMEWORKS/utils/include", + "$HDF_FRAMEWORKS/include/osal", + "//drivers/adapter/uhdf/posix/include", + "//third_party/bounds_checking_function/include", + "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", + ] + + deps = [ + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//drivers/adapter/uhdf/manager:hdf_core", + "//drivers/adapter/uhdf/posix:hdf_posix_osal", + ] + + public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] + defines = [ "__USER__" ] + + cflags = [ + "-Wall", + "-Wextra", + "-Wno-format", + "-Wno-format-extra-args", + ] +} diff --git a/sample/platform/uart/dispatch/hello_uart_dispatch.c b/sample/platform/uart/dispatch/hello_uart_dispatch.c new file mode 100755 index 000000000..ea123de11 --- /dev/null +++ b/sample/platform/uart/dispatch/hello_uart_dispatch.c @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include "hdf_log.h" +#include "osal_mem.h" +#include "uart_if.h" + +#define HDF_LOG_TAG hello_uart_dispatch +#define UART_PORT 5 + +int main() +{ + const char *info = " HELLO UART! "; + + struct DevHandle *handle = UartOpen(UART_PORT); + if (handle == NULL) { + HDF_LOGE("Failed to open uart %d", UART_PORT); + return HDF_FAILURE; + } + + int ret = UartWrite(handle, (uint8_t *)info, strlen(info)); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Failed to send data to uart"); + } + + UartClose(handle); + return ret; +} \ No newline at end of file diff --git a/sample/platform/uart/dispatch/uart_if.c b/sample/platform/uart/dispatch/uart_if.c new file mode 100755 index 000000000..e3f6152c6 --- /dev/null +++ b/sample/platform/uart/dispatch/uart_if.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "uart_if.h" +#include "securec.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "hdf_io_service_if.h" + +#define HDF_LOG_TAG uart_if + +struct DevHandle *UartOpen(uint32_t port) +{ + int32_t ret; + struct DevHandle *handle = NULL; + char *serviceName = NULL; + + handle = (struct DevHandle *)OsalMemCalloc(sizeof(struct DevHandle)); + if (handle == NULL) { + HDF_LOGE("Failed to OsalMemCalloc handle"); + return NULL; + } + + serviceName = (char *)OsalMemCalloc(sizeof(char) * (MAX_DEV_NAME_SIZE + 1)); + if (serviceName == NULL) { + HDF_LOGE("Failed to OsalMemCalloc serviceName"); + OsalMemFree(handle); + return NULL; + } + ret = snprintf_s(serviceName, MAX_DEV_NAME_SIZE + 1, MAX_DEV_NAME_SIZE, UART_DEV_SERVICE_NAME_PREFIX, port); + if (ret < 0) { + HDF_LOGE("Failed to snprintf_s"); + OsalMemFree(handle); + OsalMemFree(serviceName); + return NULL; + } + + struct HdfIoService *service = HdfIoServiceBind(serviceName); + if (service == NULL) { + HDF_LOGE("Failed to get service %s", serviceName); + OsalMemFree(handle); + OsalMemFree(serviceName); + return NULL; + } + OsalMemFree(serviceName); + handle->object = service; + return handle; +} + +int32_t UartWrite(struct DevHandle *handle, uint8_t *data, uint32_t size) +{ + int ret; + struct HdfIoService *service = NULL; + + if (handle == NULL || handle->object == NULL) { + HDF_LOGE("handle or handle->object is NULL"); + return HDF_FAILURE; + } + + struct HdfSBuf *sBuf = HdfSBufObtainDefaultSize(); + if (sBuf == NULL) { + HDF_LOGE("Failed to obtain sBuf"); + return HDF_FAILURE; + } + + if (!HdfSbufWriteBuffer(sBuf, data, size)) { + HDF_LOGE("Failed to write sbuf"); + HdfSBufRecycle(sBuf); + return HDF_FAILURE; + } + + service = (struct HdfIoService *)handle->object; + ret = service->dispatcher->Dispatch(&service->object, UART_WRITE, sBuf, NULL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Failed to send service call"); + } + HdfSBufRecycle(sBuf); + return ret; +} + +void UartClose(struct DevHandle *handle) +{ + struct HdfIoService *service = NULL; + + if (handle == NULL || handle->object == NULL) { + HDF_LOGE("handle or handle->object is NULL"); + return; + } + service = (struct HdfIoService *)handle->object; + HdfIoServiceRecycle(service); + OsalMemFree(handle); +} diff --git a/sample/platform/uart/dispatch/uart_if.h b/sample/platform/uart/dispatch/uart_if.h new file mode 100755 index 000000000..61ca0ad3a --- /dev/null +++ b/sample/platform/uart/dispatch/uart_if.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef UART_IF_H +#define UART_IF_H + +#include + +#define UART_DEV_SERVICE_NAME_PREFIX "HDF_PLATFORM_UART_%d" +#define MAX_DEV_NAME_SIZE 32 + +enum { + UART_WRITE = 1 +}; + +struct DevHandle { + void *object; +}; + +struct DevHandle *UartOpen(uint32_t port); +int32_t UartWrite(struct DevHandle *handle, uint8_t *data, uint32_t size); +void UartClose(struct DevHandle *handle); + +#endif // UART_IF_H \ No newline at end of file diff --git a/sample/platform/uart/include/buf_fifo.h b/sample/platform/uart/include/buf_fifo.h new file mode 100755 index 000000000..ba9dab7d7 --- /dev/null +++ b/sample/platform/uart/include/buf_fifo.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef BUF_FIFO_H +#define BUF_FIFO_H + +#include +#include +#include + +struct BufferFifo { + volatile uint32_t readPosition; + volatile uint32_t writePosition; + uint16_t bufSizeMask; + uint8_t *buffer; +}; + +static inline uint16_t BufferFifoGetDataSize(struct BufferFifo *fifo) +{ + return (fifo->writePosition - fifo->readPosition); +} + +static inline bool IsPowerOfTwo(int num) +{ + return (num > 0) && (num & (num - 1)) == 0; +} + +bool BufferFifoInit(struct BufferFifo *fifo, uint8_t *buf, uint16_t bufSize); + +#endif // BUF_FIFO_H + diff --git a/sample/platform/uart/include/uart_dev_sample.h b/sample/platform/uart/include/uart_dev_sample.h new file mode 100755 index 000000000..87150de3a --- /dev/null +++ b/sample/platform/uart/include/uart_dev_sample.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef UART_DEV_SAMPLE_H +#define UART_DEV_SAMPLE_H + +#include "sys/ioctl.h" +#include "uart_core.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#define UART_IOC_MAGIC 'u' + +/* baudrate config */ +#define UART_CFG_BAUDRATE _IO(UART_IOC_MAGIC, 1) + +void AddUartDevice(struct UartHost *host); +void RemoveUartDevice(struct UartHost *host); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif /* UART_DEV_SAMPLE_H */ diff --git a/sample/platform/uart/include/uart_dispatch_sample.h b/sample/platform/uart/include/uart_dispatch_sample.h new file mode 100755 index 000000000..42ca3c5bc --- /dev/null +++ b/sample/platform/uart/include/uart_dispatch_sample.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef UART_DISPATCH_SAMPLE_H +#define UART_DISPATCH_SAMPLE_H + +#include "uart_pl011_sample.h" + +enum { + UART_WRITE = 1 +}; + +int32_t SampleDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply); + +#endif // UART_DISPATCH_SAMPLE_H diff --git a/sample/platform/uart/include/uart_pl011_sample.h b/sample/platform/uart/include/uart_pl011_sample.h new file mode 100755 index 000000000..a11448f6e --- /dev/null +++ b/sample/platform/uart/include/uart_pl011_sample.h @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef UART_PL011_SAMPLE_H +#define UART_PL011_SAMPLE_H + +#include +#include +#include "hdf_device_desc.h" +#include "buf_fifo.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct UartRegisterMap { + volatile uint32_t dr; /* Offset: 0x000 TYPE: (RW) Data register */ + union { + volatile uint32_t rsr; /* Offset: 0x004 TYPE: (RO) Receive status register */ + volatile uint32_t ecr; /* Offset: 0x004 TYPE: (WO) Error clear register */ + }; + volatile uint32_t reserved0[4]; /* Offset: 0x008-0x014 Reserved */ + volatile uint32_t fr; /* Offset: 0x018 TYPE: (RO) Flag register */ + volatile uint32_t reserved1; /* Offset: 0x01C Reserved */ + volatile uint32_t ilpr; /* Offset: 0x020 TYPE: (RW) IrDA low-power counter register */ + volatile uint32_t ibrd; /* Offset: 0x024 TYPE: (RW) Integer baud rate register */ + volatile uint32_t fbrd; /* Offset: 0x028 TYPE: (RW) Fractional baud rate register */ + volatile uint32_t lcr; /* Offset: 0x02C TYPE: (RW) Line control register */ + volatile uint32_t cr; /* Offset: 0x030 TYPE: (RW) Control register */ + volatile uint32_t ifls; /* Offset: 0x034 TYPE: (RW) Interrupt FIFO level select register */ + volatile uint32_t imsc; /* Offset: 0x038 TYPE: (RW) Interrupt mask set/clear register */ + volatile uint32_t ris; /* Offset: 0x03C TYPE: (RO) Raw interrupt status register */ + volatile uint32_t mis; /* Offset: 0x040 TYPE: (RO) Masked interrupt status register */ + volatile uint32_t icr; /* Offset: 0x044 TYPE: (WO) Interrupt clear register */ + volatile uint32_t dmacr; /* Offset: 0x048 TYPE: (RW) DMA control register */ +}; + +struct UartResource { + uint32_t num; /* UART port num */ + uint32_t base; /* UART PL011 base address */ + uint32_t irqNum; /* UART PL011 IRQ num */ + uint32_t baudrate; /* Default baudrate */ + uint32_t wlen; /* Default word length */ + uint32_t parity; /* Default parity */ + uint32_t stopBit; /* Default stop bits */ + uint32_t uartClk; /* UART clock */ + unsigned long physBase; +}; + +enum UartDeviceState { + UART_DEVICE_UNINITIALIZED = 0x0u, + UART_DEVICE_INITIALIZED = 0x1u, +}; + +struct UartDevice { + struct IDeviceIoService ioService; + struct UartResource resource; + enum UartDeviceState state; /* UART State */ + uint32_t uartClk; /* UART clock */ + uint32_t baudrate; /* Baudrate */ + struct BufferFifo rxFifo; +}; + +/* Receive Status Register/Error Clear Register data */ +#define UART_PL011_RSR_FRAMING_ERROR_MASK (1 << 0x0u) /* Framing error bit mask */ +#define UART_PL011_RSR_PARITY_ERROR_MASK (1 << 0x1u) /* Parity error bit mask */ +#define UART_PL011_RSR_BREAK_ERROR_MASK (1 << 0x2u) /* Break error bit mask */ +#define UART_PL011_RSR_OVERRUN_ERROR_MASK (1 << 0x3u) /* Overrun error bit mask */ + +/* Receive Status Register Error Mask */ +#define UART_PL011_RSR_RX_ERROR_MASK ( \ + UART_PL011_RSR_FRAMING_ERROR_MASK \ + | UART_PL011_RSR_PARITY_ERROR_MASK \ + | UART_PL011_RSR_BREAK_ERROR_MASK \ + | UART_PL011_RSR_OVERRUN_ERROR_MASK) + +#define UART_PL011_FR_CTS_MASK (1 << 0x0u) /* Clear to send bit mask */ +#define UART_PL011_FR_DSR_MASK (1 << 0x1u) /* Data set ready bit mask */ +#define UART_PL011_FR_DCD_MASK (1 << 0x2u) /* Data carrier detect bit mask */ +#define UART_PL011_FR_BUSY_MASK (1 << 0x3u) /* UART busy bit mask */ +#define UART_PL011_FR_RX_FIFO_EMPTY_MASK (1 << 0x4u) /* Receive FIFO empty bit mask */ +#define UART_PL011_FR_TX_FIFO_FULL_MASK (1 << 0x5u) /* Transmit FIFO full bit mask */ +#define UART_PL011_FR_RX_FIFO_FULL_MASK (1 << 0x6u) /* Receive FIFO full bit mask */ +#define UART_PL011_FR_TX_FIFO_EMPTY_MASK (1 << 0x7u) /* Transmit FIFO empty. bit mask */ +#define UART_PL011_FR_RI_MASK (1 << 0x8u) /* Ring indicator bit mask */ + +/* PL011 Line Control Register Data bits */ +#define UART_PL011_LCR_H_BRK_MASK (1 << 0x0u) /* Send Break bit mask */ +#define UART_PL011_LCR_H_PEN_MASK (1 << 0x1u) /* Parity enable bit mask */ +#define UART_PL011_LCR_H_EPS_MASK (1 << 0x2u) /* Even parity select bit mask . */ +#define UART_PL011_LCR_H_FEN_MASK (1 << 0x4u) /* Enable FIFOs bit mask */ +#define UART_PL011_LCR_H_SPS_MASK (1 << 0x7u) /* Stick parity select bit mask */ + +#define UART_PL011_LCR_H_WLEN_BIT_OFFSET 0x5u /* Word length bit offset */ +#define UART_PL011_LCR_H_WLEN_MASK ( \ + 0x3u << UART_PL011_LCR_H_WLEN_BIT_OFFSET) + +#define UART_PL011_WLEN_5BITS (0x0u << UART_PL011_LCR_H_WLEN_BIT_OFFSET) +#define UART_PL011_WLEN_6BITS (0x1u << UART_PL011_LCR_H_WLEN_BIT_OFFSET) +#define UART_PL011_WLEN_7BITS (0x2u << UART_PL011_LCR_H_WLEN_BIT_OFFSET) +#define UART_PL011_WLEN_8BITS (0x3u << UART_PL011_LCR_H_WLEN_BIT_OFFSET) + +#define UART_PL011_NONE_PARITY_CHECKED 0 + +#define UART_PL011_LCR_H_STP2_BIT_OFFSET 0x3u /* Two stop bits select */ + +#define UART_PL011_STOPBIT_1 (0x0u << UART_PL011_LCR_H_STP2_BIT_OFFSET) +#define UART_PL011_STOPBIT_2 (0x1u << UART_PL011_LCR_H_STP2_BIT_OFFSET) + +#define UART_PL011_LCR_H_PARITY_MASK ( \ + UART_PL011_LCR_H_PEN_MASK \ + | UART_PL011_LCR_H_EPS_MASK \ + | UART_PL011_LCR_H_SPS_MASK) + +#define UART_PL011_LCR_H_STOPBIT_MASK \ + (0x1u << UART_PL011_LCR_H_STP2_BIT_OFFSET) + +#define UART_PL011_DATA_FORMAT_MASK ( \ + UART_PL011_LCR_H_PARITY_MASK \ + | UART_PL011_LCR_H_STOPBIT_MASK \ + | UART_PL011_LCR_H_WLEN_MASK) + +/* Control Register */ +#define UART_PL011_CR_UARTEN_MASK (0x1u << 0x0u) /* Uart enable bit mask */ +#define UART_PL011_CR_SIREN_MASK (0x1u << 0x1u) /* Sir enable bit mask */ +#define UART_PL011_CR_SIRLP_MASK (0x1u << 0x2u) /* SIR low-power IrDA mode bit mask */ +#define UART_PL011_CR_LBE_MASK (0x1u << 0x7u) /* Loopback enable bit mask */ +#define UART_PL011_CR_TXE_MASK (0x1u << 0x8u) /* Transmit enable bit mask */ +#define UART_PL011_CR_RXE_MASK (0x1u << 0x9u) /* Receive enable bit mask */ +#define UART_PL011_CR_DTR_MASK (0x1u << 0xAu) /* Data transmit ready.bit mask */ +#define UART_PL011_CR_RTS_MASK (0x1u << 0xBu) /* Request to send bit mask */ +#define UART_PL011_CR_OUT1_MASK (0x1u << 0xCu) /* Out1 bit field mask */ +#define UART_PL011_CR_OUT2_MASK (0x1u << 0xDu) /* Out2 bit field mask */ +#define UART_PL011_CR_RTSE_MASK (0x1u << 0xEu) /* RTS hardware flow control enable bit mask */ +#define UART_PL011_CR_CTSE_MASK (0x1u << 0xFu) /* CTS hardware flow control enable bit mask */ + + +/* Interrupt FIFO Level Select Register Transmit bit offset */ +#define UART_PL011_IFLS_TX_BIT_OFFSET 0x0u +/* Interrupt FIFO Level Select Register Receive bit offset */ +#define UART_PL011_IFLS_RX_BIT_OFFSET 0x3u + +#define UART_PL011_RX_FIFO_LVL_1_8 (0x0u << UART_PL011_IFLS_RX_BIT_OFFSET) +#define UART_PL011_RX_FIFO_LVL_1_4 (0x1u << UART_PL011_IFLS_RX_BIT_OFFSET) +#define UART_PL011_RX_FIFO_LVL_1_2 (0x2u << UART_PL011_IFLS_RX_BIT_OFFSET) +#define UART_PL011_RX_FIFO_LVL_3_4 (0x3u << UART_PL011_IFLS_RX_BIT_OFFSET) +#define UART_PL011_RX_FIFO_LVL_7_8 (0x4u << UART_PL011_IFLS_RX_BIT_OFFSET) + +#define UART_PL011_TX_FIFO_LVL_1_8 (0x0u << UART_PL011_IFLS_TX_BIT_OFFSET) +#define UART_PL011_TX_FIFO_LVL_1_4 (0x1u << UART_PL011_IFLS_TX_BIT_OFFSET) +#define UART_PL011_TX_FIFO_LVL_1_2 (0x2u << UART_PL011_IFLS_TX_BIT_OFFSET) +#define UART_PL011_TX_FIFO_LVL_3_4 (0x3u << UART_PL011_IFLS_TX_BIT_OFFSET) +#define UART_PL011_TX_FIFO_LVL_7_8 (0x4u << UART_PL011_IFLS_TX_BIT_OFFSET) + +/* Default register values of UART PL011 */ +#define UART_PL011_DEFAULT_DATA_REG_VALUE (0x0u) +#define UART_PL011_DEFAULT_ECR_VALUE (0xFFu) +#define UART_PL011_DEFAULT_ILPR_VALUE (0x0u) +#define UART_PL011_DEFAULT_IBRD_REG_VALUE (0x0u) +#define UART_PL011_DEFAULT_FBRD_REG_VALUE (0x0u) +/* Clear UARTLCR */ +#define UART_PL011_DEFAULT_LCR_H_VALUE (0x0u) +#define UART_PL011_DEFAULT_CTRL_REG_VALUE (0x0300u) + +#define UART_PL011_DEFAULT_IFLS_REG_VALUE ( \ + UART_PL011_RX_FIFO_LVL_1_2 \ + | UART_PL011_TX_FIFO_LVL_7_8) + +/* Clear interrupt mask */ +#define UART_PL011_DEFAULT_IMSC_REG_VALUE (0x0u) +/* Clear interrupt */ +#define UART_PL011_DEFAULT_ICR_VALUE (0x7FFu) +#define UART_PL011_DEFAULT_DMACR_VALUE (0x0u) + +#define FREQ_IRLPBAUD16_MIN (1420000u) /* 1.42 MHz */ +#define FREQ_IRLPBAUD16_MAX (2120000u) /* 2.12 MHz */ +#define SAMPLING_FACTOR (16u) +#define UART_PL011_FBRD_WIDTH (6u) + +/** + * \brief ARM UART PL011 error enumeration types + */ +typedef enum UartPl011Error { + UART_PL011_ERR_NONE = (0x0u), + UART_PL011_ERR_RX_FRAME = UART_PL011_RSR_FRAMING_ERROR_MASK, + UART_PL011_ERR_RX_PARITY = UART_PL011_RSR_PARITY_ERROR_MASK, + UART_PL011_ERR_RX_BREAK = UART_PL011_RSR_BREAK_ERROR_MASK, + UART_PL011_ERR_RX_OVERFLOW = UART_PL011_RSR_OVERRUN_ERROR_MASK, + UART_PL011_ERR_INVALID_ARG = (UART_PL011_RSR_RX_ERROR_MASK + 1), + UART_PL011_ERR_NOT_READY, + UART_PL011_ERR_INVALID_BAUD, + UART_PL011_ERR_NOT_INIT, +} UartPl011Error; + +static inline void UartPl011Enable(struct UartRegisterMap *regMap) +{ + regMap->cr |= UART_PL011_CR_UARTEN_MASK; +} + +static inline void UartPl011Disable(struct UartRegisterMap *regMap) +{ + regMap->cr &= ~UART_PL011_CR_UARTEN_MASK; +} + +static inline bool UartPl011IsEnabled(struct UartRegisterMap *regMap) +{ + return (bool)(regMap->cr & UART_PL011_CR_UARTEN_MASK); +} + +static inline bool UartPl011IsBusy(struct UartRegisterMap *regMap) +{ + return (bool)(regMap->fr & UART_PL011_FR_BUSY_MASK); +} + +void UartPl011SetLcrBits(struct UartRegisterMap *regMap, uint32_t bits); + +static inline void UartPl011Write(struct UartRegisterMap *regMap, uint8_t byte) +{ + while (UartPl011IsBusy(regMap)); + regMap->dr = byte; +} + +UartPl011Error UartPl011SetBaudrate(struct UartRegisterMap *regMap, uint32_t clk, uint32_t baudrate); + +void UartPl011SetDataFormat(struct UartRegisterMap *regMap, uint32_t wordLen, uint32_t parity, uint32_t stopBits); + +void UartPl011ResetRegisters(struct UartRegisterMap *regMap); + +static inline void UartPl011EnableFifo(struct UartRegisterMap *regMap) +{ + UartPl011SetLcrBits(regMap, UART_PL011_LCR_H_FEN_MASK); +} + +#ifdef __cplusplus +} +#endif +#endif /* UART_PL011_SAMPLE_H */ + diff --git a/sample/platform/uart/src/BUILD.gn b/sample/platform/uart/src/BUILD.gn new file mode 100755 index 000000000..a979792d4 --- /dev/null +++ b/sample/platform/uart/src/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +import("//drivers/adapter/khdf/liteos/hdf.gni") + +module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_UART_SAMPLE) +module_name = "hdf_uart_sample" +hdf_driver(module_name) { + FRAMEWORK_UART_ROOT = "//drivers/framework/sample/platform/uart/src" + sources = [ + "$FRAMEWORK_UART_ROOT/buf_fifo.c", + "$FRAMEWORK_UART_ROOT/uart_dev_sample.c", + "$FRAMEWORK_UART_ROOT/uart_dispatch_sample.c", + "$FRAMEWORK_UART_ROOT/uart_pl011_sample.c", + "$FRAMEWORK_UART_ROOT/uart_sample.c", + ] + + include_dirs = [ "//drivers/framework/sample/platform/uart/include/" ] +} diff --git a/sample/platform/uart/src/buf_fifo.c b/sample/platform/uart/src/buf_fifo.c new file mode 100755 index 000000000..19da2dff6 --- /dev/null +++ b/sample/platform/uart/src/buf_fifo.c @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "buf_fifo.h" + +bool BufferFifoInit(struct BufferFifo *fifo, uint8_t *fifoBuffer, uint16_t fifoSize) +{ + if (fifoBuffer == NULL) { + return false; + } + if (!IsPowerOfTwo(fifoSize)) { + return false; + } + fifo->buffer = fifoBuffer; + fifo->bufSizeMask = fifoSize - 1; + fifo->readPosition = 0; + fifo->writePosition = 0; + return true; +} \ No newline at end of file diff --git a/sample/platform/uart/src/uart_dev_sample.c b/sample/platform/uart/src/uart_dev_sample.c new file mode 100755 index 000000000..b9b85a43b --- /dev/null +++ b/sample/platform/uart/src/uart_dev_sample.c @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "uart_dev_sample.h" +#include "fs/fs.h" +#include "securec.h" +#include "user_copy.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "uart_pl011_sample.h" + +#define HDF_LOG_TAG uart_dev_sample +#define HDF_UART_FS_MODE 0660 + +static int32_t UartSampleDevOpen(struct file *filep) +{ + struct UartHost *host = NULL; + + if (filep == NULL || filep->f_vnode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + struct drv_data *drv = (struct drv_data *)filep->f_vnode->data; + host = (struct UartHost *)drv->priv; + if (host == NULL) { + HDF_LOGE("%s: host is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + HDF_LOGI("%s: open uart%d success", __func__, host->num); + return HDF_SUCCESS; +} +static int32_t UartSampleRelease(struct file *filep) +{ + struct UartHost *host = NULL; + + if (filep == NULL || filep->f_vnode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + struct drv_data *drv = (struct drv_data *)filep->f_vnode->data; + host = (struct UartHost *)drv->priv; + if (host == NULL) { + HDF_LOGE("%s: host is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + HDF_LOGI("%s: close uart%d success", __func__, host->num); + return HDF_SUCCESS; +} + +static ssize_t UartSampleRead(struct file *filep, char *buf, size_t count) +{ + int32_t ret; + uint8_t *tmpBuf = NULL; + struct UartHost *host = NULL; + + if (filep == NULL || filep->f_vnode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + struct drv_data *drv = (struct drv_data *)filep->f_vnode->data; + host = (struct UartHost *)drv->priv; + + if (LOS_IsUserAddressRange((vaddr_t)(uintptr_t)buf, count)) { + tmpBuf = (uint8_t *)OsalMemCalloc(count); + if (tmpBuf == NULL) { + HDF_LOGE("%s: OsalMemCalloc error", __func__); + return HDF_ERR_MALLOC_FAIL; + } + ret = UartHostRead(host, tmpBuf, count); + if (ret == HDF_SUCCESS) { + ret = LOS_ArchCopyToUser(buf, tmpBuf, count); + } + OsalMemFree(tmpBuf); + return ret; + } else { + return UartHostRead(host, (uint8_t *)buf, count); + } +} + +static ssize_t UartSampleWrite(struct file *filep, const char *buf, size_t count) +{ + int32_t ret; + uint8_t *tmpBuf = NULL; + struct UartHost *host = NULL; + + if (filep == NULL || filep->f_vnode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + struct drv_data *drv = (struct drv_data *)filep->f_vnode->data; + host = (struct UartHost *)drv->priv; + + if (LOS_IsUserAddressRange((vaddr_t)(uintptr_t)buf, count)) { + tmpBuf = (uint8_t *)OsalMemCalloc(count); + if (tmpBuf == NULL) { + HDF_LOGE("%s: OsalMemCalloc error", __func__); + return HDF_ERR_MALLOC_FAIL; + } + ret = LOS_ArchCopyFromUser(tmpBuf, buf, count); + if (ret != LOS_OK) { + OsalMemFree(tmpBuf); + return ret; + } + ret = UartHostWrite(host, tmpBuf, count); + OsalMemFree(tmpBuf); + return ret; + } else { + return UartHostWrite(host, (uint8_t *)buf, count); + } +} + +static int32_t UartSampleDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) +{ + int32_t ret = HDF_FAILURE; + struct UartHost *host = NULL; + if (filep == NULL || filep->f_vnode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + struct drv_data *drv = (struct drv_data *)filep->f_vnode->data; + host = (struct UartHost *)drv->priv; + if (host->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + switch (cmd) { + case UART_CFG_BAUDRATE: + ret = UartHostSetBaud(host, arg); + break; + default: + HDF_LOGE("%s cmd %d not support", __func__, cmd); + ret = HDF_ERR_NOT_SUPPORT; + break; + } + return ret; +} + +const struct file_operations_vfs g_uartSampleDevFops = { + .open = UartSampleDevOpen, + .close = UartSampleRelease, + .read = UartSampleRead, + .write = UartSampleWrite, + .ioctl = UartSampleDevIoctl, +}; + +#define MAX_DEV_NAME_SIZE 32 +static void AddRemoveUartDev(struct UartHost *host, bool add) +{ + int32_t ret; + char *devName = NULL; + + if (host == NULL || host->priv == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return; + } + devName = (char *)OsalMemCalloc(sizeof(char) * (MAX_DEV_NAME_SIZE + 1)); + if (devName == NULL) { + HDF_LOGE("%s: OsalMemCalloc error", __func__); + return; + } + ret = snprintf_s(devName, MAX_DEV_NAME_SIZE + 1, MAX_DEV_NAME_SIZE, "/dev/uartdev-%d", host->num); + if (ret < 0) { + HDF_LOGE("%s: snprintf_s failed", __func__); + OsalMemFree(devName); + return; + } + if (add) { + if (register_driver(devName, &g_uartSampleDevFops, HDF_UART_FS_MODE, host)) { + HDF_LOGE("%s: gen /dev/uartdev-%d fail!", __func__, host->num); + OsalMemFree(devName); + return; + } + } else { + if (unregister_driver(devName)) { + HDF_LOGE("%s: remove /dev/uartdev-%d fail!", __func__, host->num); + OsalMemFree(devName); + return; + } + } + OsalMemFree(devName); +} + +void AddUartDevice(struct UartHost *host) +{ + AddRemoveUartDev(host, true); +} + +void RemoveUartDevice(struct UartHost *host) +{ + AddRemoveUartDev(host, false); +} diff --git a/sample/platform/uart/src/uart_dispatch_sample.c b/sample/platform/uart/src/uart_dispatch_sample.c new file mode 100755 index 000000000..e69ef5d80 --- /dev/null +++ b/sample/platform/uart/src/uart_dispatch_sample.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "uart_core.h" +#include "uart_dispatch_sample.h" +#include "hdf_log.h" +#include "hdf_sbuf.h" +#include "osal_mem.h" +#include "uart_pl011_sample.h" + +#define HDF_LOG_TAG uart_dispatch_sample + +static int32_t SampleDispatchWrite(struct UartDevice *device, struct HdfSBuf *txBuf) +{ + uint32_t idx; + uint32_t dataSize = 0; + const uint8_t *data = NULL; + struct UartRegisterMap *regMap = (struct UartRegisterMap *)device->resource.physBase; + + if (regMap == NULL) { + HDF_LOGE("%s: regMap is NULL", __func__); + return HDF_FAILURE; + } + + if (!HdfSbufReadBuffer(txBuf, (const void **)&data, &dataSize)) { + HDF_LOGE("%s: Failed to read sbuf", __func__); + return HDF_FAILURE; + } + regMap = (struct UartRegisterMap *)device->resource.physBase; + for (idx = 0; idx < dataSize; idx++) { + UartPl011Write(regMap, data[idx]); + } + return HDF_SUCCESS; +} + +int32_t SampleDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t result = HDF_FAILURE; + if (client == NULL || client->device == NULL) { + HDF_LOGE("%s: client or client->device is NULL", __func__); + return result; + } + struct UartHost *uartHost = (struct UartHost *)client->device->service; + if (uartHost == NULL) { + HDF_LOGE("%s: uartHost is NULL", __func__); + return result; + } + struct UartDevice *uartDevice = (struct UartDevice *)uartHost->priv; + if (uartDevice == NULL) { + HDF_LOGE("%s: uartDevice is NULL", __func__); + return result; + } + switch (cmdId) { + case UART_WRITE: { + result = SampleDispatchWrite(uartDevice, data); + break; + } + default: + break; + } + return result; +} diff --git a/sample/platform/uart/src/uart_pl011_sample.c b/sample/platform/uart/src/uart_pl011_sample.c new file mode 100755 index 000000000..12f2c6cf3 --- /dev/null +++ b/sample/platform/uart/src/uart_pl011_sample.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "uart_pl011_sample.h" + +void UartPl011SetLcrBits(struct UartRegisterMap *regMap, uint32_t bits) +{ + bool uartEnabled = UartPl011IsEnabled(regMap); + /* UART must be disabled before UARTLCR_H are reprogrammed */ + UartPl011Disable(regMap); + regMap->lcr |= (bits); + /* Restore uart enable state */ + if (uartEnabled) { + UartPl011Enable(regMap); + } +} + +void UartPl011UpdateLcr(struct UartRegisterMap *regMap) +{ + bool uartEnabled = UartPl011IsEnabled(regMap); + /* UART must be disabled before UARTLCR_H are reprogrammed */ + UartPl011Disable(regMap); + regMap->lcr = regMap->lcr; + /* restore uart enable state */ + if (uartEnabled) { + UartPl011Enable(regMap); + } +} + +UartPl011Error UartPl011SetBaudrate(struct UartRegisterMap *regMap, uint32_t clk, uint32_t baudrate) +{ + if (baudrate == 0) { + return UART_PL011_ERR_INVALID_ARG; + } + + uint32_t value = SAMPLING_FACTOR * baudrate; + uint32_t divider = clk / value; + uint32_t remainder = clk % value; + uint32_t fraction; + value = (SAMPLING_FACTOR * remainder) / baudrate; + fraction = (value >> 1) + (value & 1); + + regMap->ibrd = divider; + regMap->fbrd = fraction; + /* to internally update the contents of UARTIBRD or + * UARTFBRD, a UARTLCR_H write must always be performed at the end. + */ + UartPl011UpdateLcr(regMap); + return UART_PL011_ERR_NONE; +} + +void UartPl011SetDataFormat( + struct UartRegisterMap *regMap, uint32_t wordLen, uint32_t parity, uint32_t stopBits) +{ + bool uartEnabled = UartPl011IsEnabled(regMap); + uint32_t lcr = regMap->lcr & (~UART_PL011_DATA_FORMAT_MASK); + lcr |= wordLen & UART_PL011_LCR_H_WLEN_MASK; + lcr |= parity & UART_PL011_LCR_H_PARITY_MASK; + lcr |= stopBits & UART_PL011_LCR_H_STOPBIT_MASK; + /* UART must be disabled before UARTLCR_H are reprogrammed */ + UartPl011Disable(regMap); + regMap->lcr = lcr; + if (uartEnabled) { + UartPl011Enable(regMap); + } +} + +void UartPl011ResetRegisters(struct UartRegisterMap *regMap) +{ + regMap->cr = UART_PL011_DEFAULT_CTRL_REG_VALUE; + regMap->dr = UART_PL011_DEFAULT_DATA_REG_VALUE; + /* Clear all the errors */ + regMap->ecr = UART_PL011_DEFAULT_ECR_VALUE; + regMap->ilpr = UART_PL011_DEFAULT_ILPR_VALUE; + regMap->ibrd = UART_PL011_DEFAULT_IBRD_REG_VALUE; + regMap->fbrd = UART_PL011_DEFAULT_FBRD_REG_VALUE; + regMap->lcr = UART_PL011_DEFAULT_LCR_H_VALUE; + regMap->ifls = UART_PL011_DEFAULT_IFLS_REG_VALUE; + /* Clear all interrupt mask */ + regMap->imsc = UART_PL011_DEFAULT_IMSC_REG_VALUE; + /* Clear all interrupts */ + regMap->icr = UART_PL011_DEFAULT_ICR_VALUE; + regMap->dmacr = UART_PL011_DEFAULT_DMACR_VALUE; +} + diff --git a/sample/platform/uart/src/uart_sample.c b/sample/platform/uart/src/uart_sample.c new file mode 100755 index 000000000..89a16b28c --- /dev/null +++ b/sample/platform/uart/src/uart_sample.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "device_resource_if.h" +#include "buf_fifo.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "hisoc/uart.h" +#include "osal_io.h" +#include "osal_mem.h" +#include "uart_core.h" +#include "uart_dev_sample.h" +#include "uart_dispatch_sample.h" +#include "uart_pl011_sample.h" + +#define HDF_LOG_TAG uart_sample +#define UART_RX_FIFO_SIZE 128 + +static uint8_t g_fifoBuffer[UART_RX_FIFO_SIZE] = {0}; + +/* HdfDriverEntry method definitions */ +static int32_t SampleUartDriverBind(struct HdfDeviceObject *device); +static int32_t SampleUartDriverInit(struct HdfDeviceObject *device); +static void SampleUartDriverRelease(struct HdfDeviceObject *device); + +/* HdfDriverEntry definitions */ +struct HdfDriverEntry g_sampleUartDriverEntry = { + .moduleVersion = 1, + .moduleName = "UART_SAMPLE", + .Bind = SampleUartDriverBind, + .Init = SampleUartDriverInit, + .Release = SampleUartDriverRelease, +}; + +// Initialize HdfDriverEntry +HDF_INIT(g_sampleUartDriverEntry); + +/* UartHostMethod method definitions */ +static int32_t SampleUartHostInit(struct UartHost *host); +static int32_t SampleUartHostDeinit(struct UartHost *host); +static int32_t SampleUartHostWrite(struct UartHost *host, uint8_t *data, uint32_t size); +static int32_t SampleUartHostSetBaud(struct UartHost *host, uint32_t baudRate); +static int32_t SampleUartHostGetBaud(struct UartHost *host, uint32_t *baudRate); + +/* UartHostMethod definitions */ +struct UartHostMethod g_sampleUartHostMethod = { + .Init = SampleUartHostInit, + .Deinit = SampleUartHostDeinit, + .Read = NULL, + .Write = SampleUartHostWrite, + .SetBaud = SampleUartHostSetBaud, + .GetBaud = SampleUartHostGetBaud, + .SetAttribute = NULL, + .GetAttribute = NULL, + .SetTransMode = NULL, +}; + +/* UartHostMethod implementations */ +static int32_t SampleUartHostInit(struct UartHost *host) +{ + HDF_LOGD("%s: Enter", __func__); + if (host == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} + +static int32_t SampleUartHostDeinit(struct UartHost *host) +{ + HDF_LOGD("%s: Enter", __func__); + if (host == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + return HDF_SUCCESS; +} + +static int32_t SampleUartHostWrite(struct UartHost *host, uint8_t *data, uint32_t size) +{ + uint32_t idx; + struct UartRegisterMap *regMap = NULL; + struct UartDevice *device = NULL; + HDF_LOGD("%s: Enter", __func__); + + if (host == NULL || data == NULL || size == 0) { + HDF_LOGW("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + device = (struct UartDevice *)host->priv; + if (device == NULL) { + HDF_LOGW("%s: device is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + regMap = (struct UartRegisterMap *)device->resource.physBase; + for (idx = 0; idx < size; idx++) { + UartPl011Write(regMap, data[idx]); + } + return HDF_SUCCESS; +} + +static int32_t SampleUartHostSetBaud(struct UartHost *host, uint32_t baudRate) +{ + struct UartDevice *device = NULL; + struct UartRegisterMap *regMap = NULL; + UartPl011Error err; + HDF_LOGD("%s: Enter", __func__); + + if (host == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + device = (struct UartDevice *)host->priv; + if (device == NULL) { + HDF_LOGW("%s: device is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + regMap = (struct UartRegisterMap *)device->resource.physBase; + if (device->state != UART_DEVICE_INITIALIZED) { + return UART_PL011_ERR_NOT_INIT; + } + if (baudRate == 0) { + return UART_PL011_ERR_INVALID_BAUD; + } + err = UartPl011SetBaudrate(regMap, device->uartClk, baudRate); + if (err == UART_PL011_ERR_NONE) { + device->baudrate = baudRate; + } + return err; +} + +static int32_t SampleUartHostGetBaud(struct UartHost *host, uint32_t *baudRate) +{ + struct UartDevice *device = NULL; + HDF_LOGD("%s: Enter", __func__); + + if (host == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return HDF_ERR_INVALID_PARAM; + } + device = (struct UartDevice *)host->priv; + if (device == NULL) { + HDF_LOGW("%s: device is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + *baudRate = device->baudrate; + return HDF_SUCCESS; +} + +static int InitUartDevice(struct UartDevice *device) +{ + UartPl011Error err; + struct UartResource *resource = &device->resource; + struct UartRegisterMap *regMap = (struct UartRegisterMap *)resource->physBase; + if ((resource->uartClk == 0) || (resource->baudrate == 0)) { + return HDF_ERR_INVALID_PARAM; + } + /* Updating the system clock */ + device->uartClk = resource->uartClk; + uart_clk_cfg(0, true); + /* clear and reset registers. */ + UartPl011ResetRegisters(regMap); + /* set baud rate as device config */ + err = UartPl011SetBaudrate(regMap, resource->uartClk, resource->baudrate); + if (err != UART_PL011_ERR_NONE) { + return HDF_FAILURE; + } + /* set the data format as device config */ + UartPl011SetDataFormat(regMap, resource->wlen, resource->parity, resource->stopBit); + /* Enabling the FIFOs */ + UartPl011EnableFifo(regMap); + UartPl011Enable(regMap); + BufferFifoInit(&device->rxFifo, g_fifoBuffer, UART_RX_FIFO_SIZE); + device->state = UART_DEVICE_INITIALIZED; + return HDF_SUCCESS; +} + +static uint32_t GetUartDeviceResource( + struct UartDevice *device, const struct DeviceResourceNode *resourceNode) +{ + struct UartResource *resource = &device->resource; + struct DeviceResourceIface *dri = NULL; + dri = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (dri == NULL || dri->GetUint32 == NULL) { + HDF_LOGE("DeviceResourceIface is invalid"); + return HDF_FAILURE; + } + + if (dri->GetUint32(resourceNode, "num", &resource->num, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read num fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "base", &resource->base, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read base fail"); + return HDF_FAILURE; + } + resource->physBase = (unsigned long)OsalIoRemap(resource->base, 0x48); + if (resource->physBase == 0) { + HDF_LOGE("uart config fail to remap physBase"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "irqNum", &resource->irqNum, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read irqNum fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "baudrate", &resource->baudrate, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read baudrate fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "wlen", &resource->wlen, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read wlen fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "parity", &resource->parity, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read parity fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "stopBit", &resource->stopBit, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read stopBit fail"); + return HDF_FAILURE; + } + if (dri->GetUint32(resourceNode, "uartClk", &resource->uartClk, 0) != HDF_SUCCESS) { + HDF_LOGE("uart config read uartClk fail"); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t AttachUartDevice(struct UartHost *host, struct HdfDeviceObject *device) +{ + int32_t ret; + struct UartDevice *uartDevice = NULL; + if (device->property == NULL) { + HDF_LOGW("%s: property is NULL", __func__); + return HDF_FAILURE; + } + uartDevice = (struct UartDevice *)OsalMemCalloc(sizeof(struct UartDevice)); + if (uartDevice == NULL) { + HDF_LOGE("%s: OsalMemCalloc uartDevice error", __func__); + return HDF_ERR_MALLOC_FAIL; + } + ret = GetUartDeviceResource(uartDevice, device->property); + if (ret != HDF_SUCCESS) { + (void)OsalMemFree(uartDevice); + return HDF_FAILURE; + } + host->num = uartDevice->resource.num; + host->priv = uartDevice; + AddUartDevice(host); + return InitUartDevice(uartDevice); +} + +static void DeinitUartDevice(struct UartDevice *device) +{ + struct UartRegisterMap *regMap = (struct UartRegisterMap *)device->resource.physBase; + /* wait for uart enter idle. */ + while (UartPl011IsBusy(regMap)); + UartPl011ResetRegisters(regMap); + uart_clk_cfg(0, false); + OsalIoUnmap((void *)device->resource.physBase); + device->state = UART_DEVICE_UNINITIALIZED; +} + +static void DetachUartDevice(struct UartHost *host) +{ + struct UartDevice *uartDevice = NULL; + + if (host->priv == NULL) { + HDF_LOGW("%s: invalid parameter", __func__); + return; + } + uartDevice = host->priv; + DeinitUartDevice(uartDevice); + (void)OsalMemFree(uartDevice); + host->priv = NULL; +} + +/* HdfDriverEntry implementations */ +static int32_t SampleUartDriverBind(struct HdfDeviceObject *device) +{ + struct UartHost *uartHost = NULL; + HDF_LOGD("%s: Enter", __func__); + + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + uartHost = UartHostCreate(device); + if (uartHost == NULL) { + HDF_LOGE("%s: UartHostCreate failed", __func__); + return HDF_FAILURE; + } + uartHost->service.Dispatch = SampleDispatch; + return HDF_SUCCESS; +} + +static int32_t SampleUartDriverInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct UartHost *host = NULL; + HDF_LOGD("%s: Enter", __func__); + + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + host = UartHostFromDevice(device); + if (host == NULL) { + HDF_LOGE("%s: host is NULL", __func__); + return HDF_FAILURE; + } + ret = AttachUartDevice(host, device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: attach error", __func__); + return HDF_FAILURE; + } + host->method = &g_sampleUartHostMethod; + return ret; +} + +static void SampleUartDriverRelease(struct HdfDeviceObject *device) +{ + struct UartHost *host = NULL; + HDF_LOGD("%s: Enter", __func__); + + if (device == NULL) { + HDF_LOGE("%s: device is NULL", __func__); + return; + } + host = UartHostFromDevice(device); + if (host == NULL) { + HDF_LOGE("%s: host is NULL", __func__); + return; + } + if (host->priv != NULL) { + DetachUartDevice(host); + } + UartHostDestroy(host); +} -- Gitee From 4cc268b950eed65cf630a61ab30f96401270a5e6 Mon Sep 17 00:00:00 2001 From: yue Date: Mon, 15 Nov 2021 20:26:09 +0800 Subject: [PATCH 171/272] bugfix hdi-gen code Signed-off-by: yue --- .../codegen/cpp_service_stub_code_emitter.cpp | 2 +- tools/hdi-gen/util/string.cpp | 33 ++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index 23e5c464f..6a2c2652c 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -313,7 +313,7 @@ void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& met sb.Append(prefix).Append("if (ec != HDF_SUCCESS) {\n"); sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); + "HDF_LOGE(\"%%{public}s failed, error code is %%d\", __func__, ec);\n", method->GetName().string()); sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/util/string.cpp b/tools/hdi-gen/util/string.cpp index 9be249aeb..66e26dc37 100755 --- a/tools/hdi-gen/util/string.cpp +++ b/tools/hdi-gen/util/string.cpp @@ -328,28 +328,31 @@ int String::LastIndexOfInternal(const char* string, int fromIndex) const int stringLastIndex = stringLen - 1; char stringLastChar = string[stringLastIndex]; - int min = stringLen - 1; - int i = min + fromIndex; + int leftIndex = stringLen - 1; + int index = leftIndex + fromIndex; -startSearchLastChar: while (true) { - while (i >= min && string_[i] != stringLastChar) { - i--; + while (index >= leftIndex && string_[index] != stringLastChar) { + index--; } - if (i < min) { + if (index < leftIndex) { return -1; } - int j = i - 1; - int start = j - (stringLen - 1); - int k = stringLastIndex - 1; - - while (j > start) { - if (string_[j--] != string[k--]) { - i--; - goto startSearchLastChar; + + int compareIndex = index - 1; + int start = compareIndex - (stringLen - 1); + int strIndex = stringLastIndex - 1; + + while (compareIndex > start) { + if (string_[compareIndex--] != string[strIndex--]) { + index--; + break; } } - return start + 1; + + if (compareIndex == start) { + return start + 1; + } } } -- Gitee From e4f2d05820fff21453987d4964e6a60ea32677ab Mon Sep 17 00:00:00 2001 From: chenpan0560 Date: Tue, 16 Nov 2021 10:59:29 +0800 Subject: [PATCH 172/272] Modify alarm Signed-off-by: chenpan0560 --- .../command_line/hdf_get_handler.py | 6 +- .../command_line/hdf_linux_scann.py | 16 ++--- .../hdf_model_enable_operation.py | 63 ++++++++++++------- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py index 9309be4b6..2a5f4906e 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_get_handler.py @@ -223,6 +223,8 @@ class HdfGetHandler(HdfCommandHandlerBase): self.check_arg_raise_if_not_exist("board_name") root, vendor, _, _, board, _ = self.get_args() if board.split("_")[-1] != "linux": - return HdfLiteScan(root=root, vendor=vendor, board=board).get_model_scan() + return HdfLiteScan( + root=root, vendor=vendor, board=board).get_model_scan() else: - return HdfLinuxScan(root=root, vendor=vendor, board=board).get_model_scan() \ No newline at end of file + return HdfLinuxScan( + root=root, vendor=vendor, board=board).get_model_scan() \ No newline at end of file diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py b/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py index 1033a214f..91d5a51be 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_linux_scann.py @@ -46,23 +46,25 @@ class HdfLinuxScan(object): self.board = board self.kernel = "linux" - self.Makefile_path = hdf_utils.get_vendor_makefile_path( + self.makefile_path = hdf_utils.get_vendor_makefile_path( root, kernel="linux") - if not os.path.exists(self.Makefile_path): - raise HdfToolException('Makefile: %s not exist' % self.Makefile_path, - CommandErrorCode.TARGET_NOT_EXIST) + if not os.path.exists(self.makefile_path): + raise HdfToolException( + 'Makefile: %s not exist' % self.makefile_path, + CommandErrorCode.TARGET_NOT_EXIST) self.framework_dir = hdf_utils.get_module_dir(self.root, vendor) if not os.path.exists(self.framework_dir): - raise HdfToolException('file: %s not exist' % self.framework_dir, - CommandErrorCode.TARGET_NOT_EXIST) + raise HdfToolException( + 'file: %s not exist' % self.framework_dir, + CommandErrorCode.TARGET_NOT_EXIST) self.hcs_path = hdf_utils.get_hcs_file_path( self.root, self.vendor, self.board) if not os.path.exists(self.hcs_path): raise HdfToolException('file: %s not exist' % self.hcs_path, CommandErrorCode.TARGET_NOT_EXIST) - self.contents = hdf_utils.read_file_lines(self.Makefile_path) + self.contents = hdf_utils.read_file_lines(self.makefile_path) self.re_temp2 = r'model/[a-z 0-9]+' def scan_makefile(self): diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py b/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py index 6e5d37e74..f23ebdbf6 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_model_enable_operation.py @@ -44,13 +44,18 @@ class EnableOperation(object): self.vendor = vendor self.board = board self.model = model - self.liteos_model_name = HdfLiteScan(self.root, self.vendor, self.board).scan_build() - self.linux_model_name = HdfLinuxScan(self.root, self.vendor, self.board).scan_makefile() + self.liteos_model_name = HdfLiteScan( + self.root, self.vendor, self.board).scan_build() + self.linux_model_name = HdfLinuxScan( + self.root, self.vendor, self.board).scan_makefile() def disable_model_liteos(self): - dot_file_list = hdf_utils.get_dot_configs_path(self.root, self.vendor, self.board) - old_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y" - new_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set\n" + dot_file_list = hdf_utils.get_dot_configs_path( + self.root, self.vendor, self.board) + old_template_string = \ + "LOSCFG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = \ + "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set\n" new_demo_config = Template(new_template_string).substitute( {"module_upper_case": self.model.upper()}) old_demo_config = Template(old_template_string).substitute( @@ -67,9 +72,12 @@ class EnableOperation(object): return True def enable_model_liteos(self): - dot_file_list = hdf_utils.get_dot_configs_path(self.root, self.vendor, self.board) - new_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" - old_template_string = "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set" + dot_file_list = hdf_utils.get_dot_configs_path( + self.root, self.vendor, self.board) + new_template_string = \ + "LOSCFG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string = \ + "LOSCFG_DRIVERS_HDF_${module_upper_case} is not set" new_demo_config = Template(new_template_string).substitute( {"module_upper_case": self.model.upper()}) old_demo_config = Template(old_template_string).substitute( @@ -132,7 +140,8 @@ class EnableOperation(object): file_path = [] for roots, dirs, files in os.walk(patch): if endswitch == "defconfig": - files_list = list(filter(lambda x: x.split(split_sign)[-1] == endswitch, files)) + files_list = list(filter( + lambda x: x.split(split_sign)[-1] == endswitch, files)) else: files_list = list(filter(lambda x: x == endswitch, files)) for file in files_list: @@ -141,10 +150,12 @@ class EnableOperation(object): def _get_config_linux(self): config_path = self.get_config_config(kernel="linux") - config_path_list = self._get_file_patch(patch=config_path, endswitch="defconfig", split_sign="_") + config_path_list = self._get_file_patch( + patch=config_path, endswitch="defconfig", split_sign="_") patch_path = self.get_config_patch(kernel="linux") - patch_path_list = self._get_file_patch(patch=patch_path, endswitch="hi3516dv300.patch", split_sign=".") + patch_path_list = self._get_file_patch( + patch=patch_path, endswitch="hi3516dv300.patch", split_sign=".") config_path_list.extend(patch_path_list) return config_path_list @@ -168,12 +179,17 @@ class EnableOperation(object): file_path_list = self._get_config_linux() for file_path in file_path_list: if file_path.split("_")[-1] == "defconfig": - old_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y" - new_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" + old_template_string = \ + "CONFIG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = \ + "CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" else: - old_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case}=y" - new_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" - self._replace_operation(new_string=new_template_string, old_string=old_template_string, + old_template_string = \ + "+CONFIG_DRIVERS_HDF_${module_upper_case}=y" + new_template_string = \ + "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set\n" + self._replace_operation(new_string=new_template_string, + old_string=old_template_string, file_path=file_path) return True @@ -183,11 +199,16 @@ class EnableOperation(object): file_path_list = self._get_config_linux() for file_path in file_path_list: if file_path.split("_")[-1] == "defconfig": - new_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" - old_template_string = "CONFIG_DRIVERS_HDF_${module_upper_case} is not set" + new_template_string \ + = "CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string \ + = "CONFIG_DRIVERS_HDF_${module_upper_case} is not set" else: - new_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" - old_template_string = "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set" - self._replace_operation(new_string=new_template_string, old_string=old_template_string, + new_template_string \ + = "+CONFIG_DRIVERS_HDF_${module_upper_case}=y\n" + old_template_string = \ + "+CONFIG_DRIVERS_HDF_${module_upper_case} is not set" + self._replace_operation(new_string=new_template_string, + old_string=old_template_string, file_path=file_path) return True -- Gitee From 25e4076f9721a51fefdbf00ec0048b9a85ba892b Mon Sep 17 00:00:00 2001 From: yuanbo Date: Tue, 16 Nov 2021 10:48:45 +0800 Subject: [PATCH 173/272] support union device id Signed-off-by: yuanbo --- core/adapter/vnode/src/hdf_vnode_adapter.c | 2 +- core/common/src/hdf_attribute.c | 9 +- core/common/src/hdf_device_node_ext.c | 88 ++++++----- core/common/src/load_driver_entry.c | 69 -------- core/host/include/devhost_service.h | 2 +- core/host/include/devmgr_service_clnt.h | 3 +- core/host/include/hdf_device.h | 35 ++++- core/host/include/hdf_device_node.h | 35 +++-- core/host/include/hdf_driver_loader.h | 7 +- core/host/include/hdf_observer_record.h | 6 +- core/host/include/hdf_service_subscriber.h | 5 +- core/host/src/devhost_service.c | 79 +++++----- core/host/src/devmgr_service_clnt.c | 20 ++- core/host/src/devsvc_manager_clnt.c | 1 - core/host/src/hdf_device.c | 72 +++++++-- core/host/src/hdf_device_node.c | 174 ++++++++++++++------- core/host/src/hdf_device_object.c | 24 +-- core/host/src/hdf_driver_loader.c | 91 ++++------- core/host/src/hdf_observer_record.c | 9 +- core/host/src/hdf_service_observer.c | 14 +- core/host/src/hdf_service_subscriber.c | 5 +- core/manager/src/devmgr_service.c | 54 +++++-- core/manager/src/driver_manager.c | 122 +++++++++++++++ core/shared/include/devhost_service_if.h | 3 +- core/shared/include/device_token_if.h | 2 + core/shared/include/devmgr_service_if.h | 3 +- core/shared/include/hdf_driver.h | 30 ++++ test/unittest/manager/sample_driver_test.c | 34 ++-- utils/include/hdf_cstring.h | 1 + utils/src/hdf_cstring.c | 24 +++ 30 files changed, 650 insertions(+), 373 deletions(-) delete mode 100644 core/common/src/load_driver_entry.c create mode 100644 core/manager/src/driver_manager.c create mode 100644 core/shared/include/hdf_driver.h diff --git a/core/adapter/vnode/src/hdf_vnode_adapter.c b/core/adapter/vnode/src/hdf_vnode_adapter.c index 340054fb3..b3c7de643 100644 --- a/core/adapter/vnode/src/hdf_vnode_adapter.c +++ b/core/adapter/vnode/src/hdf_vnode_adapter.c @@ -643,7 +643,7 @@ int32_t HdfDeviceSendEvent(const struct HdfDeviceObject *deviceObject, uint32_t } deviceNode = CONTAINER_OF(deviceObject, struct HdfDeviceNode, deviceObject); - if (deviceNode->deviceInfo->policy != SERVICE_POLICY_CAPACITY) { + if (deviceNode->policy != SERVICE_POLICY_CAPACITY) { return HDF_ERR_NOT_SUPPORT; } diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index b6af3fe7c..ac3849bd6 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -247,6 +247,8 @@ static bool GetDeviceNodeInfo(const struct DeviceResourceNode *deviceNode, struc struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *hostName) { uint16_t deviceIdx = 0; + uint8_t deviceNnodeIdx = 0; + struct HdfDeviceInfo *deviceNodeInfo = NULL; const struct DeviceResourceNode *hostNode = GetHostNode(hostName); struct HdfSList *deviceList = NULL; const struct DeviceResourceNode *device = NULL; @@ -261,7 +263,8 @@ struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *h while (device != NULL) { const struct DeviceResourceNode *deviceNode = device->child; while (deviceNode != NULL) { - struct HdfDeviceInfo *deviceNodeInfo = HdfDeviceInfoNewInstance(); + deviceNnodeIdx = 0; + deviceNodeInfo = HdfDeviceInfoNewInstance(); if (deviceNodeInfo == NULL) { HdfSListFlush(deviceList, HdfDeviceInfoDelete); OsalMemFree(deviceList); @@ -282,10 +285,12 @@ struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *h deviceNode = deviceNode->sibling; continue; } - deviceNodeInfo->deviceId = deviceIdx++; + deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNnodeIdx); + deviceNnodeIdx++; deviceNode = deviceNode->sibling; } device = device->sibling; + deviceIdx++; } if (HdfSListCount(deviceList) == 0) { OsalMemFree(deviceList); diff --git a/core/common/src/hdf_device_node_ext.c b/core/common/src/hdf_device_node_ext.c index c0eab0d70..13fb2c6d0 100644 --- a/core/common/src/hdf_device_node_ext.c +++ b/core/common/src/hdf_device_node_ext.c @@ -20,7 +20,6 @@ static int DeviceNodeExtDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data, struct HdfSBuf *reply) { struct IDeviceIoService *deviceMethod = NULL; - const struct HdfDeviceInfo *deviceInfo = NULL; struct HdfDeviceNode *devNode = NULL; uint64_t ioClientPtr = 0; @@ -39,12 +38,8 @@ static int DeviceNodeExtDispatch(struct HdfObject *stub, int code, struct HdfSBu HDF_LOGE("device ext dispatch: device service interface is null"); return HDF_FAILURE; } - deviceInfo = devNode->deviceInfo; - if (deviceInfo == NULL) { - HDF_LOGE("device ext dispatch: device deviceInfo is null"); - return HDF_FAILURE; - } - if (deviceInfo->policy == SERVICE_POLICY_CAPACITY) { + + if (devNode->policy == SERVICE_POLICY_CAPACITY) { if (deviceMethod->Dispatch == NULL) { HDF_LOGE("device ext dispatch: remote service dispatch method is null"); return HDF_FAILURE; @@ -54,57 +49,80 @@ static int DeviceNodeExtDispatch(struct HdfObject *stub, int code, struct HdfSBu return HDF_FAILURE; } -static int DeviceNodeExtPublishService(struct HdfDeviceNode *inst, const char *serviceName) +static int DeviceNodeExtPublishService(struct HdfDeviceNode *devNode) { - const struct HdfDeviceInfo *deviceInfo = NULL; struct HdfDeviceObject *deviceObject = NULL; - struct DeviceNodeExt *devNodeExt = (struct DeviceNodeExt *)inst; + struct DeviceNodeExt *devNodeExt = (struct DeviceNodeExt *)devNode; int ret; + static struct HdfIoDispatcher dispatcher = { .Dispatch = DeviceNodeExtDispatch }; + if (devNodeExt == NULL) { return HDF_FAILURE; } - ret = HdfDeviceNodePublishPublicService(inst, serviceName); - if (ret != HDF_SUCCESS) { - HDF_LOGE("failed to publish device service, ret is %d", ret); - return HDF_FAILURE; - } - deviceInfo = inst->deviceInfo; deviceObject = &devNodeExt->super.deviceObject; - if ((deviceObject->service == NULL) || (deviceInfo == NULL)) { - HDF_LOGE("Device service interface or deviceInfo is null"); + if (deviceObject->service == NULL) { + HDF_LOGE("device service interface is null"); return HDF_FAILURE; } - if (deviceInfo->policy == SERVICE_POLICY_CAPACITY) { - devNodeExt->ioService = HdfIoServicePublish(serviceName, deviceInfo->permission); + if (devNode->policy == SERVICE_POLICY_CAPACITY) { + devNodeExt->ioService = HdfIoServicePublish(devNode->servName, devNode->permission); if (devNodeExt->ioService != NULL) { - static struct HdfIoDispatcher dispatcher = { - .Dispatch = DeviceNodeExtDispatch - }; - devNodeExt->ioService->target = (struct HdfObject*)(&inst->deviceObject); + devNodeExt->ioService->target = (struct HdfObject *)(deviceObject); devNodeExt->ioService->dispatcher = &dispatcher; } else { - HDF_LOGE("Device remote service bind failed"); - HdfDeviceNodeReclaimService(serviceName); - return HDF_FAILURE; + HDF_LOGE("device remote service publish failed"); + return HDF_DEV_ERR_NO_DEVICE_SERVICE; } } + + // base(device node) publish inner service + ret = HdfDeviceNodePublishPublicService(devNode); + if (ret != HDF_SUCCESS) { + HDF_LOGE("failed to publish device service, ret is %d", ret); + HdfIoServiceRemove(devNodeExt->ioService); + devNodeExt->ioService = NULL; + return ret; + } + return HDF_SUCCESS; } +int DeviceNodeExtRemoveService(struct HdfDeviceNode *devNode) +{ + struct DeviceNodeExt *devNodeExt = CONTAINER_OF(devNode, struct DeviceNodeExt, super); + if (devNode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (devNode->policy == SERVICE_POLICY_CAPACITY) { + HdfIoServiceRemove(devNodeExt->ioService); + devNodeExt->ioService = NULL; + } + + // remove inner service published by base + return HdfDeviceNodeRemoveService(devNode); +} + static void DeviceNodeExtConstruct(struct DeviceNodeExt *inst) { struct IDeviceNode *nodeIf = (struct IDeviceNode *)inst; if (nodeIf != NULL) { HdfDeviceNodeConstruct(&inst->super); nodeIf->PublishService = DeviceNodeExtPublishService; + nodeIf->RemoveService = DeviceNodeExtRemoveService; } } +static void DeviceNodeExtDestruct(struct DeviceNodeExt *devnode) +{ + DeviceNodeExtRemoveService(&devnode->super); + HdfDeviceNodeDestruct(&devnode->super); +} + struct HdfObject *DeviceNodeExtCreate() { - struct DeviceNodeExt *instance = - (struct DeviceNodeExt *)OsalMemCalloc(sizeof(struct DeviceNodeExt)); + struct DeviceNodeExt *instance = (struct DeviceNodeExt *)OsalMemCalloc(sizeof(struct DeviceNodeExt)); if (instance != NULL) { DeviceNodeExtConstruct(instance); instance->ioService = NULL; @@ -114,13 +132,9 @@ struct HdfObject *DeviceNodeExtCreate() void DeviceNodeExtRelease(struct HdfObject *object) { - struct DeviceNodeExt *instance = (struct DeviceNodeExt *)object; - if (instance != NULL) { - if (instance->ioService != NULL) { - HdfIoServiceRemove(instance->ioService); - } - HdfDeviceNodeDestruct(&instance->super); - OsalMemFree(instance); + struct DeviceNodeExt *devnode = (struct DeviceNodeExt *)object; + if (devnode != NULL) { + DeviceNodeExtDestruct(devnode); + OsalMemFree(devnode); } } - diff --git a/core/common/src/load_driver_entry.c b/core/common/src/load_driver_entry.c deleted file mode 100644 index 165a7840f..000000000 --- a/core/common/src/load_driver_entry.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "hdf_driver_loader.h" -#include "hdf_log.h" -#include "osal_mem.h" - -static struct HdfDriverEntry *HdfDriverEntryConstruct(int32_t *driverCount) -{ - int i; - struct HdfDriverEntry *driverEntry = NULL; - size_t *addrBegin = NULL; - *driverCount = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); - if (*driverCount <= 0) { - HDF_LOGE("%s: failed to hdf get device counts", __func__); - return NULL; - } - driverEntry = OsalMemCalloc(*driverCount * sizeof(struct HdfDriverEntry)); - if (driverEntry == NULL) { - HDF_LOGE("%s: failed to alloc driver entry mem", __func__); - *driverCount = 0; - return NULL; - } - addrBegin = (size_t *)(HDF_DRIVER_BEGIN()); - for (i = 0; i < *driverCount; i++) { - driverEntry[i] = *(struct HdfDriverEntry *)(*addrBegin); - addrBegin++; - } - return driverEntry; -} - -struct HdfDriverEntry *HdfDriverLoaderGetDriverEntry(const struct HdfDeviceInfo *deviceInfo) -{ - int i; - static struct HdfDriverEntry *driverEntry = NULL; - static int32_t driverCount = 0; - if ((deviceInfo == NULL) || (deviceInfo->moduleName == NULL) || (deviceInfo->svcName == NULL)) { - HDF_LOGE("%s: failed to get device entry, input deviceInfo is NULL", __func__); - return NULL; - } - if (driverEntry == NULL) { - driverEntry = HdfDriverEntryConstruct(&driverCount); - if (driverEntry == NULL) { - HDF_LOGE("%s: failed to construct driver entry", __func__); - return NULL; - } - } - for (i = 0; i < driverCount; i++) { - if (driverEntry == NULL) { - HDF_LOGE("%s: driver entry is null", __func__); - return NULL; - } - if (driverEntry[i].moduleName == NULL) { - HDF_LOGE("%s: driver entry module name is null", __func__); - continue; - } - if (strcmp(deviceInfo->moduleName, driverEntry[i].moduleName) == 0) { - return &driverEntry[i]; - } - } - HDF_LOGE("failed to get device entry %s", deviceInfo->svcName); - return NULL; -} - diff --git a/core/host/include/devhost_service.h b/core/host/include/devhost_service.h index eb7347eef..8ddba0ce7 100644 --- a/core/host/include/devhost_service.h +++ b/core/host/include/devhost_service.h @@ -27,7 +27,7 @@ struct DevHostService { void DevHostServiceConstruct(struct DevHostService *service); void DevHostServiceDestruct(struct DevHostService *service); int DevHostServiceAddDevice(struct IDevHostService *inst, const struct HdfDeviceInfo *deviceInfo); -int DevHostServiceDelDevice(struct IDevHostService *inst, const struct HdfDeviceInfo *deviceInfo); +int DevHostServiceDelDevice(struct IDevHostService *inst, devid_t devId); struct IDevHostService *DevHostServiceNewInstance(uint16_t hostId, const char *hostName); void DevHostServiceFreeInstance(struct IDevHostService *service); struct HdfObject *DevHostServiceCreate(void); diff --git a/core/host/include/devmgr_service_clnt.h b/core/host/include/devmgr_service_clnt.h index 87216668f..d5aecee85 100644 --- a/core/host/include/devmgr_service_clnt.h +++ b/core/host/include/devmgr_service_clnt.h @@ -19,7 +19,8 @@ struct DevmgrServiceClnt { struct DevmgrServiceClnt *DevmgrServiceClntGetInstance(void); void DevmgrServiceClntFreeInstance(struct DevmgrServiceClnt *inst); -int DevmgrServiceClntAttachDevice(const struct HdfDeviceInfo *deviceInfo, struct IHdfDeviceToken *deviceToken); +int DevmgrServiceClntAttachDevice(struct IHdfDeviceToken *deviceToken); +int DevmgrServiceClntDetachDevice(devid_t devid); int DevmgrServiceClntAttachDeviceHost(uint16_t hostId, struct IDevHostService *hostService); #endif /* DEVMGR_SERVICE_CLIENT_H */ diff --git a/core/host/include/hdf_device.h b/core/host/include/hdf_device.h index 25e2a0650..7048dff5d 100644 --- a/core/host/include/hdf_device.h +++ b/core/host/include/hdf_device.h @@ -9,20 +9,40 @@ #ifndef HDF_DEVICE_H #define HDF_DEVICE_H -#include "devhost_service.h" -#include "device_token_if.h" #include "hdf_device_desc.h" -#include "hdf_object.h" -#include "hdf_service_observer.h" #include "hdf_dlist.h" -#include "osal_mutex.h" +#include "hdf_object.h" + +/* + * -----------------+----------------+----------------+----------------+ + * | BYTE | BYTE | BYTE | BYTE | + * +---------------------------------+---------------------------------+ + * | host id | device id | device node id | + * -----------------+---------------------------------+----------------+ + */ +typedef uint32_t devid_t; + +#define HOSTID_BITS 8 +#define DEVICEID_BITS 16 +#define DEVNODEID_BITS 8 +#define DEVNODEID_MASK ((1 << DEVNODEID_BITS) - 1) +#define DEVICEID_MASK ((1 << DEVICEID_BITS) - 1) + +#define HOSTID(devid) (devid >> (DEVICEID_BITS + DEVNODEID_BITS)) +#define DEVICEID(devid) ((devid >> DEVNODEID_BITS) & DEVICEID_MASK) +#define DEVNODEID(devid) (devid & DEVNODEID_MASK) + +#define MK_DEVID(hostId, deviceId, devnodeId) \ + (hostId << (DEVICEID_BITS + DEVNODEID_BITS) | deviceId << DEVNODEID_BITS | devnodeId) struct HdfDeviceNode; struct IHdfDevice { struct HdfObject object; - int (*Attach)(struct IHdfDevice *, struct HdfDeviceNode *); - void (*Detach)(struct IHdfDevice *, struct HdfDeviceNode *); + int (*Attach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode); + int (*Detach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode); + struct HdfDeviceNode *(*GetDeviceNode)(struct IHdfDevice *device, devid_t devid); + int (*DetachWithDevid)(struct IHdfDevice *device, devid_t devid); }; struct HdfDevice { @@ -38,6 +58,5 @@ struct HdfObject *HdfDeviceCreate(void); void HdfDeviceRelease(struct HdfObject *object); struct HdfDevice *HdfDeviceNewInstance(void); void HdfDeviceFreeInstance(struct HdfDevice *device); -void HdfDeviceDelete(struct HdfSListNode *deviceEntry); #endif /* HDF_DEVICE_H */ diff --git a/core/host/include/hdf_device_node.h b/core/host/include/hdf_device_node.h index 475158ead..1c203854f 100644 --- a/core/host/include/hdf_device_node.h +++ b/core/host/include/hdf_device_node.h @@ -13,6 +13,7 @@ #include "hdf_device_info.h" #include "hdf_device_desc.h" #include "hdf_dlist.h" +#include "hdf_driver.h" #include "hdf_pm.h" struct HdfDeviceNode; @@ -20,8 +21,10 @@ struct DevHostService; struct IDeviceNode { struct HdfObject object; - int (*PublishService)(struct HdfDeviceNode *, const char *); - int (*LaunchNode)(struct HdfDeviceNode *, struct IHdfDevice *); + int (*PublishService)(struct HdfDeviceNode *devNode); + int (*RemoveService)(struct HdfDeviceNode *devNode); + int (*LaunchNode)(struct HdfDeviceNode *devNode); + int (*ReleaseNode)(struct HdfDeviceNode *devNode); }; struct HdfDeviceNode { @@ -31,20 +34,32 @@ struct HdfDeviceNode { struct DevHostService *hostService; struct HdfDeviceObject deviceObject; struct IHdfDeviceToken *token; - struct HdfDriverEntry *driverEntry; - const struct HdfDeviceInfo *deviceInfo; + struct HdfDriver *driver; + const struct HdfDevice *device; + char *servName; + devid_t devId; + uint16_t policy; + uint16_t permission; + uint8_t devStatus; + bool servStatus; +}; + +enum DevNodeStaus { + DEVNODE_NONE = 0, + DEVNODE_INITED, + DEVNODE_LAUNCHED, }; int HdfDeviceNodeAddPowerStateListener( struct HdfDeviceNode *devNode, const struct IPowerEventListener *listener); void HdfDeviceNodeRemovePowerStateListener( struct HdfDeviceNode *devNode, const struct IPowerEventListener *listener); -void HdfDeviceNodeConstruct(struct HdfDeviceNode *service); -void HdfDeviceNodeDestruct(struct HdfDeviceNode *service); -struct HdfDeviceNode *HdfDeviceNodeNewInstance(void); -void HdfDeviceNodeFreeInstance(struct HdfDeviceNode *service); +void HdfDeviceNodeConstruct(struct HdfDeviceNode *devNode); +void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode); +struct HdfDeviceNode *HdfDeviceNodeNewInstance(const struct HdfDeviceInfo *deviceInfo, struct HdfDriver *driver); +void HdfDeviceNodeFreeInstance(struct HdfDeviceNode *devNode); void HdfDeviceNodeDelete(struct HdfDeviceNode *devNode); -int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *service, const char *svcName); -void HdfDeviceNodeReclaimService(const char *svcName); +int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode); +int HdfDeviceNodeRemoveService(struct HdfDeviceNode *devNode); #endif /* HDF_DEVICE_NODE_H */ diff --git a/core/host/include/hdf_driver_loader.h b/core/host/include/hdf_driver_loader.h index 56048807b..e22d29c2e 100644 --- a/core/host/include/hdf_driver_loader.h +++ b/core/host/include/hdf_driver_loader.h @@ -15,9 +15,8 @@ struct IDriverLoader { struct HdfObject object; - struct HdfDriverEntry *(*GetDriverEntry)(const struct HdfDeviceInfo *deviceInfo); - struct HdfDeviceNode *(*LoadNode)(struct IDriverLoader *, const struct HdfDeviceInfo *deviceInfo); - void (*UnLoadNode)(struct IDriverLoader *, const struct HdfDeviceInfo *deviceInfo); + struct HdfDriver *(*GetDriver)(const char *driverName); + void (*ReclaimDriver)(struct HdfDriver *driver); }; struct HdfDriverLoader { @@ -28,7 +27,7 @@ struct HdfObject *HdfDriverLoaderCreate(void); void HdfDriverLoaderConstruct(struct HdfDriverLoader *inst); void HdfDriverLoaderRelease(struct HdfObject *object); struct IDriverLoader *HdfDriverLoaderGetInstance(void); -struct HdfDriverEntry *HdfDriverLoaderGetDriverEntry(const struct HdfDeviceInfo *deviceInfo); +struct HdfDriver *HdfDriverLoaderGetDriver(const char *moduleName); struct HdfDeviceNode *HdfDriverLoaderLoadNode( struct IDriverLoader *loader, const struct HdfDeviceInfo *deviceInfo); void HdfDriverLoaderUnLoadNode(struct IDriverLoader *loader, const struct HdfDeviceInfo *deviceInfo); diff --git a/core/host/include/hdf_observer_record.h b/core/host/include/hdf_observer_record.h index a8bcbd93f..7e63ab82c 100644 --- a/core/host/include/hdf_observer_record.h +++ b/core/host/include/hdf_observer_record.h @@ -9,6 +9,7 @@ #ifndef HDF_OBSERVER_RECORD_H #define HDF_OBSERVER_RECORD_H +#include "hdf_device.h" #include "hdf_object.h" #include "hdf_slist.h" #include "osal_mutex.h" @@ -17,18 +18,17 @@ struct HdfServiceObserverRecord { struct HdfSListNode entry; uint32_t serviceKey; uint16_t policy; - uint32_t matchId; + devid_t devId; struct OsalMutex obsRecMutex; struct HdfSList subscribers; struct HdfObject *publisher; }; -uint32_t HdfMakeHardwareId(uint16_t hostId, uint16_t deviceId); struct HdfServiceObserverRecord *HdfServiceObserverRecordObtain(uint32_t serviceKey); void HdfServiceObserverRecordRecycle(struct HdfServiceObserverRecord *record); bool HdfServiceObserverRecordCompare(struct HdfSListNode *listEntry, uint32_t serviceKey); void HdfServiceObserverRecordNotifySubscribers( - struct HdfServiceObserverRecord *record, uint32_t matchId, uint16_t policy); + struct HdfServiceObserverRecord *record, devid_t devid, uint16_t policy); void HdfServiceObserverRecordDelete(struct HdfSListNode *listEntry); #endif /* HDF_OBSERVER_RECORD_H */ diff --git a/core/host/include/hdf_service_subscriber.h b/core/host/include/hdf_service_subscriber.h index 2d2528b0d..29ba7477b 100644 --- a/core/host/include/hdf_service_subscriber.h +++ b/core/host/include/hdf_service_subscriber.h @@ -9,13 +9,14 @@ #ifndef HDF_SERVICE_SUBSCRIBER_H #define HDF_SERVICE_SUBSCRIBER_H +#include "hdf_device.h" #include "hdf_device_desc.h" #include "hdf_slist.h" struct HdfServiceSubscriber { struct HdfSListNode entry; uint32_t state; - uint32_t matchId; + uint32_t devId; struct SubscriberCallback callback; }; @@ -24,7 +25,7 @@ enum { HDF_SUBSCRIBER_STATE_READY }; -struct HdfServiceSubscriber *HdfServiceSubscriberObtain(struct SubscriberCallback callback, uint32_t matchId); +struct HdfServiceSubscriber *HdfServiceSubscriberObtain(struct SubscriberCallback callback, devid_t devid); void HdfServiceSubscriberRecycle(struct HdfServiceSubscriber *subscriber); void HdfServiceSubscriberDelete(struct HdfSListNode *listEntry); diff --git a/core/host/src/devhost_service.c b/core/host/src/devhost_service.c index 984f6e6c2..a964cec51 100644 --- a/core/host/src/devhost_service.c +++ b/core/host/src/devhost_service.c @@ -11,6 +11,7 @@ #include "devsvc_manager_clnt.h" #include "hdf_base.h" #include "hdf_driver_loader.h" +#include "hdf_driver.h" #include "hdf_log.h" #include "hdf_object_manager.h" #include "osal_mem.h" @@ -34,16 +35,15 @@ static struct HdfDevice *DevHostServiceFindDevice(struct DevHostService *hostSer return NULL; } -static void DevHostServiceFreeDevice(struct DevHostService *hostService, uint16_t deviceId) +static void DevHostServiceFreeDevice(struct DevHostService *hostService, struct HdfDevice *device) { - struct HdfDevice *device = DevHostServiceFindDevice(hostService, deviceId); if (device != NULL) { DListRemove(&device->node); HdfDeviceFreeInstance(device); } } -static struct HdfDevice *DevHostServiceGetDevice(struct DevHostService *inst, uint16_t deviceId) +static struct HdfDevice *DevHostServiceQueryOrAddDevice(struct DevHostService *inst, uint16_t deviceId) { struct HdfDevice *device = DevHostServiceFindDevice(inst, deviceId); if (device == NULL) { @@ -64,79 +64,88 @@ int DevHostServiceAddDevice(struct IDevHostService *inst, const struct HdfDevice int ret = HDF_FAILURE; struct HdfDevice *device = NULL; struct HdfDeviceNode *devNode = NULL; + struct HdfDriver *driver = NULL; struct DevHostService *hostService = CONTAINER_OF(inst, struct DevHostService, super); struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); - if (inst == NULL || deviceInfo == NULL || driverLoader == NULL || driverLoader->LoadNode == NULL) { + if (inst == NULL || deviceInfo == NULL || driverLoader == NULL || driverLoader->GetDriver == NULL) { HDF_LOGE("failed to add device, input param is null"); return ret; } - device = DevHostServiceGetDevice(hostService, deviceInfo->deviceId); + device = DevHostServiceQueryOrAddDevice(hostService, DEVICEID(deviceInfo->deviceId)); if (device == NULL || device->super.Attach == NULL) { ret = HDF_DEV_ERR_NO_DEVICE; goto error; } - devNode = driverLoader->LoadNode(driverLoader, deviceInfo); + driver = driverLoader->GetDriver(deviceInfo->moduleName); + if (driver == NULL) { + ret = HDF_DEV_ERR_NODATA; + goto error; + } + + devNode = HdfDeviceNodeNewInstance(deviceInfo, driver); if (devNode == NULL) { - ret = HDF_DEV_ERR_NO_DEVICE_SERVICE; + driverLoader->ReclaimDriver(driver); + ret = HDF_DEV_ERR_NO_MEMORY; goto error; } + devNode->hostService = hostService; + devNode->device = device; + devNode->driver = driver; ret = device->super.Attach(&device->super, devNode); if (ret != HDF_SUCCESS) { + HdfDeviceNodeFreeInstance(devNode); goto error; } return HDF_SUCCESS; error: - DevHostServiceFreeDevice(hostService, device->deviceId); + driverLoader->ReclaimDriver(driver); + DevHostServiceFreeDevice(hostService, device); return ret; } -static struct HdfDeviceNode *DevHostServiceSeparateDeviceNode(struct DListHead *deviceNodes, - const struct HdfDeviceInfo *deviceInfo) -{ - struct HdfDeviceNode *deviceNode = NULL; - DLIST_FOR_EACH_ENTRY(deviceNode, deviceNodes, struct HdfDeviceNode, entry) { - if (strcmp(deviceNode->deviceInfo->svcName, deviceInfo->svcName) == 0 && - strcmp(deviceNode->deviceInfo->moduleName, deviceInfo->moduleName) == 0) { - DListRemove(&deviceNode->entry); - return deviceNode; - } - } - return NULL; -} - -int DevHostServiceDelDevice(struct IDevHostService *inst, const struct HdfDeviceInfo *deviceInfo) +int DevHostServiceDelDevice(struct IDevHostService *inst, devid_t devId) { struct HdfDevice *device = NULL; struct DevHostService *hostService = (struct DevHostService *)inst; - struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); struct HdfDeviceNode *devNode = NULL; + struct HdfDriver *driver = NULL; + struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); - if ((deviceInfo == NULL) || (driverLoader == NULL) || (driverLoader->UnLoadNode == NULL)) { + if (driverLoader == NULL || driverLoader->ReclaimDriver == NULL) { HDF_LOGE("failed to del device, input param is null"); return HDF_FAILURE; } - device = DevHostServiceFindDevice(hostService, deviceInfo->deviceId); + device = DevHostServiceFindDevice(hostService, DEVICEID(devId)); if (device == NULL) { HDF_LOGW("failed to del device, device is not exist"); return HDF_SUCCESS; } - driverLoader->UnLoadNode(driverLoader, deviceInfo); - devNode = DevHostServiceSeparateDeviceNode(&device->devNodes, deviceInfo); + devNode = device->super.GetDeviceNode(&device->super, devId); + if (devNode == NULL) { + return HDF_DEV_ERR_NO_DEVICE; + } + driver = devNode->driver; + + // device detach will release device node, do not use devNode after this if (device->super.Detach != NULL) { - device->super.Detach(&device->super, devNode); - } else { - HdfDeviceNodeFreeInstance(devNode); + if (device->super.Detach(&device->super, devNode) != HDF_SUCCESS) { + HDF_LOGE("failed to del device %x", devId); + return HDF_FAILURE; + } } - DevSvcManagerClntRemoveService(deviceInfo->svcName); + + // remove driver instance or close driver library + driverLoader->ReclaimDriver(driver); + if (DListIsEmpty(&device->devNodes)) { - DevHostServiceFreeDevice(hostService, device->deviceId); + DevHostServiceFreeDevice(hostService, device); } return HDF_SUCCESS; } @@ -163,7 +172,7 @@ static int ApplyDevicesPowerState(struct HdfDevice *device, uint32_t state) if (deviceNode->powerToken != NULL) { ret = PowerStateChange(deviceNode->powerToken, state); if (ret != HDF_SUCCESS) { - HDF_LOGE("device %s failed to resume(%d)", deviceNode->driverEntry->moduleName, state); + HDF_LOGE("device %s failed to resume(%d)", deviceNode->driver->entry->moduleName, state); } } } @@ -172,7 +181,7 @@ static int ApplyDevicesPowerState(struct HdfDevice *device, uint32_t state) if (deviceNode->powerToken != NULL) { ret = PowerStateChange(deviceNode->powerToken, state); if (ret != HDF_SUCCESS) { - HDF_LOGE("device %s failed to suspend(%d)", deviceNode->driverEntry->moduleName, state); + HDF_LOGE("device %s failed to suspend(%d)", deviceNode->driver->entry->moduleName, state); } } } diff --git a/core/host/src/devmgr_service_clnt.c b/core/host/src/devmgr_service_clnt.c index 378ec5f59..e690010e9 100644 --- a/core/host/src/devmgr_service_clnt.c +++ b/core/host/src/devmgr_service_clnt.c @@ -31,7 +31,7 @@ int DevmgrServiceClntAttachDeviceHost(uint16_t hostId, struct IDevHostService *h return devMgrSvcIf->AttachDeviceHost(devMgrSvcIf, hostId, hostService); } -int DevmgrServiceClntAttachDevice(const struct HdfDeviceInfo *deviceInfo, struct IHdfDeviceToken *deviceToken) +int DevmgrServiceClntAttachDevice(struct IHdfDeviceToken *deviceToken) { struct IDevmgrService *devMgrSvcIf = NULL; struct DevmgrServiceClnt *inst = DevmgrServiceClntGetInstance(); @@ -45,7 +45,22 @@ int DevmgrServiceClntAttachDevice(const struct HdfDeviceInfo *deviceInfo, struct HDF_LOGE("devmgr client failed to attach device, dmsOps->AttachDevice is nul"); return HDF_FAILURE; } - return devMgrSvcIf->AttachDevice(devMgrSvcIf, deviceInfo, deviceToken); + return devMgrSvcIf->AttachDevice(devMgrSvcIf, deviceToken); +} +int DevmgrServiceClntDetachDevice(devid_t devid) +{ + struct IDevmgrService *devMgrSvcIf = NULL; + struct DevmgrServiceClnt *inst = DevmgrServiceClntGetInstance(); + if (inst == NULL || inst->devMgrSvcIf == NULL) { + HDF_LOGE("devmgr client failed to deatch device, inst is null"); + return HDF_FAILURE; + } + + devMgrSvcIf = inst->devMgrSvcIf; + if (devMgrSvcIf->DetachDevice == NULL) { + return HDF_FAILURE; + } + return devMgrSvcIf->DetachDevice(devMgrSvcIf, devid); } struct DevmgrServiceClnt *DevmgrServiceClntGetInstance() @@ -64,4 +79,3 @@ void DevmgrServiceClntFreeInstance(struct DevmgrServiceClnt *inst) inst->devMgrSvcIf = NULL; } } - diff --git a/core/host/src/devsvc_manager_clnt.c b/core/host/src/devsvc_manager_clnt.c index 3cce4a59c..04569e5bf 100644 --- a/core/host/src/devsvc_manager_clnt.c +++ b/core/host/src/devsvc_manager_clnt.c @@ -136,7 +136,6 @@ void DevSvcManagerClntRemoveService(const char *svcName) serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->RemoveService == NULL) { - HDF_LOGE("failed to remove service, method not implement"); return; } serviceManager->RemoveService(serviceManager, svcName); diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index 451faf992..ce30c37ce 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -20,28 +20,80 @@ static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) { + int ret; struct HdfDevice *device = (struct HdfDevice *)devInst; struct IDeviceNode *nodeIf = (struct IDeviceNode *)devNode; if (device == NULL || nodeIf == NULL || nodeIf->LaunchNode == NULL) { HDF_LOGE("failed to attach device, input params invalid"); return HDF_ERR_INVALID_PARAM; } - DListInsertTail(&devNode->entry, &device->devNodes); - return nodeIf->LaunchNode(devNode, devInst); + + ret = nodeIf->LaunchNode(devNode); + if (ret == HDF_SUCCESS) { + DListInsertTail(&devNode->entry, &device->devNodes); + } + + return ret; +} + +static int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) +{ + struct HdfDevice *device = NULL; + if (devInst == NULL || devNode == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + device = CONTAINER_OF(devInst, struct HdfDevice, super); + if (device->deviceId != DEVICEID(devNode->devId)) { + HDF_LOGE("%s: device %x detach unknown devnode %x", __func__, device->deviceId, devNode->devId); + return HDF_DEV_ERR_NO_DEVICE; + } + DListRemove(&devNode->entry); + HdfDeviceNodeFreeInstance(devNode); + + return HDF_SUCCESS; +} + +static struct HdfDeviceNode *HdfDeviceGetDeviceNode(struct IHdfDevice *device, devid_t devid) +{ + struct HdfDeviceNode *devNode = NULL; + struct HdfDevice *dev = CONTAINER_OF(device, struct HdfDevice, super); + DLIST_FOR_EACH_ENTRY(devNode, &dev->devNodes, struct HdfDeviceNode, entry) { + if (devNode->devId == devid) { + return devNode; + }; + } + return NULL; +} + +static int HdfDeviceDetachWithDevid(struct IHdfDevice *device, devid_t devid) +{ + struct HdfDevice *dev = CONTAINER_OF(device, struct HdfDevice, super); + struct HdfDeviceNode *devNode = HdfDeviceGetDeviceNode(device, devid); + if (devNode == NULL) { + HDF_LOGE("detach device node %x not in device %x", devid, dev->deviceId); + return HDF_DEV_ERR_NO_DEVICE; + } + + return HdfDeviceDetach(device, devNode); } void HdfDeviceConstruct(struct HdfDevice *device) { device->super.Attach = HdfDeviceAttach; + device->super.Detach = HdfDeviceDetach; + device->super.DetachWithDevid = HdfDeviceDetachWithDevid; + device->super.GetDeviceNode = HdfDeviceGetDeviceNode; + DListHeadInit(&device->devNodes); } void HdfDeviceDestruct(struct HdfDevice *device) { struct HdfDeviceNode *devNode = NULL; - struct HdfDeviceNode *devNodeTmp = NULL; - DLIST_FOR_EACH_ENTRY_SAFE(devNode, devNodeTmp, &device->devNodes, struct HdfDeviceNode, entry) { - HdfDeviceNodeDelete(devNode); + struct HdfDeviceNode *tmp = NULL; + DLIST_FOR_EACH_ENTRY_SAFE(devNode, tmp, &device->devNodes, struct HdfDeviceNode, entry) { + HdfDeviceNodeFreeInstance(devNode); } DListHeadInit(&device->devNodes); } @@ -76,13 +128,3 @@ void HdfDeviceFreeInstance(struct HdfDevice *device) HdfObjectManagerFreeObject(&device->super.object); } } - -void HdfDeviceDelete(struct HdfSListNode *listEntry) -{ - if (listEntry != NULL) { - struct HdfDevice *device = (struct HdfDevice *)HDF_SLIST_CONTAINER_OF( - struct HdfSListNode, listEntry, struct HdfDevice, node); - HdfDeviceFreeInstance(device); - } -} - diff --git a/core/host/src/hdf_device_node.c b/core/host/src/hdf_device_node.c index f08c25394..93c33556d 100644 --- a/core/host/src/hdf_device_node.c +++ b/core/host/src/hdf_device_node.c @@ -10,7 +10,10 @@ #include "devhost_service.h" #include "devmgr_service_clnt.h" #include "devsvc_manager_clnt.h" +#include "hcs_tree_if.h" +#include "hdf_attribute_manager.h" #include "hdf_base.h" +#include "hdf_cstring.h" #include "hdf_device_object.h" #include "hdf_device_token.h" #include "hdf_log.h" @@ -21,83 +24,82 @@ #define HDF_LOG_TAG device_node -static int HdfDeviceNodePublishLocalService( - struct HdfDeviceNode *devNode, const struct HdfDeviceInfo *deviceInfo) +static int HdfDeviceNodePublishLocalService(struct HdfDeviceNode *devNode) { - uint32_t matchId; - struct DevHostService *hostService = NULL; - if ((devNode == NULL) || (deviceInfo == NULL)) { + if (devNode == NULL) { HDF_LOGE("failed to publish local service, device is null"); return HDF_FAILURE; } - hostService = devNode->hostService; - if (hostService == NULL) { + if (devNode->hostService == NULL) { HDF_LOGE("failed to publish local service, host service is null"); return HDF_FAILURE; } - matchId = HdfMakeHardwareId(deviceInfo->hostId, deviceInfo->deviceId); - return HdfServiceObserverPublishService(&hostService->observer, deviceInfo->svcName, - matchId, deviceInfo->policy, (struct HdfObject *)devNode->deviceObject.service); + return HdfServiceObserverPublishService(&(devNode->hostService->observer), devNode->servName, + devNode->devId, devNode->policy, (struct HdfObject *)devNode->deviceObject.service); } -static int HdfDeviceNodePublishService( - struct HdfDeviceNode *devNode, const struct HdfDeviceInfo *deviceInfo, struct IHdfDevice *device) +static int HdfDeviceNodePublishService(struct HdfDeviceNode *devNode) { int status = HDF_SUCCESS; struct IDeviceNode *nodeIf = NULL; - (void)device; - if ((deviceInfo->policy == SERVICE_POLICY_NONE) || - ((deviceInfo->svcName != NULL) && (strlen(deviceInfo->svcName) == 0))) { - HDF_LOGI("policy is %d", SERVICE_POLICY_NONE); + if (devNode->policy == SERVICE_POLICY_NONE || + (devNode->servName != NULL && strlen(devNode->servName) == 0)) { return status; } nodeIf = &devNode->super; - if ((deviceInfo->policy == SERVICE_POLICY_PUBLIC) || - (deviceInfo->policy == SERVICE_POLICY_CAPACITY)) { + if (devNode->policy == SERVICE_POLICY_PUBLIC || devNode->policy == SERVICE_POLICY_CAPACITY) { if (nodeIf->PublishService != NULL) { - status = nodeIf->PublishService(devNode, deviceInfo->svcName); + status = nodeIf->PublishService(devNode); } } if (status == HDF_SUCCESS) { - status = HdfDeviceNodePublishLocalService(devNode, deviceInfo); + status = HdfDeviceNodePublishLocalService(devNode); } return status; } -int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode, struct IHdfDevice *devInst) +int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode) { - struct HdfDevice *device = (struct HdfDevice *)devInst; - struct HdfDriverEntry *driverEntry = NULL; - const struct HdfDeviceInfo *deviceInfo = NULL; - struct IHdfDeviceToken *deviceToken = NULL; + const struct HdfDriverEntry *driverEntry = NULL; int ret; - if (device == NULL || devNode == NULL) { + if (devNode == NULL) { HDF_LOGE("failed to launch service, device or service is null"); return HDF_ERR_INVALID_PARAM; } - driverEntry = devNode->driverEntry; - deviceInfo = devNode->deviceInfo; - if (deviceInfo == NULL) { - HDF_LOGE("failed to launch service, deviceInfo is null"); + HDF_LOGI("launch devnode %s", devNode->servName); + driverEntry = devNode->driver->entry; + if (driverEntry == NULL || driverEntry->Init == NULL) { + HDF_LOGE("failed to launch service, deviceEntry invalid"); return HDF_ERR_INVALID_PARAM; } - if ((driverEntry == NULL) || (driverEntry->Init == NULL)) { - HDF_LOGE("failed to launch service, deviceEntry invalid"); - return HDF_ERR_INVALID_PARAM; + devNode->devStatus = DEVNODE_LAUNCHED; + if (devNode->policy == SERVICE_POLICY_PUBLIC || devNode->policy == SERVICE_POLICY_CAPACITY) { + if (driverEntry->Bind == NULL) { + HDF_LOGE("driver %s bind method is null, ignore device service publish", driverEntry->moduleName); + devNode->devStatus = DEVNODE_NONE; + return HDF_ERR_INVALID_OBJECT; + } + ret = driverEntry->Bind(&devNode->deviceObject); + if (ret != HDF_SUCCESS) { + HDF_LOGE("bind driver %s failed", driverEntry->moduleName); + return HDF_DEV_ERR_DEV_INIT_FAIL; + } } + ret = driverEntry->Init(&devNode->deviceObject); if (ret != HDF_SUCCESS) { return HDF_DEV_ERR_DEV_INIT_FAIL; } - ret = HdfDeviceNodePublishService(devNode, deviceInfo, devInst); + + ret = HdfDeviceNodePublishService(devNode); if (ret != HDF_SUCCESS) { return HDF_DEV_ERR_PUBLISH_FAIL; } - deviceToken = devNode->token; - ret = DevmgrServiceClntAttachDevice(deviceInfo, deviceToken); + + ret = DevmgrServiceClntAttachDevice(devNode->token); if (ret != HDF_SUCCESS) { return HDF_DEV_ERR_ATTACHDEV_FAIL; } @@ -127,19 +129,29 @@ void HdfDeviceNodeRemovePowerStateListener( devNode->powerToken = NULL; } - -int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode, const char *svcName) +int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode) { - if ((devNode == NULL) || (devNode->deviceObject.service == NULL)) { + int ret; + if (devNode == NULL || devNode->deviceObject.service == NULL) { HDF_LOGE("failed to publish public service: devNode is NULL"); return HDF_FAILURE; } - return DevSvcManagerClntAddService(svcName, &devNode->deviceObject); + ret = DevSvcManagerClntAddService(devNode->servName, &devNode->deviceObject); + if (ret == HDF_SUCCESS) { + devNode->servStatus = true; + } + + return ret; } -void HdfDeviceNodeReclaimService(const char *svcName) +int HdfDeviceNodeRemoveService(struct HdfDeviceNode *devNode) { - DevSvcManagerClntRemoveService(svcName); + if (devNode != NULL && devNode->servStatus) { + DevSvcManagerClntRemoveService(devNode->servName); + devNode->servStatus = false; + } + + return HDF_SUCCESS; } void HdfDeviceNodeConstruct(struct HdfDeviceNode *devNode) @@ -150,39 +162,85 @@ void HdfDeviceNodeConstruct(struct HdfDeviceNode *devNode) devNode->token = HdfDeviceTokenNewInstance(); nodeIf->LaunchNode = HdfDeviceLaunchNode; nodeIf->PublishService = HdfDeviceNodePublishPublicService; + nodeIf->RemoveService = HdfDeviceNodeRemoveService; } } -void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode) +void HdfDeviceReleaseNode(struct HdfDeviceNode *devNode) { + const struct HdfDriverEntry *driverEntry = NULL; if (devNode == NULL) { return; } - HdfDeviceTokenFreeInstance(devNode->token); - devNode->token = NULL; - PowerStateTokenFreeInstance(devNode->powerToken); - devNode->powerToken = NULL; -} -struct HdfDeviceNode *HdfDeviceNodeNewInstance() -{ - return (struct HdfDeviceNode *)HdfObjectManagerGetObject(HDF_OBJECT_ID_DEVICE_SERVICE); + if (devNode->driver != NULL) { + driverEntry = devNode->driver->entry; + } + + if (driverEntry != NULL && driverEntry->Release != NULL) { + driverEntry->Release(&devNode->deviceObject); + } + + if (devNode->servStatus) { + HdfDeviceNodeRemoveService(devNode); + DevmgrServiceClntDetachDevice(devNode->devId); + } } -void HdfDeviceNodeFreeInstance(struct HdfDeviceNode *devNode) +void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode) { - HdfObjectManagerFreeObject((struct HdfObject *) devNode); + if (devNode == NULL) { + return; + } + HDF_LOGI("release devnode %s", devNode->servName); + switch (devNode->devStatus) { + case DEVNODE_LAUNCHED: + HdfDeviceReleaseNode(devNode); + HdfDeviceTokenFreeInstance(devNode->token); + devNode->token = NULL; + case DEVNODE_INITED: // fall-through + PowerStateTokenFreeInstance(devNode->powerToken); + devNode->powerToken = NULL; + OsalMemFree(devNode->servName); + devNode->servName = NULL; + break; + case DEVNODE_NONE: + break; + default: + break; + } } -void HdfDeviceNodeDelete(struct HdfDeviceNode *devNode) +struct HdfDeviceNode *HdfDeviceNodeNewInstance(const struct HdfDeviceInfo *deviceInfo, struct HdfDriver *driver) { + struct HdfDeviceNode *devNode = NULL; + if (deviceInfo == NULL) { + return NULL; + } + devNode = (struct HdfDeviceNode *)HdfObjectManagerGetObject(HDF_OBJECT_ID_DEVICE_SERVICE); if (devNode == NULL) { - return; + return NULL; } - if (devNode->driverEntry->Release != NULL) { - devNode->driverEntry->Release(&devNode->deviceObject); + devNode->driver = driver; + devNode->devId = deviceInfo->deviceId; + devNode->permission = deviceInfo->permission; + devNode->policy = deviceInfo->policy; + devNode->token->devid = deviceInfo->deviceId; + devNode->servName = HdfStringCopy(deviceInfo->svcName); + if (devNode->servName == NULL) { + return NULL; + } + devNode->deviceObject.property = HcsGetNodeByMatchAttr(HdfGetRootNode(), deviceInfo->deviceMatchAttr); + devNode->deviceObject.priv = (void *)(deviceInfo->private); + if (devNode->deviceObject.property == NULL) { + HDF_LOGD("node %s property empty, match attr: %s", deviceInfo->moduleName, deviceInfo->deviceMatchAttr); } - HdfDeviceNodeFreeInstance(devNode); + devNode->devStatus = DEVNODE_INITED; + return devNode; } +void HdfDeviceNodeFreeInstance(struct HdfDeviceNode *devNode) +{ + HdfObjectManagerFreeObject((struct HdfObject *)devNode); +} diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index 6ab710031..8e44d6d35 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -9,6 +9,7 @@ #include "hdf_device_object.h" #include "hdf_base.h" #include "hdf_device_node.h" +#include "devhost_service.h" #include "hdf_log.h" #include "hdf_observer_record.h" #include "hdf_service_observer.h" @@ -19,12 +20,10 @@ int32_t HdfDeviceSubscribeService( struct HdfDeviceObject *deviceObject, const char *serviceName, struct SubscriberCallback callback) { - uint32_t matchId; struct DevHostService *hostService = NULL; - const struct HdfDeviceInfo *deviceInfo = NULL; struct HdfDeviceNode *devNode = NULL; if (deviceObject == NULL || serviceName == NULL) { - HDF_LOGE("failed to subscribe service, deviceObject/serviceName is null"); + HDF_LOGE("failed to subscribe service, serviceName is null"); return HDF_FAILURE; } devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( @@ -34,31 +33,20 @@ int32_t HdfDeviceSubscribeService( HDF_LOGE("failed to subscribe service, hostService is null"); return HDF_FAILURE; } - deviceInfo = devNode->deviceInfo; - if (deviceInfo == NULL) { - HDF_LOGE("failed to subscribe service, deviceInfo is null"); - return HDF_FAILURE; - } - matchId = HdfMakeHardwareId(deviceInfo->hostId, deviceInfo->deviceId); - return HdfServiceObserverSubscribeService(&hostService->observer, serviceName, matchId, callback); + + return HdfServiceObserverSubscribeService(&hostService->observer, serviceName, devNode->devId, callback); } const char *HdfDeviceGetServiceName(const struct HdfDeviceObject *deviceObject) { struct HdfDeviceNode *devNode = NULL; - const struct HdfDeviceInfo *deviceInfo = NULL; if (deviceObject == NULL) { HDF_LOGE("failed to get service name, deviceObject is invalid"); return NULL; } devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); - deviceInfo = devNode->deviceInfo; - if (deviceInfo == NULL) { - HDF_LOGE("failed to get service name, deviceInfo is null"); - return NULL; - } - return deviceInfo->svcName; + return devNode->servName; } int HdfPmRegisterPowerListener(struct HdfDeviceObject *deviceObject, const struct IPowerEventListener *listener) @@ -134,7 +122,7 @@ void HdfPmSetMode(struct HdfDeviceObject *deviceObject, uint32_t mode) bool HdfDeviceSetClass(struct HdfDeviceObject *deviceObject, DeviceClass deviceClass) { if ((deviceObject == NULL) || (deviceClass >= DEVICE_CLASS_MAX) || - (deviceClass < DEVICE_CLASS_DEFAULT)) { + (deviceClass >= DEVICE_CLASS_MAX)) { return false; } deviceObject->deviceClass = deviceClass; diff --git a/core/host/src/hdf_driver_loader.c b/core/host/src/hdf_driver_loader.c index 98cfbee6c..14e4d2040 100755 --- a/core/host/src/hdf_driver_loader.c +++ b/core/host/src/hdf_driver_loader.c @@ -17,82 +17,52 @@ #define HDF_LOG_TAG driver_loader -struct HdfDeviceNode *HdfDriverLoaderLoadNode( - struct IDriverLoader *loader, const struct HdfDeviceInfo *deviceInfo) +int32_t HdfDriverEntryConstruct() { + int i; struct HdfDriverEntry *driverEntry = NULL; - struct HdfDeviceNode *devNode = NULL; - if ((loader == NULL) || (loader->GetDriverEntry == NULL)) { - HDF_LOGE("failed to load node, loader is invalid"); - return NULL; - } - - driverEntry = loader->GetDriverEntry(deviceInfo); - if (driverEntry == NULL) { - HDF_LOGE("failed to load node, deviceEntry is null"); - return NULL; - } + size_t *addrBegin = NULL; + int32_t count = 0; - devNode = HdfDeviceNodeNewInstance(); - if (devNode == NULL) { - HDF_LOGE("failed to load node, device node is null"); - return NULL; + count = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); + if (count <= 0) { + HDF_LOGE("%s: no hdf driver exist", __func__); + return HDF_FAILURE; } - devNode->driverEntry = driverEntry; - devNode->deviceInfo = deviceInfo; - devNode->deviceObject.property = HcsGetNodeByMatchAttr(HdfGetRootNode(), deviceInfo->deviceMatchAttr); - devNode->deviceObject.priv = (void *)(deviceInfo->private); - if (devNode->deviceObject.property == NULL) { - HDF_LOGW("failed to load node, property is null, match attr is: %s", deviceInfo->deviceMatchAttr); - } - - if ((deviceInfo->policy == SERVICE_POLICY_PUBLIC) || (deviceInfo->policy == SERVICE_POLICY_CAPACITY)) { - if (driverEntry->Bind == NULL) { - HDF_LOGE("driver bind method is null"); - HdfDeviceNodeFreeInstance(devNode); - return NULL; - } - if (driverEntry->Bind(&devNode->deviceObject) != 0) { - HDF_LOGE("bind driver failed"); - HdfDeviceNodeFreeInstance(devNode); - return NULL; + addrBegin = (size_t *)(HDF_DRIVER_BEGIN()); + for (i = 0; i < count; i++) { + driverEntry = (struct HdfDriverEntry *)(*addrBegin); + if (HdfRegisterDriverEntry(driverEntry) != HDF_SUCCESS) { + HDF_LOGE("failed to register driver %s, skip and try another", driverEntry ? driverEntry->moduleName : ""); + continue; } + addrBegin++; } - return devNode; + return HDF_SUCCESS; } -void HdfDriverLoaderUnLoadNode(struct IDriverLoader *loader, const struct HdfDeviceInfo *deviceInfo) +struct HdfDriver *HdfDriverLoaderGetDriver(const char *moduleName) { - struct HdfDriverEntry *driverEntry = NULL; - struct HdfDeviceObject *deviceObject = NULL; - if ((loader == NULL) || (loader->GetDriverEntry == NULL)) { - HDF_LOGE("failed to unload service, loader invalid"); - return; + if (moduleName == NULL) { + HDF_LOGE("%s: failed to get device entry, moduleName is NULL", __func__); + return NULL; } - driverEntry = loader->GetDriverEntry(deviceInfo); - if (driverEntry == NULL) { - HDF_LOGE("failed to unload service, driverEntry is null"); - return; - } - if (driverEntry->Release == NULL) { - HDF_LOGI("device release func is null"); - return; - } - deviceObject = DevSvcManagerClntGetDeviceObject(deviceInfo->svcName); - if (deviceObject != NULL) { - driverEntry->Release(deviceObject); - } + return HdfDriverManagerGetDriver(moduleName); +} + +void HdfDriverLoaderReclaimDriver(struct HdfDriver *driver) +{ + // kernel driver do not need release + (void)driver; } void HdfDriverLoaderConstruct(struct HdfDriverLoader *inst) { if (inst != NULL) { - struct IDriverLoader *driverLoaderIf = (struct IDriverLoader *)inst; - driverLoaderIf->LoadNode = HdfDriverLoaderLoadNode; - driverLoaderIf->UnLoadNode = HdfDriverLoaderUnLoadNode; - driverLoaderIf->GetDriverEntry = HdfDriverLoaderGetDriverEntry; + inst->super.GetDriver = HdfDriverLoaderGetDriver; + inst->super.ReclaimDriver = HdfDriverLoaderReclaimDriver; } } @@ -101,6 +71,9 @@ struct HdfObject *HdfDriverLoaderCreate() static bool isDriverLoaderInit = false; static struct HdfDriverLoader driverLoader; if (!isDriverLoaderInit) { + if (HdfDriverEntryConstruct() != HDF_SUCCESS) { + return NULL; + } HdfDriverLoaderConstruct(&driverLoader); isDriverLoaderInit = true; } diff --git a/core/host/src/hdf_observer_record.c b/core/host/src/hdf_observer_record.c index 574afecdd..e30e7b531 100644 --- a/core/host/src/hdf_observer_record.c +++ b/core/host/src/hdf_observer_record.c @@ -14,11 +14,6 @@ #define HDF_LOG_TAG observer_record #define HALF_INT_LEN 16 -uint32_t HdfMakeHardwareId(uint16_t hostId, uint16_t deviceId) -{ - return ((uint32_t)hostId << HALF_INT_LEN) | deviceId; -} - struct HdfServiceObserverRecord *HdfServiceObserverRecordObtain(uint32_t serviceKey) { struct HdfServiceObserverRecord *observerRecord = @@ -59,7 +54,7 @@ bool HdfServiceObserverRecordCompare(struct HdfSListNode *listEntry, uint32_t se } void HdfServiceObserverRecordNotifySubscribers( - struct HdfServiceObserverRecord *record, uint32_t matchId, uint16_t policy) + struct HdfServiceObserverRecord *record, uint32_t devId, uint16_t policy) { struct HdfSListIterator it; if (record == NULL) { @@ -72,7 +67,7 @@ void HdfServiceObserverRecordNotifySubscribers( while (HdfSListIteratorHasNext(&it)) { struct HdfServiceSubscriber *subscriber = (struct HdfServiceSubscriber *)HdfSListIteratorNext(&it); - if ((matchId == subscriber->matchId) || (policy != SERVICE_POLICY_PRIVATE)) { + if (devId == subscriber->devId || policy != SERVICE_POLICY_PRIVATE) { subscriber->state = HDF_SUBSCRIBER_STATE_READY; if (subscriber->callback.OnServiceConnected != NULL) { subscriber->callback.OnServiceConnected(subscriber->callback.deviceObject, record->publisher); diff --git a/core/host/src/hdf_service_observer.c b/core/host/src/hdf_service_observer.c index 29aa1555c..ed79a9649 100644 --- a/core/host/src/hdf_service_observer.c +++ b/core/host/src/hdf_service_observer.c @@ -36,7 +36,7 @@ void HdfServiceObserverDestruct(struct HdfServiceObserver *observer) } int HdfServiceObserverSubscribeService(struct HdfServiceObserver *observer, - const char *svcName, uint32_t matchId, struct SubscriberCallback callback) + const char *svcName, devid_t devid, struct SubscriberCallback callback) { struct HdfServiceObserverRecord *serviceRecord = NULL; struct HdfServiceSubscriber *subscriber = NULL; @@ -53,7 +53,7 @@ int HdfServiceObserverSubscribeService(struct HdfServiceObserver *observer, HDF_LOGE("failed to subscribe service, serviceRecord is null"); return HDF_FAILURE; } - subscriber = HdfServiceSubscriberObtain(callback, matchId); + subscriber = HdfServiceSubscriberObtain(callback, devid); if (subscriber == NULL) { HDF_LOGE("failed to subscribe service, subscriber is null"); HdfServiceObserverRecordRecycle(serviceRecord); @@ -63,7 +63,7 @@ int HdfServiceObserverSubscribeService(struct HdfServiceObserver *observer, HdfSListAdd(&observer->services, &serviceRecord->entry); OsalMutexUnlock(&observer->observerMutex); } else { - subscriber = HdfServiceSubscriberObtain(callback, matchId); + subscriber = HdfServiceSubscriberObtain(callback, devid); if (subscriber == NULL) { HDF_LOGE("failed to subscribe service, subscriber obtain null"); return HDF_FAILURE; @@ -72,7 +72,7 @@ int HdfServiceObserverSubscribeService(struct HdfServiceObserver *observer, if ((serviceRecord->publisher != NULL) && (subscriber->callback.OnServiceConnected != NULL) && ((serviceRecord->policy != SERVICE_POLICY_PRIVATE) || - (serviceRecord->matchId == matchId))) { + (serviceRecord->devId == devid))) { subscriber->state = HDF_SUBSCRIBER_STATE_READY; subscriber->callback.OnServiceConnected(subscriber->callback.deviceObject, serviceRecord->publisher); } @@ -83,7 +83,7 @@ int HdfServiceObserverSubscribeService(struct HdfServiceObserver *observer, } int HdfServiceObserverPublishService(struct HdfServiceObserver *observer, - const char *svcName, uint32_t matchId, uint16_t policy, struct HdfObject *service) + const char *svcName, uint32_t devId, uint16_t policy, struct HdfObject *service) { struct HdfServiceObserverRecord *serviceRecord = NULL; uint32_t serviceKey = HdfStringMakeHashKey(svcName, 0); @@ -100,14 +100,14 @@ int HdfServiceObserverPublishService(struct HdfServiceObserver *observer, return HDF_FAILURE; } serviceRecord->publisher = service; - serviceRecord->matchId = matchId; + serviceRecord->devId = devId; serviceRecord->policy = policy; OsalMutexLock(&observer->observerMutex); HdfSListAdd(&observer->services, &serviceRecord->entry); OsalMutexUnlock(&observer->observerMutex); } else { serviceRecord->publisher = service; - HdfServiceObserverRecordNotifySubscribers(serviceRecord, matchId, policy); + HdfServiceObserverRecordNotifySubscribers(serviceRecord, devId, policy); } return HDF_SUCCESS; } diff --git a/core/host/src/hdf_service_subscriber.c b/core/host/src/hdf_service_subscriber.c index efcec2f4f..6aa3ffd2a 100644 --- a/core/host/src/hdf_service_subscriber.c +++ b/core/host/src/hdf_service_subscriber.c @@ -7,15 +7,16 @@ */ #include "hdf_service_subscriber.h" +#include "hdf_device.h" #include "osal_mem.h" -struct HdfServiceSubscriber *HdfServiceSubscriberObtain(struct SubscriberCallback callback, uint32_t matchId) +struct HdfServiceSubscriber *HdfServiceSubscriberObtain(struct SubscriberCallback callback, devid_t devid) { struct HdfServiceSubscriber *serviceSubscriber = (struct HdfServiceSubscriber *)OsalMemCalloc(sizeof(struct HdfServiceSubscriber)); if (serviceSubscriber != NULL) { serviceSubscriber->state = HDF_SUBSCRIBER_STATE_PENDING; - serviceSubscriber->matchId = matchId; + serviceSubscriber->devId = devid; serviceSubscriber->callback = callback; } return serviceSubscriber; diff --git a/core/manager/src/devmgr_service.c b/core/manager/src/devmgr_service.c index e11da3ed7..741cbf3a6 100644 --- a/core/manager/src/devmgr_service.c +++ b/core/manager/src/devmgr_service.c @@ -33,7 +33,7 @@ static int DevmgrServiceActiveDevice(struct DevHostServiceClnt *hostClnt, } return ret; } else if (!isLoad && (deviceInfo->preload != DEVICE_PRELOAD_DISABLE)) { - devHostSvcIf->DelDevice(devHostSvcIf, deviceInfo); + devHostSvcIf->DelDevice(devHostSvcIf, deviceInfo->deviceId); deviceInfo->preload = DEVICE_PRELOAD_DISABLE; return HDF_SUCCESS; } else { @@ -117,7 +117,7 @@ static struct DevHostServiceClnt *DevmgrServiceFindDeviceHost(struct IDevmgrServ return NULL; } -static void DevmgrServiceUpdateStatus(struct DevHostServiceClnt *hostClnt, uint16_t deviceId, uint16_t status) +static void DevmgrServiceUpdateStatus(struct DevHostServiceClnt *hostClnt, devid_t devId, uint16_t status) { struct HdfSListIterator it; struct HdfDeviceInfo *deviceInfo = NULL; @@ -125,27 +125,23 @@ static void DevmgrServiceUpdateStatus(struct DevHostServiceClnt *hostClnt, uint1 HdfSListIteratorInit(&it, hostClnt->deviceInfos); while (HdfSListIteratorHasNext(&it)) { deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&it); - if (deviceInfo->deviceId == deviceId) { + if (deviceInfo->deviceId == devId) { deviceInfo->status = status; HDF_LOGD("%s host:%s %u device:%s %u status:%u", __func__, hostClnt->hostName, - hostClnt->hostId, deviceInfo->svcName, deviceId, deviceInfo->status); + hostClnt->hostId, deviceInfo->svcName, devId, deviceInfo->status); return; } } - HDF_LOGE("%s: not find device %u in host %u", __func__, deviceId, hostClnt->hostId); + HDF_LOGE("%s: not find device %u in host %u", __func__, devId, hostClnt->hostId); return; } -static int DevmgrServiceAttachDevice( - struct IDevmgrService *inst, const struct HdfDeviceInfo *deviceInfo, struct IHdfDeviceToken *token) +static int DevmgrServiceAttachDevice(struct IDevmgrService *inst, struct IHdfDeviceToken *token) { struct DevHostServiceClnt *hostClnt = NULL; struct DeviceTokenClnt *tokenClnt = NULL; - if (deviceInfo == NULL) { - HDF_LOGE("failed to attach device, deviceInfo is null"); - return HDF_FAILURE; - } - hostClnt = DevmgrServiceFindDeviceHost(inst, deviceInfo->hostId); + + hostClnt = DevmgrServiceFindDeviceHost(inst, HOSTID(token->devid)); if (hostClnt == NULL) { HDF_LOGE("failed to attach device, hostClnt is null"); return HDF_FAILURE; @@ -156,12 +152,39 @@ static int DevmgrServiceAttachDevice( return HDF_FAILURE; } - tokenClnt->deviceInfo = deviceInfo; - DevmgrServiceUpdateStatus(hostClnt, deviceInfo->deviceId, HDF_SERVICE_USABLE); + DevmgrServiceUpdateStatus(hostClnt, token->devid, HDF_SERVICE_USABLE); HdfSListAdd(&hostClnt->devices, &tokenClnt->node); return HDF_SUCCESS; } +static bool HdfSListHostSearchDeviceTokenComparer(struct HdfSListNode *tokenNode, uint32_t devid) +{ + struct DeviceTokenClnt *tokenClnt = CONTAINER_OF(tokenNode, struct DeviceTokenClnt, node); + return tokenClnt->tokenIf->devid == devid; +} + +static int DevmgrServiceDetachDevice(struct IDevmgrService *inst, devid_t devid) +{ + struct DevHostServiceClnt *hostClnt = NULL; + struct DeviceTokenClnt *tokenClnt = NULL; + struct HdfSListNode *tokenClntNode = NULL; + + hostClnt = DevmgrServiceFindDeviceHost(inst, HOSTID(devid)); + if (hostClnt == NULL) { + HDF_LOGE("failed to attach device, hostClnt is null"); + return HDF_FAILURE; + } + tokenClntNode = HdfSListSearch(&hostClnt->devices, devid, HdfSListHostSearchDeviceTokenComparer); + if (tokenClntNode == NULL) { + HDF_LOGE("devmgr detach device %x not found", devid); + return HDF_DEV_ERR_NO_DEVICE; + } + tokenClnt = CONTAINER_OF(tokenClntNode, struct DeviceTokenClnt, node); + DevmgrServiceUpdateStatus(hostClnt, devid, HDF_SERVICE_UNUSABLE); + HdfSListRemove(&hostClnt->devices, &tokenClnt->node); + return HDF_SUCCESS; +} + static int DevmgrServiceAttachDeviceHost( struct IDevmgrService *inst, uint16_t hostId, struct IDevHostService *hostService) { @@ -281,6 +304,7 @@ bool DevmgrServiceConstruct(struct DevmgrService *inst) devMgrSvcIf = (struct IDevmgrService *)inst; if (devMgrSvcIf != NULL) { devMgrSvcIf->AttachDevice = DevmgrServiceAttachDevice; + devMgrSvcIf->DetachDevice = DevmgrServiceDetachDevice; devMgrSvcIf->AttachDeviceHost = DevmgrServiceAttachDeviceHost; devMgrSvcIf->StartService = DevmgrServiceStartService; devMgrSvcIf->PowerStateChange = DevmgrServicePowerStateChange; @@ -323,7 +347,7 @@ void DevmgrServiceRelease(struct HdfObject *object) } DLIST_FOR_EACH_ENTRY_SAFE(hostClnt, hostClntTmp, &devmgrService->hosts, struct DevHostServiceClnt, node) { DListRemove(&hostClnt->node); - DevHostServiceClntDelete(hostClnt); + DevHostServiceClntDelete(hostClnt); } OsalMutexDestroy(&devmgrService->devMgrMutex); diff --git a/core/manager/src/driver_manager.c b/core/manager/src/driver_manager.c new file mode 100644 index 000000000..548095598 --- /dev/null +++ b/core/manager/src/driver_manager.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_dlist.h" +#include "hdf_driver.h" +#include "hdf_log.h" +#include "osal_mem.h" + +static struct DListHead *HdfDriverHead() +{ + static struct DListHead driverHead = { 0 }; + if (driverHead.next == NULL) { + DListHeadInit(&driverHead); + } + + return &driverHead; +} + +int32_t HdfRegisterDriverEntry(const struct HdfDriverEntry *entry) +{ + struct HdfDriver *newDriver = NULL; + + if (entry == NULL || entry->moduleName == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + newDriver = OsalMemCalloc(sizeof(struct HdfDriver)); + if (newDriver == NULL) { + return HDF_DEV_ERR_NO_MEMORY; + } + + newDriver->entry = entry; + + DListInsertTail(&newDriver->node, HdfDriverHead()); + + return HDF_SUCCESS; +} + +int32_t HdfUnregisterDriverEntry(const struct HdfDriverEntry *entry) +{ + struct DListHead *driverHead = NULL; + struct HdfDriver *driver = NULL; + struct HdfDriver *tmp = NULL; + + if (entry == NULL || entry->moduleName == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + driverHead = HdfDriverHead(); + DLIST_FOR_EACH_ENTRY_SAFE(driver, tmp, driverHead, struct HdfDriver, node) + { + if (driver->entry == entry) { + DListRemove(&driver->node); + OsalMemFree(driver); + break; + } + } + + return HDF_SUCCESS; +} + +int32_t HdfRegisterDriver(struct HdfDriver *driver) +{ + if (driver == NULL || driver->entry == NULL || driver->entry->moduleName == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + DListInsertTail(&driver->node, HdfDriverHead()); + return HDF_SUCCESS; +} + +int32_t HdfUnregisterDriver(struct HdfDriver *driver) +{ + struct DListHead *driverHead = NULL; + struct HdfDriver *it = NULL; + struct HdfDriver *tmp = NULL; + + if (driver == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + driverHead = HdfDriverHead(); + DLIST_FOR_EACH_ENTRY_SAFE(it, tmp, driverHead, struct HdfDriver, node) + { + if (it == driver) { + DListRemove(&it->node); + break; + } + } + + return HDF_SUCCESS; +} + +struct HdfDriver *HdfDriverManagerGetDriver(const char *driverName) +{ + struct DListHead *driverHead = NULL; + struct HdfDriver *driver = NULL; + + if (driverName == NULL) { + return NULL; + } + + driverHead = HdfDriverHead(); + DLIST_FOR_EACH_ENTRY(driver, driverHead, struct HdfDriver, node) { + if (driver->entry != NULL && driver->entry->moduleName != NULL && + !strcmp(driver->entry->moduleName, driverName)) { + return driver; + } + } + HDF_LOGE("%s:driver %s not found", __func__, driverName); + return NULL; +} + +struct DListHead *HdfDriverManagerGetDriverList() +{ + return HdfDriverHead(); +} diff --git a/core/shared/include/devhost_service_if.h b/core/shared/include/devhost_service_if.h index a1c226915..2a4513e94 100644 --- a/core/shared/include/devhost_service_if.h +++ b/core/shared/include/devhost_service_if.h @@ -9,13 +9,14 @@ #ifndef DEVHOST_SERVICE_IF_H #define DEVHOST_SERVICE_IF_H +#include "hdf_device.h" #include "hdf_device_info.h" #include "hdf_object.h" struct IDevHostService { struct HdfObject object; int (*AddDevice)(struct IDevHostService *hostService, const struct HdfDeviceInfo *devInfo); - int (*DelDevice)(struct IDevHostService *hostService, const struct HdfDeviceInfo *devInfo); + int (*DelDevice)(struct IDevHostService *hostService, devid_t devId); int (*StartService)(struct IDevHostService *hostService); int (*PmNotify)(struct IDevHostService *service, uint32_t powerState); }; diff --git a/core/shared/include/device_token_if.h b/core/shared/include/device_token_if.h index c086152ce..586f66e9f 100644 --- a/core/shared/include/device_token_if.h +++ b/core/shared/include/device_token_if.h @@ -10,9 +10,11 @@ #define DEVICE_TOKEN_IF_H #include "hdf_object.h" +#include "hdf_device.h" struct IHdfDeviceToken { struct HdfObject object; + devid_t devid; }; #endif /* DEVICE_TOKEN_IF_H */ diff --git a/core/shared/include/devmgr_service_if.h b/core/shared/include/devmgr_service_if.h index 55df8e426..08ad1395d 100644 --- a/core/shared/include/devmgr_service_if.h +++ b/core/shared/include/devmgr_service_if.h @@ -19,7 +19,8 @@ struct IDevmgrService { struct HdfObject base; struct HdfDeviceObject object; int (*AttachDeviceHost)(struct IDevmgrService *, uint16_t, struct IDevHostService *); - int (*AttachDevice)(struct IDevmgrService *, const struct HdfDeviceInfo *, struct IHdfDeviceToken *); + int (*AttachDevice)(struct IDevmgrService *, struct IHdfDeviceToken *); + int (*DetachDevice)(struct IDevmgrService *, devid_t); int (*StartService)(struct IDevmgrService *); int (*PowerStateChange)(struct IDevmgrService *, enum HdfPowerState pEvent); }; diff --git a/core/shared/include/hdf_driver.h b/core/shared/include/hdf_driver.h new file mode 100644 index 000000000..1190e995a --- /dev/null +++ b/core/shared/include/hdf_driver.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_DRIVER_H +#define HDF_DRIVER_H + +#include "hdf_device_desc.h" +#include "hdf_dlist.h" + +struct HdfDriver { + const struct HdfDriverEntry *entry; + uint16_t type; + uint16_t bus; + struct DListHead node; + void *priv; +}; + +int32_t HdfRegisterDriverEntry(const struct HdfDriverEntry *entry); +int32_t HdfUnregisterDriverEntry(const struct HdfDriverEntry *entry); +int32_t HdfRegisterDriver(struct HdfDriver *driver); +int32_t HdfUnregisterDriver(struct HdfDriver *driver); +struct HdfDriver *HdfDriverManagerGetDriver(const char *driverName); +struct DListHead *HdfDriverManagerGetDriverList(void); + +#endif // HDF_DRIVER_H \ No newline at end of file diff --git a/test/unittest/manager/sample_driver_test.c b/test/unittest/manager/sample_driver_test.c index 609787660..9ea1434bf 100644 --- a/test/unittest/manager/sample_driver_test.c +++ b/test/unittest/manager/sample_driver_test.c @@ -26,20 +26,23 @@ void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) int32_t SampleDriverRegisterDevice(struct HdfSBuf *data) { + const char *moduleName = NULL; + const char *serviceName = NULL; + struct HdfDeviceObject *devObj = NULL; if (data == NULL) { return HDF_FAILURE; } - const char *moduleName = HdfSbufReadString(data); + moduleName = HdfSbufReadString(data); if (moduleName == NULL) { return HDF_FAILURE; } - const char *serviceName = HdfSbufReadString(data); + serviceName = HdfSbufReadString(data); if (serviceName == NULL) { return HDF_FAILURE; } - struct HdfDeviceObject *devObj = HdfRegisterDevice(moduleName, serviceName, NULL); + devObj = HdfRegisterDevice(moduleName, serviceName, NULL); if (devObj == NULL) { return HDF_FAILURE; } @@ -48,15 +51,17 @@ int32_t SampleDriverRegisterDevice(struct HdfSBuf *data) int32_t SampleDriverUnregisterDevice(struct HdfSBuf *data) { + const char *moduleName = NULL; + const char *serviceName = NULL; if (data == NULL) { return HDF_FAILURE; } - const char *moduleName = HdfSbufReadString(data); + moduleName = HdfSbufReadString(data); if (moduleName == NULL) { return HDF_FAILURE; } - const char *serviceName = HdfSbufReadString(data); + serviceName = HdfSbufReadString(data); if (serviceName == NULL) { return HDF_FAILURE; } @@ -71,11 +76,12 @@ int32_t SampleDriverSendEvent(struct HdfDeviceIoClient *client, int id, struct H int32_t SampleDriverPowerStateInject(uint32_t powerState) { + int ret; struct IDevmgrService *devmgrService = DevmgrServiceGetInstance(); if (devmgrService == NULL || devmgrService->PowerStateChange == NULL) { return HDF_ERR_INVALID_OBJECT; } - int ret = devmgrService->PowerStateChange(devmgrService, powerState); + ret = devmgrService->PowerStateChange(devmgrService, powerState); HDF_LOGI("%s: inject power state(%d) done, ret = %d", __func__, powerState, ret); return ret; @@ -83,11 +89,11 @@ int32_t SampleDriverPowerStateInject(uint32_t powerState) int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) { + uint32_t powerState = 0; int32_t ret = HDF_SUCCESS; if (reply == NULL || client == NULL) { return HDF_FAILURE; } - uint32_t powerState = 0; switch (cmdId) { case SAMPLE_DRIVER_REGISTER_DEVICE: { ret = SampleDriverRegisterDevice(data); @@ -118,15 +124,16 @@ int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) { - HDF_LOGD("%s::enter", __func__); - if (deviceObject == NULL) { - return HDF_FAILURE; - } static struct IDeviceIoService testService = { .Dispatch = SampleDriverDispatch, .Open = NULL, .Release = NULL, }; + HDF_LOGD("%s::enter", __func__); + if (deviceObject == NULL) { + return HDF_FAILURE; + } + deviceObject->service = &testService; return HDF_SUCCESS; } @@ -162,6 +169,8 @@ struct SampleDriverPmListener { int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) { + static struct SampleDriverPmListener pmListener = {0}; + int ret; HDF_LOGI("%s::enter!", __func__); if (deviceObject == NULL) { HDF_LOGE("%s::ptr is null!", __func__); @@ -169,13 +178,12 @@ int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) } HDF_LOGD("%s:Init success", __func__); - static struct SampleDriverPmListener pmListener = {0}; pmListener.powerListener.DozeResume = HdfSampleDozeResume; pmListener.powerListener.DozeSuspend = HdfSampleDozeSuspend; pmListener.powerListener.Resume = HdfSampleResume; pmListener.powerListener.Suspend = HdfSampleSuspend; - int ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); + ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); HDF_LOGI("%s:register power listener, ret = %d", __func__, ret); return HDF_SUCCESS; diff --git a/utils/include/hdf_cstring.h b/utils/include/hdf_cstring.h index 8e261c5f2..a2374f300 100644 --- a/utils/include/hdf_cstring.h +++ b/utils/include/hdf_cstring.h @@ -23,6 +23,7 @@ struct HdfCString { uint32_t HdfStringMakeHashKey(const char *key, uint32_t mask); struct HdfCString *HdfCStringObtain(const char *str); void HdfCStringRecycle(struct HdfCString *inst); +char *HdfStringCopy(const char *src); #ifdef __cplusplus } diff --git a/utils/src/hdf_cstring.c b/utils/src/hdf_cstring.c index cdba3fdf7..a5d503fd8 100644 --- a/utils/src/hdf_cstring.c +++ b/utils/src/hdf_cstring.c @@ -54,3 +54,27 @@ void HdfCStringRecycle(struct HdfCString *inst) OsalMemFree(inst); } } + +char *HdfStringCopy(const char *src) +{ + char *newStr = NULL; + size_t srcSize; + size_t dstSize; + + if (src == NULL) { + return NULL; + } + srcSize = strlen(src); + dstSize = srcSize + 1; + newStr = OsalMemAlloc(dstSize); + if (newStr == NULL) { + return NULL; + } + + if (strncpy_s(newStr, dstSize, src, srcSize) != EOK) { + OsalMemFree(newStr); + newStr = NULL; + } + + return newStr; +} -- Gitee From 4c9c1c22b03f3f2c41da4467d8039adc2262d0f6 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 16 Nov 2021 08:52:40 +0000 Subject: [PATCH 174/272] Fix Input Issue Signed-off-by: YOUR_NAME --- model/input/driver/hdf_touch.c | 2 +- model/input/driver/hdf_touch.h | 2 +- model/input/driver/touchscreen/touch_ft6336.c | 2 +- model/input/driver/touchscreen/touch_gt911.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/model/input/driver/hdf_touch.c b/model/input/driver/hdf_touch.c index b12ebcf9e..5d8dd00d6 100644 --- a/model/input/driver/hdf_touch.c +++ b/model/input/driver/hdf_touch.c @@ -346,7 +346,7 @@ static int32_t DeviceBindDriver(ChipDevice *chipDev) return HDF_SUCCESS; } -int32_t RegisterChipDevice(ChipDevice *chipDev) +int32_t RegisterTouchChipDevice(ChipDevice *chipDev) { int32_t ret; InputDevice *inputDev = NULL; diff --git a/model/input/driver/hdf_touch.h b/model/input/driver/hdf_touch.h index f8ed6ce5c..248273d43 100644 --- a/model/input/driver/hdf_touch.h +++ b/model/input/driver/hdf_touch.h @@ -107,6 +107,6 @@ typedef struct { const char *cmdValue; } InputExtraCmd; -int32_t RegisterChipDevice(ChipDevice *chipDev); +int32_t RegisterTouchChipDevice(ChipDevice *chipDev); #endif diff --git a/model/input/driver/touchscreen/touch_ft6336.c b/model/input/driver/touchscreen/touch_ft6336.c index 8742debab..422439d2a 100644 --- a/model/input/driver/touchscreen/touch_ft6336.c +++ b/model/input/driver/touchscreen/touch_ft6336.c @@ -197,7 +197,7 @@ static int32_t HdfFocalChipInit(struct HdfDeviceObject *device) chipDev->chipName = chipCfg->chipName; chipDev->vendorName = chipCfg->vendorName; - if (RegisterChipDevice(chipDev) != HDF_SUCCESS) { + if (RegisterTouchChipDevice(chipDev) != HDF_SUCCESS) { goto EXIT1; } HDF_LOGI("%s: exit succ, chipName = %s", __func__, chipCfg->chipName); diff --git a/model/input/driver/touchscreen/touch_gt911.c b/model/input/driver/touchscreen/touch_gt911.c index fb3f5e96f..9092f2acb 100644 --- a/model/input/driver/touchscreen/touch_gt911.c +++ b/model/input/driver/touchscreen/touch_gt911.c @@ -292,7 +292,7 @@ static int32_t HdfGoodixChipInit(struct HdfDeviceObject *device) chipDev->chipName = chipCfg->chipName; chipDev->vendorName = chipCfg->vendorName; - if (RegisterChipDevice(chipDev) != HDF_SUCCESS) { + if (RegisterTouchChipDevice(chipDev) != HDF_SUCCESS) { goto EXIT1; } HDF_LOGI("%s: exit succ, chipName = %s", __func__, chipCfg->chipName); -- Gitee From ef42dc4638cd4a3b5f02e41797646dfda2222040 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Tue, 16 Nov 2021 18:31:56 +0800 Subject: [PATCH 175/272] rename of plat_log.h Signed-off-by: haizhouyang --- support/platform/include/adc/adc_core.h | 1 + support/platform/include/fwk/platform_core.h | 1 + support/platform/include/fwk/{plat_log.h => platform_log.h} | 0 support/platform/include/i2c/i2c_core.h | 1 + support/platform/include/i3c/i3c_core.h | 1 + support/platform/src/adc/adc_core.c | 1 - support/platform/src/gpio/gpio_core.c | 1 - support/platform/src/i2c/i2c_core.c | 1 - support/platform/src/rtc/rtc_base.c | 2 +- test/unittest/platform/virtual/i3c_virtual.c | 1 - 10 files changed, 5 insertions(+), 5 deletions(-) rename support/platform/include/fwk/{plat_log.h => platform_log.h} (100%) diff --git a/support/platform/include/adc/adc_core.h b/support/platform/include/adc/adc_core.h index e0e47b521..c6890dfdd 100644 --- a/support/platform/include/adc/adc_core.h +++ b/support/platform/include/adc/adc_core.h @@ -12,6 +12,7 @@ #include "osal_spinlock.h" #include "hdf_base.h" #include "adc_if.h" +#include "platform_core.h" #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/include/fwk/platform_core.h b/support/platform/include/fwk/platform_core.h index bd1203ea8..e09996c83 100644 --- a/support/platform/include/fwk/platform_core.h +++ b/support/platform/include/fwk/platform_core.h @@ -12,6 +12,7 @@ #include "hdf_base.h" #include "platform_device.h" +#include "platform_log.h" #include "platform_errno.h" #include "platform_manager.h" #include "platform_queue.h" diff --git a/support/platform/include/fwk/plat_log.h b/support/platform/include/fwk/platform_log.h similarity index 100% rename from support/platform/include/fwk/plat_log.h rename to support/platform/include/fwk/platform_log.h diff --git a/support/platform/include/i2c/i2c_core.h b/support/platform/include/i2c/i2c_core.h index 0e5d513ac..d53a484a1 100644 --- a/support/platform/include/i2c/i2c_core.h +++ b/support/platform/include/i2c/i2c_core.h @@ -12,6 +12,7 @@ #include "hdf_base.h" #include "i2c_if.h" #include "osal_mutex.h" +#include "platform_core.h" #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/include/i3c/i3c_core.h b/support/platform/include/i3c/i3c_core.h index dd356321a..24b135221 100644 --- a/support/platform/include/i3c/i3c_core.h +++ b/support/platform/include/i3c/i3c_core.h @@ -14,6 +14,7 @@ #include "hdf_base.h" #include "hdf_dlist.h" #include "osal_spinlock.h" +#include "platform_core.h" #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/src/adc/adc_core.c b/support/platform/src/adc/adc_core.c index 5392d960a..f53fecae6 100644 --- a/support/platform/src/adc/adc_core.c +++ b/support/platform/src/adc/adc_core.c @@ -13,7 +13,6 @@ #include "osal_spinlock.h" #include "osal_time.h" #include "platform_core.h" -#include "plat_log.h" #define HDF_LOG_TAG adc_core_c #define LOCK_WAIT_SECONDS_M 1 diff --git a/support/platform/src/gpio/gpio_core.c b/support/platform/src/gpio/gpio_core.c index 39b763614..3703ba2ba 100644 --- a/support/platform/src/gpio/gpio_core.c +++ b/support/platform/src/gpio/gpio_core.c @@ -9,7 +9,6 @@ #include "gpio/gpio_core.h" #include "hdf_log.h" #include "osal_mem.h" -#include "plat_log.h" #include "platform_core.h" #include "securec.h" diff --git a/support/platform/src/i2c/i2c_core.c b/support/platform/src/i2c/i2c_core.c index 7a2aa86c8..357ba7bdc 100644 --- a/support/platform/src/i2c/i2c_core.c +++ b/support/platform/src/i2c/i2c_core.c @@ -12,7 +12,6 @@ #include "osal_mem.h" #include "osal_time.h" #include "platform_core.h" -#include "plat_log.h" #define HDF_LOG_TAG i2c_core #define LOCK_WAIT_SECONDS_M 1 diff --git a/support/platform/src/rtc/rtc_base.c b/support/platform/src/rtc/rtc_base.c index 25be00507..e975babd5 100644 --- a/support/platform/src/rtc/rtc_base.c +++ b/support/platform/src/rtc/rtc_base.c @@ -8,7 +8,7 @@ #include "rtc_base.h" #include "hdf_log.h" -#include "plat_log.h" +#include "platform_core.h" #define HDF_LOG_TAG rtc_base diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c index 8811810cd..8987b6f52 100644 --- a/test/unittest/platform/virtual/i3c_virtual.c +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -15,7 +15,6 @@ #include "osal_mem.h" #include "osal_spinlock.h" #include "osal_time.h" -#include "plat_log.h" #define HDF_LOG_TAG i3c_virtual -- Gitee From f4f234a77f5789b515365cd8a76932271b300ceb Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Tue, 16 Nov 2021 17:24:27 +0800 Subject: [PATCH 176/272] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- include/platform/pin_if.h | 27 +++-- include/platform/regulator_if.h | 3 +- model/storage/src/mtd/mtd_core.c | 5 +- support/platform/include/i3c/i3c_core.h | 4 +- .../include/regulator/regulator_core.h | 34 +++--- .../include/regulator/regulator_tree_mgr.h | 6 +- support/platform/src/hdmi/hdmi_edid.c | 103 ++++++++++-------- support/platform/src/i3c/i3c_core.c | 3 +- support/platform/src/pin/pin_core.c | 24 ++-- support/platform/src/pin/pin_if.c | 2 - .../platform/src/regulator/regulator_core.c | 27 ++--- support/platform/src/regulator/regulator_if.c | 2 - .../src/regulator/regulator_tree_mgr.c | 11 +- .../test/unittest/common/hdf_pin_test.cpp | 42 +------ test/unittest/platform/common/i3c_test.c | 4 +- test/unittest/platform/common/pin_test.c | 48 ++++---- test/unittest/platform/common/pwm_test.c | 2 +- .../unittest/platform/common/regulator_test.c | 21 ++-- .../unittest/platform/common/regulator_test.h | 9 +- .../platform/hdf_regulator_entry_test.c | 1 - test/unittest/platform/virtual/i3c_virtual.c | 4 +- .../platform/virtual/regulator_virtual.c | 88 +++++++++------ 22 files changed, 239 insertions(+), 231 deletions(-) diff --git a/include/platform/pin_if.h b/include/platform/pin_if.h index 74c816ac3..b42e71aa2 100644 --- a/include/platform/pin_if.h +++ b/include/platform/pin_if.h @@ -31,9 +31,9 @@ extern "C" { * @since 1.0 */ enum PinPullType { - PIN_PULL_NONE = 0, /*< SET PIN SUSPEND >*/ - PIN_PULL_UP = 1, /*< SET PIN RESISTANCE UP >*/ - PIN_PULL_DOWN = 2, /*< SET PIN RESISTANCE DOWN >*/ + PIN_PULL_NONE = 0, /**< SET PIN SUSPEND. */ + PIN_PULL_UP = 1, /**< SET PIN RESISTANCE UP. */ + PIN_PULL_DOWN = 2, /**< SET PIN RESISTANCE DOWN. */ }; /** * @brief Obtains the handle of a pin. @@ -42,7 +42,8 @@ enum PinPullType { * * @param pinName Indicates the pin which you want to setting properties. * - * @return Returns the pointer to the {@link DevHandle} of the pin controller which to get a pin if the operation is successful; + * @return Returns the pointer to the {@link DevHandle} of the pin controller which + * to get a pin if the operation is successful; * returns NULL otherwise. * @since 1.0 */ @@ -67,7 +68,8 @@ void PinPut(DevHandle handle); * @param handle Indicates the pointer to the device handle of the pin. * @param pullType Indicates the type of pin pull. * - * @return Returns 0 if set the pin Pull configuration operation is successfully; Returns a negative value otherwise. + * @return Returns 0 if set the pin Pull configuration operation is successfully; + * Returns a negative value otherwise. * @since 1.0 */ int32_t PinSetPull(DevHandle handle, enum PinPullType pullType); @@ -79,7 +81,8 @@ int32_t PinSetPull(DevHandle handle, enum PinPullType pullType); * * @param handle Indicates the pointer to the device handle of the pin. * @param pullType Indicates the pointer of the Pin Pull Type. - * @return Returns 0 if get the pin Pull configuration operation is successfully; Returns a negative value otherwise. + * @return Returns 0 if get the pin Pull configuration operation is successfully; + * Returns a negative value otherwise. * @since 1.0 */ int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType); @@ -91,7 +94,8 @@ int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType); * @param handle Indicates the pointer to the device handle of the pin. * @param strength Indicates the value of pin strength. * - * @return Returns 0 if set the pin strength configuration operation is successfully; Returns a negative value otherwise. + * @return Returns 0 if set the pin strength configuration operation is successfully; + * Returns a negative value otherwise. * @since 1.0 */ int32_t PinSetStrength(DevHandle handle, uint32_t strength); @@ -103,7 +107,8 @@ int32_t PinSetStrength(DevHandle handle, uint32_t strength); * * @param handle Indicates the pointer to the device handle of the pin. * @param strength Indicates the pointer of the Pin strength value. - * @return Returns 0 if get the pin strength configuration operation is successfully; Returns a negative value otherwise. + * @return Returns 0 if get the pin strength configuration operation is successfully; + * Returns a negative value otherwise. * @since 1.0 */ int32_t PinGetStrength(DevHandle handle, uint32_t *strength); @@ -115,7 +120,8 @@ int32_t PinGetStrength(DevHandle handle, uint32_t *strength); * * @param handle Indicates the pointer to the device handle of the pin description. * @param funcName Indicates the pointer of the pin function. - * @return Returns 0 if set the pin function configuration operation is successfully; returns a negative value otherwise. + * @return Returns 0 if set the pin function configuration operation is successfully; + * returns a negative value otherwise. * @since 1.0 */ int32_t PinSetFunc(DevHandle handle, const char *funcName); @@ -127,7 +133,8 @@ int32_t PinSetFunc(DevHandle handle, const char *funcName); * * @param handle Indicates the pointer to the device handle of the pin description. * @param funcName Indicates the double pointer of the pin function. - * @return Returns 0 if get the pin function configuration operation is successfully; returns a negative value otherwise. + * @return Returns 0 if get the pin function configuration operation is successfully; + * returns a negative value otherwise. * @since 1.0 */ int32_t PinGetFunc(DevHandle handle, const char **funcName); diff --git a/include/platform/regulator_if.h b/include/platform/regulator_if.h index d40091382..cd1617f1c 100755 --- a/include/platform/regulator_if.h +++ b/include/platform/regulator_if.h @@ -79,7 +79,8 @@ int32_t RegulatorDisable(DevHandle handle); * @param handle Represents a pointer to the regulator handle, which is obtained through {@ link RegulatorOpen}. * @return 0 If the regulator disable successfully; Otherwise, a negative value is returned. * - * @attention No matter whether the status of the regulator is alwayson or the status of the child is enable, the regulator is disabled. + * @attention No matter whether the status of the regulator is alwayson or the status of the child is enable, + * the regulator is disabled. * * @since 1.0 */ diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 7b60d843a..a53158816 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -207,7 +207,8 @@ static void MtdDumpBuf(uint8_t *buf, size_t len) #define MTD_DUMP_LINE_LEN 32 #define MTD_DUMP_BUF_LEN (MTD_DUMP_LINE_LEN * MTD_DUMP_SIGLE_WIDTH + 1) char lineBuf[MTD_DUMP_BUF_LEN]; - for (idx = 0; idx < len;) { + idx = 0; + while (idx < len) { line = (MTD_DUMP_LINE_LEN <= (len - idx)) ? MTD_DUMP_LINE_LEN : (len - idx); for (i = 0, lidx = 0; i < line; i++, lidx += MTD_DUMP_SIGLE_WIDTH, buf++) { ret = snprintf_s(lineBuf + lidx, MTD_DUMP_SIGLE_WIDTH + 1, MTD_DUMP_SIGLE_WIDTH, "%02x", *buf); @@ -381,7 +382,7 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc dataLenLeft = msg->withOob ? (msg->len / (mtdDevice->writeSize + mtdDevice->oobSize)) * mtdDevice->writeSize : msg->len; - for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity;) { + for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity; ) { if (MtdDeviceIsBadBlockUnlocked(mtdDevice, addr)) { if (!msg->skipBad) { HDF_LOGE("%s: failed on bad block @0x%jx", __func__, addr); diff --git a/support/platform/include/i3c/i3c_core.h b/support/platform/include/i3c/i3c_core.h index dd356321a..64d9de82b 100644 --- a/support/platform/include/i3c/i3c_core.h +++ b/support/platform/include/i3c/i3c_core.h @@ -59,8 +59,8 @@ extern "C" { (addr == I3C_RESERVED_ADDR_7H76) || (addr == I3C_RESERVED_ADDR_7H78) || \ (addr == I3C_RESERVED_ADDR_7H79) || (addr == I3C_RESERVED_ADDR_7H7A) || \ (addr == I3C_RESERVED_ADDR_7H7B) || (addr == I3C_RESERVED_ADDR_7H7C) || \ - (addr == I3C_RESERVED_ADDR_7H7D) || (addr == I3C_RESERVED_ADDR_7H7D) || \ - (addr == I3C_RESERVED_ADDR_7H7F)) ? I3C_ADDR_RESERVED : I3C_ADDR_FREE;}) \ + (addr == I3C_RESERVED_ADDR_7H7D) || (addr == I3C_RESERVED_ADDR_7H7E) || \ + (addr == I3C_RESERVED_ADDR_7H7F)) ? I3C_ADDR_RESERVED : I3C_ADDR_FREE;}) struct I3cCntlr; struct I3cMethod; diff --git a/support/platform/include/regulator/regulator_core.h b/support/platform/include/regulator/regulator_core.h index 8c9a0e550..a46c6f6d2 100755 --- a/support/platform/include/regulator/regulator_core.h +++ b/support/platform/include/regulator/regulator_core.h @@ -21,11 +21,13 @@ extern "C" { #endif #endif /* __cplusplus */ -//#define REGULATOR_PRINTK_OPEN 1 #ifdef REGULATOR_PRINTK_OPEN -#define REGULATOR_PRINT_LOG_DBG(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) -#define REGULATOR_PRINT_LOG_INF(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) -#define REGULATOR_PRINT_LOG_ERR(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_PRINT_LOG_DBG(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_PRINT_LOG_INF(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_PRINT_LOG_ERR(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) #else #define REGULATOR_PRINT_LOG_DBG(fmt, arg...) HDF_LOGD_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) #define REGULATOR_PRINT_LOG_INF(fmt, arg...) HDF_LOGI_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) @@ -104,45 +106,45 @@ struct RegulatorMethod { int32_t (*getStatus)(struct RegulatorNode *node, uint32_t *status); }; -/** +/** * @brief Find and return a regulator controller by regulator info * @param info Indicates regulator info. * @return a regulator controller */ struct RegulatorNode *RegulatorNodeOpen(const char *name); int32_t RegulatorNodeClose(struct RegulatorNode *node); -/** +/** * @brief add a regulator controller to manager list * @param node Indicates a regulator controller. * @constraints: first add parent, then add child * @return success or fail */ int32_t RegulatorNodeAdd(struct RegulatorNode *node); -/** +/** * @brief remove all regulator controllers * @param * @return success or fail */ int32_t RegulatorNodeRemoveAll(void); -/** +/** * @brief enable a regulator * @param node Indicates a regulator controller. * @return success or fail */ int32_t RegulatorNodeEnable(struct RegulatorNode *node); -/** +/** * @brief disable a regulator if it's downstream node all close, if alwayson is true,forbid disable * @param node Indicates a regulator controller. * @return success or fail */ int32_t RegulatorNodeDisable(struct RegulatorNode *node); -/** +/** * @brief disable a regulator regardless of whether there is an downstream node * @param node Indicates a regulator controller. * @return success or fail */ int32_t RegulatorNodeForceDisable(struct RegulatorNode *node); -/** +/** * @brief set regulator voltage * @param node Indicates a regulator controller. * @param minUv min voltage @@ -150,14 +152,14 @@ int32_t RegulatorNodeForceDisable(struct RegulatorNode *node); * @return success or fail */ int32_t RegulatorNodeSetVoltage(struct RegulatorNode *node, uint32_t minUv, uint32_t maxUv); -/** +/** * @brief get regulator voltage * @param node Indicates a regulator controller. * @param voltage regulator voltage * @return success or fail */ int32_t RegulatorNodeGetVoltage(struct RegulatorNode *node, uint32_t *voltage); -/** +/** * @brief set regulator current * @param node Indicates a regulator controller. * @param minUa min current @@ -165,21 +167,21 @@ int32_t RegulatorNodeGetVoltage(struct RegulatorNode *node, uint32_t *voltage); * @return success or fail */ int32_t RegulatorNodeSetCurrent(struct RegulatorNode *node, uint32_t minUA, uint32_t maxUA); -/** +/** * @brief get regulator current * @param node Indicates a regulator controller. * @param current regulator current * @return success or fail */ int32_t RegulatorNodeGetCurrent(struct RegulatorNode *node, uint32_t *current); -/** +/** * @brief get regulator status * @param node Indicates a regulator controller. * @param status regulator status,enable or disable * @return success or fail */ int32_t RegulatorNodeGetStatus(struct RegulatorNode *node, uint32_t *status); -/** +/** * @brief register regulator's callback when it's status change * @param node Indicates a regulator controller. * @param cb callback function diff --git a/support/platform/include/regulator/regulator_tree_mgr.h b/support/platform/include/regulator/regulator_tree_mgr.h index 5d71483a3..035d9cfc5 100755 --- a/support/platform/include/regulator/regulator_tree_mgr.h +++ b/support/platform/include/regulator/regulator_tree_mgr.h @@ -21,13 +21,13 @@ extern "C" { #endif /* __cplusplus */ struct RegulatorChildNode { - struct RegulatorNode * child; + struct RegulatorNode *child; struct DListHead node; }; struct RegulatorTreeInfo { const char *name; /* regulator name */ - struct RegulatorNode * parent; /* regulator parent info */ + struct RegulatorNode *parent; /* regulator parent info */ struct DListHead node; struct DListHead childHead; /* child regulator list */ }; @@ -42,7 +42,7 @@ int RegulatorTreeManagerDestory(void); int RegulatorTreeNodeRemoveAll(void); int RegulatorTreeSet(const char *name, struct RegulatorNode *child, struct RegulatorNode *parent); void RegulatorTreePrint(void); -struct RegulatorNode * RegulatorTreeGetParent(const char *name); +struct RegulatorNode *RegulatorTreeGetParent(const char *name); int32_t RegulatorTreeChildForceDisable(struct RegulatorNode *node); bool RegulatorTreeIsAllChildDisable(const char *name); diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index 7dd5d34d6..db789d436 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -1026,8 +1026,62 @@ static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapabili } } +static void HdmiEdidDolbyCapVersionZeroPhase(struct HdmiSinkDeviceCapability *sinkCap,uint8_t *data) +{ + sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT2_MARK) ? true : false; + sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & + HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_6] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.redY = (data[UINT8_ARRAY_TElEMENT_5] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_7] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenX = ((data[UINT8_ARRAY_TElEMENT_8] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_9] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.greenY = (data[UINT8_ARRAY_TElEMENT_8] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_10] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueX = ((data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_12] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.blueY = (data[UINT8_ARRAY_TElEMENT_11] & + HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_13] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteX = ((data[UINT8_ARRAY_TElEMENT_14] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_15] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.whiteY = (data[UINT8_ARRAY_TElEMENT_14] & HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_16] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_17] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT) | + (data[UINT8_ARRAY_TElEMENT_18] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.maxLuminance = (data[UINT8_ARRAY_TElEMENT_17] & HDMI_LOWER_NIBBLE_MARK) | + (data[UINT8_ARRAY_TElEMENT_19] << HDMI_NIBBLE_SHIFT); + sinkCap->dolbyCap.dMajorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_UPPER_NIBBLE_MARK) >> + HDMI_NIBBLE_SHIFT; + sinkCap->dolbyCap.dMinorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_LOWER_NIBBLE_MARK); +} + +static void HdmiEdidDolbyCapVersionOnePhase(struct HdmiSinkDeviceCapability *sinkCap,uint8_t *data) +{ + sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> + HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; + sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.maxLuminance = ((data[UINT8_ARRAY_TElEMENT_5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.colorimetry = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT0_MARK) ? true : false; + sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); + sinkCap->dolbyCap.redX = data[UINT8_ARRAY_TElEMENT_8]; + sinkCap->dolbyCap.redY = data[UINT8_ARRAY_TElEMENT_9]; + sinkCap->dolbyCap.greenX = data[UINT8_ARRAY_TElEMENT_10]; + sinkCap->dolbyCap.greenY = data[UINT8_ARRAY_TElEMENT_11]; + sinkCap->dolbyCap.blueX = data[UINT8_ARRAY_TElEMENT_12]; + sinkCap->dolbyCap.blueY = data[UINT8_ARRAY_TElEMENT_13]; +} + static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability *sinkCap, - uint8_t *data, uint8_t len) + uint8_t *data, + uint8_t len) { uint32_t oui; @@ -1047,54 +1101,11 @@ static void HdmiEdidExtUseExtDataBlockVsvdbPhase(struct HdmiSinkDeviceCapability sinkCap->dolbyCap.yuv422 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT0_MARK) ? true : false; sinkCap->dolbyCap.b2160p60 = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT1_MARK) ? true : false; if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_0) { - sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT2_MARK) ? true : false; - sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & - HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_6] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.redY = (data[UINT8_ARRAY_TElEMENT_5] & - HDMI_LOWER_NIBBLE_MARK) | - (data[UINT8_ARRAY_TElEMENT_7] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenX = ((data[UINT8_ARRAY_TElEMENT_8] & HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_9] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.greenY = (data[UINT8_ARRAY_TElEMENT_8] & - HDMI_LOWER_NIBBLE_MARK) | - (data[UINT8_ARRAY_TElEMENT_10] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueX = ((data[UINT8_ARRAY_TElEMENT_11] & HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_12] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.blueY = (data[UINT8_ARRAY_TElEMENT_11] & - HDMI_LOWER_NIBBLE_MARK) | - (data[UINT8_ARRAY_TElEMENT_13] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteX = ((data[UINT8_ARRAY_TElEMENT_14] & HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_15] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.whiteY = (data[UINT8_ARRAY_TElEMENT_14] & HDMI_LOWER_NIBBLE_MARK) | - (data[UINT8_ARRAY_TElEMENT_16] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_17] & HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT) | - (data[UINT8_ARRAY_TElEMENT_18] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.maxLuminance = (data[UINT8_ARRAY_TElEMENT_17] & HDMI_LOWER_NIBBLE_MARK) | - (data[UINT8_ARRAY_TElEMENT_19] << HDMI_NIBBLE_SHIFT); - sinkCap->dolbyCap.dMajorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_UPPER_NIBBLE_MARK) >> - HDMI_NIBBLE_SHIFT; - sinkCap->dolbyCap.dMinorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_LOWER_NIBBLE_MARK); + HdmiEdidDolbyCapVersionZeroPhase(sinkCap, data); return; } if (sinkCap->dolbyCap.version == HDMI_EDID_VSVDB_DOLBY_VERSION_1) { - sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> - HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; - sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_5] & HDMI_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.maxLuminance = ((data[UINT8_ARRAY_TElEMENT_5] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); - sinkCap->dolbyCap.colorimetry = (data[UINT8_ARRAY_TElEMENT_6] & HDMI_BIT0_MARK) ? true : false; - sinkCap->dolbyCap.minLuminance = ((data[UINT8_ARRAY_TElEMENT_6] >> 1) & HDMI_EDID_VSVDB_DOLBY_LOWER_7BIT_MARK); - sinkCap->dolbyCap.redX = data[UINT8_ARRAY_TElEMENT_8]; - sinkCap->dolbyCap.redY = data[UINT8_ARRAY_TElEMENT_9]; - sinkCap->dolbyCap.greenX = data[UINT8_ARRAY_TElEMENT_10]; - sinkCap->dolbyCap.greenY = data[UINT8_ARRAY_TElEMENT_11]; - sinkCap->dolbyCap.blueX = data[UINT8_ARRAY_TElEMENT_12]; - sinkCap->dolbyCap.blueY = data[UINT8_ARRAY_TElEMENT_13]; + HdmiEdidDolbyCapVersionOnePhase(sinkCap, data); } } diff --git a/support/platform/src/i3c/i3c_core.c b/support/platform/src/i3c/i3c_core.c index 12d3f8f41..6bfc64aef 100755 --- a/support/platform/src/i3c/i3c_core.c +++ b/support/platform/src/i3c/i3c_core.c @@ -590,7 +590,7 @@ int32_t I3cCntlrRequestIbi(struct I3cCntlr *cntlr, uint16_t addr, I3cIbiFunc fun } ibi = (struct I3cIbiInfo *)OsalMemCalloc(sizeof(*ibi)); if (ibi == NULL) { - HDF_LOGE("func:%s ibi is NULL!",__func__); + HDF_LOGE("func:%s ibi is NULL!", __func__); return HDF_ERR_MALLOC_FAIL; } ibi->ibiFunc = func; @@ -672,7 +672,6 @@ int32_t I3cCntlrIbiCallback(struct I3cDevice *device) if (device->dynaAddr != 0) { (void)device->ibi->ibiFunc(device->cntlr, device->dynaAddr, *ibiData); OsalMemFree(ibiData); - } else { (void)device->ibi->ibiFunc(device->cntlr, device->addr, *ibiData); OsalMemFree(ibiData); diff --git a/support/platform/src/pin/pin_core.c b/support/platform/src/pin/pin_core.c index 4bfde118b..6b41ebd7d 100644 --- a/support/platform/src/pin/pin_core.c +++ b/support/platform/src/pin/pin_core.c @@ -7,11 +7,7 @@ */ #include "pin_core.h" -#include "hdf_device_desc.h" #include "hdf_log.h" -#include "osal_mem.h" -#include "osal_sem.h" -#include "securec.h" #define HDF_LOG_TAG pin_core @@ -117,7 +113,7 @@ struct PinCntlr *PinCntlrGetByNumber(uint16_t number) list = PinCntlrListGet(); DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { - if(cntlr->number == number) { + if (cntlr->number == number) { PinCntlrListPut(); HDF_LOGI("%s: get cntlr by number success!", __func__); return cntlr; @@ -174,8 +170,7 @@ void PinCntlrPutPin(struct PinDesc *desc) (void)desc; } -int32_t PinCntlrSetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, - enum PinPullType pullType) +int32_t PinCntlrSetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, enum PinPullType pullType) { int32_t ret; uint32_t index; @@ -208,8 +203,7 @@ int32_t PinCntlrSetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, return ret; } -int32_t PinCntlrGetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, - enum PinPullType *pullType) +int32_t PinCntlrGetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, enum PinPullType *pullType) { int32_t ret; uint32_t index; @@ -247,8 +241,7 @@ int32_t PinCntlrGetPinPull(struct PinCntlr *cntlr, struct PinDesc *desc, return ret; } -int32_t PinCntlrSetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, - uint32_t strength) +int32_t PinCntlrSetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, uint32_t strength) { int32_t ret; uint32_t index; @@ -281,8 +274,7 @@ int32_t PinCntlrSetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, return ret; } -int32_t PinCntlrGetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, - uint32_t *strength) +int32_t PinCntlrGetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, uint32_t *strength) { int32_t ret; uint32_t index; @@ -320,8 +312,7 @@ int32_t PinCntlrGetPinStrength(struct PinCntlr *cntlr, struct PinDesc *desc, return ret; } -int32_t PinCntlrSetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, - const char *funcName) +int32_t PinCntlrSetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, const char *funcName) { int32_t ret; uint32_t index; @@ -359,8 +350,7 @@ int32_t PinCntlrSetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, return ret; } -int32_t PinCntlrGetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, - const char **funcName) +int32_t PinCntlrGetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, const char **funcName) { int32_t ret; uint32_t index; diff --git a/support/platform/src/pin/pin_if.c b/support/platform/src/pin/pin_if.c index 2f00840cc..79d282f0e 100644 --- a/support/platform/src/pin/pin_if.c +++ b/support/platform/src/pin/pin_if.c @@ -7,9 +7,7 @@ */ #include "pin_if.h" -#include "devsvc_manager_clnt.h" #include "pin_core.h" -#include "hdf_base.h" #include "hdf_log.h" #define HDF_LOG_TAG pin_if diff --git a/support/platform/src/regulator/regulator_core.c b/support/platform/src/regulator/regulator_core.c index 14493ad33..1ff171977 100755 --- a/support/platform/src/regulator/regulator_core.c +++ b/support/platform/src/regulator/regulator_core.c @@ -38,7 +38,7 @@ struct RegulatorNode *RegulatorNodeOpen(const char *name) } DLIST_FOR_EACH_ENTRY(pos, &manager->regulatorHead, struct RegulatorNode, node) { - if(strcmp(name, pos->regulatorInfo.name) == 0) { + if (strcmp(name, pos->regulatorInfo.name) == 0) { HDF_LOGD("RegulatorNodeOpen:[%s] SUCCESS", name); (void)OsalMutexUnlock(&manager->lock); return pos; @@ -121,10 +121,11 @@ int32_t RegulatorNodeSetParent(struct RegulatorNode *node) HDF_LOGE("%s: the node %s no need to set parent", __func__, node->regulatorInfo.name); return HDF_SUCCESS; } -/********************************** -*1. complete up and down management topology -*2. process alwayson -***********************************/ + +/** + * complete up and down management topology + * process alwayson + */ int32_t RegulatorNodeInitProcess(struct RegulatorNode *node) { CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); @@ -139,7 +140,7 @@ int32_t RegulatorNodeInitProcess(struct RegulatorNode *node) if (node->regulatorInfo.constraints.alwaysOn) { if (node->regulatorInfo.constraints.mode == REGULATOR_CHANGE_CURRENT) { RegulatorNodeSetCurrent(node, node->regulatorInfo.constraints.minUa, node->regulatorInfo.constraints.maxUa); - } else if(node->regulatorInfo.constraints.mode == REGULATOR_CHANGE_VOLTAGE) { + } else if (node->regulatorInfo.constraints.mode == REGULATOR_CHANGE_VOLTAGE) { RegulatorNodeSetVoltage(node, node->regulatorInfo.constraints.minUv, node->regulatorInfo.constraints.maxUv); } RegulatorNodeEnable(node); @@ -244,8 +245,8 @@ int32_t RegulatorNodeEnable(struct RegulatorNode *node) return HDF_ERR_DEVICE_BUSY; } - if((node->regulatorInfo.parentName != NULL) && (strlen(node->regulatorInfo.parentName) > 0)) { - struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if ((node->regulatorInfo.parentName != NULL) && (strlen(node->regulatorInfo.parentName) > 0)) { + struct RegulatorNode *parent = RegulatorTreeGetParent(node->regulatorInfo.name); if (parent == NULL) { (void)OsalMutexUnlock(&node->lock); HDF_LOGE("RegulatorNodeEnable: %s failed", node->regulatorInfo.name); @@ -286,7 +287,7 @@ static int32_t RegulatorNodeDisable(struct RegulatorNode *node) return HDF_ERR_DEVICE_BUSY; } - if(!RegulatorTreeIsAllChildDisable(node->regulatorInfo.name)){ + if (!RegulatorTreeIsAllChildDisable(node->regulatorInfo.name)) { (void)OsalMutexUnlock(&node->lock); HDF_LOGE("RegulatorNodeDisable:there is %s child not disable ", node->regulatorInfo.name); return HDF_FAILURE; @@ -303,8 +304,8 @@ static int32_t RegulatorNodeDisable(struct RegulatorNode *node) HDF_LOGD("RegulatorNodeDisable:disable %s success", node->regulatorInfo.name); // set parent - if(strlen(node->regulatorInfo.parentName) != 0) { - struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if (strlen(node->regulatorInfo.parentName) != 0) { + struct RegulatorNode *parent = RegulatorTreeGetParent(node->regulatorInfo.name); if (parent == NULL) { (void)OsalMutexUnlock(&node->lock); HDF_LOGE("RegulatorNodeDisable: %s failed", node->regulatorInfo.name); @@ -353,8 +354,8 @@ int32_t RegulatorNodeForceDisable(struct RegulatorNode *node) HDF_LOGD(":regulator %s force disable success", node->regulatorInfo.name); // set parent - if(strlen(node->regulatorInfo.parentName) != 0) { - struct RegulatorNode * parent = RegulatorTreeGetParent(node->regulatorInfo.name); + if (strlen(node->regulatorInfo.parentName) != 0) { + struct RegulatorNode *parent = RegulatorTreeGetParent(node->regulatorInfo.name); if (parent == NULL) { (void)OsalMutexUnlock(&node->lock); HDF_LOGE(": %s failed", node->regulatorInfo.name); diff --git a/support/platform/src/regulator/regulator_if.c b/support/platform/src/regulator/regulator_if.c index eede5e363..d59eaa8ed 100755 --- a/support/platform/src/regulator/regulator_if.c +++ b/support/platform/src/regulator/regulator_if.c @@ -6,9 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ #include "regulator_if.h" -#include "devsvc_manager_clnt.h" #include "hdf_log.h" -#include "hdf_base.h" #include "regulator_core.h" DevHandle RegulatorOpen(const char *name) diff --git a/support/platform/src/regulator/regulator_tree_mgr.c b/support/platform/src/regulator/regulator_tree_mgr.c index f3180c422..0a8aa353c 100755 --- a/support/platform/src/regulator/regulator_tree_mgr.c +++ b/support/platform/src/regulator/regulator_tree_mgr.c @@ -39,7 +39,7 @@ void RegulatorChildListDestroy(struct RegulatorTreeInfo *pRegulator) OsalMemFree(nodeInfo); } } -struct RegulatorNode * RegulatorTreeGetParent(const char *name) +struct RegulatorNode *RegulatorTreeGetParent(const char *name) { CHECK_NULL_PTR_RETURN_VALUE(name, NULL); @@ -264,7 +264,7 @@ int RegulatorTreeSet(const char *name, struct RegulatorNode *child, struct Regul } HDF_LOGI("RegulatorTreeSet: set [%s], parent[%s] success!", - name, parent->regulatorInfo.name); + name, parent->regulatorInfo.name); return HDF_SUCCESS; } static void RegulatorTreePrintChild(const char *name, struct DListHead *childHead) @@ -327,7 +327,9 @@ int RegulatorTreeNodeRemoveAll(void) int RegulatorTreeManagerDestory(void) { - RegulatorTreeNodeRemoveAll(); + if (RegulatorTreeNodeRemoveAll() != HDF_SUCCESS) { + HDF_LOGE("func:%s RegulatorTreeNodeRemoveAll failed", __func__); + } struct RegulatorTreeManager *manager = g_regulatorTreeManager; CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); @@ -339,7 +341,8 @@ int RegulatorTreeManagerDestory(void) int RegulatorTreeManagerInit(void) { - struct RegulatorTreeManager * manager = (struct RegulatorTreeManager *)OsalMemCalloc(sizeof(struct RegulatorTreeManager)); + struct RegulatorTreeManager *manager = + (struct RegulatorTreeManager *)OsalMemCalloc(sizeof(struct RegulatorTreeManager)); CHECK_NULL_PTR_RETURN_VALUE(manager, HDF_FAILURE); if (OsalMutexInit(&manager->lock) != HDF_SUCCESS) { diff --git a/support/platform/test/unittest/common/hdf_pin_test.cpp b/support/platform/test/unittest/common/hdf_pin_test.cpp index 321b9b460..0b1ed87cf 100644 --- a/support/platform/test/unittest/common/hdf_pin_test.cpp +++ b/support/platform/test/unittest/common/hdf_pin_test.cpp @@ -31,7 +31,6 @@ void HdfPinTest::SetUpTestCase() struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETUP_ALL, -1}; HdfTestOpenService(); HdfTestSendMsgToService(&msg); - } void HdfPinTest::TearDownTestCase() @@ -39,7 +38,6 @@ void HdfPinTest::TearDownTestCase() struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_TEARDOWN_ALL, -1}; HdfTestSendMsgToService(&msg); HdfTestCloseService(); - } void HdfPinTest::SetUp() @@ -61,19 +59,7 @@ HWTEST_F(HdfPinTest, PinSetGetPull001, TestSize.Level1) struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETGETPULL, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } - -/** - * @tc.name: PinTestGetPinPull001 - * @tc.desc: Pin get pin Pull test - * @tc.type: FUNC - * @tc.require: NA - */ -/*HWTEST_F(HdfPinTest, PinGetPull001, TestSize.Level1) -{ - struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETPULL, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} -*/ + /** * @tc.name: PinTestSetGetStrength001 * @tc.desc: Pin set get pin Strength test @@ -85,19 +71,7 @@ HWTEST_F(HdfPinTest, PinSetGetStrength001, TestSize.Level1) struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_SETGETSTRENGTH, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } - -/** - * @tc.name: PinTestGetStrength001 - * @tc.desc: Pin get pin Strength test - * @tc.type: FUNC - * @tc.require: NA - */ -/*HWTEST_F(HdfPinTest, PinGetStrength001, TestSize.Level1) -{ - struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETSTRENGTH, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} -*/ + /** * @tc.name: PinSetGetPinFunc001 * @tc.desc: Pin set get pin func test @@ -110,18 +84,6 @@ HWTEST_F(HdfPinTest, PinSetGetPinFunc001, TestSize.Level1) EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } -/** - * @tc.name: PinGetPinFunc001 - * @tc.desc: Pin getpinfunc test - * @tc.type: FUNC - * @tc.require: NA - */ -/*HWTEST_F(HdfPinTest, PinGetPinFunc001, TestSize.Level1) -{ - struct HdfTestMsg msg = {TEST_PAL_PIN_TYPE, PIN_TEST_CMD_GETFUNC, -1}; - EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); -} -*/ /** * @tc.name: PinReliabilityTest001 * @tc.desc: Pin function test diff --git a/test/unittest/platform/common/i3c_test.c b/test/unittest/platform/common/i3c_test.c index 49fc7f08f..76c7db094 100644 --- a/test/unittest/platform/common/i3c_test.c +++ b/test/unittest/platform/common/i3c_test.c @@ -190,8 +190,8 @@ int32_t I3cTestTransfer(void *param) { struct I3cTester *tester = NULL; int32_t ret; + tester = I3cTesterGet(); - if (tester == NULL) { HDF_LOGE("%s: Get tester failed!", __func__); *((int32_t *)param) = 1; @@ -444,7 +444,7 @@ int32_t I3cTestReliability(void *param) } config = (struct I3cConfig *)OsalMemCalloc(sizeof(*config)); if (config == NULL) { - HDF_LOGE("func:%s config is NULL!",__func__); + HDF_LOGE("func:%s config is NULL!", __func__); return HDF_ERR_MALLOC_FAIL; } config->busMode = I3C_BUS_HDR_MODE; diff --git a/test/unittest/platform/common/pin_test.c b/test/unittest/platform/common/pin_test.c index 4d3f65286..b513dda8b 100644 --- a/test/unittest/platform/common/pin_test.c +++ b/test/unittest/platform/common/pin_test.c @@ -123,13 +123,13 @@ static int32_t PinSetGetPullTest(void) HDF_LOGE("%s: Pin set pull failed!, pinName:%s", __func__, tester->config.pinName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin set pull success!, PullTypeNum:%d", __func__,tester->config.PullTypeNum); + HDF_LOGI("%s: Pin set pull success!, PullTypeNum:%d", __func__, tester->config.PullTypeNum); ret = PinGetPull(tester->handle, &getPullTypeNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Pin get pull failed!, pinName:%s", __func__, tester->config.pinName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin get pull success!, PullTypeNum:%d", __func__,getPullTypeNum); + HDF_LOGI("%s: Pin get pull success!, PullTypeNum:%d", __func__, getPullTypeNum); if (tester->config.PullTypeNum != getPullTypeNum) { HDF_LOGE("%s: Pin set pull:%d, but Pin get pull:%u", __func__, tester->config.PullTypeNum, getPullTypeNum); } @@ -161,7 +161,8 @@ static int32_t PinSetGetStrengthTest(void) } HDF_LOGI("%s: Pin get pull success!, strengthNum:%d", __func__, getStrengthNum); if (tester->config.strengthNum != getStrengthNum) { - HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d", __func__, tester->config.strengthNum, getStrengthNum); + HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d", + __func__, tester->config.strengthNum, getStrengthNum); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -179,22 +180,23 @@ static int32_t PinSetGetFuncTest(void) } ret = PinSetFunc(tester->handle, (const char *)tester->config.funcNameBuf); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Pin set function failed!, pinName:%s,functionName:%s", __func__, - tester->config.pinName, tester->config.funcNameBuf); + HDF_LOGE("%s: Pin set function failed!, pinName:%s,functionName:%s", + __func__, tester->config.pinName, tester->config.funcNameBuf); return HDF_FAILURE; } - HDF_LOGI("%s: Pin set function success!, pinName:%s,functionName:%s", __func__, - tester->config.pinName, tester->config.funcNameBuf); + HDF_LOGI("%s: Pin set function success!, pinName:%s,functionName:%s", + __func__, tester->config.pinName, tester->config.funcNameBuf); ret = PinGetFunc(tester->handle, &tester->config.funcName); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Pin get function failed!, pinName:%s,functionName:%s", __func__, - tester->config.pinName, tester->config.funcName); + HDF_LOGE("%s: Pin get function failed!, pinName:%s,functionName:%s", + __func__, tester->config.pinName, tester->config.funcName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin get function success!, pinName:%s,functionName:%s", __func__, - tester->config.pinName, tester->config.funcName); + HDF_LOGI("%s: Pin get function success!, pinName:%s,functionName:%s", + __func__, tester->config.pinName, tester->config.funcName); if (strcmp((const char *)tester->config.funcNameBuf, tester->config.funcName) != 0) { - HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", __func__, tester->config.funcNameBuf, tester->config.funcName); + HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", + __func__, tester->config.funcNameBuf, tester->config.funcName); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -216,8 +218,8 @@ int32_t PinTestSetUpAll(void) tester->fails = 0; cfg = &tester->config; - HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", __func__, - cfg->pinName,cfg->PullTypeNum, cfg->strengthNum); + HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", + __func__, cfg->pinName, cfg->PullTypeNum, cfg->strengthNum); ret = PinGetPull(tester->handle , &g_oldPinCfg.pullTypeNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get pullTypeNum failed!", __func__); @@ -260,17 +262,17 @@ int32_t PinTestTearDownAll(void) HDF_LOGE("%s: get tester fail!", __func__); return HDF_ERR_INVALID_OBJECT; } - ret = PinSetPull(tester->handle , g_oldPinCfg.pullTypeNum); + ret = PinSetPull(tester->handle, g_oldPinCfg.pullTypeNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set pullTypeNum failed!", __func__); return ret; } - ret = PinSetStrength(tester->handle , g_oldPinCfg.strengthNum); + ret = PinSetStrength(tester->handle, g_oldPinCfg.strengthNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set strengthNum failed!", __func__); return ret; } - ret = PinSetFunc(tester->handle , g_oldPinCfg.funcName); + ret = PinSetFunc(tester->handle, g_oldPinCfg.funcName); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set funcName failed!", __func__); return ret; @@ -331,7 +333,7 @@ int32_t PinTestExecute(int cmd) uint32_t i; int32_t ret = HDF_ERR_NOT_SUPPORT; - if(cmd > PIN_TEST_CMD_MAX) { + if (cmd > PIN_TEST_CMD_MAX) { HDF_LOGE("%s: invalid cmd:%d", __func__, cmd); ret = HDF_ERR_NOT_SUPPORT; goto __EXIT__; @@ -357,7 +359,10 @@ void PinTestExecuteAll(void) int32_t fails = 0; /* setup env for all test cases */ - (void)PinTestExecute(PIN_TEST_CMD_SETUP_ALL); + ret = PinTestExecute(PIN_TEST_CMD_SETUP_ALL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s PinTestExecute SETUP failed", __func__); + } for (i = 0; i < PIN_TEST_CMD_SETUP_ALL; i++) { ret = PinTestExecute(i); @@ -365,7 +370,10 @@ void PinTestExecuteAll(void) } /* teardown env for all test cases */ - (void)PinTestExecute(PIN_TEST_CMD_TEARDOWN_ALL); + ret = PinTestExecute(PIN_TEST_CMD_TEARDOWN_ALL); + if (ret != HDF_SUCCESS) { + HDF_LOGE("func:%s PinTestExecute TEARDOWN failed", __func__); + } HDF_LOGI("%s: **********PASS:%d FAIL:%d************\n\n", __func__, PIN_TEST_CMD_RELIABILITY + 1 - fails, fails); diff --git a/test/unittest/platform/common/pwm_test.c b/test/unittest/platform/common/pwm_test.c index 3d29a2a6f..d0340de49 100644 --- a/test/unittest/platform/common/pwm_test.c +++ b/test/unittest/platform/common/pwm_test.c @@ -44,7 +44,7 @@ static int32_t PwmSetConfigTest(struct PwmTest *test) HDF_LOGI("%s: enter. Test [PwmSetConfig].", __func__); number = test->cfg.number; - test->cfg.number = ((number > 0) ? 0: TEST_WAVES_NUMBER); + test->cfg.number = ((number > 0) ? 0 : TEST_WAVES_NUMBER); HDF_LOGI("%s: Set number %u.", __func__, test->cfg.number); ret = PwmSetConfig(test->handle, &(test->cfg)); if (ret != HDF_SUCCESS) { diff --git a/test/unittest/platform/common/regulator_test.c b/test/unittest/platform/common/regulator_test.c index 12dcd3a3e..1644497c8 100755 --- a/test/unittest/platform/common/regulator_test.c +++ b/test/unittest/platform/common/regulator_test.c @@ -7,13 +7,9 @@ */ #include "regulator_test.h" -#include #include "device_resource_if.h" -#include "hdf_base.h" #include "hdf_log.h" #include "regulator_if.h" -#include "osal_mem.h" -#include "osal_test_type.h" #include "osal_thread.h" #include "osal_time.h" @@ -24,6 +20,17 @@ struct RegulatorTestFunc { int32_t (*Func)(struct RegulatorTest *test); }; +enum RegulatorVoltage { + VOLTAGE_50_UV = 50, + VOLTAGE_250_UV = 250, + VOLTAGE_2500_UV = 2500, +}; + +enum RegulatorCurrent { + CURRENT_50_UA = 50, + CURRENT_250_UA = 250, +}; + static int32_t RegulatorEnableTest(struct RegulatorTest *test) { if (test == NULL || test->handle == NULL) { @@ -160,7 +167,7 @@ static int RegulatorTestThreadFunc(void *param) return HDF_FAILURE; } - if (RegulatorSetVoltage(handle, 250, 2500) != HDF_SUCCESS) { + if (RegulatorSetVoltage(handle, VOLTAGE_250_UV, VOLTAGE_2500_UV) != HDF_SUCCESS) { HDF_LOGE("%s:test fail", __func__); RegulatorClose(handle); *((int32_t *)param) = 1; @@ -233,8 +240,8 @@ int32_t RegulatorTestReliability(struct RegulatorTest *test) return HDF_ERR_INVALID_OBJECT; } - RegulatorSetVoltage(test->handle, 250, 50); - RegulatorSetCurrent(test->handle, 250, 50); + RegulatorSetVoltage(test->handle, VOLTAGE_250_UV, VOLTAGE_50_UV); + RegulatorSetCurrent(test->handle, CURRENT_250_UA, CURRENT_50_UA); RegulatorGetCurrent(test->handle, NULL); return HDF_SUCCESS; } diff --git a/test/unittest/platform/common/regulator_test.h b/test/unittest/platform/common/regulator_test.h index bd8a7ddd7..48f9d6ad5 100755 --- a/test/unittest/platform/common/regulator_test.h +++ b/test/unittest/platform/common/regulator_test.h @@ -13,9 +13,12 @@ #include "hdf_platform.h" #ifdef REGULATOR_TEST_PRINTK_OPEN -#define REGULATOR_TEST_PRINT_LOG_DBG(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) -#define REGULATOR_TEST_PRINT_LOG_INF(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) -#define REGULATOR_TEST_PRINT_LOG_ERR(fmt, arg...) dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_TEST_PRINT_LOG_DBG(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_TEST_PRINT_LOG_INF(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) +#define REGULATOR_TEST_PRINT_LOG_ERR(fmt, arg...) \ +dprintf("[HDF]-[REGULATOR]:[%s][%d]---" fmt "\r\n", __func__, __LINE__, ##arg) #else #define REGULATOR_TEST_PRINT_LOG_DBG(fmt, arg...) HDF_LOGD_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) #define REGULATOR_TEST_PRINT_LOG_INF(fmt, arg...) HDF_LOGI_WRAPPER("[HDF]-[REGULATOR]:" fmt "\r\n", ##arg) diff --git a/test/unittest/platform/hdf_regulator_entry_test.c b/test/unittest/platform/hdf_regulator_entry_test.c index 4e57cb63f..50c01cf27 100755 --- a/test/unittest/platform/hdf_regulator_entry_test.c +++ b/test/unittest/platform/hdf_regulator_entry_test.c @@ -8,7 +8,6 @@ #include "hdf_regulator_entry_test.h" #include "hdf_log.h" -#include "regulator_if.h" #include "regulator_test.h" #define HDF_LOG_TAG hdf_regulator_entry_test diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c index 8811810cd..f4c9c15f8 100644 --- a/test/unittest/platform/virtual/i3c_virtual.c +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -193,7 +193,7 @@ static void VirtualI3cHotJoin(struct VirtualI3cCntlr *virtual) deviceAddr = VirtualI3cGetIbiDeviceAddr(); device = (struct I3cDevice *)OsalMemCalloc(sizeof(*device)); if (device == NULL) { - HDF_LOGE("func:%s device is NULL!",__func__); + HDF_LOGE("func:%s device is NULL!", __func__); return; } device->cntlr = &virtual->cntlr; @@ -254,7 +254,7 @@ static int32_t I3cIbiHandle(uint32_t irq, void *data) HDF_LOGD("%s: Calling I3cCntlrIbiCallback...", __func__); device = GetDeviceByAddr(&virtual->cntlr, ibiAddr); if (device == NULL) { - HDF_LOGE("func:%s device is NULL!",__func__); + HDF_LOGE("func:%s device is NULL!", __func__); return HDF_ERR_MALLOC_FAIL; } if (device->ibi->payload > VIRTUAL_I3C_TEST_STR_LEN) { diff --git a/test/unittest/platform/virtual/regulator_virtual.c b/test/unittest/platform/virtual/regulator_virtual.c index ff01c9337..aab3ad477 100755 --- a/test/unittest/platform/virtual/regulator_virtual.c +++ b/test/unittest/platform/virtual/regulator_virtual.c @@ -22,15 +22,13 @@ dev ---+-> Regulator-1(voltage) -+-> Regulator-2(voltage) -+-> Regulator-3(volt */ #include "device_resource_if.h" -#include "hdf_device_desc.h" #include "hdf_log.h" -#include "osal_io.h" #include "osal_mem.h" -#include "osal_spinlock.h" #include "regulator/regulator_core.h" -#include "string.h" #define HDF_LOG_TAG regulator_virtual +#define VOLTAGE_2500_UV 2500 +#define CURRENT_2500_UA 2500 static int32_t VirtualRegulatorEnable(struct RegulatorNode *node) { @@ -75,7 +73,7 @@ static int32_t VirtualRegulatorGetVoltage(struct RegulatorNode *node, uint32_t * return HDF_ERR_INVALID_OBJECT; } - *voltage = 2500; + *voltage = VOLTAGE_2500_UV; HDF_LOGD("VirtualRegulatorGetVoltage get %s %d success !\n", node->regulatorInfo.name, *voltage); return HDF_SUCCESS; } @@ -99,7 +97,7 @@ static int32_t VirtualRegulatorGetCurrent(struct RegulatorNode *node, uint32_t * return HDF_ERR_INVALID_OBJECT; } - *current = 2500; + *current = CURRENT_2500_UA; HDF_LOGD("VirtualRegulatorGetCurrent get %s %d success !\n", node->regulatorInfo.name, *current); return HDF_SUCCESS; } @@ -126,13 +124,59 @@ static struct RegulatorMethod g_method = { .getStatus = VirtualRegulatorGetStatus, }; +static int32_t VirtualRegulatorContinueReadHcs(struct RegulatorNode *regNode, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + HDF_LOGD("VirtualRegulatorContinueReadHcs enter:"); + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetString == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "minUv", ®Node->regulatorInfo.constraints.minUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUv fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "maxUv", ®Node->regulatorInfo.constraints.maxUv, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUv fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "minUa", ®Node->regulatorInfo.constraints.minUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read minUa fail!", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "maxUa", ®Node->regulatorInfo.constraints.maxUa, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxUa fail!", __func__); + return HDF_FAILURE; + } + + HDF_LOGD("regulatorInfo:[%s][%d][%d]--[%d][%d]--[%d][%d]!", + regNode->regulatorInfo.name, regNode->regulatorInfo.constraints.alwaysOn, + regNode->regulatorInfo.constraints.mode, + regNode->regulatorInfo.constraints.minUv, regNode->regulatorInfo.constraints.maxUv, + regNode->regulatorInfo.constraints.minUa, regNode->regulatorInfo.constraints.maxUa); + + return HDF_SUCCESS; +} + static int32_t VirtualRegulatorReadHcs(struct RegulatorNode *regNode, const struct DeviceResourceNode *node) { int32_t ret; struct DeviceResourceIface *drsOps = NULL; HDF_LOGD("VirtualRegulatorReadHcs enter:"); - + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); if (drsOps == NULL || drsOps->GetString == NULL) { HDF_LOGE("%s: invalid drs ops fail!", __func__); @@ -160,7 +204,6 @@ static int32_t VirtualRegulatorReadHcs(struct RegulatorNode *regNode, const stru HDF_LOGD("VirtualRegulatorReadHcs:parentName[%s]", regNode->regulatorInfo.parentName); } - HDF_LOGD("VirtualRegulatorReadHcs enter:"); regNode->regulatorInfo.constraints.alwaysOn = drsOps->GetBool(node, "alwaysOn"); HDF_LOGD("VirtualRegulatorReadHcs:alwaysOn[%d]", regNode->regulatorInfo.constraints.alwaysOn); @@ -170,35 +213,10 @@ static int32_t VirtualRegulatorReadHcs(struct RegulatorNode *regNode, const stru return HDF_FAILURE; } - ret = drsOps->GetUint32(node, "minUv", ®Node->regulatorInfo.constraints.minUv, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read minUv fail!", __func__); + if (VirtualRegulatorContinueReadHcs(regNode, node) != HDF_SUCCESS) { return HDF_FAILURE; } - ret = drsOps->GetUint32(node, "maxUv", ®Node->regulatorInfo.constraints.maxUv, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read maxUv fail!", __func__); - return HDF_FAILURE; - } - - ret = drsOps->GetUint32(node, "minUa", ®Node->regulatorInfo.constraints.minUa, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read minUa fail!", __func__); - return HDF_FAILURE; - } - - ret = drsOps->GetUint32(node, "maxUa", ®Node->regulatorInfo.constraints.maxUa, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read maxUa fail!", __func__); - return HDF_FAILURE; - } - - HDF_LOGD("regulatorInfo:[%s][%d][%d]--[%d][%d]--[%d][%d]!", - regNode->regulatorInfo.name, regNode->regulatorInfo.constraints.alwaysOn, regNode->regulatorInfo.constraints.mode, - regNode->regulatorInfo.constraints.minUv, regNode->regulatorInfo.constraints.maxUv, - regNode->regulatorInfo.constraints.minUa, regNode->regulatorInfo.constraints.maxUa); - return HDF_SUCCESS; } @@ -243,7 +261,7 @@ __ERR__: static int32_t VirtualRegulatorInit(struct HdfDeviceObject *device) { - int32_t ret = HDF_SUCCESS; + int32_t ret; const struct DeviceResourceNode *childNode = NULL; if (device == NULL || device->property == NULL) { -- Gitee From babe7be55f10dcfa48b9eb2cf17dfe607167470c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 17 Nov 2021 02:09:50 +0000 Subject: [PATCH 177/272] Description:ut failed about timeout Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- .../wifi/unittest/message/hdf_single_node_message_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c index dc017718f..d79338f91 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c @@ -16,7 +16,7 @@ const uint32_t SEND_MESSAGE_COUNT = 40000; const uint32_t SYNC_MESSAGE_TIMEOUT = 2; -const uint32_t ASYNC_MESSAGE_TIMEOUT = 2; +const uint32_t ASYNC_MESSAGE_TIMEOUT = 5; #define COMMON_SEM_TIMEOUT 300 enum ServiceList { -- Gitee From 2598b3ec55ce3cba05c4f33fa948874d86b6a6f9 Mon Sep 17 00:00:00 2001 From: lzl Date: Wed, 17 Nov 2021 11:51:40 +0000 Subject: [PATCH 178/272] solve SD mount fai problem Signed-off-by: lzl --- model/storage/src/mmc/mmc_core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/model/storage/src/mmc/mmc_core.c b/model/storage/src/mmc/mmc_core.c index b8397ff61..0b8a6d197 100644 --- a/model/storage/src/mmc/mmc_core.c +++ b/model/storage/src/mmc/mmc_core.c @@ -1101,7 +1101,8 @@ ssize_t MmcDeviceRead(struct MmcDevice *mmc, uint8_t *buf, size_t startSec, size } MmcDeviceFillRwInfo(&info, buf, false, curStartSec, readSec); if (mmc->cntlr->detecting == true) { - ret = HDF_FAILURE; + /* In SD device detecting, VFS will read/write SD. */ + ret = MmcSendReadWriteBlocks(mmc->cntlr, &info); } else { cmd.data = &data; MmcSetupReadWriteBlocksCmd(mmc, &cmd, &info); @@ -1146,7 +1147,8 @@ ssize_t MmcDeviceWrite(struct MmcDevice *mmc, uint8_t *buf, size_t startSec, siz } MmcDeviceFillRwInfo(&info, buf, true, curStartSec, writeSec); if (mmc->cntlr->detecting == true) { - ret = HDF_FAILURE; + /* In SD device detecting, VFS will read/write SD. */ + ret = MmcSendReadWriteBlocks(mmc->cntlr, &info); } else { cmd.data = &data; MmcSetupReadWriteBlocksCmd(mmc, &cmd, &info); -- Gitee From d77a97842228226eb5ae90d0b79484219a09e351 Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 18 Nov 2021 14:45:16 +0800 Subject: [PATCH 179/272] modify reviewbots Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_macro_cases.c | 42 +++++++++++-------- tools/hc-gen/src/macro_gen.cpp | 20 +++++---- tools/hc-gen/src/macro_gen.h | 1 - .../test/unittest/common/hdf_config_test.cpp | 1 - 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c index 100d5fca0..04b0ac4b3 100755 --- a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c @@ -6,7 +6,6 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hcs_config_test.h" #include "hdf_macro_test.h" #include "hdf_log.h" #include "hcs_macro.h" @@ -27,6 +26,9 @@ #define BOARD_ID_DATA_SIZE 2 #define MODEM_ID_DATA_SIZE 2 #define BOARD_ID_VALUE 8000 +#define FP_ONE_IDX 0 +#define FP_TWO_IDX 1 +#define FP_THREE_IDX 2 #define CHECK_STRING_EQU(part1, part2) \ if (strcmp(part1, part2)) { \ @@ -44,11 +46,13 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].child.status); #define fp_deal(node) \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ - node##_foreach_child(fp_child_deal); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ - index++; + do { \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ + node##_foreach_child(fp_child_deal); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ + index++; \ + } while (0) #define fp_deal_(node) fp_deal(node) @@ -56,11 +60,13 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].child.status); #define fp_deal_vargs(node, fpArgs, idx) \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ - node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ - idx++; + do { \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ + node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ + idx++; \ + } while (0) #define fp_deal_vargs_(node, fpArgs, idx) fp_deal_vargs(node, fpArgs, idx) @@ -195,7 +201,7 @@ static int TraversalAudio(void) static int TraversalFPFingerInfo(void) { - int index = 0; + int index = FP_ONE_IDX; fp_deal_(HCS_NODE(FP_INFO_NODE, finger_info)); return HDF_SUCCESS; } @@ -218,27 +224,27 @@ static int TraversalFPAudio(void) static int TraversalFPOne(void) { - int index = 0; + int index = FP_ONE_IDX; fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_one)); - index = 0; + index = FP_ONE_IDX; fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_one), fpData, index); return HDF_SUCCESS; } static int TraversalFPTwo(void) { - int index = 1; + int index = FP_TWO_IDX; fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_two)); - index = 1; + index = FP_TWO_IDX; fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_two), fpData, index); return HDF_SUCCESS; } static int TraversalPringerprintThree(void) { - int index = 2; + int index = FP_THREE_IDX; fp_deal_(HCS_NODE(HCS_ROOT, fingerprint_three)); - index = 2; + index = FP_THREE_IDX; fp_deal_vargs_(HCS_NODE(HCS_ROOT, fingerprint_three), fpData, index); return HDF_SUCCESS; } diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index e42896e00..07460d049 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -34,9 +34,9 @@ const std::string &MacroGen::ToUpperString(std::string &str) bool MacroGen::HeaderTopOutput() { ofs_ << FILE_HEAD_COMMENT; - std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); - ofs_ << "#ifndef " << headerMacro << '\n'; - ofs_ << "#define " << headerMacro << '\n'; + std::string defMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << "#ifndef " << defMacro << '\n'; + ofs_ << "#define " << defMacro << '\n'; ofs_ << "\r\n#include \"hdf_base.h\"\n"; return true; @@ -44,8 +44,8 @@ bool MacroGen::HeaderTopOutput() bool MacroGen::HeaderBottomOutput() { - std::string headerMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); - ofs_ << "\n#endif // " << headerMacro << '\n'; + std::string defMacro = std::string().append("HCS_CONFIG_").append(ToUpperString(outFileName_)).append("_HEADER_H"); + ofs_ << "\n#endif // " << defMacro << '\n'; ofs_.close(); return true; } @@ -115,7 +115,8 @@ std::string MacroGen::GenFullName(uint32_t depth, const std::shared_ptr &node) +bool MacroGen::GenArray(const std::string &arrName, uint32_t &arrSize, uint32_t type, + const std::shared_ptr &node) { static uint32_t index = 0; const uint32_t ELEMENT_PER_LINE = 8; @@ -152,14 +153,14 @@ bool MacroGen::GenArray(const std::string &arrName, uint32_t &arrSize, uint32_t bool MacroGen::GenNodeForeach(uint32_t depth, const std::shared_ptr &node) { - std::list subList; + std::list subList; auto child = node->Child(); uint32_t count = 0; Logger().Debug() << "node:" << node->Name() << " child:" << " depth:" << depth; while (child != nullptr) { if (child->IsNode()) { - Logger().Debug() << " " << child->Name(); + Logger().Debug() << " " << child->Name(); subList.push_back(GenFullName(depth + 1, child, "_")); count++; } @@ -223,7 +224,8 @@ bool MacroGen::NodeWalk() static uint32_t arraySize = 0; static uint32_t arrayType = 0; - Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth << " arraySize:" << std::dec << arraySize << '\n'; + Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth + << " arraySize:" << std::dec << arraySize << '\n'; switch (type) { case PARSEROP_UINT8: case PARSEROP_UINT16: diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 8785b94a8..250716b51 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -16,7 +16,6 @@ namespace OHOS { namespace Hardware { - class MacroGen : public Generator { public: explicit MacroGen(std::shared_ptr ast); diff --git a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp index 1a5df911c..e3c0d23e1 100644 --- a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp +++ b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp @@ -767,5 +767,4 @@ HWTEST_F(HdfConfigTest, HslTestMacroTraversalOneFile, TestSize.Level1) printf("HdfConfigTest last enter\n\r"); EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } - }; -- Gitee From 3a51e22291b4a9547451f4222eae79daf8449373 Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 18 Nov 2021 15:35:13 +0800 Subject: [PATCH 180/272] modify reviewbot Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_macro_cases.c | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c index 04b0ac4b3..f83af30b5 100755 --- a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c @@ -46,13 +46,11 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].child.status); #define fp_deal(node) \ - do { \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ - node##_foreach_child(fp_child_deal); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ - index++; \ - } while (0) + CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ + node##_foreach_child(fp_child_deal); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ + index++; #define fp_deal_(node) fp_deal(node) @@ -60,13 +58,11 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].child.status); #define fp_deal_vargs(node, fpArgs, idx) \ - do { \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ - node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ - idx++; \ - } while (0) + CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ + node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ + idx++; #define fp_deal_vargs_(node, fpArgs, idx) fp_deal_vargs(node, fpArgs, idx) -- Gitee From 53105ce5bfdf4051f819fddb7f6b2419984bae9c Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Sun, 21 Nov 2021 15:13:30 +0800 Subject: [PATCH 181/272] Using platform device model on gpio Signed-off-by: haizhouyang --- model/storage/include/mmc/mmc_corex.h | 2 +- model/storage/include/mtd/mtd_core.h | 2 +- model/storage/src/mmc/mmc_core.c | 4 +- model/storage/src/mtd/mtd_core.c | 2 +- support/platform/include/fwk/platform_core.h | 6 +- .../platform/include/fwk/platform_device.h | 96 ++++++++- support/platform/include/fwk/platform_log.h | 5 + .../platform/include/fwk/platform_manager.h | 9 +- support/platform/include/gpio/gpio_core.h | 16 +- support/platform/include/hdmi/hdmi_core.h | 2 +- support/platform/src/fwk/platform_device.c | 97 ++++++++- support/platform/src/fwk/platform_manager.c | 66 ++++-- support/platform/src/gpio/gpio_core.c | 194 ++---------------- support/platform/src/gpio/gpio_if.c | 31 ++- support/platform/src/gpio/gpio_manager.c | 174 ++++++++++++++++ support/platform/src/gpio/gpio_service.c | 101 ++++----- support/platform/src/hdmi/hdmi_core.c | 2 +- 17 files changed, 499 insertions(+), 310 deletions(-) create mode 100644 support/platform/src/gpio/gpio_manager.c diff --git a/model/storage/include/mmc/mmc_corex.h b/model/storage/include/mmc/mmc_corex.h index fbf927522..4cd5f319c 100644 --- a/model/storage/include/mmc/mmc_corex.h +++ b/model/storage/include/mmc/mmc_corex.h @@ -110,7 +110,7 @@ static inline struct MmcCntlr *MmcCntlrGet(struct MmcCntlr *cntlr) static inline struct MmcCntlr *MmcCntlrGetByNr(uint16_t number) { - struct PlatformDevice *device = PlatformManagerGetDeviceByMagic(PlatformManagerGet(PLATFORM_MODULE_MMC), number); + struct PlatformDevice *device = PlatformManagerGetDeviceByNumber(PlatformManagerGet(PLATFORM_MODULE_MMC), number); if (device == NULL) { return NULL; diff --git a/model/storage/include/mtd/mtd_core.h b/model/storage/include/mtd/mtd_core.h index 1e8fd726c..6a384ecf3 100644 --- a/model/storage/include/mtd/mtd_core.h +++ b/model/storage/include/mtd/mtd_core.h @@ -210,7 +210,7 @@ static inline struct MtdDevice *MtdDeviceGet(struct MtdDevice *mtdDevice) */ static inline struct MtdDevice *MtdDeviceGetByNum(int16_t num) { - struct PlatformDevice *device = PlatformManagerGetDeviceByMagic(MtdManagerGet(), num); + struct PlatformDevice *device = PlatformManagerGetDeviceByNumber(MtdManagerGet(), num); if (device != NULL) { return CONTAINER_OF(device, struct MtdDevice, device); diff --git a/model/storage/src/mmc/mmc_core.c b/model/storage/src/mmc/mmc_core.c index b8397ff61..66f2789d2 100644 --- a/model/storage/src/mmc/mmc_core.c +++ b/model/storage/src/mmc/mmc_core.c @@ -235,7 +235,7 @@ static int32_t MmcCntlrInit(struct MmcCntlr *cntlr) cntlr->service.Dispatch = MmcIoDispatch; cntlr->hdfDevObj->service = &(cntlr->service); - cntlr->device.magic = cntlr->index; + cntlr->device.number = cntlr->index; cntlr->device.hdfDev = cntlr->hdfDevObj; return HDF_SUCCESS; } @@ -990,7 +990,7 @@ int32_t MmcDeviceAdd(struct MmcDevice *mmc) HDF_LOGE("MmcDeviceAdd: invalid erase size:%u", mmc->eraseSize); return HDF_ERR_INVALID_PARAM; } - mmc->device.magic = mmc->cntlr->device.magic + MMC_CNTLR_NR_MAX; + mmc->device.number = mmc->cntlr->device.number + MMC_CNTLR_NR_MAX; if (MmcCntlrGet(mmc->cntlr) == NULL) { return HDF_PLT_ERR_DEV_GET; diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index 7b60d843a..300795609 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -135,7 +135,7 @@ int32_t MtdDeviceAdd(struct MtdDevice *mtdDevice) } mtdDevice->device.manager = MtdManagerGet(); - mtdDevice->device.magic = mtdDevice->index; + mtdDevice->device.number = mtdDevice->index; ret = PlatformDeviceAdd(&mtdDevice->device); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: mtd device add fail", __func__); diff --git a/support/platform/include/fwk/platform_core.h b/support/platform/include/fwk/platform_core.h index e09996c83..669d65cb2 100644 --- a/support/platform/include/fwk/platform_core.h +++ b/support/platform/include/fwk/platform_core.h @@ -11,11 +11,13 @@ #include "hdf_base.h" -#include "platform_device.h" #include "platform_log.h" #include "platform_errno.h" -#include "platform_manager.h" #include "platform_queue.h" +#ifndef __USER__ +#include "platform_device.h" +#include "platform_manager.h" +#endif #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/include/fwk/platform_device.h b/support/platform/include/fwk/platform_device.h index 3b25cea81..f25d11053 100644 --- a/support/platform/include/fwk/platform_device.h +++ b/support/platform/include/fwk/platform_device.h @@ -10,6 +10,7 @@ #define PLATFORM_DEVICE_H #include "hdf_base.h" +#include "hdf_device_desc.h" #include "hdf_dlist.h" #include "hdf_sref.h" #include "osal_sem.h" @@ -24,20 +25,24 @@ extern "C" { struct PlatformManager; struct PlatformDevice { - struct HdfDeviceObject *hdfDev; /* releated to an hdf device object */ - struct PlatformManager *manager; /* the platform manager it belongs to */ - uint32_t magic; /* magic number of the device instance */ - const char *name; /* name of the device instance */ - struct HdfSRef ref; /* used for reference count */ - struct DListHead node; /* linked to the list of a manager */ - struct DListHead notifiers; /* list of notifier nodes */ - bool ready; /* indicates whether initialized */ - OsalSpinlock spin; /* for member protection */ - struct OsalSem released; /* for death notification */ + struct HdfDeviceObject *hdfDev; /* releated to a hdf device object */ + struct IDeviceIoService *service; /* releated to a hdf io service object */ + struct PlatformManager *manager; /* the platform manager it belongs to */ + int32_t number; /* number of the device instance */ + const char *name; /* name of the device instance */ + struct HdfSRef ref; /* used for reference count */ + struct DListHead node; /* linked to the list of a manager */ + struct DListHead notifiers; /* list of notifier nodes */ + bool ready; /* indicates whether initialized */ + OsalSpinlock spin; /* for member protection */ + struct OsalSem released; /* for death notification */ + void *priv; /* private data of the device */ }; enum PlatformEventType { - PLAT_EVENT_DEAD = 0, /* a platform device going to die */ + PLAT_EVENT_INIT = 0, /* a platform device already initialized */ + PLAT_EVENT_DEAD = 1, /* a platform device going to die */ + PLAT_EVENT_MAX = 2, }; struct PlatformNotifier { @@ -114,6 +119,17 @@ void PlatformDevicePut(struct PlatformDevice *device); */ int32_t PlatformDeviceRegNotifier(struct PlatformDevice *device, struct PlatformNotifier *notifier); +/** + * @brief Notify a platform event. + * + * @param device Indicates the pointer to the platform device. + * @param event The platform event to notify. + * + * @return Returns 0 if the notify successfully; returns a negative value otherwise. + * @since 1.0 + */ +int32_t PlatformDeviceNotify(struct PlatformDevice *device, int32_t event); + /** * @brief Unregister a notifier to a platform device. * @@ -160,6 +176,64 @@ int32_t PlatformDeviceAdd(struct PlatformDevice *device); */ void PlatformDeviceDel(struct PlatformDevice *device); +/** + * @brief Get device resource node of the device. + * + * @param device Indicates the pointer to the platform device. + * + * @since 1.0 + */ +struct DeviceResourceNode *PlatformDeviceGetDrs(struct PlatformDevice *device); + +/** + * @brief Create a hdf device service for the platform device. + * + * @param device Indicates the pointer to the platform device. + * @param dispatch Dispatch function for the service. + * + * @since 1.0 + */ +int32_t PlatformDeviceCreateService(struct PlatformDevice *device, + int32_t (*dispatch)(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply)); + +/** + * @brief Destroy the hdf device service for the platform device. + * + * @param device Indicates the pointer to the platform device. + * + * @since 1.0 + */ +int32_t PlatformDeviceDestroyService(struct PlatformDevice *device); + +/** + * @brief Bind to a hdf device object. + * + * @param device Indicates the pointer to the platform device. + * @param hdfDevice Indicates the pointer to the hdf device object. + * + * @since 1.0 + */ +int32_t PlatformDeviceBind(struct PlatformDevice *device, struct HdfDeviceObject *hdfDevice); + +/** + * @brief Unbind from a hdf device object. + * + * @param device Indicates the pointer to the platform device. + * + * @since 1.0 + */ +int32_t PlatformDeviceUnbind(struct PlatformDevice *device); + + +/** + * @brief Get the platform device from a hdf device object. + * + * @param device Indicates the pointer to the platform device. + * + * @since 1.0 + */ +struct PlatformDevice *PlatformDeviceFromHdf(struct HdfDeviceObject *device); + #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/include/fwk/platform_log.h b/support/platform/include/fwk/platform_log.h index d3b4c6f29..ab097fb14 100644 --- a/support/platform/include/fwk/platform_log.h +++ b/support/platform/include/fwk/platform_log.h @@ -17,4 +17,9 @@ #define PLAT_LOGV(fmt, arg...) HDF_LOGV(fmt, ##arg) #endif +#define PLAT_LOGD(fmt, arg...) HDF_LOGD(fmt, ##arg) +#define PLAT_LOGI(fmt, arg...) HDF_LOGI(fmt, ##arg) +#define PLAT_LOGW(fmt, arg...) HDF_LOGW(fmt, ##arg) +#define PLAT_LOGE(fmt, arg...) HDF_LOGE(fmt, ##arg) + #endif /* PLATFORM_LOG_H */ diff --git a/support/platform/include/fwk/platform_manager.h b/support/platform/include/fwk/platform_manager.h index fa4c9d198..0faa1944f 100644 --- a/support/platform/include/fwk/platform_manager.h +++ b/support/platform/include/fwk/platform_manager.h @@ -22,9 +22,12 @@ extern "C" { enum PlatformModuleType; struct PlatformManager { + struct PlatformDevice device; const char *name; /* name of the manager */ struct DListHead devices; /* list to keep all it's device instances */ OsalSpinlock spin; /* for member protection */ + int32_t (*add)(struct PlatformManager *manager, struct PlatformDevice *device); + int32_t (*del)(struct PlatformManager *manager, struct PlatformDevice *device); }; /** @@ -92,17 +95,17 @@ struct PlatformDevice *PlatformManagerFindDevice(struct PlatformManager *manager bool (*match)(struct PlatformDevice *pdevice, void *data)); /** - * @brief Get a platform device from the manager by magic. + * @brief Get a platform device from the manager by number. * * The device got will be returned with reference count increased. * * @param manager Indicates the pointer to the platform manager. - * @param magic Indicates the magic number of the target platform device. + * @param number Indicates the number number of the target platform device. * * @return Returns the pointer to the paltform device on success; returns NULL otherwise. * @since 1.0 */ -struct PlatformDevice *PlatformManagerGetDeviceByMagic(struct PlatformManager *manager, uint32_t magic); +struct PlatformDevice *PlatformManagerGetDeviceByNumber(struct PlatformManager *manager, uint32_t number); #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/include/gpio/gpio_core.h b/support/platform/include/gpio/gpio_core.h index 823df7187..720fd237d 100644 --- a/support/platform/include/gpio/gpio_core.h +++ b/support/platform/include/gpio/gpio_core.h @@ -34,11 +34,8 @@ struct GpioInfo; * @since 1.0 */ struct GpioCntlr { - struct IDeviceIoService service; - struct HdfDeviceObject *device; + struct PlatformDevice device; struct GpioMethod *ops; - struct DListHead list; - OsalSpinlock spin; uint16_t start; uint16_t count; struct GpioInfo *ginfos; @@ -137,6 +134,8 @@ int32_t GpioCntlrDisableIrq(struct GpioCntlr *cntlr, uint16_t local); void GpioCntlrIrqCallback(struct GpioCntlr *cntlr, uint16_t local); +struct PlatformManager *GpioManagerGet(void); + struct GpioCntlr *GpioGetCntlr(uint16_t gpio); static inline uint16_t GpioToLocal(uint16_t gpio) @@ -150,15 +149,6 @@ static inline uint16_t GpioGetLocalNumber(struct GpioCntlr *cntlr, uint16_t gpio return (cntlr == NULL) ? gpio : (gpio - cntlr->start); } -struct GpioManager { - struct IDeviceIoService service; - struct PlatformDevice device; - struct PlatformManager manager; - struct DListHead cntlrList; -}; - -struct GpioManager *GpioManagerGet(void); - #ifdef __cplusplus #if __cplusplus } diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h index d1643111e..d7ceac300 100644 --- a/support/platform/include/hdmi/hdmi_core.h +++ b/support/platform/include/hdmi/hdmi_core.h @@ -235,7 +235,7 @@ static inline void HdmiCntlrUnlock(struct HdmiCntlr *cntlr) static inline struct HdmiCntlr *HdmiCntlrGetByBusNum(uint16_t num) { - struct PlatformDevice *device = PlatformManagerGetDeviceByMagic(PlatformManagerGet(PLATFORM_MODULE_HDMI), num); + struct PlatformDevice *device = PlatformManagerGetDeviceByNumber(PlatformManagerGet(PLATFORM_MODULE_HDMI), num); if (device == NULL) { return NULL; diff --git a/support/platform/src/fwk/platform_device.c b/support/platform/src/fwk/platform_device.c index 882e5213b..140bf63ce 100755 --- a/support/platform/src/fwk/platform_device.c +++ b/support/platform/src/fwk/platform_device.c @@ -22,8 +22,6 @@ static void PlatformDeviceOnFirstGet(struct HdfSRef *sref) static void PlatformDeviceOnLastPut(struct HdfSRef *sref) { struct PlatformDevice *device = NULL; - struct PlatformNotifierNode *pos = NULL; - struct PlatformNotifierNode *tmp = NULL; if (sref == NULL) { return; @@ -34,16 +32,9 @@ static void PlatformDeviceOnLastPut(struct HdfSRef *sref) HDF_LOGE("PlatformDeviceOnLastPut: get device is NULL!"); return; } - (void)OsalSpinLock(&device->spin); device->ready = false; - DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &device->notifiers, struct PlatformNotifierNode, node) { - if (pos->notifier != NULL && pos->notifier->handle != NULL) { - pos->notifier->handle(device, PLAT_EVENT_DEAD, pos->notifier->data); - } - } - - (void)OsalSpinUnlock(&device->spin); + (void)PlatformDeviceNotify(device, PLAT_EVENT_DEAD); } struct IHdfSRefListener g_platObjListener = { @@ -184,6 +175,23 @@ void PlatformDeviceClearNotifier(struct PlatformDevice *device) PlatformDeviceRemoveNotifier(device, NULL); } +int32_t PlatformDeviceNotify(struct PlatformDevice *device, int32_t event) +{ + struct PlatformNotifierNode *pos = NULL; + struct PlatformNotifierNode *tmp = NULL; + + (void)OsalSpinLock(&device->spin); + + DLIST_FOR_EACH_ENTRY_SAFE(pos, tmp, &device->notifiers, struct PlatformNotifierNode, node) { + if (pos->notifier != NULL && pos->notifier->handle != NULL) { + pos->notifier->handle(device, event, pos->notifier->data); + } + } + + (void)OsalSpinUnlock(&device->spin); + return HDF_SUCCESS; +} + int32_t PlatformDeviceAdd(struct PlatformDevice *device) { struct PlatformManager *manager = NULL; @@ -215,3 +223,72 @@ void PlatformDeviceDel(struct PlatformDevice *device) PlatformManagerDelDevice(manager, device); PlatformDeviceUninit(device); } + +int32_t PlatformDeviceCreateService(struct PlatformDevice *device, + int32_t (*dispatch)(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply)) +{ + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (device->service != NULL) { + HDF_LOGE("%s: service already creatted!", __func__); + return HDF_FAILURE; + } + + device->service = (struct IDeviceIoService *)OsalMemCalloc(sizeof(*(device->service))); + if (device->service == NULL) { + HDF_LOGE("%s: alloc service failed!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + device->service->Dispatch = dispatch; + return HDF_SUCCESS; +} + +int32_t PlatformDeviceDestroyService(struct PlatformDevice *device) +{ + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (device->service != NULL) { + HDF_LOGE("%s: service not creatted!", __func__); + return HDF_FAILURE; + } + + OsalMemFree(device->service); + device->service = NULL; + return HDF_SUCCESS; +} + +int32_t PlatformDeviceBind(struct PlatformDevice *device, struct HdfDeviceObject *hdfDevice) +{ + if (device == NULL || hdfDevice == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (device->hdfDev != NULL) { + HDF_LOGE("%s: already bind a hdf device!", __func__); + return HDF_FAILURE; + } + + device->hdfDev = hdfDevice; + hdfDevice->service = device->service; + return HDF_SUCCESS; +} + +int32_t PlatformDeviceUnbind(struct PlatformDevice *device) +{ + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (device->hdfDev == NULL) { + HDF_LOGE("%s: no hdf device binded!", __func__); + return HDF_FAILURE; + } + + device->hdfDev->service = NULL; + device->hdfDev = NULL; + return HDF_SUCCESS; +} diff --git a/support/platform/src/fwk/platform_manager.c b/support/platform/src/fwk/platform_manager.c index 4b1ff4803..631aa9544 100644 --- a/support/platform/src/fwk/platform_manager.c +++ b/support/platform/src/fwk/platform_manager.c @@ -23,6 +23,10 @@ static void PlatformManagerInit(struct PlatformManager *manager) OsalSpinInit(&manager->spin); DListHeadInit(&manager->devices); + PlatformDeviceInit(&manager->device); + PlatformDeviceGet(&manager->device); + manager->add = NULL; + manager->del = NULL; } struct PlatformManager *PlatformManagerCreate(const char *name) @@ -62,37 +66,58 @@ struct PlatformManager *PlatformManagerGet(enum PlatformModuleType module) return manager; } -int32_t PlatformManagerAddDevice(struct PlatformManager *manager, struct PlatformDevice *device) +static int32_t PlatformManagerAddDeviceDefault(struct PlatformManager *manager, struct PlatformDevice *device) { struct PlatformDevice *tmp = NULL; bool repeatId = false; - if (manager == NULL || device == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - device->manager = manager; - if (PlatformDeviceGet(device) == NULL) { // keep a reference by manager return HDF_PLT_ERR_DEV_GET; } - (void)OsalSpinLock(&manager->spin); DLIST_FOR_EACH_ENTRY(tmp, &manager->devices, struct PlatformDevice, node) { - if (tmp != NULL && tmp->magic == device->magic) { + if (tmp != NULL && tmp->number == device->number) { repeatId = true; - HDF_LOGE("PlatformManagerAddDevice: repeated magic:%u!", device->magic); + HDF_LOGE("PlatformManagerAddDevice: repeated number:%u!", device->number); break; } } if (!repeatId) { DListInsertTail(&device->node, &manager->devices); + device->manager = manager; + } else { + PlatformDevicePut(device); + } + + return repeatId ? HDF_PLT_ERR_ID_REPEAT : HDF_SUCCESS; +} + +int32_t PlatformManagerAddDevice(struct PlatformManager *manager, struct PlatformDevice *device) +{ + int32_t ret; + + if (manager == NULL || device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + (void)OsalSpinLock(&manager->spin); + if (manager->add != NULL) { + ret = manager->add(manager, device); + } else { + ret = PlatformManagerAddDeviceDefault(manager, device); } (void)OsalSpinUnlock(&manager->spin); - if (repeatId) { - PlatformDevicePut(device); + return ret; +} + +static int32_t PlatformManagerDelDeviceDefault(struct PlatformManager *manager, struct PlatformDevice *device) +{ + if (!DListIsEmpty(&device->node)) { + DListRemove(&device->node); } - return repeatId ? HDF_PLT_ERR_ID_REPEAT : HDF_SUCCESS; + PlatformDevicePut(device); // put the reference hold by manager + return HDF_SUCCESS; } void PlatformManagerDelDevice(struct PlatformManager *manager, struct PlatformDevice *device) @@ -107,11 +132,12 @@ void PlatformManagerDelDevice(struct PlatformManager *manager, struct PlatformDe } (void)OsalSpinLock(&manager->spin); - if (!DListIsEmpty(&device->node)) { - DListRemove(&device->node); + if (manager->del != NULL) { + (void)manager->del(manager, device); + } else { + (void)PlatformManagerDelDeviceDefault(manager, device); } (void)OsalSpinUnlock(&manager->spin); - PlatformDevicePut(device); // put the reference hold by manager } struct PlatformDevice *PlatformManagerFindDevice(struct PlatformManager *manager, void *data, @@ -139,17 +165,17 @@ struct PlatformDevice *PlatformManagerFindDevice(struct PlatformManager *manager return pdevice; } -static bool PlatformDeviceMatchByMagic(struct PlatformDevice *device, void *data) +static bool PlatformDeviceMatchByNumber(struct PlatformDevice *device, void *data) { - uint32_t magic = (uint32_t)(uintptr_t)data; + uint32_t number = (uint32_t)(uintptr_t)data; - return (device != NULL && device->magic == magic); + return (device != NULL && device->number == number); } -struct PlatformDevice *PlatformManagerGetDeviceByMagic(struct PlatformManager *manager, uint32_t magic) +struct PlatformDevice *PlatformManagerGetDeviceByNumber(struct PlatformManager *manager, uint32_t number) { if (manager == NULL) { return NULL; } - return PlatformManagerFindDevice(manager, (void *)(uintptr_t)magic, PlatformDeviceMatchByMagic); + return PlatformManagerFindDevice(manager, (void *)(uintptr_t)number, PlatformDeviceMatchByNumber); } diff --git a/support/platform/src/gpio/gpio_core.c b/support/platform/src/gpio/gpio_core.c index 3703ba2ba..912a0e9bc 100644 --- a/support/platform/src/gpio/gpio_core.c +++ b/support/platform/src/gpio/gpio_core.c @@ -7,14 +7,12 @@ */ #include "gpio/gpio_core.h" -#include "hdf_log.h" #include "osal_mem.h" #include "platform_core.h" #include "securec.h" #define HDF_LOG_TAG gpio_core -#define MAX_CNT_PER_CNTLR 1024 #define GPIO_IRQ_STACK_SIZE 10000 #define GPIO_IRQ_THREAD_NAME_LEN 32 @@ -30,174 +28,6 @@ struct GpioIrqBridge { bool stop; }; -static struct GpioManager g_gpioManager; - -struct GpioManager *GpioManagerGet(void) -{ - static struct GpioManager *manager = NULL; - - if (manager == NULL) { - manager = &g_gpioManager; - - manager->manager.name = "PLATFORM_GPIO_MANAGER"; - OsalSpinInit(&manager->manager.spin); - DListHeadInit(&manager->manager.devices); - - PlatformDeviceInit(&manager->device); - PlatformDeviceGet(&manager->device); - HDF_LOGI("%s: gpio manager init done", __func__); - } - - return manager; -} - -static uint16_t GpioCntlrQueryStart(struct GpioCntlr *cntlr, struct DListHead *list) -{ - uint16_t freeStart; - uint16_t freeCount; - struct GpioCntlr *iterLast = NULL; - struct GpioCntlr *iterCur = NULL; - struct GpioCntlr *tmp = NULL; - - DLIST_FOR_EACH_ENTRY_SAFE(iterCur, tmp, list, struct GpioCntlr, list) { - if (iterLast == NULL) { - freeStart = 0; - freeCount = iterCur->start; - } else { - freeStart = iterLast->start + iterLast->count; - freeCount = iterCur->start - freeStart; - } - - if (cntlr->start < freeStart) { - HDF_LOGE("GpioCntlrQueryStart: start:%u not available(freeStart:%u, freeCount:%u)", - cntlr->start, freeStart, freeCount); - return GPIO_NUM_MAX; - } - - if ((cntlr->start + cntlr->count) <= (freeStart + freeCount)) { - return freeStart; - } - - iterLast = iterCur; - } - if (iterLast == NULL) { // empty list - return cntlr->start; - } - if (cntlr->start >= (iterLast->start + iterLast->count)) { - return iterLast->start + iterLast->count; - } - HDF_LOGE("GpioCntlrQueryStart: start:%u not available(lastStart:%u, lastCount:%u)", - cntlr->start, iterLast->start, iterLast->count); - return GPIO_NUM_MAX; -} - -int32_t GpioCntlrAdd(struct GpioCntlr *cntlr) -{ - uint16_t start; - struct GpioManager *gpioMgr = NULL; - - if (cntlr == NULL) { - return HDF_ERR_INVALID_OBJECT; - } - - if (cntlr->device == NULL) { - HDF_LOGE("GpioCntlrAdd: no device associated!"); - return HDF_ERR_INVALID_OBJECT; - } - - if (cntlr->ops == NULL) { - HDF_LOGE("GpioCntlrAdd: no ops supplied!"); - return HDF_ERR_INVALID_OBJECT; - } - - if (cntlr->count >= MAX_CNT_PER_CNTLR) { - HDF_LOGE("GpioCntlrAdd: invalid gpio count:%u", cntlr->count); - return HDF_ERR_INVALID_PARAM; - } - - if (cntlr->ginfos == NULL) { - cntlr->ginfos = OsalMemCalloc(sizeof(*cntlr->ginfos) * cntlr->count); - if (cntlr->ginfos == NULL) { - return HDF_ERR_MALLOC_FAIL; - } - } - - gpioMgr = GpioManagerGet(); - if (gpioMgr == NULL) { - HDF_LOGE("GpioCntlrAdd: get gpio manager failed"); - return HDF_PLT_ERR_DEV_GET; - } - (void)OsalSpinLock(&gpioMgr->manager.spin); - if ((start = GpioCntlrQueryStart(cntlr, &gpioMgr->manager.devices)) >= GPIO_NUM_MAX) { - HDF_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start); - (void)OsalSpinUnlock(&gpioMgr->manager.spin); - return HDF_ERR_INVALID_PARAM; - } - - cntlr->start = start; - OsalSpinInit(&cntlr->spin); - DListHeadInit(&cntlr->list); - DListInsertTail(&cntlr->list, &gpioMgr->manager.devices); - (void)OsalSpinUnlock(&gpioMgr->manager.spin); - HDF_LOGI("GpioCntlrAdd: start:%u count:%u", cntlr->start, cntlr->count); - - return HDF_SUCCESS; -} - -void GpioCntlrRemove(struct GpioCntlr *cntlr) -{ - struct GpioManager *gpioMgr = NULL; - - if (cntlr == NULL) { - return; - } - - if (cntlr->device == NULL) { - HDF_LOGE("GpioCntlrRemove: no device associated!"); - return; - } - - gpioMgr = GpioManagerGet(); - if (gpioMgr == NULL) { - HDF_LOGE("GpioCntlrRemove: get gpio manager failed"); - return; - } - - cntlr->device->service = NULL; - (void)OsalSpinLock(&gpioMgr->manager.spin); - DListRemove(&cntlr->list); - (void)OsalSpinUnlock(&gpioMgr->manager.spin); - if (cntlr->ginfos != NULL) { - OsalMemFree(cntlr->ginfos); - cntlr->ginfos = NULL; - } - (void)OsalSpinDestroy(&cntlr->spin); -} - -struct GpioCntlr *GpioGetCntlr(uint16_t gpio) -{ - struct GpioCntlr *cntlr = NULL; - struct GpioCntlr *tmp = NULL; - struct GpioManager *gpioMgr = NULL; - - gpioMgr = GpioManagerGet(); - if (gpioMgr == NULL) { - HDF_LOGE("GpioCntlrRemove: get gpio manager failed"); - return NULL; - } - - (void)OsalSpinLock(&gpioMgr->manager.spin); - DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, &gpioMgr->manager.devices, struct GpioCntlr, list) { - if (gpio >= cntlr->start && gpio < (cntlr->start + cntlr->count)) { - (void)OsalSpinUnlock(&gpioMgr->manager.spin); - return cntlr; - } - } - (void)OsalSpinUnlock(&gpioMgr->manager.spin); - HDF_LOGE("GpioGetCntlr: gpio %u not in any controllers!", gpio); - return NULL; -} - int32_t GpioCntlrWrite(struct GpioCntlr *cntlr, uint16_t local, uint16_t val) { if (cntlr == NULL) { @@ -293,7 +123,7 @@ static int GpioIrqThreadWorker(void *data) (void)OsalSemDestroy(&bridge->sem); (void)OsalSpinDestroy(&bridge->spin); OsalMemFree(bridge); - HDF_LOGI("GpioIrqThreadWorker: normal exit!"); + PLAT_LOGI("GpioIrqThreadWorker: normal exit!"); return HDF_SUCCESS; } @@ -317,23 +147,23 @@ static struct GpioIrqBridge *GpioIrqBridgeCreate(struct GpioCntlr *cntlr, if (snprintf_s(bridge->name, GPIO_IRQ_THREAD_NAME_LEN, GPIO_IRQ_THREAD_NAME_LEN - 1, "GPIO_IRQ_TSK_%d_%d", bridge->cntlr->start, bridge->local) < 0) { - HDF_LOGE("GpioIrqBridgeCreate: format thread name fail!"); + PLAT_LOGE("GpioIrqBridgeCreate: format thread name fail!"); goto __ERR_FORMAT_NAME; } if (OsalSpinInit(&bridge->spin) != HDF_SUCCESS) { - HDF_LOGE("GpioIrqBridgeCreate: init spin fail!"); + PLAT_LOGE("GpioIrqBridgeCreate: init spin fail!"); goto __ERR_INIT_SPIN; } if (OsalSemInit(&bridge->sem, 0) != HDF_SUCCESS) { - HDF_LOGE("GpioIrqBridgeCreate: init sem fail!"); + PLAT_LOGE("GpioIrqBridgeCreate: init sem fail!"); goto __ERR_INIT_SEM; } ret = OsalThreadCreate(&bridge->thread, (OsalThreadEntry)GpioIrqThreadWorker, (void *)bridge); if (ret != HDF_SUCCESS) { - HDF_LOGE("GpioIrqBridgeCreate: create irq fail!"); + PLAT_LOGE("GpioIrqBridgeCreate: create irq fail!"); goto __ERR_CREATE_THREAD; } @@ -341,7 +171,7 @@ static struct GpioIrqBridge *GpioIrqBridgeCreate(struct GpioCntlr *cntlr, cfg.priority = OSAL_THREAD_PRI_HIGH; cfg.stackSize = GPIO_IRQ_STACK_SIZE; if (OsalThreadStart(&bridge->thread, &cfg) != HDF_SUCCESS) { - HDF_LOGE("GpioIrqBridgeCreate: start irq thread fail:%d", ret); + PLAT_LOGE("GpioIrqBridgeCreate: start irq thread fail:%d", ret); goto __ERR_START_THREAD; } return bridge; @@ -377,10 +207,10 @@ void GpioCntlrIrqCallback(struct GpioCntlr *cntlr, uint16_t local) if (ginfo != NULL && ginfo->irqFunc != NULL) { (void)ginfo->irqFunc(local, ginfo->irqData); } else { - HDF_LOGW("GpioCntlrIrqCallback: ginfo or irqFunc is NULL!"); + PLAT_LOGW("GpioCntlrIrqCallback: ginfo or irqFunc is NULL!"); } } else { - HDF_LOGW("GpioCntlrIrqCallback: invalid cntlr(ginfos) or loal num:%u!", local); + PLAT_LOGW("GpioCntlrIrqCallback: invalid cntlr(ginfos) or loal num:%u!", local); } } @@ -415,7 +245,7 @@ int32_t GpioCntlrSetIrq(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, } } - (void)OsalSpinLockIrqSave(&cntlr->spin, &flags); + (void)OsalSpinLockIrqSave(&cntlr->device.spin, &flags); oldFunc = cntlr->ginfos[local].irqFunc; oldData = cntlr->ginfos[local].irqData; cntlr->ginfos[local].irqFunc = theFunc; @@ -433,7 +263,7 @@ int32_t GpioCntlrSetIrq(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, bridge = NULL; } } - (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &flags); + (void)OsalSpinUnlockIrqRestore(&cntlr->device.spin, &flags); return ret; } @@ -453,7 +283,7 @@ int32_t GpioCntlrUnsetIrq(struct GpioCntlr *cntlr, uint16_t local) return HDF_ERR_NOT_SUPPORT; } - (void)OsalSpinLockIrqSave(&cntlr->spin, &flags); + (void)OsalSpinLockIrqSave(&cntlr->device.spin, &flags); ret = cntlr->ops->unsetIrq(cntlr, local); if (ret == HDF_SUCCESS) { if (cntlr->ginfos[local].irqFunc == GpioIrqBridgeFunc) { @@ -463,7 +293,7 @@ int32_t GpioCntlrUnsetIrq(struct GpioCntlr *cntlr, uint16_t local) cntlr->ginfos[local].irqFunc = NULL; cntlr->ginfos[local].irqData = NULL; } - (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &flags); + (void)OsalSpinUnlockIrqRestore(&cntlr->device.spin, &flags); return ret; } diff --git a/support/platform/src/gpio/gpio_if.c b/support/platform/src/gpio/gpio_if.c index d7c0205cd..4a0ee4d29 100644 --- a/support/platform/src/gpio/gpio_if.c +++ b/support/platform/src/gpio/gpio_if.c @@ -11,16 +11,15 @@ #ifdef __USER__ #include "gpio/gpio_service.h" #include "hdf_io_service_if.h" -#include "platform_errno.h" +#include "platform_core.h" #else #include "devsvc_manager_clnt.h" #include "gpio/gpio_core.h" #endif #include "hdf_base.h" -#include "hdf_log.h" -#define HDF_LOG_TAG gpio_if +#define PLAT_LOG_TAG gpio_if #ifdef __USER__ @@ -33,7 +32,7 @@ static void *GpioManagerServiceGet(void) } manager = (void *)HdfIoServiceBind("HDF_PLATFORM_GPIO_MANAGER"); if (manager == NULL) { - HDF_LOGE("%s: failed to get gpio manager service!", __func__); + PLAT_LOGE("%s: failed to get gpio manager service!", __func__); } return manager; } @@ -62,7 +61,7 @@ int32_t GpioRead(uint16_t gpio, uint16_t *val) } if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { - HDF_LOGE("%s: write gpio number failed!", __func__); + PLAT_LOGE("%s: write gpio number failed!", __func__); HdfSBufRecycle(data); HdfSBufRecycle(reply); return HDF_ERR_IO; @@ -70,14 +69,14 @@ int32_t GpioRead(uint16_t gpio, uint16_t *val) ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_READ, data, reply); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: service call failed:%d", __func__, ret); + PLAT_LOGE("%s: service call failed:%d", __func__, ret); HdfSBufRecycle(data); HdfSBufRecycle(reply); return ret; } if (!HdfSbufReadUint16(reply, val)) { - HDF_LOGE("%s: read sbuf failed", __func__); + PLAT_LOGE("%s: read sbuf failed", __func__); HdfSBufRecycle(data); HdfSBufRecycle(reply); return HDF_ERR_IO; @@ -105,20 +104,20 @@ int32_t GpioWrite(uint16_t gpio, uint16_t val) } if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { - HDF_LOGE("%s: write gpio number failed!", __func__); + PLAT_LOGE("%s: write gpio number failed!", __func__); HdfSBufRecycle(data); return HDF_ERR_IO; } if (!HdfSbufWriteUint16(data, (uint16_t)val)) { - HDF_LOGE("%s: write gpio value failed!", __func__); + PLAT_LOGE("%s: write gpio value failed!", __func__); HdfSBufRecycle(data); return HDF_ERR_IO; } ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_WRITE, data, NULL); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: service call failed:%d", __func__, ret); + PLAT_LOGE("%s: service call failed:%d", __func__, ret); HdfSBufRecycle(data); return ret; } @@ -151,7 +150,7 @@ int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) } if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { - HDF_LOGE("%s: write gpio number failed!", __func__); + PLAT_LOGE("%s: write gpio number failed!", __func__); HdfSBufRecycle(data); HdfSBufRecycle(reply); return HDF_ERR_IO; @@ -159,14 +158,14 @@ int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_GETDIR, data, reply); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: service call failed:%d", __func__, ret); + PLAT_LOGE("%s: service call failed:%d", __func__, ret); HdfSBufRecycle(data); HdfSBufRecycle(reply); return ret; } if (!HdfSbufReadUint16(reply, dir)) { - HDF_LOGE("%s: read sbuf failed", __func__); + PLAT_LOGE("%s: read sbuf failed", __func__); HdfSBufRecycle(data); HdfSBufRecycle(reply); return HDF_ERR_IO; @@ -194,20 +193,20 @@ int32_t GpioSetDir(uint16_t gpio, uint16_t dir) } if (!HdfSbufWriteUint16(data, (uint16_t)gpio)) { - HDF_LOGE("%s: write gpio number failed!", __func__); + PLAT_LOGE("%s: write gpio number failed!", __func__); HdfSBufRecycle(data); return HDF_ERR_IO; } if (!HdfSbufWriteUint16(data, (uint16_t)dir)) { - HDF_LOGE("%s: write gpio value failed!", __func__); + PLAT_LOGE("%s: write gpio value failed!", __func__); HdfSBufRecycle(data); return HDF_ERR_IO; } ret = service->dispatcher->Dispatch(&service->object, GPIO_IO_SETDIR, data, NULL); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: service call failed:%d", __func__, ret); + PLAT_LOGE("%s: service call failed:%d", __func__, ret); HdfSBufRecycle(data); return ret; } diff --git a/support/platform/src/gpio/gpio_manager.c b/support/platform/src/gpio/gpio_manager.c new file mode 100644 index 000000000..5b47c8701 --- /dev/null +++ b/support/platform/src/gpio/gpio_manager.c @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "gpio/gpio_core.h" +#include "osal_mem.h" +#include "platform_core.h" + +#define HDF_LOG_TAG gpio_manager + +#define MAX_CNT_PER_CNTLR 1024 + +static uint16_t GpioCntlrQueryStart(struct GpioCntlr *cntlr, struct DListHead *list) +{ + uint16_t freeStart; + uint16_t freeCount; + struct PlatformDevice *iterLast = NULL; + struct PlatformDevice *iterCur = NULL; + struct PlatformDevice *tmp = NULL; + struct GpioCntlr *cntlrCur = NULL; + struct GpioCntlr *cntlrLast = NULL; + + DLIST_FOR_EACH_ENTRY_SAFE(iterCur, tmp, list, struct PlatformDevice, node) { + cntlrCur = CONTAINER_OF(iterCur, struct GpioCntlr, device); + cntlrLast = CONTAINER_OF(iterLast, struct GpioCntlr, device); + if (cntlrLast == NULL) { + freeStart = 0; + freeCount = cntlrCur->start; + } else { + freeStart = cntlrLast->start + cntlrLast->count; + freeCount = cntlrCur->start - freeStart; + } + + if (cntlr->start < freeStart) { + PLAT_LOGE("GpioCntlrQueryStart: start:%u not available(freeStart:%u, freeCount:%u)", + cntlr->start, freeStart, freeCount); + return GPIO_NUM_MAX; + } + + if ((cntlr->start + cntlr->count) <= (freeStart + freeCount)) { + return freeStart; + } + cntlrLast = cntlrCur; + } + if (cntlrLast == NULL) { // empty list + return cntlr->start; + } + if (cntlr->start >= (cntlrLast->start + cntlrLast->count)) { + return cntlrLast->start + cntlrLast->count; + } + PLAT_LOGE("GpioCntlrQueryStart: start:%u not available(lastStart:%u, lastCount:%u)", + cntlr->start, cntlrLast->start, cntlrLast->count); + return GPIO_NUM_MAX; +} + +static int32_t GpioManagerAdd(struct PlatformManager *manager, struct PlatformDevice *device) +{ + uint16_t start; + struct GpioCntlr *cntlr = CONTAINER_OF(device, struct GpioCntlr, device); + + if ((start = GpioCntlrQueryStart(cntlr, &manager->devices)) >= GPIO_NUM_MAX) { + PLAT_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start); + return HDF_ERR_INVALID_PARAM; + } + + cntlr->start = start; + DListInsertTail(&device->node, &manager->devices); + PLAT_LOGI("%s: start:%u count:%u", __func__, cntlr->start, cntlr->count); + return HDF_SUCCESS; +} + +static int32_t GpioManagerDel(struct PlatformManager *manager, struct PlatformDevice *device) +{ + if (!DListIsEmpty(&device->node)) { + DListRemove(&device->node); + } + return HDF_SUCCESS; +} + +struct PlatformManager *GpioManagerGet(void) +{ + static struct PlatformManager *manager = NULL; + + if (manager == NULL) { + manager = PlatformManagerGet(PLATFORM_MODULE_GPIO); + if (manager != NULL) { + manager->add = GpioManagerAdd; + manager->del = GpioManagerDel; + } + } + return manager; +} + +int32_t GpioCntlrAdd(struct GpioCntlr *cntlr) +{ + int32_t ret; + + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->ops == NULL) { + PLAT_LOGE("GpioCntlrAdd: no ops supplied!"); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->count >= MAX_CNT_PER_CNTLR) { + PLAT_LOGE("GpioCntlrAdd: invalid gpio count:%u", cntlr->count); + return HDF_ERR_INVALID_PARAM; + } + + if (cntlr->ginfos == NULL) { + cntlr->ginfos = OsalMemCalloc(sizeof(*cntlr->ginfos) * cntlr->count); + if (cntlr->ginfos == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + } + + cntlr->device.manager = GpioManagerGet(); + if ((ret = PlatformDeviceAdd(&cntlr->device)) != HDF_SUCCESS) { + OsalMemFree(cntlr->ginfos); + return ret; + } + + return HDF_SUCCESS; +} + +void GpioCntlrRemove(struct GpioCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + + PlatformDeviceDel(&cntlr->device); + + if (cntlr->ginfos != NULL) { + OsalMemFree(cntlr->ginfos); + cntlr->ginfos = NULL; + } +} + +static bool GpioCntlrFindMatch(struct PlatformDevice *device, void *data) +{ + uint16_t gpio = (uint16_t)(uintptr_t)data; + struct GpioCntlr *cntlr = CONTAINER_OF(device, struct GpioCntlr, device); + + if (gpio >= cntlr->start && gpio < (cntlr->start + cntlr->count)) { + return true; + } + return false; +} + +struct GpioCntlr *GpioGetCntlr(uint16_t gpio) +{ + struct PlatformManager *gpioMgr = NULL; + struct PlatformDevice *device = NULL; + + gpioMgr = GpioManagerGet(); + if (gpioMgr == NULL) { + PLAT_LOGE("GpioCntlrRemove: get gpio manager failed"); + return NULL; + } + + device = PlatformManagerFindDevice(gpioMgr, (void *)(uintptr_t)gpio, GpioCntlrFindMatch); + if (device == NULL) { + PLAT_LOGE("%s: gpio %u not in any controllers!", __func__, gpio); + return NULL; + } + return CONTAINER_OF(device, struct GpioCntlr, device); +} diff --git a/support/platform/src/gpio/gpio_service.c b/support/platform/src/gpio/gpio_service.c index 52ee00fef..d73b84987 100644 --- a/support/platform/src/gpio/gpio_service.c +++ b/support/platform/src/gpio/gpio_service.c @@ -10,12 +10,11 @@ #include "gpio/gpio_core.h" #include "gpio/gpio_service.h" #include "hdf_device_desc.h" -#include "hdf_log.h" #include "platform_core.h" #define HDF_LOG_TAG gpio_service -static int32_t GpioManagerIoRead(struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t GpioServiceIoRead(struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; uint16_t gpio; @@ -26,25 +25,25 @@ static int32_t GpioManagerIoRead(struct HdfSBuf *data, struct HdfSBuf *reply) } if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: read gpio number failed", __func__); + PLAT_LOGE("%s: read gpio number failed", __func__); return HDF_ERR_IO; } ret = GpioRead(gpio, &value); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read gpio failed:%d", __func__, ret); + PLAT_LOGE("%s: read gpio failed:%d", __func__, ret); return ret; } if (!HdfSbufWriteUint16(reply, value)) { - HDF_LOGE("%s: write subf failed:%d", __func__, ret); + PLAT_LOGE("%s: write subf failed:%d", __func__, ret); return ret; } return ret; } -static int32_t GpioManagerIoWrite(struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t GpioServiceIoWrite(struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; uint16_t gpio; @@ -55,25 +54,25 @@ static int32_t GpioManagerIoWrite(struct HdfSBuf *data, struct HdfSBuf *reply) } if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: read gpio number failed", __func__); + PLAT_LOGE("%s: read gpio number failed", __func__); return HDF_ERR_IO; } if (!HdfSbufReadUint16(data, &value)) { - HDF_LOGE("%s: read gpio value failed", __func__); + PLAT_LOGE("%s: read gpio value failed", __func__); return HDF_ERR_IO; } ret = GpioWrite(gpio, value); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: write gpio failed:%d", __func__, ret); + PLAT_LOGE("%s: write gpio failed:%d", __func__, ret); return ret; } return ret; } -static int32_t GpioManagerIoGetDir(struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t GpioServiceIoGetDir(struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; uint16_t gpio; @@ -84,25 +83,25 @@ static int32_t GpioManagerIoGetDir(struct HdfSBuf *data, struct HdfSBuf *reply) } if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: read gpio number failed", __func__); + PLAT_LOGE("%s: read gpio number failed", __func__); return HDF_ERR_IO; } ret = GpioGetDir(gpio, &dir); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: get gpio dir failed:%d", __func__, ret); + PLAT_LOGE("%s: get gpio dir failed:%d", __func__, ret); return ret; } if (!HdfSbufWriteUint16(reply, dir)) { - HDF_LOGE("%s: write subf failed:%d", __func__, ret); + PLAT_LOGE("%s: write subf failed:%d", __func__, ret); return ret; } return ret; } -static int32_t GpioManagerIoSetDir(struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t GpioServiceIoSetDir(struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; uint16_t gpio; @@ -113,38 +112,38 @@ static int32_t GpioManagerIoSetDir(struct HdfSBuf *data, struct HdfSBuf *reply) } if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: read gpio number failed", __func__); + PLAT_LOGE("%s: read gpio number failed", __func__); return HDF_ERR_IO; } if (!HdfSbufReadUint16(data, &dir)) { - HDF_LOGE("%s: read gpio dir failed", __func__); + PLAT_LOGE("%s: read gpio dir failed", __func__); return HDF_ERR_IO; } ret = GpioSetDir(gpio, dir); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: set gpio dir failed:%d", __func__, ret); + PLAT_LOGE("%s: set gpio dir failed:%d", __func__, ret); return ret; } return ret; } -static int32_t GpioManagerDispatch(struct HdfDeviceIoClient *client, int cmd, +static int32_t GpioServiceDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; switch (cmd) { case GPIO_IO_READ: - return GpioManagerIoRead(data, reply); + return GpioServiceIoRead(data, reply); case GPIO_IO_WRITE: - return GpioManagerIoWrite(data, reply); + return GpioServiceIoWrite(data, reply); case GPIO_IO_GETDIR: - return GpioManagerIoGetDir(data, reply); + return GpioServiceIoGetDir(data, reply); case GPIO_IO_SETDIR: - return GpioManagerIoSetDir(data, reply); + return GpioServiceIoSetDir(data, reply); default: ret = HDF_ERR_NOT_SUPPORT; break; @@ -152,62 +151,72 @@ static int32_t GpioManagerDispatch(struct HdfDeviceIoClient *client, int cmd, return ret; } -static int32_t GpioManagerBind(struct HdfDeviceObject *device) +static int32_t GpioServiceBind(struct HdfDeviceObject *device) { - struct GpioManager *gpioMgr = NULL; + int32_t ret; + struct PlatformManager *gpioMgr = NULL; - HDF_LOGI("GpioManagerBind: enter"); + PLAT_LOGI("GpioServiceBind: enter"); if (device == NULL) { - HDF_LOGE("GpioManagerBind: device is NULL"); + PLAT_LOGE("GpioServiceBind: device is NULL"); return HDF_ERR_INVALID_OBJECT; } gpioMgr = GpioManagerGet(); if (gpioMgr == NULL) { - HDF_LOGE("GpioManagerBind: get gpio manager failed"); + PLAT_LOGE("GpioServiceBind: get gpio manager failed"); return HDF_PLT_ERR_DEV_GET; } - gpioMgr->device.hdfDev = device; - device->service = &gpioMgr->service; - device->service->Dispatch = GpioManagerDispatch; - HDF_LOGI("GpioManagerBind: success"); + ret = PlatformDeviceCreateService(&gpioMgr->device, GpioServiceDispatch); + if (ret != HDF_SUCCESS) { + PLAT_LOGE("GpioServiceBind: create gpio service failed:%d", ret); + return ret; + } + + ret = PlatformDeviceBind(&gpioMgr->device, device); + if (ret != HDF_SUCCESS) { + PLAT_LOGE("GpioServiceBind: bind gpio device failed:%d", ret); + (void)PlatformDeviceDestroyService(&gpioMgr->device); + return ret; + } + + PLAT_LOGI("GpioServiceBind: success"); return HDF_SUCCESS; } -static int32_t GpioManagerInit(struct HdfDeviceObject *device) +static int32_t GpioServiceInit(struct HdfDeviceObject *device) { (void)device; return HDF_SUCCESS; } -static void GpioManagerRelease(struct HdfDeviceObject *device) +static void GpioServiceRelease(struct HdfDeviceObject *device) { - struct GpioManager *gpioMgr = NULL; + struct PlatformManager *gpioMgr = NULL; - HDF_LOGI("GpioManagerRelease: enter"); + PLAT_LOGI("GpioServiceRelease: enter"); if (device == NULL) { - HDF_LOGI("GpioManagerRelease: device is null"); + PLAT_LOGI("GpioServiceRelease: device is null"); return; } gpioMgr = GpioManagerGet(); if (gpioMgr == NULL) { - HDF_LOGE("GpioManagerBind: get gpio manager failed"); + PLAT_LOGE("GpioServiceBind: get gpio manager failed"); return; } - gpioMgr->device.hdfDev = NULL; - device->service->Dispatch = NULL; - device->service = NULL; - HDF_LOGI("GpioManagerRelease: done"); + (void)PlatformDeviceDestroyService(&gpioMgr->device); + (void)PlatformDeviceUnbind(&gpioMgr->device); + PLAT_LOGI("GpioServiceRelease: done"); } -struct HdfDriverEntry g_gpioManagerEntry = { +struct HdfDriverEntry g_gpioServiceEntry = { .moduleVersion = 1, - .Bind = GpioManagerBind, - .Init = GpioManagerInit, - .Release = GpioManagerRelease, + .Bind = GpioServiceBind, + .Init = GpioServiceInit, + .Release = GpioServiceRelease, .moduleName = "HDF_PLATFORM_GPIO_MANAGER", }; -HDF_INIT(g_gpioManagerEntry); +HDF_INIT(g_gpioServiceEntry); diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index 406c01cc2..ee66ac7e0 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -298,7 +298,7 @@ static int32_t HdmiCntlrInit(struct HdmiCntlr *cntlr) cntlr->service.Dispatch = HdmiIoDispatch; cntlr->hdfDevObj->service = &(cntlr->service); - cntlr->device.magic = cntlr->deviceIndex; + cntlr->device.number = cntlr->deviceIndex; cntlr->device.hdfDev = cntlr->hdfDevObj; HdmiInfoframeInit(cntlr); HdmiDdcInit(cntlr); -- Gitee From 51a5f851e33f9a6ecad14a626cf0a759f21be763 Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Mon, 22 Nov 2021 10:24:15 +0800 Subject: [PATCH 182/272] =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yinshuqing --- support/platform/src/dma/dmac_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/support/platform/src/dma/dmac_core.c b/support/platform/src/dma/dmac_core.c index f620772d2..d0e51490a 100644 --- a/support/platform/src/dma/dmac_core.c +++ b/support/platform/src/dma/dmac_core.c @@ -229,6 +229,7 @@ static void DmacFreeChannel(struct DmaCntlr *cntlr, uint16_t channel) } OsalSpinLockIrqSave(&cntlr->lock, &flags); + DmacFreeLli(&cntlr->channelList[channel]); cntlr->channelList[channel].useStatus = DMAC_CHN_VACANCY; OsalSpinUnlockIrqRestore(&cntlr->lock, &flags); } -- Gitee From 2c22cc62e00566a2fde39a9dda090748fc7a1c1a Mon Sep 17 00:00:00 2001 From: huangkai Date: Mon, 22 Nov 2021 09:03:20 +0000 Subject: [PATCH 183/272] touch bug fix Signed-off-by: huangkai --- model/input/driver/touchscreen/touch_gt911.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/model/input/driver/touchscreen/touch_gt911.c b/model/input/driver/touchscreen/touch_gt911.c index 9092f2acb..b1662c812 100644 --- a/model/input/driver/touchscreen/touch_gt911.c +++ b/model/input/driver/touchscreen/touch_gt911.c @@ -291,6 +291,7 @@ static int32_t HdfGoodixChipInit(struct HdfDeviceObject *device) chipDev->ops = &g_gt911ChipOps; chipDev->chipName = chipCfg->chipName; chipDev->vendorName = chipCfg->vendorName; + device->priv = chipDev; if (RegisterTouchChipDevice(chipDev) != HDF_SUCCESS) { goto EXIT1; @@ -305,10 +306,26 @@ EXIT: return HDF_FAILURE; } +static void HdfGoodixChipRelease(struct HdfDeviceObject *device) +{ + ChipDevice *chipDev = NULL; + if (device == NULL || device->priv == NULL) { + HDF_LOGE("%s: param is null", __func__); + return; + } + + chipDev = (ChipDevice *)device->priv; + FreeChipConfig(chipDev->chipCfg); + OsalMemFree(chipDev); + + HDF_LOGI("%s: goodix chip is release", __func__); +} + struct HdfDriverEntry g_touchGoodixChipEntry = { .moduleVersion = 1, .moduleName = "HDF_TOUCH_GT911", .Init = HdfGoodixChipInit, + .Release = HdfGoodixChipRelease, }; HDF_INIT(g_touchGoodixChipEntry); -- Gitee From 4e4f01af61a069bc69adb7ab19c88113b743c709 Mon Sep 17 00:00:00 2001 From: zhang Date: Mon, 22 Nov 2021 17:24:56 +0800 Subject: [PATCH 184/272] modify reviewbot issue Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_macro_cases.c | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c index f83af30b5..5231aa42a 100755 --- a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c @@ -46,11 +46,13 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].child.status); #define fp_deal(node) \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ - node##_foreach_child(fp_child_deal); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ - index++; + do { \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ + node##_foreach_child(fp_child_deal); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ + index++; \ + } while (0); #define fp_deal_(node) fp_deal(node) @@ -58,11 +60,13 @@ CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].child.status); #define fp_deal_vargs(node, fpArgs, idx) \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ - node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ - idx++; + do { \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ + node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ + idx++; \ + } while (0); #define fp_deal_vargs_(node, fpArgs, idx) fp_deal_vargs(node, fpArgs, idx) -- Gitee From de7ca175b645de5b13b775a426ffa7143ca7a0b5 Mon Sep 17 00:00:00 2001 From: huangkai Date: Mon, 22 Nov 2021 11:12:54 +0000 Subject: [PATCH 185/272] touch bug fix Signed-off-by: huangkai --- model/input/driver/touchscreen/touch_gt911.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/model/input/driver/touchscreen/touch_gt911.c b/model/input/driver/touchscreen/touch_gt911.c index b1662c812..df8aa5064 100644 --- a/model/input/driver/touchscreen/touch_gt911.c +++ b/model/input/driver/touchscreen/touch_gt911.c @@ -248,6 +248,9 @@ static ChipDevice *ChipDeviceInstance(void) static void FreeChipConfig(TouchChipCfg *config) { + if (config == NULL) { + HDF_LOGE("%s: param is null", __func__); + } if (config->pwrSeq.pwrOn.buf != NULL) { OsalMemFree(config->pwrSeq.pwrOn.buf); } @@ -315,7 +318,9 @@ static void HdfGoodixChipRelease(struct HdfDeviceObject *device) } chipDev = (ChipDevice *)device->priv; - FreeChipConfig(chipDev->chipCfg); + if (chipDev->chipCfg != NULL) { + FreeChipConfig(chipDev->chipCfg); + } OsalMemFree(chipDev); HDF_LOGI("%s: goodix chip is release", __func__); -- Gitee From 1eeb53b1c812f1ef0705a5b0d267b0457700ede5 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 23 Nov 2021 08:34:54 +0800 Subject: [PATCH 186/272] updata_common_01 Signed-off-by: YOUR_NAME --- .../common/include/sensor_config_controller.h | 7 +- .../common/include/sensor_config_parser.h | 5 +- .../common/src/sensor_config_controller.c | 138 ++++++++++++++++-- 3 files changed, 133 insertions(+), 17 deletions(-) diff --git a/model/sensor/driver/common/include/sensor_config_controller.h b/model/sensor/driver/common/include/sensor_config_controller.h index 9521f7dc5..9c3bc36ae 100644 --- a/model/sensor/driver/common/include/sensor_config_controller.h +++ b/model/sensor/driver/common/include/sensor_config_controller.h @@ -11,6 +11,8 @@ #include "sensor_config_parser.h" +#define LENGTH_NUMBER 32 + enum SensorCalculateType { SENSOR_CFG_CALC_TYPE_NONE = 0, SENSOR_CFG_CALC_TYPE_SET = 1, // To Support:1.Bitwise AND "&" 2.Bitwise OR "|" @@ -26,6 +28,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 { @@ -34,5 +38,6 @@ struct SensorOpsCall { }; int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group); +int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len); -#endif /* SENSOR_CONFIG_CONTROLLER_H */ +#endif /* SENSOR_CONFIG_CONTROLLER_H */ \ No newline at end of file diff --git a/model/sensor/driver/common/include/sensor_config_parser.h b/model/sensor/driver/common/include/sensor_config_parser.h index 27ff0b1c4..0967186b3 100644 --- a/model/sensor/driver/common/include/sensor_config_parser.h +++ b/model/sensor/driver/common/include/sensor_config_parser.h @@ -47,7 +47,10 @@ enum SensorRegCfgIndex { struct SensorRegCfg { uint16_t regAddr; - uint16_t value; + union { + uint16_t value; + uint8_t *buff; + }; uint16_t mask; uint16_t len; uint32_t delay : 12; diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index e2f3689dd..6eb85de98 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -52,25 +52,20 @@ 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; + uint32_t originValue; + uint32_t busMask = 0xffff; + uint32_t mask; + + busMask = (busCfg->i2cCfg.regWidth == SENSOR_ADDR_WIDTH_1_BYTE) ? 0x00ff : 0xffff; + mask = GetSensorRegRealValueMask(cfgItem, &originValue, busMask); value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; - value[SENSOR_VALUE_INDEX] = cfgItem->value; + value[SENSOR_VALUE_INDEX] = cfgItem->value & mask; - switch (calType) { - case SENSOR_CFG_CALC_TYPE_NONE: - ret = WriteSensor(busCfg, value, sizeof(value)); - break; - case SENSOR_CFG_CALC_TYPE_SET: - case SENSOR_CFG_CALC_TYPE_REVERT: - case SENSOR_CFG_CALC_TYPE_XOR: - case SENSOR_CFG_CALC_TYPE_LEFT_SHIFT: - case SENSOR_CFG_CALC_TYPE_RIGHT_SHIFT: - default: - break; - } + ret = WriteSensor(busCfg, value, sizeof(value)); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "write i2c reg"); return ret; } @@ -107,6 +102,8 @@ static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *va mask = GetSensorRegRealValueMask(cfgItem, &originValue, valueMask); switch ((enum SensorCalculateType)cfgItem->calType) { + case SENSOR_CFG_CALC_TYPE_NONE: + break; case SENSOR_CFG_CALC_TYPE_SET: *value &= ~mask; *value |= (originValue & mask); @@ -116,10 +113,24 @@ static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *va *value = ~(*value & mask); *value = tmp | (*value & mask); 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 0; } @@ -150,12 +161,60 @@ 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; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(cfgItem, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(cfgItem->buff, HDF_FAILURE); + + if (busCfg->busType == SENSOR_BUS_I2C) { + ret = ReadSensor(busCfg, cfgItem->regAddr, cfgItem->buff, 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; + uint8_t *value = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(cfgItem, HDF_FAILURE); + + if (cfgItem->len > LENGTH_NUMBER) { + return HDF_FAILURE; + } + value = (uint8_t *)OsalMemCalloc(sizeof(uint8_t) * (cfgItem->len + 1)); + CHECK_NULL_PTR_RETURN_VALUE(value, HDF_FAILURE); + + value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; + memcpy(&value[SENSOR_VALUE_INDEX], cfgItem->buff, cfgItem->len); + + if (busCfg->busType == SENSOR_BUS_I2C) { + ret = WriteSensor(busCfg, value, cfgItem->len); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: write ext register failed", __func__); + OsalMemFree(value); + return HDF_FAILURE; + } + OsalMemFree(value); + } + + 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) @@ -176,7 +235,7 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg HDF_LOGE("%s: cfg item para invalid", __func__); break; } - if (g_doOpsCall[cfgItem->opsType].ops != NULL) { + if (g_doOpsCall[cfgItem->opsType].ops != NULL && cfgItem->opsType < SENSOR_OPS_TYPE_EXTBUFF_READ) { if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { HDF_LOGE("%s: malloc sensor reg config item data failed", __func__); return HDF_FAILURE; @@ -188,5 +247,54 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg num++; } + return HDF_SUCCESS; +} + +int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len) +{ + int32_t ret; + int32_t num = 0; + uint32_t count; + uint8_t buffOffset = 0; + struct SensorRegCfg *cfgItem = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(buff, HDF_FAILURE); + + count = sizeof(g_doOpsCall) / sizeof(g_doOpsCall[0]); + + while (num < group->itemNum) { + cfgItem = (group->regCfgItem + num); + if (cfgItem->opsType >= count) { + HDF_LOGE("%s: cfg item para invalid", __func__); + return HDF_FAILURE; + } + + if (g_doOpsCall[cfgItem->opsType].ops != NULL && cfgItem->opsType > SENSOR_OPS_TYPE_UPDATE_BITWISE) { + cfgItem->buff = buff + buffOffset; + len -= (int16_t)cfgItem->len; + + HDF_LOGE("%s: len = %d, regCfgItem = %d", __func__, len, cfgItem->len); + + if (len >= 0) { + if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { + HDF_LOGE("%s: extbuff is read and write failed", __func__); + return HDF_FAILURE; + } + buffOffset += cfgItem->len; + } else { + HDF_LOGE("%s: cfg item para invalid", __func__); + return HDF_FAILURE; + } + if (cfgItem->delay != 0) { + OsalMDelay(cfgItem->delay); + } + } + + num++; + } + return HDF_SUCCESS; } \ No newline at end of file -- Gitee From a7f436370b541c5b540811a5eb2867155a941aa5 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 23 Nov 2021 09:53:22 +0800 Subject: [PATCH 187/272] updata_common_02 Signed-off-by: YOUR_NAME --- .../driver/common/src/sensor_config_controller.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 6eb85de98..c710f85c0 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -174,7 +174,7 @@ static int32_t SensorOpsExtBuffRead(struct SensorBusCfg *busCfg, struct SensorRe CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); } - return ret; + return HDF_SUCCESS; } static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) @@ -199,12 +199,12 @@ static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorR if (ret != HDF_SUCCESS) { HDF_LOGE("%s: write ext register failed", __func__); OsalMemFree(value); - return HDF_FAILURE; + return HDF_FAILURE; } OsalMemFree(value); } - return ret; + return HDF_SUCCESS; } static struct SensorOpsCall g_doOpsCall[] = { @@ -252,7 +252,6 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len) { - int32_t ret; int32_t num = 0; uint32_t count; uint8_t buffOffset = 0; @@ -275,9 +274,6 @@ int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct Sen if (g_doOpsCall[cfgItem->opsType].ops != NULL && cfgItem->opsType > SENSOR_OPS_TYPE_UPDATE_BITWISE) { cfgItem->buff = buff + buffOffset; len -= (int16_t)cfgItem->len; - - HDF_LOGE("%s: len = %d, regCfgItem = %d", __func__, len, cfgItem->len); - if (len >= 0) { if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { HDF_LOGE("%s: extbuff is read and write failed", __func__); -- Gitee From b243477a3a9c96544d76e83e915b737743a6955c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 23 Nov 2021 15:58:28 +0800 Subject: [PATCH 188/272] updata_common_03 Signed-off-by: YOUR_NAME --- .../common/src/sensor_config_controller.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index c710f85c0..24e09ac92 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -62,7 +62,7 @@ static int32_t SensorOpsWrite(struct SensorBusCfg *busCfg, struct SensorRegCfg * mask = GetSensorRegRealValueMask(cfgItem, &originValue, busMask); value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; - value[SENSOR_VALUE_INDEX] = cfgItem->value & mask; + value[SENSOR_VALUE_INDEX] = originValue & mask; ret = WriteSensor(busCfg, value, sizeof(value)); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "write i2c reg"); @@ -120,12 +120,6 @@ static int32_t SensorBitwiseCalculate(struct SensorRegCfg *cfgItem, uint32_t *va *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; @@ -192,7 +186,7 @@ static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorR CHECK_NULL_PTR_RETURN_VALUE(value, HDF_FAILURE); value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; - memcpy(&value[SENSOR_VALUE_INDEX], cfgItem->buff, cfgItem->len); + memcpy_s(&value[SENSOR_VALUE_INDEX], cfgItem->len, cfgItem->buff, cfgItem->len); if (busCfg->busType == SENSOR_BUS_I2C) { ret = WriteSensor(busCfg, value, cfgItem->len); @@ -201,9 +195,8 @@ static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorR OsalMemFree(value); return HDF_FAILURE; } - OsalMemFree(value); } - + OsalMemFree(value); return HDF_SUCCESS; } @@ -235,7 +228,7 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg HDF_LOGE("%s: cfg item para invalid", __func__); break; } - if (g_doOpsCall[cfgItem->opsType].ops != NULL && cfgItem->opsType < SENSOR_OPS_TYPE_EXTBUFF_READ) { + if ((g_doOpsCall[cfgItem->opsType].ops != NULL) && (cfgItem->opsType <= SENSOR_OPS_TYPE_UPDATE_BITWISE)) { if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { HDF_LOGE("%s: malloc sensor reg config item data failed", __func__); return HDF_FAILURE; @@ -271,7 +264,7 @@ int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct Sen return HDF_FAILURE; } - if (g_doOpsCall[cfgItem->opsType].ops != NULL && cfgItem->opsType > SENSOR_OPS_TYPE_UPDATE_BITWISE) { + if ((g_doOpsCall[cfgItem->opsType].ops != NULL) && (cfgItem->opsType >= SENSOR_OPS_TYPE_EXTBUFF_READ)) { cfgItem->buff = buff + buffOffset; len -= (int16_t)cfgItem->len; if (len >= 0) { -- Gitee From 5e26a3d86ae7dbba7181ae5864d07262871869a6 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Tue, 23 Nov 2021 16:26:12 +0800 Subject: [PATCH 189/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- include/audio/audio_dai_if.h | 2 +- model/audio/common/include/audio_codec_base.h | 4 +-- model/audio/common/src/audio_codec_base.c | 2 +- model/audio/common/src/audio_platform_base.c | 10 +++---- model/audio/core/src/audio_core.c | 5 ++-- .../dispatch/src/audio_stream_dispatch.c | 27 ++++++++++++------- .../test/unittest/common/audio_sapm_test.cpp | 1 - .../audio/src/audio_accessory_base_test.c | 2 +- .../model/audio/src/audio_core_test.c | 8 +++--- .../audio/src/audio_platform_base_test.c | 13 +++++---- .../unittest/model/audio/src/hdf_audio_test.c | 3 +-- 11 files changed, 40 insertions(+), 37 deletions(-) diff --git a/include/audio/audio_dai_if.h b/include/audio/audio_dai_if.h index 9863800be..eae35f2e6 100755 --- a/include/audio/audio_dai_if.h +++ b/include/audio/audio_dai_if.h @@ -114,7 +114,7 @@ struct DaiData { * @since 1.0 * @version 1.0 */ - int32_t (*Read)(unsigned long virtualAddress, uint32_t reg, uint32_t * value); + int32_t (*Read)(unsigned long virtualAddress, uint32_t reg, uint32_t *value); /** * @brief Defines Dai device reg write. diff --git a/model/audio/common/include/audio_codec_base.h b/model/audio/common/include/audio_codec_base.h index c404017fa..984da900e 100755 --- a/model/audio/common/include/audio_codec_base.h +++ b/model/audio/common/include/audio_codec_base.h @@ -22,8 +22,8 @@ extern "C" { int32_t CodecGetServiceName(const struct HdfDeviceObject *device, const char **drvCodecName); int32_t CodecGetDaiName(const struct HdfDeviceObject *device, const char **drvDaiName); int32_t CodecGetConfigInfo(const struct HdfDeviceObject *device, struct CodecData *codecData); -int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData); -int32_t CodecSetCtlFunc(struct CodecData *codeData,const void *aiaoGetCtrl,const void *aiaoSetCtrl); +int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData); +int32_t CodecSetCtlFunc(struct CodecData *codeData, const void *aiaoGetCtrl, const void *aiaoSetCtrl); #ifdef __cplusplus #if __cplusplus diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index b247b2aaa..50d0e05d3 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -231,7 +231,7 @@ int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData) return HDF_SUCCESS; } -int32_t CodecSetCtlFunc(struct CodecData *codeData,const void *aiaoGetCtrl,const void *aiaoSetCtrl) +int32_t CodecSetCtlFunc(struct CodecData *codeData, const void *aiaoGetCtrl, const void *aiaoSetCtrl) { uint32_t index; if (codeData == NULL || codeData->regConfig == NULL || diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index ecaa409b4..35dc0c53c 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -358,11 +358,10 @@ static int32_t PcmReadData(struct PlatformData *data, struct AudioRxData *rxData // 3. Big Small Exchange if (!data->pcmInfo.isBigEndian) { - if (rxData->buf == NULL || - AudioDataBigEndianChange(rxData->buf, data->captureBufInfo.curTrafSize, - data->pcmInfo.bitWidth) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); - return HDF_FAILURE; + if (rxData->buf == NULL || AudioDataBigEndianChange(rxData->buf, + data->captureBufInfo.curTrafSize, data->pcmInfo.bitWidth) != HDF_SUCCESS) { + AUDIO_DRIVER_LOG_ERR("AudioDataBigEndianChange: failed."); + return HDF_FAILURE; } } @@ -643,7 +642,6 @@ int32_t AudioMmapReadTransfer(const struct AudioCard *card, const struct AudioMm return HDF_FAILURE; } offset += data->captureBufInfo.curTrafSize; - } while (offset < totalSize && data->captureBufInfo.runStatus != 0); return HDF_SUCCESS; } diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index 6dc781861..cf66cad09 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -95,7 +95,8 @@ int32_t AudioRegisterAccessory(struct HdfDeviceObject *device, int32_t ret; if (device == NULL || accessoryData == NULL || daiData == NULL) { - ADM_LOG_ERR("Input params check error: device=%p, accessoryData=%p, daiData=%p.", device, accessoryData, daiData); + ADM_LOG_ERR("Input params check error: device=%p, accessoryData=%p, daiData=%p.", + device, accessoryData, daiData); return HDF_ERR_INVALID_OBJECT; } @@ -178,7 +179,7 @@ int32_t AudioRegisterDsp(struct HdfDeviceObject *device, struct DspData *dspData dspDev->devData = dspData; dspDev->device = device; - ret = AudioSocRegisterDai(device, DaiData ); + ret = AudioSocRegisterDai(device, DaiData); if (ret != HDF_SUCCESS) { OsalMemFree(dspDev); ADM_LOG_ERR("Register dai device fail ret=%d", ret); diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index 68cfbdbe5..3179e4fd3 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -751,7 +751,7 @@ static int32_t StreamHostRead(const struct HdfDeviceIoClient *client, struct Hdf return HDF_FAILURE; } - if (rxData.bufSize !=0) { + if (rxData.bufSize != 0) { if (!HdfSbufWriteBuffer(reply, rxData.buf, (uint32_t)(rxData.bufSize))) { ADM_LOG_ERR("write request data buf failed!"); return HDF_FAILURE; @@ -816,7 +816,8 @@ static int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struc ADM_LOG_DEBUG("success."); return HDF_SUCCESS; } -static int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapPositionWrite(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; ADM_LOG_DEBUG("entry."); @@ -891,7 +892,8 @@ static int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct return HDF_SUCCESS; } -static int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostMmapPositionRead(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; ADM_LOG_DEBUG("entry."); @@ -968,7 +970,8 @@ static int32_t StreamTriggerRouteImpl(const struct AudioCard *audioCard, const s return HDF_SUCCESS; } -static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; @@ -1001,7 +1004,8 @@ static int32_t StreamHostRenderStart(const struct HdfDeviceIoClient *client, str return HDF_SUCCESS; } -static int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureStart(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; @@ -1104,7 +1108,8 @@ static int32_t StreamHostRenderClose(const struct HdfDeviceIoClient *client, str } -static int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; @@ -1144,7 +1149,8 @@ static int32_t StreamHostCaptureStop(const struct HdfDeviceIoClient *client, str return HDF_SUCCESS; } -static int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioCard *audioCard = NULL; int ret; @@ -1175,7 +1181,8 @@ static int32_t StreamHostCaptureClose(const struct HdfDeviceIoClient *client, st } -static int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t StreamHostRenderPause(const struct HdfDeviceIoClient *client, + struct HdfSBuf *data, struct HdfSBuf *reply) { struct AudioRuntimeDeivces *rtd = NULL; struct AudioCard *audioCard = NULL; @@ -1462,8 +1469,8 @@ static struct StreamDispCmdHandleList g_streamDispCmdHandle[] = { {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION, StreamHostMmapPositionWrite}, {AUDIO_DRV_PCM_IOCTL_MMAP_POSITION_CAPTURE, StreamHostMmapPositionRead}, {AUDIO_DRV_PCM_IOCTL_DSPDECODE, StreamHostDspDecode}, - {AUDIO_DRV_PCM_IOCTL_DSPENCODE,StreamHostDspEncode}, - {AUDIO_DRV_PCM_IOCTL_DSPEQUALIZER,StreamHostDspEqualizer}, + {AUDIO_DRV_PCM_IOCTL_DSPENCODE, StreamHostDspEncode}, + {AUDIO_DRV_PCM_IOCTL_DSPEQUALIZER, StreamHostDspEqualizer}, }; static int32_t StreamDispatch(struct HdfDeviceIoClient *client, int cmdId, diff --git a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp index a58531925..2dcd590d3 100755 --- a/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp +++ b/model/audio/sapm/test/unittest/common/audio_sapm_test.cpp @@ -97,5 +97,4 @@ HWTEST_F(AudioSapmTest, AudioSapmTest_AudioAccessorySapmGetCtrlOps, TestSize.Lev struct HdfTestMsg msg = {g_testAudioType, TEST_AUDIOACCESSORYSAPMGETCTRLOPS, -1}; EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } - } diff --git a/test/unittest/model/audio/src/audio_accessory_base_test.c b/test/unittest/model/audio/src/audio_accessory_base_test.c index 986e6b83f..8e345a64c 100644 --- a/test/unittest/model/audio/src/audio_accessory_base_test.c +++ b/test/unittest/model/audio/src/audio_accessory_base_test.c @@ -99,7 +99,7 @@ int32_t AccessoryDeviceRegWriteTest(void) { struct AccessoryDevice codec; if (AccessoryDeviceRegWrite(NULL, 0, 0) == HDF_SUCCESS) { - HDF_LOGE("%s_[%d] AccessoryDeviceRegWrite fail", __func__, __LINE__);; + HDF_LOGE("%s_[%d] AccessoryDeviceRegWrite fail", __func__, __LINE__); } if (AccessoryDeviceRegWrite(&codec, 0, 0) == HDF_SUCCESS) { diff --git a/test/unittest/model/audio/src/audio_core_test.c b/test/unittest/model/audio/src/audio_core_test.c index 5b4a1910f..37b05af12 100755 --- a/test/unittest/model/audio/src/audio_core_test.c +++ b/test/unittest/model/audio/src/audio_core_test.c @@ -16,8 +16,8 @@ static struct AudioMixerControl g_audioTestReg = { .reg = 0x2004, /* [0] output volume */ .rreg = 0x2004, /* register value */ - .shift = 8, /* offset */ - .rshift = 8, /* right offset */ + .shift = 8, /* reg offset */ + .rshift = 8, /* right reg offset */ .min = 0x28, /* min value */ .max = 0x7F, /* max value */ .mask = 0x7F, /* mask value */ @@ -38,14 +38,14 @@ int32_t AudioDeviceReadRegTest(void) { int value; HDF_LOGI("%s: enter", __func__); - return AudioDeviceReadRegMock(0 ,0, &value); + return AudioDeviceReadRegMock(0 , 0, &value); HDF_LOGI("%s: success", __func__); } int32_t AudioDeviceWriteRegTest(void) { HDF_LOGI("%s: enter", __func__); - return AudioDeviceWriteRegMock(0 ,0, 0);; + return AudioDeviceWriteRegMock(0 , 0, 0); HDF_LOGI("%s: success", __func__); } diff --git a/test/unittest/model/audio/src/audio_platform_base_test.c b/test/unittest/model/audio/src/audio_platform_base_test.c index 7bf217fa6..636b4efd6 100644 --- a/test/unittest/model/audio/src/audio_platform_base_test.c +++ b/test/unittest/model/audio/src/audio_platform_base_test.c @@ -42,22 +42,23 @@ int32_t AudioBytesToFramesTest(void) int32_t AudioDataBigEndianChangeTest(void) { - char test[32]; - memset(&test, 1, 32); + const int dataLen = 32; //test data lenth + char test[dataLen]; + memset(&test, 1, dataLen); if (AudioDataBigEndianChange(NULL, 0, 0) == HDF_SUCCESS) { return HDF_FAILURE; } - if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH8) != HDF_SUCCESS) { + if (AudioDataBigEndianChange(test, dataLen, DATA_BIT_WIDTH8) != HDF_SUCCESS) { return HDF_FAILURE; } - if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH24) != HDF_SUCCESS) { + if (AudioDataBigEndianChange(test, dataLen, DATA_BIT_WIDTH24) != HDF_SUCCESS) { return HDF_FAILURE; } - if (AudioDataBigEndianChange(test, 32, DATA_BIT_WIDTH16) != HDF_SUCCESS) { + if (AudioDataBigEndianChange(test, dataLen, DATA_BIT_WIDTH16) != HDF_SUCCESS) { return HDF_FAILURE; } @@ -396,8 +397,6 @@ int32_t AudioCaptureTriggerTest(void) if (AudioCaptureTrigger(&card, AUDIO_DRV_PCM_IOCTL_CAPTURE_RESUME) == HDF_SUCCESS) { return HDF_FAILURE; } - return HDF_SUCCESS; - } diff --git a/test/unittest/model/audio/src/hdf_audio_test.c b/test/unittest/model/audio/src/hdf_audio_test.c index 44ade0ff0..fb0946026 100755 --- a/test/unittest/model/audio/src/hdf_audio_test.c +++ b/test/unittest/model/audio/src/hdf_audio_test.c @@ -27,7 +27,7 @@ static HdfTestCaseList g_hdfAudioTestCaseList[] = { {AUDIO_ADM_TEST_GETCARDINSTANCE, GetCardInstanceTest}, // audio ADM audio_host {AUDIO_ADM_TEST_AUDIOFILLCONFIGDATA, AudioFillConfigDataTest}, // audio ADM audio_parse - {AUDIO_ADM_TEST_CODECGETREGCONFIG , CodecGetRegConfigTest}, // audio ADM audio_parse + {AUDIO_ADM_TEST_CODECGETREGCONFIG, CodecGetRegConfigTest}, // audio ADM audio_parse {AUDIO_ADM_TEST_AUDIODEVICEREADREG, AudioDeviceReadRegTest}, // audio ADM audio_core {AUDIO_ADM_TEST_AUDIODEVICEWRITEREG, AudioDeviceWriteRegTest}, // audio ADM audio_core @@ -74,7 +74,6 @@ static HdfTestCaseList g_hdfAudioTestCaseList[] = { {AUDIO_ADM_TEST_AUDIOACCESSORYSAPMSETCTRLOPS, AudioAccessorySapmSetCtrlOpsTest}, // audio ADM audio_sapm {AUDIO_ADM_TEST_AUDIOACCESSORYSAPMGETCTRLOPS, AudioAccessorySapmGetCtrlOpsTest}, // audio ADM audio_sapm - {AUDIO_ADM_TEST_I2CREADWRITE, AccessoryI2cReadWriteTest}, {AUDIO_ADM_TEST_REGBITSREAD, AccessoryRegBitsReadTest}, {AUDIO_ADM_TEST_REGBITSUPDATE, AccessoryRegBitsUpdateTest}, -- Gitee From 88e3232a6145420969384b74cb319e9cb250c37a Mon Sep 17 00:00:00 2001 From: jifengfei Date: Tue, 23 Nov 2021 19:06:48 +0800 Subject: [PATCH 190/272] add hall delay Signed-off-by: jifengfei --- model/sensor/driver/common/src/sensor_config_parser.c | 2 ++ model/sensor/driver/hall/sensor_hall_driver.c | 6 +++--- model/sensor/driver/include/sensor_platform_if.h | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 9f0f3d4dd..676e65e60 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -363,6 +363,8 @@ static int32_t ParseSensorBus(struct DeviceResourceIface *parser, const struct D CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq1"); ret = parser->GetUint32(busNode, "gpioIrq2", &config->busCfg.GpioNum[SENSOR_GPIO_NUM2], 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq2"); + ret = parser->GetUint32(busNode, "delayedTime", &config->busCfg.GpioNum[SENSOR_DELAYED_TIME], 0); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "delayedTime"); } return HDF_SUCCESS; diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 61b2bbe0b..2ba342bdc 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -107,7 +107,7 @@ static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) drvData->status = 0; } - if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { + if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork, drvData->hallCfg->busCfg.GpioNum[SENSOR_DELAYED_TIME])) { HDF_LOGE("%s: Hall north add work queue failed", __func__); } @@ -133,7 +133,7 @@ static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) drvData->status = 0; } - if (!HdfAddWork(&drvData->hallWorkQueue, &drvData->hallWork)) { + if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork,drvData->hallCfg->busCfg.GpioNum[SENSOR_DELAYED_TIME])) { HDF_LOGE("%s: Hall south add work queue failed", __func__); } @@ -147,7 +147,7 @@ static int32_t InitHallData(struct HallDrvData *drvData) return HDF_FAILURE; } - if (HdfWorkInit(&drvData->hallWork, HallDataWorkEntry, drvData) != HDF_SUCCESS) { + if (HdfDelayedWorkInit(&drvData->hallWork, HallDataWorkEntry, drvData) != HDF_SUCCESS) { HDF_LOGE("%s: Hall create thread failed", __func__); return HDF_FAILURE; } diff --git a/model/sensor/driver/include/sensor_platform_if.h b/model/sensor/driver/include/sensor_platform_if.h index 6f1489383..12cad6680 100644 --- a/model/sensor/driver/include/sensor_platform_if.h +++ b/model/sensor/driver/include/sensor_platform_if.h @@ -58,7 +58,8 @@ enum SensorBusType { enum SensorGpioNum { SENSOR_GPIO_NUM1 = 0, SENSOR_GPIO_NUM2 = 1, - SENSOR_GPIO_NUM_MAX = 2, + SENSOR_DELAYED_TIME = 2, + SENSOR_GPIO_NUM_MAX = 3, }; struct SensorI2cCfg { -- Gitee From 53191d693031ddf60d6524dd6b3021c70e6a735e Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 24 Nov 2021 03:09:35 +0000 Subject: [PATCH 191/272] =?UTF-8?q?=E8=A7=A3=E5=86=B3pwm=E8=83=8C=E5=85=89?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=AE=BE=E7=BD=AE0=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- model/display/driver/backlight/pwm_bl.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/model/display/driver/backlight/pwm_bl.c b/model/display/driver/backlight/pwm_bl.c index 2532e0f4a..f2dc3ac7a 100644 --- a/model/display/driver/backlight/pwm_bl.c +++ b/model/display/driver/backlight/pwm_bl.c @@ -48,18 +48,16 @@ static int32_t BlPwmUpdateBrightness(struct BacklightDev *blDev, uint32_t bright HDF_LOGE("%s maxBrightness is 0", __func__); return HDF_FAILURE; } + if (brightness == 0) { + return PwmDisable(blPwmDev->pwmHandle); + } duty = (brightness * blPwmDev->config.period) / blPwmDev->props.maxBrightness; ret = PwmSetDuty(blPwmDev->pwmHandle, duty); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: PwmSetDuty failed, ret %d", __func__, ret); return HDF_FAILURE; } - if (brightness != 0) { - ret = PwmEnable(blPwmDev->pwmHandle); - } else { - ret = PwmDisable(blPwmDev->pwmHandle); - } - return ret; + return PwmEnable(blPwmDev->pwmHandle); } static struct BacklightOps g_blDevOps = { -- Gitee From a1958dc9c92f7c13d61a4793b309d0edc0cfd643 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Wed, 24 Nov 2021 14:36:29 +0800 Subject: [PATCH 192/272] add delayed time code Signed-off-by: jifengfei --- .../driver/common/src/sensor_config_parser.c | 2 -- model/sensor/driver/hall/sensor_hall_driver.c | 36 ++++++++++++++++--- model/sensor/driver/hall/sensor_hall_driver.h | 1 + .../driver/include/sensor_platform_if.h | 3 +- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 676e65e60..9f0f3d4dd 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -363,8 +363,6 @@ static int32_t ParseSensorBus(struct DeviceResourceIface *parser, const struct D CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq1"); ret = parser->GetUint32(busNode, "gpioIrq2", &config->busCfg.GpioNum[SENSOR_GPIO_NUM2], 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "gpioIrq2"); - ret = parser->GetUint32(busNode, "delayedTime", &config->busCfg.GpioNum[SENSOR_DELAYED_TIME], 0); - CHECK_PARSER_RESULT_RETURN_VALUE(ret, "delayedTime"); } return HDF_SUCCESS; diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 2ba342bdc..8e0b0771c 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -88,6 +88,28 @@ static void HallDataWorkEntry(void *arg) } } +static int32_t ParserHallDelayedConfigData(const struct DeviceResourceNode *node, struct HallDrvData *drvData) +{ + int32_t ret; + struct DeviceResourceIface *parser = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); + + CHECK_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); + + const struct DeviceResourceNode *pinNode = parser->GetChildNode(node, "hallDelayedConfig"); + CHECK_NULL_PTR_RETURN_VALUE(pinNode, HDF_ERR_INVALID_PARAM); + + ret = parser->GetUint32(pinNode, "delayedTime", (uint32_t *)&drvData->delayTime, 0); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "delayedTime"); + + return HDF_SUCCESS; +} + static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) { (void)gpio; @@ -107,8 +129,8 @@ static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) drvData->status = 0; } - if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork, drvData->hallCfg->busCfg.GpioNum[SENSOR_DELAYED_TIME])) { - HDF_LOGE("%s: Hall north add work queue failed", __func__); + if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork, drvData->delayTime)) { + HDF_LOGE("%s: Hall north add delay work queue failed", __func__); } return HDF_SUCCESS; @@ -133,8 +155,8 @@ static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) drvData->status = 0; } - if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork,drvData->hallCfg->busCfg.GpioNum[SENSOR_DELAYED_TIME])) { - HDF_LOGE("%s: Hall south add work queue failed", __func__); + if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork,drvData->delayTime)) { + HDF_LOGE("%s: Hall south add delay work queue failed", __func__); } return HDF_SUCCESS; @@ -318,6 +340,12 @@ static int32_t InitHallAfterDetected(const struct DeviceResourceNode *node, stru return HDF_FAILURE; } + if (ParserHallDelayedConfigData(node, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: get hall delayed config failed", __func__); + (void)DeleteSensorDevice(&drvData->hallCfg->sensorInfo); + return HDF_FAILURE; + } + return HDF_SUCCESS; } diff --git a/model/sensor/driver/hall/sensor_hall_driver.h b/model/sensor/driver/hall/sensor_hall_driver.h index 29071bb2b..fd745fbcd 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.h +++ b/model/sensor/driver/hall/sensor_hall_driver.h @@ -31,6 +31,7 @@ struct HallDrvData { struct SensorCfgData *hallCfg; struct HallOpsCall ops; uint16_t status; + unsigned long delayTime; }; int32_t HallRegisterChipOps(const struct HallOpsCall *ops); diff --git a/model/sensor/driver/include/sensor_platform_if.h b/model/sensor/driver/include/sensor_platform_if.h index 12cad6680..6f1489383 100644 --- a/model/sensor/driver/include/sensor_platform_if.h +++ b/model/sensor/driver/include/sensor_platform_if.h @@ -58,8 +58,7 @@ enum SensorBusType { enum SensorGpioNum { SENSOR_GPIO_NUM1 = 0, SENSOR_GPIO_NUM2 = 1, - SENSOR_DELAYED_TIME = 2, - SENSOR_GPIO_NUM_MAX = 3, + SENSOR_GPIO_NUM_MAX = 2, }; struct SensorI2cCfg { -- Gitee From 4e03be44ff391bd7bd3ef8e5b9195263f6249c06 Mon Sep 17 00:00:00 2001 From: zhouyanxu Date: Wed, 24 Nov 2021 14:40:01 +0800 Subject: [PATCH 193/272] =?UTF-8?q?=E6=B8=85=E7=90=86sensor=E5=91=8A?= =?UTF-8?q?=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhouyanxu --- .../sensor/driver/chipset/proximity/proximity_apds9960.c | 7 ++++--- model/sensor/driver/hall/sensor_hall_driver.c | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/model/sensor/driver/chipset/proximity/proximity_apds9960.c b/model/sensor/driver/chipset/proximity/proximity_apds9960.c index 1fbc5bfe0..d3eb9598c 100644 --- a/model/sensor/driver/chipset/proximity/proximity_apds9960.c +++ b/model/sensor/driver/chipset/proximity/proximity_apds9960.c @@ -16,6 +16,8 @@ #define HDF_LOG_TAG proximity_apds9960_c +#define PROXIMITY_STATE_FAR 5 +#define PROXIMITY_STATE_NEAR 0 static struct Apds9960DrvData *g_apds9960DrvData = NULL; @@ -68,15 +70,14 @@ int32_t ReadApds9960Data(struct SensorCfgData *data) event.mode = SENSOR_WORK_MODE_ON_CHANGE; if (rawData.stateFlag <= APDS9960_PROXIMITY_THRESHOLD) { - tmp = 5; //far state + tmp = PROXIMITY_STATE_FAR; } else { - tmp = 0; //near state + tmp = PROXIMITY_STATE_NEAR; } event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; ret = ReportSensorEvent(&event); - if (ret != HDF_SUCCESS) { HDF_LOGE("%s: APDS9960 report data failed", __func__); } diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 61b2bbe0b..be47dc143 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -98,12 +98,12 @@ static int32_t HallNorthPolarityIrqFunc(uint16_t gpio, void *data) CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); ret = GpioRead(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM1], (uint16_t *)&valRead); - if(ret != 0) { + if (ret != 0) { HDF_LOGE("%s: Read hall gpio value failed", __func__); } if (valRead == GPIO_VAL_LOW) { drvData->status = 1; - } else if(valRead == GPIO_VAL_HIGH) { + } else if (valRead == GPIO_VAL_HIGH) { drvData->status = 0; } @@ -124,12 +124,12 @@ static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); ret = GpioRead(drvData->hallCfg->busCfg.GpioNum[SENSOR_GPIO_NUM2], (uint16_t *)&valRead); - if(ret != 0) { + if (ret != 0) { HDF_LOGE("%s: Read hall gpio value failed", __func__); } if (valRead == GPIO_VAL_LOW) { drvData->status = 1; - } else if(valRead == GPIO_VAL_HIGH) { + } else if (valRead == GPIO_VAL_HIGH) { drvData->status = 0; } -- Gitee From 61cc158a1febeb9e7f0f21c1cea08ba36ab82680 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Wed, 24 Nov 2021 15:47:20 +0800 Subject: [PATCH 194/272] modify code Signed-off-by: jifengfei --- model/sensor/driver/hall/sensor_hall_driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 8e0b0771c..326df3958 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -101,8 +101,8 @@ static int32_t ParserHallDelayedConfigData(const struct DeviceResourceNode *node CHECK_NULL_PTR_RETURN_VALUE(parser->GetChildNode, HDF_ERR_INVALID_PARAM); - const struct DeviceResourceNode *pinNode = parser->GetChildNode(node, "hallDelayedConfig"); - CHECK_NULL_PTR_RETURN_VALUE(pinNode, HDF_ERR_INVALID_PARAM); + const struct DeviceResourceNode *delayedNode = parser->GetChildNode(node, "hallDelayedConfig"); + CHECK_NULL_PTR_RETURN_VALUE(delayedNode, HDF_ERR_INVALID_PARAM); ret = parser->GetUint32(pinNode, "delayedTime", (uint32_t *)&drvData->delayTime, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "delayedTime"); -- Gitee From 32814666bdbf1b97b5c4f59f047c8615e3a3ca22 Mon Sep 17 00:00:00 2001 From: jifengfei Date: Thu, 25 Nov 2021 09:22:03 +0800 Subject: [PATCH 195/272] modify code Signed-off-by: jifengfei --- model/sensor/driver/hall/sensor_hall_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 326df3958..c9f6ce148 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -104,7 +104,7 @@ static int32_t ParserHallDelayedConfigData(const struct DeviceResourceNode *node const struct DeviceResourceNode *delayedNode = parser->GetChildNode(node, "hallDelayedConfig"); CHECK_NULL_PTR_RETURN_VALUE(delayedNode, HDF_ERR_INVALID_PARAM); - ret = parser->GetUint32(pinNode, "delayedTime", (uint32_t *)&drvData->delayTime, 0); + ret = parser->GetUint32(delayedNode, "delayedTime", (uint32_t *)&drvData->delayTime, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "delayedTime"); return HDF_SUCCESS; -- Gitee From 7d6c395bb7e86f8be5d3ff06f26f9dd112729932 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 25 Nov 2021 13:00:19 +0800 Subject: [PATCH 196/272] updata_common_04 Signed-off-by: YOUR_NAME --- model/sensor/driver/common/src/sensor_config_controller.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 24e09ac92..c4a3cebd9 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -163,6 +163,9 @@ static int32_t SensorOpsExtBuffRead(struct SensorBusCfg *busCfg, struct SensorRe CHECK_NULL_PTR_RETURN_VALUE(cfgItem, HDF_FAILURE); CHECK_NULL_PTR_RETURN_VALUE(cfgItem->buff, HDF_FAILURE); + if (cfgItem->len > LENGTH_NUMBER) { + return HDF_FAILURE; + } if (busCfg->busType == SENSOR_BUS_I2C) { ret = ReadSensor(busCfg, cfgItem->regAddr, cfgItem->buff, cfgItem->len); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); -- Gitee From 05608531382dd1bc3a33bfd7b24652a271b3aedf Mon Sep 17 00:00:00 2001 From: yuanbo Date: Thu, 25 Nov 2021 14:27:49 +0800 Subject: [PATCH 197/272] fix ioservice test resource leak issue Signed-off-by: yuanbo --- core/manager/test/unittest/common/hdf_ioservice_test.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/manager/test/unittest/common/hdf_ioservice_test.cpp b/core/manager/test/unittest/common/hdf_ioservice_test.cpp index c200084a3..8e12f229a 100644 --- a/core/manager/test/unittest/common/hdf_ioservice_test.cpp +++ b/core/manager/test/unittest/common/hdf_ioservice_test.cpp @@ -674,4 +674,10 @@ HWTEST_F(IoServiceTest, HdfIoService014, TestSize.Level0) ret = HdfDeviceUnregisterEventListener(serv, &listener0.listener); EXPECT_NE(ret, HDF_SUCCESS); + + ret = HdfDeviceUnregisterEventListener(serv1, &listener1.listener); + ASSERT_EQ(ret, HDF_SUCCESS); + + HdfIoServiceRecycle(serv); + HdfIoServiceRecycle(serv1); } \ No newline at end of file -- Gitee From 6ccfce38f450e238da19322fcc9e6b550a2d70f9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 24 Nov 2021 16:07:32 +0800 Subject: [PATCH 198/272] clear warings Signed-off-by: YOUR_NAME --- tools/hc-gen/src/bytecode_gen.cpp | 2 +- tools/hc-gen/src/lexer.cpp | 4 +- tools/hc-gen/src/macro_gen.cpp | 103 ++++++++++-------- tools/hc-gen/src/macro_gen.h | 2 + tools/hc-gen/src/option.cpp | 97 +++++++++-------- tools/hc-gen/src/option.h | 1 + tools/hc-gen/test/update_case.py | 1 + .../command_line/hdf_set_handler.py | 8 +- 8 files changed, 119 insertions(+), 99 deletions(-) diff --git a/tools/hc-gen/src/bytecode_gen.cpp b/tools/hc-gen/src/bytecode_gen.cpp index 88e3bc2d4..7ff30a660 100644 --- a/tools/hc-gen/src/bytecode_gen.cpp +++ b/tools/hc-gen/src/bytecode_gen.cpp @@ -15,7 +15,7 @@ using namespace OHOS::Hardware; ByteCodeGen::ByteCodeGen(std::shared_ptr ast) : Generator(ast), - needAlign_(false) + needAlign_(false), dummyOutput_(false), writeSize_(0) { } diff --git a/tools/hc-gen/src/lexer.cpp b/tools/hc-gen/src/lexer.cpp index 8e2cf91e5..38444f648 100644 --- a/tools/hc-gen/src/lexer.cpp +++ b/tools/hc-gen/src/lexer.cpp @@ -171,7 +171,7 @@ bool Lexer::FillBuffer() bool Lexer::ProcessComment() { - char c; + char c = 0; ConsumeChar();// skip first '/' if (!GetChar(c)) { Logger().Error() << *this << "unterminated comment"; @@ -254,7 +254,7 @@ bool Lexer::LexFromString(Token &token) bool Lexer::LexFromNumber(Token &token) { std::string value; - char c; + char c = 0; uint64_t v = 0; errno = 0; diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index 07460d049..801fcd05e 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -224,56 +224,63 @@ bool MacroGen::NodeWalk() static uint32_t arraySize = 0; static uint32_t arrayType = 0; - Logger().Debug() << "name,type:[" << current->Name() << "," << type << "] depth:" << depth - << " arraySize:" << std::dec << arraySize << '\n'; - switch (type) { - case PARSEROP_UINT8: - case PARSEROP_UINT16: - case PARSEROP_UINT32: - case PARSEROP_UINT64: { - if (arraySize != 0) { - GenArray(arrayName, arraySize, arrayType, current); - } else { - ofs_ << " " << current->IntegerValue() << std::endl; - } - break; - } - case PARSEROP_STRING: - if (arraySize != 0) { - GenArray(arrayName, arraySize, arrayType, current); - } else { - ofs_ << " " << '"' << current->StringValue() << '"' << std::endl; - } - break; - case PARSEROP_CONFTERM: - ofs_ << "#define " << GenFullName(depth, current, "_") << "_exists 1" << std::endl; - ofs_ << "#define " << GenFullName(depth, current, "_"); - break; - case PARSEROP_CONFNODE: { - if (nodeName != current->Name()) { - ofs_ << std::endl; - } - nodeName = current->Name(); - nodeNameMap_[depth] = nodeName; - GenNodeForeach(depth, current); - break; + Logger().Debug() << "name,type:[" << current->Name() << "," << type \ + << "] depth:" << depth \ + << " arraySize:" << std::dec << arraySize << '\n'; + SetTypeData(type, current, nodeName, arrayName, arraySize, arrayType, depth); + + return NOERR; + }); +} + +void MacroGen::SetTypeData(uint32_t type, const std::shared_ptr ¤t, std::string &nodeName, + std::string &arrayName, uint32_t &arraySize, uint32_t &arrayType, uint32_t depth) +{ + switch (type) { + case PARSEROP_UINT8: + case PARSEROP_UINT16: + case PARSEROP_UINT32: + case PARSEROP_UINT64: { + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << current->IntegerValue() << std::endl; } - case PARSEROP_ARRAY: { - std::shared_ptr parent(current->Parent()); - arraySize = ConfigArray::CastFrom(current)->ArraySize(); - arrayType = ConfigArray::CastFrom(current)->ArrayType(); - ofs_ << "_array_size " << arraySize << std::endl; - arrayName = GenFullName(depth - 1, parent, "_"); - break; + break; + } + case PARSEROP_STRING: + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << '"' << current->StringValue() << '"' << std::endl; } - case PARSEROP_NODEREF: { - ofs_ << " " << GenRefObjName(depth, current) << std::endl; - break; + break; + case PARSEROP_CONFTERM: + ofs_ << "#define " << GenFullName(depth, current, "_") << "_exists 1" << std::endl; + ofs_ << "#define " << GenFullName(depth, current, "_"); + break; + case PARSEROP_CONFNODE: { + if (nodeName != current->Name()) { + ofs_ << std::endl; } - default: - break; + nodeName = current->Name(); + nodeNameMap_[depth] = nodeName; + GenNodeForeach(depth, current); + break; } - - return NOERR; - }); + case PARSEROP_ARRAY: { + std::shared_ptr parent(current->Parent()); + arraySize = ConfigArray::CastFrom(current)->ArraySize(); + arrayType = ConfigArray::CastFrom(current)->ArrayType(); + ofs_ << "_array_size " << arraySize << std::endl; + arrayName = GenFullName(depth - 1, parent, "_"); + break; + } + case PARSEROP_NODEREF: { + ofs_ << " " << GenRefObjName(depth, current) << std::endl; + break; + } + default: + break; + } } diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 250716b51..4aab864e5 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -47,6 +47,8 @@ private: std::ofstream ofs_; std::string outFileName_; std::map nodeNameMap_; + void SetTypeData(uint32_t type, const std::shared_ptr ¤t, std::string &nodeName, + std::string &arrayName, uint32_t &arraySize, uint32_t &arrayType, uint32_t depth); }; } // Hardware } // OHOS diff --git a/tools/hc-gen/src/option.cpp b/tools/hc-gen/src/option.cpp index 88576278a..08aaa57a8 100644 --- a/tools/hc-gen/src/option.cpp +++ b/tools/hc-gen/src/option.cpp @@ -58,57 +58,62 @@ bool Option::ParseOptions(int argc, char **argv) int32_t op = 0; while (op != OPTION_END) { op = getopt(argc, argv, HCS_SUPPORT_ARGS); - switch (op) { - case 'o': - outputName_ = optarg; - break; - case 'a': - shouldAlign_ = true; - break; - case 'b': - shouldGenByteCodeConfig_ = true; - break; - case 't': - shouldGenTextConfig_ = true; - shouldGenByteCodeConfig_ = false; - shouldGenMacroConfig_ = false; - break; - case 'm': - shouldGenTextConfig_ = false; - shouldGenByteCodeConfig_ = false; - shouldGenMacroConfig_ = true; - break; - case 'p': - symbolNamePrefix_ = optarg; - break; - case 'i': - showGenHexDump_ = true; - break; - case 'V': - verboseLog_ = true; - break; - case 'd': - shouldDecompile_ = true; - break; - case 'v': - showVersion_ = true; - return false; - case 'h': /* fall-through */ - showUsage_ = true; - return false; - case '?': - showUsage_ = true; - optionError_ = true; - SetOptionError(); - return false; - default: - break; - } + SetOptionData(op); } return true; } +void Option::SetOptionData(char op) +{ + switch (op) { + case 'o': + outputName_ = optarg; + break; + case 'a': + shouldAlign_ = true; + break; + case 'b': + shouldGenByteCodeConfig_ = true; + break; + case 't': + shouldGenTextConfig_ = true; + shouldGenByteCodeConfig_ = false; + shouldGenMacroConfig_ = false; + break; + case 'm': + shouldGenTextConfig_ = false; + shouldGenByteCodeConfig_ = false; + shouldGenMacroConfig_ = true; + break; + case 'p': + symbolNamePrefix_ = optarg; + break; + case 'i': + showGenHexDump_ = true; + break; + case 'V': + verboseLog_ = true; + break; + case 'd': + shouldDecompile_ = true; + break; + case 'v': + showVersion_ = true; + break; + case 'h': /* fall-through */ + showUsage_ = true; + break; + case '?': + showUsage_ = true; + optionError_ = true; + SetOptionError(); + break; + default: + break; + } +} + void Option::ShowUsage() { Logger() << diff --git a/tools/hc-gen/src/option.h b/tools/hc-gen/src/option.h index 8a4522dc9..1446abda4 100644 --- a/tools/hc-gen/src/option.h +++ b/tools/hc-gen/src/option.h @@ -83,6 +83,7 @@ private: std::string sourceNameBase_; std::string outputName_; std::string sourceDir_; + void SetOptionData(char op); }; } // Hardware diff --git a/tools/hc-gen/test/update_case.py b/tools/hc-gen/test/update_case.py index bbfee99e1..6706b1976 100755 --- a/tools/hc-gen/test/update_case.py +++ b/tools/hc-gen/test/update_case.py @@ -169,6 +169,7 @@ def build_text(hcgen_path, case_name): os.rename(target_file + '.h', target_file + '.h.gen') return True + def build_macro(hcgen_path, case_name): source_file = os.path.join(WORK_DIR, case_name, 'case.hcs') target_file = os.path.join(WORK_DIR, case_name, 'macro') diff --git a/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py b/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py index a06ff1b46..b8c6c9e0e 100755 --- a/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py +++ b/tools/hdf_dev_eco_tool/command_line/hdf_set_handler.py @@ -153,7 +153,9 @@ class HdfSetHandler(HdfCommandHandlerBase): self.check_arg_raise_if_not_exist("board_name") self.check_arg_raise_if_not_exist("module_name") root, vendor, model, _, board, _ = self.get_args() - return EnableOperation(root=root, vendor=vendor, board=board, model=model).operation_enable() + return EnableOperation( + root=root, vendor=vendor, board=board, + model=model).operation_enable() def _disable_operation(self): self.check_arg_raise_if_not_exist("root_dir") @@ -161,4 +163,6 @@ class HdfSetHandler(HdfCommandHandlerBase): self.check_arg_raise_if_not_exist("board_name") self.check_arg_raise_if_not_exist("module_name") root, vendor, model, _, board, _ = self.get_args() - return EnableOperation(root=root, vendor=vendor, board=board, model=model).operation_disable() \ No newline at end of file + return EnableOperation( + root=root, vendor=vendor, board=board, + model=model).operation_disable() \ No newline at end of file -- Gitee From 30a74ccb6d72d3da30673d1e8b71a58549af3c37 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 25 Nov 2021 16:08:18 +0800 Subject: [PATCH 199/272] updata_common_05 Signed-off-by: YOUR_NAME --- model/sensor/driver/common/src/sensor_config_controller.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index c4a3cebd9..24e09ac92 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -163,9 +163,6 @@ static int32_t SensorOpsExtBuffRead(struct SensorBusCfg *busCfg, struct SensorRe CHECK_NULL_PTR_RETURN_VALUE(cfgItem, HDF_FAILURE); CHECK_NULL_PTR_RETURN_VALUE(cfgItem->buff, HDF_FAILURE); - if (cfgItem->len > LENGTH_NUMBER) { - return HDF_FAILURE; - } if (busCfg->busType == SENSOR_BUS_I2C) { ret = ReadSensor(busCfg, cfgItem->regAddr, cfgItem->buff, cfgItem->len); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); -- Gitee From 302c5d923b845fcb2c13ecf5a3846c6b380ae4f3 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Thu, 25 Nov 2021 14:31:02 +0800 Subject: [PATCH 200/272] clear codex in model, sample, support amd test source files Signed-off-by: jiaziyang --- model/storage/src/mtd/mtd_core.c | 2 +- sample/platform/gpio/dispatch/gpio_if.c | 1 - .../spi/dispatch/hello_spi_dispatch.c | 7 +- .../platform/uart/include/uart_pl011_sample.h | 3 +- sample/platform/uart/src/uart_dev_sample.c | 5 +- sample/platform/uart/src/uart_sample.c | 2 +- support/platform/include/hdmi/hdmi_common.h | 2 +- support/platform/include/hdmi/hdmi_core.h | 14 +- support/platform/include/hdmi/hdmi_hdr.h | 4 +- .../platform/include/hdmi/hdmi_infoframe.h | 74 +++--- support/platform/src/hdmi/hdmi_cec.c | 4 +- support/platform/src/hdmi/hdmi_core.c | 84 +++--- support/platform/src/hdmi/hdmi_dispatch.c | 24 +- support/platform/src/hdmi/hdmi_edid.c | 4 +- support/platform/src/hdmi/hdmi_event.c | 2 +- support/platform/src/hdmi/hdmi_frl.c | 14 +- support/platform/src/hdmi/hdmi_hdr.c | 22 +- support/platform/src/hdmi/hdmi_infoframe.c | 241 +++++++++--------- support/platform/src/i3c/i3c_core.c | 2 +- support/platform/src/i3c/i3c_if.c | 2 +- .../src/regulator/regulator_tree_mgr.c | 4 +- .../test/unittest/common/hdf_hdmi_test.cpp | 3 +- test/unittest/platform/common/gpio_test.c | 2 +- test/unittest/platform/common/hdmi_test.c | 8 +- test/unittest/platform/common/i3c_test.c | 7 + test/unittest/platform/common/pin_test.c | 20 +- .../unittest/platform/common/regulator_test.c | 7 +- .../unittest/platform/common/regulator_test.h | 1 + test/unittest/platform/hdf_gpio_entry_test.c | 2 - test/unittest/platform/hdf_hdmi_entry_test.c | 3 +- 30 files changed, 292 insertions(+), 278 deletions(-) diff --git a/model/storage/src/mtd/mtd_core.c b/model/storage/src/mtd/mtd_core.c index be97b0812..dbb047a0d 100644 --- a/model/storage/src/mtd/mtd_core.c +++ b/model/storage/src/mtd/mtd_core.c @@ -382,7 +382,7 @@ static int32_t MtdDeviceWriteReadByPageUnlock(struct MtdDevice *mtdDevice, struc dataLenLeft = msg->withOob ? (msg->len / (mtdDevice->writeSize + mtdDevice->oobSize)) * mtdDevice->writeSize : msg->len; - for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity; ) { + for (addr = msg->addr, buf = msg->buf; (dataLenLeft > 0) && addr < mtdDevice->capacity;) { if (MtdDeviceIsBadBlockUnlocked(mtdDevice, addr)) { if (!msg->skipBad) { HDF_LOGE("%s: failed on bad block @0x%jx", __func__, addr); diff --git a/sample/platform/gpio/dispatch/gpio_if.c b/sample/platform/gpio/dispatch/gpio_if.c index dadccd698..834080b2b 100755 --- a/sample/platform/gpio/dispatch/gpio_if.c +++ b/sample/platform/gpio/dispatch/gpio_if.c @@ -74,7 +74,6 @@ static int32_t GpioQuery(enum GpioOps ops, uint16_t gpio, uint16_t *val) if (ret != HDF_SUCCESS) { HDF_LOGE("Failed to send service call"); goto __ERR__; - } if (!HdfSbufReadUint16(reply, val)) { HDF_LOGE("Failed to read reply sBuf"); diff --git a/sample/platform/spi/dispatch/hello_spi_dispatch.c b/sample/platform/spi/dispatch/hello_spi_dispatch.c index 30492d67b..51730c37c 100755 --- a/sample/platform/spi/dispatch/hello_spi_dispatch.c +++ b/sample/platform/spi/dispatch/hello_spi_dispatch.c @@ -11,12 +11,15 @@ #define HDF_LOG_TAG hello_spi_dispatch +#define SPI_BUS_NUM 3 +#define SPI_MSG_SPEED 115200 + int main() { int32_t ret; struct SpiDevInfo spiDevInfo; /* SPI device descriptor */ struct DevHandle *spiHandle = NULL; /* SPI device handle */ - spiDevInfo.busNum = 3; /* SPI device bus number */ + spiDevInfo.busNum = SPI_BUS_NUM; /* SPI device bus number */ spiDevInfo.csNum = 0; /* SPI device CS number */ spiHandle = SpiOpen(&spiDevInfo); if (spiHandle == NULL) { @@ -32,7 +35,7 @@ int main() msg.len = 1; /* The length of the data to be read or written is 1 bits. */ msg.csChange = 1; /* Disable the CS before the next transfer. */ msg.delayUs = 0; /* No delay before the next transfer */ - msg.speed = 115200; /* Speed of this transfer */ + msg.speed = SPI_MSG_SPEED; /* Speed of this transfer */ ret = SpiTransfer(spiHandle, &msg); if (ret != HDF_SUCCESS) { HDF_LOGE("SpiTransfer failed, ret %d", ret); diff --git a/sample/platform/uart/include/uart_pl011_sample.h b/sample/platform/uart/include/uart_pl011_sample.h index a11448f6e..ae2f61264 100755 --- a/sample/platform/uart/include/uart_pl011_sample.h +++ b/sample/platform/uart/include/uart_pl011_sample.h @@ -117,8 +117,7 @@ struct UartDevice { | UART_PL011_LCR_H_EPS_MASK \ | UART_PL011_LCR_H_SPS_MASK) -#define UART_PL011_LCR_H_STOPBIT_MASK \ - (0x1u << UART_PL011_LCR_H_STP2_BIT_OFFSET) +#define UART_PL011_LCR_H_STOPBIT_MASK (0x1u << UART_PL011_LCR_H_STP2_BIT_OFFSET) #define UART_PL011_DATA_FORMAT_MASK ( \ UART_PL011_LCR_H_PARITY_MASK \ diff --git a/sample/platform/uart/src/uart_dev_sample.c b/sample/platform/uart/src/uart_dev_sample.c index b9b85a43b..1369188fe 100755 --- a/sample/platform/uart/src/uart_dev_sample.c +++ b/sample/platform/uart/src/uart_dev_sample.c @@ -112,7 +112,7 @@ static ssize_t UartSampleWrite(struct file *filep, const char *buf, size_t count static int32_t UartSampleDevIoctl(struct file *filep, int32_t cmd, unsigned long arg) { - int32_t ret = HDF_FAILURE; + int32_t ret; struct UartHost *host = NULL; if (filep == NULL || filep->f_vnode == NULL) { return HDF_ERR_INVALID_PARAM; @@ -122,7 +122,8 @@ static int32_t UartSampleDevIoctl(struct file *filep, int32_t cmd, unsigned long if (host->priv == NULL) { return HDF_ERR_INVALID_PARAM; } - + + ret = HDF_FAILURE; switch (cmd) { case UART_CFG_BAUDRATE: ret = UartHostSetBaud(host, arg); diff --git a/sample/platform/uart/src/uart_sample.c b/sample/platform/uart/src/uart_sample.c index 89a16b28c..19678890d 100755 --- a/sample/platform/uart/src/uart_sample.c +++ b/sample/platform/uart/src/uart_sample.c @@ -259,7 +259,7 @@ static void DeinitUartDevice(struct UartDevice *device) { struct UartRegisterMap *regMap = (struct UartRegisterMap *)device->resource.physBase; /* wait for uart enter idle. */ - while (UartPl011IsBusy(regMap)); + while (UartPl011IsBusy(regMap)) { } UartPl011ResetRegisters(regMap); uart_clk_cfg(0, false); OsalIoUnmap((void *)device->resource.physBase); diff --git a/support/platform/include/hdmi/hdmi_common.h b/support/platform/include/hdmi/hdmi_common.h index ef44ca307..7f8a6486e 100644 --- a/support/platform/include/hdmi/hdmi_common.h +++ b/support/platform/include/hdmi/hdmi_common.h @@ -62,7 +62,7 @@ enum HdmiTmdsModeType { * see CTA-861-G, table 3. */ enum HdmiVic { - HDMI_VIC_NONE = 0, /* No Video Identification Code Avaiable(Used with AVI Infoframe only) */ + HDMI_VIC_NONE = 0, /* No Video Identification Code Avaiable(Used with AVI InfoFrame only) */ HDMI_VIC_640X480P60_4_3 = 1, HDMI_VIC_720X480P60_4_3 = 2, HDMI_VIC_720X480P60_16_9 = 3, diff --git a/support/platform/include/hdmi/hdmi_core.h b/support/platform/include/hdmi/hdmi_core.h index d7ceac300..f54c6910f 100644 --- a/support/platform/include/hdmi/hdmi_core.h +++ b/support/platform/include/hdmi/hdmi_core.h @@ -122,7 +122,7 @@ struct HdmiHardwareStatus { struct HdmiCommonStatus commonStatus; struct HdmiAudioStatus audioStatus; struct HdmiVideoStatus videoStatus; - struct HdmiInfoframeStatus infoframeStatus; + struct HdmiInfoFrameStatus infoFrameStatus; struct HdmiHdcpStatus hdcpstatus; }; @@ -146,9 +146,9 @@ struct HdmiCntlrOps { void (*lowPowerSet)(struct HdmiCntlr *cntlr, bool enable); void (*tmdsModeSet)(struct HdmiCntlr *cntlr, enum HdmiTmdsModeType mode); int32_t (*tmdsConfigSet)(struct HdmiCntlr *cntlr, struct HdmiTmdsConfig mode); - void (*infoframeEnable)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoframeType, bool enable); - int32_t (*infoframeSend)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoframeType, uint8_t *data, uint32_t len); - int32_t (*infoframeDataSet)(struct HdmiCntlr *cntlr, uint32_t type, uint8_t *data, uint32_t len); + void (*infoFrameEnable)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, bool enable); + int32_t (*infoFrameSend)(struct HdmiCntlr *cntlr, enum HdmiPacketType infoFrameType, uint8_t *data, uint32_t len); + int32_t (*infoFrameDataSet)(struct HdmiCntlr *cntlr, uint32_t type, uint8_t *data, uint32_t len); int32_t (*cecMsgSend)(struct HdmiCntlr *cntlr, struct HdmiCecMsg *msg); void (*audioPathEnable)(struct HdmiCntlr *cntlr, bool enable); void (*audioPathSet)(struct HdmiCntlr *cntlr, struct HdmiAudioConfigInfo *config); @@ -208,7 +208,7 @@ struct HdmiCntlr { uint32_t state; /* cntlr state. */ enum HdmiTmdsModeType tmdsMode; struct HdmiDevice *hdmi; - struct HdmiInfoframe infoframe; + struct HdmiInfoFrame infoFrame; struct HdmiScdc *scdc; struct HdmiDdc ddc; struct HdmiFrl *frl; @@ -364,8 +364,8 @@ int32_t HdmiCntlrDeepColorGet(struct HdmiCntlr *cntlr, enum HdmiDeepColor *color int32_t HdmiCntlrSetVideoAttribute(struct HdmiCntlr *cntlr, struct HdmiVideoAttr *attr); int32_t HdmiCntlrSetAudioAttribute(struct HdmiCntlr *cntlr, struct HdmiAudioAttr *attr); int32_t HdmiCntlrSetHdrAttribute(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *attr); -int32_t HdmiCntlrInfoframeGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); -int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame); +int32_t HdmiCntlrInfoFrameGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoFrameInfo *frame); +int32_t HdmiCntlrInfoFrameSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoFrameInfo *frame); int32_t HdmiCntlrRegisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdmiHpdCallbackInfo *callback); int32_t HdmiCntlrUnregisterHpdCallbackFunc(struct HdmiCntlr *cntlr); void HdmiCntlrClose(struct HdmiCntlr *cntlr); diff --git a/support/platform/include/hdmi/hdmi_hdr.h b/support/platform/include/hdmi/hdmi_hdr.h index e2971b3b3..e77f76032 100644 --- a/support/platform/include/hdmi/hdmi_hdr.h +++ b/support/platform/include/hdmi/hdmi_hdr.h @@ -43,7 +43,7 @@ struct HdmiHdrTimerConfig { struct HdmiHdrInfo { enum HdmiHdrState state; /* Make sure that switch smoothly from non-HDR10 to HDR10. */ - struct HdmiHdrTimerConfig zeroDrmIfTimer; /* Send zero DRM infoframe when the HDR mode from HDR10 to non-HDR10. */ + struct HdmiHdrTimerConfig zeroDrmIfTimer; /* Send zero DRM infoFrame when the HDR mode from HDR10 to non-HDR10. */ struct HdmiHdrTimerConfig stateChangeTimer; /* */ }; @@ -53,7 +53,7 @@ struct HdmiHdr { }; int32_t HdmiHdrAttrHandle(struct HdmiHdr *hdr, struct HdmiHdrAttr *curAttr); -int32_t HdmiHdrDrmInfoframeStop(struct HdmiHdr *hdr); +int32_t HdmiHdrDrmInfoFrameStop(struct HdmiHdr *hdr); int32_t HdmiHdrModeChangeTimeout(struct HdmiHdr *hdr); #ifdef __cplusplus diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index 894fe5b33..ad0cb4cd5 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -73,7 +73,7 @@ enum HdmiPacketType { HDMI_PACKET_TYPE_DST_AUDIO = 0x08, /* DST(Diret Stream Transport) Audio Packet */ HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09, /* HBR(High Bitrate) Audio Stream Packet */ HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a, /* gamut metadata packet */ - /* infoframe type */ + /* infoFrame type */ HDMI_INFOFRAME_PACKET_TYPE_VS = 0x81, /* Verdor-Specific */ HDMI_INFOFRAME_PACKET_TYPE_AVI = 0x82, /* Auxiliary Video Information */ HDMI_INFOFRAME_PACKET_TYPE_SPD = 0x83, /* Source Product Description */ @@ -84,13 +84,13 @@ enum HdmiPacketType { HDMI_PACKET_TYPE_BUTT, }; -struct HdmiInfoframeHeader { +struct HdmiInfoFrameHeader { enum HdmiPacketType type; uint8_t verNum; uint8_t len; }; -/* Verdor-Specific infoframe details. */ +/* Verdor-Specific infoFrame details. */ #define HDMI_VENDOR_1_4_MAX_3D_METADAT_LEN 20 #define HDMI_VENDOR_USER_DATA_MAX_LEN 22 #define HDMI_VENDOR_1_4_FORMAT_MARK 0x07 @@ -167,7 +167,7 @@ struct HdmiForumVsifContent { uint8_t _3dMetadata[10]; }; -struct HdmiVsInfoframe { +struct HdmiVsInfoFrame { enum HdmiPacketType type; uint8_t verNum; uint8_t len; @@ -178,7 +178,7 @@ struct HdmiVsInfoframe { } vsifContent; }; -/* AVI infoframe details. */ +/* AVI infoFrame details. */ #define HDMI_AVI_COLOR_SPACE_MARK 0x03 #define HDMI_AVI_SCAN_MODE_MARK 0x03 #define HDMI_AVI_COLOR_SPACE_SHIFT 5 @@ -227,7 +227,7 @@ enum HdmiItContentType { HDMI_IT_CONTENT_TYPE_GAME = 3, }; -struct HdmiAviInfoframe { +struct HdmiAviInfoFrame { enum HdmiPacketType type; uint8_t verNum; uint8_t len; @@ -253,7 +253,7 @@ struct HdmiAviInfoframe { uint16_t rightBar; }; -/* Audio infoframe details. */ +/* Audio infoFrame details. */ #define HDMI_AUDIO_INFOFRAME_VERSION 1 #define HDMI_AUDIO_CODING_TYPE_MARK 0x0f #define HDMI_AUDIO_CHANNEL_COUNT_MARK 0x07 @@ -323,7 +323,7 @@ enum HdmiAudioLfePlaybackLevel { HDMI_AUDIO_LFE_PLAYBAC_BUTT, }; -struct HdmiAudioInfoframe { +struct HdmiAudioInfoFrame { enum HdmiPacketType type; uint8_t verNum; uint8_t len; @@ -338,7 +338,7 @@ struct HdmiAudioInfoframe { bool dmInh; /* Down-mix Inhibit Flag */ }; -/* Source Product Description infoframe details. */ +/* Source Product Description infoFrame details. */ #define HDMI_SPD_VENDOR_NAME_LEN 8 #define HDMI_SPD_PRODUCT_DESCRIPTION_LEN 16 #define HDMI_SPD_VERSION 1 @@ -362,7 +362,7 @@ enum HdmiSpdSdi { HDMI_SPD_SDI_BUTT, }; -struct HdmiSpdInfoframe { +struct HdmiSpdInfoFrame { enum HdmiPacketType type; uint8_t verNum; uint8_t len; @@ -371,12 +371,12 @@ struct HdmiSpdInfoframe { enum HdmiSpdSdi sdi; }; -/* Dynamic Range and Mastering infoframe details. */ +/* Dynamic Range and Mastering infoFrame details. */ #define HDMI_DRM_METADATA_MARK 0xff #define HDMI_DRM_METADATA_SHIFT 8 #define HDMI_DRM_INFOFRAME_VERSION 1 -struct HdmiDrmInfoframe { +struct HdmiDrmInfoFrame { enum HdmiPacketType type; uint8_t verNum; uint8_t len; @@ -431,34 +431,34 @@ struct HdmiGbdPacket { uint8_t maxBlueDataL; }; -union HdmiInfoframeInfo { - struct HdmiInfoframeHeader header; - struct HdmiVsInfoframe vs; - struct HdmiAviInfoframe avi; - struct HdmiAudioInfoframe audio; - struct HdmiSpdInfoframe spd; - struct HdmiDrmInfoframe drm; +union HdmiInfoFrameInfo { + struct HdmiInfoFrameHeader header; + struct HdmiVsInfoFrame vs; + struct HdmiAviInfoFrame avi; + struct HdmiAudioInfoFrame audio; + struct HdmiSpdInfoFrame spd; + struct HdmiDrmInfoFrame drm; struct HdmiGbdPacket gbd; }; /* - * Infoframe: A data structure defined in CEA-861-D that is designed to carry a variety of auxiliary data items + * InfoFrame: A data structure defined in CEA-861-D that is designed to carry a variety of auxiliary data items * regarding the audio or video streams or the source device and is carried from Source to Sink across HDMI. */ -struct HdmiInfoframe { - enum HdmiPacketType infoframeType; +struct HdmiInfoFrame { + enum HdmiPacketType infoFrameType; bool hdrSupport; - struct HdmiVsInfoframe vs; - struct HdmiAviInfoframe avi; - struct HdmiAudioInfoframe audio; - struct HdmiSpdInfoframe spd; - struct HdmiDrmInfoframe drm; + struct HdmiVsInfoFrame vs; + struct HdmiAviInfoFrame avi; + struct HdmiAudioInfoFrame audio; + struct HdmiSpdInfoFrame spd; + struct HdmiDrmInfoFrame drm; struct HdmiGbdPacket gbd; struct HdmiVsUserVsifContent userVsif; void *priv; }; -struct HdmiInfoframeStatus { +struct HdmiInfoFrameStatus { bool vsifEnable; bool aviEnable; bool audioEnable; @@ -473,16 +473,16 @@ struct HdmiInfoframeStatus { uint8_t gdb[HDMI_INFOFRAME_LEN]; }; -int32_t HdmiAudioInfoframeSend(struct HdmiInfoframe *frame, bool enable); -int32_t HdmiAviInfoframeSend(struct HdmiInfoframe *frame, bool enable); -int32_t HdmiDrmInfoframeSend(struct HdmiInfoframe *frame, bool enable); -int32_t HdmiVsInfoframeSend(struct HdmiInfoframe *frame, bool enable, bool dolbyEnable); -int32_t HdmiSpdInfoframeSend(struct HdmiInfoframe *frame, bool enable, +int32_t HdmiAudioInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); +int32_t HdmiAviInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); +int32_t HdmiDrmInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); +int32_t HdmiVsInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, bool dolbyEnable); +int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, char *vendorName, char *productName, enum HdmiSpdSdi sdi); -int32_t HdmiInfoframeGetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, - union HdmiInfoframeInfo *infoframe); -int32_t HdmiInfoframeSetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, - union HdmiInfoframeInfo *infoframe); +int32_t HdmiInfoFrameGetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, + union HdmiInfoFrameInfo *infoFrame); +int32_t HdmiInfoFrameSetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, + union HdmiInfoFrameInfo *infoFrame); #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/src/hdmi/hdmi_cec.c b/support/platform/src/hdmi/hdmi_cec.c index 9716d4a9a..2d8a08304 100644 --- a/support/platform/src/hdmi/hdmi_cec.c +++ b/support/platform/src/hdmi/hdmi_cec.c @@ -153,8 +153,8 @@ static bool HdmiCecCheckTimerStatusMsgLen(struct HdmiCecMsg *msg) /* Progremmed Indicator Check. */ if ((msg->data[HDMI_CEC_MSG_DATA_SECOND_ELEMENT] & 0x10) > 0) { if (((info == HDMI_CEC_PROGRAMMED_INFO_NOT_ENOUGH_SPAC) || - (info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE)) && - (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN))) { + (info == HDMI_CEC_PROGRAMMED_INFO_MIGHT_NOT_BE_ENOUGH_SPACE)) && + (msg->len < HDMI_CEC_GET_MSG_LEN(HDMI_CEC_TIMER_STATUS_DATA_MAX_LEN))) { HDF_LOGD("check Timer_Status(Indicator) Msg fail."); return false; } diff --git a/support/platform/src/hdmi/hdmi_core.c b/support/platform/src/hdmi/hdmi_core.c index ee66ac7e0..ea83b9f3a 100644 --- a/support/platform/src/hdmi/hdmi_core.c +++ b/support/platform/src/hdmi/hdmi_core.c @@ -52,7 +52,7 @@ static void HdmiCecInit(struct HdmiCntlr *cntlr) if (cntlr->cec == NULL) { cntlr->cec = (struct HdmiCec *)OsalMemCalloc(sizeof(struct HdmiCec)); - if (cntlr->scdc == NULL) { + if (cntlr->cec == NULL) { HDF_LOGE("cec malloc fail"); return; } @@ -212,25 +212,25 @@ static void HdmiHdrDeinit(struct HdmiCntlr *cntlr) } } -static void HdmiInfoframeInit(struct HdmiCntlr *cntlr) +static void HdmiInfoFrameInit(struct HdmiCntlr *cntlr) { if (cntlr == NULL) { return; } - HDF_LOGE("HdmiInfoframeInit, success."); - cntlr->infoframe.priv = (void *)cntlr; + HDF_LOGE("HdmiInfoFrameInit, success."); + cntlr->infoFrame.priv = (void *)cntlr; } -static void HdmiInfoframeDeInit(struct HdmiCntlr *cntlr) +static void HdmiInfoFrameDeInit(struct HdmiCntlr *cntlr) { if (cntlr == NULL) { return; } - if (memset_s(&(cntlr->infoframe), sizeof(struct HdmiInfoframe), 0, sizeof(struct HdmiInfoframe)) != EOK) { - HDF_LOGE("deinit infoframe, memset_s fail."); + if (memset_s(&(cntlr->infoFrame), sizeof(struct HdmiInfoFrame), 0, sizeof(struct HdmiInfoFrame)) != EOK) { + HDF_LOGE("deinit infoFrame, memset_s fail."); } - cntlr->infoframe.priv = NULL; + cntlr->infoFrame.priv = NULL; } static void HdmiScdcInit(struct HdmiCntlr *cntlr) @@ -300,7 +300,7 @@ static int32_t HdmiCntlrInit(struct HdmiCntlr *cntlr) cntlr->hdfDevObj->service = &(cntlr->service); cntlr->device.number = cntlr->deviceIndex; cntlr->device.hdfDev = cntlr->hdfDevObj; - HdmiInfoframeInit(cntlr); + HdmiInfoFrameInit(cntlr); HdmiDdcInit(cntlr); return HDF_SUCCESS; } @@ -308,7 +308,7 @@ static int32_t HdmiCntlrInit(struct HdmiCntlr *cntlr) static void HdmiCntlrUninit(struct HdmiCntlr *cntlr) { if (cntlr != NULL) { - HdmiInfoframeDeInit(cntlr); + HdmiInfoFrameDeInit(cntlr); HdmiScdcDeinit(cntlr); HdmiDdcDeinit(cntlr); HdmiCecDeinit(cntlr); @@ -697,7 +697,7 @@ int32_t HdmiCntlrOpen(struct HdmiCntlr *cntlr) if (cntlr == NULL) { return HDF_ERR_INVALID_OBJECT; } - HdmiInfoframeInit(cntlr); + HdmiInfoFrameInit(cntlr); HdmiDdcInit(cntlr); HdmiScdcInit(cntlr); HdmiFrlInit(cntlr); @@ -1053,7 +1053,7 @@ static int32_t HdmiAudioAttrHandle(struct HdmiCntlr *cntlr) HdmiCntlrAudioPathEnable(cntlr, false); HdmiCntlrAudioPathSet(cntlr, &audioCfg); - ret = HdmiAudioInfoframeSend(&(cntlr->infoframe), ((commAttr->enableAudio) && (commAttr->audio))); + ret = HdmiAudioInfoFrameSend(&(cntlr->infoFrame), ((commAttr->enableAudio) && (commAttr->audio))); HdmiCntlrAudioPathEnable(cntlr, true); return ret; } @@ -1100,24 +1100,24 @@ static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, ((!hwStatus->videoStatus.ycbcr2Rgb) && (hwStatus->videoStatus.outColorSpace == HDMI_COLOR_SPACE_RGB))); videoAttr->colorSpace = (rgb == true) ? HDMI_COLOR_SPACE_RGB : HDMI_COLOR_SPACE_YCBCR444; - if (hwStatus->infoframeStatus.aviEnable) { - vic = hwStatus->infoframeStatus.avi[7]; + if (hwStatus->infoFrameStatus.aviEnable) { + vic = hwStatus->infoFrameStatus.avi[7]; /* - * when the timing is 4096*2160, the aspect ratio in AVI infoframe is 0 + * when the timing is 4096*2160, the aspect ratio in AVI infoFrame is 0 * (but the real aspect ratio is 256:135<0x04>, the video_code is 0) */ - aspectIs256 = (((vic == 0) && (hwStatus->infoframeStatus.vsif[8] == 0x04)) || + aspectIs256 = (((vic == 0) && (hwStatus->infoFrameStatus.vsif[8] == 0x04)) || ((vic >= HDMI_VIC_4096X2160P25_256_135) && (vic <= HDMI_VIC_4096X2160P60_256_135))); videoAttr->aspect = (aspectIs256 == true) ? HDMI_PICTURE_ASPECT_256_135 : - ((hwStatus->infoframeStatus.avi[5] >> 4) & 0x3); /* 4'b, BIT[2:1] */ - videoAttr->activeAspect = hwStatus->infoframeStatus.avi[5] & 0xf; - videoAttr->colorimetry = (hwStatus->infoframeStatus.avi[5] >> 6) & 0x3; /* 6'b, BIT[2:1] */ - videoAttr->quantization = (hwStatus->infoframeStatus.avi[6] >> 2) & 0x3; /* 2'b, BIT[2:1] */ - videoAttr->extColorimetry = (hwStatus->infoframeStatus.avi[6] >> 4) & 0x07; /* 4'b, BIT[3:1] */ - videoAttr->yccQuantization = (hwStatus->infoframeStatus.avi[8] >> 6) & 0x3; /* 6'b, BIT[2:1] */ - videoAttr->pixelRepeat = (hwStatus->infoframeStatus.avi[8] & 0xf) + 1; + ((hwStatus->infoFrameStatus.avi[5] >> 4) & 0x3); /* 4'b, BIT[2:1] */ + videoAttr->activeAspect = hwStatus->infoFrameStatus.avi[5] & 0xf; + videoAttr->colorimetry = (hwStatus->infoFrameStatus.avi[5] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->quantization = (hwStatus->infoFrameStatus.avi[6] >> 2) & 0x3; /* 2'b, BIT[2:1] */ + videoAttr->extColorimetry = (hwStatus->infoFrameStatus.avi[6] >> 4) & 0x07; /* 4'b, BIT[3:1] */ + videoAttr->yccQuantization = (hwStatus->infoFrameStatus.avi[8] >> 6) & 0x3; /* 6'b, BIT[2:1] */ + videoAttr->pixelRepeat = (hwStatus->infoFrameStatus.avi[8] & 0xf) + 1; videoAttr->timing = HdmiCommonGetVideoTiming(vic, videoAttr->aspect); - if ((!hwStatus->infoframeStatus.vsifEnable) && (!vic)) { + if ((!hwStatus->infoFrameStatus.vsifEnable) && (!vic)) { videoAttr->timing = HDMI_VIDEO_TIMING_NONE; } commAttr->quantization = (commAttr->colorSpace == HDMI_COLOR_SPACE_RGB) ? @@ -1125,13 +1125,13 @@ static void HdmiFillVideoAttrFromHardwareStatus(struct HdmiVideoAttr *videoAttr, } videoAttr->_3dStruct = HDMI_VS_VIDEO_3D_BUTT; - if (hwStatus->infoframeStatus.vsifEnable) { - format = (hwStatus->infoframeStatus.vsif[7] >> 5) & 0x3; /* 5'b, BIT[2:1] */ + if (hwStatus->infoFrameStatus.vsifEnable) { + format = (hwStatus->infoFrameStatus.vsif[7] >> 5) & 0x3; /* 5'b, BIT[2:1] */ if (format == HDMI_VS_VIDEO_FORMAT_4K) { - vic4k = hwStatus->infoframeStatus.vsif[8]; + vic4k = hwStatus->infoFrameStatus.vsif[8]; videoAttr->timing = HdmiCommonGetVideo4kTiming(vic4k); } else if (format == HDMI_VS_VIDEO_FORMAT_3D) { - videoAttr->_3dStruct = (hwStatus->infoframeStatus.vsif[8] >> 4) & 0xf; /* 4'b, BIT[4:1] */ + videoAttr->_3dStruct = (hwStatus->infoFrameStatus.vsif[8] >> 4) & 0xf; /* 4'b, BIT[4:1] */ } } } @@ -1157,10 +1157,10 @@ static void HdmiFillCommonAttrFromHardwareStatus(struct HdmiCommonAttr *commAttr break; } - commAttr->enableAudio = (hwStatus->audioStatus.enable && hwStatus->infoframeStatus.audioEnable); - commAttr->avi = hwStatus->infoframeStatus.aviEnable; - commAttr->audio = hwStatus->infoframeStatus.audioEnable; - commAttr->xvyccMode = hwStatus->infoframeStatus.gdbEnable; + commAttr->enableAudio = (hwStatus->audioStatus.enable && hwStatus->infoFrameStatus.audioEnable); + commAttr->avi = hwStatus->infoFrameStatus.aviEnable; + commAttr->audio = hwStatus->infoFrameStatus.audioEnable; + commAttr->xvyccMode = hwStatus->infoFrameStatus.gdbEnable; commAttr->deepColor = HdmiCommonColorDepthConvertToDeepClolor(hwStatus->videoStatus.outBitDepth); /* color space is ycbcr444 when the hdr mode is dolby. */ @@ -1249,13 +1249,13 @@ static int32_t HdmiVedioAttrHandle(struct HdmiCntlr *cntlr, struct HdmiHardwareS HdmiCntlrVideoPathSet(cntlr, videoAttr); } - (void)HdmiAviInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->avi)); - (void)HdmiVsInfoframeSend(&(cntlr->infoframe), commAttr->enableHdmi, commAttr->vsifDolby); - /* the drm infoframe is stop because software was reset in videopath, so re-enable it if the mode is HDR10. */ + (void)HdmiAviInfoFrameSend(&(cntlr->infoFrame), (commAttr->enableHdmi && commAttr->avi)); + (void)HdmiVsInfoFrameSend(&(cntlr->infoFrame), commAttr->enableHdmi, commAttr->vsifDolby); + /* the drm infoFrame is stop because software was reset in videopath, so re-enable it if the mode is HDR10. */ if (cntlr->cap.baseCap.bits.hdr > 0) { if (cntlr->attr.hdrAttr.mode == HDMI_HDR_MODE_CEA_861_3) { - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), false); - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), true); + (void)HdmiDrmInfoFrameSend(&(cntlr->infoFrame), false); + (void)HdmiDrmInfoFrameSend(&(cntlr->infoFrame), true); } } return HDF_SUCCESS; @@ -1375,15 +1375,15 @@ int32_t HdmiCntlrSetHdrAttribute(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *at return HdmiHdrAttrHandle(cntlr->hdr, attr); } -int32_t HdmiCntlrInfoframeGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame) +int32_t HdmiCntlrInfoFrameGet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoFrameInfo *frame) { if (cntlr == NULL) { return HDF_ERR_INVALID_OBJECT; } - return HdmiInfoframeGetInfo(&(cntlr->infoframe), type, frame); + return HdmiInfoFrameGetInfo(&(cntlr->infoFrame), type, frame); } -int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoframeInfo *frame) +int32_t HdmiCntlrInfoFrameSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, union HdmiInfoFrameInfo *frame) { if (cntlr == NULL || cntlr->ops == NULL) { return HDF_ERR_INVALID_OBJECT; @@ -1391,7 +1391,7 @@ int32_t HdmiCntlrInfoframeSet(struct HdmiCntlr *cntlr, enum HdmiPacketType type, if (frame == NULL) { return HDF_ERR_INVALID_PARAM; } - return HdmiInfoframeSetInfo(&(cntlr->infoframe), type, frame); + return HdmiInfoFrameSetInfo(&(cntlr->infoFrame), type, frame); } int32_t HdmiCntlrRegisterHpdCallbackFunc(struct HdmiCntlr *cntlr, struct HdmiHpdCallbackInfo *callback) @@ -1428,7 +1428,7 @@ void HdmiCntlrClose(struct HdmiCntlr *cntlr) HdmiCntlrStop(cntlr); } - HdmiInfoframeDeInit(cntlr); + HdmiInfoFrameDeInit(cntlr); HdmiDdcDeinit(cntlr); HdmiScdcDeinit(cntlr); HdmiFrlDeinit(cntlr); diff --git a/support/platform/src/hdmi/hdmi_dispatch.c b/support/platform/src/hdmi/hdmi_dispatch.c index 0e4ad04a7..c8f796cbe 100644 --- a/support/platform/src/hdmi/hdmi_dispatch.c +++ b/support/platform/src/hdmi/hdmi_dispatch.c @@ -181,43 +181,43 @@ static int32_t HdmiCmdReadSinkEdid(struct HdmiCntlr *cntlr, struct HdfSBuf *data return HDF_SUCCESS; } -static int32_t HdmiCmdInfoframeSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t HdmiCmdInfoFrameSet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) { enum HdmiPacketType type; - union HdmiInfoframeInfo *frame = NULL; + union HdmiInfoFrameInfo *frame = NULL; size_t size; if (!HdfSbufReadUint16(data, (uint16_t *)&type)) { - HDF_LOGE("HdmiCmdInfoframeSet: sbuf read uint16 failed"); + HDF_LOGE("HdmiCmdInfoFrameSet: sbuf read uint16 failed"); return HDF_ERR_IO; } if (!HdfSbufReadBuffer(data, (const void **)&frame, &size)) { - HDF_LOGE("HdmiCmdInfoframeSet: sbuf read buffer failed"); + HDF_LOGE("HdmiCmdInfoFrameSet: sbuf read buffer failed"); return HDF_ERR_IO; } - return HdmiCntlrInfoframeSet(cntlr, type, frame); + return HdmiCntlrInfoFrameSet(cntlr, type, frame); } -static int32_t HdmiCmdInfoframeGet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t HdmiCmdInfoFrameGet(struct HdmiCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) { size_t size; int32_t ret; enum HdmiPacketType *type = NULL; - union HdmiInfoframeInfo frame = {0}; + union HdmiInfoFrameInfo frame = {0}; if (!HdfSbufReadBuffer(data, (const void **)&type, &size)) { - HDF_LOGE("HdmiCmdInfoframeGet: sbuf read buffer failed"); + HDF_LOGE("HdmiCmdInfoFrameGet: sbuf read buffer failed"); return HDF_ERR_IO; } - ret = HdmiCntlrInfoframeGet(cntlr, *type, &frame); + ret = HdmiCntlrInfoFrameGet(cntlr, *type, &frame); if (ret != HDF_SUCCESS) { return ret; } if (HdfSbufWriteBuffer(reply, &frame, sizeof(frame)) == false) { - HDF_LOGE("HdmiCmdInfoframeGet: write back frame fail!"); + HDF_LOGE("HdmiCmdInfoFrameGet: write back frame fail!"); return HDF_ERR_IO; } @@ -261,8 +261,8 @@ int32_t HdmiIoDispatch(struct HdfDeviceIoClient *client, int32_t cmd, struct Hdf { HDMI_CMD_AUDIO_ATTR_SET, HdmiCmdAudioAttrSet }, { HDMI_CMD_HDR_ATTR_SET, HdmiCmdHdrAttrSet }, { HDMI_CMD_READ_SINK_EDID, HdmiCmdReadSinkEdid }, - { HDMI_CMD_INFOFRAME_SET, HdmiCmdInfoframeSet }, - { HDMI_CMD_INFOFRAME_GET, HdmiCmdInfoframeGet }, + { HDMI_CMD_INFOFRAME_SET, HdmiCmdInfoFrameSet }, + { HDMI_CMD_INFOFRAME_GET, HdmiCmdInfoFrameGet }, { HDMI_CMD_REGISTER_HPD_CALLBACK_FUNC, HdmiCmdRegisterHpdCallbackFunc }, { HDMI_CMD_UNREGISTER_HPD_CALLBACK_FUNC, HdmiCmdUnregisterHpdCallbackFunc }, }; diff --git a/support/platform/src/hdmi/hdmi_edid.c b/support/platform/src/hdmi/hdmi_edid.c index db789d436..9048333eb 100644 --- a/support/platform/src/hdmi/hdmi_edid.c +++ b/support/platform/src/hdmi/hdmi_edid.c @@ -1026,7 +1026,7 @@ static void HdmiEdidExtUseExtDataBlockHdrSmdbPhase(struct HdmiSinkDeviceCapabili } } -static void HdmiEdidDolbyCapVersionZeroPhase(struct HdmiSinkDeviceCapability *sinkCap,uint8_t *data) +static void HdmiEdidDolbyCapVersionZeroPhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data) { sinkCap->dolbyCap.globalDimming = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_BIT2_MARK) ? true : false; sinkCap->dolbyCap.redX = ((data[UINT8_ARRAY_TElEMENT_5] & @@ -1063,7 +1063,7 @@ static void HdmiEdidDolbyCapVersionZeroPhase(struct HdmiSinkDeviceCapability *si sinkCap->dolbyCap.dMinorVer = (data[UINT8_ARRAY_TElEMENT_20] & HDMI_LOWER_NIBBLE_MARK); } -static void HdmiEdidDolbyCapVersionOnePhase(struct HdmiSinkDeviceCapability *sinkCap,uint8_t *data) +static void HdmiEdidDolbyCapVersionOnePhase(struct HdmiSinkDeviceCapability *sinkCap, uint8_t *data) { sinkCap->dolbyCap.dmVer = (data[UINT8_ARRAY_TElEMENT_4] & HDMI_EDID_VSVDB_DOLBY_DM_VER_MARK) >> HDMI_EDID_VSVDB_DOLBY_DM_VER_SHIFT; diff --git a/support/platform/src/hdmi/hdmi_event.c b/support/platform/src/hdmi/hdmi_event.c index 621971949..c9f337c17 100644 --- a/support/platform/src/hdmi/hdmi_event.c +++ b/support/platform/src/hdmi/hdmi_event.c @@ -180,7 +180,7 @@ static int32_t HdmiEventCecMsgHandle(struct HdmiCntlr *cntlr, struct HdmiCecMsg static int32_t HdmiEventHdrZeroDrmIfTimeout(struct HdmiCntlr *cntlr) { - return HdmiHdrDrmInfoframeStop(cntlr->hdr); + return HdmiHdrDrmInfoFrameStop(cntlr->hdr); } static int32_t HdmiEventSwitchToHdrModeTimeout(struct HdmiCntlr *cntlr) diff --git a/support/platform/src/hdmi/hdmi_frl.c b/support/platform/src/hdmi/hdmi_frl.c index 42bab9c87..d6602d6b5 100644 --- a/support/platform/src/hdmi/hdmi_frl.c +++ b/support/platform/src/hdmi/hdmi_frl.c @@ -7,8 +7,8 @@ */ #include "hdf_log.h" -#include "hdmi_core.h" #include "hdmi_common.h" +#include "hdmi_core.h" #include "hdmi_dfm.h" #include "hdmi_ncts.h" @@ -466,7 +466,7 @@ static void HdmiFrlTrainingException(struct HdmiFrl *frl) struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; struct HdmiPhyCfg cfg = {0}; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } @@ -517,7 +517,7 @@ static void HdmiFrlTrainingPassedCheck(struct HdmiFrl *frl) { struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } @@ -545,7 +545,7 @@ static void HdmiFrlRetrainingCheck(struct HdmiFrl *frl) { struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } if (HdmiFrlGetFltUpdate(cntlr->scdc) == false) { @@ -567,7 +567,7 @@ static void HdmiFrlTrainingStop(struct HdmiFrl *frl) { struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } @@ -679,7 +679,7 @@ static void HdmiFrlTrainingResultHandleTimeout(struct HdmiFrl *frl) bool frlStart = false; struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } @@ -722,7 +722,7 @@ static void HdmiFrlRetrainingCheckTimeout(struct HdmiFrl *frl) uint64_t curTime = OsalGetSysTimeMs(); struct HdmiCntlr *cntlr = (struct HdmiCntlr *)frl->priv; - if (cntlr != NULL || cntlr->ops != NULL) { + if (cntlr == NULL || cntlr->ops == NULL) { return; } if ((curTime - frl->info.machineInfo.startTime) <= frl->info.machineInfo.waitRetrainTime) { diff --git a/support/platform/src/hdmi/hdmi_hdr.c b/support/platform/src/hdmi/hdmi_hdr.c index 02874fb55..ef6f7f01d 100644 --- a/support/platform/src/hdmi/hdmi_hdr.c +++ b/support/platform/src/hdmi/hdmi_hdr.c @@ -32,7 +32,7 @@ static void HdmiHdrColorimetryUpdate(struct HdmiVideoAttr *videoAttr, enum HdmiH } } -static void HdmiHdrZeroDrmInfoframeTimerSet(struct HdmiCntlr *cntlr, bool start) +static void HdmiHdrZeroDrmInfoFrameTimerSet(struct HdmiCntlr *cntlr, bool start) { struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); @@ -51,7 +51,7 @@ static void HdmiHdrZeroDrmInfoframeTimerSet(struct HdmiCntlr *cntlr, bool start) HDF_LOGE("memset_s fail"); return; } - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), true); + (void)HdmiDrmInfoFrameSend(&(cntlr->infoFrame), true); hdrInfo->zeroDrmIfTimer.start = true; HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->zeroDrmIfTimer)); @@ -98,10 +98,10 @@ static int32_t HdmiDisableHdr(struct HdmiCntlr *cntlr, struct HdmiHdrAttr *curAt } HdmiHdrModeChangeTimerSet(cntlr, true); HdmiCntlrHdrTimerSet(cntlr, &(hdrInfo->stateChangeTimer)); - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), false); + (void)HdmiDrmInfoFrameSend(&(cntlr->infoFrame), false); } else { /* start timer, send zero DRMIF and stop after 2 seconds. */ - HdmiHdrZeroDrmInfoframeTimerSet(cntlr, true); + HdmiHdrZeroDrmInfoFrameTimerSet(cntlr, true); } break; case HDMI_HDR_MODE_CEA_861_3_AUTHEN: @@ -125,7 +125,7 @@ static void HdmiChangeToHdr(struct HdmiCntlr *cntlr, struct HdmiCommonAttr *comm struct HdmiHdrAttr *hdrAttr = &(cntlr->attr.hdrAttr); struct HdmiHdrInfo *hdrInfo = &(cntlr->hdr->info); - HdmiHdrZeroDrmInfoframeTimerSet(cntlr, false); + HdmiHdrZeroDrmInfoFrameTimerSet(cntlr, false); if (hdrAttr->userMode != HDMI_HDR_USERMODE_HDR10) { HDF_LOGE("usermode is not HDR10/HLG."); return; @@ -225,20 +225,20 @@ int32_t HdmiHdrAttrHandle(struct HdmiHdr *hdr, struct HdmiHdrAttr *curAttr) if (ret != HDF_SUCCESS) { return ret; } - (void)HdmiDrmInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->drm)); + (void)HdmiDrmInfoFrameSend(&(cntlr->infoFrame), (commAttr->enableHdmi && commAttr->drm)); _SEND_INFOFRAME: - (void)HdmiAviInfoframeSend(&(cntlr->infoframe), (commAttr->enableHdmi && commAttr->avi)); - (void)HdmiVsInfoframeSend(&(cntlr->infoframe), commAttr->enableHdmi, commAttr->vsifDolby); + (void)HdmiAviInfoFrameSend(&(cntlr->infoFrame), (commAttr->enableHdmi && commAttr->avi)); + (void)HdmiVsInfoFrameSend(&(cntlr->infoFrame), commAttr->enableHdmi, commAttr->vsifDolby); HdmiCntlrVideoPathSet(cntlr, &(cntlr->attr.videoAttr)); return ret; } -int32_t HdmiHdrDrmInfoframeStop(struct HdmiHdr *hdr) +int32_t HdmiHdrDrmInfoFrameStop(struct HdmiHdr *hdr) { struct HdmiCntlr *cntlr = NULL; - HDF_LOGD("zero DRM infoframe send timeout."); + HDF_LOGD("zero DRM infoFrame send timeout."); if (hdr == NULL || hdr->priv == NULL) { HDF_LOGE("hdr stop drm, input param invalid."); return HDF_ERR_INVALID_PARAM; @@ -246,7 +246,7 @@ int32_t HdmiHdrDrmInfoframeStop(struct HdmiHdr *hdr) cntlr = (struct HdmiCntlr *)hdr->priv; if (cntlr->attr.hdrAttr.mode != HDMI_HDR_MODE_CEA_861_3) { - return HdmiDrmInfoframeSend(&(cntlr->infoframe), false); + return HdmiDrmInfoFrameSend(&(cntlr->infoFrame), false); } return HDF_SUCCESS; } diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 790fe71b1..e707aad37 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -16,7 +16,7 @@ #define HDMI_IEEE_OUI_1_4_2ND 0x0C #define HDMI_IEEE_OUI_1_4_3RD 0x00 -static void HdmiInfoframeFillCheckSum(uint8_t *data, uint32_t len) +static void HdmiInfoFrameFillCheckSum(uint8_t *data, uint32_t len) { uint32_t i; uint8_t checkSum = 0; @@ -34,7 +34,7 @@ static void HdmiInfoframeFillCheckSum(uint8_t *data, uint32_t len) } } -static void HdmiInfoframeFillHeader(struct HdmiInfoframeHeader *header, uint8_t *data, uint32_t len) +static void HdmiInfoFrameFillHeader(struct HdmiInfoFrameHeader *header, uint8_t *data, uint32_t len) { if (len < HDMI_INFOFRAME_PACKET_HEADER_LEN) { HDF_LOGE("len = %d, val is too small.", len); @@ -45,12 +45,12 @@ static void HdmiInfoframeFillHeader(struct HdmiInfoframeHeader *header, uint8_t data[UINT8_ARRAY_TElEMENT_2] = header->len; } -static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +static int32_t HdmiInfoFramePacketVsEncoding(union HdmiInfoFrameInfo *infoFrame, uint8_t *data, uint32_t len) { uint32_t lenght; struct HdmiVs14VsifContent *vsifContent = NULL; struct HdmiVsUserVsifContent *userContent = NULL; - struct HdmiVsInfoframe *vs = &(infoframe->vs); + struct HdmiVsInfoFrame *vs = &(infoFrame->vs); lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + vs->len; if (len < lenght) { @@ -62,7 +62,7 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, return HDF_ERR_IO; } - HdmiInfoframeFillHeader(&(infoframe->header), data, len); + HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); if (vs->vsifContent.vsif.oui == HDMI_IEEE_OUI_1_4) { data[UINT8_ARRAY_TElEMENT_4] = HDMI_IEEE_OUI_1_4_1ST; data[UINT8_ARRAY_TElEMENT_5] = HDMI_IEEE_OUI_1_4_2ND; @@ -91,15 +91,15 @@ static int32_t HdmiInfoframePacketVsEncoding(union HdmiInfoframeInfo *infoframe, lenght += userContent->len; } } - HdmiInfoframeFillCheckSum(data, lenght); + HdmiInfoFrameFillCheckSum(data, lenght); return HDF_SUCCESS; } -static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +static int32_t HdmiInfoFramePacketAviEncoding(union HdmiInfoFrameInfo *infoFrame, uint8_t *data, uint32_t len) { uint32_t lenght; uint8_t *buff = data; - struct HdmiAviInfoframe *avi = &(infoframe->avi); + struct HdmiAviInfoFrame *avi = &(infoFrame->avi); lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + avi->len; if (len < lenght) { @@ -111,7 +111,7 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe return HDF_ERR_IO; } - HdmiInfoframeFillHeader(&(infoframe->header), data, len); + HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ buff[UINT8_ARRAY_TElEMENT_0] |= (avi->colorSpace & HDMI_AVI_COLOR_SPACE_MARK) << HDMI_AVI_COLOR_SPACE_SHIFT; @@ -144,7 +144,8 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe /* PB5 */ buff[UINT8_ARRAY_TElEMENT_4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << + HDMI_AVI_IT_CONTENT_TYPE_SHIFT; buff[UINT8_ARRAY_TElEMENT_4] |= (avi->pixelRepetitionFactor & HDMI_AVI_PIXEL_REPETION_FACTOR_MARK); /* PB6 */ buff[UINT8_ARRAY_TElEMENT_5] = (uint8_t)(avi->topBar & HDMI_AVI_BAR_MODE_MARK); @@ -162,15 +163,15 @@ static int32_t HdmiInfoframePacketAviEncoding(union HdmiInfoframeInfo *infoframe buff[UINT8_ARRAY_TElEMENT_11] = (uint8_t)(avi->rightBar & HDMI_AVI_BAR_MODE_MARK); /* PB13 */ buff[UINT8_ARRAY_TElEMENT_12] = (uint8_t)((avi->rightBar >> HDMI_AVI_BAR_MODE_SHIFT) & HDMI_AVI_BAR_MODE_MARK); - HdmiInfoframeFillCheckSum(data, lenght); + HdmiInfoFrameFillCheckSum(data, lenght); return HDF_SUCCESS; } -static int32_t HdmiInfoframePacketSpdEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +static int32_t HdmiInfoFramePacketSpdEncoding(union HdmiInfoFrameInfo *infoFrame, uint8_t *data, uint32_t len) { uint32_t lenght; uint8_t *buff = data; - struct HdmiSpdInfoframe *spd = &(infoframe->spd); + struct HdmiSpdInfoFrame *spd = &(infoFrame->spd); lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + spd->len; if (len < lenght) { @@ -198,15 +199,15 @@ static int32_t HdmiInfoframePacketSpdEncoding(union HdmiInfoframeInfo *infoframe buff += HDMI_SPD_PRODUCT_DESCRIPTION_LEN; /* PB25 */ buff[UINT8_ARRAY_TElEMENT_0] = spd->sdi; - HdmiInfoframeFillCheckSum(data, lenght); + HdmiInfoFrameFillCheckSum(data, lenght); return HDF_SUCCESS; } -static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +static int32_t HdmiInfoFramePacketAudioEncoding(union HdmiInfoFrameInfo *infoFrame, uint8_t *data, uint32_t len) { uint32_t lenght; uint8_t *buff = data; - struct HdmiAudioInfoframe *audio = &(infoframe->audio); + struct HdmiAudioInfoFrame *audio = &(infoFrame->audio); lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + audio->len; if (len < lenght) { @@ -218,7 +219,7 @@ static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infofra return HDF_ERR_IO; } - HdmiInfoframeFillHeader(&(infoframe->header), data, len); + HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ buff[UINT8_ARRAY_TElEMENT_0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; @@ -238,15 +239,15 @@ static int32_t HdmiInfoframePacketAudioEncoding(union HdmiInfoframeInfo *infofra if (audio->dmInh == true) { buff[UINT8_ARRAY_TElEMENT_4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); } - HdmiInfoframeFillCheckSum(data, lenght); + HdmiInfoFrameFillCheckSum(data, lenght); return HDF_SUCCESS; } -static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe, uint8_t *data, uint32_t len) +static int32_t HdmiInfoFramePacketDrmEncoding(union HdmiInfoFrameInfo *infoFrame, uint8_t *data, uint32_t len) { uint32_t lenght; uint8_t *buff = data; - struct HdmiDrmInfoframe *drm = &(infoframe->drm); + struct HdmiDrmInfoFrame *drm = &(infoFrame->drm); struct HdmiStaticMetadataDescriptor1st *des = &(drm->des.type1); lenght = HDMI_INFOFRAME_PACKET_HEADER_LEN + drm->len; @@ -259,7 +260,7 @@ static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe return HDF_ERR_IO; } - HdmiInfoframeFillHeader(&(infoframe->header), data, len); + HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ buff[UINT8_ARRAY_TElEMENT_0] = drm->eotfType; @@ -323,35 +324,35 @@ static int32_t HdmiInfoframePacketDrmEncoding(union HdmiInfoframeInfo *infoframe /* PB26 */ buff[UINT8_ARRAY_TElEMENT_25] = (uint8_t)((des->maxFrameAverageLightLevel & HDMI_DRM_METADATA_MARK) & HDMI_DRM_METADATA_MARK); - HdmiInfoframeFillCheckSum(data, lenght); + HdmiInfoFrameFillCheckSum(data, lenght); return HDF_SUCCESS; } -static int32_t HdmiInfoframePacketEncoding(union HdmiInfoframeInfo *infoframe, +static int32_t HdmiInfoFramePacketEncoding(union HdmiInfoFrameInfo *infoFrame, enum HdmiPacketType type, uint8_t *data, uint32_t len) { int32_t ret; - if (infoframe == NULL || data == NULL) { + if (infoFrame == NULL || data == NULL) { HDF_LOGE("input param is invalid."); return HDF_ERR_INVALID_PARAM; } switch (type) { case HDMI_INFOFRAME_PACKET_TYPE_VS: - ret = HdmiInfoframePacketVsEncoding(infoframe, data, len); + ret = HdmiInfoFramePacketVsEncoding(infoFrame, data, len); break; case HDMI_INFOFRAME_PACKET_TYPE_AVI: - ret = HdmiInfoframePacketAviEncoding(infoframe, data, len); + ret = HdmiInfoFramePacketAviEncoding(infoFrame, data, len); break; case HDMI_INFOFRAME_PACKET_TYPE_SPD: - ret = HdmiInfoframePacketSpdEncoding(infoframe, data, len); + ret = HdmiInfoFramePacketSpdEncoding(infoFrame, data, len); break; case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: - ret = HdmiInfoframePacketAudioEncoding(infoframe, data, len); + ret = HdmiInfoFramePacketAudioEncoding(infoFrame, data, len); break; case HDMI_INFOFRAME_PACKET_TYPE_DRM: - ret = HdmiInfoframePacketDrmEncoding(infoframe, data, len); + ret = HdmiInfoFramePacketDrmEncoding(infoFrame, data, len); break; default: HDF_LOGD("type %d not support.", type); @@ -360,42 +361,42 @@ static int32_t HdmiInfoframePacketEncoding(union HdmiInfoframeInfo *infoframe, return ret; } -static int32_t HdmiInfoframeSend(struct HdmiInfoframe *frame, union HdmiInfoframeInfo *infoframe) +static int32_t HdmiInfoFrameSend(struct HdmiInfoFrame *frame, union HdmiInfoFrameInfo *infoFrame) { uint8_t buffer[HDMI_INFOFRAME_LEN] = {0}; struct HdmiCntlr *cntlr = NULL; int32_t ret; - if (frame == NULL || frame->priv == NULL || infoframe == NULL) { - HDF_LOGE("HdmiInfoframeSend: input param is invalid."); + if (frame == NULL || frame->priv == NULL || infoFrame == NULL) { + HDF_LOGE("HdmiInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeSend == NULL || cntlr->ops->infoframeEnable == NULL) { - HDF_LOGD("HdmiInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameSend == NULL || cntlr->ops->infoFrameEnable == NULL) { + HDF_LOGD("HdmiInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } - ret = HdmiInfoframePacketEncoding(infoframe, infoframe->header.type, buffer, HDMI_INFOFRAME_LEN); + ret = HdmiInfoFramePacketEncoding(infoFrame, infoFrame->header.type, buffer, HDMI_INFOFRAME_LEN); if (ret != HDF_SUCCESS) { - HDF_LOGE("encding infoframe %d fail", infoframe->header.type); + HDF_LOGE("encding infoFrame %d fail", infoFrame->header.type); return ret; } HdmiCntlrLock(cntlr); - cntlr->ops->infoframeEnable(cntlr, infoframe->header.type, false); - ret = cntlr->ops->infoframeSend(cntlr, infoframe->header.type, buffer, HDMI_INFOFRAME_LEN); + cntlr->ops->infoFrameEnable(cntlr, infoFrame->header.type, false); + ret = cntlr->ops->infoFrameSend(cntlr, infoFrame->header.type, buffer, HDMI_INFOFRAME_LEN); if (ret != HDF_SUCCESS) { - HDF_LOGE("send infoframe %d fail", infoframe->header.type); + HDF_LOGE("send infoFrame %d fail", infoFrame->header.type); HdmiCntlrUnlock(cntlr); return ret; } - cntlr->ops->infoframeEnable(cntlr, infoframe->header.type, true); + cntlr->ops->infoFrameEnable(cntlr, infoFrame->header.type, true); HdmiCntlrUnlock(cntlr); return HDF_SUCCESS; } -static void HdmiFillAviHdrInfoframe(struct HdmiAviInfoframe *avi, +static void HdmiFillAviHdrInfoFrame(struct HdmiAviInfoFrame *avi, struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *hdrAttr, struct HdmiCommonAttr *commAttr) { switch (hdrAttr->mode) { @@ -434,7 +435,7 @@ static void HdmiFillAviHdrInfoframe(struct HdmiAviInfoframe *avi, } } -static void HdmiFillAviInfoframeVersion(struct HdmiAviInfoframe *avi) +static void HdmiFillAviInfoFrameVersion(struct HdmiAviInfoFrame *avi) { /* * see hdmi spec2.0 10.1. @@ -461,12 +462,12 @@ static void HdmiFillAviInfoframeVersion(struct HdmiAviInfoframe *avi) } } -static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, +static void HdmiFillAviInfoFrame(struct HdmiAviInfoFrame *avi, struct HdmiVideoAttr *videoAttr, struct HdmiHdrAttr *hdrAttr, struct HdmiCommonAttr *commAttr) { bool enable3d = true; - if (memset_s(avi, sizeof(struct HdmiAviInfoframe), 0, sizeof(struct HdmiAviInfoframe)) != EOK) { + if (memset_s(avi, sizeof(struct HdmiAviInfoFrame), 0, sizeof(struct HdmiAviInfoFrame)) != EOK) { HDF_LOGE("fill vsif, memset_s fail."); return; } @@ -488,37 +489,37 @@ static void HdmiFillAviInfoframe(struct HdmiAviInfoframe *avi, avi->vic = HdmiCommonGetVic(videoAttr->timing, videoAttr->aspect, enable3d); avi->pixelRepetitionFactor = (uint8_t)videoAttr->pixelRepeat; avi->yccRange = videoAttr->yccQuantization; - HdmiFillAviHdrInfoframe(avi, videoAttr, hdrAttr, commAttr); - HdmiFillAviInfoframeVersion(avi); + HdmiFillAviHdrInfoFrame(avi, videoAttr, hdrAttr, commAttr); + HdmiFillAviInfoFrameVersion(avi); } -int32_t HdmiAviInfoframeSend(struct HdmiInfoframe *frame, bool enable) +int32_t HdmiAviInfoFrameSend(struct HdmiInfoFrame *frame, bool enable) { struct HdmiCntlr *cntlr = NULL; - union HdmiInfoframeInfo infoframe = {0}; + union HdmiInfoFrameInfo infoFrame = {0}; if (frame == NULL || frame->priv == NULL) { - HDF_LOGE("HdmiAviInfoframeSend: input param is invalid."); + HDF_LOGE("HdmiAviInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL || cntlr->ops->infoframeSend == NULL) { - HDF_LOGD("HdmiAviInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameEnable == NULL || cntlr->ops->infoFrameSend == NULL) { + HDF_LOGD("HdmiAviInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } if (enable == false) { - cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AVI, false); + cntlr->ops->infoFrameEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AVI, false); return HDF_SUCCESS; } - HdmiFillAviInfoframe(&(frame->avi), &(cntlr->attr.videoAttr), &(cntlr->attr.hdrAttr), &(cntlr->attr.commAttr)); - infoframe.avi = frame->avi; - return HdmiInfoframeSend(frame, &infoframe); + HdmiFillAviInfoFrame(&(frame->avi), &(cntlr->attr.videoAttr), &(cntlr->attr.hdrAttr), &(cntlr->attr.commAttr)); + infoFrame.avi = frame->avi; + return HdmiInfoFrameSend(frame, &infoFrame); } -void HdmiFillAudioInfoframe(struct HdmiAudioInfoframe *audio, struct HdmiAudioAttr *audioAttr) +void HdmiFillAudioInfoFrame(struct HdmiAudioInfoFrame *audio, struct HdmiAudioAttr *audioAttr) { - if (memset_s(audio, sizeof(struct HdmiAudioInfoframe), 0, sizeof(struct HdmiAudioInfoframe)) != EOK) { + if (memset_s(audio, sizeof(struct HdmiAudioInfoFrame), 0, sizeof(struct HdmiAudioInfoFrame)) != EOK) { HDF_LOGE("fill vsif, memset_s fail."); return; } @@ -561,35 +562,35 @@ void HdmiFillAudioInfoframe(struct HdmiAudioInfoframe *audio, struct HdmiAudioAt } } -int32_t HdmiAudioInfoframeSend(struct HdmiInfoframe *frame, bool enable) +int32_t HdmiAudioInfoFrameSend(struct HdmiInfoFrame *frame, bool enable) { struct HdmiCntlr *cntlr = NULL; - union HdmiInfoframeInfo infoframe = {0}; + union HdmiInfoFrameInfo infoFrame = {0}; if (frame == NULL || frame->priv == NULL) { - HDF_LOGE("HdmiAudioInfoframeSend: input param is invalid."); + HDF_LOGE("HdmiAudioInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { - HDF_LOGD("HdmiAudioInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameEnable == NULL) { + HDF_LOGD("HdmiAudioInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } if (enable == false) { HdmiCntlrLock(cntlr); - cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AUDIO, false); + cntlr->ops->infoFrameEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_AUDIO, false); HdmiCntlrUnlock(cntlr); return HDF_SUCCESS; } - HdmiFillAudioInfoframe(&(frame->audio), &(cntlr->attr.audioAttr)); - infoframe.audio = frame->audio; - return HdmiInfoframeSend(frame, &infoframe); + HdmiFillAudioInfoFrame(&(frame->audio), &(cntlr->attr.audioAttr)); + infoFrame.audio = frame->audio; + return HdmiInfoFrameSend(frame, &infoFrame); } -static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAttr *hdrAttr) +static void HdmiFillDrmInfoFrame(struct HdmiDrmInfoFrame *drm, struct HdmiHdrAttr *hdrAttr) { - if (memset_s(drm, sizeof(struct HdmiDrmInfoframe), 0, sizeof(struct HdmiDrmInfoframe)) != EOK) { + if (memset_s(drm, sizeof(struct HdmiDrmInfoFrame), 0, sizeof(struct HdmiDrmInfoFrame)) != EOK) { HDF_LOGE("fill vsif, memset_s fail."); return; } @@ -601,28 +602,28 @@ static void HdmiFillDrmInfoframe(struct HdmiDrmInfoframe *drm, struct HdmiHdrAtt drm->des = hdrAttr->descriptor; } -int32_t HdmiDrmInfoframeSend(struct HdmiInfoframe *frame, bool enable) +int32_t HdmiDrmInfoFrameSend(struct HdmiInfoFrame *frame, bool enable) { struct HdmiCntlr *cntlr = NULL; - union HdmiInfoframeInfo infoframe = {0}; + union HdmiInfoFrameInfo infoFrame = {0}; if (frame == NULL || frame->priv == NULL) { - HDF_LOGE("HdmiDrmInfoframeSend: input param is invalid."); + HDF_LOGE("HdmiDrmInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { - HDF_LOGD("HdmiDrmInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameEnable == NULL) { + HDF_LOGD("HdmiDrmInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } if (enable == false) { - cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_DRM, false); + cntlr->ops->infoFrameEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_DRM, false); return HDF_SUCCESS; } - HdmiFillDrmInfoframe(&(frame->drm), &(cntlr->attr.hdrAttr)); - infoframe.drm = frame->drm; - return HdmiInfoframeSend(frame, &infoframe); + HdmiFillDrmInfoFrame(&(frame->drm), &(cntlr->attr.hdrAttr)); + infoFrame.drm = frame->drm; + return HdmiInfoFrameSend(frame, &infoFrame); } static uint8_t HdmiGetVsifLength(struct HdmiVs14VsifContent *_14Vsif, bool dolbyEnable, bool hdrSupport) @@ -643,7 +644,7 @@ static uint8_t HdmiGetVsifLength(struct HdmiVs14VsifContent *_14Vsif, bool dolby return length; } -static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *videoAttr) +static void HdmiFill14Vsif(struct HdmiVsInfoFrame *vs, struct HdmiVideoAttr *videoAttr) { struct HdmiVideo4kInfo *info = NULL; struct HdmiVs14VsifContent *vsif = &(vs->vsifContent.vsif); @@ -672,13 +673,13 @@ static void HdmiFill14Vsif(struct HdmiVsInfoframe *vs, struct HdmiVideoAttr *vid } } -static void HdmiFillVsInfoframe(struct HdmiInfoframe *frame, struct HdmiVideoAttr *videoAttr, +static void HdmiFillVsInfoFrame(struct HdmiInfoFrame *frame, struct HdmiVideoAttr *videoAttr, bool dolbyEnable, bool hdrSupport) { - struct HdmiVsInfoframe *vs = &(frame->vs); + struct HdmiVsInfoFrame *vs = &(frame->vs); int32_t ret; - ret = memset_s(vs, sizeof(struct HdmiVsInfoframe), 0, sizeof(struct HdmiVsInfoframe)); + ret = memset_s(vs, sizeof(struct HdmiVsInfoFrame), 0, sizeof(struct HdmiVsInfoFrame)); if (ret != EOK) { HDF_LOGE("fill vsif, memset_s fail."); return; @@ -696,38 +697,38 @@ static void HdmiFillVsInfoframe(struct HdmiInfoframe *frame, struct HdmiVideoAtt } } -int32_t HdmiVsInfoframeSend(struct HdmiInfoframe *frame, bool enable, bool dolbyEnable) +int32_t HdmiVsInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, bool dolbyEnable) { struct HdmiCntlr *cntlr = NULL; - union HdmiInfoframeInfo infoframe = {0}; + union HdmiInfoFrameInfo infoFrame = {0}; if (frame == NULL || frame->priv == NULL) { - HDF_LOGE("HdmiVsInfoframeSend: input param is invalid."); + HDF_LOGE("HdmiVsInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { - HDF_LOGD("HdmiVsInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameEnable == NULL) { + HDF_LOGD("HdmiVsInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } if (enable == false) { - cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_VS, false); + cntlr->ops->infoFrameEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_VS, false); return HDF_SUCCESS; } - HdmiFillVsInfoframe(frame, &(cntlr->attr.videoAttr), dolbyEnable, frame->hdrSupport); - infoframe.vs = frame->vs; - return HdmiInfoframeSend(frame, &infoframe); + HdmiFillVsInfoFrame(frame, &(cntlr->attr.videoAttr), dolbyEnable, frame->hdrSupport); + infoFrame.vs = frame->vs; + return HdmiInfoFrameSend(frame, &infoFrame); } -static void HdmiFillSpdInfoframe(struct HdmiSpdInfoframe *spd, +static void HdmiFillSpdInfoFrame(struct HdmiSpdInfoFrame *spd, const char *vendorName, const char *productName, enum HdmiSpdSdi sdi) { uint32_t len, length; - if (memset_s(spd, sizeof(struct HdmiSpdInfoframe), 0, sizeof(struct HdmiSpdInfoframe)) != EOK) { - HDF_LOGE("fill spd infoframe, memset_s fail."); + if (memset_s(spd, sizeof(struct HdmiSpdInfoFrame), 0, sizeof(struct HdmiSpdInfoFrame)) != EOK) { + HDF_LOGE("fill spd infoFrame, memset_s fail."); return; } spd->type = HDMI_INFOFRAME_PACKET_TYPE_SPD; @@ -739,91 +740,91 @@ static void HdmiFillSpdInfoframe(struct HdmiSpdInfoframe *spd, length = (uint32_t)sizeof(spd->vendorName); length = (length > len) ? len : length; if (memcpy_s(spd->vendorName, length, vendorName, length) != EOK) { - HDF_LOGE("fill spd infoframe vendor name, memcpy_s fail."); + HDF_LOGE("fill spd infoFrame vendor name, memcpy_s fail."); } len = (uint32_t)strlen(productName); length = (uint32_t)sizeof(spd->productDescription); length = (length > len) ? len : length; if (memcpy_s(spd->productDescription, length, productName, length) != EOK) { - HDF_LOGE("fill spd infoframe product name, memcpy_s fail."); + HDF_LOGE("fill spd infoFrame product name, memcpy_s fail."); } } -int32_t HdmiSpdInfoframeSend(struct HdmiInfoframe *frame, bool enable, +int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, char *vendorName, char *productName, enum HdmiSpdSdi sdi) { struct HdmiCntlr *cntlr = NULL; - union HdmiInfoframeInfo infoframe = {0}; + union HdmiInfoFrameInfo infoFrame = {0}; if (frame == NULL || frame->priv == NULL) { - HDF_LOGE("HdmiSpdInfoframeSend: input param is invalid."); + HDF_LOGE("HdmiSpdInfoFrameSend: input param is invalid."); return HDF_ERR_INVALID_PARAM; } cntlr = (struct HdmiCntlr *)frame->priv; - if (cntlr->ops == NULL || cntlr->ops->infoframeEnable == NULL) { - HDF_LOGD("HdmiSpdInfoframeSend not support."); + if (cntlr->ops == NULL || cntlr->ops->infoFrameEnable == NULL) { + HDF_LOGD("HdmiSpdInfoFrameSend not support."); return HDF_ERR_NOT_SUPPORT; } if (enable == false) { - cntlr->ops->infoframeEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_SPD, false); + cntlr->ops->infoFrameEnable(cntlr, HDMI_INFOFRAME_PACKET_TYPE_SPD, false); return HDF_SUCCESS; } - HdmiFillSpdInfoframe(&(frame->spd), vendorName, productName, sdi); - infoframe.spd = frame->spd; - return HdmiInfoframeSend(frame, &infoframe); + HdmiFillSpdInfoFrame(&(frame->spd), vendorName, productName, sdi); + infoFrame.spd = frame->spd; + return HdmiInfoFrameSend(frame, &infoFrame); } -int32_t HdmiInfoframeGetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, - union HdmiInfoframeInfo *infoframe) +int32_t HdmiInfoFrameGetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, + union HdmiInfoFrameInfo *infoFrame) { - if (frame == NULL || infoframe == NULL) { + if (frame == NULL || infoFrame == NULL) { return HDF_ERR_INVALID_PARAM; } switch (type) { case HDMI_INFOFRAME_PACKET_TYPE_VS: - infoframe->vs = frame->vs; + infoFrame->vs = frame->vs; break; case HDMI_INFOFRAME_PACKET_TYPE_AVI: - infoframe->avi = frame->avi; + infoFrame->avi = frame->avi; break; case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: - infoframe->audio = frame->audio; + infoFrame->audio = frame->audio; break; case HDMI_INFOFRAME_PACKET_TYPE_DRM: - infoframe->drm = frame->drm; + infoFrame->drm = frame->drm; break; default: - HDF_LOGD("infoframe %d not support get", type); + HDF_LOGD("infoFrame %d not support get", type); return HDF_ERR_INVALID_PARAM; } return HDF_SUCCESS; } -int32_t HdmiInfoframeSetInfo(struct HdmiInfoframe *frame, enum HdmiPacketType type, - union HdmiInfoframeInfo *infoframe) +int32_t HdmiInfoFrameSetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, + union HdmiInfoFrameInfo *infoFrame) { - if (frame == NULL || infoframe == NULL) { + if (frame == NULL || infoFrame == NULL) { return HDF_ERR_INVALID_PARAM; } switch (type) { case HDMI_INFOFRAME_PACKET_TYPE_VS: - frame->vs = infoframe->vs; + frame->vs = infoFrame->vs; break; case HDMI_INFOFRAME_PACKET_TYPE_AVI: - frame->avi = infoframe->avi; + frame->avi = infoFrame->avi; break; case HDMI_INFOFRAME_PACKET_TYPE_AUDIO: - frame->audio = infoframe->audio; + frame->audio = infoFrame->audio; break; case HDMI_INFOFRAME_PACKET_TYPE_DRM: - frame->drm = infoframe->drm; + frame->drm = infoFrame->drm; break; default: - HDF_LOGD("infoframe %d not support set", type); + HDF_LOGD("infoFrame %d not support set", type); return HDF_ERR_INVALID_PARAM; } return HDF_SUCCESS; diff --git a/support/platform/src/i3c/i3c_core.c b/support/platform/src/i3c/i3c_core.c index 6bfc64aef..e7ea2f784 100755 --- a/support/platform/src/i3c/i3c_core.c +++ b/support/platform/src/i3c/i3c_core.c @@ -7,9 +7,9 @@ */ #include "i3c_core.h" -#include "i3c_ccc.h" #include "hdf_device_desc.h" #include "hdf_log.h" +#include "i3c_ccc.h" #include "osal_mem.h" #include "osal_mutex.h" diff --git a/support/platform/src/i3c/i3c_if.c b/support/platform/src/i3c/i3c_if.c index a1ebe7b2b..14ecb7b98 100755 --- a/support/platform/src/i3c/i3c_if.c +++ b/support/platform/src/i3c/i3c_if.c @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "i3c_core.h" #include "i3c_if.h" +#include "i3c_core.h" #include "hdf_log.h" #define HDF_LOG_TAG i3c_if_c diff --git a/support/platform/src/regulator/regulator_tree_mgr.c b/support/platform/src/regulator/regulator_tree_mgr.c index 0a8aa353c..652a42f69 100755 --- a/support/platform/src/regulator/regulator_tree_mgr.c +++ b/support/platform/src/regulator/regulator_tree_mgr.c @@ -8,7 +8,6 @@ #include "regulator_tree_mgr.h" #include "osal_mem.h" -#include "securec.h" static struct RegulatorTreeManager *g_regulatorTreeManager = NULL; static int RegulatorChildNodeAdd(struct RegulatorTreeInfo *pRegulator, struct RegulatorNode *child) @@ -263,8 +262,7 @@ int RegulatorTreeSet(const char *name, struct RegulatorNode *child, struct Regul return HDF_FAILURE; } - HDF_LOGI("RegulatorTreeSet: set [%s], parent[%s] success!", - name, parent->regulatorInfo.name); + HDF_LOGI("RegulatorTreeSet: set [%s], parent[%s] success!", name, parent->regulatorInfo.name); return HDF_SUCCESS; } static void RegulatorTreePrintChild(const char *name, struct DListHead *childHead) diff --git a/support/platform/test/unittest/common/hdf_hdmi_test.cpp b/support/platform/test/unittest/common/hdf_hdmi_test.cpp index 1bce4e047..e0017c2fd 100644 --- a/support/platform/test/unittest/common/hdf_hdmi_test.cpp +++ b/support/platform/test/unittest/common/hdf_hdmi_test.cpp @@ -14,8 +14,9 @@ #include #include #include "hdmi_if.h" -#include "hdf_io_service_if.h" #include "hdf_uhdf_test.h" +#include "hdf_io_service_if.h" + using namespace testing::ext; diff --git a/test/unittest/platform/common/gpio_test.c b/test/unittest/platform/common/gpio_test.c index 35b20cd94..e64507ec7 100644 --- a/test/unittest/platform/common/gpio_test.c +++ b/test/unittest/platform/common/gpio_test.c @@ -74,7 +74,7 @@ static struct GpioTester *GpioTesterGet(void) { int32_t ret; static struct GpioTester tester; - static struct GpioTester *pTester; + static struct GpioTester *pTester = NULL; if (pTester != NULL) { return pTester; diff --git a/test/unittest/platform/common/hdmi_test.c b/test/unittest/platform/common/hdmi_test.c index e46fe95a4..540a52715 100644 --- a/test/unittest/platform/common/hdmi_test.c +++ b/test/unittest/platform/common/hdmi_test.c @@ -6,12 +6,12 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdmi_test.h" #include "device_resource_if.h" #include "hdf_base.h" #include "hdf_log.h" -#include "osal_time.h" #include "hdmi_if.h" -#include "hdmi_test.h" +#include "osal_time.h" #define HDF_LOG_TAG hdmi_test_c @@ -156,7 +156,9 @@ static int32_t TestHdmiDeepColorSetAndGet(struct HdmiTester *tester) static void TestHdmiHdpHandle(void *data, bool hdp) { - (void)data; + if (data == NULL) { + printf("data is null"); + } if (hdp == true) { HDF_LOGE("TestHdmiHdpHandle: hdp."); diff --git a/test/unittest/platform/common/i3c_test.c b/test/unittest/platform/common/i3c_test.c index 76c7db094..d1e8f47fa 100644 --- a/test/unittest/platform/common/i3c_test.c +++ b/test/unittest/platform/common/i3c_test.c @@ -22,6 +22,7 @@ #define I3C_TEST_MSG_NUM 2 #define I3C_TEST_8BIT 8 #define I3C_TEST_WAIT_TIMES 100 +#define I3C_TEST_WAIT_TIMEOUT 20 #define I3C_TEST_STACK_SIZE (1024 * 256) #define I3C_TEST_IBI_PAYLOAD 16 #define I3C_TEST_REG_LEN 2 @@ -357,11 +358,13 @@ int32_t I3cTestFreeIbi(void *param) int32_t I3cTestThreadFunc(OsalThreadEntry func) { int32_t ret; + uint32_t time; struct OsalThread thread1, thread2; struct OsalThreadParam cfg1, cfg2; int32_t count1, count2; count1 = count2 = 0; + time = 0; ret = OsalThreadCreate(&thread1, func, (void *)&count1); if (ret != HDF_SUCCESS) { HDF_LOGE("create test thread1 fail:%d", ret); @@ -394,6 +397,10 @@ int32_t I3cTestThreadFunc(OsalThreadEntry func) while (count1 == 0 || count2 == 0) { HDF_LOGE("waitting testing thread finish..."); OsalMSleep(I3C_TEST_WAIT_TIMES); + time++; + if (time > I3C_TEST_WAIT_TIMEOUT) { + break; + } } (void)OsalThreadDestroy(&thread1); diff --git a/test/unittest/platform/common/pin_test.c b/test/unittest/platform/common/pin_test.c index b513dda8b..2224f1cfd 100644 --- a/test/unittest/platform/common/pin_test.c +++ b/test/unittest/platform/common/pin_test.c @@ -129,7 +129,6 @@ static int32_t PinSetGetPullTest(void) HDF_LOGE("%s: Pin get pull failed!, pinName:%s", __func__, tester->config.pinName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin get pull success!, PullTypeNum:%d", __func__, getPullTypeNum); if (tester->config.PullTypeNum != getPullTypeNum) { HDF_LOGE("%s: Pin set pull:%d, but Pin get pull:%u", __func__, tester->config.PullTypeNum, getPullTypeNum); } @@ -159,10 +158,9 @@ static int32_t PinSetGetStrengthTest(void) HDF_LOGE("%s: Pin get pull failed!, pinName:%s", __func__, tester->config.pinName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin get pull success!, strengthNum:%d", __func__, getStrengthNum); if (tester->config.strengthNum != getStrengthNum) { - HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d", - __func__, tester->config.strengthNum, getStrengthNum); + HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d",__func__, + tester->config.strengthNum, getStrengthNum); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -181,22 +179,22 @@ static int32_t PinSetGetFuncTest(void) ret = PinSetFunc(tester->handle, (const char *)tester->config.funcNameBuf); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Pin set function failed!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcNameBuf); + __func__, tester->config.pinName, tester->config.funcNameBuf); return HDF_FAILURE; } HDF_LOGI("%s: Pin set function success!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcNameBuf); + __func__, tester->config.pinName, tester->config.funcNameBuf); ret = PinGetFunc(tester->handle, &tester->config.funcName); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Pin get function failed!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcName); + __func__, tester->config.pinName, tester->config.funcName); return HDF_FAILURE; } HDF_LOGI("%s: Pin get function success!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcName); + __func__, tester->config.pinName, tester->config.funcName); if (strcmp((const char *)tester->config.funcNameBuf, tester->config.funcName) != 0) { HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", - __func__, tester->config.funcNameBuf, tester->config.funcName); + __func__, tester->config.funcNameBuf, tester->config.funcName); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -219,8 +217,8 @@ int32_t PinTestSetUpAll(void) cfg = &tester->config; HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", - __func__, cfg->pinName, cfg->PullTypeNum, cfg->strengthNum); - ret = PinGetPull(tester->handle , &g_oldPinCfg.pullTypeNum); + __func__, cfg->pinName, cfg->PullTypeNum, cfg->strengthNum); + ret = PinGetPull(tester->handle, &g_oldPinCfg.pullTypeNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get pullTypeNum failed!", __func__); return ret; diff --git a/test/unittest/platform/common/regulator_test.c b/test/unittest/platform/common/regulator_test.c index 1644497c8..75ff547e8 100755 --- a/test/unittest/platform/common/regulator_test.c +++ b/test/unittest/platform/common/regulator_test.c @@ -182,12 +182,13 @@ static int RegulatorTestThreadFunc(void *param) int32_t RegulatorTestMultiThread(struct RegulatorTest *test) { int32_t ret; + uint32_t time; struct OsalThread thread1, thread2; struct OsalThreadParam cfg1, cfg2; int32_t count1, count2; count1 = count2 = 0; - + time = 0; ret = OsalThreadCreate(&thread1, (OsalThreadEntry)RegulatorTestThreadFunc, (void *)&count1); if (ret != HDF_SUCCESS) { HDF_LOGE("create test thread1 fail:%d", ret); @@ -225,6 +226,10 @@ int32_t RegulatorTestMultiThread(struct RegulatorTest *test) while (count1 == 0 || count2 == 0) { HDF_LOGE("waitting testing Regulator thread finish..."); OsalMSleep(REGULATOR_TEST_WAIT_TIMES); + time++; + if (time > REGULATOR_TEST_WAIT_TIMEOUT) { + break; + } } (void)OsalThreadDestroy(&thread1); diff --git a/test/unittest/platform/common/regulator_test.h b/test/unittest/platform/common/regulator_test.h index 48f9d6ad5..99a52ff7b 100755 --- a/test/unittest/platform/common/regulator_test.h +++ b/test/unittest/platform/common/regulator_test.h @@ -40,6 +40,7 @@ enum RegulatorTestCmd { #define REGULATOR_TEST_STACK_SIZE (1024 * 100) #define REGULATOR_TEST_WAIT_TIMES 200 +#define REGULATOR_TEST_WAIT_TIMEOUT 20 struct RegulatorTest { struct IDeviceIoService service; diff --git a/test/unittest/platform/hdf_gpio_entry_test.c b/test/unittest/platform/hdf_gpio_entry_test.c index 82952e171..ebda1edb7 100644 --- a/test/unittest/platform/hdf_gpio_entry_test.c +++ b/test/unittest/platform/hdf_gpio_entry_test.c @@ -7,9 +7,7 @@ */ #include "hdf_gpio_entry_test.h" -#include "gpio_if.h" #include "gpio_test.h" -#include "hdf_log.h" #define HDF_LOG_TAG hdf_gpio_entry_test diff --git a/test/unittest/platform/hdf_hdmi_entry_test.c b/test/unittest/platform/hdf_hdmi_entry_test.c index 6c97f196b..382546e45 100644 --- a/test/unittest/platform/hdf_hdmi_entry_test.c +++ b/test/unittest/platform/hdf_hdmi_entry_test.c @@ -8,8 +8,9 @@ #include "hdf_hdmi_entry_test.h" #include "hdmi_if.h" -#include "hdmi_test.h" #include "hdf_log.h" +#include "hdmi_test.h" + #define HDF_LOG_TAG hdf_hdmi_entry_test -- Gitee From ff3c61a53c6ee3ca8c21c7c49ed64dd07df8015b Mon Sep 17 00:00:00 2001 From: jifengfei Date: Fri, 26 Nov 2021 16:20:48 +0800 Subject: [PATCH 201/272] modify code Signed-off-by: jifengfei --- model/sensor/driver/hall/sensor_hall_driver.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/sensor/driver/hall/sensor_hall_driver.h b/model/sensor/driver/hall/sensor_hall_driver.h index fd745fbcd..7766365d4 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.h +++ b/model/sensor/driver/hall/sensor_hall_driver.h @@ -31,7 +31,7 @@ struct HallDrvData { struct SensorCfgData *hallCfg; struct HallOpsCall ops; uint16_t status; - unsigned long delayTime; + uint32_t delayTime; }; int32_t HallRegisterChipOps(const struct HallOpsCall *ops); -- Gitee From a51d46cc46a0ba37e32b0fab1e3445c525a7451c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Sat, 27 Nov 2021 11:41:39 +0800 Subject: [PATCH 202/272] clear code warings Signed-off-by: YOUR_NAME --- tools/hc-gen/src/macro_gen.cpp | 12 ++++++------ tools/hc-gen/src/macro_gen.h | 4 ++-- .../hdi-gen/codegen/c_custom_types_code_emitter.cpp | 2 +- tools/hdi-gen/codegen/code_generator.h | 2 +- tools/hdi-gen/parser/module_parser.h | 2 +- tools/hdi-gen/util/options.cpp | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index 801fcd05e..b8c6ad7ff 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -219,23 +219,23 @@ bool MacroGen::NodeWalk() { return ast_->WalkForward([this](std::shared_ptr ¤t, uint32_t depth) { auto type = current->Type(); - static std::string nodeName; - static std::string arrayName; static uint32_t arraySize = 0; - static uint32_t arrayType = 0; Logger().Debug() << "name,type:[" << current->Name() << "," << type \ << "] depth:" << depth \ << " arraySize:" << std::dec << arraySize << '\n'; - SetTypeData(type, current, nodeName, arrayName, arraySize, arrayType, depth); + SetTypeData(type, current, arraySize, depth); return NOERR; }); } -void MacroGen::SetTypeData(uint32_t type, const std::shared_ptr ¤t, std::string &nodeName, - std::string &arrayName, uint32_t &arraySize, uint32_t &arrayType, uint32_t depth) +void MacroGen::SetTypeData(uint32_t type, const std::shared_ptr ¤t, + uint32_t &arraySize, uint32_t depth) { + static std::string nodeName; + static std::string arrayName; + static uint32_t arrayType = 0; switch (type) { case PARSEROP_UINT8: case PARSEROP_UINT16: diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 4aab864e5..3800b0cfe 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -34,6 +34,8 @@ private: bool NodeWalk(); + void SetTypeData(uint32_t type, const std::shared_ptr ¤t, uint32_t &arraySize, uint32_t depth); + bool HeaderTopOutput(); bool HeaderBottomOutput(); @@ -47,8 +49,6 @@ private: std::ofstream ofs_; std::string outFileName_; std::map nodeNameMap_; - void SetTypeData(uint32_t type, const std::shared_ptr ¤t, std::string &nodeName, - std::string &arrayName, uint32_t &arraySize, uint32_t &arrayType, uint32_t depth); }; } // Hardware } // OHOS diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 19d9883ee..8d59af572 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -8,8 +8,8 @@ #include "codegen/c_custom_types_code_emitter.h" #include "util/file.h" -#include "util/options.h" #include "util/logger.h" +#include "util/options.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/codegen/code_generator.h b/tools/hdi-gen/codegen/code_generator.h index c5f0f59f1..244074b40 100755 --- a/tools/hdi-gen/codegen/code_generator.h +++ b/tools/hdi-gen/codegen/code_generator.h @@ -9,8 +9,8 @@ #ifndef OHOS_HDI_CODEGENERATOR_H #define OHOS_HDI_CODEGENERATOR_H -#include "codegen/code_emitter.h" #include "ast/ast_module.h" +#include "codegen/code_emitter.h" namespace OHOS { namespace HDI { diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 4041d914b..934ef45e9 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -9,8 +9,8 @@ #ifndef OHOS_HDI_MODULE_PARSER_H #define OHOS_HDI_MODULE_PARSER_H -#include #include +#include #include "ast/ast_module.h" #include "parser/file_detail.h" #include "util/options.h" diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index a20a74509..5333c017d 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -38,7 +38,7 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, char* const argv[]) +Options& Options::Parse(int argc, const char* argv[]) { program_ = argv[0]; opterr = 1; -- Gitee From 4bc066420db3d399dcd6a5ee2b8708f31c529a1a Mon Sep 17 00:00:00 2001 From: huangkai Date: Sat, 27 Nov 2021 09:54:58 +0000 Subject: [PATCH 203/272] test Signed-off-by: huangkai --- model/input/driver/touchscreen/touch_gt911.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/model/input/driver/touchscreen/touch_gt911.c b/model/input/driver/touchscreen/touch_gt911.c index df8aa5064..5936d8f33 100644 --- a/model/input/driver/touchscreen/touch_gt911.c +++ b/model/input/driver/touchscreen/touch_gt911.c @@ -250,6 +250,7 @@ static void FreeChipConfig(TouchChipCfg *config) { if (config == NULL) { HDF_LOGE("%s: param is null", __func__); + return; } if (config->pwrSeq.pwrOn.buf != NULL) { OsalMemFree(config->pwrSeq.pwrOn.buf); @@ -294,7 +295,7 @@ static int32_t HdfGoodixChipInit(struct HdfDeviceObject *device) chipDev->ops = &g_gt911ChipOps; chipDev->chipName = chipCfg->chipName; chipDev->vendorName = chipCfg->vendorName; - device->priv = chipDev; + device->priv = (void *)chipDev; if (RegisterTouchChipDevice(chipDev) != HDF_SUCCESS) { goto EXIT1; @@ -311,18 +312,10 @@ EXIT: static void HdfGoodixChipRelease(struct HdfDeviceObject *device) { - ChipDevice *chipDev = NULL; if (device == NULL || device->priv == NULL) { HDF_LOGE("%s: param is null", __func__); return; } - - chipDev = (ChipDevice *)device->priv; - if (chipDev->chipCfg != NULL) { - FreeChipConfig(chipDev->chipCfg); - } - OsalMemFree(chipDev); - HDF_LOGI("%s: goodix chip is release", __func__); } -- Gitee From b45e47ff76917bc68e09c1a1de8cc96e77ec20de Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Sat, 27 Nov 2021 18:02:36 +0800 Subject: [PATCH 204/272] direction Signed-off-by: sunxuejiao --- .../sensor/driver/accel/sensor_accel_driver.c | 7 ++ .../driver/chipset/accel/accel_bmi160.c | 6 ++ .../sensor/driver/chipset/gyro/gyro_bmi160.c | 6 ++ .../driver/chipset/magnetic/magnetic_lsm303.c | 6 ++ .../common/include/sensor_config_parser.h | 27 ++++++ .../driver/common/src/sensor_config_parser.c | 86 +++++++++++++++++++ model/sensor/driver/gyro/sensor_gyro_driver.c | 7 ++ .../driver/magnetic/sensor_magnetic_driver.c | 7 ++ 8 files changed, 152 insertions(+) diff --git a/model/sensor/driver/accel/sensor_accel_driver.c b/model/sensor/driver/accel/sensor_accel_driver.c index dca54870a..5e46d44eb 100644 --- a/model/sensor/driver/accel/sensor_accel_driver.c +++ b/model/sensor/driver/accel/sensor_accel_driver.c @@ -246,6 +246,11 @@ static int32_t InitAccelAfterDetected(struct SensorCfgData *config) return HDF_FAILURE; } + if (ParseSensorDirection(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse accel direction failed", __func__); + return HDF_FAILURE; + } + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); @@ -309,10 +314,12 @@ void AccelReleaseCfgData(struct SensorCfgData *accelCfg) (void)DeleteSensorDevice(&accelCfg->sensorInfo); ReleaseSensorAllRegConfig(accelCfg); (void)ReleaseSensorBusHandle(&accelCfg->busCfg); + ReleaseSensorDirectionConfig(accelCfg); accelCfg->root = NULL; (void)memset_s(&accelCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&accelCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&accelCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&accelCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } diff --git a/model/sensor/driver/chipset/accel/accel_bmi160.c b/model/sensor/driver/chipset/accel/accel_bmi160.c index 2ee5764f8..8472938fd 100644 --- a/model/sensor/driver/chipset/accel/accel_bmi160.c +++ b/model/sensor/driver/chipset/accel/accel_bmi160.c @@ -106,6 +106,12 @@ int32_t ReadBmi160Data(struct SensorCfgData *data) tmp[ACCEL_Y_AXIS] = (rawData.y * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT; tmp[ACCEL_Z_AXIS] = (rawData.z * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT; + ret = SensorRawDataToRemapData(data->direction, tmp, sizeof(tmp) / sizeof(tmp[0])); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BMI160 convert raw data failed", __func__); + return HDF_FAILURE; + } + event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; ret = ReportSensorEvent(&event); diff --git a/model/sensor/driver/chipset/gyro/gyro_bmi160.c b/model/sensor/driver/chipset/gyro/gyro_bmi160.c index f29c1f426..3b0e0faa9 100644 --- a/model/sensor/driver/chipset/gyro/gyro_bmi160.c +++ b/model/sensor/driver/chipset/gyro/gyro_bmi160.c @@ -100,6 +100,12 @@ int32_t ReadBmi160GyroData(struct SensorCfgData *data) tmp[GYRO_Y_AXIS] = rawData.y * BMI160_GYRO_SENSITIVITY_2000DPS; tmp[GYRO_Z_AXIS] = rawData.z * BMI160_GYRO_SENSITIVITY_2000DPS; + ret = SensorRawDataToRemapData(data->direction, tmp, sizeof(tmp) / sizeof(tmp[0])); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: BMI160 convert raw data failed", __func__); + return HDF_FAILURE; + } + event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; ret = ReportSensorEvent(&event); diff --git a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c index ba554632a..d006e14e8 100755 --- a/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c +++ b/model/sensor/driver/chipset/magnetic/magnetic_lsm303.c @@ -104,6 +104,12 @@ int32_t ReadLsm303Data(struct SensorCfgData *data) tmp[MAGNETIC_Y_AXIS] = rawData.y * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_XY47GA; tmp[MAGNETIC_Z_AXIS] = rawData.z * LSM303_MAGNETIC_GIN / LSM303DLHC_SENSITIVITY_Z47GA; + ret = SensorRawDataToRemapData(data->direction, tmp, sizeof(tmp) / sizeof(tmp[0])); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: LSM303 convert raw data failed", __func__); + return HDF_FAILURE; + } + event.dataLen = sizeof(tmp); event.data = (uint8_t *)&tmp; ret = ReportSensorEvent(&event); diff --git a/model/sensor/driver/common/include/sensor_config_parser.h b/model/sensor/driver/common/include/sensor_config_parser.h index 0967186b3..cb3af1bfc 100644 --- a/model/sensor/driver/common/include/sensor_config_parser.h +++ b/model/sensor/driver/common/include/sensor_config_parser.h @@ -17,6 +17,8 @@ #include "spi_if.h" #define SENSOR_CONFIG_MAX_ITEM 100 +#define MAX_SENSOR_INDEX_NUM 48 +#define MAX_SENSOR_AXIS_NUM 3 enum SensorRegOpsType { SENSOR_INIT_GROUP = 0, @@ -66,12 +68,34 @@ struct SensorRegCfgGroupNode { struct SensorRegCfg *regCfgItem; }; +struct SensorDirection { + uint32_t sign[MAX_SENSOR_AXIS_NUM]; + uint32_t map[MAX_SENSOR_AXIS_NUM]; +}; + +enum SensorDirectionIndex { + SIGN_X_INDEX = 0, + SIGN_Y_INDEX, + SIGN_Z_INDEX, + AXIS_X_INDEX, + AXIS_Y_INDEX, + AXIS_Z_INDEX, + AXIS_INDEX_MAX, +}; + +enum AxisNum { + AXIS_X = 0, + AXIS_Y = 1, + AXIS_Z = 2, +}; + struct SensorCfgData { struct SensorBusCfg busCfg; struct SensorBasicInfo sensorInfo; struct SensorAttr sensorAttr; struct SensorRegCfgGroupNode **regCfgGroup; const struct DeviceResourceNode *root; + struct SensorDirection *direction; }; int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct SensorCfgData *config); @@ -80,5 +104,8 @@ void ReleaseSensorAllRegConfig(struct SensorCfgData *config); int32_t GetSensorBusHandle(struct SensorBusCfg *busCfg); int32_t ReleaseSensorBusHandle(struct SensorBusCfg *busCfg); int32_t DetectSensorDevice(struct SensorCfgData *config); +int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *remapData, uint32_t num); +void ReleaseSensorDirectionConfig(struct SensorCfgData *config); +int32_t ParseSensorDirection(struct SensorCfgData *config); #endif /* SENSOR_CONFIG_PARSER_H */ diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 9f0f3d4dd..ed7549afd 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -382,6 +382,92 @@ static int32_t ParseSensorAttr(struct DeviceResourceIface *parser, const struct return ret; } +void ReleaseSensorDirectionConfig(struct SensorCfgData *config) +{ + if (config->direction != NULL) { + OsalMemFree(config->direction); + config->direction = NULL; + } +} + +int32_t ParseSensorDirection(struct SensorCfgData *config) +{ + uint32_t index; + uint32_t *buf = NULL; + const struct DeviceResourceNode *directionNode = NULL; + struct DeviceResourceIface *parser = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(config->root, HDF_ERR_INVALID_PARAM); + parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); + + directionNode = parser->GetChildNode(config->root, "sensorDirection"); + CHECK_NULL_PTR_RETURN_VALUE(directionNode, HDF_ERR_INVALID_PARAM); + + int32_t num = parser->GetElemNum(directionNode, "convert"); + int32_t ret = parser->GetUint32(directionNode, "direction", &index, 0); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "direction"); + if (num <= 0 || num > MAX_SENSOR_INDEX_NUM) { + if (index < 0 || index > num / AXIS_INDEX_MAX) { + return HDF_FAILURE; + } + } + + buf = (uint32_t *)OsalMemCalloc(sizeof(uint32_t) * num); + CHECK_NULL_PTR_RETURN_VALUE(buf, HDF_ERR_MALLOC_FAIL); + + ret = parser->GetUint32Array(directionNode, "convert", buf, num, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: parser %s convert failed", __func__, "convert"); + OsalMemFree(buf); + return HDF_FAILURE; + } + + config->direction = (struct SensorDirection*)OsalMemCalloc(sizeof(struct SensorDirection)); + CHECK_NULL_PTR_RETURN_VALUE(config->direction, HDF_ERR_MALLOC_FAIL); + + + index = index * AXIS_INDEX_MAX; + config->direction->sign[AXIS_X] = buf[index + SIGN_X_INDEX]; + config->direction->sign[AXIS_Y] = buf[index + SIGN_Y_INDEX]; + config->direction->sign[AXIS_Z] = buf[index + SIGN_Z_INDEX]; + config->direction->map[AXIS_X] = buf[index + AXIS_X_INDEX]; + config->direction->map[AXIS_Y] = buf[index + AXIS_Y_INDEX]; + config->direction->map[AXIS_Z] = buf[index + AXIS_Z_INDEX]; + + OsalMemFree(buf); + return HDF_SUCCESS; +} + +int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *remapData, uint32_t num) +{ + int32_t ret; + int32_t axis; + int32_t directionSign[MAX_SENSOR_AXIS_NUM]; + int32_t newData[MAX_SENSOR_AXIS_NUM]; + + CHECK_NULL_PTR_RETURN_VALUE(ret, direction); + + for (axis = 0; axis < num; axis++) { + if (direction->sign[axis] == 0) { + directionSign[axis] = 1; + } else { + directionSign[axis] = -1; + } + HDF_LOGE("%s: sign[%d] = %d", __func__, axis, directionSign[axis]); + } + + newData[direction->map[AXIS_X]] = directionSign[AXIS_X] * remapData[AXIS_X]; + newData[direction->map[AXIS_Y]] = directionSign[AXIS_Y] * remapData[AXIS_Y]; + newData[direction->map[AXIS_Z]] = directionSign[AXIS_Z] * remapData[AXIS_Z]; + + remapData[AXIS_X] = newData[direction->map[AXIS_X]]; + remapData[AXIS_Y] = newData[direction->map[AXIS_Y]]; + remapData[AXIS_Z] = newData[direction->map[AXIS_Z]]; + + return HDF_SUCCESS; +} + int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct SensorCfgData *config) { int32_t ret; diff --git a/model/sensor/driver/gyro/sensor_gyro_driver.c b/model/sensor/driver/gyro/sensor_gyro_driver.c index afe06db52..ae9f2f098 100644 --- a/model/sensor/driver/gyro/sensor_gyro_driver.c +++ b/model/sensor/driver/gyro/sensor_gyro_driver.c @@ -246,6 +246,11 @@ static int32_t InitGyroAfterDetected(struct SensorCfgData *config) return HDF_FAILURE; } + if (ParseSensorDirection(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse gyro direction failed", __func__); + return HDF_FAILURE; + } + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); @@ -309,10 +314,12 @@ void GyroReleaseCfgData(struct SensorCfgData *gyroCfg) (void)DeleteSensorDevice(&gyroCfg->sensorInfo); ReleaseSensorAllRegConfig(gyroCfg); (void)ReleaseSensorBusHandle(&gyroCfg->busCfg); + ReleaseSensorDirectionConfig(gyroCfg); gyroCfg->root = NULL; (void)memset_s(&gyroCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&gyroCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&gyroCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&gyroCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index 441f038d3..27c8cf316 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -248,6 +248,11 @@ static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) return HDF_FAILURE; } + if (ParseSensorDirection(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse magnetic direction failed", __func__); + return HDF_FAILURE; + } + if (ParseSensorRegConfig(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); @@ -318,10 +323,12 @@ void MagneticReleaseCfgData(struct SensorCfgData *magneticCfg) (void)DeleteSensorDevice(&magneticCfg->sensorInfo); ReleaseSensorAllRegConfig(magneticCfg); (void)ReleaseSensorBusHandle(&magneticCfg->busCfg); + ReleaseSensorDirectionConfig(magneticCfg); magneticCfg->root = NULL; (void)memset_s(&magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); + (void)memset_s(&magneticCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } -- Gitee From ff1d4baf53f349051ebe293f6c40d49565a9d4da Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Sat, 27 Nov 2021 18:56:20 +0800 Subject: [PATCH 205/272] direction Signed-off-by: sunxuejiao --- .../sensor/driver/accel/sensor_accel_driver.c | 3 ++- .../driver/common/src/sensor_config_parser.c | 27 +++++++++++-------- model/sensor/driver/gyro/sensor_gyro_driver.c | 3 ++- .../driver/magnetic/sensor_magnetic_driver.c | 3 ++- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/model/sensor/driver/accel/sensor_accel_driver.c b/model/sensor/driver/accel/sensor_accel_driver.c index 5e46d44eb..dc3d39073 100644 --- a/model/sensor/driver/accel/sensor_accel_driver.c +++ b/model/sensor/driver/accel/sensor_accel_driver.c @@ -248,6 +248,8 @@ static int32_t InitAccelAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse accel direction failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -319,7 +321,6 @@ void AccelReleaseCfgData(struct SensorCfgData *accelCfg) accelCfg->root = NULL; (void)memset_s(&accelCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&accelCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&accelCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&accelCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index ed7549afd..55e388c7f 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -384,14 +384,18 @@ static int32_t ParseSensorAttr(struct DeviceResourceIface *parser, const struct void ReleaseSensorDirectionConfig(struct SensorCfgData *config) { - if (config->direction != NULL) { - OsalMemFree(config->direction); - config->direction = NULL; + if (config == NULL) { + if (config->direction != NULL) { + OsalMemFree(config->direction); + config->direction = NULL; + } } } int32_t ParseSensorDirection(struct SensorCfgData *config) { + int32_t num; + int32_t ret; uint32_t index; uint32_t *buf = NULL; const struct DeviceResourceNode *directionNode = NULL; @@ -404,13 +408,11 @@ int32_t ParseSensorDirection(struct SensorCfgData *config) directionNode = parser->GetChildNode(config->root, "sensorDirection"); CHECK_NULL_PTR_RETURN_VALUE(directionNode, HDF_ERR_INVALID_PARAM); - int32_t num = parser->GetElemNum(directionNode, "convert"); - int32_t ret = parser->GetUint32(directionNode, "direction", &index, 0); + num = parser->GetElemNum(directionNode, "convert"); + ret = parser->GetUint32(directionNode, "direction", &index, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "direction"); - if (num <= 0 || num > MAX_SENSOR_INDEX_NUM) { - if (index < 0 || index > num / AXIS_INDEX_MAX) { - return HDF_FAILURE; - } + if (num <= 0 || num > MAX_SENSOR_INDEX_NUM || index < 0 || index > num / AXIS_INDEX_MAX) { + return HDF_FAILURE; } buf = (uint32_t *)OsalMemCalloc(sizeof(uint32_t) * num); @@ -424,8 +426,11 @@ int32_t ParseSensorDirection(struct SensorCfgData *config) } config->direction = (struct SensorDirection*)OsalMemCalloc(sizeof(struct SensorDirection)); - CHECK_NULL_PTR_RETURN_VALUE(config->direction, HDF_ERR_MALLOC_FAIL); - + if (config->direction == NULL) { + HDF_LOGE("%s: malloc sensor direction config item failed", __func__); + OsalMemFree(buf); + return HDF_ERR_MALLOC_FAIL; + } index = index * AXIS_INDEX_MAX; config->direction->sign[AXIS_X] = buf[index + SIGN_X_INDEX]; diff --git a/model/sensor/driver/gyro/sensor_gyro_driver.c b/model/sensor/driver/gyro/sensor_gyro_driver.c index ae9f2f098..5e7a23892 100644 --- a/model/sensor/driver/gyro/sensor_gyro_driver.c +++ b/model/sensor/driver/gyro/sensor_gyro_driver.c @@ -248,6 +248,8 @@ static int32_t InitGyroAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse gyro direction failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -319,7 +321,6 @@ void GyroReleaseCfgData(struct SensorCfgData *gyroCfg) gyroCfg->root = NULL; (void)memset_s(&gyroCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&gyroCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&gyroCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&gyroCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index 27c8cf316..be678d3ed 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -250,6 +250,8 @@ static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse magnetic direction failed", __func__); + (void)DeleteSensorDevice(&config->sensorInfo); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -328,7 +330,6 @@ void MagneticReleaseCfgData(struct SensorCfgData *magneticCfg) magneticCfg->root = NULL; (void)memset_s(&magneticCfg->sensorInfo, sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo)); (void)memset_s(&magneticCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg)); - (void)memset_s(&magneticCfg->direction, sizeof(struct SensorDirection), 0, sizeof(struct SensorDirection)); (void)memset_s(&magneticCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr)); } -- Gitee From 155751d0269e1f8489020ac1b65f4c1a4caf4193 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Sat, 27 Nov 2021 20:44:49 +0800 Subject: [PATCH 206/272] direction Signed-off-by: sunxuejiao --- model/sensor/driver/common/src/sensor_config_parser.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 55e388c7f..eade7377e 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -446,12 +446,11 @@ int32_t ParseSensorDirection(struct SensorCfgData *config) int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *remapData, uint32_t num) { - int32_t ret; int32_t axis; int32_t directionSign[MAX_SENSOR_AXIS_NUM]; int32_t newData[MAX_SENSOR_AXIS_NUM]; - CHECK_NULL_PTR_RETURN_VALUE(ret, direction); + CHECK_NULL_PTR_RETURN_VALUE(direction, HDF_ERR_INVALID_PARAM); for (axis = 0; axis < num; axis++) { if (direction->sign[axis] == 0) { -- Gitee From 680b9213447f0c660e3c2ecbc108c10155cd66e8 Mon Sep 17 00:00:00 2001 From: zhang Date: Mon, 29 Nov 2021 11:19:36 +0800 Subject: [PATCH 207/272] modify reviewbot Signed-off-by: zhang --- .../hcs_parser/unittest/hcs_macro_cases.c | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c index 5231aa42a..d388cbaaa 100755 --- a/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c +++ b/test/unittest/utils/hcs_parser/unittest/hcs_macro_cases.c @@ -6,9 +6,9 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_macro_test.h" #include "hdf_log.h" #include "hcs_macro.h" +#include "hdf_macro_test.h" #define HDF_LOG_TAG hcs_macro_cases @@ -37,46 +37,46 @@ } #define CHECK_INT_EQU(part1, part2) \ - if (part1 != part2) { \ + if ((part1) != (part2)) { \ HDF_LOGE("%d\n", __LINE__); \ return HDF_FAILURE; \ } -#define fp_child_deal(node) \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].child.status); +#define FP_CHILD_DEAL(node) \ + CHECK_STRING_EQU(HCS_PROP(node, status), g_fpData[index].child.status); -#define fp_deal(node) \ +#define FP_DEAL(node) \ do { \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpData[index].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpData[index].chip); \ - node##_foreach_child(fp_child_deal); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpData[index].status); \ + CHECK_STRING_EQU(HCS_PROP(node, product), g_fpData[index].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), g_fpData[index].chip); \ + node##_foreach_child(FP_CHILD_DEAL); \ + CHECK_STRING_EQU(HCS_PROP(node, status), g_fpData[index].status); \ index++; \ } while (0); -#define fp_deal_(node) fp_deal(node) +#define FP_DEAL_(node) FP_DEAL(node) -#define fp_child_deal_vargs(node, fpArgs, idx) \ +#define FP_CHILD_DEAL_VARGS(node, fpArgs, idx) \ CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].child.status); -#define fp_deal_vargs(node, fpArgs, idx) \ +#define FP_DEAL_VARGS(node, fpArgs, idx) \ do { \ - CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[idx].product); \ - CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[idx].chip); \ - node##_foreach_child_vargs(fp_child_deal_vargs, fpArgs, idx); \ - CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[idx].status); \ - idx++; \ + CHECK_STRING_EQU(HCS_PROP(node, product), fpArgs[(idx)].product); \ + CHECK_STRING_EQU(HCS_PROP(node, chip), fpArgs[(idx)].chip); \ + node##_foreach_child_vargs(FP_CHILD_DEAL_VARGS, fpArgs, idx); \ + CHECK_STRING_EQU(HCS_PROP(node, status), fpArgs[(idx)].status); \ + (idx)++; \ } while (0); -#define fp_deal_vargs_(node, fpArgs, idx) fp_deal_vargs(node, fpArgs, idx) +#define FP_DEAL_VARGS_(node, fpArgs, idx) FP_DEAL_VARGS(node, fpArgs, idx) -struct oneChild { +struct OneChild { const char *status; }; -struct fingerprint { +struct FingerPrint { const char *product; const char *chip; - struct oneChild child; + struct OneChild child; const char *status; }; @@ -88,7 +88,7 @@ struct fingerprint { #define FP_INFO_THREE_NODE HCS_NODE(HCS_ROOT, fingerprint_three) #define FP_INFO_AUDIO_NODE HCS_NODE(FP_INFO_NODE, audio_info) -static struct fingerprint fpData[] = { +static struct FingerPrint g_fpData[] = { { "test", "one", { "ok" }, "ok" }, { "test", "two", { "ok" }, "disable" }, { "test", "three", { "ok" }, "disable" } @@ -202,7 +202,7 @@ static int TraversalAudio(void) static int TraversalFPFingerInfo(void) { int index = FP_ONE_IDX; - fp_deal_(HCS_NODE(FP_INFO_NODE, finger_info)); + FP_DEAL_(HCS_NODE(FP_INFO_NODE, finger_info)); return HDF_SUCCESS; } @@ -225,27 +225,27 @@ static int TraversalFPAudio(void) static int TraversalFPOne(void) { int index = FP_ONE_IDX; - fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_one)); + FP_DEAL_(HCS_NODE(FP_INFO_NODE, fingerprint_one)); index = FP_ONE_IDX; - fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_one), fpData, index); + FP_DEAL_VARGS_(HCS_NODE(FP_INFO_NODE, fingerprint_one), g_fpData, index); return HDF_SUCCESS; } static int TraversalFPTwo(void) { int index = FP_TWO_IDX; - fp_deal_(HCS_NODE(FP_INFO_NODE, fingerprint_two)); + FP_DEAL_(HCS_NODE(FP_INFO_NODE, fingerprint_two)); index = FP_TWO_IDX; - fp_deal_vargs_(HCS_NODE(FP_INFO_NODE, fingerprint_two), fpData, index); + FP_DEAL_VARGS_(HCS_NODE(FP_INFO_NODE, fingerprint_two), g_fpData, index); return HDF_SUCCESS; } static int TraversalPringerprintThree(void) { int index = FP_THREE_IDX; - fp_deal_(HCS_NODE(HCS_ROOT, fingerprint_three)); + FP_DEAL_(HCS_NODE(HCS_ROOT, fingerprint_three)); index = FP_THREE_IDX; - fp_deal_vargs_(HCS_NODE(HCS_ROOT, fingerprint_three), fpData, index); + FP_DEAL_VARGS_(HCS_NODE(HCS_ROOT, fingerprint_three), g_fpData, index); return HDF_SUCCESS; } @@ -371,7 +371,7 @@ int HcsMacroTraversalOneNodeChild(void) { int index = 0; - HCS_FOREACH_CHILD(FP_INFO_NODE, fp_deal); + HCS_FOREACH_CHILD(FP_INFO_NODE, FP_DEAL); return HDF_SUCCESS; } @@ -379,7 +379,7 @@ int HcsMacroTraversalOneNodeChildVargs(void) { int index = 0; - HCS_FOREACH_CHILD_VARGS(FP_INFO_NODE, fp_deal_vargs, fpData, index); + HCS_FOREACH_CHILD_VARGS(FP_INFO_NODE, FP_DEAL_VARGS, g_fpData, index); return HDF_SUCCESS; } -- Gitee From 1a5e9151ccf5a2316dca080bccbcc16341f81cf7 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Mon, 29 Nov 2021 15:11:07 +0800 Subject: [PATCH 208/272] direction Signed-off-by: sunxuejiao --- model/sensor/driver/accel/sensor_accel_driver.c | 2 +- .../driver/common/src/sensor_config_parser.c | 14 ++++++++------ model/sensor/driver/gyro/sensor_gyro_driver.c | 2 +- .../driver/magnetic/sensor_magnetic_driver.c | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/model/sensor/driver/accel/sensor_accel_driver.c b/model/sensor/driver/accel/sensor_accel_driver.c index dc3d39073..f967792d7 100644 --- a/model/sensor/driver/accel/sensor_accel_driver.c +++ b/model/sensor/driver/accel/sensor_accel_driver.c @@ -249,7 +249,6 @@ static int32_t InitAccelAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse accel direction failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -257,6 +256,7 @@ static int32_t InitAccelAfterDetected(struct SensorCfgData *config) HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); ReleaseSensorAllRegConfig(config); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } return HDF_SUCCESS; diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index eade7377e..484cc684f 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -384,11 +384,14 @@ static int32_t ParseSensorAttr(struct DeviceResourceIface *parser, const struct void ReleaseSensorDirectionConfig(struct SensorCfgData *config) { - if (config == NULL) { - if (config->direction != NULL) { - OsalMemFree(config->direction); - config->direction = NULL; - } + if (config == NULL || config->direction == NULL) { + HDF_LOGE("%s:sensor direction is null", __func__); + return; + } + + if (config->direction != NULL) { + OsalMemFree(config->direction); + config->direction = NULL; } } @@ -458,7 +461,6 @@ int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *rem } else { directionSign[axis] = -1; } - HDF_LOGE("%s: sign[%d] = %d", __func__, axis, directionSign[axis]); } newData[direction->map[AXIS_X]] = directionSign[AXIS_X] * remapData[AXIS_X]; diff --git a/model/sensor/driver/gyro/sensor_gyro_driver.c b/model/sensor/driver/gyro/sensor_gyro_driver.c index 5e7a23892..fe3236f97 100644 --- a/model/sensor/driver/gyro/sensor_gyro_driver.c +++ b/model/sensor/driver/gyro/sensor_gyro_driver.c @@ -249,7 +249,6 @@ static int32_t InitGyroAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse gyro direction failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -257,6 +256,7 @@ static int32_t InitGyroAfterDetected(struct SensorCfgData *config) HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); ReleaseSensorAllRegConfig(config); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } return HDF_SUCCESS; diff --git a/model/sensor/driver/magnetic/sensor_magnetic_driver.c b/model/sensor/driver/magnetic/sensor_magnetic_driver.c index be678d3ed..eb831ad11 100755 --- a/model/sensor/driver/magnetic/sensor_magnetic_driver.c +++ b/model/sensor/driver/magnetic/sensor_magnetic_driver.c @@ -251,7 +251,6 @@ static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) if (ParseSensorDirection(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse magnetic direction failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } @@ -259,6 +258,7 @@ static int32_t InitMagneticAfterDetected(struct SensorCfgData *config) HDF_LOGE("%s: Parse sensor register failed", __func__); (void)DeleteSensorDevice(&config->sensorInfo); ReleaseSensorAllRegConfig(config); + ReleaseSensorDirectionConfig(config); return HDF_FAILURE; } -- Gitee From f00ccb797f7b014db972de9f36e07c7b5fac5120 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Mon, 29 Nov 2021 15:15:19 +0800 Subject: [PATCH 209/272] direction Signed-off-by: sunxuejiao --- model/sensor/driver/common/src/sensor_config_parser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 484cc684f..c5442e2df 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -414,7 +414,7 @@ int32_t ParseSensorDirection(struct SensorCfgData *config) num = parser->GetElemNum(directionNode, "convert"); ret = parser->GetUint32(directionNode, "direction", &index, 0); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "direction"); - if (num <= 0 || num > MAX_SENSOR_INDEX_NUM || index < 0 || index > num / AXIS_INDEX_MAX) { + if ((num <= 0 || num > MAX_SENSOR_INDEX_NUM) || (index < 0 || index > num / AXIS_INDEX_MAX)) { return HDF_FAILURE; } -- Gitee From 1469c956a10aa688bf12889cbe7cd11e82026688 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Mon, 29 Nov 2021 15:21:55 +0800 Subject: [PATCH 210/272] direction Signed-off-by: sunxuejiao --- model/sensor/driver/common/src/sensor_config_parser.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index c5442e2df..ceef24099 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -384,8 +384,8 @@ static int32_t ParseSensorAttr(struct DeviceResourceIface *parser, const struct void ReleaseSensorDirectionConfig(struct SensorCfgData *config) { - if (config == NULL || config->direction == NULL) { - HDF_LOGE("%s:sensor direction is null", __func__); + if (config == NULL) { + HDF_LOGE("%s:sensor sensorcfgData is null", __func__); return; } -- Gitee From db5dc812c4026497f9d66ffb49dd0c53ede71cc9 Mon Sep 17 00:00:00 2001 From: sunxuejiao Date: Mon, 29 Nov 2021 15:23:59 +0800 Subject: [PATCH 211/272] direction Signed-off-by: sunxuejiao --- model/sensor/driver/common/src/sensor_config_parser.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index ceef24099..051aba20d 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -384,10 +384,7 @@ static int32_t ParseSensorAttr(struct DeviceResourceIface *parser, const struct void ReleaseSensorDirectionConfig(struct SensorCfgData *config) { - if (config == NULL) { - HDF_LOGE("%s:sensor sensorcfgData is null", __func__); - return; - } + CHECK_NULL_PTR_RETURN(config); if (config->direction != NULL) { OsalMemFree(config->direction); -- Gitee From ad34e5ab9f46c42ddf12a83af26cb4653430762c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 29 Nov 2021 09:42:22 +0000 Subject: [PATCH 212/272] Description:ut failed about hdf_single_node_message_test Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- .../wifi/unittest/message/hdf_single_node_message_test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c b/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c index d79338f91..92c875e9d 100644 --- a/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c +++ b/test/unittest/model/network/wifi/unittest/message/hdf_single_node_message_test.c @@ -16,7 +16,7 @@ const uint32_t SEND_MESSAGE_COUNT = 40000; const uint32_t SYNC_MESSAGE_TIMEOUT = 2; -const uint32_t ASYNC_MESSAGE_TIMEOUT = 5; +const uint32_t ASYNC_MESSAGE_TIMEOUT = 8; #define COMMON_SEM_TIMEOUT 300 enum ServiceList { -- Gitee From 9a5b8ae75d87fb52767b37d6c8a48f09c216dbdf Mon Sep 17 00:00:00 2001 From: yuanbo Date: Sat, 20 Nov 2021 18:38:13 +0800 Subject: [PATCH 213/272] support dynamic register device Signed-off-by: yuanbo --- core/common/src/buildin_config_entry.c | 14 + core/common/src/devmgr_service_start.c | 25 +- core/common/src/hdf_attribute.c | 246 ++++-------------- core/host/include/devsvc_manager_clnt.h | 2 - core/host/include/hdf_device.h | 1 + core/host/include/hdf_device_node.h | 6 +- core/host/include/hdf_device_object.h | 7 + core/host/src/devhost_service.c | 44 ++-- core/host/src/devmgr_service_clnt.c | 1 + core/host/src/devsvc_manager_clnt.c | 24 -- core/host/src/hdf_device.c | 21 +- core/host/src/hdf_device_node.c | 95 ++++--- core/host/src/hdf_device_object.c | 130 ++++++++- core/manager/include/devhost_service_clnt.h | 3 +- core/manager/include/devmgr_service.h | 2 - core/manager/include/devsvc_manager.h | 1 + core/manager/src/devhost_service_clnt.c | 16 +- core/manager/src/devmgr_service.c | 212 +++++++++------ core/manager/src/devsvc_manager.c | 37 ++- core/manager/src/hdf_driver_installer.c | 1 + .../unittest/common/hdf_lite_manager_test.cpp | 31 ++- core/shared/include/devmgr_service_if.h | 2 + core/shared/include/hdf_attribute_manager.h | 7 +- core/shared/include/hdf_device_info.h | 1 - core/shared/src/hdf_device_info.c | 9 +- model/input/driver/hdf_input_device_manager.c | 43 +-- model/usb/include/usb_ddk_pnp_loader.h | 2 +- model/usb/include/usb_pnp_manager.h | 34 +++ model/usb/src/usb_ddk_pnp_loader.c | 123 +++++++-- test/unittest/manager/sample_driver_test.c | 94 ++++++- utils/src/hcs_parser/hcs_buildin_parser.c | 56 ++++ .../test/unittest/common/hdf_config_test.cpp | 1 + utils/src/hdf_slist.c | 4 +- 33 files changed, 812 insertions(+), 483 deletions(-) create mode 100644 core/common/src/buildin_config_entry.c mode change 100755 => 100644 core/shared/include/hdf_device_info.h mode change 100755 => 100644 core/shared/src/hdf_device_info.c mode change 100755 => 100644 model/usb/include/usb_ddk_pnp_loader.h create mode 100644 model/usb/include/usb_pnp_manager.h mode change 100755 => 100644 model/usb/src/usb_ddk_pnp_loader.c create mode 100644 utils/src/hcs_parser/hcs_buildin_parser.c diff --git a/core/common/src/buildin_config_entry.c b/core/common/src/buildin_config_entry.c new file mode 100644 index 000000000..cbf8ca2e9 --- /dev/null +++ b/core/common/src/buildin_config_entry.c @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hcs_tree_if.h" + +const struct DeviceResourceNode *HdfGetHcsRootNode(void) +{ + return HcsGetRootNode(); +} \ No newline at end of file diff --git a/core/common/src/devmgr_service_start.c b/core/common/src/devmgr_service_start.c index a1ceba2ee..7c40d8a6a 100644 --- a/core/common/src/devmgr_service_start.c +++ b/core/common/src/devmgr_service_start.c @@ -9,6 +9,7 @@ #include "devmgr_service_start.h" #include "devhost_service_clnt.h" #include "devmgr_service.h" +#include "devsvc_manager.h" #include "devsvc_manager_clnt.h" #include "hdf_base.h" #include "hdf_device_node.h" @@ -20,30 +21,14 @@ static int g_isQuickLoad = DEV_MGR_SLOW_LOAD; -static void GetDeviceServiceNameByClass(DeviceClass deviceClass, struct HdfSBuf *reply) +static void GetDeviceServiceNameByClass(struct HdfSBuf *reply, DeviceClass deviceClass) { - struct HdfSListIterator itDeviceInfo; - struct HdfDeviceInfo *deviceInfo = NULL; - struct DevHostServiceClnt *hostClnt = NULL; - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); - if (devMgrSvc == NULL || reply == NULL) { + if (reply == NULL) { return; } HdfSbufFlush(reply); - DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { - HdfSListIteratorInit(&itDeviceInfo, hostClnt->deviceInfos); - while (HdfSListIteratorHasNext(&itDeviceInfo)) { - deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); - if (deviceInfo->policy == SERVICE_POLICY_CAPACITY) { - struct HdfDeviceObject *deviceObject = DevSvcManagerClntGetDeviceObject(deviceInfo->svcName); - if (deviceObject == NULL || (deviceObject->deviceClass != deviceClass)) { - continue; - } - HdfSbufWriteString(reply, deviceInfo->svcName); - } - } - } + DevSvcManagerListService(reply, deviceClass); HdfSbufWriteString(reply, NULL); } @@ -84,7 +69,7 @@ int DeviceManagerDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data HDF_LOGE("%s: failed to get deviceClass", __func__); break; } - GetDeviceServiceNameByClass(deviceClass, reply); + GetDeviceServiceNameByClass(reply, deviceClass); ret = HDF_SUCCESS; break; default: diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index ac3849bd6..4e942033d 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -32,37 +32,7 @@ #define ATTR_DEV_MATCHATTR "deviceMatchAttr" #define MANAGER_NODE_MATCH_ATTR "hdf_manager" -static struct DeviceResourceNode *g_hcsTreeRoot = NULL; - -void HdfGetBuildInConfigData(const unsigned char **data, unsigned int *size); - -static bool CreateHcsToTree(void) -{ - uint32_t length; - const unsigned char *hcsBlob = NULL; - HdfGetBuildInConfigData(&hcsBlob, &length); - if (!HcsCheckBlobFormat((const char *)hcsBlob, length)) { - return false; - } - if (!HcsDecompile((const char *)hcsBlob, HBC_HEADER_LENGTH, &g_hcsTreeRoot)) { - return false; - } - return true; -} - -const struct DeviceResourceNode *HcsGetRootNode(void) -{ - if ((g_hcsTreeRoot == NULL) && !CreateHcsToTree()) { - HDF_LOGE("%s: failed", __func__); - return NULL; - } - return g_hcsTreeRoot; -} - -const struct DeviceResourceNode *HdfGetRootNode(void) -{ - return HcsGetRootNode(); -} +#define DEFATLT_DEV_PRIORITY 100 static bool HdfHostListCompare(struct HdfSListNode *listEntryFirst, struct HdfSListNode *listEntrySecond) { @@ -107,14 +77,14 @@ bool HdfAttributeManagerGetHostList(struct HdfSList *hostList) return false; } - hdfManagerNode = GetHdfManagerNode(HcsGetRootNode()); + hdfManagerNode = GetHdfManagerNode(HdfGetHcsRootNode()); if (hdfManagerNode == NULL) { HDF_LOGE("%s: get hdf manager node is null", __func__); return false; } hostNode = hdfManagerNode->child; - while (hostNode != NULL) { + for (; hostNode != NULL; hostNode = hostNode->sibling) { struct HdfHostInfo *hostInfo = HdfHostInfoNewInstance(); if (hostInfo == NULL) { HdfSListFlush(hostList, HdfHostInfoDelete); @@ -123,17 +93,14 @@ bool HdfAttributeManagerGetHostList(struct HdfSList *hostList) } if (!GetHostInfo(hostNode, hostInfo)) { HdfHostInfoFreeInstance(hostInfo); - hostNode = hostNode->sibling; continue; } hostInfo->hostId = hostId; if (!HdfSListAddOrder(hostList, &hostInfo->node, HdfHostListCompare)) { HdfHostInfoFreeInstance(hostInfo); - hostNode = hostNode->sibling; continue; } hostId++; - hostNode = hostNode->sibling; } return true; } @@ -158,7 +125,7 @@ static const struct DeviceResourceNode *GetHostNode(const char *inHostName) if (inHostName == NULL) { return NULL; } - hdfManagerNode = GetHdfManagerNode(HcsGetRootNode()); + hdfManagerNode = GetHdfManagerNode(HdfGetHcsRootNode()); if (hdfManagerNode == NULL) { return NULL; } @@ -178,7 +145,7 @@ static const struct DeviceResourceNode *GetHostNode(const char *inHostName) static bool CheckDeviceInfo(const struct HdfDeviceInfo *deviceNodeInfo) { - if (deviceNodeInfo->policy > SERVICE_POLICY_PRIVATE) { + if (deviceNodeInfo->policy >= SERVICE_POLICY_INVALID) { HDF_LOGE("%s: policy %u is invalid", __func__, deviceNodeInfo->policy); return false; } @@ -188,7 +155,7 @@ static bool CheckDeviceInfo(const struct HdfDeviceInfo *deviceNodeInfo) return false; } - if (deviceNodeInfo->preload > DEVICE_PRELOAD_DISABLE) { + if (deviceNodeInfo->preload >= DEVICE_PRELOAD_INVALID) { HDF_LOGE("%s: preload %u is invalid", __func__, deviceNodeInfo->preload); return false; } @@ -198,187 +165,82 @@ static bool CheckDeviceInfo(const struct HdfDeviceInfo *deviceNodeInfo) static bool GetDeviceNodeInfo(const struct DeviceResourceNode *deviceNode, struct HdfDeviceInfo *deviceNodeInfo) { - uint16_t readNum = 0; - const char *readString = NULL; - if (HcsGetUint16(deviceNode, ATTR_DEV_POLICY, &readNum, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: failed to get policy", __func__); - return false; - } - deviceNodeInfo->policy = readNum; + HcsGetUint16(deviceNode, ATTR_DEV_POLICY, &deviceNodeInfo->policy, 0); + HcsGetUint16(deviceNode, ATTR_DEV_PRIORITY, &deviceNodeInfo->priority, DEFATLT_DEV_PRIORITY); + HcsGetUint16(deviceNode, ATTR_DEV_PRELOAD, &deviceNodeInfo->preload, 0); + HcsGetUint16(deviceNode, ATTR_DEV_PERMISSION, &deviceNodeInfo->permission, 0); + HcsGetString(deviceNode, ATTR_DEV_MATCHATTR, &deviceNodeInfo->deviceMatchAttr, NULL); - if (HcsGetUint16(deviceNode, ATTR_DEV_PRIORITY, &readNum, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: failed to get priority", __func__); - return false; - } - deviceNodeInfo->priority = readNum; - - if (HcsGetUint16(deviceNode, ATTR_DEV_PRELOAD, &readNum, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: failed to get preload", __func__); - return false; - } - deviceNodeInfo->preload = readNum; - - if (HcsGetUint16(deviceNode, ATTR_DEV_PERMISSION, &readNum, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: failed to get permission", __func__); - return false; - } - deviceNodeInfo->permission = readNum; - - if (HcsGetString(deviceNode, ATTR_DEV_MODULENAME, &readString, NULL) != HDF_SUCCESS) { + if (HcsGetString(deviceNode, ATTR_DEV_MODULENAME, &deviceNodeInfo->moduleName, NULL) != HDF_SUCCESS) { HDF_LOGE("%s: failed to get module name", __func__); return false; } - deviceNodeInfo->moduleName = readString; - if (HcsGetString(deviceNode, ATTR_DEV_SVCNAME, &readString, NULL) != HDF_SUCCESS) { + if (HcsGetString(deviceNode, ATTR_DEV_SVCNAME, &deviceNodeInfo->svcName, NULL) != HDF_SUCCESS) { HDF_LOGE("%s: failed to get service name", __func__); return false; } - deviceNodeInfo->svcName = readString; - if (HcsGetString(deviceNode, ATTR_DEV_MATCHATTR, &readString, NULL) != HDF_SUCCESS) { - HDF_LOGE("%s: failed to get matchattr name", __func__); - return false; - } - deviceNodeInfo->deviceMatchAttr = readString; return CheckDeviceInfo(deviceNodeInfo); } -struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *hostName) +static bool GetDevcieNodeList(const struct DeviceResourceNode *device, + struct DevHostServiceClnt *hostClnt, uint16_t deviceIdx) { - uint16_t deviceIdx = 0; uint8_t deviceNnodeIdx = 0; + uint16_t hostId = hostClnt->hostId; struct HdfDeviceInfo *deviceNodeInfo = NULL; - const struct DeviceResourceNode *hostNode = GetHostNode(hostName); - struct HdfSList *deviceList = NULL; - const struct DeviceResourceNode *device = NULL; - if (hostNode == NULL) { - return NULL; - } - deviceList = (struct HdfSList *)OsalMemCalloc(sizeof(struct HdfSList)); - if (deviceList == NULL) { - return NULL; - } - device = hostNode->child; - while (device != NULL) { - const struct DeviceResourceNode *deviceNode = device->child; - while (deviceNode != NULL) { - deviceNnodeIdx = 0; - deviceNodeInfo = HdfDeviceInfoNewInstance(); - if (deviceNodeInfo == NULL) { - HdfSListFlush(deviceList, HdfDeviceInfoDelete); - OsalMemFree(deviceList); - return NULL; - } - deviceNodeInfo->hostId = hostId; - if (!GetDeviceNodeInfo(deviceNode, deviceNodeInfo)) { - HdfDeviceInfoFreeInstance(deviceNodeInfo); - HDF_LOGE("%s: failed to get device", __func__); - deviceNodeInfo = NULL; - deviceNode = deviceNode->sibling; - continue; - } - if (!HdfSListAddOrder(deviceList, &deviceNodeInfo->node, HdfDeviceListCompare)) { - HDF_LOGE("%s: failed to add device %s", __func__, deviceNodeInfo->svcName); + const struct DeviceResourceNode *devNodeResource = device->child; + + for (; devNodeResource != NULL; devNodeResource = devNodeResource->sibling) { + deviceNodeInfo = HdfDeviceInfoNewInstance(); + if (deviceNodeInfo == NULL) { + return false; + } + if (!GetDeviceNodeInfo(devNodeResource, deviceNodeInfo)) { + HdfDeviceInfoFreeInstance(deviceNodeInfo); + HDF_LOGE("%s: failed to parse device node info, ignore", __func__); + continue; + } + + deviceNodeInfo->hostId = hostId; + deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNnodeIdx); + if (deviceNodeInfo->preload != DEVICE_PRELOAD_DISABLE) { + if (!HdfSListAddOrder(&hostClnt->unloadDevInfos, &deviceNodeInfo->node, HdfDeviceListCompare)) { + HDF_LOGE("%s: failed to add device info to list %s", __func__, deviceNodeInfo->svcName); HdfDeviceInfoFreeInstance(deviceNodeInfo); - deviceNodeInfo = NULL; - deviceNode = deviceNode->sibling; continue; } - deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNnodeIdx); - deviceNnodeIdx++; - deviceNode = deviceNode->sibling; + } else { + HdfSListAdd(&hostClnt->dynamicDevInfos, &deviceNodeInfo->node); } - device = device->sibling; - deviceIdx++; - } - if (HdfSListCount(deviceList) == 0) { - OsalMemFree(deviceList); - return NULL; + + deviceNnodeIdx++; } - return deviceList; + return deviceNnodeIdx > 0; } -bool HdfDeviceListAdd(const char *moduleName, const char *serviceName, const void *privateData) +int HdfAttributeManagerGetDeviceList(struct DevHostServiceClnt *hostClnt) { - struct HdfSListIterator itDeviceInfo; - struct HdfDeviceInfo *deviceInfo = NULL; - struct DevHostServiceClnt *hostClnt = NULL; - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); - struct HdfDeviceInfo *deviceNodeInfo = NULL; - char *svcName = NULL; - if (devMgrSvc == NULL || moduleName == NULL || serviceName == NULL) { - return false; - } + uint16_t deviceIdx = 0; + const struct DeviceResourceNode *hostNode = NULL; + const struct DeviceResourceNode *device = NULL; + int ret = HDF_DEV_ERR_NO_DEVICE; - deviceNodeInfo = HdfDeviceInfoNewInstance(); - if (deviceNodeInfo == NULL) { - return false; - } - DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { - HdfSListIteratorInit(&itDeviceInfo, hostClnt->deviceInfos); - while (HdfSListIteratorHasNext(&itDeviceInfo)) { - deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); - if (deviceInfo->moduleName == NULL) { - continue; - } - if (strcmp(deviceInfo->moduleName, moduleName) == 0) { - deviceInfo->isDynamic = true; - deviceNodeInfo->hostId = deviceInfo->hostId; - deviceNodeInfo->deviceId = hostClnt->devCount; - deviceNodeInfo->policy = deviceInfo->policy; - deviceNodeInfo->priority = deviceInfo->priority; - deviceNodeInfo->preload = DEVICE_PRELOAD_DISABLE; - deviceNodeInfo->permission = deviceInfo->permission; - deviceNodeInfo->deviceMatchAttr = deviceInfo->deviceMatchAttr; - deviceNodeInfo->moduleName = deviceInfo->moduleName; - svcName = OsalMemCalloc(strlen(serviceName) + 1); - if (svcName == NULL) { - break; - } - if (strcpy_s(svcName, strlen(serviceName) + 1, serviceName) != EOK) { - HDF_LOGE("%s: failed to copy string", __func__); - OsalMemFree(svcName); - break; - } - deviceNodeInfo->svcName = svcName; -#ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY - if (!UsbPnpManagerAddPrivateData(deviceNodeInfo, privateData)) { - break; - } -#endif - HdfSListAdd(hostClnt->deviceInfos, &deviceNodeInfo->node); - hostClnt->devCount++; - return true; - } - } + if (hostClnt == NULL) { + return HDF_ERR_INVALID_PARAM; } - HdfDeviceInfoFreeInstance(deviceNodeInfo); - return false; -} -void HdfDeviceListDel(const char *moduleName, const char *serviceName) -{ - struct HdfSListIterator itDeviceInfo; - struct HdfDeviceInfo *deviceInfo = NULL; - struct DevHostServiceClnt *hostClnt = NULL; - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); - if (devMgrSvc == NULL || moduleName == NULL || serviceName == NULL) { - return; + hostNode = GetHostNode(hostClnt->hostName); + if (hostNode == NULL) { + return ret; } - DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { - HdfSListIteratorInit(&itDeviceInfo, hostClnt->deviceInfos); - while (HdfSListIteratorHasNext(&itDeviceInfo)) { - deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); - if ((strcmp(deviceInfo->moduleName, moduleName) == 0) && - (strcmp(deviceInfo->svcName, serviceName) == 0)) { - HdfSListRemove(hostClnt->deviceInfos, &deviceInfo->node); - HdfDeviceInfoFreeInstance(deviceInfo); - hostClnt->devCount--; - return; - } + for(device = hostNode->child; device != NULL; device = device->sibling, deviceIdx++) { + if (!GetDevcieNodeList(device, hostClnt, deviceIdx)) { + return ret; } } -} + return HDF_SUCCESS; +} diff --git a/core/host/include/devsvc_manager_clnt.h b/core/host/include/devsvc_manager_clnt.h index ec7f7bec7..991be8d21 100644 --- a/core/host/include/devsvc_manager_clnt.h +++ b/core/host/include/devsvc_manager_clnt.h @@ -21,7 +21,5 @@ int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *ser void DevSvcManagerClntRemoveService(const char *svcName); int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback); int DevSvcManagerClntUnsubscribeService(const char *svcName); -struct HdfDeviceObject *HdfRegisterDevice(const char *moduleName, const char *serviceName, const void *privateData); -void HdfUnregisterDevice(const char *moduleName, const char *serviceName); #endif /* DEVSVC_MANAGER_CLNT_H */ diff --git a/core/host/include/hdf_device.h b/core/host/include/hdf_device.h index 7048dff5d..5525ed37c 100644 --- a/core/host/include/hdf_device.h +++ b/core/host/include/hdf_device.h @@ -52,6 +52,7 @@ struct HdfDevice { uint16_t deviceId; uint16_t hostId; }; +int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode); void HdfDeviceConstruct(struct HdfDevice *device); void HdfDeviceDestruct(struct HdfDevice *device); struct HdfObject *HdfDeviceCreate(void); diff --git a/core/host/include/hdf_device_node.h b/core/host/include/hdf_device_node.h index 1c203854f..29077b22c 100644 --- a/core/host/include/hdf_device_node.h +++ b/core/host/include/hdf_device_node.h @@ -24,7 +24,7 @@ struct IDeviceNode { int (*PublishService)(struct HdfDeviceNode *devNode); int (*RemoveService)(struct HdfDeviceNode *devNode); int (*LaunchNode)(struct HdfDeviceNode *devNode); - int (*ReleaseNode)(struct HdfDeviceNode *devNode); + void (*UnlaunchNode)(struct HdfDeviceNode *devNode); }; struct HdfDeviceNode { @@ -35,8 +35,9 @@ struct HdfDeviceNode { struct HdfDeviceObject deviceObject; struct IHdfDeviceToken *token; struct HdfDriver *driver; - const struct HdfDevice *device; + struct HdfDevice *device; char *servName; + char *driverName; devid_t devId; uint16_t policy; uint16_t permission; @@ -61,5 +62,6 @@ void HdfDeviceNodeFreeInstance(struct HdfDeviceNode *devNode); void HdfDeviceNodeDelete(struct HdfDeviceNode *devNode); int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode); int HdfDeviceNodeRemoveService(struct HdfDeviceNode *devNode); +int DeviveDriverBind(struct HdfDeviceNode *devNode); #endif /* HDF_DEVICE_NODE_H */ diff --git a/core/host/include/hdf_device_object.h b/core/host/include/hdf_device_object.h index ec194e465..2df158ec3 100644 --- a/core/host/include/hdf_device_object.h +++ b/core/host/include/hdf_device_object.h @@ -12,5 +12,12 @@ #include "hdf_device_desc.h" void HdfDeviceObjectConstruct(struct HdfDeviceObject *deviceObject); +struct HdfDeviceObject *HdfDeviceObjectAlloc(struct HdfDeviceObject *parent, const char *driverName); +void HdfDeviceObjectRelease(struct HdfDeviceObject *deviceObject); +int HdfDeviceObjectRegister(struct HdfDeviceObject *deviceObject); +int HdfDeviceObjectUnRegister(struct HdfDeviceObject *deviceObject); +int HdfDeviceObjectPublishService(struct HdfDeviceObject *deviceObject, + const char *servName, uint8_t policy, uint32_t perm); +int HdfDeviceObjectRemoveService(struct HdfDeviceObject *deviceObject); #endif /* HDF_DEVICE_OBJECT_H */ diff --git a/core/host/src/devhost_service.c b/core/host/src/devhost_service.c index a964cec51..e93edd189 100644 --- a/core/host/src/devhost_service.c +++ b/core/host/src/devhost_service.c @@ -21,15 +21,15 @@ static struct HdfDevice *DevHostServiceFindDevice(struct DevHostService *hostService, uint16_t deviceId) { - struct HdfDevice *deviceNode = NULL; + struct HdfDevice *device = NULL; if (hostService == NULL) { HDF_LOGE("failed to find driver, hostService is null"); return NULL; } - DLIST_FOR_EACH_ENTRY(deviceNode, &hostService->devices, struct HdfDevice, node) { - if (deviceNode->deviceId == deviceId) { - return deviceNode; + DLIST_FOR_EACH_ENTRY(device, &hostService->devices, struct HdfDevice, node) { + if (DEVICEID(device->deviceId) == deviceId) { + return device; } } return NULL; @@ -53,7 +53,7 @@ static struct HdfDevice *DevHostServiceQueryOrAddDevice(struct DevHostService *i return NULL; } device->hostId = inst->hostId; - device->deviceId = deviceId; + device->deviceId = MK_DEVID(inst->hostId, deviceId, 0); DListInsertHead(&device->node, &inst->devices); } return device; @@ -88,8 +88,7 @@ int DevHostServiceAddDevice(struct IDevHostService *inst, const struct HdfDevice devNode = HdfDeviceNodeNewInstance(deviceInfo, driver); if (devNode == NULL) { driverLoader->ReclaimDriver(driver); - ret = HDF_DEV_ERR_NO_MEMORY; - goto error; + return HDF_DEV_ERR_NO_MEMORY; } devNode->hostService = hostService; @@ -103,8 +102,10 @@ int DevHostServiceAddDevice(struct IDevHostService *inst, const struct HdfDevice return HDF_SUCCESS; error: - driverLoader->ReclaimDriver(driver); - DevHostServiceFreeDevice(hostService, device); + if (DListIsEmpty(&device->devNodes)) { + DevHostServiceFreeDevice(hostService, device); + } + return ret; } @@ -113,13 +114,6 @@ int DevHostServiceDelDevice(struct IDevHostService *inst, devid_t devId) struct HdfDevice *device = NULL; struct DevHostService *hostService = (struct DevHostService *)inst; struct HdfDeviceNode *devNode = NULL; - struct HdfDriver *driver = NULL; - struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); - - if (driverLoader == NULL || driverLoader->ReclaimDriver == NULL) { - HDF_LOGE("failed to del device, input param is null"); - return HDF_FAILURE; - } device = DevHostServiceFindDevice(hostService, DEVICEID(devId)); if (device == NULL) { @@ -129,20 +123,20 @@ int DevHostServiceDelDevice(struct IDevHostService *inst, devid_t devId) devNode = device->super.GetDeviceNode(&device->super, devId); if (devNode == NULL) { + HDF_LOGI("failed to del device %u, not exist", devId); return HDF_DEV_ERR_NO_DEVICE; } - driver = devNode->driver; - // device detach will release device node, do not use devNode after this - if (device->super.Detach != NULL) { - if (device->super.Detach(&device->super, devNode) != HDF_SUCCESS) { - HDF_LOGE("failed to del device %x", devId); - return HDF_FAILURE; - } + if (device->super.Detach == NULL) { + HDF_LOGE("failed to del device %u, invalid device", devId); + return HDF_ERR_INVALID_OBJECT; } - // remove driver instance or close driver library - driverLoader->ReclaimDriver(driver); + if (device->super.Detach(&device->super, devNode) != HDF_SUCCESS) { + HDF_LOGE("failed to detach device %u", devId); + return HDF_FAILURE; + } + HdfDeviceNodeFreeInstance(devNode); if (DListIsEmpty(&device->devNodes)) { DevHostServiceFreeDevice(hostService, device); diff --git a/core/host/src/devmgr_service_clnt.c b/core/host/src/devmgr_service_clnt.c index e690010e9..6788fa448 100644 --- a/core/host/src/devmgr_service_clnt.c +++ b/core/host/src/devmgr_service_clnt.c @@ -47,6 +47,7 @@ int DevmgrServiceClntAttachDevice(struct IHdfDeviceToken *deviceToken) } return devMgrSvcIf->AttachDevice(devMgrSvcIf, deviceToken); } + int DevmgrServiceClntDetachDevice(devid_t devid) { struct IDevmgrService *devMgrSvcIf = NULL; diff --git a/core/host/src/devsvc_manager_clnt.c b/core/host/src/devsvc_manager_clnt.c index 04569e5bf..87bc0cff2 100644 --- a/core/host/src/devsvc_manager_clnt.c +++ b/core/host/src/devsvc_manager_clnt.c @@ -67,30 +67,6 @@ struct HdfDeviceObject *DevSvcManagerClntGetDeviceObject(const char *svcName) return serviceManager->GetObject(serviceManager, svcName); } -struct HdfDeviceObject *HdfRegisterDevice(const char *moduleName, const char *serviceName, const void *privateData) -{ - int ret; - if (!HdfDeviceListAdd(moduleName, serviceName, privateData)) { - HDF_LOGE("%s device info add failed!", __func__); - return NULL; - } - ret = DevmgrServiceLoadDevice(serviceName); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s load device %s failed!", __func__, serviceName); - HdfDeviceListDel(moduleName, serviceName); - return NULL; - } - return DevSvcManagerClntGetDeviceObject(serviceName); -} - -void HdfUnregisterDevice(const char *moduleName, const char *serviceName) -{ - if (DevmgrServiceUnLoadDevice(serviceName) != HDF_SUCCESS) { - HDF_LOGE("%s:failed to unload device %s !", __func__, serviceName); - } - HdfDeviceListDel(moduleName, serviceName); -} - int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index ce30c37ce..cce70f4b9 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -28,6 +28,13 @@ static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *dev return HDF_ERR_INVALID_PARAM; } + // for dynamic added device node, assign device id here + if (devNode->devId == 0) { + devNode->devId = MK_DEVID(HOSTID(device->deviceId), DEVICEID(device->deviceId), + DlistGetCount(&device->devNodes)); + devNode->token->devid = devNode->devId; + } + ret = nodeIf->LaunchNode(devNode); if (ret == HDF_SUCCESS) { DListInsertTail(&devNode->entry, &device->devNodes); @@ -36,7 +43,7 @@ static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *dev return ret; } -static int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) +int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) { struct HdfDevice *device = NULL; if (devInst == NULL || devNode == NULL) { @@ -48,8 +55,13 @@ static int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *dev HDF_LOGE("%s: device %x detach unknown devnode %x", __func__, device->deviceId, devNode->devId); return HDF_DEV_ERR_NO_DEVICE; } - DListRemove(&devNode->entry); - HdfDeviceNodeFreeInstance(devNode); + + if (devNode->entry.next != NULL) { + DListRemove(&devNode->entry); + } + if (devNode->super.UnlaunchNode != NULL) { + devNode->super.UnlaunchNode(devNode); + } return HDF_SUCCESS; } @@ -100,8 +112,7 @@ void HdfDeviceDestruct(struct HdfDevice *device) struct HdfObject *HdfDeviceCreate() { - struct HdfDevice *device = - (struct HdfDevice *)OsalMemCalloc(sizeof(struct HdfDevice)); + struct HdfDevice *device = (struct HdfDevice *)OsalMemCalloc(sizeof(struct HdfDevice)); if (device != NULL) { HdfDeviceConstruct(device); } diff --git a/core/host/src/hdf_device_node.c b/core/host/src/hdf_device_node.c index 93c33556d..46c96bcef 100644 --- a/core/host/src/hdf_device_node.c +++ b/core/host/src/hdf_device_node.c @@ -16,6 +16,7 @@ #include "hdf_cstring.h" #include "hdf_device_object.h" #include "hdf_device_token.h" +#include "hdf_driver_loader.h" #include "hdf_log.h" #include "hdf_object_manager.h" #include "hdf_observer_record.h" @@ -59,26 +60,18 @@ static int HdfDeviceNodePublishService(struct HdfDeviceNode *devNode) return status; } -int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode) +int DeviveDriverBind(struct HdfDeviceNode *devNode) { - const struct HdfDriverEntry *driverEntry = NULL; int ret; + const struct HdfDriverEntry *driverEntry = NULL; if (devNode == NULL) { - HDF_LOGE("failed to launch service, device or service is null"); return HDF_ERR_INVALID_PARAM; } - HDF_LOGI("launch devnode %s", devNode->servName); driverEntry = devNode->driver->entry; - if (driverEntry == NULL || driverEntry->Init == NULL) { - HDF_LOGE("failed to launch service, deviceEntry invalid"); - return HDF_ERR_INVALID_PARAM; - } - - devNode->devStatus = DEVNODE_LAUNCHED; if (devNode->policy == SERVICE_POLICY_PUBLIC || devNode->policy == SERVICE_POLICY_CAPACITY) { if (driverEntry->Bind == NULL) { - HDF_LOGE("driver %s bind method is null, ignore device service publish", driverEntry->moduleName); + HDF_LOGE("driver %s bind method not implement", driverEntry->moduleName); devNode->devStatus = DEVNODE_NONE; return HDF_ERR_INVALID_OBJECT; } @@ -89,6 +82,31 @@ int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode) } } + return HDF_SUCCESS; +} + +int HdfDeviceLaunchNode(struct HdfDeviceNode *devNode) +{ + const struct HdfDriverEntry *driverEntry = NULL; + int ret; + if (devNode == NULL) { + HDF_LOGE("failed to launch service, device or service is null"); + return HDF_ERR_INVALID_PARAM; + } + + HDF_LOGI("launch devnode %s", devNode->servName ? devNode->servName : ""); + driverEntry = devNode->driver->entry; + if (driverEntry == NULL || driverEntry->Init == NULL) { + HDF_LOGE("failed to launch service, deviceEntry invalid"); + return HDF_ERR_INVALID_PARAM; + } + devNode->devStatus = DEVNODE_LAUNCHED; + + ret = DeviveDriverBind(devNode); + if (ret != HDF_SUCCESS) { + return ret; + } + ret = driverEntry->Init(&devNode->deviceObject); if (ret != HDF_SUCCESS) { return HDF_DEV_ERR_DEV_INIT_FAIL; @@ -133,9 +151,10 @@ int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode) { int ret; if (devNode == NULL || devNode->deviceObject.service == NULL) { - HDF_LOGE("failed to publish public service: devNode is NULL"); + HDF_LOGE("failed to publish public service, devNode is NULL"); return HDF_FAILURE; } + ret = DevSvcManagerClntAddService(devNode->servName, &devNode->deviceObject); if (ret == HDF_SUCCESS) { devNode->servStatus = true; @@ -154,22 +173,11 @@ int HdfDeviceNodeRemoveService(struct HdfDeviceNode *devNode) return HDF_SUCCESS; } -void HdfDeviceNodeConstruct(struct HdfDeviceNode *devNode) -{ - if (devNode != NULL) { - struct IDeviceNode *nodeIf = &devNode->super; - HdfDeviceObjectConstruct(&devNode->deviceObject); - devNode->token = HdfDeviceTokenNewInstance(); - nodeIf->LaunchNode = HdfDeviceLaunchNode; - nodeIf->PublishService = HdfDeviceNodePublishPublicService; - nodeIf->RemoveService = HdfDeviceNodeRemoveService; - } -} - -void HdfDeviceReleaseNode(struct HdfDeviceNode *devNode) +static void HdfDeviceUnlaunchNode(struct HdfDeviceNode *devNode) { const struct HdfDriverEntry *driverEntry = NULL; - if (devNode == NULL) { + struct IDriverLoader *driverLoader = NULL; + if (devNode == NULL || devNode->devStatus != DEVNODE_LAUNCHED) { return; } @@ -182,8 +190,31 @@ void HdfDeviceReleaseNode(struct HdfDeviceNode *devNode) } if (devNode->servStatus) { - HdfDeviceNodeRemoveService(devNode); - DevmgrServiceClntDetachDevice(devNode->devId); + devNode->super.RemoveService(devNode); + } + DevmgrServiceClntDetachDevice(devNode->devId); + + // release driver object or close driver library + driverLoader = HdfDriverLoaderGetInstance(); + if (driverLoader != NULL) { + driverLoader->ReclaimDriver(devNode->driver); + devNode->driver = NULL; + } else { + HDF_LOGE("failed to get driver loader"); + } + devNode->devStatus = DEVNODE_INITED; +} + +void HdfDeviceNodeConstruct(struct HdfDeviceNode *devNode) +{ + if (devNode != NULL) { + struct IDeviceNode *nodeIf = &devNode->super; + HdfDeviceObjectConstruct(&devNode->deviceObject); + devNode->token = HdfDeviceTokenNewInstance(); + nodeIf->LaunchNode = HdfDeviceLaunchNode; + nodeIf->PublishService = HdfDeviceNodePublishPublicService; + nodeIf->RemoveService = HdfDeviceNodeRemoveService; + nodeIf->UnlaunchNode = HdfDeviceUnlaunchNode; } } @@ -195,13 +226,14 @@ void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode) HDF_LOGI("release devnode %s", devNode->servName); switch (devNode->devStatus) { case DEVNODE_LAUNCHED: - HdfDeviceReleaseNode(devNode); + HdfDeviceUnlaunchNode(devNode); + case DEVNODE_INITED: // fall-through HdfDeviceTokenFreeInstance(devNode->token); devNode->token = NULL; - case DEVNODE_INITED: // fall-through PowerStateTokenFreeInstance(devNode->powerToken); devNode->powerToken = NULL; OsalMemFree(devNode->servName); + OsalMemFree(devNode->driverName); devNode->servName = NULL; break; case DEVNODE_NONE: @@ -231,8 +263,7 @@ struct HdfDeviceNode *HdfDeviceNodeNewInstance(const struct HdfDeviceInfo *devic if (devNode->servName == NULL) { return NULL; } - devNode->deviceObject.property = HcsGetNodeByMatchAttr(HdfGetRootNode(), deviceInfo->deviceMatchAttr); - devNode->deviceObject.priv = (void *)(deviceInfo->private); + devNode->deviceObject.property = HcsGetNodeByMatchAttr(HdfGetHcsRootNode(), deviceInfo->deviceMatchAttr); if (devNode->deviceObject.property == NULL) { HDF_LOGD("node %s property empty, match attr: %s", deviceInfo->moduleName, deviceInfo->deviceMatchAttr); } diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index 8e44d6d35..9a805af16 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -7,10 +7,13 @@ */ #include "hdf_device_object.h" +#include "devhost_service.h" #include "hdf_base.h" +#include "hdf_cstring.h" #include "hdf_device_node.h" -#include "devhost_service.h" +#include "hdf_driver_loader.h" #include "hdf_log.h" +#include "hdf_object_manager.h" #include "hdf_observer_record.h" #include "hdf_service_observer.h" #include "power_state_token.h" @@ -121,8 +124,7 @@ void HdfPmSetMode(struct HdfDeviceObject *deviceObject, uint32_t mode) bool HdfDeviceSetClass(struct HdfDeviceObject *deviceObject, DeviceClass deviceClass) { - if ((deviceObject == NULL) || (deviceClass >= DEVICE_CLASS_MAX) || - (deviceClass >= DEVICE_CLASS_MAX)) { + if ((deviceObject == NULL) || (deviceClass >= DEVICE_CLASS_MAX) || (deviceClass >= DEVICE_CLASS_MAX)) { return false; } deviceObject->deviceClass = deviceClass; @@ -137,3 +139,125 @@ void HdfDeviceObjectConstruct(struct HdfDeviceObject *deviceObject) deviceObject->deviceClass = DEVICE_CLASS_DEFAULT; } } + +struct HdfDeviceObject *HdfDeviceObjectAlloc(struct HdfDeviceObject *parent, const char *driverName) +{ + struct HdfDeviceNode *newNode = NULL; + struct HdfDeviceNode *parentDevNode = CONTAINER_OF(parent, struct HdfDeviceNode, deviceObject); + + if (parent == NULL) { + HDF_LOGE("failed to alloc device, parent invalid"); + return NULL; + } + + if (parentDevNode->devStatus != DEVNODE_LAUNCHED) { + HDF_LOGE("failed to alloc device, parent status invalid %u", parentDevNode->devStatus); + return NULL; + } + + newNode = (struct HdfDeviceNode *)HdfObjectManagerGetObject(HDF_OBJECT_ID_DEVICE_SERVICE); + if (newNode == NULL) { + return NULL; + } + newNode->driverName = HdfStringCopy(driverName); + if (newNode->driverName == NULL) { + HdfDeviceNodeFreeInstance(newNode); + return NULL; + } + + newNode->hostService = parentDevNode->hostService; + newNode->device = parentDevNode->device; + + return &newNode->deviceObject; +} + +void HdfDeviceObjectRelease(struct HdfDeviceObject *dev) +{ + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (dev == NULL) { + return; + } + + if (devNode->device != NULL && devNode->device->super.Detach != NULL) { + devNode->device->super.Detach(&devNode->device->super, devNode); + } + HdfDeviceNodeFreeInstance(devNode); +} + +int HdfDeviceObjectRegister(struct HdfDeviceObject *dev) +{ + int ret = HDF_FAILURE; + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); + + if (dev == NULL || devNode->driverName == NULL || devNode->device == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + devNode->driver = driverLoader->GetDriver(devNode->driverName); + if (devNode->driver == NULL) { + HDF_LOGE("can not found driver %s", devNode->driverName); + return HDF_DEV_ERR_NO_DEVICE; + } + + ret = devNode->device->super.Attach(&devNode->device->super, devNode); + if (ret != HDF_SUCCESS) { + HDF_LOGE("faild to attach device %s", devNode->driverName); + return HDF_DEV_ERR_ATTACHDEV_FAIL; + } + + return ret; +} + +int HdfDeviceObjectUnRegister(struct HdfDeviceObject *dev) +{ + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (devNode == NULL || devNode->device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + return devNode->device->super.Detach(&devNode->device->super, devNode); +} + +int HdfDeviceObjectPublishService(struct HdfDeviceObject *dev, const char *servName, uint8_t policy, uint32_t perm) +{ + int ret; + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (dev == NULL || servName == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (policy <= SERVICE_POLICY_NONE || policy >= SERVICE_POLICY_INVALID) { + return HDF_DEV_ERR_NO_DEVICE_SERVICE; + } + + if (devNode->servStatus) { + HDF_LOGE("failed to publish public service, repeat publish"); + return HDF_FAILURE; + } + + devNode->servName = HdfStringCopy(servName); + if (devNode->servName == NULL) { + return HDF_DEV_ERR_NO_MEMORY; + } + + devNode->policy = policy; + devNode->permission = perm; + + ret = DeviveDriverBind(devNode); + if (ret != HDF_SUCCESS) { + return ret; + } + + return devNode->super.PublishService(devNode); +} + +int HdfDeviceObjectRemoveService(struct HdfDeviceObject *dev) +{ + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (dev == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + return devNode->super.RemoveService(devNode); +} \ No newline at end of file diff --git a/core/manager/include/devhost_service_clnt.h b/core/manager/include/devhost_service_clnt.h index cbc34d64a..44d664ba3 100644 --- a/core/manager/include/devhost_service_clnt.h +++ b/core/manager/include/devhost_service_clnt.h @@ -16,7 +16,8 @@ struct DevHostServiceClnt { struct DListHead node; struct HdfSList devices; - struct HdfSList *deviceInfos; + struct HdfSList unloadDevInfos; + struct HdfSList dynamicDevInfos; Map *deviceHashMap; struct IDevHostService *hostService; uint16_t devCount; diff --git a/core/manager/include/devmgr_service.h b/core/manager/include/devmgr_service.h index 56f0e02cc..d45bac619 100644 --- a/core/manager/include/devmgr_service.h +++ b/core/manager/include/devmgr_service.h @@ -24,8 +24,6 @@ bool DevmgrServiceConstruct(struct DevmgrService *inst); struct HdfObject *DevmgrServiceCreate(void); void DevmgrServiceRelease(struct HdfObject *object); struct IDevmgrService *DevmgrServiceGetInstance(void); -int DevmgrServiceLoadDevice(const char *svcName); -int DevmgrServiceUnLoadDevice(const char *svcName); int32_t DevmgrServiceLoadLeftDriver(struct DevmgrService *devMgrSvc); #endif /* DEVICE_MANAGER_SERVICE_H */ diff --git a/core/manager/include/devsvc_manager.h b/core/manager/include/devsvc_manager.h index b73731bcc..2ee3daa5b 100644 --- a/core/manager/include/devsvc_manager.h +++ b/core/manager/include/devsvc_manager.h @@ -28,6 +28,7 @@ struct IDevSvcManager *DevSvcManagerGetInstance(void); int DevSvcManagerAddService(struct IDevSvcManager *manager, const char *svcName, struct HdfDeviceObject *service); struct HdfObject *DevSvcManagerGetService(struct IDevSvcManager *manager, const char *svcName); void DevSvcManagerRemoveService(struct IDevSvcManager *manager, const char *svcName); +void DevSvcManagerListService(struct HdfSBuf *serviecNameSet, DeviceClass deviceClass); int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback); int DevSvcManagerClntUnsubscribeService(const char *svcName); diff --git a/core/manager/src/devhost_service_clnt.c b/core/manager/src/devhost_service_clnt.c index 43b4f1ca9..cebd88d4a 100644 --- a/core/manager/src/devhost_service_clnt.c +++ b/core/manager/src/devhost_service_clnt.c @@ -32,20 +32,26 @@ int DevHostServiceClntInstallDriver(struct DevHostServiceClnt *hostClnt) HDF_LOGE("devHostSvcIf or devHostSvcIf->AddDevice is null"); return HDF_FAILURE; } - HdfSListIteratorInit(&it, hostClnt->deviceInfos); + HdfSListIteratorInit(&it, &hostClnt->unloadDevInfos); while (HdfSListIteratorHasNext(&it)) { deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&it); if ((deviceInfo == NULL) || (deviceInfo->preload == DEVICE_PRELOAD_DISABLE)) { continue; } - if ((DeviceManagerIsQuickLoad() == DEV_MGR_QUICK_LOAD) && - (deviceInfo->preload == DEVICE_PRELOAD_ENABLE_STEP2)) { + /* + * If quick start feature enable, the device which 'preload' attribute set as + * DEVICE_PRELOAD_ENABLE_STEP2 will be loaded later + */ + if (DeviceManagerIsQuickLoad() == DEV_MGR_QUICK_LOAD && + deviceInfo->preload == DEVICE_PRELOAD_ENABLE_STEP2) { continue; } ret = devHostSvcIf->AddDevice(devHostSvcIf, deviceInfo); if (ret != HDF_SUCCESS) { HDF_LOGE("failed to install driver %s, ret = %d", deviceInfo->svcName, ret); + continue; } + HdfSListIteratorRemove(&it); } return HDF_SUCCESS; } @@ -69,6 +75,7 @@ struct DevHostServiceClnt *DevHostServiceClntNewInstance(uint16_t hostId, const hostClnt->hostId = hostId; hostClnt->hostName = hostName; hostClnt->devCount = 0; + hostClnt->hostPid = -1; DevHostServiceClntConstruct(hostClnt); } return hostClnt; @@ -78,7 +85,8 @@ void DevHostServiceClntFreeInstance(struct DevHostServiceClnt *hostClnt) { if (hostClnt != NULL) { HdfSListFlush(&hostClnt->devices, DeviceTokenClntDelete); - HdfSListFlush(hostClnt->deviceInfos, HdfDeviceInfoDelete); + HdfSListFlush(&hostClnt->unloadDevInfos, HdfDeviceInfoDelete); + HdfSListFlush(&hostClnt->dynamicDevInfos, HdfDeviceInfoDelete); OsalMemFree(hostClnt->deviceHashMap); OsalMemFree(hostClnt); } diff --git a/core/manager/src/devmgr_service.c b/core/manager/src/devmgr_service.c index 741cbf3a6..358b8956f 100644 --- a/core/manager/src/devmgr_service.c +++ b/core/manager/src/devmgr_service.c @@ -15,53 +15,116 @@ #include "hdf_host_info.h" #include "hdf_log.h" #include "hdf_object_manager.h" +#include "osal_time.h" #define HDF_LOG_TAG devmgr_service -static int DevmgrServiceActiveDevice(struct DevHostServiceClnt *hostClnt, - struct HdfDeviceInfo *deviceInfo, bool isLoad) +static bool DevmgrServiceDynamicDevInfoFound(const char *svcName, struct DevHostServiceClnt **targetHostClnt, + struct HdfDeviceInfo **targetDeviceInfo) { - struct IDevHostService *devHostSvcIf = (struct IDevHostService *)hostClnt->hostService; - if (devHostSvcIf == NULL) { - return HDF_FAILURE; + struct HdfSListIterator itDeviceInfo; + struct HdfDeviceInfo *deviceInfo = NULL; + struct DevHostServiceClnt *hostClnt = NULL; + struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); + if (devMgrSvc == NULL) { + return false; } - if (isLoad && (deviceInfo->preload != DEVICE_PRELOAD_ENABLE)) { - int ret = devHostSvcIf->AddDevice(devHostSvcIf, deviceInfo); - if (ret == HDF_SUCCESS) { - deviceInfo->preload = DEVICE_PRELOAD_ENABLE; + DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { + HdfSListIteratorInit(&itDeviceInfo, &hostClnt->dynamicDevInfos); + while (HdfSListIteratorHasNext(&itDeviceInfo)) { + deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); + if (strcmp(deviceInfo->svcName, svcName) == 0) { + *targetDeviceInfo = deviceInfo; + *targetHostClnt = hostClnt; + return true; + } } - return ret; - } else if (!isLoad && (deviceInfo->preload != DEVICE_PRELOAD_DISABLE)) { - devHostSvcIf->DelDevice(devHostSvcIf, deviceInfo->deviceId); - deviceInfo->preload = DEVICE_PRELOAD_DISABLE; + } + + return false; +} + +#define WAIT_HOST_SLEEP_TIME 1 // ms +#define WAIT_HOST_SLEEP_CNT 100 +static int DevmgrServiceStartHostProcess(struct DevHostServiceClnt *hostClnt, bool sync) +{ + int waitCount = WAIT_HOST_SLEEP_CNT; + struct IDriverInstaller *installer = DriverInstallerGetInstance(); + if (installer == NULL || installer->StartDeviceHost == NULL) { + HDF_LOGE("invalid installer"); + return HDF_FAILURE; + } + + hostClnt->hostPid = installer->StartDeviceHost(hostClnt->hostId, hostClnt->hostName); + if (hostClnt->hostPid == HDF_FAILURE) { + HDF_LOGW("failed to start device host(%s, %u)", hostClnt->hostName, hostClnt->hostId); + return HDF_FAILURE; + } + if (!sync) { return HDF_SUCCESS; - } else { + } + + while (hostClnt->hostService == NULL && waitCount-- > 0) { + OsalMSleep(WAIT_HOST_SLEEP_TIME); + } + + if (waitCount <= 0) { + HDF_LOGE("wait host(%s, %d) attach timeout", hostClnt->hostName, hostClnt->hostId); + return HDF_ERR_TIMEOUT; + } + + return HDF_SUCCESS; +} + +static int DevmgrServiceLoadDevice(struct IDevmgrService *devMgrSvc, const char *serviceName) +{ + struct HdfDeviceInfo *deviceInfo = NULL; + struct DevHostServiceClnt *hostClnt = NULL; + (void)devMgrSvc; + + if (serviceName == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!DevmgrServiceDynamicDevInfoFound(serviceName, &hostClnt, &deviceInfo)) { + HDF_LOGE("device %s not in configed device list", serviceName); + return HDF_DEV_ERR_NO_DEVICE; + } + + if (deviceInfo->preload != DEVICE_PRELOAD_DISABLE) { + HDF_LOGE("device %s not an dynamic load device", serviceName); + return HDF_DEV_ERR_NORANGE; + } + + if (hostClnt->hostPid < 0 && DevmgrServiceStartHostProcess(hostClnt, true) != HDF_SUCCESS) { + HDF_LOGW("failed to start device host(%s, %u)", hostClnt->hostName, hostClnt->hostId); return HDF_FAILURE; } + + return hostClnt->hostService->AddDevice(hostClnt->hostService, deviceInfo); } -static int DevmgrServiceFindAndActiveDevice(const char *svcName, bool isLoad) +static int DevmgrServiceUnloadDevice(struct IDevmgrService *devMgrSvc, const char *serviceName) { - struct HdfSListIterator itDeviceInfo; struct HdfDeviceInfo *deviceInfo = NULL; struct DevHostServiceClnt *hostClnt = NULL; - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); - if (devMgrSvc == NULL || svcName == NULL) { + (void)devMgrSvc; + + if (serviceName == NULL) { return HDF_ERR_INVALID_PARAM; } - DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { - HdfSListIteratorInit(&itDeviceInfo, hostClnt->deviceInfos); - while (HdfSListIteratorHasNext(&itDeviceInfo)) { - deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); - if (strcmp(deviceInfo->svcName, svcName) == 0) { - return DevmgrServiceActiveDevice(hostClnt, deviceInfo, isLoad); - } - } + if (!DevmgrServiceDynamicDevInfoFound(serviceName, &hostClnt, &deviceInfo) || + deviceInfo->preload != DEVICE_PRELOAD_DISABLE) { + HDF_LOGE("device %s not in configed dynamic device list", serviceName); + return HDF_DEV_ERR_NO_DEVICE; } - return HDF_FAILURE; + if (hostClnt->hostService == NULL) { + return HDF_FAILURE; + } + return hostClnt->hostService->DelDevice(hostClnt->hostService, deviceInfo->deviceId); } int32_t DevmgrServiceLoadLeftDriver(struct DevmgrService *devMgrSvc) @@ -75,30 +138,22 @@ int32_t DevmgrServiceLoadLeftDriver(struct DevmgrService *devMgrSvc) } DLIST_FOR_EACH_ENTRY(hostClnt, &devMgrSvc->hosts, struct DevHostServiceClnt, node) { - HdfSListIteratorInit(&itDeviceInfo, hostClnt->deviceInfos); + HdfSListIteratorInit(&itDeviceInfo, &hostClnt->unloadDevInfos); while (HdfSListIteratorHasNext(&itDeviceInfo)) { deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&itDeviceInfo); if (deviceInfo->preload == DEVICE_PRELOAD_ENABLE_STEP2) { - ret = DevmgrServiceActiveDevice(hostClnt, deviceInfo, true); + ret = hostClnt->hostService->AddDevice(hostClnt->hostService, deviceInfo); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:failed to load driver %s", __func__, deviceInfo->moduleName); + continue; } + HdfSListIteratorRemove(&itDeviceInfo); } } } return HDF_SUCCESS; } -int DevmgrServiceLoadDevice(const char *svcName) -{ - return DevmgrServiceFindAndActiveDevice(svcName, true); -} - -int DevmgrServiceUnLoadDevice(const char *svcName) -{ - return DevmgrServiceFindAndActiveDevice(svcName, false); -} - static struct DevHostServiceClnt *DevmgrServiceFindDeviceHost(struct IDevmgrService *inst, uint16_t hostId) { struct DevHostServiceClnt *hostClnt = NULL; @@ -113,29 +168,10 @@ static struct DevHostServiceClnt *DevmgrServiceFindDeviceHost(struct IDevmgrServ return hostClnt; } } - HDF_LOGE("failed to find host, host id is %u", hostId); + HDF_LOGE("cannot find host %u", hostId); return NULL; } -static void DevmgrServiceUpdateStatus(struct DevHostServiceClnt *hostClnt, devid_t devId, uint16_t status) -{ - struct HdfSListIterator it; - struct HdfDeviceInfo *deviceInfo = NULL; - - HdfSListIteratorInit(&it, hostClnt->deviceInfos); - while (HdfSListIteratorHasNext(&it)) { - deviceInfo = (struct HdfDeviceInfo *)HdfSListIteratorNext(&it); - if (deviceInfo->deviceId == devId) { - deviceInfo->status = status; - HDF_LOGD("%s host:%s %u device:%s %u status:%u", __func__, hostClnt->hostName, - hostClnt->hostId, deviceInfo->svcName, devId, deviceInfo->status); - return; - } - } - HDF_LOGE("%s: not find device %u in host %u", __func__, devId, hostClnt->hostId); - return; -} - static int DevmgrServiceAttachDevice(struct IDevmgrService *inst, struct IHdfDeviceToken *token) { struct DevHostServiceClnt *hostClnt = NULL; @@ -152,7 +188,6 @@ static int DevmgrServiceAttachDevice(struct IDevmgrService *inst, struct IHdfDev return HDF_FAILURE; } - DevmgrServiceUpdateStatus(hostClnt, token->devid, HDF_SERVICE_USABLE); HdfSListAdd(&hostClnt->devices, &tokenClnt->node); return HDF_SUCCESS; } @@ -180,7 +215,6 @@ static int DevmgrServiceDetachDevice(struct IDevmgrService *inst, devid_t devid) return HDF_DEV_ERR_NO_DEVICE; } tokenClnt = CONTAINER_OF(tokenClntNode, struct DeviceTokenClnt, node); - DevmgrServiceUpdateStatus(hostClnt, devid, HDF_SERVICE_UNUSABLE); HdfSListRemove(&hostClnt->devices, &tokenClnt->node); return HDF_SUCCESS; } @@ -199,13 +233,36 @@ static int DevmgrServiceAttachDeviceHost( } hostClnt->hostService = hostService; - hostClnt->deviceInfos = HdfAttributeManagerGetDeviceList(hostClnt->hostId, hostClnt->hostName); - if (hostClnt->deviceInfos == NULL) { - HDF_LOGW("failed to get device list "); + return DevHostServiceClntInstallDriver(hostClnt); +} + +static int DevmgrServiceStartDeviceHost(struct DevmgrService *devmgr, struct HdfHostInfo *hostAttr) +{ + struct DevHostServiceClnt *hostClnt = DevHostServiceClntNewInstance(hostAttr->hostId, hostAttr->hostName); + if (hostClnt == NULL) { + HDF_LOGW("failed to create new device host client"); + return HDF_FAILURE; + } + + if (HdfAttributeManagerGetDeviceList(hostClnt) != HDF_SUCCESS) { + HDF_LOGW("failed to get device list for host %s", hostClnt->hostName); + return HDF_FAILURE; + } + + DListInsertTail(&hostClnt->node, &devmgr->hosts); + + // not start the host which only have dynamic deivces + if (HdfSListIsEmpty(&hostClnt->unloadDevInfos)) { return HDF_SUCCESS; } - hostClnt->devCount = HdfSListCount(hostClnt->deviceInfos); - return DevHostServiceClntInstallDriver(hostClnt); + + if (DevmgrServiceStartHostProcess(hostClnt, false) != HDF_SUCCESS) { + HDF_LOGW("failed to start device host, host id is %u", hostAttr->hostId); + DListRemove(&hostClnt->node); + DevHostServiceClntFreeInstance(hostClnt); + return HDF_FAILURE; + } + return HDF_SUCCESS; } static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) @@ -213,13 +270,7 @@ static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) struct HdfSList hostList; struct HdfSListIterator it; struct HdfHostInfo *hostAttr = NULL; - struct DevHostServiceClnt *hostClnt = NULL; - struct IDriverInstaller *installer = NULL; - installer = DriverInstallerGetInstance(); - if (installer == NULL || installer->StartDeviceHost == NULL) { - HDF_LOGE("installer or installer->StartDeviceHost is null"); - return HDF_FAILURE; - } + HdfSListInit(&hostList); if (!HdfAttributeManagerGetHostList(&hostList)) { HDF_LOGW("%s: host list is null", __func__); @@ -228,18 +279,7 @@ static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) HdfSListIteratorInit(&it, &hostList); while (HdfSListIteratorHasNext(&it)) { hostAttr = (struct HdfHostInfo *)HdfSListIteratorNext(&it); - hostClnt = DevHostServiceClntNewInstance(hostAttr->hostId, hostAttr->hostName); - if (hostClnt == NULL) { - HDF_LOGW("failed to create new device host client"); - continue; - } - DListInsertTail(&hostClnt->node, &inst->hosts); - hostClnt->hostPid = installer->StartDeviceHost(hostAttr->hostId, hostAttr->hostName); - if (hostClnt->hostPid == HDF_FAILURE) { - HDF_LOGW("failed to start device host, host id is %u", hostAttr->hostId); - DListRemove(&hostClnt->node); - DevHostServiceClntFreeInstance(hostClnt); - } + DevmgrServiceStartDeviceHost(inst, hostAttr); } HdfSListFlush(&hostList, HdfHostInfoDelete); return HDF_SUCCESS; @@ -305,6 +345,8 @@ bool DevmgrServiceConstruct(struct DevmgrService *inst) if (devMgrSvcIf != NULL) { devMgrSvcIf->AttachDevice = DevmgrServiceAttachDevice; devMgrSvcIf->DetachDevice = DevmgrServiceDetachDevice; + devMgrSvcIf->LoadDevice = DevmgrServiceLoadDevice; + devMgrSvcIf->UnloadDevice = DevmgrServiceUnloadDevice; devMgrSvcIf->AttachDeviceHost = DevmgrServiceAttachDeviceHost; devMgrSvcIf->StartService = DevmgrServiceStartService; devMgrSvcIf->PowerStateChange = DevmgrServicePowerStateChange; diff --git a/core/manager/src/devsvc_manager.c b/core/manager/src/devsvc_manager.c index d3f377bb0..06e69de9e 100644 --- a/core/manager/src/devsvc_manager.c +++ b/core/manager/src/devsvc_manager.c @@ -13,6 +13,7 @@ #include "hdf_log.h" #include "hdf_object_manager.h" #include "hdf_service_record.h" +#include "hdf_device_node.h" #define HDF_LOG_TAG devsvc_manager @@ -65,11 +66,10 @@ int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *svcName, st int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcName, struct SubscriberCallback callBack) { - int ret = HDF_FAILURE; - struct DevSvcManager *devSvcMgr = (struct DevSvcManager *)inst; + struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance();; struct HdfObject *deviceService = NULL; - if (svcName == NULL || devSvcMgr == NULL) { - return ret; + if (inst == NULL || svcName == NULL || devMgrSvc == NULL) { + return HDF_FAILURE; } deviceService = DevSvcManagerGetService(inst, svcName); @@ -80,7 +80,7 @@ int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcNa return HDF_SUCCESS; } - return DevmgrServiceLoadDevice(svcName); + return devMgrSvc->super.LoadDevice(&devMgrSvc->super, svcName); } void DevSvcManagerRemoveService(struct IDevSvcManager *inst, const char *svcName) @@ -115,6 +115,33 @@ struct HdfDeviceObject *DevSvcManagerGetObject(struct IDevSvcManager *inst, cons return NULL; } +// only use for kernel space +void DevSvcManagerListService(struct HdfSBuf *serviecNameSet, DeviceClass deviceClass) +{ + struct HdfSListIterator it; + struct DevSvcRecord *record = NULL; + struct HdfDeviceNode *devNode = NULL; + struct DevSvcManager *devSvcManager = (struct DevSvcManager *)DevSvcManagerGetInstance(); + if (devSvcManager == NULL) { + HDF_LOGE("failed to list service, devSvcManager is null"); + return; + } + + OsalMutexLock(&devSvcManager->mutex); + HdfSListIteratorInit(&it, &devSvcManager->services); + while (HdfSListIteratorHasNext(&it)) { + record = (struct DevSvcRecord *)HdfSListIteratorNext(&it); + if (record == NULL) { + continue; + } + devNode = CONTAINER_OF(record->value, struct HdfDeviceNode, deviceObject); + if (devNode->deviceObject.deviceClass == deviceClass) { + HdfSbufWriteString(serviecNameSet, devNode->servName); + } + } + OsalMutexUnlock(&devSvcManager->mutex); +} + struct HdfObject *DevSvcManagerGetService(struct IDevSvcManager *inst, const char *svcName) { struct HdfDeviceObject *deviceObject = DevSvcManagerGetObject(inst, svcName); diff --git a/core/manager/src/hdf_driver_installer.c b/core/manager/src/hdf_driver_installer.c index 0ed60f47f..655c67595 100644 --- a/core/manager/src/hdf_driver_installer.c +++ b/core/manager/src/hdf_driver_installer.c @@ -6,6 +6,7 @@ * See the LICENSE file in the root of this repository for complete details. */ +#include "hdf_attribute_manager.h" #include "hdf_driver_installer.h" #include "devhost_service.h" #include "hdf_base.h" diff --git a/core/manager/test/unittest/common/hdf_lite_manager_test.cpp b/core/manager/test/unittest/common/hdf_lite_manager_test.cpp index 264a2fd74..b6d2e1cad 100644 --- a/core/manager/test/unittest/common/hdf_lite_manager_test.cpp +++ b/core/manager/test/unittest/common/hdf_lite_manager_test.cpp @@ -96,7 +96,7 @@ HWTEST_F(HdfManagerTest, HdfRegisterDevice001, TestSize.Level0) EXPECT_TRUE((timeAfter - timeBefore) < 100); struct HdfIoService *ioService1 = HdfIoServiceBind("sample_service1"); - EXPECT_TRUE(ioService1 != NULL); + ASSERT_TRUE(ioService1 != NULL); HdfIoServiceRecycle(ioService1); ret = ioService->dispatcher->Dispatch(&ioService->object, SAMPLE_DRIVER_UNREGISTER_DEVICE, data, NULL); @@ -117,21 +117,26 @@ HWTEST_F(HdfManagerTest, HdfRegisterDevice001, TestSize.Level0) */ HWTEST_F(HdfManagerTest, HdfGetServiceNameByDeviceClass001, TestSize.Level0) { - struct HdfSBuf *data = HdfSBufObtain(1000); + struct HdfSBuf *data = HdfSBufObtain(2000); ASSERT_TRUE(data != NULL); - int32_t ret = HdfGetServiceNameByDeviceClass(DEVICE_CLASS_DEFAULT, data); - EXPECT_TRUE(ret == HDF_SUCCESS); + bool flag = false; - const char *svcName = NULL; - while(true) { - svcName = HdfSbufReadString(data); - if (svcName == NULL) { - break; - } - if (strcmp(svcName, "sample_service") == 0) { - flag = true; - break; + for (size_t i = DEVICE_CLASS_DEFAULT; i < DEVICE_CLASS_MAX; i++) { + int32_t ret = HdfGetServiceNameByDeviceClass((DeviceClass)i, data); + std::cout << "clasee " << i << " device list:" << std::endl; + EXPECT_TRUE(ret == HDF_SUCCESS); + const char *svcName = NULL; + while(true) { + svcName = HdfSbufReadString(data); + if (svcName == NULL) { + break; + } + std::cout << svcName << std::endl; + if (strcmp(svcName, "sample_service") == 0) { + flag = true; + } } + HdfSbufFlush(data); } HdfSBufRecycle(data); EXPECT_TRUE(flag); diff --git a/core/shared/include/devmgr_service_if.h b/core/shared/include/devmgr_service_if.h index 08ad1395d..ee3eb6611 100644 --- a/core/shared/include/devmgr_service_if.h +++ b/core/shared/include/devmgr_service_if.h @@ -21,6 +21,8 @@ struct IDevmgrService { int (*AttachDeviceHost)(struct IDevmgrService *, uint16_t, struct IDevHostService *); int (*AttachDevice)(struct IDevmgrService *, struct IHdfDeviceToken *); int (*DetachDevice)(struct IDevmgrService *, devid_t); + int (*LoadDevice)(struct IDevmgrService *, const char *); + int (*UnloadDevice)(struct IDevmgrService *, const char *); int (*StartService)(struct IDevmgrService *); int (*PowerStateChange)(struct IDevmgrService *, enum HdfPowerState pEvent); }; diff --git a/core/shared/include/hdf_attribute_manager.h b/core/shared/include/hdf_attribute_manager.h index 8138a5dbf..33dab105a 100644 --- a/core/shared/include/hdf_attribute_manager.h +++ b/core/shared/include/hdf_attribute_manager.h @@ -10,11 +10,10 @@ #define HDF_ATTRIBUTE_MANAGER_H #include "hdf_slist.h" +#include "devhost_service_clnt.h" -const struct DeviceResourceNode *HdfGetRootNode(void); +const struct DeviceResourceNode *HdfGetHcsRootNode(void); bool HdfAttributeManagerGetHostList(struct HdfSList *hostList); -struct HdfSList *HdfAttributeManagerGetDeviceList(uint16_t hostId, const char *hostName); -bool HdfDeviceListAdd(const char *moduleName, const char *serviceName, const void *privateData); -void HdfDeviceListDel(const char *moduleName, const char *serviceName); +int HdfAttributeManagerGetDeviceList(struct DevHostServiceClnt *hostClnt); #endif /* HDF_ATTRIBUTE_MANAGER_H */ diff --git a/core/shared/include/hdf_device_info.h b/core/shared/include/hdf_device_info.h old mode 100755 new mode 100644 index 8852e8306..8c351b12d --- a/core/shared/include/hdf_device_info.h +++ b/core/shared/include/hdf_device_info.h @@ -36,7 +36,6 @@ struct HdfDeviceInfo { const char *moduleName; const char *svcName; const char *deviceMatchAttr; - const void *private; }; struct HdfPrivateInfo { diff --git a/core/shared/src/hdf_device_info.c b/core/shared/src/hdf_device_info.c old mode 100755 new mode 100644 index 1fc5ac93d..440ab1adb --- a/core/shared/src/hdf_device_info.c +++ b/core/shared/src/hdf_device_info.c @@ -29,7 +29,6 @@ void HdfDeviceInfoConstruct(struct HdfDeviceInfo *deviceInfo) deviceInfo->svcName = NULL; deviceInfo->moduleName = NULL; deviceInfo->deviceMatchAttr = NULL; - deviceInfo->private = NULL; } struct HdfDeviceInfo *HdfDeviceInfoNewInstance() @@ -40,19 +39,13 @@ struct HdfDeviceInfo *HdfDeviceInfoNewInstance() HdfDeviceInfoConstruct(deviceInfo); return deviceInfo; } - HDF_LOGE("Create device deviceInfo failed"); + HDF_LOGE("failed to create deviceInfo, oom"); return NULL; } void HdfDeviceInfoFreeInstance(struct HdfDeviceInfo *deviceInfo) { if (deviceInfo != NULL) { - if (deviceInfo->isDynamic && deviceInfo->svcName != NULL) { - OsalMemFree((void *)deviceInfo->svcName); - } - if (deviceInfo->private != NULL) { - OsalMemFree((void *)deviceInfo->private); - } OsalMemFree(deviceInfo); } } diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index 365313745..330a22538 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -6,13 +6,14 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include -#include "osal_mem.h" +#include "hdf_input_device_manager.h" #include "devsvc_manager_clnt.h" +#include "event_hub.h" #include "hdf_base.h" +#include "hdf_device_object.h" #include "hdf_log.h" -#include "event_hub.h" -#include "hdf_input_device_manager.h" +#include "osal_mem.h" +#include #define NODE_MODE 0660 #define SERVICE_NAME_LEN 24 @@ -52,10 +53,24 @@ static struct HdfDeviceObject *HidRegisterHdfDevice(InputDevice *inputDev) return NULL; } - hdfDev = HdfRegisterDevice(moduleName, svcName, NULL); + hdfDev = HdfDeviceObjectAlloc(g_inputManager->hdfDevObj, moduleName); if (hdfDev == NULL) { - HDF_LOGE("%s: HdfRegisterDevice failed", __func__); + HDF_LOGE("%s: failed to alloc device object", __func__); + return NULL; } + ret = HdfDeviceObjectRegister(hdfDev); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: failed to regitst device %s", __func__, moduleName); + HdfDeviceObjectRelease(hdfDev); + return NULL; + } + ret = HdfDeviceObjectPublishService(hdfDev, svcName, SERVICE_POLICY_CAPACITY, 0664); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: failed to regitst device %s", __func__, moduleName); + HdfDeviceObjectRelease(hdfDev); + return NULL; + } + inputDev->hdfDevObj = hdfDev; HDF_LOGI("%s: svcName is %s, devName = %s", __func__, svcName, inputDev->devName); return hdfDev; } @@ -103,21 +118,9 @@ static int32_t CreateDeviceNode(InputDevice *inputDev) static void DeleteDeviceNode(InputDevice *inputDev) { - int32_t len; - int32_t ret; if (IsHidDevice(inputDev->devType)) { - char svcName[SERVICE_NAME_LEN] = {0}; - const char *moduleName = "HDF_HID"; - - len = (inputDev->devId < PLACEHOLDER_LIMIT) ? 1 : PLACEHOLDER_LENGTH; - ret = snprintf_s(svcName, SERVICE_NAME_LEN, strlen("hdf_input_event") + len, "%s%u", - "hdf_input_event", inputDev->devId); - if (ret < 0) { - HDF_LOGE("%s: snprintf_s failed", __func__); - return; - } - HDF_LOGI("%s: svcName is %s, devName = %s", __func__, svcName, inputDev->devName); - HdfUnregisterDevice(moduleName, svcName); + HDF_LOGI("remove input device: hdf_input_event%u", inputDev->devId); + HdfDeviceObjectRelease(inputDev->hdfDevObj); } HDF_LOGI("%s: delete node succ, devId is %d", __func__, inputDev->devId); diff --git a/model/usb/include/usb_ddk_pnp_loader.h b/model/usb/include/usb_ddk_pnp_loader.h old mode 100755 new mode 100644 index 7915fe89e..e7accbf32 --- a/model/usb/include/usb_ddk_pnp_loader.h +++ b/model/usb/include/usb_ddk_pnp_loader.h @@ -78,7 +78,7 @@ struct UsbPnpRemoveInfo { uint8_t interfaceNum; }; -int UsbDdkPnpLoaderEventReceived(void *priv, uint32_t id, struct HdfSBuf *data); +int UsbDdkPnpLoaderEventReceived(void *usbPnpManagerPtr, uint32_t id, struct HdfSBuf *data); int UsbDdkPnpLoaderEventHandle(void); #endif /* USB_DDK_PNP_LOADER_H */ diff --git a/model/usb/include/usb_pnp_manager.h b/model/usb/include/usb_pnp_manager.h new file mode 100644 index 000000000..2a7cb5b43 --- /dev/null +++ b/model/usb/include/usb_pnp_manager.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef USB_PNP_MANAGE_H +#define USB_PNP_MANAGE_H + +#include "hdf_base.h" +#include "hdf_sbuf.h" + +struct UsbPnpManagerDeviceInfo { + struct HdfDeviceObject *usbPnpManager; + const char *moduleName; + const char *serviceName; + const char *deviceMatchAttr; + const void *privateData; + bool isReg; +}; + +bool UsbPnpManagerWriteModuleName(struct HdfSBuf *sbuf, const char *moduleName); +int32_t UsbPnpManagerRegisterOrUnregisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo); + +#endif /* USB_PNP_MANAGE_H */ diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c old mode 100755 new mode 100644 index d19fbffb9..5f7d31998 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -12,6 +12,7 @@ #include "hcs_tree_if.h" #include "hdf_attribute_manager.h" #include "hdf_base.h" +#include "hdf_device_object.h" #include "hdf_log.h" #include "hdf_sbuf.h" #include "osal_mem.h" @@ -106,6 +107,84 @@ static bool UsbDdkPnpLoaderMatchDevice(const struct UsbPnpNotifyMatchInfoTable * return true; } +// Need optimize this device object array later, should bind device object to usb deivce +#define REGISTER_DEV_MAX 16 +static struct HdfDeviceObject *g_resistedDevice[REGISTER_DEV_MAX] = {0}; +static int SaveRegistedDevice(struct HdfDeviceObject *dev) +{ + for (size_t i = 0; i < REGISTER_DEV_MAX; i++) { + if (g_resistedDevice[i] == NULL) { + g_resistedDevice[i] = dev; + return HDF_SUCCESS; + } + } + + return HDF_FAILURE; +} + +static struct HdfDeviceObject *GetRegistedDevice(const char *serviceName) +{ + struct HdfDeviceObject *dev = NULL; + for (size_t i = 0; i < REGISTER_DEV_MAX; i++) { + if (g_resistedDevice[i] == NULL) { + continue; + } + if (!strcmp(HdfDeviceGetServiceName(g_resistedDevice[i]), serviceName)) { + dev = g_resistedDevice[i]; + g_resistedDevice[i] = NULL; + break; + } + } + + return dev; +} + +int32_t UsbPnpManagerRegisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) +{ + int ret = HDF_FAILURE; + struct HdfDeviceObject *devObj = HdfDeviceObjectAlloc(managerInfo->usbPnpManager, managerInfo->moduleName); + if (devObj == NULL) { + HDF_LOGE("%s: failed to alloc device object", __func__); + return HDF_DEV_ERR_NO_DEVICE; + } + + devObj->priv = (void *)managerInfo->privateData; + ret = HdfDeviceObjectRegister(devObj); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: failed to regitst device %s", __func__, managerInfo->serviceName); + HdfDeviceObjectRelease(devObj); + return ret; + } + ret = HdfDeviceObjectPublishService(devObj, managerInfo->serviceName, SERVICE_POLICY_CAPACITY, 0664); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: failed to regitst device %s", __func__, managerInfo->serviceName); + HdfDeviceObjectRelease(devObj); + } + // need optimize this code to remove SaveRegistedDevice function later + SaveRegistedDevice(devObj); + return ret; +} + +int32_t UsbPnpManagerUnregisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) +{ + // need optimize this code to remove GetRegistedDevice function later + struct HdfDeviceObject *devObj = GetRegistedDevice(managerInfo->serviceName); + if (devObj == NULL) { + return HDF_DEV_ERR_NO_DEVICE; + } + HdfDeviceObjectRelease(devObj); + return HDF_SUCCESS; +} + +int32_t UsbPnpManagerRegisterOrUnregisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) +{ + if (managerInfo == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + return managerInfo->isReg ? UsbPnpManagerRegisterDevice(managerInfo) : UsbPnpManagerUnregisterDevice(managerInfo); +} + static void UsbDdkPnpLoaderMatchHandle(const struct UsbPnpNotifyMatchInfoTable *dev, int8_t index, struct UsbPnpMatchIdTable *id, bool flag) { @@ -212,7 +291,7 @@ OUT: static bool UsbDdkPnpLoaderMatchInterface(const struct UsbPnpNotifyMatchInfoTable *dev, int8_t index, struct UsbPnpMatchIdTable *id) { - uint32_t i; + int32_t i; bool maskFlag = true; if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS) { @@ -585,8 +664,8 @@ static struct UsbPnpMatchIdTable **UsbDdkPnpLoaderPnpMatch(void) return UsbDdkPnpLoaderParseDeviceId(usbPnpNode); } -static int32_t UsbDdkPnpLoaderDispatchPnpDevice( - const struct IDevmgrService *devmgrSvc, struct HdfSBuf *data, bool isReg) +static int32_t UsbDdkPnpLoaderDispatchPnpDevice(struct HdfDeviceObject *usbPnpManagerDevice, + struct HdfSBuf *data, bool isReg) { uint32_t infoSize = 0; struct UsbPnpNotifyServiceInfo *privateData = NULL; @@ -611,14 +690,14 @@ static int32_t UsbDdkPnpLoaderDispatchPnpDevice( privateData = NULL; } - managerInfo.devmgrSvc = (struct IDevmgrService *)devmgrSvc; + managerInfo.usbPnpManager = usbPnpManagerDevice; managerInfo.moduleName = moduleName; managerInfo.serviceName = serviceName; managerInfo.deviceMatchAttr = deviceMatchAttr; managerInfo.privateData = privateData; managerInfo.isReg = isReg; - return UsbPnpManagerRegisterOrUnregisterDevice(managerInfo); + return UsbPnpManagerRegisterOrUnregisterDevice(&managerInfo); } static int UsbDdkPnpLoaderDeviceListAdd(const struct UsbPnpNotifyMatchInfoTable *info, @@ -685,7 +764,7 @@ static struct UsbPnpDeviceListTable *UsbDdkPnpLoaderAddInterface( return NULL; } -static int UsbDdkPnpLoaderrAddPnpDevice(const struct IDevmgrService *devmgrSvc, +static int UsbDdkPnpLoaderrAddPnpDevice(struct HdfDeviceObject *usbPnpManagerDevice, const struct UsbPnpNotifyMatchInfoTable *infoTable, const struct UsbPnpMatchIdTable *idTable, uint32_t cmdId) { int ret; @@ -700,8 +779,8 @@ static int UsbDdkPnpLoaderrAddPnpDevice(const struct IDevmgrService *devmgrSvc, return HDF_SUCCESS; } - serviceInfo.length = sizeof(struct UsbPnpNotifyServiceInfo) - (USB_PNP_INFO_MAX_INTERFACES - - idTable->interfaceLength); + serviceInfo.length = sizeof(struct UsbPnpNotifyServiceInfo) - + (USB_PNP_INFO_MAX_INTERFACES - idTable->interfaceLength); serviceInfo.devNum = infoTable->devNum; serviceInfo.busNum = infoTable->busNum; serviceInfo.interfaceLength = idTable->interfaceLength; @@ -715,7 +794,7 @@ static int UsbDdkPnpLoaderrAddPnpDevice(const struct IDevmgrService *devmgrSvc, goto ERROR; } - ret = UsbDdkPnpLoaderDispatchPnpDevice(devmgrSvc, pnpData, true); + ret = UsbDdkPnpLoaderDispatchPnpDevice(usbPnpManagerDevice, pnpData, true); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:%d handle failed, %s-%s cmdId is %d, ret=%d", __func__, __LINE__, idTable->moduleName, idTable->serviceName, cmdId, ret); @@ -740,7 +819,7 @@ ERROR: return ret; } -static void UsbDdkPnpLoaderAddDevice(uint32_t cmdId, uint8_t index, const struct IDevmgrService *devmgrSvc, +static void UsbDdkPnpLoaderAddDevice(uint32_t cmdId, uint8_t index, struct HdfDeviceObject *usbPnpManagerDevice, const struct UsbPnpNotifyMatchInfoTable *infoTable, struct UsbPnpMatchIdTable **matchIdTable) { int ret; @@ -760,14 +839,14 @@ static void UsbDdkPnpLoaderAddDevice(uint32_t cmdId, uint8_t index, const struct idTable=%p, moduleName=%s, serviceName=%s", __func__, __LINE__, index, tableCount, idTable, idTable->moduleName, idTable->serviceName); - ret = UsbDdkPnpLoaderrAddPnpDevice(devmgrSvc, infoTable, idTable, cmdId); + ret = UsbDdkPnpLoaderrAddPnpDevice(usbPnpManagerDevice, infoTable, idTable, cmdId); if (ret != HDF_SUCCESS) { continue; } } } -static int UsbDdkPnpLoaderRemoveHandle(const struct IDevmgrService *devmgrSvc, +static int UsbDdkPnpLoaderRemoveHandle(struct HdfDeviceObject *usbPnpManager, struct UsbPnpDeviceListTable *deviceListTablePos) { struct UsbPnpNotifyServiceInfo serviceInfo; @@ -789,7 +868,7 @@ static int UsbDdkPnpLoaderRemoveHandle(const struct IDevmgrService *devmgrSvc, } if (deviceListTablePos->status != USB_PNP_REMOVE_STATUS) { - ret = UsbDdkPnpLoaderDispatchPnpDevice(devmgrSvc, pnpData, false); + ret = UsbDdkPnpLoaderDispatchPnpDevice(usbPnpManager, pnpData, false); if (ret != HDF_SUCCESS) { HDF_LOGE("%s:%d UsbDdkPnpLoaderDispatchPnpDevice faile ret=%d", __func__, __LINE__, ret); @@ -803,7 +882,7 @@ ERROR: return ret; } -static int UsbDdkPnpLoaderRemoveDevice(const struct IDevmgrService *devmgrSvc, +static int UsbDdkPnpLoaderRemoveDevice(struct HdfDeviceObject *usbPnpManager, struct UsbPnpRemoveInfo removeInfo, uint32_t cmdId) { int ret = HDF_SUCCESS; @@ -833,7 +912,7 @@ static int UsbDdkPnpLoaderRemoveDevice(const struct IDevmgrService *devmgrSvc, } findFlag = true; - ret = UsbDdkPnpLoaderRemoveHandle(devmgrSvc, deviceListTablePos); + ret = UsbDdkPnpLoaderRemoveHandle(usbPnpManager, deviceListTablePos); if (ret != HDF_SUCCESS) { break; } @@ -855,8 +934,8 @@ static int UsbDdkPnpLoaderRemoveDevice(const struct IDevmgrService *devmgrSvc, return ret; } -static int UsbDdkPnpLoaderDevice(const struct UsbPnpNotifyMatchInfoTable *infoTable, - const struct IDevmgrService *super, uint32_t id) +static int UsbDdkPnpLoaderDevice(struct HdfDeviceObject *usbPnpManagerDevice, + const struct UsbPnpNotifyMatchInfoTable *infoTable, uint32_t id) { int8_t i; int32_t tableCount; @@ -868,7 +947,7 @@ static int UsbDdkPnpLoaderDevice(const struct UsbPnpNotifyMatchInfoTable *infoTa } for (i = 0; i < infoTable->numInfos; i++) { - UsbDdkPnpLoaderAddDevice(id, i, super, infoTable, g_usbPnpMatchIdTable); + UsbDdkPnpLoaderAddDevice(id, i, usbPnpManagerDevice, infoTable, g_usbPnpMatchIdTable); } for (tableCount = 0, idTable = g_usbPnpMatchIdTable[0]; idTable != NULL; @@ -942,14 +1021,14 @@ OUT: return ret; } -int UsbDdkPnpLoaderEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) +int UsbDdkPnpLoaderEventReceived(void *usbPnpManagerPtr, uint32_t id, struct HdfSBuf *data) { int ret; bool flag = false; uint32_t infoSize; struct UsbPnpNotifyMatchInfoTable *infoTable = NULL; - struct IDevmgrService *super = (struct IDevmgrService *)priv; struct UsbPnpRemoveInfo removeInfo; + struct HdfDeviceObject *usbPnpManagerDevice = (struct HdfDeviceObject *)usbPnpManagerPtr; flag = HdfSbufReadBuffer(data, (const void **)(&infoTable), &infoSize); if ((flag == false) || (infoTable == NULL)) { @@ -971,7 +1050,7 @@ int UsbDdkPnpLoaderEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) #if USB_PNP_NOTIFY_TEST_MODE == true case USB_PNP_NOTIFY_ADD_TEST: #endif - ret = UsbDdkPnpLoaderDevice(infoTable, super, id); + ret = UsbDdkPnpLoaderDevice(usbPnpManagerDevice, infoTable, id); break; case USB_PNP_NOTIFY_REMOVE_INTERFACE: case USB_PNP_NOTIFY_REMOVE_DEVICE: @@ -983,7 +1062,7 @@ int UsbDdkPnpLoaderEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) removeInfo.devNum = infoTable->devNum; removeInfo.busNum = infoTable->busNum; removeInfo.interfaceNum = infoTable->interfaceInfo[0].interfaceNumber; - ret = UsbDdkPnpLoaderRemoveDevice(super, removeInfo, id); + ret = UsbDdkPnpLoaderRemoveDevice(usbPnpManagerDevice, removeInfo, id); break; default: ret = HDF_ERR_INVALID_PARAM; diff --git a/test/unittest/manager/sample_driver_test.c b/test/unittest/manager/sample_driver_test.c index 9ea1434bf..b0a696993 100644 --- a/test/unittest/manager/sample_driver_test.c +++ b/test/unittest/manager/sample_driver_test.c @@ -6,11 +6,12 @@ * See the LICENSE file in the root of this repository for complete details. */ #include "sample_driver_test.h" -#include "devsvc_manager_clnt.h" #include "devmgr_service.h" +#include "devsvc_manager_clnt.h" +#include "hdf_device_object.h" #include "hdf_log.h" -#include "hdf_device_desc.h" #include "hdf_pm.h" +#include "osal_mem.h" #define HDF_LOG_TAG sample_driver_test @@ -18,17 +19,58 @@ #define INT32_MAX 0x7fffffff #endif +struct SampleTestDevice { + struct DListHead listNode; + struct HdfDeviceObject *devobj; +}; + +struct DListHead g_sampleDeviceList = { NULL }; + +#define REGISTER_DEV_MAX 16 +struct HdfDeviceObject *g_resistedDevice[REGISTER_DEV_MAX] = { 0 }; + +static void SaveRegistedDevice(struct SampleTestDevice *sampleDev) +{ + if (g_sampleDeviceList.next == NULL) { + DListHeadInit(&g_sampleDeviceList); + } + DListInsertTail(&sampleDev->listNode, &g_sampleDeviceList); +} + +struct SampleTestDevice *GetRegistedDevice(const char *serviceName) +{ + struct SampleTestDevice *sampleDev = NULL; + struct SampleTestDevice *sampleDevTmp = NULL; + DLIST_FOR_EACH_ENTRY_SAFE(sampleDev, sampleDevTmp, &g_sampleDeviceList, struct SampleTestDevice, listNode) { + if (sampleDev->devobj == NULL || HdfDeviceGetServiceName(sampleDev->devobj) == NULL) { + DListRemove(&sampleDev->listNode); + OsalMemFree(sampleDev); + continue; + } + + if (strcmp(HdfDeviceGetServiceName(sampleDev->devobj), serviceName) == 0) { + return sampleDev; + } + } + + return NULL; +} + void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) { (void)deviceObject; return; } -int32_t SampleDriverRegisterDevice(struct HdfSBuf *data) +int32_t SampleDriverRegisterDevice(struct HdfDeviceObject *dev, struct HdfSBuf *data) { const char *moduleName = NULL; const char *serviceName = NULL; struct HdfDeviceObject *devObj = NULL; + struct SampleTestDevice *sampleDev = NULL; + int ret; + + HDF_LOGI("%s:called", __func__); if (data == NULL) { return HDF_FAILURE; } @@ -42,17 +84,42 @@ int32_t SampleDriverRegisterDevice(struct HdfSBuf *data) return HDF_FAILURE; } - devObj = HdfRegisterDevice(moduleName, serviceName, NULL); + devObj = HdfDeviceObjectAlloc(dev, moduleName); if (devObj == NULL) { + HDF_LOGE("faild to alloc new device for %s", moduleName); return HDF_FAILURE; } - return HDF_SUCCESS; + + ret = HdfDeviceObjectRegister(devObj); + if (ret != HDF_SUCCESS) { + HDF_LOGE("faild to register device for %s", moduleName); + HdfDeviceObjectRelease(devObj); + return HDF_FAILURE; + } + + ret = HdfDeviceObjectPublishService(devObj, serviceName, SERVICE_POLICY_CAPACITY, 0664); + if (ret != HDF_SUCCESS) { + HDF_LOGE("faild to publish service for %s", serviceName); + HdfDeviceObjectRelease(devObj); + return ret; + } + + sampleDev = OsalMemAlloc(sizeof(struct SampleTestDevice)); + if (sampleDev == NULL) { + HdfDeviceObjectRelease(devObj); + return HDF_ERR_MALLOC_FAIL; + } + sampleDev->devobj = devObj; + SaveRegistedDevice(sampleDev); + HDF_LOGI("register device %s:%s success", moduleName, serviceName); + return ret; } int32_t SampleDriverUnregisterDevice(struct HdfSBuf *data) { const char *moduleName = NULL; const char *serviceName = NULL; + struct SampleTestDevice *dev = NULL; if (data == NULL) { return HDF_FAILURE; } @@ -65,7 +132,15 @@ int32_t SampleDriverUnregisterDevice(struct HdfSBuf *data) if (serviceName == NULL) { return HDF_FAILURE; } - HdfUnregisterDevice(moduleName, serviceName); + dev = GetRegistedDevice(serviceName); + if (dev == NULL) { + HDF_LOGE("failed to found device %s", serviceName); + return HDF_DEV_ERR_NO_DEVICE; + } + HdfDeviceObjectRelease(dev->devobj); + DListRemove(&dev->listNode); + OsalMemFree(dev); + HDF_LOGI("unregister device %s:%s success", moduleName, serviceName); return HDF_SUCCESS; } @@ -96,7 +171,7 @@ int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct } switch (cmdId) { case SAMPLE_DRIVER_REGISTER_DEVICE: { - ret = SampleDriverRegisterDevice(data); + ret = SampleDriverRegisterDevice(client->device, data); HdfSbufWriteInt32(reply, ret); break; } @@ -105,7 +180,7 @@ int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSbufWriteInt32(reply, ret); break; case SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE: - ret = SampleDriverSendEvent(client, cmdId, data, false); + ret = SampleDriverSendEvent(client, cmdId, data, false); HdfSbufWriteInt32(reply, INT32_MAX); break; case SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE: @@ -169,7 +244,7 @@ struct SampleDriverPmListener { int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) { - static struct SampleDriverPmListener pmListener = {0}; + static struct SampleDriverPmListener pmListener = { 0 }; int ret; HDF_LOGI("%s::enter!", __func__); if (deviceObject == NULL) { @@ -189,7 +264,6 @@ int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) return HDF_SUCCESS; } - struct HdfDriverEntry g_sampleDriverEntry = { .moduleVersion = 1, .moduleName = "sample_driver", diff --git a/utils/src/hcs_parser/hcs_buildin_parser.c b/utils/src/hcs_parser/hcs_buildin_parser.c new file mode 100644 index 000000000..b0bc91c48 --- /dev/null +++ b/utils/src/hcs_parser/hcs_buildin_parser.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hcs_parser.h" +#include "hcs_blob_if.h" +#include "hcs_generate_tree.h" +#include "hdf_log.h" +#include "osal_mem.h" + +#define HDF_LOG_TAG hcs_parser + +#include "hcs_blob_if.h" +#include "hcs_parser.h" +#include "hcs_tree_if.h" +#include "hdf_base.h" +#include "hdf_log.h" + +static struct DeviceResourceNode *g_hcsTreeRoot = NULL; + +void __attribute__((weak)) HdfGetBuildInConfigData(const unsigned char **data, unsigned int *size); + +static bool BuildHcsTree(void) +{ + uint32_t length; + const unsigned char *hcsBlob = NULL; + if (HdfGetBuildInConfigData == NULL) { + HDF_LOGE("no build-in hdf config"); + return false; + } + HdfGetBuildInConfigData(&hcsBlob, &length); + if (!HcsCheckBlobFormat((const char *)hcsBlob, length)) { + return false; + } + if (!HcsDecompile((const char *)hcsBlob, HBC_HEADER_LENGTH, &g_hcsTreeRoot)) { + return false; + } + return true; +} + +const struct DeviceResourceNode *HcsGetRootNode(void) +{ + if (g_hcsTreeRoot == NULL && !BuildHcsTree()) { + HDF_LOGE("failed to rebuild config tree"); + return NULL; + } + + if (g_hcsTreeRoot == NULL) { + HDF_LOGE("failed to get build-in hcs root node"); + } + return g_hcsTreeRoot; +} \ No newline at end of file diff --git a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp index e3c0d23e1..1a5df911c 100644 --- a/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp +++ b/utils/src/hcs_parser/test/unittest/common/hdf_config_test.cpp @@ -767,4 +767,5 @@ HWTEST_F(HdfConfigTest, HslTestMacroTraversalOneFile, TestSize.Level1) printf("HdfConfigTest last enter\n\r"); EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); } + }; diff --git a/utils/src/hdf_slist.c b/utils/src/hdf_slist.c index e74bd864f..7780110ab 100644 --- a/utils/src/hdf_slist.c +++ b/utils/src/hdf_slist.c @@ -225,7 +225,7 @@ bool HdfSListIteratorHasNext(struct HdfSListIterator *iterator) struct HdfSListNode *HdfSListIteratorNext(struct HdfSListIterator *iterator) { - if ((iterator == NULL) || (iterator->curr == NULL) || (iterator->prev == NULL)) { + if (iterator == NULL || iterator->curr == NULL || iterator->prev == NULL) { return NULL; } @@ -246,7 +246,7 @@ struct HdfSListNode *HdfSListIteratorNext(struct HdfSListIterator *iterator) void HdfSListIteratorRemove(struct HdfSListIterator *iterator) { - if ((iterator == NULL) || (iterator->curr == NULL) || (iterator->prev == NULL)) { + if (iterator == NULL || iterator->curr == NULL || iterator->prev == NULL) { return; } -- Gitee From f359213dd04332063087f9cc0e2d39c74b5b2405 Mon Sep 17 00:00:00 2001 From: chenchong Date: Mon, 29 Nov 2021 20:31:58 +0800 Subject: [PATCH 214/272] modify_code Signed-off-by: chenchong --- model/sensor/driver/als/sensor_als_driver.c | 151 +++++++++++++++++- model/sensor/driver/als/sensor_als_driver.h | 27 +++- model/sensor/driver/chipset/als/als_bh1745.c | 138 ++++++++++++++-- model/sensor/driver/chipset/als/als_bh1745.h | 57 +++++++ .../common/include/sensor_config_controller.h | 5 +- .../common/include/sensor_config_parser.h | 3 + .../common/src/sensor_config_controller.c | 43 +++++ .../driver/common/src/sensor_config_parser.c | 2 +- 8 files changed, 409 insertions(+), 17 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c index e2b1c3f95..4459bfa87 100755 --- a/model/sensor/driver/als/sensor_als_driver.c +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -27,6 +27,139 @@ static struct AlsDrvData *AlsGetDrvData(void) } static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; +static struct SensorRegCfgGroupNode *g_extendAlsRegCfgGroup[EXTENDED_ALS_GROUP_MAX] = { NULL }; +static char *g_extendedAlsGroupName[EXTENDED_ALS_GROUP_MAX] = { + "time", + "gain", +}; + +int32_t GetTimeByRegValue(uint8_t regValue, struct TimeMap *table, int32_t itemNum) +{ + int i; + + CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); + + for (i = 0; i < itemNum; i++) { + if (regValue == table[i].timeRegValue) { + return table[i].timeValue; + } + } + return HDF_FAILURE; +} + +int32_t GetRegValueByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum) +{ + int i; + + CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); + + for (i = 0; i < itemNum; i++) { + if (timeValue == table[i].timeValue) { + return table[i].timeRegValue; + } + } + return HDF_FAILURE; +} + +int32_t GetRegGroupIndexByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum) +{ + int i; + + CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); + + for (i = 0; i < itemNum; i++) { + if (timeValue == table[i].timeValue) { + return i; + } + } + return HDF_FAILURE; +} + +int32_t GetGainByRegValue(uint8_t regValue, struct GainMap *table, int32_t itemNum) +{ + int i; + + CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); + + for (i = 0; i < itemNum; i++) { + if (regValue == table[i].gainRegValue) { + return table[i].gainValue; + } + } + return HDF_FAILURE; +} + +static uint32_t GetExtendedAlsRegGroupNameIndex(const char *name) +{ + uint32_t index; + + CHECK_NULL_PTR_RETURN_VALUE(name, EXTENDED_ALS_GROUP_MAX); + + for (index = 0; index < EXTENDED_ALS_GROUP_MAX; ++index) { + if ((g_extendedAlsGroupName[index] != NULL) && (strcmp(name, g_extendedAlsGroupName[index]) == 0)) { + break; + } + } + + return index; +} + +void ReleaseExtendedAlsRegConfig(struct SensorCfgData *config) +{ + int32_t index; + + CHECK_NULL_PTR_RETURN(config); + CHECK_NULL_PTR_RETURN(config->extendedRegCfgGroup); + + for (index = 0; index < EXTENDED_ALS_GROUP_MAX; ++index) { + if (config->extendedRegCfgGroup[index] != NULL) { + if (config->extendedRegCfgGroup[index]->regCfgItem != NULL) { + OsalMemFree(config->extendedRegCfgGroup[index]->regCfgItem); + config->extendedRegCfgGroup[index]->regCfgItem = NULL; + } + OsalMemFree(config->extendedRegCfgGroup[index]); + config->extendedRegCfgGroup[index] = NULL; + } + } +} + +int32_t ParseExtendedAlsRegConfig(struct SensorCfgData *config) +{ + int32_t index; + struct DeviceResourceIface *parser = NULL; + const struct DeviceResourceNode *extendedRegCfgNode = NULL; + const struct DeviceResourceAttr *extendedRegAttr = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(config->root, HDF_ERR_INVALID_PARAM); + parser = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + CHECK_NULL_PTR_RETURN_VALUE(parser, HDF_ERR_INVALID_PARAM); + + extendedRegCfgNode = parser->GetChildNode(config->root, "extendAlsRegConfig"); + CHECK_NULL_PTR_RETURN_VALUE(extendedRegCfgNode, HDF_ERR_INVALID_PARAM); + + DEV_RES_NODE_FOR_EACH_ATTR(extendedRegCfgNode, extendedRegAttr) { + if (extendedRegAttr == NULL || extendedRegAttr->name == NULL) { + HDF_LOGE("%s:sensor reg node attr is null", __func__); + break; + } + index = GetExtendedAlsRegGroupNameIndex(extendedRegAttr->name); + if (index >= EXTENDED_ALS_GROUP_MAX) { + HDF_LOGE("%s: get sensor register group index failed", __func__); + goto ERROR; + } + + if (ParseSensorRegGroup(parser, extendedRegCfgNode, extendedRegAttr->name, &config->extendedRegCfgGroup[index]) != HDF_SUCCESS) { + HDF_LOGE("%s: parse sensor register group failed", __func__); + goto ERROR; + } + } + return HDF_SUCCESS; + +ERROR: + ReleaseExtendedAlsRegConfig(config); + HDF_LOGE("%s: parse sensor extend register config failed", __func__); + return HDF_FAILURE; +} int32_t AlsRegisterChipOps(const struct AlsOpsCall *ops) { @@ -247,12 +380,22 @@ static int32_t InitAlsAfterDetected(struct SensorCfgData *config) if (ParseSensorRegConfig(config) != HDF_SUCCESS) { HDF_LOGE("%s: Parse sensor register failed", __func__); - (void)DeleteSensorDevice(&config->sensorInfo); - ReleaseSensorAllRegConfig(config); - return HDF_FAILURE; + goto SENSOR_REG_CONFIG_EXIT; + } + + if (ParseExtendedAlsRegConfig(config) != HDF_SUCCESS) { + HDF_LOGE("%s: Parse sensor extendedRegCfgGroup register failed", __func__); + goto EXTENDED_ALS_REG_CONFIG_EXIT; } return HDF_SUCCESS; + +EXTENDED_ALS_REG_CONFIG_EXIT: + ReleaseSensorAllRegConfig(config); +SENSOR_REG_CONFIG_EXIT: + (void)DeleteSensorDevice(&config->sensorInfo); + + return HDF_FAILURE; } struct SensorCfgData *AlsCreateCfgData(const struct DeviceResourceNode *node) @@ -309,6 +452,7 @@ void AlsReleaseCfgData(struct SensorCfgData *alsCfg) (void)DeleteSensorDevice(&alsCfg->sensorInfo); ReleaseSensorAllRegConfig(alsCfg); + ReleaseExtendedAlsRegConfig(alsCfg); (void)ReleaseSensorBusHandle(&alsCfg->busCfg); alsCfg->root = NULL; @@ -335,6 +479,7 @@ int32_t AlsInitDriver(struct HdfDeviceObject *device) } drvData->alsCfg->regCfgGroup = &g_regCfgGroup[0]; + drvData->alsCfg->extendedRegCfgGroup = &g_extendAlsRegCfgGroup[0]; return HDF_SUCCESS; } diff --git a/model/sensor/driver/als/sensor_als_driver.h b/model/sensor/driver/als/sensor_als_driver.h index 3ca5d7d37..6f02f9f15 100755 --- a/model/sensor/driver/als/sensor_als_driver.h +++ b/model/sensor/driver/als/sensor_als_driver.h @@ -17,6 +17,12 @@ #define ALS_DEFAULT_SAMPLING_200_MS 200000000 #define ALS_CHIP_NAME_BH1745 "bh1745" +enum ExtendedAlsRegGroupType { + EXTENDED_ALS_TIME_GROUP = 0, + EXTENDED_ALS_GAIN_GROUP, + EXTENDED_ALS_GROUP_MAX, +}; + enum AlsLightNum { ALS_R = 0, ALS_G = 1, @@ -37,6 +43,22 @@ enum AlsLightPart { ALS_LIGHT_BUTT = 8, }; +struct AlsReportData { + int32_t als; + int32_t cct; + int32_t irData; +}; + +struct TimeMap { + uint8_t timeRegValue; + uint32_t timeValue; +}; + +struct GainMap { + uint8_t gainRegValue; + uint32_t gainValue; +}; + struct AlsData { int32_t red; int32_t green; @@ -65,5 +87,8 @@ struct AlsDrvData { int32_t AlsRegisterChipOps(const struct AlsOpsCall *ops); struct SensorCfgData *AlsCreateCfgData(const struct DeviceResourceNode *node); void AlsReleaseCfgData(struct SensorCfgData *sensorCfgData); - +int32_t GetTimeByRegValue(uint8_t regValue, struct TimeMap *table, int32_t itemNum); +int32_t GetRegValueByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum); +int32_t GetRegGroupIndexByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum); +int32_t GetGainByRegValue(uint8_t regValue, struct GainMap *table, int32_t itemNum); #endif /* SENSOR_ALS_DRIVER_H */ diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index 2832402e4..12b8967fe 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -14,17 +14,131 @@ #include "sensor_config_controller.h" #include "sensor_device_manager.h" +/* IO config for int-pin and I2C-pin */ +#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c +#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 +#define SENSOR_I2C_REG_CFG 0x403 + static struct Bh1745DrvData *g_bh1745DrvData = NULL; +static uint32_t g_timeMap_flag = 1; + +static struct TimeMap g_timeMap[EXTENDED_ALS_TIME_GROUP_INDEX_MAX] = { + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_0, BH1745_TIME_160MSEC }, + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_1, BH1745_TIME_320MSEC }, + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_2, BH1745_TIME_640MSEC }, + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_3, BH1745_TIME_1280MSEC }, + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_4, BH1745_TIME_2560MSEC }, + { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_5, BH1745_TIME_5120MSEC } +}; +static struct GainMap g_gainMap[EXTENDED_ALS_GAIN_GROUP_INDEX_MAX] = { + { EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_0, BH1745_GAIN_1X }, + { EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_1, BH1745_GAIN_2X }, + { EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_2, BH1745_GAIN_16X } +}; + +static uint32_t g_red[BH1745_COEFFICIENT_RED] = { + BH1745_COEFFICIENT_RED_LEVEL_0, + BH1745_COEFFICIENT_RED_LEVEL_1 +}; + +static uint32_t g_green[BH1745_COEFFICIENT_GREEN] = { + BH1745_COEFFICIENT_GREEN_LEVEL_0, + BH1745_COEFFICIENT_GREEN_LEVEL_1 +}; struct Bh1745DrvData *Bh1745GetDrvData(void) { return g_bh1745DrvData; } -/* IO config for int-pin and I2C-pin */ -#define SENSOR_I2C6_DATA_REG_ADDR 0x114f004c -#define SENSOR_I2C6_CLK_REG_ADDR 0x114f0048 -#define SENSOR_I2C_REG_CFG 0x403 +static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcData) +{ + uint8_t regValue; + uint32_t temp; + uint8_t timeItemNum; + struct SensorRegCfgGroupNode *timeGroupNode = NULL; + int32_t index = EXTENDED_ALS_TIME_GROUP_INDEX_0; + + timeGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_TIME_GROUP]; + timeItemNum = timeGroupNode->itemNum; + + ReadSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, ®Value, sizeof(uint8_t)); + regValue &= timeGroupNode->regCfgItem->mask; + + temp = GetTimeByRegValue(regValue, g_timeMap, timeItemNum); + index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); + if (index < 0) { + HDF_LOGE("%s: Index out of range ", __func__); + return HDF_FAILURE; + } + + if ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX + || rgbcData[ALS_G] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX ) && temp >= BH1745_TIME_320MSEC) { + g_timeMap_flag = 1; + index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); + index--; + WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); + } else if ((g_timeMap_flag == 1) && ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN) + || (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { + g_timeMap_flag = 0; + index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); + index++; + if (index >= timeItemNum) { + HDF_LOGE("%s: Index out of range ", __func__); + return HDF_FAILURE; + } + WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); + } + return HDF_SUCCESS; +} + +static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) +{ + uint32_t timeTemp; + uint32_t gainTemp; + uint8_t timeRegValue; + uint8_t gainRegvalue; + uint32_t index = 1; + uint32_t luxTemp; + uint8_t timeItemNum; + uint8_t gainItemNum; + struct SensorRegCfgGroupNode *timeGroupNode = NULL; + struct SensorRegCfgGroupNode *gainGroupNode = NULL; + int32_t timeIndex = EXTENDED_ALS_TIME_GROUP_INDEX_0; + int32_t gainIndex = EXTENDED_ALS_GAIN_GROUP_INDEX_0; + + if (rgbcData[ALS_G] < 1) { + return 0; + } + + if (BH1745_MULTIPLE_100 * rgbcData[ALS_C] / rgbcData[ALS_G] < BH1745_COEFFICIENT_JUDGE) { + index = 0; + } + + luxTemp = g_red[index] * rgbcData[ALS_R] + g_green[index] * rgbcData[ALS_G]; + timeGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_TIME_GROUP]; + timeItemNum = timeGroupNode->itemNum; + gainGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_GAIN_GROUP]; + gainItemNum = gainGroupNode->itemNum; + + ReadSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, timeIndex, &timeRegValue, sizeof(uint8_t)); + timeRegValue &= timeGroupNode->regCfgItem->mask; + timeTemp = GetTimeByRegValue(timeRegValue, g_timeMap, timeItemNum); + + ReadSensorRegCfgArray(&CfgData->busCfg, gainGroupNode, gainIndex, &gainRegvalue, sizeof(uint8_t)); + gainRegvalue &= gainGroupNode->regCfgItem->mask; + gainTemp = GetGainByRegValue(gainRegvalue, g_gainMap, gainItemNum); + + return (((luxTemp * BH1745_TIME_160MSEC * BH1745_GAIN_16X) / gainTemp) / timeTemp); +} + + static int32_t RawDataConvert(struct SensorCfgData *CfgData, struct AlsReportData *reportData, uint32_t* rgbcData) + { + reportData->als = (uint32_t)CalLux(CfgData, rgbcData); + reportData->als = (reportData->als > 0) ? reportData->als : 0; + DynamicRangCovert(CfgData, rgbcData); + return HDF_SUCCESS; + } static int32_t ReadBh1745RawData(struct SensorCfgData *data, struct AlsData *rawData, int64_t *timestamp) { @@ -73,13 +187,13 @@ static int32_t ReadBh1745RawData(struct SensorCfgData *data, struct AlsData *raw ret = ReadSensor(&data->busCfg, BH1745_ALS_C_MSB_ADDR, ®[ALS_C_MSB], sizeof(uint8_t)); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read data"); - rawData->red = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_R_MSB], SENSOR_DATA_WIDTH_8_BIT) | + rawData->red = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_R_MSB], SENSOR_DATA_WIDTH_8_BIT) | reg[ALS_R_LSB]); - rawData->green = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_G_MSB], SENSOR_DATA_WIDTH_8_BIT) | + rawData->green = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_G_MSB], SENSOR_DATA_WIDTH_8_BIT) | reg[ALS_G_LSB]); - rawData->blue = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_B_MSB], SENSOR_DATA_WIDTH_8_BIT) | + rawData->blue = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_B_MSB], SENSOR_DATA_WIDTH_8_BIT) | reg[ALS_B_LSB]); - rawData->clear = (int16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_C_MSB], SENSOR_DATA_WIDTH_8_BIT) | + rawData->clear = (uint16_t)(SENSOR_DATA_SHIFT_LEFT(reg[ALS_C_MSB], SENSOR_DATA_WIDTH_8_BIT) | reg[ALS_C_LSB]); return HDF_SUCCESS; @@ -89,8 +203,9 @@ int32_t ReadBh1745Data(struct SensorCfgData *data) { int32_t ret; struct AlsData rawData = { 0, 0, 0, 0 }; - int32_t tmp[ALS_LIGHT_NUM]; + uint32_t tmp[ALS_LIGHT_NUM]; struct SensorReportEvent event; + struct AlsReportData reportData; (void)memset_s(&event, sizeof(event), 0, sizeof(event)); ret = ReadBh1745RawData(data, &rawData, &event.timestamp); @@ -108,8 +223,9 @@ int32_t ReadBh1745Data(struct SensorCfgData *data) tmp[ALS_B] = rawData.blue; tmp[ALS_C] = rawData.clear; - event.dataLen = sizeof(tmp); - event.data = (uint8_t *)&tmp; + RawDataConvert(data, &reportData, tmp); + event.dataLen = sizeof(reportData.als); + event.data = (uint8_t *)&reportData.als; ret = ReportSensorEvent(&event); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: BH1745 report data failed", __func__); diff --git a/model/sensor/driver/chipset/als/als_bh1745.h b/model/sensor/driver/chipset/als/als_bh1745.h index 41ac6de46..a6040d4ee 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.h +++ b/model/sensor/driver/chipset/als/als_bh1745.h @@ -26,6 +26,63 @@ /* ALS DATA READY */ #define BH1745_ALS_DATA_READY_MASK 0X02 +/* ALS MULTIPLE */ +#define BH1745_MULTIPLE_100 100 + +/* ALS COEFFICIENT */ +#define BH1745_COEFFICIENT_RED 2 +#define BH1745_COEFFICIENT_GREEN 2 +#define BH1745_COEFFICIENT_RED_LEVEL_0 77300 //7.73 * 10000 +#define BH1745_COEFFICIENT_RED_LEVEL_1 92715 //9.2715 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_0 131920 //1.3192 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_1 214770 //2.1477 * 10000 +#define BH1745_COEFFICIENT_JUDGE 78 //0.78*100 + +/* ALS TIME */ +#define BH1745_TIME_160MSEC 160 +#define BH1745_TIME_320MSEC 320 +#define BH1745_TIME_640MSEC 640 +#define BH1745_TIME_1280MSEC 1280 +#define BH1745_TIME_2560MSEC 2560 +#define BH1745_TIME_5120MSEC 5120 +#define BH1745_TIME_MAX 5570475 //65535*0.85*100 +#define BH1745_TIME_MIN 1638375 //65535*0.25*100 + +/* ALS GAIN */ +#define BH1745_GAIN_1X 1 +#define BH1745_GAIN_2X 2 +#define BH1745_GAIN_16X 16 + +/* ALS TIME REG VALUE */ +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_0 0x00 +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_1 0x01 +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_2 0x02 +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_3 0x03 +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_4 0x04 +#define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_5 0x05 + +/* ALS GAIN REG VALUE */ +#define EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_0 0x00 +#define EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_1 0x01 +#define EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_2 0x02 + +enum ExtendedAlsTimeRegGroupIdex { + EXTENDED_ALS_TIME_GROUP_INDEX_0 = 0, + EXTENDED_ALS_TIME_GROUP_INDEX_1, + EXTENDED_ALS_TIME_GROUP_INDEX_2, + EXTENDED_ALS_TIME_GROUP_INDEX_3, + EXTENDED_ALS_TIME_GROUP_INDEX_4, + EXTENDED_ALS_TIME_GROUP_INDEX_5, + EXTENDED_ALS_TIME_GROUP_INDEX_MAX, +}; + +enum ExtendedAlsGainRegGroupIdex { + EXTENDED_ALS_GAIN_GROUP_INDEX_0 = 0, + EXTENDED_ALS_GAIN_GROUP_INDEX_1, + EXTENDED_ALS_GAIN_GROUP_INDEX_2, + EXTENDED_ALS_GAIN_GROUP_INDEX_MAX, +}; + int32_t DetectAlsBim160Chip(struct SensorCfgData *data); int32_t ReadBh1745Data(struct SensorCfgData *data); diff --git a/model/sensor/driver/common/include/sensor_config_controller.h b/model/sensor/driver/common/include/sensor_config_controller.h index 9c3bc36ae..00f0ff4db 100644 --- a/model/sensor/driver/common/include/sensor_config_controller.h +++ b/model/sensor/driver/common/include/sensor_config_controller.h @@ -39,5 +39,8 @@ struct SensorOpsCall { int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group); int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len); - +int32_t ReadSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + int32_t index, uint8_t *buf, int32_t len); +int32_t WriteSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + int32_t index, int32_t len); #endif /* SENSOR_CONFIG_CONTROLLER_H */ \ No newline at end of file diff --git a/model/sensor/driver/common/include/sensor_config_parser.h b/model/sensor/driver/common/include/sensor_config_parser.h index cb3af1bfc..127add386 100644 --- a/model/sensor/driver/common/include/sensor_config_parser.h +++ b/model/sensor/driver/common/include/sensor_config_parser.h @@ -94,6 +94,7 @@ struct SensorCfgData { struct SensorBasicInfo sensorInfo; struct SensorAttr sensorAttr; struct SensorRegCfgGroupNode **regCfgGroup; + struct SensorRegCfgGroupNode **extendedRegCfgGroup; const struct DeviceResourceNode *root; struct SensorDirection *direction; }; @@ -107,5 +108,7 @@ int32_t DetectSensorDevice(struct SensorCfgData *config); int32_t SensorRawDataToRemapData(struct SensorDirection *direction, int32_t *remapData, uint32_t num); void ReleaseSensorDirectionConfig(struct SensorCfgData *config); int32_t ParseSensorDirection(struct SensorCfgData *config); +int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode, + const char *groupName, struct SensorRegCfgGroupNode **groupNode); #endif /* SENSOR_CONFIG_PARSER_H */ diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 24e09ac92..477731767 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -285,5 +285,48 @@ int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct Sen num++; } + return HDF_SUCCESS; +} + +int32_t ReadSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + int32_t index, uint8_t *buf, int32_t len) +{ + int32_t ret; + struct SensorRegCfg *cfgItem = NULL; + + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_FAILURE); + + if ((index >= group->itemNum) || index < 0) { + HDF_LOGE("%s: Index is invalid parameter", __func__); + return HDF_FAILURE; + } + + cfgItem = group->regCfgItem + index; + len = (cfgItem->len > len) ? len : cfgItem->len; + ret = ReadSensor(busCfg, cfgItem->regAddr, buf, len); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); + + return HDF_SUCCESS; +} + +int32_t WriteSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + int32_t index, int32_t len) +{ + struct SensorRegCfg *cfgItem = NULL; + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group, HDF_FAILURE); + CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_FAILURE); + + if ((index >= group->itemNum) || index < 0) { + HDF_LOGE("%s: Index is invalid parameter", __func__); + return HDF_FAILURE; + } + + cfgItem = group->regCfgItem + index; + int32_t ret = SensorOpsUpdateBitwise(busCfg, cfgItem); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "Write i2c reg"); + return HDF_SUCCESS; } \ No newline at end of file diff --git a/model/sensor/driver/common/src/sensor_config_parser.c b/model/sensor/driver/common/src/sensor_config_parser.c index 051aba20d..a5c52e0bd 100644 --- a/model/sensor/driver/common/src/sensor_config_parser.c +++ b/model/sensor/driver/common/src/sensor_config_parser.c @@ -107,7 +107,7 @@ static int32_t ParseSensorRegItem(struct DeviceResourceIface *parser, const stru return HDF_SUCCESS; } -static int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode, +int32_t ParseSensorRegGroup(struct DeviceResourceIface *parser, const struct DeviceResourceNode *regCfgNode, const char *groupName, struct SensorRegCfgGroupNode **groupNode) { int32_t num; -- Gitee From 00289a3dc5f7f92ad3f4d3f4655aa30624d5fb50 Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 30 Nov 2021 15:28:18 +0800 Subject: [PATCH 215/272] modify_code Signed-off-by: chenchong --- .../common/include/sensor_config_controller.h | 3 ++- .../common/src/sensor_config_controller.c | 20 +++++++++---------- model/sensor/driver/hall/sensor_hall_driver.c | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/model/sensor/driver/common/include/sensor_config_controller.h b/model/sensor/driver/common/include/sensor_config_controller.h index 00f0ff4db..07165e197 100644 --- a/model/sensor/driver/common/include/sensor_config_controller.h +++ b/model/sensor/driver/common/include/sensor_config_controller.h @@ -38,7 +38,8 @@ struct SensorOpsCall { }; int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group); -int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len); +int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + uint8_t *buff, int16_t len); int32_t ReadSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, int32_t index, uint8_t *buf, int32_t len); int32_t WriteSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 477731767..414ee69b8 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -53,9 +53,9 @@ static uint32_t GetSensorRegRealValueMask(struct SensorRegCfg *cfgItem, uint32_t static int32_t SensorOpsWrite(struct SensorBusCfg *busCfg, struct SensorRegCfg *cfgItem) { uint8_t value[SENSOR_VALUE_BUTT]; - int32_t ret = HDF_FAILURE; + int32_t ret; uint32_t originValue; - uint32_t busMask = 0xffff; + uint32_t busMask; uint32_t mask; busMask = (busCfg->i2cCfg.regWidth == SENSOR_ADDR_WIDTH_1_BYTE) ? 0x00ff : 0xffff; @@ -243,7 +243,8 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg return HDF_SUCCESS; } -int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, uint8_t *buff, int16_t len) +int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct SensorRegCfgGroupNode *group, + uint8_t *buff, int16_t len) { int32_t num = 0; uint32_t count; @@ -267,16 +268,15 @@ int32_t SetSensorRegCfgArrayByBuff(struct SensorBusCfg *busCfg, const struct Sen if ((g_doOpsCall[cfgItem->opsType].ops != NULL) && (cfgItem->opsType >= SENSOR_OPS_TYPE_EXTBUFF_READ)) { cfgItem->buff = buff + buffOffset; len -= (int16_t)cfgItem->len; - if (len >= 0) { - if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { - HDF_LOGE("%s: extbuff is read and write failed", __func__); - return HDF_FAILURE; - } - buffOffset += cfgItem->len; - } else { + if (len < 0) { HDF_LOGE("%s: cfg item para invalid", __func__); return HDF_FAILURE; } + if (g_doOpsCall[cfgItem->opsType].ops(busCfg, cfgItem) != HDF_SUCCESS) { + HDF_LOGE("%s: extbuff is read and write failed", __func__); + return HDF_FAILURE; + } + buffOffset += cfgItem->len; if (cfgItem->delay != 0) { OsalMDelay(cfgItem->delay); } diff --git a/model/sensor/driver/hall/sensor_hall_driver.c b/model/sensor/driver/hall/sensor_hall_driver.c index 085ca9163..2a6a82bb6 100755 --- a/model/sensor/driver/hall/sensor_hall_driver.c +++ b/model/sensor/driver/hall/sensor_hall_driver.c @@ -155,7 +155,7 @@ static int32_t HallSouthPolarityIrqFunc(uint16_t gpio, void *data) drvData->status = 0; } - if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork,drvData->delayTime)) { + if (!HdfAddDelayedWork(&drvData->hallWorkQueue, &drvData->hallWork, drvData->delayTime)) { HDF_LOGE("%s: Hall south add delay work queue failed", __func__); } -- Gitee From fb0efcfa35b3f350a56e50bcce44e44a1f1ccc7c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 30 Nov 2021 07:29:37 +0000 Subject: [PATCH 216/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 19 +++++++++++++++++-- model/network/wifi/include/hdf_wifi_cmd.h | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index c3822c353..eac22836b 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -29,6 +29,7 @@ #endif #define WIFI_24G_CHANNEL_NUM 14 +#define WIFI_5G_CHANNEL_NUM 24 #define DEFAULT_EAPOL_PACKAGE_SIZE 800 Service *g_baseService = NULL; @@ -495,18 +496,32 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe featureData->channelNum = band->channelCount; featureData->htCapab = capability->htCapability; + for (loop = 0; loop < band->channelCount; ++loop) { + featureData->iee80211Channel[loop].flags = band->channels[loop].flags; + featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; + featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; + } + } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { + struct WlanBand *band = capability->bands[IEEE80211_BAND_2GHZ]; + if (band->channelCount > WIFI_5G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + ret = HDF_FAILURE; + break; + } + featureData->channelNum = band->channelCount; + featureData->htCapab = capability->htCapability; + for (loop = 0; loop < band->channelCount; ++loop) { featureData->iee80211Channel[loop].flags = band->channels[loop].flags; featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; } } else { - HDF_LOGE("%s: Supportting 2.4G is required by now!", __func__); + HDF_LOGE("%s: Supportting 2.4G/5G is required by now!", __func__); ret = HDF_FAILURE; break; } - // 5G not supported } while (false); if (capability->Release != NULL) { diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 5a89f2fec..9233c64a8 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -319,7 +319,7 @@ typedef struct { uint16_t bitrate[MAX_SUPPORTED_RATE]; uint16_t htCapab; uint8_t resv[2]; - WifiIeee80211Channel iee80211Channel[14]; + WifiIeee80211Channel iee80211Channel[24]; } WifiHwFeatureData; typedef struct { -- Gitee From 472dd88797ee090a3ffcdddb9d3f2c215c740c05 Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 30 Nov 2021 15:38:05 +0800 Subject: [PATCH 217/272] modify_code Signed-off-by: chenchong --- model/sensor/driver/chipset/hall/hall_ak8789.c | 1 - 1 file changed, 1 deletion(-) diff --git a/model/sensor/driver/chipset/hall/hall_ak8789.c b/model/sensor/driver/chipset/hall/hall_ak8789.c index 8d96ccd87..ba51bf0eb 100755 --- a/model/sensor/driver/chipset/hall/hall_ak8789.c +++ b/model/sensor/driver/chipset/hall/hall_ak8789.c @@ -7,7 +7,6 @@ */ #include "hall_ak8789.h" -#include #include "osal_irq.h" #include "osal_mem.h" #include "osal_time.h" -- Gitee From 04c57c49cac21f0804a99f77966e2eb8afeee724 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 30 Nov 2021 07:45:53 +0000 Subject: [PATCH 218/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 31 +++++++++------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index eac22836b..0d6c60847 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -470,6 +470,7 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe { int32_t ret = HDF_SUCCESS; struct WlanHwCapability *capability = GetHwCapability(netdev); + struct WlanBand *band = NULL; if (capability == NULL) { HDF_LOGE("%s:GetHwCapability failed!", __func__); return HDF_FAILURE; @@ -492,35 +493,27 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); ret = HDF_FAILURE; break; - } - featureData->channelNum = band->channelCount; - featureData->htCapab = capability->htCapability; - - for (loop = 0; loop < band->channelCount; ++loop) { - featureData->iee80211Channel[loop].flags = band->channels[loop].flags; - featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; - featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; - } + } } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { - struct WlanBand *band = capability->bands[IEEE80211_BAND_2GHZ]; + band = capability->bands[IEEE80211_BAND_5GHZ]; if (band->channelCount > WIFI_5G_CHANNEL_NUM) { HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); ret = HDF_FAILURE; break; - } - featureData->channelNum = band->channelCount; - featureData->htCapab = capability->htCapability; - - for (loop = 0; loop < band->channelCount; ++loop) { - featureData->iee80211Channel[loop].flags = band->channels[loop].flags; - featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; - featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; - } + } } else { HDF_LOGE("%s: Supportting 2.4G/5G is required by now!", __func__); ret = HDF_FAILURE; break; } + featureData->channelNum = band->channelCount; + featureData->htCapab = capability->htCapability; + + for (loop = 0; loop < band->channelCount; ++loop) { + featureData->iee80211Channel[loop].flags = band->channels[loop].flags; + featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; + featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; + } } while (false); -- Gitee From d1a3ce23b5f091e238f76e57044e793ecd42029d Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Tue, 30 Nov 2021 08:07:47 +0000 Subject: [PATCH 219/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 43 ++++++++++++++-------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index 0d6c60847..c4fe594ef 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -466,6 +466,31 @@ static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *req return ret; } +static int32_t WifiCheckChannelNum(struct WlanHwCapability *capability,struct WlanBand *band) +{ + if (capability == NULL || band == NULL) { + HDF_LOGE("%s: capability or band is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { + band = capability->bands[IEEE80211_BAND_2GHZ]; + if (band->channelCount > WIFI_24G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + return HDF_FAILURE; + } + } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { + band = capability->bands[IEEE80211_BAND_5GHZ]; + if (band->channelCount > WIFI_5G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + return HDF_FAILURE; + } + } else { + HDF_LOGE("%s: Supportting 2.4G/5G is required by now!", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *featureData) { int32_t ret = HDF_SUCCESS; @@ -487,25 +512,11 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe featureData->bitrate[loop] = capability->supportedRates[loop]; } - if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { - struct WlanBand *band = capability->bands[IEEE80211_BAND_2GHZ]; - if (band->channelCount > WIFI_24G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); - ret = HDF_FAILURE; - break; - } - } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { - band = capability->bands[IEEE80211_BAND_5GHZ]; - if (band->channelCount > WIFI_5G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); - ret = HDF_FAILURE; - break; - } - } else { - HDF_LOGE("%s: Supportting 2.4G/5G is required by now!", __func__); + if (WifiCheckChannelNum(capability, &band) != HDF_SUCCESS) { ret = HDF_FAILURE; break; } + featureData->channelNum = band->channelCount; featureData->htCapab = capability->htCapability; -- Gitee From 95e6446b9299b92c1e74ddeec36858c8c057fa65 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Tue, 30 Nov 2021 16:18:09 +0800 Subject: [PATCH 220/272] fix: clean some code style issue Signed-off-by: yuanbo --- core/common/src/hdf_attribute.c | 8 ++++---- core/common/src/hdf_device_node_ext.c | 6 ++++-- core/host/src/devhost_service.c | 2 +- core/host/src/hdf_device_node.c | 4 ++-- core/host/src/hdf_driver_loader.c | 10 ++-------- model/usb/src/usb_ddk_pnp_loader.c | 1 + tools/hc-gen/src/macro_gen.h | 4 ++-- tools/hdi-gen/util/options.cpp | 2 +- 8 files changed, 17 insertions(+), 20 deletions(-) diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index 4e942033d..d404c8992 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -187,7 +187,7 @@ static bool GetDeviceNodeInfo(const struct DeviceResourceNode *deviceNode, struc static bool GetDevcieNodeList(const struct DeviceResourceNode *device, struct DevHostServiceClnt *hostClnt, uint16_t deviceIdx) { - uint8_t deviceNnodeIdx = 0; + uint8_t deviceNodeIdx = 0; uint16_t hostId = hostClnt->hostId; struct HdfDeviceInfo *deviceNodeInfo = NULL; const struct DeviceResourceNode *devNodeResource = device->child; @@ -204,7 +204,7 @@ static bool GetDevcieNodeList(const struct DeviceResourceNode *device, } deviceNodeInfo->hostId = hostId; - deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNnodeIdx); + deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNodeIdx); if (deviceNodeInfo->preload != DEVICE_PRELOAD_DISABLE) { if (!HdfSListAddOrder(&hostClnt->unloadDevInfos, &deviceNodeInfo->node, HdfDeviceListCompare)) { HDF_LOGE("%s: failed to add device info to list %s", __func__, deviceNodeInfo->svcName); @@ -215,9 +215,9 @@ static bool GetDevcieNodeList(const struct DeviceResourceNode *device, HdfSListAdd(&hostClnt->dynamicDevInfos, &deviceNodeInfo->node); } - deviceNnodeIdx++; + deviceNodeIdx++; } - return deviceNnodeIdx > 0; + return deviceNodeIdx > 0; } int HdfAttributeManagerGetDeviceList(struct DevHostServiceClnt *hostClnt) diff --git a/core/common/src/hdf_device_node_ext.c b/core/common/src/hdf_device_node_ext.c index 13fb2c6d0..030b0a83f 100644 --- a/core/common/src/hdf_device_node_ext.c +++ b/core/common/src/hdf_device_node_ext.c @@ -15,7 +15,7 @@ #include "hdf_sbuf.h" #include "osal_mem.h" -#define HDF_LOG_TAG device_node_ext +#define HDF_LOG_TAG devnode_ext static int DeviceNodeExtDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data, struct HdfSBuf *reply) { @@ -116,7 +116,9 @@ static void DeviceNodeExtConstruct(struct DeviceNodeExt *inst) static void DeviceNodeExtDestruct(struct DeviceNodeExt *devnode) { - DeviceNodeExtRemoveService(&devnode->super); + if (DeviceNodeExtRemoveService(&devnode->super) != HDF_SUCCESS) { + HDF_LOGE("failed to remove serivce"); + } HdfDeviceNodeDestruct(&devnode->super); } diff --git a/core/host/src/devhost_service.c b/core/host/src/devhost_service.c index e93edd189..428fd119a 100644 --- a/core/host/src/devhost_service.c +++ b/core/host/src/devhost_service.c @@ -10,8 +10,8 @@ #include "devmgr_service_clnt.h" #include "devsvc_manager_clnt.h" #include "hdf_base.h" -#include "hdf_driver_loader.h" #include "hdf_driver.h" +#include "hdf_driver_loader.h" #include "hdf_log.h" #include "hdf_object_manager.h" #include "osal_mem.h" diff --git a/core/host/src/hdf_device_node.c b/core/host/src/hdf_device_node.c index 46c96bcef..80fdd1066 100644 --- a/core/host/src/hdf_device_node.c +++ b/core/host/src/hdf_device_node.c @@ -225,9 +225,9 @@ void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode) } HDF_LOGI("release devnode %s", devNode->servName); switch (devNode->devStatus) { - case DEVNODE_LAUNCHED: + case DEVNODE_LAUNCHED: // fall-through HdfDeviceUnlaunchNode(devNode); - case DEVNODE_INITED: // fall-through + case DEVNODE_INITED: HdfDeviceTokenFreeInstance(devNode->token); devNode->token = NULL; PowerStateTokenFreeInstance(devNode->powerToken); diff --git a/core/host/src/hdf_driver_loader.c b/core/host/src/hdf_driver_loader.c index 14e4d2040..d7d06f63b 100755 --- a/core/host/src/hdf_driver_loader.c +++ b/core/host/src/hdf_driver_loader.c @@ -7,13 +7,9 @@ */ #include "hdf_driver_loader.h" -#include "devsvc_manager_clnt.h" -#include "hcs_tree_if.h" -#include "hdf_device_desc.h" -#include "hdf_device_node.h" +#include "hdf_driver.h" #include "hdf_log.h" #include "hdf_object_manager.h" -#include "hdf_attribute_manager.h" #define HDF_LOG_TAG driver_loader @@ -22,9 +18,8 @@ int32_t HdfDriverEntryConstruct() int i; struct HdfDriverEntry *driverEntry = NULL; size_t *addrBegin = NULL; - int32_t count = 0; + int32_t count = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); - count = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); if (count <= 0) { HDF_LOGE("%s: no hdf driver exist", __func__); return HDF_FAILURE; @@ -88,4 +83,3 @@ struct IDriverLoader *HdfDriverLoaderGetInstance() } return instance; } - diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index 5f7d31998..f01cecdae 100644 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -159,6 +159,7 @@ int32_t UsbPnpManagerRegisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed to regitst device %s", __func__, managerInfo->serviceName); HdfDeviceObjectRelease(devObj); + return ret; } // need optimize this code to remove SaveRegistedDevice function later SaveRegistedDevice(devObj); diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index 3800b0cfe..af5574940 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -6,12 +6,11 @@ * See the LICENSE file in the root of this repository for complete details. */ - #ifndef HC_GEN_MACRO_GEN_H #define HC_GEN_MACRO_GEN_H -#include #include "generator.h" +#include #include namespace OHOS { @@ -23,6 +22,7 @@ public: ~MacroGen() override = default; bool Output() override; + private: bool Initialize(); diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 5333c017d..a20a74509 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -38,7 +38,7 @@ Options& Options::GetInstance() return option; } -Options& Options::Parse(int argc, const char* argv[]) +Options& Options::Parse(int argc, char* const argv[]) { program_ = argv[0]; opterr = 1; -- Gitee From c256d253f22038eb72188c9473751bcc752bfc50 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Wed, 1 Dec 2021 09:51:04 +0800 Subject: [PATCH 221/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- model/audio/common/src/audio_platform_base.c | 19 +++++++++---------- .../dispatch/src/audio_stream_dispatch.c | 5 ++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 35dc0c53c..952e60bd3 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -7,12 +7,12 @@ */ #include "audio_platform_base.h" -#include "osal_time.h" -#include "osal_uaccess.h" #include "audio_driver_log.h" #include "audio_dma_base.h" #include "audio_sapm.h" #include "audio_stream_dispatch.h" +#include "osal_time.h" +#include "osal_uaccess.h" #define HDF_LOG_TAG audio_platform_base const int MAX_PERIOD_SIZE = 1024 * 16; @@ -452,11 +452,8 @@ static int32_t MmapWriteData(struct PlatformData *data, char *tmpBuf) static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) { - struct PlatformData *data = NULL; - enum CriBuffStatus status; uint32_t timeout = 0; - - data = PlatformDataFromCard(card); + struct PlatformData *data = PlatformDataFromCard(card); if (data == NULL) { AUDIO_DRIVER_LOG_ERR("PlatformDataFromCard failed."); return HDF_FAILURE; @@ -472,14 +469,17 @@ static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) (totalSize / MIN_PERIOD_SIZE) : (totalSize / MIN_PERIOD_SIZE + 1); data->mmapLoopCount = 0; char *tmpBuf = OsalMemCalloc(MIN_PERIOD_SIZE); - + if (tmpBuf == NULL) { + AUDIO_DRIVER_LOG_ERR("tmpBuf is null."); + return HDF_FAILURE; + } while (data->mmapLoopCount < loopTimes && data->renderBufInfo.runStatus != PCM_STOP) { if (data->renderBufInfo.runStatus == PCM_PAUSE) { OsalMSleep(5); continue; } - status = AudioDmaBuffStatus(card); - if (status != ENUM_CIR_BUFF_NORMAL) { + + if (AudioDmaBuffStatus(card) != ENUM_CIR_BUFF_NORMAL) { OsalMSleep(SLEEP_TIME); AUDIO_DRIVER_LOG_DEBUG("dma buff status ENUM_CIR_BUFF_FULL."); timeout++; @@ -494,7 +494,6 @@ static int32_t AudioMmapWriteTransfer(const struct AudioCard *card) data->renderBufInfo.trafBufSize = (data->mmapLoopCount < (loopTimes - 1)) ? MIN_PERIOD_SIZE : lastBuffSize; if (MmapWriteData(data, tmpBuf) != HDF_SUCCESS) { - AUDIO_DRIVER_LOG_ERR("MmapWriteData fail."); OsalMemFree(tmpBuf); return HDF_FAILURE; } diff --git a/model/audio/dispatch/src/audio_stream_dispatch.c b/model/audio/dispatch/src/audio_stream_dispatch.c index 3179e4fd3..b871ecccb 100755 --- a/model/audio/dispatch/src/audio_stream_dispatch.c +++ b/model/audio/dispatch/src/audio_stream_dispatch.c @@ -7,8 +7,8 @@ */ #include "audio_stream_dispatch.h" -#include "audio_platform_base.h" #include "audio_driver_log.h" +#include "audio_platform_base.h" #define HDF_LOG_TAG audio_stream_dispatch @@ -782,6 +782,7 @@ static int32_t StreamHostMmapWrite(const struct HdfDeviceIoClient *client, struc return HDF_FAILURE; } + (void)memset_s(&txMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData)); txMmapData.memoryAddress = (void *)((uintptr_t)mAddress); if (txMmapData.memoryAddress == NULL) { ADM_LOG_ERR("txMmapData.memoryAddress is NULL."); @@ -857,6 +858,8 @@ static int32_t StreamHostMmapRead(const struct HdfDeviceIoClient *client, struct ADM_LOG_ERR("capture mmap read request memory address failed!"); return HDF_FAILURE; } + + (void)memset_s(&rxMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData)); rxMmapData.memoryAddress = (void *)((uintptr_t)mAddress); if (rxMmapData.memoryAddress == NULL) { ADM_LOG_ERR("rxMmapData.memoryAddress is NULL."); -- Gitee From be336ae89ce9026b5c18bdae0de57121a49a5c93 Mon Sep 17 00:00:00 2001 From: haizhouyang Date: Wed, 1 Dec 2021 10:39:19 +0800 Subject: [PATCH 222/272] Create sub dir for platform entry test srouces Signed-off-by: haizhouyang --- test/unittest/platform/{ => entry}/hdf_adc_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_adc_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_emmc_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_emmc_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_gpio_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_gpio_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_hdmi_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_hdmi_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_i2c_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_i2c_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_i2s_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_i2s_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_i3c_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_i3c_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_mipi_csi_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_mipi_csi_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_mipi_dsi_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_mipi_dsi_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_pin_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_pin_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_pwm_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_pwm_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_regulator_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_regulator_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_rtc_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_rtc_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_sdio_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_sdio_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_spi_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_spi_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_uart_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_uart_entry_test.h | 0 test/unittest/platform/{ => entry}/hdf_watchdog_entry_test.c | 0 test/unittest/platform/{ => entry}/hdf_watchdog_entry_test.h | 0 34 files changed, 0 insertions(+), 0 deletions(-) rename test/unittest/platform/{ => entry}/hdf_adc_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_adc_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_emmc_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_emmc_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_gpio_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_gpio_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_hdmi_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_hdmi_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_i2c_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_i2c_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_i2s_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_i2s_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_i3c_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_i3c_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_mipi_csi_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_mipi_csi_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_mipi_dsi_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_mipi_dsi_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_pin_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_pin_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_pwm_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_pwm_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_regulator_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_regulator_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_rtc_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_rtc_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_sdio_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_sdio_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_spi_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_spi_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_uart_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_uart_entry_test.h (100%) rename test/unittest/platform/{ => entry}/hdf_watchdog_entry_test.c (100%) rename test/unittest/platform/{ => entry}/hdf_watchdog_entry_test.h (100%) diff --git a/test/unittest/platform/hdf_adc_entry_test.c b/test/unittest/platform/entry/hdf_adc_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_adc_entry_test.c rename to test/unittest/platform/entry/hdf_adc_entry_test.c diff --git a/test/unittest/platform/hdf_adc_entry_test.h b/test/unittest/platform/entry/hdf_adc_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_adc_entry_test.h rename to test/unittest/platform/entry/hdf_adc_entry_test.h diff --git a/test/unittest/platform/hdf_emmc_entry_test.c b/test/unittest/platform/entry/hdf_emmc_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_emmc_entry_test.c rename to test/unittest/platform/entry/hdf_emmc_entry_test.c diff --git a/test/unittest/platform/hdf_emmc_entry_test.h b/test/unittest/platform/entry/hdf_emmc_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_emmc_entry_test.h rename to test/unittest/platform/entry/hdf_emmc_entry_test.h diff --git a/test/unittest/platform/hdf_gpio_entry_test.c b/test/unittest/platform/entry/hdf_gpio_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_gpio_entry_test.c rename to test/unittest/platform/entry/hdf_gpio_entry_test.c diff --git a/test/unittest/platform/hdf_gpio_entry_test.h b/test/unittest/platform/entry/hdf_gpio_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_gpio_entry_test.h rename to test/unittest/platform/entry/hdf_gpio_entry_test.h diff --git a/test/unittest/platform/hdf_hdmi_entry_test.c b/test/unittest/platform/entry/hdf_hdmi_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_hdmi_entry_test.c rename to test/unittest/platform/entry/hdf_hdmi_entry_test.c diff --git a/test/unittest/platform/hdf_hdmi_entry_test.h b/test/unittest/platform/entry/hdf_hdmi_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_hdmi_entry_test.h rename to test/unittest/platform/entry/hdf_hdmi_entry_test.h diff --git a/test/unittest/platform/hdf_i2c_entry_test.c b/test/unittest/platform/entry/hdf_i2c_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_i2c_entry_test.c rename to test/unittest/platform/entry/hdf_i2c_entry_test.c diff --git a/test/unittest/platform/hdf_i2c_entry_test.h b/test/unittest/platform/entry/hdf_i2c_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_i2c_entry_test.h rename to test/unittest/platform/entry/hdf_i2c_entry_test.h diff --git a/test/unittest/platform/hdf_i2s_entry_test.c b/test/unittest/platform/entry/hdf_i2s_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_i2s_entry_test.c rename to test/unittest/platform/entry/hdf_i2s_entry_test.c diff --git a/test/unittest/platform/hdf_i2s_entry_test.h b/test/unittest/platform/entry/hdf_i2s_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_i2s_entry_test.h rename to test/unittest/platform/entry/hdf_i2s_entry_test.h diff --git a/test/unittest/platform/hdf_i3c_entry_test.c b/test/unittest/platform/entry/hdf_i3c_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_i3c_entry_test.c rename to test/unittest/platform/entry/hdf_i3c_entry_test.c diff --git a/test/unittest/platform/hdf_i3c_entry_test.h b/test/unittest/platform/entry/hdf_i3c_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_i3c_entry_test.h rename to test/unittest/platform/entry/hdf_i3c_entry_test.h diff --git a/test/unittest/platform/hdf_mipi_csi_entry_test.c b/test/unittest/platform/entry/hdf_mipi_csi_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_mipi_csi_entry_test.c rename to test/unittest/platform/entry/hdf_mipi_csi_entry_test.c diff --git a/test/unittest/platform/hdf_mipi_csi_entry_test.h b/test/unittest/platform/entry/hdf_mipi_csi_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_mipi_csi_entry_test.h rename to test/unittest/platform/entry/hdf_mipi_csi_entry_test.h diff --git a/test/unittest/platform/hdf_mipi_dsi_entry_test.c b/test/unittest/platform/entry/hdf_mipi_dsi_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_mipi_dsi_entry_test.c rename to test/unittest/platform/entry/hdf_mipi_dsi_entry_test.c diff --git a/test/unittest/platform/hdf_mipi_dsi_entry_test.h b/test/unittest/platform/entry/hdf_mipi_dsi_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_mipi_dsi_entry_test.h rename to test/unittest/platform/entry/hdf_mipi_dsi_entry_test.h diff --git a/test/unittest/platform/hdf_pin_entry_test.c b/test/unittest/platform/entry/hdf_pin_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_pin_entry_test.c rename to test/unittest/platform/entry/hdf_pin_entry_test.c diff --git a/test/unittest/platform/hdf_pin_entry_test.h b/test/unittest/platform/entry/hdf_pin_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_pin_entry_test.h rename to test/unittest/platform/entry/hdf_pin_entry_test.h diff --git a/test/unittest/platform/hdf_pwm_entry_test.c b/test/unittest/platform/entry/hdf_pwm_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_pwm_entry_test.c rename to test/unittest/platform/entry/hdf_pwm_entry_test.c diff --git a/test/unittest/platform/hdf_pwm_entry_test.h b/test/unittest/platform/entry/hdf_pwm_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_pwm_entry_test.h rename to test/unittest/platform/entry/hdf_pwm_entry_test.h diff --git a/test/unittest/platform/hdf_regulator_entry_test.c b/test/unittest/platform/entry/hdf_regulator_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_regulator_entry_test.c rename to test/unittest/platform/entry/hdf_regulator_entry_test.c diff --git a/test/unittest/platform/hdf_regulator_entry_test.h b/test/unittest/platform/entry/hdf_regulator_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_regulator_entry_test.h rename to test/unittest/platform/entry/hdf_regulator_entry_test.h diff --git a/test/unittest/platform/hdf_rtc_entry_test.c b/test/unittest/platform/entry/hdf_rtc_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_rtc_entry_test.c rename to test/unittest/platform/entry/hdf_rtc_entry_test.c diff --git a/test/unittest/platform/hdf_rtc_entry_test.h b/test/unittest/platform/entry/hdf_rtc_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_rtc_entry_test.h rename to test/unittest/platform/entry/hdf_rtc_entry_test.h diff --git a/test/unittest/platform/hdf_sdio_entry_test.c b/test/unittest/platform/entry/hdf_sdio_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_sdio_entry_test.c rename to test/unittest/platform/entry/hdf_sdio_entry_test.c diff --git a/test/unittest/platform/hdf_sdio_entry_test.h b/test/unittest/platform/entry/hdf_sdio_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_sdio_entry_test.h rename to test/unittest/platform/entry/hdf_sdio_entry_test.h diff --git a/test/unittest/platform/hdf_spi_entry_test.c b/test/unittest/platform/entry/hdf_spi_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_spi_entry_test.c rename to test/unittest/platform/entry/hdf_spi_entry_test.c diff --git a/test/unittest/platform/hdf_spi_entry_test.h b/test/unittest/platform/entry/hdf_spi_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_spi_entry_test.h rename to test/unittest/platform/entry/hdf_spi_entry_test.h diff --git a/test/unittest/platform/hdf_uart_entry_test.c b/test/unittest/platform/entry/hdf_uart_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_uart_entry_test.c rename to test/unittest/platform/entry/hdf_uart_entry_test.c diff --git a/test/unittest/platform/hdf_uart_entry_test.h b/test/unittest/platform/entry/hdf_uart_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_uart_entry_test.h rename to test/unittest/platform/entry/hdf_uart_entry_test.h diff --git a/test/unittest/platform/hdf_watchdog_entry_test.c b/test/unittest/platform/entry/hdf_watchdog_entry_test.c similarity index 100% rename from test/unittest/platform/hdf_watchdog_entry_test.c rename to test/unittest/platform/entry/hdf_watchdog_entry_test.c diff --git a/test/unittest/platform/hdf_watchdog_entry_test.h b/test/unittest/platform/entry/hdf_watchdog_entry_test.h similarity index 100% rename from test/unittest/platform/hdf_watchdog_entry_test.h rename to test/unittest/platform/entry/hdf_watchdog_entry_test.h -- Gitee From 1db596a5c4918065a5918bddd4c5aad024feddc2 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Wed, 1 Dec 2021 14:43:12 +0800 Subject: [PATCH 223/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- model/audio/common/src/audio_accessory_base.c | 2 +- model/audio/common/src/audio_codec_base.c | 2 +- model/audio/core/src/audio_core.c | 2 +- model/audio/core/src/audio_host.c | 2 +- model/audio/sapm/src/audio_sapm.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 6fcdd465a..2448d5ee1 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -8,8 +8,8 @@ #include "audio_accessory_base.h" #include "audio_driver_log.h" -#include "osal_time.h" #include "i2c_if.h" +#include "osal_time.h" #define HDF_LOG_TAG "audio_accessory_base" diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 50d0e05d3..600fbdb76 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -7,8 +7,8 @@ */ #include "audio_codec_base.h" -#include "audio_parse.h" #include "audio_driver_log.h" +#include "audio_parse.h" #include "audio_sapm.h" #define HDF_LOG_TAG audio_codec_base diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index cf66cad09..b533100bd 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -7,8 +7,8 @@ */ #include "audio_core.h" -#include "osal_io.h" #include "audio_driver_log.h" +#include "osal_io.h" #define HDF_LOG_TAG audio_core diff --git a/model/audio/core/src/audio_host.c b/model/audio/core/src/audio_host.c index c43ca1dc0..7e426e972 100755 --- a/model/audio/core/src/audio_host.c +++ b/model/audio/core/src/audio_host.c @@ -9,9 +9,9 @@ #include "audio_host.h" #include "audio_codec_if.h" #include "audio_core.h" -#include "audio_parse.h" #include "audio_sapm.h" #include "audio_driver_log.h" +#include "audio_parse.h" #define HDF_LOG_TAG audio_host diff --git a/model/audio/sapm/src/audio_sapm.c b/model/audio/sapm/src/audio_sapm.c index 7d4fe632b..605123d1f 100755 --- a/model/audio/sapm/src/audio_sapm.c +++ b/model/audio/sapm/src/audio_sapm.c @@ -7,10 +7,10 @@ */ #include "audio_sapm.h" +#include "audio_driver_log.h" #include "osal_io.h" #include "osal_time.h" #include "osal_timer.h" -#include "audio_driver_log.h" #define HDF_LOG_TAG audio_sapm -- Gitee From 272a9f649632a8da393ae05f9b51c042ee273db2 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 1 Dec 2021 07:18:22 +0000 Subject: [PATCH 224/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index c4fe594ef..ea7d2c1d8 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -466,22 +466,22 @@ static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *req return ret; } -static int32_t WifiCheckChannelNum(struct WlanHwCapability *capability,struct WlanBand *band) +static int32_t WifiCheckChannelNum(struct WlanHwCapability *capability,struct WlanBand **band) { if (capability == NULL || band == NULL) { HDF_LOGE("%s: capability or band is NULL", __func__); return HDF_ERR_INVALID_PARAM; } if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { - band = capability->bands[IEEE80211_BAND_2GHZ]; - if (band->channelCount > WIFI_24G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + *band = capability->bands[IEEE80211_BAND_2GHZ]; + if ((*band)->channelCount > WIFI_24G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, (*band)->channelCount); return HDF_FAILURE; } } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { - band = capability->bands[IEEE80211_BAND_5GHZ]; - if (band->channelCount > WIFI_5G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + *band = capability->bands[IEEE80211_BAND_5GHZ]; + if ((*band)->channelCount > WIFI_5G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, (*band)->channelCount); return HDF_FAILURE; } } else { -- Gitee From f690c003d91858420525ce34e9120b78837997b0 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 1 Dec 2021 08:23:18 +0000 Subject: [PATCH 225/272] =?UTF-8?q?=E5=A4=84=E7=90=86ReviewBot=E5=91=8A?= =?UTF-8?q?=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: YOUR_NAME --- model/input/driver/event_hub.c | 6 +++--- model/input/driver/hdf_encoder.c | 16 ++++++++-------- model/input/driver/hdf_encoder.h | 1 + model/input/driver/hdf_hid_adapter.c | 4 ++-- model/input/driver/hdf_input_device_manager.c | 3 +-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/model/input/driver/event_hub.c b/model/input/driver/event_hub.c index 8fd323369..dc2f52a6d 100644 --- a/model/input/driver/event_hub.c +++ b/model/input/driver/event_hub.c @@ -26,13 +26,13 @@ void PushOnePackage(InputDevice *inputDev, uint32_t type, uint32_t code, int32_t { OsalTimespec time; EventPackage package = {0}; - InputManager *g_inputManager = GetInputManager(); + InputManager *inputManager = GetInputManager(); if (inputDev == NULL) { HDF_LOGE("%s: parm is null", __func__); return; } - OsalMutexLock(&g_inputManager->mutex); + OsalMutexLock(&inputManager->mutex); package.type = type; package.code = code; package.value = value; @@ -66,5 +66,5 @@ void PushOnePackage(InputDevice *inputDev, uint32_t type, uint32_t code, int32_t HdfSbufFlush(inputDev->pkgBuf); inputDev->errFrameFlag = false; } - OsalMutexUnlock(&g_inputManager->mutex); + OsalMutexUnlock(&inputManager->mutex); } \ No newline at end of file diff --git a/model/input/driver/hdf_encoder.c b/model/input/driver/hdf_encoder.c index 85ddcb782..2185d5c1d 100644 --- a/model/input/driver/hdf_encoder.c +++ b/model/input/driver/hdf_encoder.c @@ -9,10 +9,10 @@ #include "hdf_encoder.h" #include "event_hub.h" #include "gpio_if.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" #include "osal_mem.h" #include "osal_timer.h" -#include "hdf_log.h" -#include "hdf_device_desc.h" #define TIMER_INTERVAL_ENCODER 5 @@ -184,20 +184,20 @@ static InputDevice *InputDeviceInstance(EncoderDriver *encoderDrv) static int32_t RegisterEncoderDevice(EncoderCfg *encoderCfg, struct HdfDeviceObject *device) { int32_t ret; - EncoderDriver *EncoderDrv = EncoderDriverInstance(encoderCfg); - if (EncoderDrv == NULL) { + EncoderDriver *encoderDrv = EncoderDriverInstance(encoderCfg); + if (encoderDrv == NULL) { HDF_LOGE("%s: instance encoder driver failed", __func__); return HDF_ERR_MALLOC_FAIL; } - device->priv = (void *)EncoderDrv; + device->priv = (void *)encoderDrv; - ret = EncoderInit(EncoderDrv); + ret = EncoderInit(encoderDrv); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: key driver init failed, ret %d", __func__, ret); goto EXIT; } - InputDevice *inputDev = InputDeviceInstance(EncoderDrv); + InputDevice *inputDev = InputDeviceInstance(encoderDrv); if (inputDev == NULL) { HDF_LOGE("%s: instance input device failed", __func__); goto EXIT; @@ -213,7 +213,7 @@ EXIT1: OsalMemFree(inputDev->pkgBuf); OsalMemFree(inputDev); EXIT: - OsalMemFree(EncoderDrv); + OsalMemFree(encoderDrv); return HDF_FAILURE; } diff --git a/model/input/driver/hdf_encoder.h b/model/input/driver/hdf_encoder.h index 0456fcfc4..9b65f42bc 100644 --- a/model/input/driver/hdf_encoder.h +++ b/model/input/driver/hdf_encoder.h @@ -9,6 +9,7 @@ #define HDF_ENCODER_H #include +#include "hdf_device_object.h" #include "hdf_input_device_manager.h" #include "input_config.h" #include "osal_time.h" diff --git a/model/input/driver/hdf_hid_adapter.c b/model/input/driver/hdf_hid_adapter.c index 91f95697c..b576193d1 100644 --- a/model/input/driver/hdf_hid_adapter.c +++ b/model/input/driver/hdf_hid_adapter.c @@ -101,7 +101,7 @@ static void FreeCachedInfo(void) } } -static int32_t SetInputDevAbsAttr(InputDevice *inputDev, HidInfo *info) +static int32_t SetInputDevAbsAttr(InputDevice *inputDev, const HidInfo *info) { int32_t ret; for (int i = 0; i < BITS_TO_LONG(ABS_CNT); i++) { @@ -114,7 +114,7 @@ static int32_t SetInputDevAbsAttr(InputDevice *inputDev, HidInfo *info) return HDF_SUCCESS; } -static void GetInfoFromCache(InputDevice *inputDev, HidInfo *info) +static void GetInfoFromCache(InputDevice *inputDev, const HidInfo *info) { uint32_t len; int32_t ret; diff --git a/model/input/driver/hdf_input_device_manager.c b/model/input/driver/hdf_input_device_manager.c index 330a22538..7f1a02fa0 100644 --- a/model/input/driver/hdf_input_device_manager.c +++ b/model/input/driver/hdf_input_device_manager.c @@ -7,7 +7,6 @@ */ #include "hdf_input_device_manager.h" -#include "devsvc_manager_clnt.h" #include "event_hub.h" #include "hdf_base.h" #include "hdf_device_object.h" @@ -64,7 +63,7 @@ static struct HdfDeviceObject *HidRegisterHdfDevice(InputDevice *inputDev) HdfDeviceObjectRelease(hdfDev); return NULL; } - ret = HdfDeviceObjectPublishService(hdfDev, svcName, SERVICE_POLICY_CAPACITY, 0664); + ret = HdfDeviceObjectPublishService(hdfDev, svcName, SERVICE_POLICY_CAPACITY, 0664); // 0664:permission setting if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed to regitst device %s", __func__, moduleName); HdfDeviceObjectRelease(hdfDev); -- Gitee From b2179e771c901845916284c619660f751908b746 Mon Sep 17 00:00:00 2001 From: jiachanglin Date: Wed, 1 Dec 2021 09:47:53 +0000 Subject: [PATCH 226/272] Description:Clean up the reviewbot Feature or Bugfix:Feature Binary Source: No Signed-off-by: jiachanglin --- model/network/wifi/core/components/p2p/p2p.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/model/network/wifi/core/components/p2p/p2p.c b/model/network/wifi/core/components/p2p/p2p.c index 3078ed37d..279561a04 100755 --- a/model/network/wifi/core/components/p2p/p2p.c +++ b/model/network/wifi/core/components/p2p/p2p.c @@ -7,8 +7,6 @@ */ #include "p2p.h" -#include -#include #include "message/message_router.h" #include "message/sidecar.h" #include "wifi_base.h" -- Gitee From 6945b42b8a37b0bca9c01baaf3bfd3706d03f240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BC=9F=E6=B0=91?= Date: Wed, 1 Dec 2021 20:18:20 +0800 Subject: [PATCH 227/272] fix: fix the bug that the pinName of strcmp input parameter may be NULL. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张伟民 --- support/platform/src/pin/pin_core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/support/platform/src/pin/pin_core.c b/support/platform/src/pin/pin_core.c index 6b41ebd7d..09e65ba6a 100644 --- a/support/platform/src/pin/pin_core.c +++ b/support/platform/src/pin/pin_core.c @@ -86,6 +86,11 @@ struct PinDesc *PinCntlrGetPinDescByName(const char *pinName) struct PinCntlr *tmp = NULL; int32_t num; + if (pinName == NULL) { + HDF_LOGE("%s: pinName is NULL!", __func__); + return NULL; + } + list = PinCntlrListGet(); DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { -- Gitee From c817c4c3156db555c5223bfa7859dd01117c1bd0 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Tue, 30 Nov 2021 18:59:16 +0800 Subject: [PATCH 228/272] fix: clear code alarm in adc, mmc, emmc, hdmi, regulator Signed-off-by: jiaziyang --- include/platform/adc_if.h | 2 +- model/storage/src/mmc/emmc_if.c | 2 -- model/storage/src/mmc/mmc_core.c | 5 ----- support/platform/include/hdmi/hdmi_infoframe.h | 2 +- support/platform/src/hdmi/hdmi_infoframe.c | 2 +- test/unittest/platform/virtual/regulator_virtual.c | 2 +- 6 files changed, 4 insertions(+), 11 deletions(-) diff --git a/include/platform/adc_if.h b/include/platform/adc_if.h index 79c06a0a0..33b347131 100644 --- a/include/platform/adc_if.h +++ b/include/platform/adc_if.h @@ -22,7 +22,7 @@ struct AdcIoMsg { uint32_t channel; }; -DevHandle AdcOpen(uint32_t num); +DevHandle AdcOpen(uint32_t number); void AdcClose(DevHandle handle); diff --git a/model/storage/src/mmc/emmc_if.c b/model/storage/src/mmc/emmc_if.c index 02bfe8c1c..1086295a9 100644 --- a/model/storage/src/mmc/emmc_if.c +++ b/model/storage/src/mmc/emmc_if.c @@ -11,12 +11,10 @@ #include "mmc_emmc.h" #endif #include "emmc_if.h" -#include "hdf_base.h" #ifdef __USER__ #include "hdf_io_service_if.h" #endif #include "hdf_log.h" -#include "osal_mem.h" #include "securec.h" #define HDF_LOG_TAG emmc_if_c diff --git a/model/storage/src/mmc/mmc_core.c b/model/storage/src/mmc/mmc_core.c index 231d369f8..2b377d2e0 100644 --- a/model/storage/src/mmc/mmc_core.c +++ b/model/storage/src/mmc/mmc_core.c @@ -7,15 +7,10 @@ */ #include "device_resource_if.h" -#include "hdf_dlist.h" -#include "hdf_log.h" #include "mmc_block.h" -#include "mmc_corex.h" #include "mmc_dispatch.h" #include "mmc_emmc.h" #include "mmc_sdio.h" -#include "osal_mem.h" -#include "osal_time.h" #define HDF_LOG_TAG mmc_core_c diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index ad0cb4cd5..a37f4e457 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -478,7 +478,7 @@ int32_t HdmiAviInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); int32_t HdmiDrmInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); int32_t HdmiVsInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, bool dolbyEnable); int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, - char *vendorName, char *productName, enum HdmiSpdSdi sdi); + const char *vendorName, char *productName, enum HdmiSpdSdi sdi); int32_t HdmiInfoFrameGetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, union HdmiInfoFrameInfo *infoFrame); int32_t HdmiInfoFrameSetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index e707aad37..c8b80b901 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -752,7 +752,7 @@ static void HdmiFillSpdInfoFrame(struct HdmiSpdInfoFrame *spd, } int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, - char *vendorName, char *productName, enum HdmiSpdSdi sdi) + const char *vendorName, char *productName, enum HdmiSpdSdi sdi) { struct HdmiCntlr *cntlr = NULL; union HdmiInfoFrameInfo infoFrame = {0}; diff --git a/test/unittest/platform/virtual/regulator_virtual.c b/test/unittest/platform/virtual/regulator_virtual.c index aab3ad477..5bd0414e5 100755 --- a/test/unittest/platform/virtual/regulator_virtual.c +++ b/test/unittest/platform/virtual/regulator_virtual.c @@ -163,7 +163,7 @@ static int32_t VirtualRegulatorContinueReadHcs(struct RegulatorNode *regNode, co HDF_LOGD("regulatorInfo:[%s][%d][%d]--[%d][%d]--[%d][%d]!", regNode->regulatorInfo.name, regNode->regulatorInfo.constraints.alwaysOn, - regNode->regulatorInfo.constraints.mode, + regNode->regulatorInfo.constraints.mode, regNode->regulatorInfo.constraints.minUv, regNode->regulatorInfo.constraints.maxUv, regNode->regulatorInfo.constraints.minUa, regNode->regulatorInfo.constraints.maxUa); -- Gitee From 2ecf434fbd0b16ba8aa6bb3f58c4a098eb89fd51 Mon Sep 17 00:00:00 2001 From: wu-chengwen Date: Thu, 2 Dec 2021 10:12:29 +0800 Subject: [PATCH 229/272] feat: add USB pnp notify enum constant for usb device attach event Signed-off-by: wu-chengwen --- core/shared/include/hdf_usb_pnp_manage.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/shared/include/hdf_usb_pnp_manage.h b/core/shared/include/hdf_usb_pnp_manage.h index 62ba214aa..6a2864510 100755 --- a/core/shared/include/hdf_usb_pnp_manage.h +++ b/core/shared/include/hdf_usb_pnp_manage.h @@ -26,6 +26,9 @@ enum UsbPnpNotifyServiceCmd { #endif USB_PNP_DRIVER_REGISTER_DEVICE, USB_PNP_DRIVER_UNREGISTER_DEVICE, + USB_PNP_DRIVER_GETDEVICES = 20, + USB_PNP_DRIVER_GADGET_ADD = 30, + USB_PNP_DRIVER_GADGET_REMOVE, }; enum UsbPnpNotifyRemoveType { -- Gitee From af55c47f6bce2c574a52ec055b79480277fe7669 Mon Sep 17 00:00:00 2001 From: mahai Date: Wed, 1 Dec 2021 17:29:09 +0800 Subject: [PATCH 230/272] feat:Add dac driver framework and test case file Signed-off-by: mahai --- include/platform/dac_if.h | 87 ++++ support/platform/include/dac/dac_core.h | 75 ++++ support/platform/src/dac/dac_core.c | 398 ++++++++++++++++++ support/platform/src/dac/dac_if.c | 56 +++ .../test/unittest/common/hdf_dac_test.cpp | 84 ++++ test/unittest/common/hdf_main_test.c | 6 + test/unittest/common/hdf_main_test.h | 1 + test/unittest/include/hdf_uhdf_test.h | 1 + .../platform/common/dac_driver_test.c | 127 ++++++ test/unittest/platform/common/dac_test.c | 241 +++++++++++ test/unittest/platform/common/dac_test.h | 48 +++ .../platform/entry/hdf_dac_entry_test.c | 26 ++ .../platform/entry/hdf_dac_entry_test.h | 16 + test/unittest/platform/virtual/dac_virtual.c | 195 +++++++++ 14 files changed, 1361 insertions(+) create mode 100644 include/platform/dac_if.h create mode 100644 support/platform/include/dac/dac_core.h create mode 100644 support/platform/src/dac/dac_core.c create mode 100644 support/platform/src/dac/dac_if.c create mode 100644 support/platform/test/unittest/common/hdf_dac_test.cpp create mode 100644 test/unittest/platform/common/dac_driver_test.c create mode 100644 test/unittest/platform/common/dac_test.c create mode 100644 test/unittest/platform/common/dac_test.h create mode 100644 test/unittest/platform/entry/hdf_dac_entry_test.c create mode 100644 test/unittest/platform/entry/hdf_dac_entry_test.h create mode 100644 test/unittest/platform/virtual/dac_virtual.c diff --git a/include/platform/dac_if.h b/include/platform/dac_if.h new file mode 100644 index 000000000..84dfeb73a --- /dev/null +++ b/include/platform/dac_if.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +/** + * @addtogroup DAC + * @{ + * + * @brief Provides Digital to analog converter (DAC) interfaces. + * + * This module allows a driver to perform operations on an DAC controller for accessing devices on the DAC channel, + * Including creating and destroying DAC controller handles and writing data + * + * @since 1.0 + */ +/** + * @file dac_if.h + * + * @brief Declares the standard DAC interface functions. + * + * @since 1.0 + */ + +#ifndef DAC_IF_H +#define DAC_IF_H + +#include "hdf_platform.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct DacIoMsg { + uint32_t number; + uint32_t channel; +}; + + /** + * @brief Obtains the handle of an DAC controller. + * + * You must call this function before accessing the DAC CHANNEL. + * + * @param number Indicates the DAC controller ID. + * + * @return Returns the pointer to the {@link DevHandle} of the DAC controller if the operation is successful; + * returns NULL otherwise. + * @since 1.0 + */ +DevHandle DacOpen(uint32_t number); + + /** + * @brief Releases the handle of an DAC controller. + * + * If you no longer need to access the DAC controller, you should call this function to close its handle so as + * to release unused memory resources. + * + * @param handle Indicates the pointer to the device handle of the DAC controller. + * + * @since 1.0 + */ +void DacClose(DevHandle handle); + + /** + * @brief Start the DAC device for transmission and write the target value in the specified DAC channel. + * + * @param handle Indicates the pointer to the device handle of the DAC controller obtained via {@link DacOpen}. + * @param channel represents the channel through which the DAC transmits messages. + * @param val represents the set digital target value. + * + * @return Returns 0 if the operation is successful; Returns a negative value otherwise.. + * + * @since 1.0 + */ +int32_t DacWrite(DevHandle handle, uint32_t channel, uint32_t val); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* DAC_IF_H */ diff --git a/support/platform/include/dac/dac_core.h b/support/platform/include/dac/dac_core.h new file mode 100644 index 000000000..8c04f35cd --- /dev/null +++ b/support/platform/include/dac/dac_core.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DAC_CORE_H +#define DAC_CORE_H + +#include "osal_spinlock.h" +#include "hdf_base.h" +#include "dac_if.h" +#include "platform_core.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +#define DAC_DEVICES_MAX 15 + +struct DacDevice; +struct DacMethod; +struct DacLockMethod; + +struct DacDevice { + const struct DacMethod *ops; + OsalSpinlock spin; + uint32_t devNum; + uint32_t chanNum; + const struct DacLockMethod *lockOps; + void *priv; +}; + +struct DacMethod { + int32_t (*write)(struct DacDevice *device, uint32_t channel, uint32_t val); + int32_t (*start)(struct DacDevice *device); + int32_t (*stop)(struct DacDevice *device); +}; + +struct DacLockMethod { + int32_t (*lock)(struct DacDevice *device); + void (*unlock)(struct DacDevice *device); +}; + +enum DacIoCmd { + DAC_IO_READ = 0, + DAC_IO_OPEN, + DAC_IO_CLOSE, +}; + +int32_t DacDeviceAdd(struct DacDevice *device); + +void DacDeviceRemove(struct DacDevice *device); + +struct DacDevice *DacDeviceGet(uint32_t number); + +void DacDevicePut(struct DacDevice *device); + +int32_t DacDeviceWrite(struct DacDevice *device, uint32_t channel, uint32_t val); + +int32_t DacDeviceStart(struct DacDevice *device); + +int32_t DacDeviceStop(struct DacDevice *device); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* DAC_CORE_H */ diff --git a/support/platform/src/dac/dac_core.c b/support/platform/src/dac/dac_core.c new file mode 100644 index 000000000..2454ae6f5 --- /dev/null +++ b/support/platform/src/dac/dac_core.c @@ -0,0 +1,398 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "dac_core.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_spinlock.h" +#include "osal_time.h" +#include "platform_core.h" + +#define HDF_LOG_TAG dac_core_c + +struct DacManager { + struct IDeviceIoService service; + struct HdfDeviceObject *device; + struct DacDevice *devices[DAC_DEVICES_MAX]; + OsalSpinlock spin; +}; + +static struct DacManager *g_dacManager = NULL; + +static int32_t DacDeviceLockDefault(struct DacDevice *device) +{ + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return OsalSpinLock(&device->spin); +} + +static void DacDeviceUnlockDefault(struct DacDevice *device) +{ + if (device == NULL) { + return; + } + (void)OsalSpinUnlock(&device->spin); +} + +static const struct DacLockMethod g_dacLockOpsDefault = { + .lock = DacDeviceLockDefault, + .unlock = DacDeviceUnlockDefault, +}; + +static int32_t DacManagerAddDevice(struct DacDevice *device) +{ + int32_t ret; + struct DacManager *manager = g_dacManager; + + if (device->devNum >= DAC_DEVICES_MAX) { + HDF_LOGE("%s: devNum:%u exceed", __func__, device->devNum); + return HDF_ERR_INVALID_OBJECT; + } + + if (manager == NULL) { + HDF_LOGE("%s: get dac manager fail", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (OsalSpinLockIrq(&manager->spin) != HDF_SUCCESS) { + HDF_LOGE("%s: lock dac manager fail", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + if (manager->devices[device->devNum] != NULL) { + HDF_LOGE("%s: dac device num:%u alwritey exits", __func__, device->devNum); + ret = HDF_FAILURE; + } else { + manager->devices[device->devNum] = device; + HDF_LOGE("%s: device:%p", __func__, manager->devices[0]); + ret = HDF_SUCCESS; + } + + (void)OsalSpinUnlockIrq(&manager->spin); + return ret; +} + +static void DacManagerRemoveDevice(struct DacDevice *device) +{ + struct DacManager *manager = g_dacManager; + + if (device->devNum < 0 || device->devNum >= DAC_DEVICES_MAX) { + HDF_LOGE("%s: invalid devNum:%u", __func__, device->devNum); + return; + } + + if (manager == NULL) { + HDF_LOGE("%s: get dac manager fail", __func__); + return; + } + + if (OsalSpinLockIrq(&manager->spin) != HDF_SUCCESS) { + HDF_LOGE("%s: lock dac manager fail", __func__); + return; + } + + if (manager->devices[device->devNum] != device) { + HDF_LOGE("%s: dac device(%u) not in manager", __func__, device->devNum); + } else { + manager->devices[device->devNum] = NULL; + } + + (void)OsalSpinUnlockIrq(&manager->spin); +} + +static struct DacDevice *DacManagerFindDevice(uint32_t number) +{ + struct DacDevice *device = NULL; + struct DacManager *manager = g_dacManager; + + if (number < 0 || number >= DAC_DEVICES_MAX) { + HDF_LOGE("%s: invalid devNum:%u", __func__, number); + return NULL; + } + + if (manager == NULL) { + HDF_LOGE("%s: get dac manager fail", __func__); + return NULL; + } + + if (OsalSpinLockIrq(&manager->spin) != HDF_SUCCESS) { + HDF_LOGE("%s: lock dac manager fail", __func__); + return NULL; + } + + device = manager->devices[number]; + (void)OsalSpinUnlockIrq(&manager->spin); + + return device; +} + +int32_t DacDeviceAdd(struct DacDevice *device) +{ + int32_t ret; + + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + + if (device->ops == NULL) { + HDF_LOGE("%s: no ops supplied", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (device->lockOps == NULL) { + HDF_LOGI("%s: use default lockOps!", __func__); + device->lockOps = &g_dacLockOpsDefault; + } + + if (OsalSpinInit(&device->spin) != HDF_SUCCESS) { + HDF_LOGE("%s: init lock failed", __func__); + return HDF_FAILURE; + } + + ret = DacManagerAddDevice(device); + if (ret != HDF_SUCCESS) { + (void)OsalSpinDestroy(&device->spin); + } + return ret; +} + +void DacDeviceRemove(struct DacDevice *device) +{ + if (device == NULL) { + return; + } + DacManagerRemoveDevice(device); + (void)OsalSpinDestroy(&device->spin); +} + +struct DacDevice *DacDeviceGet(uint32_t number) +{ + return DacManagerFindDevice(number); +} + +void DacDevicePut(struct DacDevice *device) +{ + (void)device; +} + +static inline int32_t DacDeviceLock(struct DacDevice *device) +{ + if (device->lockOps == NULL || device->lockOps->lock == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + return device->lockOps->lock(device); +} + +static inline void DacDeviceUnlock(struct DacDevice *device) +{ + if (device->lockOps != NULL && device->lockOps->unlock != NULL) { + device->lockOps->unlock(device); + } +} + +int32_t DacDeviceWrite(struct DacDevice *device, uint32_t channel, uint32_t val) +{ + int32_t ret; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (device->ops == NULL || device->ops->write == NULL) { + HDF_LOGE("%s: ops or write is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (DacDeviceLock(device) != HDF_SUCCESS) { + HDF_LOGE("%s: lock add device failed", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = device->ops->write(device, channel, val); + DacDeviceUnlock(device); + return ret; +} + +int32_t DacDeviceStart(struct DacDevice *device) +{ + int32_t ret; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (device->ops == NULL || device->ops->start == NULL) { + HDF_LOGE("%s: ops or start is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (DacDeviceLock(device) != HDF_SUCCESS) { + HDF_LOGE("%s: lock add device failed", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = device->ops->start(device); + DacDeviceUnlock(device); + return ret; +} + +int32_t DacDeviceStop(struct DacDevice *device) +{ + int32_t ret; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (device->ops == NULL || device->ops->stop == NULL) { + HDF_LOGE("%s: ops or stop is null", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + if (DacDeviceLock(device) != HDF_SUCCESS) { + HDF_LOGE("%s: lock add device failed", __func__); + return HDF_ERR_DEVICE_BUSY; + } + + ret = device->ops->stop(device); + DacDeviceUnlock(device); + return ret; +} + +static int32_t DacManagerIoOpen(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + uint32_t number; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint32(data, &number)) { + return HDF_ERR_IO; + } + + if (number < 0 || number >= DAC_DEVICES_MAX || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (DacDeviceGet(number) == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + if (!HdfSbufWriteUint32(reply, number)) { + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +static int32_t DacManagerIoClose(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + uint32_t number; + + if (data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint32(data, &number)) { + return HDF_ERR_IO; + } + + if (number < 0 || number >= DAC_DEVICES_MAX) { + return HDF_ERR_INVALID_PARAM; + } + DacDevicePut(DacManagerFindDevice(number)); + return HDF_SUCCESS; +} + +static int32_t DacManagerIoRead(struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)data; + (void)reply; + return HDF_SUCCESS; +} + +static int32_t DacManagerDispatch(struct HdfDeviceIoClient *client, int cmd, + struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret; + + switch (cmd) { + case DAC_IO_OPEN: + return DacManagerIoOpen(data, reply); + case DAC_IO_CLOSE: + return DacManagerIoClose(data, reply); + case DAC_IO_READ: + return DacManagerIoRead(data, reply); + default: + ret = HDF_ERR_NOT_SUPPORT; + break; + } + return ret; +} + +static int32_t DacManagerInit(struct HdfDeviceObject *device) +{ + int32_t ret; + struct DacManager *manager = NULL; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + manager = (struct DacManager *)OsalMemCalloc(sizeof(*manager)); + if (manager == NULL) { + HDF_LOGE("%s: alloc manager failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = OsalSpinInit(&manager->spin); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: spinlock init failed", __func__); + OsalMemFree(manager); + return HDF_FAILURE; + } + + manager->device = device; + g_dacManager = manager; + device->service = &manager->service; + device->service->Dispatch = DacManagerDispatch; + return HDF_SUCCESS; +} + +static void DacManagerRelease(struct HdfDeviceObject *device) +{ + struct DacManager *manager = NULL; + + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return; + } + + manager = (struct DacManager *)device->service; + if (manager == NULL) { + HDF_LOGI("%s: no service bind", __func__); + return; + } + + g_dacManager = NULL; + OsalMemFree(manager); +} + +struct HdfDriverEntry g_dacManagerEntry = { + .moduleVersion = 1, + .Init = DacManagerInit, + .Release = DacManagerRelease, + .moduleName = "HDF_PLATFORM_DAC_MANAGER", +}; +HDF_INIT(g_dacManagerEntry); diff --git a/support/platform/src/dac/dac_if.c b/support/platform/src/dac/dac_if.c new file mode 100644 index 000000000..4d188d944 --- /dev/null +++ b/support/platform/src/dac/dac_if.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "dac_if.h" +#include "dac_core.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" +#define HDF_LOG_TAG dac_if_c +#define DAC_SERVICE_NAME "HDF_PLATFORM_DAC_MANAGER" + +DevHandle DacOpen(uint32_t number) +{ + int32_t ret; + struct DacDevice *device = NULL; + + device = DacDeviceGet(number); + if (device == NULL) { + HDF_LOGE("%s: Get device failed!", __func__); + return NULL; + } + + ret = DacDeviceStart(device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: start device failed!", __func__); + return NULL; + } + + return (DevHandle)device; +} + +void DacClose(DevHandle handle) +{ + struct DacDevice *device = (struct DacDevice *)handle; + + if (device == NULL) { + return; + } + + (void)DacDeviceStop(device); + DacDevicePut(device); +} + +int32_t DacWrite(DevHandle handle, uint32_t channel, uint32_t val) +{ + if (handle == NULL) { + HDF_LOGE("%s: invalid handle!", __func__); + return HDF_ERR_INVALID_PARAM; + } + return DacDeviceWrite((struct DacDevice *)handle, channel, val); +} diff --git a/support/platform/test/unittest/common/hdf_dac_test.cpp b/support/platform/test/unittest/common/hdf_dac_test.cpp new file mode 100644 index 000000000..808d90dcc --- /dev/null +++ b/support/platform/test/unittest/common/hdf_dac_test.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdf_uhdf_test.h" +#include "dac_test.h" +#include "hdf_io_service_if.h" + +using namespace testing::ext; + +class HdfLiteDacTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); +}; + +void HdfLiteDacTest::SetUpTestCase() +{ + HdfTestOpenService(); +} + +void HdfLiteDacTest::TearDownTestCase() +{ + HdfTestCloseService(); +} + +void HdfLiteDacTest::SetUp() +{ +} + +void HdfLiteDacTest::TearDown() +{ +} + +/** + * @tc.name: DacTestRead001 + * @tc.desc: dac write test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteDacTest, DacTestWrite001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_DAC_TYPE, DAC_TEST_CMD_WRITE, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: DacTestMultiThread001 + * @tc.desc: dac multi thread test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteDacTest, DacTestMultiThread001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_DAC_TYPE, DAC_TEST_CMD_MULTI_THREAD, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + +/** + * @tc.name: DacTestReliability001 + * @tc.desc: dac reliability test + * @tc.type: FUNC + * @tc.require: NA + */ +HWTEST_F(HdfLiteDacTest, DacTestReliability001, TestSize.Level1) +{ + struct HdfTestMsg msg = {TEST_PAL_DAC_TYPE, DAC_TEST_CMD_RELIABILITY, -1}; + EXPECT_EQ(0, HdfTestSendMsgToService(&msg)); +} + + diff --git a/test/unittest/common/hdf_main_test.c b/test/unittest/common/hdf_main_test.c index ec7bf84c9..52a8d2f1d 100644 --- a/test/unittest/common/hdf_main_test.c +++ b/test/unittest/common/hdf_main_test.c @@ -32,6 +32,9 @@ #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) #include "hdf_adc_entry_test.h" #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_DAC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_DAC) +#include "hdf_dac_entry_test.h" +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I3C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I3C) #include "hdf_i3c_entry_test.h" #endif @@ -101,6 +104,9 @@ HdfTestFuncList g_hdfTestFuncList[] = { #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_ADC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_ADC) { TEST_PAL_ADC_TYPE, HdfAdcTestEntry }, #endif +#if defined(LOSCFG_DRIVERS_HDF_PLATFORM_DAC) || defined(CONFIG_DRIVERS_HDF_PLATFORM_DAC) + { TEST_PAL_DAC_TYPE, HdfDacTestEntry }, +#endif #if defined(LOSCFG_DRIVERS_HDF_PLATFORM_I3C) || defined(CONFIG_DRIVERS_HDF_PLATFORM_I3C) { TEST_PAL_I3C_TYPE, HdfI3cTestEntry }, #endif diff --git a/test/unittest/common/hdf_main_test.h b/test/unittest/common/hdf_main_test.h index fc4cd43eb..173b2294b 100644 --- a/test/unittest/common/hdf_main_test.h +++ b/test/unittest/common/hdf_main_test.h @@ -59,6 +59,7 @@ typedef enum { TEST_PAL_WDT_TYPE = 21, TEST_PAL_I3C_TYPE = 22, TEST_PAL_MIPI_CSI_TYPE = 23, + TEST_PAL_DAC_TYPE = 24, TEST_PAL_END = 200, TEST_OSAL_BEGIN = TEST_PAL_END, #define HDF_OSAL_TEST_ITEM(v) (TEST_OSAL_BEGIN + (v)) diff --git a/test/unittest/include/hdf_uhdf_test.h b/test/unittest/include/hdf_uhdf_test.h index 41f419f7a..8dcc54f65 100644 --- a/test/unittest/include/hdf_uhdf_test.h +++ b/test/unittest/include/hdf_uhdf_test.h @@ -55,6 +55,7 @@ enum HdfTestSubModuleCmd { TEST_PAL_WDT_TYPE = 21, TEST_PAL_I3C_TYPE = 22, TEST_PAL_MIPI_CSI_TYPE = 23, + TEST_PAL_DAC_TYPE = 24, TEST_PAL_END = 200, TEST_OSAL_BEGIN = TEST_PAL_END, #define HDF_OSAL_TEST_ITEM(v) (TEST_OSAL_BEGIN + (v)) diff --git a/test/unittest/platform/common/dac_driver_test.c b/test/unittest/platform/common/dac_driver_test.c new file mode 100644 index 000000000..b83386dfb --- /dev/null +++ b/test/unittest/platform/common/dac_driver_test.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "dac_test.h" +#include "device_resource_if.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG dac_test_driver_c + +static struct DacTestConfig g_config; + +static int32_t DacTestDispatch(struct HdfDeviceIoClient *client, int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + HDF_LOGD("%s: enter!", __func__); + + if (cmd == 0) { + if (reply == NULL) { + HDF_LOGE("%s: reply is null!", __func__); + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufWriteBuffer(reply, &g_config, sizeof(g_config))) { + HDF_LOGE("%s: write reply failed", __func__); + return HDF_ERR_IO; + } + } else { + return HDF_ERR_NOT_SUPPORT; + } + + return HDF_SUCCESS; +} + +static int32_t DacTestReadConfig(struct DacTestConfig *config, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return HDF_FAILURE; + } + + ret = drsOps->GetUint32(node, "devNum", &config->devNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read devNum failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "channel", &config->channel, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read channel failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "maxChannel", &config->maxChannel, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read maxChannel failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "dataWidth", &config->dataWidth, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read dataWidth failed", __func__); + return ret; + } + + ret = drsOps->GetUint32(node, "rate", &config->rate, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read rate failed", __func__); + return ret; + } + + return HDF_SUCCESS; +} + +static int32_t DacTestBind(struct HdfDeviceObject *device) +{ + int32_t ret; + static struct IDeviceIoService service; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or config is null!", __func__); + return HDF_ERR_IO; + } + + ret = DacTestReadConfig(&g_config, device->property); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read config failed", __func__); + return ret; + } + service.Dispatch = DacTestDispatch; + device->service = &service; + HDF_LOGI("%s: Done!", __func__); + return HDF_SUCCESS; +} + +static int32_t DacTestInit(struct HdfDeviceObject *device) +{ + (void)device; + HDF_LOGI("%s: Done!", __func__); + return HDF_SUCCESS; +} + +static void DacTestRelease(struct HdfDeviceObject *device) +{ + if (device != NULL) { + device->service = NULL; + } + HDF_LOGI("%s: Done!", __func__); + return; +} + +struct HdfDriverEntry g_dacTestEntry = { + .moduleVersion = 1, + .Bind = DacTestBind, + .Init = DacTestInit, + .Release = DacTestRelease, + .moduleName = "PLATFORM_DAC_TEST", +}; +HDF_INIT(g_dacTestEntry); diff --git a/test/unittest/platform/common/dac_test.c b/test/unittest/platform/common/dac_test.c new file mode 100644 index 000000000..6789ad16c --- /dev/null +++ b/test/unittest/platform/common/dac_test.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "dac_test.h" +#include "dac_if.h" +#include "hdf_base.h" +#include "hdf_io_service_if.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "osal_thread.h" +#include "osal_time.h" +#include "securec.h" + +#define HDF_LOG_TAG dac_test_c +#define DAC_TEST_WAIT_TIMES 100 +#define TEST_DAC_VAL_NUM 50 +#define DAC_TEST_STACK_SIZE (1024 * 64) + +static int32_t DacTestGetConfig(struct DacTestConfig *config) +{ + int32_t ret; + struct HdfSBuf *reply = NULL; + struct HdfIoService *service = NULL; + const void *buf = NULL; + uint32_t len; + + service = HdfIoServiceBind("DAC_TEST"); + if (service == NULL) { + return HDF_ERR_NOT_SUPPORT; + } + + reply = HdfSBufObtain(sizeof(*config) + sizeof(uint64_t)); + if (reply == NULL) { + HDF_LOGE("%s: failed to obtain reply", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = service->dispatcher->Dispatch(&service->object, 0, NULL, reply); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: remote dispatch failed", __func__); + return ret; + } + + if (!HdfSbufReadBuffer(reply, &buf, &len)) { + HDF_LOGE("%s: read buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (len != sizeof(*config)) { + HDF_LOGE("%s: config size:%zu, read size:%u", __func__, sizeof(*config), len); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + + if (memcpy_s(config, sizeof(*config), buf, sizeof(*config)) != EOK) { + HDF_LOGE("%s: memcpy buf failed", __func__); + HdfSBufRecycle(reply); + return HDF_ERR_IO; + } + HdfSBufRecycle(reply); + HDF_LOGD("%s: exit", __func__); + return HDF_SUCCESS; +} + +struct DacTester *DacTesterGet(void) +{ + int32_t ret; + static struct DacTester tester; + static bool hasInit = false; + + if (hasInit) { + return &tester; + } + ret = DacTestGetConfig(&tester.config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: write config failed:%d", __func__, ret); + return NULL; + } + tester.handle = DacOpen(tester.config.devNum); + if (tester.handle == NULL) { + HDF_LOGE("%s: open dac device:%u failed", __func__, tester.config.devNum); + return NULL; + } + hasInit = true; + return &tester; +} + +int32_t DacTestWrite(void) +{ + struct DacTester *tester = NULL; + uint32_t value[TEST_DAC_VAL_NUM]; + int32_t ret; + int i; + + tester = DacTesterGet(); + if (tester == NULL || tester->handle == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + return HDF_ERR_INVALID_OBJECT; + } + for (i = 0; i < TEST_DAC_VAL_NUM; i++) { + value[i] = 0; + ret = DacWrite(tester->handle, tester->config.channel, value[i]); + if (ret != HDF_SUCCESS || value[i] >= (1U << tester->config.dataWidth)) { + HDF_LOGE("%s: write value invalid:%u, ret:%d", __func__, value[i], ret); + return HDF_ERR_IO; + } + } + + return HDF_SUCCESS; +} + +static int DacTestThreadFunc(void *param) +{ + struct DacTester *tester = NULL; + uint32_t val; + int i; + int32_t ret; + tester = DacTesterGet(); + if (tester == NULL) { + HDF_LOGE("%s: get tester failed", __func__); + *((int32_t *)param) = 1; + return HDF_ERR_INVALID_OBJECT; + } + for (i = 0; i < DAC_TEST_WAIT_TIMES; i++) { + val = i; + ret = DacWrite(tester->handle, tester->config.channel, val); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: DacWrite failed, ret:%d", __func__, ret); + return HDF_ERR_IO; + } + } + + *((int32_t *)param) = 1; + return val; +} + +int32_t DacTestMultiThread(void) +{ + int32_t ret; + struct OsalThread thread1, thread2; + struct OsalThreadParam cfg1, cfg2; + int32_t count1, count2; + + count1 = count2 = 0; + ret = OsalThreadCreate(&thread1, (OsalThreadEntry)DacTestThreadFunc, (void *)&count1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadCreate(&thread2, (OsalThreadEntry)DacTestThreadFunc, (void *)&count2); + if (ret != HDF_SUCCESS) { + HDF_LOGE("create test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + cfg1.name = "DacTestThread-1"; + cfg2.name = "DacTestThread-2"; + cfg1.priority = cfg2.priority = OSAL_THREAD_PRI_DEFAULT; + cfg1.stackSize = cfg2.stackSize = DAC_TEST_STACK_SIZE; + + ret = OsalThreadStart(&thread1, &cfg1); + if (ret != HDF_SUCCESS) { + HDF_LOGE("start test thread1 fail:%d", ret); + return HDF_FAILURE; + } + + ret = OsalThreadStart(&thread2, &cfg2); + if (ret != HDF_SUCCESS) { + HDF_LOGE("start test thread2 fail:%d", ret); + return HDF_FAILURE; + } + + while (count1 == 0 || count2 == 0) { + HDF_LOGE("waitting testing thread finish..."); + OsalMSleep(DAC_TEST_WAIT_TIMES); + } + + (void)OsalThreadDestroy(&thread1); + (void)OsalThreadDestroy(&thread2); + return HDF_SUCCESS; +} + +int32_t DacTestReliability(void) +{ + struct DacTester *tester = NULL; + uint32_t val; + + val = 0; + tester = DacTesterGet(); + if (tester == NULL || tester->handle == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + HDF_LOGD("%s: test dfr for DacRead ...", __func__); + // invalid handle + (void)DacWrite(NULL, tester->config.channel, val); + // invalid channel + (void)DacWrite(tester->handle, tester->config.maxChannel + 1, val); + return HDF_SUCCESS; +} + +struct DacTestEntry { + int cmd; + int32_t (*func)(void); + const char *name; +}; +static struct DacTestEntry g_entry[] = { + { DAC_TEST_CMD_WRITE, DacTestWrite, "DacTestWrite" }, + { DAC_TEST_CMD_MULTI_THREAD, DacTestMultiThread, "DacTestMultiThread" }, + { DAC_TEST_CMD_RELIABILITY, DacTestReliability, "DacTestReliability" }, +}; + +int32_t DacTestExecute(int cmd) +{ + uint32_t i; + int32_t ret = HDF_ERR_NOT_SUPPORT; + + if (cmd > DAC_TEST_CMD_MAX) { + HDF_LOGE("%s: invalid cmd:%d", __func__, cmd); + ret = HDF_ERR_NOT_SUPPORT; + goto __EXIT__; + } + + for (i = 0; i < sizeof(g_entry) / sizeof(g_entry[0]); i++) { + if (g_entry[i].cmd != cmd || g_entry[i].func == NULL) { + continue; + } + ret = g_entry[i].func(); + break; + } + +__EXIT__: + HDF_LOGE("[%s][======cmd:%d====ret:%d======]", __func__, cmd, ret); + return ret; +} diff --git a/test/unittest/platform/common/dac_test.h b/test/unittest/platform/common/dac_test.h new file mode 100644 index 000000000..4e25d2f0c --- /dev/null +++ b/test/unittest/platform/common/dac_test.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DAC_TEST_H +#define DAC_TEST_H + +#include "dac_if.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* __cplusplus */ + +struct DacTestConfig { + uint32_t devNum; + uint32_t channel; + uint32_t maxChannel; + uint32_t dataWidth; + uint32_t rate; +}; + +struct DacTester { + struct DacTestConfig config; + DevHandle handle; +}; + +enum DacTestCmd { + DAC_TEST_CMD_WRITE = 0, + DAC_TEST_CMD_MULTI_THREAD, + DAC_TEST_CMD_RELIABILITY, + DAC_TEST_CMD_MAX, +}; + +int32_t DacTestExecute(int cmd); + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* __cplusplus */ + +#endif /* DAC_TEST_H */ diff --git a/test/unittest/platform/entry/hdf_dac_entry_test.c b/test/unittest/platform/entry/hdf_dac_entry_test.c new file mode 100644 index 000000000..afcf67744 --- /dev/null +++ b/test/unittest/platform/entry/hdf_dac_entry_test.c @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_dac_entry_test.h" +#include "hdf_log.h" +#include "dac_test.h" +#include "hdf_log.h" + +#define HDF_LOG_TAG hdf_dac_entry_test + +int32_t HdfDacTestEntry(HdfTestMsg *msg) +{ + HDF_LOGE("%s: enter", __func__); + if (msg == NULL) { + return HDF_FAILURE; + } + + msg->result = DacTestExecute(msg->subCmd); + + return HDF_SUCCESS; +} diff --git a/test/unittest/platform/entry/hdf_dac_entry_test.h b/test/unittest/platform/entry/hdf_dac_entry_test.h new file mode 100644 index 000000000..b693b6b0e --- /dev/null +++ b/test/unittest/platform/entry/hdf_dac_entry_test.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_DAC_ENTRY_TEST_H +#define HDF_DAC_ENTRY_TEST_H + +#include "hdf_main_test.h" + +int32_t HdfDacTestEntry(HdfTestMsg *msg); + +#endif /* HDF_DAC_ENTRY_TEST_H */ \ No newline at end of file diff --git a/test/unittest/platform/virtual/dac_virtual.c b/test/unittest/platform/virtual/dac_virtual.c new file mode 100644 index 000000000..b8314ed27 --- /dev/null +++ b/test/unittest/platform/virtual/dac_virtual.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "dac/dac_core.h" +#include "asm/platform.h" +#include "device_resource_if.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "los_hwi.h" +#include "osal_io.h" +#include "osal_mem.h" +#include "osal_time.h" + +#define HDF_LOG_TAG dac_virtual + +struct VirtualDacDevice { + struct DacDevice device; + uint32_t deviceNum; + uint32_t validChannel; + uint32_t rate; +}; + +static int32_t VirtualDacWrite(struct DacDevice *device, uint32_t channel, uint32_t val) +{ + (void)device; + (void)channel; + (void)val; + HDF_LOGI("%s: done!", __func__); + + return HDF_SUCCESS; +} + +static inline int32_t VirtualDacStart(struct DacDevice *device) +{ + (void)device; + HDF_LOGI("%s: done!", __func__); + return HDF_SUCCESS; +} + +static inline int32_t VirtualDacStop(struct DacDevice *device) +{ + (void)device; + HDF_LOGI("%s: done!", __func__); + return HDF_SUCCESS; +} + +static inline void VirtualDacDeviceInit(struct VirtualDacDevice *virtual) +{ + HDF_LOGI("%s: device:%u init done!", __func__, virtual->deviceNum); +} + +static const struct DacMethod g_method = { + .write = VirtualDacWrite, + .stop = VirtualDacStop, + .start = VirtualDacStart, +}; + +static int32_t VirtualDacReadDrs(struct VirtualDacDevice *virtual, const struct DeviceResourceNode *node) +{ + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: Invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + if (drsOps->GetUint32(node, "deviceNum", &virtual->deviceNum, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read deviceNum fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "validChannel", &virtual->validChannel, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read validChannel fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "rate", &virtual->rate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read rate fail!", __func__); + return HDF_ERR_IO; + } + return HDF_SUCCESS; +} + +static int32_t VirtualDacParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) +{ + int32_t ret; + struct VirtualDacDevice *virtual = NULL; + (void)device; + + virtual = (struct VirtualDacDevice *)OsalMemCalloc(sizeof(*virtual)); + if (virtual == NULL) { + HDF_LOGE("%s: Malloc virtual fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = VirtualDacReadDrs(virtual, node); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); + goto __ERR__; + } + + VirtualDacDeviceInit(virtual); + virtual->device.priv = (void *)node; + virtual->device.devNum = virtual->deviceNum; + virtual->device.ops = &g_method; + ret = DacDeviceAdd(&virtual->device); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add Dac controller failed! ret = %d", __func__, ret); + goto __ERR__; + } + + return HDF_SUCCESS; +__ERR__: + if (virtual != NULL) { + OsalMemFree(virtual); + virtual = NULL; + } + + return ret; +} + +static int32_t VirtualDacInit(struct HdfDeviceObject *device) +{ + int32_t ret; + const struct DeviceResourceNode *childNode = NULL; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + ret = HDF_SUCCESS; + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = VirtualDacParseAndInit(device, childNode); + if (ret != HDF_SUCCESS) { + break; + } + } + return ret; +} + +static void VirtualDacRemoveByNode(const struct DeviceResourceNode *node) +{ + int32_t ret; + int16_t devNum; + struct DacDevice *device = NULL; + struct VirtualDacDevice *virtual = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return; + } + + ret = drsOps->GetUint16(node, "devNum", (uint16_t *)&devNum, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read devNum fail!", __func__); + return; + } + + device = DacDeviceGet(devNum); + if (device != NULL && device->priv == node) { + DacDevicePut(device); + DacDeviceRemove(device); + virtual = (struct VirtualDacDevice *)device; + OsalMemFree(virtual); + } + return; +} + +static void VirtualDacRelease(struct HdfDeviceObject *device) +{ + const struct DeviceResourceNode *childNode = NULL; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return; + } + + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + VirtualDacRemoveByNode(childNode); + } +} + +struct HdfDriverEntry g_dacDriverEntry = { + .moduleVersion = 1, + .Init = VirtualDacInit, + .Release = VirtualDacRelease, + .moduleName = "virtual_dac_driver", +}; +HDF_INIT(g_dacDriverEntry); -- Gitee From 9ba23d612c054963825f436bb6359978a10165d6 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Wed, 1 Dec 2021 10:27:04 +0800 Subject: [PATCH 231/272] feat: A driver data interface is extended. Signed-off-by: wangyeyu --- include/platform/mipi_csi_if.h | 12 +++++++++ include/platform/mipi_dsi_if.h | 2 +- support/platform/include/mipi/mipi_csi_core.h | 13 +++++++++ support/platform/include/mipi/mipi_dsi_core.h | 4 +-- support/platform/src/mipi/mipi_csi_core.c | 27 +++++++++++++++++++ support/platform/src/mipi/mipi_csi_if.c | 5 ++++ support/platform/src/mipi/mipi_dsi_core.c | 2 +- support/platform/src/mipi/mipi_dsi_if.c | 2 +- 8 files changed, 62 insertions(+), 5 deletions(-) diff --git a/include/platform/mipi_csi_if.h b/include/platform/mipi_csi_if.h index 856284292..875cac07d 100755 --- a/include/platform/mipi_csi_if.h +++ b/include/platform/mipi_csi_if.h @@ -536,6 +536,18 @@ int32_t MipiCsiDisableSensorClock(DevHandle handle, uint8_t snsClkSource); */ int32_t MipiCsiSetExtDataType(DevHandle handle, ExtDataType* dataType); +/** + * @brief Sets additional parameters for a MIPI CSI device. + * + * @param handle Indicates the MIPI CSI device handle obtained via {@link MipiCsiOpen}. + * @param drvData Indicates the pointer to the additional parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiSetDrvData(DevHandle handle, void *drvData); + #ifdef __cplusplus #if __cplusplus } diff --git a/include/platform/mipi_dsi_if.h b/include/platform/mipi_dsi_if.h index f3c3e6467..e77b45f3b 100644 --- a/include/platform/mipi_dsi_if.h +++ b/include/platform/mipi_dsi_if.h @@ -301,7 +301,7 @@ int32_t MipiDsiAttach(DevHandle handle, uint8_t *name); * * @since 1.0 */ -int32_t MipiDsiSetDrvData(DevHandle handle, DevHandle *panelData); +int32_t MipiDsiSetDrvData(DevHandle handle, void *panelData); #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/include/mipi/mipi_csi_core.h b/support/platform/include/mipi/mipi_csi_core.h index 54fdba139..3120f9637 100755 --- a/support/platform/include/mipi/mipi_csi_core.h +++ b/support/platform/include/mipi/mipi_csi_core.h @@ -246,6 +246,7 @@ struct MipiCsiCntlrMethod { int32_t (*disableSensorClock)(struct MipiCsiCntlr *cntlr, uint8_t snsClkSource); int32_t (*resetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); int32_t (*unresetSensor)(struct MipiCsiCntlr *cntlr, uint8_t snsResetSource); + int32_t (*setDrvData)(struct MipiCsiCntlr *cntlr, void *drvData); }; /** @@ -455,6 +456,18 @@ int32_t MipiCsiCntlrDisableSensorClock(struct MipiCsiCntlr *cntlr, uint8_t snsCl */ int32_t MipiCsiCntlrSetExtDataType(struct MipiCsiCntlr *cntlr, ExtDataType* dataType); +/** + * @brief Sets additional parameters for a MIPI CSI device. + * + * @param cntlr Indicates the MIPI CSI device obtained via {@link MipiCsiOpen}. + * @param drvData Indicates the pointer to the additional parameters. + * + * @return Returns 0 if the operation is successful; returns a negative value otherwise. + * + * @since 1.0 + */ +int32_t MipiCsiCntlrSetDrvData(struct MipiCsiCntlr *cntlr, void *drvData); + /** * @brief Get controller context parameter variable for debugging. * diff --git a/support/platform/include/mipi/mipi_dsi_core.h b/support/platform/include/mipi/mipi_dsi_core.h index a5ec09412..429c3310e 100644 --- a/support/platform/include/mipi/mipi_dsi_core.h +++ b/support/platform/include/mipi/mipi_dsi_core.h @@ -45,7 +45,7 @@ struct MipiDsiCntlrMethod { void (*exitUlps)(struct MipiDsiCntlr *cntlr); int32_t (*powerControl)(struct MipiDsiCntlr *cntlr, uint8_t enable); int32_t (*attach)(struct MipiDsiCntlr *cntlr, uint8_t *name); - int32_t (*setDrvData)(struct MipiDsiCntlr *cntlr, DevHandle *panelData); + int32_t (*setDrvData)(struct MipiDsiCntlr *cntlr, void *panelData); }; int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject *device); @@ -171,7 +171,7 @@ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name); * * @since 1.0 */ -int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, DevHandle *panelData); +int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, void *panelData); #ifdef __cplusplus #if __cplusplus diff --git a/support/platform/src/mipi/mipi_csi_core.c b/support/platform/src/mipi/mipi_csi_core.c index f665b8bb1..f78e07a44 100755 --- a/support/platform/src/mipi/mipi_csi_core.c +++ b/support/platform/src/mipi/mipi_csi_core.c @@ -444,6 +444,33 @@ int32_t MipiCsiCntlrUnresetSensor(struct MipiCsiCntlr *cntlr, uint8_t snsResetSo return ret; } +int32_t MipiCsiCntlrSetDrvData(struct MipiCsiCntlr *cntlr, void *drvData) +{ + int32_t ret; + + if ((cntlr == NULL) || (cntlr->ops == NULL)) { + HDF_LOGE("%s: cntlr or ops is NULL.", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + if (cntlr->ops->setDrvData == NULL) { + HDF_LOGE("%s: setDrvData is NULL.", __func__); + return HDF_ERR_NOT_SUPPORT; + } + + (void)OsalMutexLock(&(cntlr->lock)); + ret = cntlr->ops->setDrvData(cntlr, drvData); + (void)OsalMutexUnlock(&(cntlr->lock)); + + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success!", __func__); + } else { + HDF_LOGE("%s: failed!", __func__); + } + + return ret; +} + int32_t MipiCsiDebugGetMipiDevCtx(struct MipiCsiCntlr *cntlr, MipiDevCtx *ctx) { if (cntlr == NULL) { diff --git a/support/platform/src/mipi/mipi_csi_if.c b/support/platform/src/mipi/mipi_csi_if.c index f11d219bb..4da055620 100755 --- a/support/platform/src/mipi/mipi_csi_if.c +++ b/support/platform/src/mipi/mipi_csi_if.c @@ -80,3 +80,8 @@ int32_t MipiCsiUnresetSensor(DevHandle handle, uint8_t snsResetSource) { return MipiCsiCntlrUnresetSensor((struct MipiCsiCntlr *)handle, snsResetSource); } + +int32_t MipiCsiSetDrvData(DevHandle handle, void *drvData) +{ + return MipiCsiCntlrSetDrvData((struct MipiCsiCntlr *)handle, drvData); +} diff --git a/support/platform/src/mipi/mipi_dsi_core.c b/support/platform/src/mipi/mipi_dsi_core.c index c11d85579..af39f452e 100644 --- a/support/platform/src/mipi/mipi_dsi_core.c +++ b/support/platform/src/mipi/mipi_dsi_core.c @@ -355,7 +355,7 @@ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name) return ret; } -int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, DevHandle *panelData) +int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, void *panelData) { int32_t ret; diff --git a/support/platform/src/mipi/mipi_dsi_if.c b/support/platform/src/mipi/mipi_dsi_if.c index 0df8690d8..3d22e9a26 100755 --- a/support/platform/src/mipi/mipi_dsi_if.c +++ b/support/platform/src/mipi/mipi_dsi_if.c @@ -56,7 +56,7 @@ int32_t MipiDsiAttach(DevHandle handle, uint8_t *name) return MipiDsiCntlrAttach((struct MipiDsiCntlr *)handle, name); } -int32_t MipiDsiSetDrvData(DevHandle handle, DevHandle *panelData) +int32_t MipiDsiSetDrvData(DevHandle handle, void *panelData) { return MipiDsiCntlrSetDrvData((struct MipiDsiCntlr *)handle, panelData); } -- Gitee From cb63a34e4a4e399906d1103a21d3ad1ef0cf7494 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 2 Dec 2021 07:25:56 +0000 Subject: [PATCH 232/272] Description: wlan 5GHz adapter framework Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/include/hdf_wifi_cmd.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 9233c64a8..8096da70d 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -313,13 +313,14 @@ typedef struct { } WifiIeee80211Channel; #define MAX_SUPPORTED_RATE 12 +#define WIFI_5G_CHANNEL_NUM 24 typedef struct { int32_t channelNum; uint16_t bitrate[MAX_SUPPORTED_RATE]; uint16_t htCapab; uint8_t resv[2]; - WifiIeee80211Channel iee80211Channel[24]; + WifiIeee80211Channel iee80211Channel[WIFI_5G_CHANNEL_NUM]; } WifiHwFeatureData; typedef struct { -- Gitee From 3fcc553af14ce66ed1e1e418ae5336109a4a28e7 Mon Sep 17 00:00:00 2001 From: yue Date: Fri, 3 Dec 2021 10:44:14 +0800 Subject: [PATCH 233/272] feat:integrate hdi into the ohos compiling system Signed-off-by: yue --- tools/hdi-gen/BUILD.gn | 22 ++ tools/hdi-gen/Makefile | 3 +- tools/hdi-gen/ast/ast_interface_type.cpp | 2 +- tools/hdi-gen/build_hdi_files.py | 292 ++++++++++++++++++ .../codegen/c_client_proxy_code_emitter.cpp | 228 +++++++------- .../codegen/c_client_proxy_code_emitter.h | 14 +- .../codegen/c_custom_types_code_emitter.cpp | 2 +- .../codegen/c_interface_code_emitter.cpp | 141 +++++++++ .../codegen/c_interface_code_emitter.h | 45 +++ .../codegen/c_service_driver_code_emitter.cpp | 63 ++-- .../codegen/c_service_impl_code_emitter.cpp | 49 +-- .../codegen/c_service_stub_code_emitter.cpp | 239 +++++++++++--- .../codegen/c_service_stub_code_emitter.h | 14 +- tools/hdi-gen/codegen/code_generator.cpp | 34 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 32 +- .../codegen/cpp_client_proxy_code_emitter.h | 2 + tools/hdi-gen/codegen/cpp_code_emitter.cpp | 14 + tools/hdi-gen/codegen/cpp_code_emitter.h | 4 + .../codegen/cpp_interface_code_emitter.cpp | 220 +++++++++++++ .../codegen/cpp_interface_code_emitter.h | 57 ++++ .../cpp_service_driver_code_emitter.cpp | 50 +-- .../codegen/cpp_service_impl_code_emitter.cpp | 54 +++- .../codegen/cpp_service_impl_code_emitter.h | 8 + .../codegen/cpp_service_stub_code_emitter.cpp | 208 ++++++++++--- .../codegen/cpp_service_stub_code_emitter.h | 12 +- tools/hdi-gen/main.cpp | 12 +- tools/hdi-gen/parser/module_parser.cpp | 45 ++- tools/hdi-gen/parser/module_parser.h | 4 + tools/hdi-gen/util/options.cpp | 62 ++-- tools/hdi-gen/util/options.h | 40 ++- 30 files changed, 1549 insertions(+), 423 deletions(-) create mode 100755 tools/hdi-gen/BUILD.gn create mode 100755 tools/hdi-gen/build_hdi_files.py create mode 100755 tools/hdi-gen/codegen/c_interface_code_emitter.cpp create mode 100755 tools/hdi-gen/codegen/c_interface_code_emitter.h create mode 100755 tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp create mode 100755 tools/hdi-gen/codegen/cpp_interface_code_emitter.h diff --git a/tools/hdi-gen/BUILD.gn b/tools/hdi-gen/BUILD.gn new file mode 100755 index 000000000..f2892d4ea --- /dev/null +++ b/tools/hdi-gen/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +action("build_hdi_gen") { + script = "/usr/bin/env" + if (defined(ohos_lite)) { + script = "//build/lite/run_shell_cmd.py" + } + + outputs = [ "$target_out_dir/hdi-gen" ] + + args = [ + "make", + "-j8", + "-C", + rebase_path("."), + "OUT_DIR=" + rebase_path(target_out_dir), + ] +} diff --git a/tools/hdi-gen/Makefile b/tools/hdi-gen/Makefile index 47499d30c..538367888 100755 --- a/tools/hdi-gen/Makefile +++ b/tools/hdi-gen/Makefile @@ -4,7 +4,8 @@ # the GPL, or the BSD license, at your option. # See the LICENSE file in the root of this repository for complete details. -export TARGET:=hdi-gen +export OUT_DIR:=. +export TARGET:=$(OUT_DIR)/hdi-gen export CXXFLAGS = -std=c++14 -O2 -w export Q := @ export MAKEFLAGS += --no-print-directory diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index 850f7f6c5..b093998e9 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -154,7 +154,7 @@ void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); sb.Append(prefix + g_tab).Append("goto errors;\n"); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).AppendFormat("%s = %sProxyObtain(%s);\n", + sb.Append(prefix).AppendFormat("%s = %sGet(%s);\n", name.string(), miName.string(), remoteName.string()); } diff --git a/tools/hdi-gen/build_hdi_files.py b/tools/hdi-gen/build_hdi_files.py new file mode 100755 index 000000000..d30e27971 --- /dev/null +++ b/tools/hdi-gen/build_hdi_files.py @@ -0,0 +1,292 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# +# Copyright (c) 2021, Huawei Device Co., Ltd. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Willow Garage, Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import os +import sys + +class IdlType: + INTERFACE = 1 + CALLBACK = 2 + TYPES = 3 + +def translate_file_name(file_name): + name = file_name[1:] if file_name.startswith("I") else file_name + translate_name = "" + for i in range(len(name)): + c = name[i] + if c >= 'A' and c <= 'Z': + if i > 1: + translate_name += "_" + translate_name += c.lower() + else: + translate_name += c + return translate_name + + +def get_idl_file_type(file_path): + idl_type = IdlType.TYPES + file = open(file_path, "r") + for file_line in file.readlines(): + interface_index = file_line.find("interface") + if interface_index != -1: + if file_line.find("[callback]", 0, interface_index) != -1: + idl_type = IdlType.CALLBACK + else: + idl_type = IdlType.INTERFACE + break + else: + continue + file.close() + return idl_type + +def c_interface_file_translate(idl_file, out_dir, part, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + iface_header_file = os.path.join(out_dir, "i" + file_name + ".h") + client_proxy_source_file = os.path.join(out_dir, file_name + "_proxy.c") + server_driver_source_file = os.path.join(out_dir, file_name + "_driver.c") + server_stub_header_file = os.path.join(out_dir, file_name + "_stub.h") + server_stub_source_file = os.path.join(out_dir, file_name + "_stub.c") + server_impl_header_file = os.path.join(out_dir, file_name + "_service.h") + server_impl_source_file = os.path.join(out_dir, file_name + "_service.c") + + if part == "client_lib_source": + outputs.append(iface_header_file) + outputs.append(client_proxy_source_file) + elif part == "server_lib_source": + outputs.append(iface_header_file) + outputs.append(server_driver_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + else: + outputs.append(iface_header_file) + outputs.append(client_proxy_source_file) + outputs.append(server_driver_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + outputs.append(server_impl_header_file) + outputs.append(server_impl_source_file) + +def c_callback_file_translate(idl_file, out_dir, part, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + iface_header_file = os.path.join(out_dir, "i" + file_name + ".h") + client_proxy_source_file = os.path.join(out_dir, file_name + "_proxy.c") + server_stub_header_file = os.path.join(out_dir, file_name + "_stub.h") + server_stub_source_file = os.path.join(out_dir, file_name + "_stub.c") + server_impl_header_file = os.path.join(out_dir, file_name + "_service.h") + server_impl_source_file = os.path.join(out_dir, file_name + "_service.c") + + if part == "client_lib_source": + outputs.append(iface_header_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + elif part == "server_lib_source": + outputs.append(iface_header_file) + outputs.append(client_proxy_source_file) + else: + outputs.append(iface_header_file) + outputs.append(client_proxy_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + outputs.append(server_impl_header_file) + outputs.append(server_impl_source_file) + +def c_types_file_translate(idl_file, out_dir, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + types_header_file = os.path.join(out_dir, file_name + ".h") + types_source_file = os.path.join(out_dir, file_name + ".c") + + outputs.append(types_header_file) + outputs.append(types_source_file) + +def c_idl_translate(idl_files, out_dir): + outputs = [] + for idl_file in idl_files: + idl_file_type = get_idl_file_type(idl_file) + if idl_file_type == IdlType.INTERFACE: + c_interface_file_translate(idl_file, out_dir, "all", outputs) + elif idl_file_type == IdlType.CALLBACK: + c_callback_file_translate(idl_file, out_dir, "all", outputs) + elif idl_file_type == IdlType.TYPES: + c_types_file_translate(idl_file, out_dir, outputs) + return outputs + +def cpp_interface_file_translate(idl_file, out_dir, part, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + iface_header_file = os.path.join(out_dir, "i" + file_name + ".h") + client_proxy_header_file = os.path.join(out_dir, file_name + "_proxy.h") + client_proxy_source_file = os.path.join(out_dir, file_name + "_proxy.cpp") + server_driver_source_file = os.path.join(out_dir, file_name + "_driver.cpp") + server_stub_header_file = os.path.join(out_dir, file_name + "_stub.h") + server_stub_source_file = os.path.join(out_dir, file_name + "_stub.cpp") + server_impl_header_file = os.path.join(out_dir, file_name + "_service.h") + server_impl_source_file = os.path.join(out_dir, file_name + "_service.cpp") + + if part == "client_lib_source": + outputs.append(iface_header_file) + outputs.append(client_proxy_header_file) + outputs.append(client_proxy_source_file) + elif part == "server_lib_source": + outputs.append(iface_header_file) + outputs.append(server_driver_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + else: + outputs.append(iface_header_file) + outputs.append(client_proxy_header_file) + outputs.append(client_proxy_source_file) + outputs.append(server_driver_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + outputs.append(server_impl_header_file) + outputs.append(server_impl_source_file) + +def cpp_callback_file_translate(idl_file, out_dir, part, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + iface_header_file = os.path.join(out_dir, "i" + file_name + ".h") + client_proxy_header_file = os.path.join(out_dir, file_name + "_proxy.h") + client_proxy_source_file = os.path.join(out_dir, file_name + "_proxy.cpp") + server_stub_header_file = os.path.join(out_dir, file_name + "_stub.h") + server_stub_source_file = os.path.join(out_dir, file_name + "_stub.cpp") + server_impl_header_file = os.path.join(out_dir, file_name + "_service.h") + server_impl_source_file = os.path.join(out_dir, file_name + "_service.cpp") + + if part == "client_lib_source": + outputs.append(iface_header_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + elif part == "server_lib_source": + outputs.append(iface_header_file) + outputs.append(client_proxy_header_file) + outputs.append(client_proxy_source_file) + else: + outputs.append(iface_header_file) + outputs.append(client_proxy_header_file) + outputs.append(client_proxy_source_file) + outputs.append(server_stub_header_file) + outputs.append(server_stub_source_file) + outputs.append(server_impl_header_file) + outputs.append(server_impl_source_file) + +def cpp_types_file_translate(idl_file, out_dir, outputs): + file = idl_file.split("/")[-1] + file_name = translate_file_name(file.split(".")[0]) + + types_header_file = os.path.join(out_dir, file_name + ".h") + types_source_file = os.path.join(out_dir, file_name + ".cpp") + + outputs.append(types_header_file) + outputs.append(types_source_file) + +def cpp_idl_translate(idl_files, out_dir): + outputs = [] + for idl_file in idl_files: + idl_file_type = get_idl_file_type(idl_file) + if idl_file_type == IdlType.INTERFACE: + cpp_interface_file_translate(idl_file, out_dir, "all", outputs) + elif idl_file_type == IdlType.CALLBACK: + cpp_callback_file_translate(idl_file, out_dir, "all", outputs) + elif idl_file_type == IdlType.TYPES: + cpp_types_file_translate(idl_file, out_dir, outputs) + return outputs + +def idl_translate(idl_files, language, out_dir): + outputs = [] + if language == "c": + outputs = c_idl_translate(idl_files, out_dir) + elif language == "cpp": + outputs = cpp_idl_translate(idl_files, out_dir) + return outputs + +def c_get_compile_source_file(idl_files, out_dir, part): + outputs = [] + for idl_file in idl_files: + idl_file_type = get_idl_file_type(idl_file) + if idl_file_type == IdlType.INTERFACE: + c_interface_file_translate(idl_file, out_dir, part, outputs) + elif idl_file_type == IdlType.CALLBACK: + c_callback_file_translate(idl_file, out_dir, part, outputs) + elif idl_file_type == IdlType.TYPES: + c_types_file_translate(idl_file, out_dir, outputs) + return outputs + +def cpp_get_compile_source_file(idl_files, out_dir, part): + outputs = [] + for idl_file in idl_files: + idl_file_type = get_idl_file_type(idl_file) + if idl_file_type == IdlType.INTERFACE: + cpp_interface_file_translate(idl_file, out_dir, part, outputs) + elif idl_file_type == IdlType.CALLBACK: + cpp_callback_file_translate(idl_file, out_dir, part, outputs) + elif idl_file_type == IdlType.TYPES: + cpp_types_file_translate(idl_file, out_dir, outputs) + return outputs + +def get_compile_source_file(idl_files, language, out_dir, part): + outputs = [] + if language == "c": + outputs = c_get_compile_source_file(idl_files, out_dir, part) + elif language == "cpp": + outputs = cpp_get_compile_source_file(idl_files, out_dir, part) + return outputs + +def main(argv): + outputs = [] + if len(argv) < 4: + return outputs + + option = argv[1] + language = argv[2] + out_dir = argv[3] + files = argv[4:] + + if option == "-o": + outputs = idl_translate(files, language, out_dir) + elif option == "-c": + outputs = get_compile_source_file(argv[4:], language, out_dir, "client_lib_source") + elif option == "-s": + outputs = get_compile_source_file(argv[4:], language, out_dir, "server_lib_source") + + sys.stdout.write('\n'.join(outputs)) + +if __name__ == "__main__": + main(sys.argv) \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index fd93f37b0..b28d9ca25 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -14,10 +14,8 @@ namespace OHOS { namespace HDI { bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -34,45 +32,9 @@ bool CClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) void CClientProxyCodeEmitter::EmitCode() { - if (isCallbackInterface()) { - EmitCbProxyHeaderFile(); - } EmitProxySourceFile(); } -void CClientProxyCodeEmitter::EmitCbProxyHeaderFile() -{ - String filePath = String::Format("%s%s.h", directory_.string(), FileName(proxyName_).string()); - File file(filePath, File::WRITE); - StringBuilder sb; - - EmitLicense(sb); - EmitHeadMacro(sb, proxyFullName_); - sb.Append("\n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); - sb.Append("\n"); - EmitHeadExternC(sb); - sb.Append("\n"); - EmitCbProxyMethodsDcl(sb); - sb.Append("\n"); - EmitTailExternC(sb); - sb.Append("\n"); - EmitTailMacro(sb, proxyFullName_); - - String data = sb.ToString(); - file.WriteData(data.string(), data.GetLength()); - file.Flush(); - file.Close(); -} - -void CClientProxyCodeEmitter::EmitCbProxyMethodsDcl(StringBuilder& sb) -{ - sb.AppendFormat("struct %s *%sProxyObtain(struct HdfRemoteService *remote);\n", - interfaceName_.string(), infName_.string()); - sb.Append("\n"); - sb.AppendFormat("void %sProxyRelease(struct %s *callback);\n", infName_.string(), interfaceName_.string()); -} - void CClientProxyCodeEmitter::EmitProxySourceFile() { String filePath = String::Format("%s%s.c", directory_.string(), FileName(proxyName_).string()); @@ -82,7 +44,7 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() EmitLicense(sb); EmitProxyInclusions(sb); sb.Append("\n"); - EmitHeadExternC(sb); + EmitProxyDefinition(sb); sb.Append("\n"); EmitProxyCallMethodImpl(sb); sb.Append("\n"); @@ -90,24 +52,25 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() sb.Append("\n"); EmitProxyConstruction(sb); if (!isCallbackInterface()) { + sb.Append("\n"); + EmitProxyGetMethodImpl(sb); sb.Append("\n"); if (isKernelCode_) { - EmitKernelProxyGetMethodImpl(sb); + EmitKernelProxyGetInstanceMethodImpl(sb); + sb.Append("\n"); + EmitKernelProxyReleaseMethodImpl(sb); } else { - EmitProxyGetMethodImpl(sb); + EmitProxyGetInstanceMethodImpl(sb); + sb.Append("\n"); + EmitProxyReleaseMethodImpl(sb); } - sb.Append("\n"); - EmitProxyReleaseMethodImpl(sb); } else { sb.Append("\n"); - EmitCbProxyObtainMethodImpl(sb); + EmitCbProxyGetMethodImpl(sb); sb.Append("\n"); - EmitCbProxyReleaseMethodImpl(sb); + EmitProxyReleaseMethodImpl(sb); } - sb.Append("\n"); - EmitTailExternC(sb); - String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); file.Flush(); @@ -116,18 +79,17 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() void CClientProxyCodeEmitter::EmitProxyInclusions(StringBuilder& sb) { - if (!isCallbackInterface()) { - EmitProxyStdlibInclusions(sb); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); - } else { - sb.AppendFormat("#include \"%s.h\"\n", FileName(proxyName_).string()); - EmitProxyStdlibInclusions(sb); - } + EmitProxyStdlibInclusions(sb); + sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); } void CClientProxyCodeEmitter::EmitProxyStdlibInclusions(StringBuilder& sb) { sb.Append("#include \n"); + if (!isCallbackInterface() && !isKernelCode_) { + sb.Append("#include \n"); + } + sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); @@ -148,6 +110,19 @@ void CClientProxyCodeEmitter::EmitProxyStdlibInclusions(StringBuilder& sb) } } +void CClientProxyCodeEmitter::EmitProxyDefinition(StringBuilder& sb) +{ + sb.AppendFormat("struct %sProxy {\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct %s instance;\n", interfaceName_.string()); + if (isKernelCode_) { + sb.Append(g_tab).Append("struct HdfIoService *serv;\n"); + } else { + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + } + + sb.Append("};\n"); +} + void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb) { sb.AppendFormat("static int32_t %sProxyCall(struct %s *self, int32_t id, struct HdfSBuf *data,\n", @@ -155,19 +130,29 @@ void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append("struct HdfSBuf *reply)\n"); sb.Append("{\n"); + String proxyName = "self"; + if (!isCallbackInterface()) { + sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(self, struct %sProxy, instance);\n", + infName_.string(), infName_.string()); + proxyName = "proxy"; + } + String remoteName = isKernelCode_ ? "serv" : "remote"; - sb.Append(g_tab).AppendFormat("if (self->%s == NULL\n", remoteName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher == NULL\n", remoteName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("|| self->%s->dispatcher->Dispatch == NULL) {\n", remoteName.string()); + sb.Append(g_tab).AppendFormat("if (%s->%s == NULL\n", proxyName.string(), remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| %s->%s->dispatcher == NULL\n", + proxyName.string(), remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("|| %s->%s->dispatcher->Dispatch == NULL) {\n", + proxyName.string(), remoteName.string()); sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: obj is null\", __func__);\n"); sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_OBJECT;\n"); sb.Append(g_tab).Append("}\n"); if (isKernelCode_) { - sb.Append(g_tab).Append("return self->serv->dispatcher->Dispatch"); - sb.Append("((struct HdfObject *)&(self->serv->object), id, data, reply);\n"); + sb.Append(g_tab).AppendFormat("return %s->serv->dispatcher->Dispatch", proxyName.string()); + sb.AppendFormat("((struct HdfObject *)&(%s->serv->object), id, data, reply);\n", proxyName.string()); } else { - sb.Append(g_tab).Append("return self->remote->dispatcher->Dispatch(self->remote, id, data, reply);\n"); + sb.Append(g_tab).AppendFormat("return %s->remote->dispatcher->Dispatch(%s->remote, id, data, reply);\n", + proxyName.string(), proxyName.string()); } sb.Append("}\n"); } @@ -365,16 +350,9 @@ String CClientProxyCodeEmitter::GetGotLabel(const AutoPtr& method) void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) { - String objName; - if (!isCallbackInterface()) { - objName = "inst"; - sb.AppendFormat("static void %sConstruct(struct %s *%s)\n", - infName_.string(), interfaceName_.string(), objName.string()); - } else { - objName = "callback"; - sb.AppendFormat("static void %sProxyConstruct(struct %s *%s)\n", - infName_.string(), interfaceName_.string(), objName.string()); - } + String objName = "instance"; + sb.AppendFormat("static void %sProxyConstruct(struct %s *%s)\n", + infName_.string(), interfaceName_.string(), objName.string()); sb.Append("{\n"); for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { @@ -388,7 +366,16 @@ void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) { - sb.AppendFormat("struct %s *Hdi%sGet()\n", interfaceName_.string(), infName_.string()); + sb.AppendFormat("struct %s *%sGet()\n", interfaceName_.string(), infName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("return %sGetInstance(\"%s\");\n", infName_.string(), FileName(implName_).string()); + sb.Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb) +{ + sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName)\n", + interfaceName_.string(), infName_.string()); sb.Append("{\n"); sb.Append(g_tab).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n"); sb.Append(g_tab).Append("if (serviceMgr == NULL) {\n"); @@ -398,7 +385,7 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) sb.Append("\n"); sb.Append(g_tab).Append("struct HdfRemoteService *remote = "); - sb.AppendFormat("serviceMgr->GetService(serviceMgr, \"%sService\");\n", infName_.string()); + sb.Append("serviceMgr->GetService(serviceMgr, instanceName);\n"); sb.Append(g_tab).Append("HDIServiceManagerRelease(serviceMgr);\n"); sb.Append(g_tab).Append("if (remote == NULL) {\n"); sb.Append(g_tab).Append(g_tab).AppendFormat( @@ -407,28 +394,28 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", - interfaceName_.string(), infName_.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(g_tab).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = ", infName_.string()); + sb.AppendFormat("(struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", infName_.string(), infName_.string()); + sb.Append(g_tab).Append("if (proxy == NULL) {\n"); sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: malloc %s instance failed!\", __func__);\n", interfaceName_.string()); + "HDF_LOGE(\"%%{public}s: malloc %s proxy failed!\", __func__);\n", interfaceName_.string()); sb.Append(g_tab).Append(g_tab).Append("HdfRemoteServiceRecycle(remote);\n"); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("%sClient->remote = remote;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("return %sClient;\n", infName_.string()); + sb.Append(g_tab).Append("proxy->remote = remote;\n"); + sb.Append(g_tab).AppendFormat("%sProxyConstruct(&proxy->instance);\n", infName_.string()); + sb.Append(g_tab).Append("return &proxy->instance;\n"); sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitKernelProxyGetMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitKernelProxyGetInstanceMethodImpl(StringBuilder& sb) { - sb.AppendFormat("struct %s *Hdi%sGet()\n", interfaceName_.string(), infName_.string()); + sb.AppendFormat("struct %s *%sGetInstance(const char* serviceName)\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); sb.Append(g_tab).AppendFormat("struct HdfIoService *serv = "); - sb.AppendFormat("HdfIoServiceBind(\"%s\");\n", infName_.string()); + sb.Append("HdfIoServiceBind(serviceName);\n"); sb.Append(g_tab).Append("if (serv == NULL) {\n"); sb.Append(g_tab).Append(g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", infName_.string()); @@ -436,64 +423,69 @@ void CClientProxyCodeEmitter::EmitKernelProxyGetMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("struct %s *%sClient = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", - interfaceName_.string(), infName_.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(g_tab).AppendFormat("if (%sClient == NULL) {\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = (struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", + infName_.string(), infName_.string(), infName_.string()); + sb.Append(g_tab).Append("if (proxy == NULL) {\n"); sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: malloc %s instance failed!\", __func__);\n", interfaceName_.string()); + "HDF_LOGE(\"%%{public}s: malloc %s proxy failed!\", __func__);\n", interfaceName_.string()); sb.Append(g_tab).Append(g_tab).Append("HdfIoServiceRecycle(serv);\n"); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("%sClient->serv = serv;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("%sConstruct(%sClient);\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("return %sClient;\n", infName_.string()); + sb.Append(g_tab).Append("proxy->serv = serv;\n"); + sb.Append(g_tab).AppendFormat("%sProxyConstruct(&proxy->instance);\n", infName_.string()); + sb.Append(g_tab).Append("return &proxy->instance;\n"); + sb.Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb) +{ + sb.AppendFormat("struct %s *%sGet(struct HdfRemoteService *remote)\n", + interfaceName_.string(), infName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct %s *instance = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + interfaceName_.string(), interfaceName_.string(), interfaceName_.string()); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: OsalMemAlloc failed!\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).Append("instance->remote = remote;\n"); + sb.Append(g_tab).AppendFormat("%sProxyConstruct(instance);\n", infName_.string()); + sb.Append(g_tab).Append("return instance;\n"); sb.Append("}\n"); } void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) { - sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); + sb.AppendFormat("void %sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); sb.Append(g_tab).Append("if (instance == NULL) {\n"); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); - if (isKernelCode_) { - sb.Append(g_tab).Append("HdfIoServiceRecycle(instance->serv);\n"); + if (!isCallbackInterface()) { + sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(instance, struct %sProxy, instance);\n", + infName_.string(), infName_.string()); + sb.Append(g_tab).Append("HdfRemoteServiceRecycle(proxy->remote);\n"); + sb.Append(g_tab).Append("OsalMemFree(proxy);\n"); } else { - sb.Append(g_tab).Append("HdfRemoteServiceRecycle(instance->remote);\n"); + sb.Append(g_tab).Append("OsalMemFree(instance);\n"); } - sb.Append(g_tab).Append("OsalMemFree(instance);\n"); - sb.Append("}\n"); -} - -void CClientProxyCodeEmitter::EmitCbProxyObtainMethodImpl(StringBuilder& sb) -{ - sb.AppendFormat("struct %s *%sProxyObtain(struct HdfRemoteService *remote)\n", - interfaceName_.string(), infName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct %s *callback = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", - interfaceName_.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(g_tab).Append("if (callback == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: OsalMemAlloc failed!\", __func__);\n"); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).Append("callback->remote = remote;\n"); - sb.Append(g_tab).AppendFormat("%sProxyConstruct(callback);\n", infName_.string()); - sb.Append(g_tab).Append("return callback;\n"); sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitCbProxyReleaseMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitKernelProxyReleaseMethodImpl(StringBuilder& sb) { - sb.AppendFormat("void %sProxyRelease(struct %s *callback)\n", infName_.string(), interfaceName_.string()); + sb.AppendFormat("void %sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(g_tab).Append("if (callback == NULL) {\n"); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("OsalMemFree(callback);\n"); + sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(instance, struct %sProxy, instance);\n", + infName_.string(), infName_.string()); + sb.Append(g_tab).Append("HdfIoServiceRecycle(proxy->serv);\n"); + sb.Append(g_tab).Append("OsalMemFree(proxy);\n"); sb.Append("}\n"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 41d78d8df..83daa85a4 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -23,11 +23,9 @@ private: void EmitCode() override; - void EmitCbProxyHeaderFile(); - void EmitProxySourceFile(); - void EmitCbProxyMethodsDcl(StringBuilder& sb); + void EmitProxyDefinition(StringBuilder& sb); void EmitProxyInclusions(StringBuilder& sb); @@ -54,13 +52,15 @@ private: void EmitProxyGetMethodImpl(StringBuilder& sb); - void EmitKernelProxyGetMethodImpl(StringBuilder& sb); + void EmitProxyGetInstanceMethodImpl(StringBuilder& sb); - void EmitProxyReleaseMethodImpl(StringBuilder& sb); + void EmitKernelProxyGetInstanceMethodImpl(StringBuilder& sb); - void EmitCbProxyObtainMethodImpl(StringBuilder& sb); + void EmitCbProxyGetMethodImpl(StringBuilder& sb); + + void EmitProxyReleaseMethodImpl(StringBuilder& sb); - void EmitCbProxyReleaseMethodImpl(StringBuilder& sb); + void EmitKernelProxyReleaseMethodImpl(StringBuilder& sb); std::vector freeObjStatements_; }; diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 8d59af572..1ba4a9a95 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -37,7 +37,7 @@ void CCustomTypesCodeEmitter::EmitCode() void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() { - String filePath = String::Format("%s%s.h", directory_.string(), FileName(infName_).string()); + String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_).string()); File file(filePath, File::WRITE); StringBuilder sb; diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp new file mode 100755 index 000000000..47b5f421c --- /dev/null +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/c_interface_code_emitter.h" +#include "util/file.h" +#include "util/logger.h" + +namespace OHOS { +namespace HDI { +bool CInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + +void CInterfaceCodeEmitter::EmitCode() +{ + EmitInterfaceHeaderFile(); +} + +void CInterfaceCodeEmitter::EmitInterfaceHeaderFile() +{ + String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); + File file(filePath, File::WRITE); + StringBuilder sb; + + EmitLicense(sb); + EmitHeadMacro(sb, interfaceFullName_); + sb.Append("\n"); + EmitImportInclusions(sb); + sb.Append("\n"); + EmitHeadExternC(sb); + sb.Append("\n"); + EmitInterfaceMethodCommands(sb); + sb.Append("\n"); + EmitInterfaceDefinition(sb); + sb.Append("\n"); + EmitInterfaceGetMethodDecl(sb); + sb.Append("\n"); + EmitInterfaceReleaseMethodDecl(sb); + sb.Append("\n"); + EmitTailExternC(sb); + sb.Append("\n"); + EmitTailMacro(sb, interfaceFullName_); + + String data = sb.ToString(); + file.WriteData(data.string(), data.GetLength()); + file.Flush(); + file.Close(); +} + +void CInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) +{ + sb.Append("#include \n"); + for (const auto& importPair : ast_->GetImports()) { + AutoPtr importAst = importPair.second; + sb.AppendFormat("#include \"%s.h\"\n", FileName(importAst->GetFullName()).string()); + } +} + +void CInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) +{ + sb.AppendFormat("struct %s {\n", interfaceName_.string()); + if (isCallbackInterface()) { + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + sb.Append("\n"); + } + EmitInterfaceMethods(sb, g_tab); + sb.Append("};\n"); +} + +void CInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const String& prefix) +{ + for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { + AutoPtr method = interface_->GetMethod(i); + EmitInterfaceMethod(method, sb, prefix); + if (i + 1 < interface_->GetMethodNumber()) { + sb.Append("\n"); + } + } +} + +void CInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, + const String& prefix) +{ + if (method->GetParameterNumber() == 0) { + sb.Append(prefix).AppendFormat("int32_t (*%s)(struct %s *self);\n", + method->GetName().string(), interfaceName_.string()); + } else { + StringBuilder paramStr; + paramStr.Append(prefix).AppendFormat("int32_t (*%s)(struct %s *self, ", + method->GetName().string(), interfaceName_.string()); + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + EmitInterfaceMethodParameter(param, paramStr, ""); + if (i + 1 < method->GetParameterNumber()) { + paramStr.Append(", "); + } + } + + paramStr.Append(");"); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); + sb.Append("\n"); + } +} + +void CInterfaceCodeEmitter::EmitInterfaceGetMethodDecl(StringBuilder& sb) +{ + String methodParamStr = isCallbackInterface() ? "struct HdfRemoteService *remote" : "void"; + sb.AppendFormat("struct %s *%sGet(%s);\n", interfaceName_.string(), infName_.string(), methodParamStr.string()); + if (!isCallbackInterface()) { + sb.Append("\n"); + sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName);\n", + interfaceName_.string(), infName_.string()); + } +} + +void CInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& sb) +{ + sb.AppendFormat("void %sRelease(struct %s *instance);\n", infName_.string(), interfaceName_.string()); +} + +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.h b/tools/hdi-gen/codegen/c_interface_code_emitter.h new file mode 100755 index 000000000..a4e76b859 --- /dev/null +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H +#define OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H + +#include "codegen/c_code_emitter.h" + +namespace OHOS { +namespace HDI { +class CInterfaceCodeEmitter : public CCodeEmitter { +public: + CInterfaceCodeEmitter() : CCodeEmitter() {} + + virtual ~CInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; + + void EmitCode() override; + + void EmitInterfaceHeaderFile(); + + void EmitImportInclusions(StringBuilder& sb); + + void EmitInterfaceDefinition(StringBuilder& sb); + + void EmitInterfaceMethods(StringBuilder& sb, const String& prefix); + + void EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); + + void EmitInterfaceGetMethodDecl(StringBuilder& sb); + + void EmitInterfaceReleaseMethodDecl(StringBuilder& sb); + +}; + +} // namespace HDI +} // namespace OHOS + +#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index 502b3de7a..d03327569 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -9,6 +9,7 @@ #include "codegen/c_service_driver_code_emitter.h" #include "util/file.h" #include "util/logger.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -18,7 +19,7 @@ bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) return false; } - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); @@ -69,12 +70,12 @@ void CServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb) sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); } void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) { - sb.AppendFormat("struct Hdf%sService {\n", infName_.string()); + sb.AppendFormat("struct Hdf%sHost {\n", infName_.string()); sb.Append(g_tab).AppendFormat("struct IDeviceIoService ioservice;\n"); sb.Append(g_tab).Append("void *instance;\n"); sb.Append("};\n"); @@ -82,16 +83,17 @@ void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) void CServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb) { - sb.AppendFormat("static int32_t %sServiceDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", + String hostName = infName_.ToLowerCase() + "Host"; + sb.AppendFormat("static int32_t %sDriverDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", infName_.string()); sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", - infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(\n", + infName_.string(), hostName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n", infName_.string()); - sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", - infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(%s->instance, cmdId, data, reply);\n", + infName_.string(), hostName.string()); sb.Append("}\n"); } @@ -99,51 +101,53 @@ void CServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter.\");\n", infName_.string()); sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) { + String hostName = infName_.ToLowerCase() + "Host"; sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", - infName_.string(), infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); - sb.Append(g_tab).AppendFormat("if (hdf%sService == NULL) {\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemAlloc(\n", + infName_.string(), hostName.string(), infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", infName_.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", hostName.string()); sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sService failed!\");\n", infName_.string(), infName_.string()); + "HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sHost failed!\");\n", infName_.string(), infName_.string()); sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", - infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->instance = Hdi%sInstance();\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("if (hdf%sService->instance == NULL) {\n", infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%s->ioservice.Dispatch = %sDriverDispatch;\n", + hostName.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("%s->ioservice.Open = NULL;\n", hostName.string()); + sb.Append(g_tab).AppendFormat("%s->ioservice.Release = NULL;\n", hostName.string()); + sb.Append(g_tab).AppendFormat("%s->instance = %sStubGetInstance();\n", hostName.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("if (%s->instance == NULL) {\n", hostName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", hostName.string()); sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("deviceObject->service = &%s->ioservice;\n", hostName.string()); sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } void CServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { + String hostName = infName_.ToLowerCase() + "Host"; sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", - infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", infName_.string(), hostName.string()); + sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n", infName_.string()); - sb.Append(g_tab).AppendFormat("Hdi%sRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sStubRelease(%s->instance);\n", infName_.string(), hostName.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", hostName.string()); sb.Append("}\n"); } @@ -151,7 +155,8 @@ void CServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) { sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); sb.Append(g_tab).Append(".moduleVersion = 1,\n"); - sb.Append(g_tab).Append(".moduleName = \"sample\", /* please change the moduleName */\n"); + sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", + Options::GetInstance().GetModeName().string()); sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index d6f090d87..2ea8fdf27 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -14,10 +14,8 @@ namespace OHOS { namespace HDI { bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -34,9 +32,7 @@ bool CServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) void CServiceImplCodeEmitter::EmitCode() { - if (isCallbackInterface()) { - EmitServiceImplHeaderFile(); - } + EmitServiceImplHeaderFile(); EmitServiceImplSourceFile(); } @@ -82,12 +78,6 @@ void CServiceImplCodeEmitter::EmitServiceImplSourceFile() EmitServiceImplMethodImpls(sb, ""); sb.Append("\n"); EmitServiceImplConstruct(sb); - if (!isCallbackInterface()) { - sb.Append("\n"); - EmitServiceImplInstance(sb); - sb.Append("\n"); - EmitServiceImplRelease(sb); - } String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -101,7 +91,7 @@ void CServiceImplCodeEmitter::EmitServiceImplInclusions(StringBuilder& sb) sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(infName_ + "Service").string()); } void CServiceImplCodeEmitter::EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix) @@ -154,36 +144,7 @@ void CServiceImplCodeEmitter::EmitServiceImplConstruct(StringBuilder& sb) sb.Append(g_tab).AppendFormat("%s->%s = %s%s;\n", objName.string(), method->GetName().string(), infName_.string(), method->GetName().string()); } - sb.Append("}\n"); -} - -void CServiceImplCodeEmitter::EmitServiceImplInstance(StringBuilder& sb) -{ - String objName("instance"); - sb.AppendFormat("struct %s *Hdi%sInstance()\n", interfaceName_.string(), infName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", - interfaceName_.string(), objName.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", - interfaceName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).AppendFormat("%sServiceConstruct(%s);\n", infName_.string(), objName.string()); - sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); - sb.Append("}\n"); -} - -void CServiceImplCodeEmitter::EmitServiceImplRelease(StringBuilder& sb) -{ - sb.AppendFormat("void Hdi%sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).Append("if (instance == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).Append("return;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("OsalMemFree(instance);\n"); - sb.Append("}\n"); + sb.Append("}"); } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index 66bc51eb0..9ecd7f520 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -15,10 +15,8 @@ namespace OHOS { namespace HDI { bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -35,9 +33,8 @@ bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) void CServiceStubCodeEmitter::EmitCode() { - if (isCallbackInterface()) { - EmitCbServiceStubHeaderFile(); - } + + EmitCbServiceStubHeaderFile(); EmitServiceStubSourceFile(); } @@ -68,9 +65,14 @@ void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb) { - sb.AppendFormat("struct %s* %sStubObtain();\n", interfaceName_.string(), infName_.string()); + if (!isCallbackInterface()) { + sb.AppendFormat("int32_t %sServiceOnRemoteRequest(void *service, int cmdId, ", infName_.string()); + sb.Append("struct HdfSBuf *data, struct HdfSBuf *reply);\n"); + sb.Append("\n"); + } + sb.AppendFormat("struct %s* %sStubGetInstance(void);\n", interfaceName_.string(), infName_.string()); sb.Append("\n"); - sb.AppendFormat("void %sStubRelease(struct %s *callback);\n", infName_.string(), interfaceName_.string()); + sb.AppendFormat("void %sStubRelease(struct %s *instance);\n", infName_.string(), interfaceName_.string()); } void CServiceStubCodeEmitter::EmitServiceStubSourceFile() @@ -82,16 +84,33 @@ void CServiceStubCodeEmitter::EmitServiceStubSourceFile() EmitLicense(sb); EmitServiceStubInclusions(sb); sb.Append("\n"); - EmitServiceStubMethodImpls(sb, ""); - sb.Append("\n"); - EmitServiceStubOnRequestMethodImpl(sb, ""); - if (isCallbackInterface()) { + + if (!isKernelCode_) { + EmitDriverLibPath(sb); + sb.Append("\n"); + EmitServConstructTypedef(sb); sb.Append("\n"); EmitCbStubDefinitions(sb); sb.Append("\n"); - EmitCbStubObtainImpl(sb); + } + + EmitServiceStubMethodImpls(sb, ""); + sb.Append("\n"); + EmitServiceStubOnRequestMethodImpl(sb, ""); + sb.Append("\n"); + if (isKernelCode_) { + EmitKernelStubGetMethodImpl(sb); + } else { + EmitStubLinkService(sb); sb.Append("\n"); - EmitCbStubReleaseImpl(sb); + EmitStubGetMethodImpl(sb); + } + + sb.Append("\n"); + if (isKernelCode_) { + EmitKernelStubReleaseImpl(sb); + } else { + EmitStubReleaseImpl(sb); } String data = sb.ToString(); @@ -104,9 +123,20 @@ void CServiceStubCodeEmitter::EmitServiceStubInclusions(StringBuilder& sb) { if (!isCallbackInterface()) { EmitServiceStubStdlibInclusions(sb); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); + if (isKernelCode_) { + sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); + } else { + for (const auto& importPair : ast_->GetImports()) { + AutoPtr importAst = importPair.second; + if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + String fileName = FileName(importAst->GetInterfaceDef()->GetFullName()); + sb.AppendFormat("#include \"%s.h\"\n", fileName.string()); + } + } + } } else { - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubFullName_).string()); + sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); EmitServiceStubStdlibInclusions(sb); sb.Append("#include \n"); sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); @@ -115,21 +145,54 @@ void CServiceStubCodeEmitter::EmitServiceStubInclusions(StringBuilder& sb) void CServiceStubCodeEmitter::EmitServiceStubStdlibInclusions(StringBuilder& sb) { + if (!isKernelCode_) { + sb.Append("#include \n"); + } + sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - const AST::TypeStringMap& types = ast_->GetTypes(); - int i = 0; - for (const auto& pair : types) { - AutoPtr type = pair.second; - if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); - break; + if (isKernelCode_) { + const AST::TypeStringMap& types = ast_->GetTypes(); + for (const auto& pair : types) { + AutoPtr type = pair.second; + if (type->GetTypeKind() == TypeKind::TYPE_UNION) { + sb.Append("#include \n"); + break; + } } + } else { + sb.Append("#include \n"); + } +} + +void CServiceStubCodeEmitter::EmitDriverLibPath(StringBuilder& sb) +{ + sb.Append("#ifdef __ARM64__\n"); + sb.Append("#define DRIVER_PATH \"system/lib64\"\n"); + sb.Append("#else\n"); + sb.Append("#define DRIVER_PATH \"system/lib\"\n"); + sb.Append("#endif\n"); +} + +void CServiceStubCodeEmitter::EmitServConstructTypedef(StringBuilder& sb) +{ + typedef void (*SERVICE_CONSTRUCT_FUNC)(struct callbacks *); + sb.AppendFormat("typedef void (*SERVICE_CONSTRUCT_FUNC)(struct %s *);\n", interfaceName_.string()); +} + +void CServiceStubCodeEmitter::EmitCbStubDefinitions(StringBuilder& sb) +{ + sb.AppendFormat("struct %sStub {\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct %s service;\n", interfaceName_.string()); + if (isCallbackInterface()) { + sb.Append(g_tab).Append("struct HdfRemoteDispatcher dispatcher;\n"); } + sb.Append(g_tab).Append("void *dlHandler;\n"); + sb.Append("};\n"); } void CServiceStubCodeEmitter::EmitServiceStubMethodImpls(StringBuilder& sb, const String& prefix) @@ -316,14 +379,15 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& String codeName; if (!isCallbackInterface()) { codeName = "cmdId"; - sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(void *service, int %s,\n", + sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(void *service, int %s, ", infName_.string(), codeName.string()); + sb.Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); } else { codeName = "code"; sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(struct HdfRemoteService *service, int %s,\n", infName_.string(), codeName.string()); + sb.Append(prefix + g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); } - sb.Append(prefix + g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).AppendFormat("struct %s *serviceImpl = (struct %s*)service;\n", interfaceName_.string(), interfaceName_.string()); @@ -345,51 +409,128 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& sb.Append("}\n"); } -void CServiceStubCodeEmitter::EmitCbStubDefinitions(StringBuilder& sb) +void CServiceStubCodeEmitter::EmitStubLinkService(StringBuilder& sb) { - sb.AppendFormat("struct %sStub {\n", infName_.string()); - sb.Append(g_tab).AppendFormat("struct %s service;\n", interfaceName_.string()); - sb.Append(g_tab).Append("struct HdfRemoteDispatcher dispatcher;\n"); - sb.Append("};\n"); + sb.Append("static void *LoadServiceHandler(const char* libFileName)\n"); + sb.Append("{\n"); + sb.Append(g_tab).Append("char path[PATH_MAX + 1] = {0};\n"); + sb.Append(g_tab).Append("char libPath[PATH_MAX + 1] = {0};\n"); + sb.Append(g_tab).Append("void *handler = NULL;\n"); + sb.Append("\n"); + sb.Append(g_tab).AppendFormat("if (snprintf_s(path, sizeof(path), sizeof(path) - 1, \"%%s/%%s\", "); + sb.Append("DRIVER_PATH, libFileName) < 0) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: snprintf_s failed\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("if (realpath(path, libPath) == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s file name invalid\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("handler = dlopen(libPath, RTLD_LAZY);\n"); + sb.Append(g_tab).Append("if (handler == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: dlopen failed %{public}s\", "); + sb.AppendFormat("__func__, dlerror());\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("return handler;\n"); + sb.Append("}\n"); } -void CServiceStubCodeEmitter::EmitCbStubObtainImpl(StringBuilder& sb) +void CServiceStubCodeEmitter::EmitStubGetMethodImpl(StringBuilder& sb) { + String libName = String::Format("lib%s.z.so", FileName(implName_).string()); String stubTypeName = String::Format("%sStub", infName_.string()); String objName = "stub"; - sb.AppendFormat("struct %s* %sStubObtain()\n", interfaceName_.string(), infName_.string()); + sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct %s* %s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + sb.Append(g_tab).AppendFormat("SERVICE_CONSTRUCT_FUNC serviceConstructFunc = NULL;\n", libName.string()); + sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", stubTypeName.string(), objName.string(), stubTypeName.string(), stubTypeName.string()); - sb.Append(g_tab).AppendFormat("if (stub == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: OsalMemAlloc %s obj failed!\", __func__);\n", stubTypeName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("return NULL;\n"); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc obj failed!\", __func__);\n", + stubTypeName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + if (isCallbackInterface()) { + sb.Append(g_tab).AppendFormat("%s->dispatcher.Dispatch = %sServiceOnRemoteRequest;\n", + objName.string(), infName_.string()); + sb.Append(g_tab).AppendFormat( + "%s->service.remote = HdfRemoteServiceObtain((struct HdfObject*)%s, &(%s->dispatcher));\n", + objName.string(), objName.string(), objName.string()); + sb.Append(g_tab).AppendFormat("if (%s->service.remote == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: %s->service.remote is null\", __func__);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + } + sb.Append(g_tab).AppendFormat("%s->dlHandler = LoadServiceHandler(\"lib%s.z.so\");\n", + objName.string(), FileName(implName_).string()); + sb.Append(g_tab).AppendFormat("if (%s->dlHandler == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: %s->dlHanlder is null\", __func__);\n", + objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("%s->dispatcher.Dispatch = %sServiceOnRemoteRequest;\n", + sb.Append(g_tab).AppendFormat("serviceConstructFunc = "); + sb.AppendFormat("(SERVICE_CONSTRUCT_FUNC)dlsym(%s->dlHandler, \"%sServiceConstruct\");\n", objName.string(), infName_.string()); - sb.Append(g_tab).AppendFormat( - "%s->service.remote = HdfRemoteServiceObtain((struct HdfObject*)%s, &(%s->dispatcher));\n", - objName.string(), objName.string(), objName.string()); - sb.Append(g_tab).AppendFormat("if (%s->service.remote == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: %s->service.remote is null\", __func__);\n", objName.string()); + sb.Append(g_tab).Append("if (serviceConstructFunc == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: dlsym failed %{public}s\", __func__, dlerror());\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("dlclose(%s->dlHandler);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("%sServiceConstruct(&%s->service);\n", infName_.string(), objName.string()); + sb.Append(g_tab).AppendFormat("serviceConstructFunc(&%s->service);\n", objName.string()); sb.Append(g_tab).AppendFormat("return &%s->service;\n", objName.string()); sb.Append("}\n"); } -void CServiceStubCodeEmitter::EmitCbStubReleaseImpl(StringBuilder& sb) +void CServiceStubCodeEmitter::EmitKernelStubGetMethodImpl(StringBuilder& sb) +{ + String objName("instance"); + sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), infName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", + interfaceName_.string(), objName.string(), interfaceName_.string(), interfaceName_.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", + interfaceName_.string(), objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).AppendFormat("%sServiceConstruct(%s);\n", infName_.string(), objName.string()); + sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); + sb.Append("}\n"); +} + +void CServiceStubCodeEmitter::EmitStubReleaseImpl(StringBuilder& sb) { - sb.AppendFormat("void %sStubRelease(struct %s *stub)\n", infName_.string(), interfaceName_.string()); + sb.AppendFormat("void %sStubRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); sb.Append("{\n"); - sb.Append(g_tab).Append("if (stub == NULL) {\n"); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).AppendFormat("struct %s *stub = CONTAINER_OF(instance, struct %s, service);\n", + stubName_.string(), stubName_.string()); + sb.Append(g_tab).Append("dlclose(stub->dlHandler);\n"); sb.Append(g_tab).Append("OsalMemFree(stub);\n"); sb.Append("}"); } + +void CServiceStubCodeEmitter::EmitKernelStubReleaseImpl(StringBuilder& sb) +{ + sb.AppendFormat("void %sStubRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).Append("if (instance == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append(g_tab).Append("OsalMemFree(instance);\n"); + sb.Append("}"); +} + } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index fdde479f0..03350ae39 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -33,6 +33,10 @@ private: void EmitServiceStubStdlibInclusions(StringBuilder& sb); + void EmitDriverLibPath(StringBuilder& sb); + + void EmitServConstructTypedef(StringBuilder& sb); + void EmitServiceStubMethodImpls(StringBuilder& sb, const String& prefix); void EmitServiceStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); @@ -54,9 +58,15 @@ private: void EmitCbStubDefinitions(StringBuilder& sb); - void EmitCbStubObtainImpl(StringBuilder& sb); + void EmitStubGetMethodImpl(StringBuilder& sb); + + void EmitKernelStubGetMethodImpl(StringBuilder& sb); + + void EmitStubLinkService(StringBuilder& sb); + + void EmitStubReleaseImpl(StringBuilder& sb); - void EmitCbStubReleaseImpl(StringBuilder& sb); + void EmitKernelStubReleaseImpl(StringBuilder& sb); }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/code_generator.cpp b/tools/hdi-gen/codegen/code_generator.cpp index 00d13adc4..e9c53dfd6 100755 --- a/tools/hdi-gen/codegen/code_generator.cpp +++ b/tools/hdi-gen/codegen/code_generator.cpp @@ -7,32 +7,28 @@ */ #include "codegen/code_generator.h" -#include "codegen/c_client_interface_code_emitter.h" +#include "codegen/c_interface_code_emitter.h" #include "codegen/c_client_proxy_code_emitter.h" #include "codegen/c_custom_types_code_emitter.h" #include "codegen/c_service_driver_code_emitter.h" #include "codegen/c_service_impl_code_emitter.h" -#include "codegen/c_service_interface_code_emitter.h" #include "codegen/c_service_stub_code_emitter.h" -#include "codegen/cpp_client_interface_code_emitter.h" +#include "codegen/cpp_interface_code_emitter.h" #include "codegen/cpp_client_proxy_code_emitter.h" #include "codegen/cpp_custom_types_code_emitter.h" #include "codegen/cpp_service_driver_code_emitter.h" #include "codegen/cpp_service_impl_code_emitter.h" -#include "codegen/cpp_service_interface_code_emitter.h" #include "codegen/cpp_service_stub_code_emitter.h" #include "codegen/java_client_interface_code_emitter.h" #include "codegen/java_client_proxy_code_emitter.h" #include "util/options.h" - namespace OHOS { namespace HDI { CodeEmitMap CodeGenerator::cCodeEmitters_ = { {"types", new CCustomTypesCodeEmitter()}, - {"clientIface", new CClientInterfaceCodeEmitter()}, + {"interface", new CInterfaceCodeEmitter()}, {"proxy", new CClientProxyCodeEmitter()}, - {"serviceIface", new CServiceInterfaceCodeEmitter()}, {"driver", new CServiceDriverCodeEmitter()}, {"stub", new CServiceStubCodeEmitter()}, {"impl", new CServiceImplCodeEmitter()}, @@ -40,9 +36,8 @@ CodeEmitMap CodeGenerator::cCodeEmitters_ = { CodeEmitMap CodeGenerator::cppCodeEmitters_ = { {"types", new CppCustomTypesCodeEmitter()}, - {"clientIface", new CppClientInterfaceCodeEmitter()}, + {"interface", new CppInterfaceCodeEmitter()}, {"proxy", new CppClientProxyCodeEmitter()}, - {"serviceIface", new CppServiceInterfaceCodeEmitter()}, {"driver", new CppServiceDriverCodeEmitter()}, {"stub", new CppServiceStubCodeEmitter()}, {"impl", new CppServiceImplCodeEmitter()}, @@ -56,7 +51,6 @@ CodeEmitMap CodeGenerator::javaCodeEmitters_ = { bool CodeGenerator::Generate() { const Options& options = Options::GetInstance(); - String dir = options.GetGenerationDirectory(); String language = options.GetTargetLanguage(); bool isModeKernel = options.DoGenerateKernelCode(); @@ -85,19 +79,18 @@ void CodeGenerator::GenerateCCode(const AutoPtr& ast, const String& outDir, } case ASTFileType::AST_IFACE: { if (codePart.Equals("client")) { - cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); break; } else if (codePart.Equals("server")) { - cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); break; } else { - cCodeEmitters_["clientIface"]->OutPut(ast, outDir, isKernel); + cCodeEmitters_["interface"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["proxy"]->OutPut(ast, outDir, isKernel); - cCodeEmitters_["serviceIface"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["driver"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["stub"]->OutPut(ast, outDir, isKernel); cCodeEmitters_["impl"]->OutPut(ast, outDir, isKernel); @@ -106,9 +99,8 @@ void CodeGenerator::GenerateCCode(const AutoPtr& ast, const String& outDir, } case ASTFileType::AST_ICALLBACK: // khdf doesn't support callback - cCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cCodeEmitters_["interface"]->OutPut(ast, outDir); cCodeEmitters_["proxy"]->OutPut(ast, outDir); - cCodeEmitters_["serviceIface"]->OutPut(ast, outDir); cCodeEmitters_["driver"]->OutPut(ast, outDir); cCodeEmitters_["stub"]->OutPut(ast, outDir); cCodeEmitters_["impl"]->OutPut(ast, outDir); @@ -126,17 +118,16 @@ void CodeGenerator::GenerateCppCode(const AutoPtr& ast, const String& outDi break; case ASTFileType::AST_IFACE: { if (codePart.Equals("client")) { - cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["interface"]->OutPut(ast, outDir); cppCodeEmitters_["proxy"]->OutPut(ast, outDir); } else if (codePart.Equals("server")) { - cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); + cppCodeEmitters_["interface"]->OutPut(ast, outDir); cppCodeEmitters_["driver"]->OutPut(ast, outDir); cppCodeEmitters_["stub"]->OutPut(ast, outDir); cppCodeEmitters_["impl"]->OutPut(ast, outDir); } else { - cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["interface"]->OutPut(ast, outDir); cppCodeEmitters_["proxy"]->OutPut(ast, outDir); - cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); cppCodeEmitters_["driver"]->OutPut(ast, outDir); cppCodeEmitters_["stub"]->OutPut(ast, outDir); cppCodeEmitters_["impl"]->OutPut(ast, outDir); @@ -144,9 +135,8 @@ void CodeGenerator::GenerateCppCode(const AutoPtr& ast, const String& outDi break; } case ASTFileType::AST_ICALLBACK: - cppCodeEmitters_["clientIface"]->OutPut(ast, outDir); + cppCodeEmitters_["interface"]->OutPut(ast, outDir); cppCodeEmitters_["proxy"]->OutPut(ast, outDir); - cppCodeEmitters_["serviceIface"]->OutPut(ast, outDir); cppCodeEmitters_["driver"]->OutPut(ast, outDir); cppCodeEmitters_["stub"]->OutPut(ast, outDir); cppCodeEmitters_["impl"]->OutPut(ast, outDir); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 2ef741075..e73a21ea6 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -15,10 +15,8 @@ namespace OHOS { namespace HDI { bool CppClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -86,11 +84,8 @@ void CppClientProxyCodeEmitter::EmitProxyDecl(StringBuilder& sb, const String& p void CppClientProxyCodeEmitter::EmitProxyConstructor(StringBuilder& sb, const String& prefix) { - sb.Append(prefix).AppendFormat("explicit %s(\n", proxyName_.string()); - sb.Append(prefix + g_tab).Append("const sptr& remote)\n"); - sb.Append(prefix + g_tab).AppendFormat(": IRemoteProxy<%s>(remote)\n", interfaceName_.string()); - sb.Append(prefix).Append("{}\n"); - sb.Append("\n"); + sb.Append(prefix).AppendFormat("explicit %s(const sptr& remote)", proxyName_.string()); + sb.AppendFormat(" : IRemoteProxy<%s>(remote) {}\n\n", interfaceName_.string()); sb.Append(prefix).AppendFormat("virtual ~%s() {}\n", proxyName_.string()); } @@ -154,6 +149,8 @@ void CppClientProxyCodeEmitter::EmitProxySourceFile() if (!isCallbackInterface()) { EmitGetMethodImpl(sb, ""); sb.Append("\n"); + EmitGetInstanceMethodImpl(sb, ""); + sb.Append("\n"); } EmitProxyMethodImpls(sb, ""); sb.Append("\n"); @@ -192,6 +189,16 @@ void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder& sb, const Strin sb.Append(prefix).AppendFormat("sptr<%s> %s::Get()\n", interface_->GetName().string(), interface_->GetName().string()); sb.Append(prefix).Append("{\n"); + sb.Append(prefix + g_tab).AppendFormat("return %s::GetInstance(\"%s\");\n", + interfaceName_.string(), FileName(implName_).string()); + sb.Append(prefix).Append("}\n"); +} + +void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("sptr<%s> %s::GetInstance(const std::string& serviceName)\n", + interface_->GetName().string(), interface_->GetName().string()); + sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("do {\n"); sb.Append(prefix + g_tab + g_tab).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n"); sb.Append(prefix + g_tab + g_tab).Append("auto servMgr = IServiceManager::Get();\n"); @@ -200,15 +207,14 @@ void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder& sb, const Strin "HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); sb.Append(prefix + g_tab + g_tab + g_tab).Append("break;\n"); sb.Append(prefix + g_tab + g_tab).Append("}\n\n"); - sb.Append(prefix + g_tab + g_tab).AppendFormat( - "sptr remote = servMgr->GetService(\"%sService\");\n", infName_.string()); + sb.Append(prefix + g_tab + g_tab).Append("sptr remote = servMgr->GetService(serviceName.c_str());\n"); sb.Append(prefix + g_tab + g_tab).Append("if (remote != nullptr) {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return iface_cast<%s>(remote);\n", interface_->GetName().string()); sb.Append(prefix + g_tab + g_tab).Append("}\n"); sb.Append(prefix + g_tab).Append("} while(false);\n"); sb.Append(prefix + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: get %sService failed!\", __func__);\n", infName_.string()); + "HDF_LOGE(\"%%{public}s: get %s failed!\", __func__);\n", FileName(implName_).string()); sb.Append(prefix + g_tab).Append("return nullptr;\n"); sb.Append(prefix).Append("}\n"); } @@ -272,7 +278,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& me ConstantName(method->GetName()).string()); sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); sb.Append(prefix + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s failed, error code is %%d\", ec);\n", method->GetName().string()); + "HDF_LOGE(\"%%{public}s failed, error code is %%{public}d\", __func__, ec);\n", method->GetName().string()); sb.Append(prefix + g_tab + g_tab).Append("return ec;\n"); sb.Append(prefix + g_tab).Append("}\n"); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index 2ab597f34..868f113ff 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -47,6 +47,8 @@ private: void EmitGetMethodImpl(StringBuilder& sb, const String& prefix); + void EmitGetInstanceMethodImpl(StringBuilder& sb, const String& prefix); + void EmitProxyMethodImpls(StringBuilder& sb, const String& prefix); void EmitProxyMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index 74b14832e..83b857d03 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -77,6 +77,20 @@ void CppCodeEmitter::EmitTailMacro(StringBuilder& sb, const String& fullName) sb.Append("#endif // ").Append(macroName).Append("\n\n"); } +void CppCodeEmitter::EmitHeadExternC(StringBuilder& sb) +{ + sb.Append("#ifdef __cplusplus\n"); + sb.Append("extern \"C\" {\n"); + sb.Append("#endif /* __cplusplus */\n"); +} + +void CppCodeEmitter::EmitTailExternC(StringBuilder& sb) +{ + sb.Append("#ifdef __cplusplus\n"); + sb.Append("}\n"); + sb.Append("#endif /* __cplusplus */\n"); +} + void CppCodeEmitter::EmitBeginNamespace(StringBuilder& sb) { String nspace = interface_->GetNamespace()->ToString(); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index c46a6ff0f..a7c30f1e3 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -35,6 +35,10 @@ protected: void EmitTailMacro(StringBuilder& sb, const String& fullName); + void EmitHeadExternC(StringBuilder& sb); + + void EmitTailExternC(StringBuilder& sb); + virtual void EmitBeginNamespace(StringBuilder& sb); virtual void EmitEndNamespace(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp new file mode 100755 index 000000000..0e0a7c76a --- /dev/null +++ b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "codegen/cpp_interface_code_emitter.h" +#include "util/file.h" +#include "util/logger.h" + +namespace OHOS { +namespace HDI { +bool CppInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) +{ + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), + FileName(ast_->GetPackageName()).string())); + } else { + return false; + } + + if (!File::CreateParentDir(directory_)) { + Logger::E("CppInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); + return false; + } + + return true; +} + +void CppInterfaceCodeEmitter::EmitCode() +{ + EmitInterfaceHeaderFile(); +} + +void CppInterfaceCodeEmitter::EmitInterfaceHeaderFile() +{ + String filePath = String::Format("%s/%s.h", directory_.string(), FileName(interfaceName_).string()); + File file(filePath, File::WRITE); + StringBuilder sb; + + EmitLicense(sb); + EmitHeadMacro(sb, interfaceFullName_); + sb.Append("\n"); + EmitInterfaceInclusions(sb); + sb.Append("\n"); + EmitBeginNamespace(sb); + sb.Append("\n"); + EmitUsingNamespace(sb); + sb.Append("\n"); + EmitInterfaceMethodCommands(sb, ""); + sb.Append("\n"); + EmitInterfaceDefinition(sb); + sb.Append("\n"); + EmitEndNamespace(sb); + sb.Append("\n"); + EmitTailMacro(sb, interfaceFullName_); + + String data = sb.ToString(); + file.WriteData(data.string(), data.GetLength()); + file.Flush(); + file.Close(); +} + +void CppInterfaceCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb) +{ + EmitInterfaceStdlibInclusions(sb); + EmitInterfaceDBinderInclusions(sb); + EmitInterfaceSelfDefinedTypeInclusions(sb); +} + +void CppInterfaceCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb) +{ + bool includeString = false; + bool includeList = false; + bool includeMap = false; + + const AST::TypeStringMap& types = ast_->GetTypes(); + for (const auto& pair : types) { + AutoPtr type = pair.second; + switch (type->GetTypeKind()) { + case TypeKind::TYPE_STRING: { + if (!includeString) { + sb.Append("#include \n"); + includeString = true; + } + break; + } + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: { + if (!includeList) { + sb.Append("#include \n"); + includeList = true; + } + break; + } + case TypeKind::TYPE_MAP: { + if (!includeMap) { + sb.Append("#include \n"); + includeMap = true; + } + break; + } + default: + break; + } + } +} + +void CppInterfaceCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb) +{ + sb.Append("#include \n"); + sb.Append("#include \n"); + sb.Append("#include \n"); +} + +void CppInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb) +{ + for (const auto& importPair : ast_->GetImports()) { + AutoPtr importAst = importPair.second; + sb.Append("#include ").AppendFormat("\"%s.h\"\n", FileName(importAst->GetFullName()).string()); + } +} + +void CppInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) +{ + if (!isCallbackInterface()) { + sb.Append("#ifndef __HDI_SERVER__\n"); + sb.AppendFormat("class %s : public IRemoteBroker {\n", interfaceName_.string()); + sb.Append("public:\n"); + EmitInterfaceDescriptor(sb, g_tab); + sb.Append("\n"); + EmitGetMethodDecl(sb, g_tab); + sb.Append("\n"); + EmitGetInstanceMethodDecl(sb, g_tab); + sb.Append("#else\n"); + sb.AppendFormat("class %s {\n", interfaceName_.string()); + sb.Append("public:\n"); + sb.Append("#endif\n"); + + + EmitInterfaceDestruction(sb, g_tab); + sb.Append("\n"); + EmitInterfaceMethodsDecl(sb, g_tab); + sb.Append("};\n\n"); + } else { + sb.AppendFormat("class %s : public IRemoteBroker {\n", interfaceName_.string()); + sb.Append("public:\n"); + EmitInterfaceDescriptor(sb, g_tab); + sb.Append("\n"); + EmitInterfaceDestruction(sb, g_tab); + sb.Append("\n"); + EmitInterfaceMethodsDecl(sb, g_tab); + sb.Append("};\n\n"); + } +} + +void CppInterfaceCodeEmitter::EmitInterfaceDescriptor(StringBuilder& sb, const String& prefix) +{ + sb.Append(g_tab).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", interfaceFullName_.string()); +} + +void CppInterfaceCodeEmitter::EmitGetMethodDecl(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("static sptr<%s> Get();\n", interface_->GetName().string()); +} + +void CppInterfaceCodeEmitter::EmitGetInstanceMethodDecl(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("static sptr<%s> GetInstance(const std::string& serviceName);\n", + interface_->GetName().string()); +} + +void CppInterfaceCodeEmitter::EmitInterfaceDestruction(StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("virtual ~%s() = default;\n", interface_->GetName().string()); +} + +void CppInterfaceCodeEmitter::EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix) +{ + for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { + AutoPtr method = interface_->GetMethod(i); + EmitInterfaceMethodDecl(method, sb, prefix); + if (i + 1 < interface_->GetMethodNumber()) { + sb.Append("\n"); + } + } +} + +void CppInterfaceCodeEmitter::EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, + const String& prefix) +{ + if (method->GetParameterNumber() == 0) { + sb.Append(prefix).AppendFormat("virtual int32_t %s() = 0;\n", method->GetName().string()); + } else { + StringBuilder paramStr; + paramStr.Append(prefix).AppendFormat("virtual int32_t %s(", method->GetName().string()); + for (size_t i = 0; i < method->GetParameterNumber(); i++) { + AutoPtr param = method->GetParameter(i); + EmitInterfaceMethodParameter(param, paramStr, ""); + if (i + 1 < method->GetParameterNumber()) { + paramStr.Append(", "); + } + } + + paramStr.Append(") = 0;"); + sb.Append(SpecificationParam(paramStr, prefix + g_tab)); + sb.Append("\n"); + } +} + +void CppInterfaceCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, + const String& prefix) +{ + sb.Append(prefix).Append(param->EmitCppParameter()); +} +} // namespace HDI +} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_interface_code_emitter.h new file mode 100755 index 000000000..2481aac5e --- /dev/null +++ b/tools/hdi-gen/codegen/cpp_interface_code_emitter.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef OHOS_HDI_CPP_INTERFACE_CODE_EMITTER_H +#define OHOS_HDI_CPP_INTERFACE_CODE_EMITTER_H + +#include "codegen/cpp_code_emitter.h" + +namespace OHOS { +namespace HDI { + +class CppInterfaceCodeEmitter : public CppCodeEmitter { +public: + CppInterfaceCodeEmitter() : CppCodeEmitter() {} + + virtual ~CppInterfaceCodeEmitter() = default; +private: + bool ResolveDirectory(const String& targetDirectory) override; + + void EmitCode() override; + + void EmitInterfaceHeaderFile(); + + void EmitInterfaceInclusions(StringBuilder& sb); + + void EmitInterfaceStdlibInclusions(StringBuilder& sb); + + void EmitInterfaceDBinderInclusions(StringBuilder& sb); + + void EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb); + + void EmitInterfaceDefinition(StringBuilder& sb); + + void EmitInterfaceDescriptor(StringBuilder& sb, const String& prefix); + + void EmitGetMethodDecl(StringBuilder& sb, const String& prefix); + + void EmitGetInstanceMethodDecl(StringBuilder& sb, const String& prefix); + + void EmitInterfaceDestruction(StringBuilder& sb, const String& prefix); + + void EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix); + + void EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix); + + void EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix); +}; + +} // namespace HDI +} // namespace OHOS + +#endif // OHOS_HDI_CPP_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 21a843227..9a08369b4 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -9,6 +9,7 @@ #include "codegen/cpp_service_driver_code_emitter.h" #include "util/file.h" #include "util/logger.h" +#include "util/options.h" namespace OHOS { namespace HDI { @@ -18,7 +19,7 @@ bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory return false; } - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), + directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); if (!File::CreateParentDir(directory_)) { Logger::E("CppServiceDriverCodeEmitter", "Create '%s' failed!", directory_.string()); @@ -88,7 +89,7 @@ void CppServiceDriverCodeEmitter::EmitDriverUsings(StringBuilder& sb) void CppServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) { - sb.AppendFormat("struct Hdf%s%s {\n", infName_.string(), "Service"); + sb.AppendFormat("struct Hdf%sHost {\n", infName_.string()); sb.Append(g_tab).Append("struct IDeviceIoService ioservice;\n"); sb.Append(g_tab).Append("void *instance;\n"); sb.Append("};\n"); @@ -96,15 +97,15 @@ void CppServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) void CppServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb) { - sb.AppendFormat("static int32_t %sServiceDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", + sb.AppendFormat("static int32_t %sDriverDispatch(struct HdfDeviceIoClient *client, int cmdId,\n", infName_.string()); sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *hdf%sHost = CONTAINER_OF(\n", infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sService, ioservice);\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n", infName_.string()); - sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(hdf%sService->instance, cmdId, data, reply);\n", + sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(hdf%sHost->instance, cmdId, data, reply);\n", infName_.string(), infName_.string()); sb.Append("}\n"); } @@ -113,7 +114,7 @@ void CppServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter, new hdi impl.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter\");\n", infName_.string()); sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -122,24 +123,24 @@ void CppServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) { sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter\");\n", infName_.string()); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = (struct Hdf%sService *)OsalMemAlloc(\n", + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *hdf%sHost = (struct Hdf%sHost *)OsalMemAlloc(\n", infName_.string(), infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sService));\n", infName_.string()); - sb.Append(g_tab).AppendFormat("if (hdf%sService == nullptr) {\n", infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sService failed!\");\n", + sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", infName_.string()); + sb.Append(g_tab).AppendFormat("if (hdf%sHost == nullptr) {\n", infName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sHost failed!\");\n", infName_.string(), infName_.string()); sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Dispatch = %sServiceDispatch;\n", + sb.Append(g_tab).AppendFormat("hdf%sHost->ioservice.Dispatch = %sDriverDispatch;\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Open = NULL;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->ioservice.Release = NULL;\n", infName_.string()); - sb.Append(g_tab).AppendFormat("hdf%sService->instance = %sStubInstance();\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sHost->ioservice.Open = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sHost->ioservice.Release = NULL;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("hdf%sHost->instance = %sStubInstance();\n", infName_.string(), infName_.string()); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("deviceObject->service = &hdf%sService->ioservice;\n", infName_.string()); + sb.Append(g_tab).AppendFormat("deviceObject->service = &hdf%sHost->ioservice;\n", infName_.string()); sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); } @@ -148,13 +149,11 @@ void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) { sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", infName_.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n\n", interfaceName_.string()); - sb.Append(g_tab).AppendFormat("struct Hdf%sService *hdf%sService = CONTAINER_OF(\n", - infName_.string(), infName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("deviceObject->service, struct Hdf%sService, ioservice);\n", - infName_.string()); - sb.Append(g_tab).AppendFormat("%sStubRelease(hdf%sService->instance);\n", infName_.string(), infName_.string()); - sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sService);\n", infName_.string()); + sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter\");\n\n", infName_.string()); + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *hdf%sHost = CONTAINER_OF(", infName_.string(), infName_.string()); + sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n", infName_.string()); + sb.Append(g_tab).AppendFormat("%sStubRelease(hdf%sHost->instance);\n", infName_.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(hdf%sHost);\n", infName_.string()); sb.Append("}\n"); } @@ -162,7 +161,8 @@ void CppServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) { sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); sb.Append(g_tab).Append(".moduleVersion = 1,\n"); - sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", infName_.ToLowerCase().string()); + sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", + Options::GetInstance().GetModeName().string()); sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index 1d0d0e7d1..263f68bd6 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -14,10 +14,8 @@ namespace OHOS { namespace HDI { bool CppServiceImplCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -50,6 +48,18 @@ void CppServiceImplCodeEmitter::EmitImplHeaderFile() EmitServiceImplInclusions(sb); sb.Append("\n"); EmitServiceImplDecl(sb); + + if (!isCallbackInterface()) { + sb.Append("\n"); + EmitHeadExternC(sb); + sb.Append("\n"); + EmitExternalGetMethodDecl(sb); + sb.Append("\n"); + EmitExternalReleaseMethodDecl(sb); + sb.Append("\n"); + EmitTailExternC(sb); + } + sb.Append("\n"); EmitTailMacro(sb, implFullName_); @@ -132,6 +142,16 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix); + void EmitExternalGetMethodDecl(StringBuilder& sb); + + void EmitExternalReleaseMethodDecl(StringBuilder& sb); + void EmitImplSourceFile(); void EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix); void EmitServiceImplMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); + + void EmitExternalGetMethodImpl(StringBuilder& sb); + + void EmitExternalReleaseMethodImpl(StringBuilder& sb); }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index 6a2c2652c..26a229853 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -14,10 +14,8 @@ namespace OHOS { namespace HDI { bool CppServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) { - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { + if (ast_->GetASTFileType() == ASTFileType::AST_IFACE || + ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), FileName(ast_->GetPackageName()).string())); } else { @@ -69,12 +67,10 @@ void CppServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb) sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); - if (!isCallbackInterface()) { - sb.AppendFormat("#include \"%s_service.h\"\n", FileName(infName_).string()); - } else { + if (isCallbackInterface()) { sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); } + sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); } void CppServiceStubCodeEmitter::EmitStubDecl(StringBuilder& sb) @@ -178,8 +174,8 @@ void CppServiceStubCodeEmitter::EmitStubOnRequestMethodDecl(StringBuilder& sb, c void CppServiceStubCodeEmitter::EmitStubMembers(StringBuilder& sb, const String& prefix) { - sb.Append("private:\n"); - sb.Append(prefix).AppendFormat("%sService service;\n", infName_.string()); + sb.Append(prefix).Append("void *dlHandler;\n"); + sb.Append(prefix).AppendFormat("%s *service;\n", interfaceName_.string()); } void CppServiceStubCodeEmitter::EmitStubExternalsMethodsDel(StringBuilder& sb) @@ -201,6 +197,18 @@ void CppServiceStubCodeEmitter::EmitStubSourceFile() EmitLicense(sb); EmitStubSourceInclusions(sb); + + if (!isCallbackInterface()) { + sb.Append("\n"); + EmitDriverLibPath(sb); + sb.Append("\n"); + EmitHeadExternC(sb); + sb.Append("\n"); + EmitLibFuncTypeDef(sb); + sb.Append("\n"); + EmitTailExternC(sb); + } + sb.Append("\n"); EmitBeginNamespace(sb); sb.Append("\n"); @@ -233,20 +241,43 @@ void CppServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb) void CppServiceStubCodeEmitter::EmitStubSourceStdlibInclusions(StringBuilder& sb) { + if (!isCallbackInterface()) { + sb.Append("#include \n"); + } sb.Append("#include \n"); sb.Append("#include \n"); sb.Append("#include \n"); const AST::TypeStringMap& types = ast_->GetTypes(); - for (const auto& pair : types) { - AutoPtr type = pair.second; - if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); - break; + if (isCallbackInterface()) { + for (const auto& pair : types) { + AutoPtr type = pair.second; + if (type->GetTypeKind() == TypeKind::TYPE_UNION) { + sb.Append("#include \n"); + break; + } } + } else { + sb.Append("#include \n"); } } +void CppServiceStubCodeEmitter::EmitDriverLibPath(StringBuilder& sb) +{ + sb.Append("#ifdef __ARM64__\n"); + sb.Append("#define DRIVER_PATH \"system/lib64\"\n"); + sb.Append("#else\n"); + sb.Append("#define DRIVER_PATH \"system/lib\"\n"); + sb.Append("#endif\n"); +} + +void CppServiceStubCodeEmitter::EmitLibFuncTypeDef(StringBuilder& sb) +{ + sb.AppendFormat("typedef %s* (*SERVICE_CONSTRUCT_FUNC)();\n", CppFullName(interface_->GetFullName()).string()); + sb.AppendFormat("typedef void (*SERVICE_RELEASE_FUNC)(%s *obj);\n", + CppFullName(interface_->GetFullName()).string()); +} + void CppServiceStubCodeEmitter::EmitStubMethodImpls(StringBuilder& sb, const String& prefix) { for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { @@ -298,7 +329,7 @@ void CppServiceStubCodeEmitter::EmitStubCallMethod(const AutoPtr& met const String& prefix) { if (!isCallbackInterface()) { - sb.Append(prefix).AppendFormat("int32_t ec = service.%s(", method->GetName().string()); + sb.Append(prefix).AppendFormat("int32_t ec = service->%s(", method->GetName().string()); } else { sb.Append(prefix).AppendFormat("int32_t ec = %s(", method->GetName().string()); } @@ -369,58 +400,141 @@ void CppServiceStubCodeEmitter::EmitCbStubOnRequestMethodImpl(StringBuilder& sb, void CppServiceStubCodeEmitter::EmitStubExternalsMethodsImpl(StringBuilder& sb, const String& prefix) { - EmitStubInstanceMethodImpl(sb, prefix); + EmitStubLinkService(sb); + sb.Append("\n"); + EmitStubInstanceMethodImpl(sb); sb.Append("\n"); - EmitStubReleaseMethodImpl(sb, prefix); + EmitStubReleaseMethodImpl(sb); sb.Append("\n"); - EmitServiceOnRemoteRequest(sb, prefix); + EmitServiceOnRemoteRequest(sb); } -void CppServiceStubCodeEmitter::EmitStubInstanceMethodImpl(StringBuilder& sb, const String& prefix) +void CppServiceStubCodeEmitter::EmitStubLinkService(StringBuilder& sb) { - sb.Append(prefix).AppendFormat("void *%sInstance()\n", stubName_.string()); - sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", + sb.Append("static void *LoadServiceHandler(const char* libFileName)\n"); + sb.Append("{\n"); + sb.Append(g_tab).Append("char path[PATH_MAX + 1] = {0};\n"); + sb.Append(g_tab).Append("char libPath[PATH_MAX + 1] = {0};\n"); + sb.Append(g_tab).Append("void *handler = NULL;\n"); + sb.Append("\n"); + sb.Append(g_tab).AppendFormat("if (snprintf_s(path, sizeof(path), sizeof(path) - 1, \"%%s/%%s\", "); + sb.Append("DRIVER_PATH, libFileName) < 0) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: snprintf_s failed\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("if (realpath(path, libPath) == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s file name invalid\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("handler = dlopen(libPath, RTLD_LAZY);\n"); + sb.Append(g_tab).Append("if (handler == NULL) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: dlopen failed %{public}s\", "); + sb.AppendFormat("__func__, dlerror());\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n"); + sb.Append("\n"); + sb.Append(g_tab).Append("return handler;\n"); + sb.Append("}\n"); +} + +void CppServiceStubCodeEmitter::EmitStubInstanceMethodImpl(StringBuilder& sb) +{ + String objName = "stub"; + String libName = String::Format("lib%s.z.so", FileName(implName_).string()); + sb.AppendFormat("void *%sInstance()\n", stubName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + g_tab).AppendFormat("return reinterpret_cast(new %s());\n", stubName_.string()); - sb.Append(prefix).Append("}\n"); + sb.Append(g_tab).Append("SERVICE_CONSTRUCT_FUNC serviceConstructFunc = nullptr;\n"); + sb.Append(g_tab).AppendFormat("%sStub *%s = new %sStub();\n", infName_.string(), objName.string(), + infName_.string()); + sb.Append(g_tab).AppendFormat("if (%s == nullptr) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc %s failed!\", __func__);\n", + objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return nullptr;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%s->dlHandler = LoadServiceHandler(\"%s\");\n", objName.string(), libName.string()); + sb.Append(g_tab).AppendFormat("if (%s->dlHandler == nullptr) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: %s->dlHanlder is null\", __func__);\n", + objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("delete %s;\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return nullptr;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("serviceConstructFunc = "); + sb.AppendFormat("(SERVICE_CONSTRUCT_FUNC)dlsym(%s->dlHandler, \"%sServiceConstruct\");\n", + objName.string(), infName_.string()); + sb.Append(g_tab).Append("if (serviceConstructFunc == nullptr) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: dlsym failed %{public}s\", __func__, dlerror());\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("dlclose(%s->dlHandler);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("delete %s;\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return nullptr;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%s->service = serviceConstructFunc();\n", objName.string()); + sb.Append(g_tab).AppendFormat("if (%s->service == nullptr) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: get service failed %{public}s\", "); + sb.Append("__func__, dlerror());\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("dlclose(%s->dlHandler);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("delete %s;\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return nullptr;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).Append("return reinterpret_cast(stub);\n"); + sb.Append("}\n"); } -void CppServiceStubCodeEmitter::EmitStubReleaseMethodImpl(StringBuilder& sb, const String& prefix) +void CppServiceStubCodeEmitter::EmitStubReleaseMethodImpl(StringBuilder& sb) { - sb.Append(prefix).AppendFormat("void %sRelease(void *obj)\n", stubName_.string()); - sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", + String objName = "stub"; + sb.AppendFormat("void %sRelease(void *obj)\n", stubName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + g_tab).AppendFormat("delete reinterpret_cast<%s *>(obj);\n", stubName_.string()); - sb.Append(prefix).Append("}\n"); + sb.Append(g_tab).Append("if (obj == nullptr) {\n"); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%sStub *%s = reinterpret_cast<%sStub *>(obj);\n", infName_.string(), + objName.string(), infName_.string()); + sb.Append(g_tab).AppendFormat("if (%s == nullptr) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).Append("SERVICE_RELEASE_FUNC serviceReleaseFunc = "); + sb.AppendFormat("(SERVICE_RELEASE_FUNC)dlsym(%s->dlHandler, \"SampleServiceRelease\");\n", objName.string()); + sb.Append(g_tab).Append("if (serviceReleaseFunc == nullptr) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: dlsym failed %{public}s\", __func__, dlerror());\n"); + sb.Append(g_tab).Append("} else {\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("serviceReleaseFunc(%s->service);\n", objName.string()); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("dlclose(%s->dlHandler);\n", objName.string()); + sb.Append(g_tab).AppendFormat("delete %s;\n", objName.string()); + sb.Append("}\n"); } -void CppServiceStubCodeEmitter::EmitServiceOnRemoteRequest(StringBuilder& sb, const String& prefix) +void CppServiceStubCodeEmitter::EmitServiceOnRemoteRequest(StringBuilder& sb) { String stubObjName = String::Format("%sStub", infName_.ToLowerCase().string()); - sb.Append(prefix).AppendFormat( + sb.AppendFormat( "int32_t %sServiceOnRemoteRequest(void *stub, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply)\n", infName_.string()); - sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("using namespace %s;\n", + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("using namespace %s;\n", EmitStubServiceUsings(interface_->GetNamespace()->ToString()).string()); - sb.Append(prefix + g_tab).AppendFormat("%s *%s = reinterpret_cast<%s *>(stub);\n", + sb.Append(g_tab).AppendFormat("%s *%s = reinterpret_cast<%s *>(stub);\n", stubName_.string(), stubObjName.string(), stubName_.string()); - sb.Append(prefix + g_tab).Append("OHOS::MessageParcel *dataParcel = nullptr;\n"); - sb.Append(prefix + g_tab).Append("OHOS::MessageParcel *replyParcel = nullptr;\n"); + sb.Append(g_tab).Append("OHOS::MessageParcel *dataParcel = nullptr;\n"); + sb.Append(g_tab).Append("OHOS::MessageParcel *replyParcel = nullptr;\n"); sb.Append("\n"); - sb.Append(prefix + g_tab).Append("(void)SbufToParcel(reply, &replyParcel);\n"); - sb.Append(prefix + g_tab).Append("if (SbufToParcel(data, &dataParcel) != HDF_SUCCESS) {\n"); - sb.Append(prefix + g_tab + g_tab).Append( - "HDF_LOGE(\"%{public}s:invalid data sbuf object to dispatch\", __func__);\n"); - sb.Append(prefix + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab).Append("}\n\n"); - sb.Append(prefix + g_tab).Append("OHOS::MessageOption option;\n"); - sb.Append(prefix + g_tab).AppendFormat("return %s->%sOnRemoteRequest(cmdId, *dataParcel, *replyParcel, option);\n", + sb.Append(g_tab).Append("(void)SbufToParcel(reply, &replyParcel);\n"); + sb.Append(g_tab).Append("if (SbufToParcel(data, &dataParcel) != HDF_SUCCESS) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s:invalid data sbuf object to dispatch\","); + sb.Append(" __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).Append("OHOS::MessageOption option;\n"); + sb.Append(g_tab).AppendFormat("return %s->%sOnRemoteRequest(cmdId, *dataParcel, *replyParcel, option);\n", stubObjName.string(), stubName_.string()); - sb.Append(prefix).Append("}\n"); + sb.Append("}\n"); } String CppServiceStubCodeEmitter::EmitStubServiceUsings(String nameSpace) diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h index a403a30b2..9d8bd615b 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h @@ -59,6 +59,10 @@ private: void EmitStubSourceStdlibInclusions(StringBuilder& sb); + void EmitDriverLibPath(StringBuilder& sb); + + void EmitLibFuncTypeDef(StringBuilder& sb); + void EmitStubMethodImpls(StringBuilder& sb, const String& prefix); void EmitStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); @@ -71,11 +75,13 @@ private: void EmitStubExternalsMethodsImpl(StringBuilder& sb, const String& prefix); - void EmitStubInstanceMethodImpl(StringBuilder& sb, const String& prefix); + void EmitStubLinkService(StringBuilder& sb); + + void EmitStubInstanceMethodImpl(StringBuilder& sb); - void EmitStubReleaseMethodImpl(StringBuilder& sb, const String& prefix); + void EmitStubReleaseMethodImpl(StringBuilder& sb); - void EmitServiceOnRemoteRequest(StringBuilder& sb, const String& prefix); + void EmitServiceOnRemoteRequest(StringBuilder& sb); String EmitStubServiceUsings(String nameSpace); }; diff --git a/tools/hdi-gen/main.cpp b/tools/hdi-gen/main.cpp index 00c6e8533..5974ef048 100755 --- a/tools/hdi-gen/main.cpp +++ b/tools/hdi-gen/main.cpp @@ -37,12 +37,14 @@ int main(int argc, char** argv) } if (options.DoGetHashKey()) { - std::unique_ptr idlFile = std::make_unique(options.GetSourceFile(), int(File::READ)); - if (!idlFile->IsValid()) { - Logger::E("hdi-gen", "open idl file failed!"); - return -1; + for (const auto& sourceFile : options.GetSourceFiles()) { + std::unique_ptr idlFile = std::make_unique(sourceFile, int(File::READ)); + if (!idlFile->IsValid()) { + Logger::E("hdi-gen", "open idl file failed!"); + return -1; + } + printf("%s:%lu\n", idlFile->GetPath().string(), idlFile->GetHashKey()); } - printf("%s:%lu\n", idlFile->GetPath().string(), idlFile->GetHashKey()); return 0; } diff --git a/tools/hdi-gen/parser/module_parser.cpp b/tools/hdi-gen/parser/module_parser.cpp index 222f89f79..d8ff0b53d 100755 --- a/tools/hdi-gen/parser/module_parser.cpp +++ b/tools/hdi-gen/parser/module_parser.cpp @@ -13,6 +13,8 @@ namespace OHOS { namespace HDI { +const char* ModuleParser::TAG = "ModuleParser"; + AutoPtr ModuleParser::Parse() { if (!ParserDependencies()) { @@ -28,13 +30,20 @@ AutoPtr ModuleParser::Parse() bool ModuleParser::ParserDependencies() { - if (!ParserAllImports(option_.GetSourceFile())) { - Logger::E(g_tab, "Parsing all idl file failed."); - return false; + if (option_.GetSourceFiles().size() == 1) { + if (!ParserAllImports(option_.GetSourceFiles()[0])) { + Logger::E(TAG, "Parsing all idl file failed."); + return false; + } + } else { + if (!ParserAllidlFile(option_.GetSourceFiles())) { + Logger::E(TAG, "Parsing all given idl file failed."); + return false; + } } if (!CheckCircularReference()) { - Logger::E(g_tab, "has circle reference."); + Logger::E(TAG, "has circle reference."); return false; } @@ -47,7 +56,7 @@ bool ModuleParser::CompileFiles() for (const auto& filePath : compileFiles_) { if (!parserPtr->Parse(filePath)) { - Logger::E(g_tab, "parse %s failed", filePath.string()); + Logger::E(TAG, "parse %s failed", filePath.string()); return false; } } @@ -84,21 +93,41 @@ bool ModuleParser::ParserAllImportsRecursion(const std::shared_ptr& std::unique_ptr parserPtr = std::make_unique(option_); std::shared_ptr file = nullptr; if (!parserPtr->Parse(filePath, file)) { - Logger::E(g_tab, "Parsing %s failed.", filePath.string()); + Logger::E(TAG, "Parsing %s failed.", filePath.string()); return false; } if (file == nullptr) { - Logger::E(g_tab, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); + Logger::E(TAG, "Parsing %s failed, generator filedetail is nullptr.", filePath.string()); return false; } sourceFiles_[file->GetFullName()] = file; if (!ParserAllImportsRecursion(file)) { - Logger::E(g_tab, "Parsing %s file's import failed.", file->GetFilePath().string()); + Logger::E(TAG, "Parsing %s file's import failed.", file->GetFilePath().string()); + return false; + } + } + + return true; +} + +bool ModuleParser::ParserAllidlFile(const std::vector& idlSourceFile) +{ + std::unique_ptr parserPtr = std::make_unique(option_); + + for (const auto& idlSourceFile : idlSourceFile) { + std::shared_ptr fileInfo = nullptr; + if (!parserPtr->Parse(idlSourceFile, fileInfo)) { return false; } + + if (fileInfo == nullptr) { + return false; + } + + sourceFiles_[fileInfo->GetFullName()] = fileInfo; } return true; diff --git a/tools/hdi-gen/parser/module_parser.h b/tools/hdi-gen/parser/module_parser.h index 934ef45e9..e7f0537ef 100755 --- a/tools/hdi-gen/parser/module_parser.h +++ b/tools/hdi-gen/parser/module_parser.h @@ -43,9 +43,13 @@ private: bool ParserAllImportsRecursion(const std::shared_ptr& fileInfo); + bool ParserAllidlFile(const std::vector& idlSourceFile); + // check circular reference and reverse topology sorting of all idl file bool CheckCircularReference(); + static const char* TAG; + const Options& option_; FileDetailMap sourceFiles_; diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index a20a74509..5960d6ae8 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -20,14 +20,13 @@ const char* Options::optSupportArgs = "c:d:"; static struct option g_longOpts[] = { {"help", no_argument, nullptr, 'h'}, {"version", no_argument, nullptr, 'v'}, - {"mode-k", no_argument, nullptr, 'k'}, - {"mode-u", no_argument, nullptr, 'u'}, {"gen-c", no_argument, nullptr, 'C'}, {"gen-cpp", no_argument, nullptr, 'P'}, {"gen-java", no_argument, nullptr, 'J'}, - {"client", no_argument, nullptr, 'a'}, - {"server", no_argument, nullptr, 'b'}, - {"hash", no_argument, nullptr, 'H'}, + {"gen-hash", no_argument, nullptr, 'H'}, + {"build-target", required_argument, nullptr, 'p'}, + {"mode-name", required_argument, nullptr, 'N'}, + {"kernel", no_argument, nullptr, 'K'}, {"dump-ast", no_argument, nullptr, 'D'}, {nullptr, 0, nullptr, 0} }; @@ -57,7 +56,7 @@ void Options::SetOptionData(char op) switch (op) { case 'c': doCompile_ = true; - sourceFilePath_ = optarg; + sourceFiles_.push_back(optarg); break; case 'd': doOutDir_ = true; @@ -69,11 +68,12 @@ void Options::SetOptionData(char op) case 'v': doShowVersion_ = true; break; - case 'k': + case 'K': doModeKernel_ = true; break; - case 'u': - doModeKernel_ = false; + case 'N': + doSetModeName_ = true; + modeName_ = optarg; break; case 'C': SetLanguage("c"); @@ -84,11 +84,8 @@ void Options::SetOptionData(char op) case 'J': SetLanguage("java"); break; - case 'a': - SetCodePart("client"); - break; - case 'b': - SetCodePart("server"); + case 'p': + SetCodePart(optarg); break; case 'H': doGetHashKey_ = true; @@ -103,14 +100,15 @@ void Options::SetOptionData(char op) } } -void Options::SetLanguage(String language) +void Options::SetLanguage(const String& language) { doGenerateCode_ = true; targetLanguage_ = language; } -void Options::SetCodePart(String part) +void Options::SetCodePart(const String& part) { + // The default parameter is 'all', and the optional parameters is 'client' or 'server' doGeneratePart_ = true; codePart_ = part; } @@ -136,6 +134,13 @@ void Options::CheckOptions() errors_.push_back(String::Format("%s: no out directory.", program_.string())); return; } + + if (doGeneratePart_ && !codePart_.Equals("all") && !codePart_.Equals("client") && + !codePart_.Equals("server")) { + errors_.push_back( + String::Format("%s: The '--build-target' option parameter must be 'client' 'server' or 'all'.", + program_.string())); + } } else { if (doGetHashKey_ || doDumpAST_ || doGenerateCode_ || doOutDir_) { errors_.push_back(String::Format("%s: no '-c' option.", program_.string())); @@ -164,19 +169,18 @@ void Options::ShowUsage() const printf("Compile a .idl file and generate C/C++ and Java codes.\n" "Usage: idl [options] file\n" "Options:\n" - " --help Display command line options\n" - " --version Display toolchain version information\n" - " --hash Display hash key of the idl file\n" - " --dump-ast Display the AST of the compiled file\n" - " -c Compile the .idl file\n" - " --mode-k Generate kernel-mode ioservice stub code\n" - " --mode-u Generate user-mode ioservice stub code\n" - " --gen-c Generate C codes\n" - " --gen-cpp Generate C++ codes\n" - " --gen-java Generate Java codes\n" - " --client Generate client codes\n" - " --server Generate server codes\n" - " -d Place generated codes into \n"); + " --help Display command line options\n" + " --version Display toolchain version information\n" + " --dump-ast Display the AST of the compiled file\n" + " -c <*.idl> Compile the .idl file\n" + " --gen-hash Generate hash key of the idl file\n" + " --gen-c Generate C code\n" + " --gen-cpp Generate C++ code\n" + " --gen-java Generate Java code\n" + " --kernel Generate kernel-mode ioservice stub code, default user-mode ioservice stub code\n" + " --mode-name Set driver module name\n" + " --build-target Generate client code, server code or all code\n" + " -d Place generated codes into \n"); } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index f5e410d4a..e94231200 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -65,9 +65,9 @@ public: return !errors_.empty(); } - inline String GetSourceFile() const + inline std::vector GetSourceFiles() const { - return sourceFilePath_; + return sourceFiles_; } inline String GetTargetLanguage() const @@ -80,6 +80,11 @@ public: return codePart_; } + inline String GetModeName() const + { + return doSetModeName_ ? modeName_ : "sample"; + } + inline String GetGenerationDirectory() const { return generationDirectory_; @@ -93,7 +98,7 @@ public: private: Options() : program_(), - sourceFilePath_(), + sourceFiles_(0), targetLanguage_(), codePart_("all"), generationDirectory_(), @@ -105,13 +110,16 @@ private: doDumpAST_(false), doGetHashKey_(false), doGenerateCode_(false), + doModeKernel_(false), + doGeneratePart_(false), + doSetModeName_(false), doOutDir_(false) {} void SetOptionData(char op); - void SetLanguage(String language); + void SetLanguage(const String& language); - void SetCodePart(String part); + void SetCodePart(const String& part); void CheckOptions(); @@ -122,22 +130,24 @@ private: static constexpr int VERSION_MINOR = 1; String program_; - String sourceFilePath_; + std::vector sourceFiles_; String targetLanguage_; String codePart_; + String modeName_; String generationDirectory_; String illegalOptions_; std::vector errors_; - bool doShowUsage_ = false; - bool doShowVersion_ = false; - bool doCompile_ = false; - bool doDumpAST_ = false; - bool doGetHashKey_ = false; - bool doGenerateCode_ = false; - bool doModeKernel_ = false; - bool doGeneratePart_ = false; - bool doOutDir_ = false; + bool doShowUsage_; + bool doShowVersion_; + bool doCompile_; + bool doDumpAST_; + bool doGetHashKey_; + bool doGenerateCode_; + bool doModeKernel_; + bool doGeneratePart_; + bool doSetModeName_; + bool doOutDir_; }; } // namespace HDI } // namespace OHOS -- Gitee From c686c07e1de120183da30122b1cee18a29885841 Mon Sep 17 00:00:00 2001 From: chenchong Date: Fri, 3 Dec 2021 14:48:20 +0800 Subject: [PATCH 234/272] =?UTF-8?q?IssueNo=EF=BC=9A#I4KZ2V=20Description:M?= =?UTF-8?q?odifying=20a=20Sensor=20Alarm=20Feature=20or=20Bugfix:Bugfix=20?= =?UTF-8?q?Binary=20Source:=20NO=20Signed-off-by:=20chenchong=20=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/sensor/driver/als/sensor_als_driver.c | 3 ++- model/sensor/driver/chipset/als/als_bh1745.c | 24 ++++++++++++-------- model/sensor/driver/chipset/als/als_bh1745.h | 14 ++++++------ 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c index 4459bfa87..e89e9b6c9 100755 --- a/model/sensor/driver/als/sensor_als_driver.c +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -148,7 +148,8 @@ int32_t ParseExtendedAlsRegConfig(struct SensorCfgData *config) goto ERROR; } - if (ParseSensorRegGroup(parser, extendedRegCfgNode, extendedRegAttr->name, &config->extendedRegCfgGroup[index]) != HDF_SUCCESS) { + if (ParseSensorRegGroup(parser, extendedRegCfgNode, extendedRegAttr->name, + &config->extendedRegCfgGroup[index]) != HDF_SUCCESS) { HDF_LOGE("%s: parse sensor register group failed", __func__); goto ERROR; } diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index 12b8967fe..c17d8b0e8 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -72,14 +72,14 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa return HDF_FAILURE; } - if ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX - || rgbcData[ALS_G] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX ) && temp >= BH1745_TIME_320MSEC) { + if ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX || + rgbcData[ALS_G] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX ) && temp >= BH1745_TIME_320MSEC) { g_timeMap_flag = 1; index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); index--; WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); - } else if ((g_timeMap_flag == 1) && ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN) - || (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { + } else if ((g_timeMap_flag == 1) && ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN) || + (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { g_timeMap_flag = 0; index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); index++; @@ -132,13 +132,17 @@ static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) return (((luxTemp * BH1745_TIME_160MSEC * BH1745_GAIN_16X) / gainTemp) / timeTemp); } - static int32_t RawDataConvert(struct SensorCfgData *CfgData, struct AlsReportData *reportData, uint32_t* rgbcData) - { +static int32_t RawDataConvert(struct SensorCfgData *CfgData, struct AlsReportData *reportData, uint32_t* rgbcData) +{ + int ret; + reportData->als = (uint32_t)CalLux(CfgData, rgbcData); reportData->als = (reportData->als > 0) ? reportData->als : 0; - DynamicRangCovert(CfgData, rgbcData); + ret = DynamicRangCovert(CfgData, rgbcData); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "DynamicRangCovert"); + return HDF_SUCCESS; - } +} static int32_t ReadBh1745RawData(struct SensorCfgData *data, struct AlsData *rawData, int64_t *timestamp) { @@ -223,7 +227,9 @@ int32_t ReadBh1745Data(struct SensorCfgData *data) tmp[ALS_B] = rawData.blue; tmp[ALS_C] = rawData.clear; - RawDataConvert(data, &reportData, tmp); + ret = RawDataConvert(data, &reportData, tmp); + CHECK_PARSER_RESULT_RETURN_VALUE(ret, "RawDataConvert"); + event.dataLen = sizeof(reportData.als); event.data = (uint8_t *)&reportData.als; ret = ReportSensorEvent(&event); diff --git a/model/sensor/driver/chipset/als/als_bh1745.h b/model/sensor/driver/chipset/als/als_bh1745.h index a6040d4ee..4f9dfd275 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.h +++ b/model/sensor/driver/chipset/als/als_bh1745.h @@ -32,11 +32,11 @@ /* ALS COEFFICIENT */ #define BH1745_COEFFICIENT_RED 2 #define BH1745_COEFFICIENT_GREEN 2 -#define BH1745_COEFFICIENT_RED_LEVEL_0 77300 //7.73 * 10000 -#define BH1745_COEFFICIENT_RED_LEVEL_1 92715 //9.2715 * 10000 -#define BH1745_COEFFICIENT_GREEN_LEVEL_0 131920 //1.3192 * 10000 -#define BH1745_COEFFICIENT_GREEN_LEVEL_1 214770 //2.1477 * 10000 -#define BH1745_COEFFICIENT_JUDGE 78 //0.78*100 +#define BH1745_COEFFICIENT_RED_LEVEL_0 77300 // 7.73 * 10000 +#define BH1745_COEFFICIENT_RED_LEVEL_1 92715 // 9.2715 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_0 131920 // 1.3192 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_1 214770 // 2.1477 * 10000 +#define BH1745_COEFFICIENT_JUDGE 78 // 0.78*100 /* ALS TIME */ #define BH1745_TIME_160MSEC 160 @@ -45,8 +45,8 @@ #define BH1745_TIME_1280MSEC 1280 #define BH1745_TIME_2560MSEC 2560 #define BH1745_TIME_5120MSEC 5120 -#define BH1745_TIME_MAX 5570475 //65535*0.85*100 -#define BH1745_TIME_MIN 1638375 //65535*0.25*100 +#define BH1745_TIME_MAX 5570475 // 65535*0.85*100 +#define BH1745_TIME_MIN 1638375 // 65535*0.25*100 /* ALS GAIN */ #define BH1745_GAIN_1X 1 -- Gitee From db6d86d3487a2e2d8fd7be04af296031aa3fa088 Mon Sep 17 00:00:00 2001 From: zhang Date: Fri, 3 Dec 2021 15:55:20 +0800 Subject: [PATCH 235/272] add the function of hdf power manager to linux and liteos-a Signed-off-by: zhang --- core/common/include/manager/devmgr_pm_reg.h | 22 +++ core/common/src/devmgr_service_start.c | 10 +- test/unittest/pm/pm_driver_test.c | 156 ++++++++++++++++++++ 3 files changed, 187 insertions(+), 1 deletion(-) create mode 100755 core/common/include/manager/devmgr_pm_reg.h create mode 100755 test/unittest/pm/pm_driver_test.c diff --git a/core/common/include/manager/devmgr_pm_reg.h b/core/common/include/manager/devmgr_pm_reg.h new file mode 100755 index 000000000..839fa3625 --- /dev/null +++ b/core/common/include/manager/devmgr_pm_reg.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DEVMGR_PM_REG_H +#define DEVMGR_PM_REG_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +int DevMgrPmRegister(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* DEVMGR_PM_REG_H */ diff --git a/core/common/src/devmgr_service_start.c b/core/common/src/devmgr_service_start.c index 7c40d8a6a..562658678 100644 --- a/core/common/src/devmgr_service_start.c +++ b/core/common/src/devmgr_service_start.c @@ -8,6 +8,7 @@ #include "devmgr_service_start.h" #include "devhost_service_clnt.h" +#include "devmgr_pm_reg.h" #include "devmgr_service.h" #include "devsvc_manager.h" #include "devsvc_manager_clnt.h" @@ -93,6 +94,7 @@ int DeviceManagerIsQuickLoad(void) int DeviceManagerStart(void) { struct HdfIoService *ioService = NULL; + int ret; struct IDevmgrService *instance = DevmgrServiceGetInstance(); if (instance == NULL || instance->StartService == NULL) { @@ -107,7 +109,13 @@ int DeviceManagerStart(void) ioService->dispatcher = &dispatcher; ioService->target = &instance->base; } - return instance->StartService(instance); + ret = instance->StartService(instance); + if (ret != HDF_SUCCESS) { + HDF_LOGE("failed to start hdf devmgr"); + return ret; + } + + return DevMgrPmRegister(); } int DeviceManagerStartStep2() diff --git a/test/unittest/pm/pm_driver_test.c b/test/unittest/pm/pm_driver_test.c new file mode 100755 index 000000000..bc603b8c6 --- /dev/null +++ b/test/unittest/pm/pm_driver_test.c @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "devmgr_service.h" +#include "devsvc_manager_clnt.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "hdf_pm.h" +#include "osal_time.h" + +#define HDF_LOG_TAG pm_driver_test +#define PM_TEST_COUNT 4 +#define PM_WAIT_TIME 500 + +static int resumeCnt = 0; +static int suspendCnt = 0; + +int32_t HdfPmTest() +{ + struct HdfDeviceObject *pm_test_service_obj = NULL; + struct HdfDeviceObject *sample_service_obj = NULL; + + HDF_LOGI("%s enter!", __func__); + resumeCnt = 0; + suspendCnt = 0; + sample_service_obj = DevSvcManagerClntGetDeviceObject("sample_service"); + if (sample_service_obj == NULL) { + HDF_LOGE("%s sample_service DeviceObject is null!", __func__); + return HDF_FAILURE; + } + + pm_test_service_obj = DevSvcManagerClntGetDeviceObject("pm_test_service"); + if (pm_test_service_obj == NULL) { + HDF_LOGE("%s pm_test_service DeviceObject is null!", __func__); + return HDF_FAILURE; + } + + HdfPmSetMode(sample_service_obj, HDF_POWER_DYNAMIC_CTRL); + HdfPmSetMode(pm_test_service_obj, HDF_POWER_DYNAMIC_CTRL); + + HdfPmAcquireDevice(pm_test_service_obj); + HdfPmReleaseDevice(pm_test_service_obj); + HdfPmAcquireDevice(pm_test_service_obj); + HdfPmReleaseDevice(pm_test_service_obj); + HdfPmAcquireDevice(pm_test_service_obj); + HdfPmAcquireDevice(pm_test_service_obj); + HdfPmReleaseDevice(pm_test_service_obj); + HdfPmReleaseDevice(pm_test_service_obj); + + HdfPmAcquireDevice(pm_test_service_obj); + HdfPmAcquireDevice(sample_service_obj); + HdfPmReleaseDevice(pm_test_service_obj); + HdfPmReleaseDevice(sample_service_obj); + OsalMSleep(PM_WAIT_TIME); + HdfPmSetMode(sample_service_obj, HDF_POWER_SYS_CTRL); + HdfPmSetMode(pm_test_service_obj, HDF_POWER_SYS_CTRL); + HDF_LOGI("%s count:%d %d!", __func__, resumeCnt, suspendCnt); + HDF_LOGI("%s exit!", __func__); + return ((resumeCnt == PM_TEST_COUNT) && (suspendCnt == PM_TEST_COUNT)) ? HDF_SUCCESS : HDF_FAILURE; +} + +void HdfPmDriverRelease(struct HdfDeviceObject *deviceObject) +{ + (void)deviceObject; + return; +} + +int32_t PmDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + HDF_LOGI("%s enter!", __func__); + + return HdfPmTest(); +} + +int HdfPmDriverBind(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s enter", __func__); + if (deviceObject == NULL) { + return HDF_FAILURE; + } + static struct IDeviceIoService testService = { + .Dispatch = PmDriverDispatch, + .Open = NULL, + .Release = NULL, + }; + deviceObject->service = &testService; + return HDF_SUCCESS; +} + +int HdfPmDozeResume(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmDozeSuspend(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmResume(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + resumeCnt++; + return HDF_SUCCESS; +} + +int HdfPmSuspend(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + suspendCnt++; + return HDF_SUCCESS; +} + +struct PmDriverPmListener { + struct IPowerEventListener powerListener; + void *p; +}; + +int HdfPmDriverInit(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s enter!", __func__); + if (deviceObject == NULL) { + HDF_LOGE("%s ptr is null!", __func__); + return HDF_FAILURE; + } + HDF_LOGD("%s Init success", __func__); + + static struct PmDriverPmListener pmListener = {0}; + pmListener.powerListener.DozeResume = HdfPmDozeResume; + pmListener.powerListener.DozeSuspend = HdfPmDozeSuspend; + pmListener.powerListener.Resume = HdfPmResume; + pmListener.powerListener.Suspend = HdfPmSuspend; + + int ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); + HDF_LOGI("%s register power listener, ret = %d", __func__, ret); + + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_pmDriverEntry = { + .moduleVersion = 1, + .moduleName = "pm_test_driver", + .Bind = HdfPmDriverBind, + .Init = HdfPmDriverInit, + .Release = HdfPmDriverRelease, +}; + +HDF_INIT(g_pmDriverEntry); + -- Gitee From 2171fdd99fc923022f049bbc79c88236951c9e6e Mon Sep 17 00:00:00 2001 From: chenchong Date: Fri, 3 Dec 2021 16:31:13 +0800 Subject: [PATCH 236/272] =?UTF-8?q?IssueNo=EF=BC=9A#I4L0NW=20Description:?= =?UTF-8?q?=E4=BF=AE=E5=A4=8Daccel=E5=92=8Cgyro=E4=BC=A0=E6=84=9F=E5=99=A8?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=89=93=E5=BC=80=E6=97=B6=EF=BC=8C=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E4=B8=8D=E8=BF=87=E9=97=AE=E9=A2=98=E3=80=82=20Featur?= =?UTF-8?q?e=20or=20Bugfix:Bugfix=20Binary=20Source:=20NO=20Signed-off-by:?= =?UTF-8?q?=20chenchong=20=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/sensor/driver/chipset/gyro/gyro_bmi160.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/model/sensor/driver/chipset/gyro/gyro_bmi160.c b/model/sensor/driver/chipset/gyro/gyro_bmi160.c index 3b0e0faa9..7f2abdb40 100644 --- a/model/sensor/driver/chipset/gyro/gyro_bmi160.c +++ b/model/sensor/driver/chipset/gyro/gyro_bmi160.c @@ -18,7 +18,7 @@ static struct Bmi160DrvData *g_bmi160DrvData = NULL; -struct Bmi160DrvData *Bmi160GetDrvData(void) +struct Bmi160DrvData *GyroBmi160GetDrvData(void) { return g_bmi160DrvData; } @@ -149,7 +149,7 @@ static int32_t DispatchBMI160(struct HdfDeviceIoClient *client, return HDF_SUCCESS; } -int32_t Bmi160BindDriver(struct HdfDeviceObject *device) +int32_t GyroBmi160BindDriver(struct HdfDeviceObject *device) { CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); @@ -167,7 +167,7 @@ int32_t Bmi160BindDriver(struct HdfDeviceObject *device) return HDF_SUCCESS; } -int32_t Bmi160InitDriver(struct HdfDeviceObject *device) +int32_t GyroBmi160InitDriver(struct HdfDeviceObject *device) { int32_t ret; struct GyroOpsCall ops; @@ -205,7 +205,7 @@ int32_t Bmi160InitDriver(struct HdfDeviceObject *device) return HDF_SUCCESS; } -void Bmi160ReleaseDriver(struct HdfDeviceObject *device) +void GyroBmi160ReleaseDriver(struct HdfDeviceObject *device) { CHECK_NULL_PTR_RETURN(device); @@ -223,9 +223,9 @@ void Bmi160ReleaseDriver(struct HdfDeviceObject *device) struct HdfDriverEntry g_gyroBmi160DevEntry = { .moduleVersion = 1, .moduleName = "HDF_SENSOR_GYRO_BMI160", - .Bind = Bmi160BindDriver, - .Init = Bmi160InitDriver, - .Release = Bmi160ReleaseDriver, + .Bind = GyroBmi160BindDriver, + .Init = GyroBmi160InitDriver, + .Release = GyroBmi160ReleaseDriver, }; HDF_INIT(g_gyroBmi160DevEntry); -- Gitee From f499056b0bdf219f05855441bb52a12fd6de1538 Mon Sep 17 00:00:00 2001 From: yue Date: Fri, 3 Dec 2021 17:45:47 +0800 Subject: [PATCH 237/272] fix:modify the same name problem of parameter Signed-off-by: yue --- tools/hdi-gen/ast/ast_interface_type.cpp | 7 +- .../c_client_interface_code_emitter.cpp | 159 ------------ .../codegen/c_client_interface_code_emitter.h | 43 ---- .../codegen/c_client_proxy_code_emitter.cpp | 38 +-- .../codegen/c_client_proxy_code_emitter.h | 5 +- .../c_service_interface_code_emitter.cpp | 157 ------------ .../c_service_interface_code_emitter.h | 47 ---- .../codegen/c_service_stub_code_emitter.cpp | 10 +- .../cpp_client_interface_code_emitter.cpp | 227 ------------------ .../cpp_client_interface_code_emitter.h | 57 ----- .../codegen/cpp_client_proxy_code_emitter.cpp | 17 +- .../cpp_service_interface_code_emitter.cpp | 215 ----------------- .../cpp_service_interface_code_emitter.h | 57 ----- .../codegen/cpp_service_stub_code_emitter.cpp | 19 +- 14 files changed, 57 insertions(+), 1001 deletions(-) delete mode 100755 tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp delete mode 100755 tools/hdi-gen/codegen/c_client_interface_code_emitter.h delete mode 100755 tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp delete mode 100755 tools/hdi-gen/codegen/c_service_interface_code_emitter.h delete mode 100755 tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h delete mode 100755 tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp delete mode 100755 tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index b093998e9..85b023ed9 100755 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -132,7 +132,8 @@ String ASTInterfaceType::EmitJavaType(TypeMode mode, bool isInnerType) const void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& name, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { - sb.Append(prefix).AppendFormat("if (HdfSBufWriteRemoteService(data, %s->remote) != 0) {\n", name.string()); + sb.Append(prefix).AppendFormat("if (HdfSBufWriteRemoteService(%s, %s->remote) != 0) {\n", + parcelName.string(), name.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: write %s failed!\", __func__);\n", name.string()); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_INVALID_PARAM;\n"); @@ -146,8 +147,8 @@ void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& String remoteName = String::Format("%sRemote", name.string()); String miName = name_.StartsWith("I") ? name_.Substring(1) : name_; - sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSBufReadRemoteService(data);\n", - remoteName.string()); + sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSBufReadRemoteService(%s);\n", + remoteName.string(), parcelName.string()); sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string()); diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp deleted file mode 100755 index 7c5a628ca..000000000 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/c_client_interface_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) -{ - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else { - return false; - } - - if (!File::CreateParentDir(directory_)) { - Logger::E("CClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); - return false; - } - - return true; -} - -void CClientInterfaceCodeEmitter::EmitCode() -{ - EmitInterfaceHeaderFile(); -} - -void CClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() -{ - String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - File file(filePath, File::WRITE); - StringBuilder sb; - - EmitLicense(sb); - EmitHeadMacro(sb, interfaceFullName_); - sb.Append("\n"); - EmitImportInclusions(sb); - sb.Append("\n"); - EmitHeadExternC(sb); - sb.Append("\n"); - EmitForwardDecls(sb); - sb.Append("\n"); - EmitInterfaceMethodCommands(sb); - sb.Append("\n"); - EmitInterfaceDecl(sb); - sb.Append("\n"); - EmitTailExternC(sb); - sb.Append("\n"); - EmitTailMacro(sb, interfaceFullName_); - - String data = sb.ToString(); - file.WriteData(data.string(), data.GetLength()); - file.Flush(); - file.Close(); -} - -void CClientInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - - String fileName; - if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK && importAst->GetInterfaceDef() != nullptr) { - String ifaceName = importAst->GetInterfaceDef()->GetName(); - String name = ifaceName.StartsWith("I") ? ifaceName.Substring(1) : ifaceName; - String stubName = name + "Stub"; - fileName = FileName(importAst->GetInterfaceDef()->GetNamespace()->ToString() + stubName); - } else { - fileName = FileName(importAst->GetFullName()); - } - sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string()); - } -} - -void CClientInterfaceCodeEmitter::EmitForwardDecls(StringBuilder& sb) -{ - if (isKernelCode_) { - sb.Append("struct HdfIoService;\n"); - } else { - sb.Append("struct HdfRemoteService;\n"); - } -} - -void CClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) -{ - sb.AppendFormat("struct %s {\n", interfaceName_.string()); - - if (isKernelCode_) { - sb.Append(g_tab).Append("struct HdfIoService *serv;\n"); - } else { - sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); - } - - sb.Append("\n"); - EmitInterfaceMethodsDecl(sb, g_tab); - sb.Append("};\n"); - if (!isCallbackInterface()) { - sb.Append("\n"); - EmitInterfaceInstanceMethod(sb); - } -} - -void CClientInterfaceCodeEmitter::EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix) -{ - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { - AutoPtr method = interface_->GetMethod(i); - EmitInterfaceMethodDecl(method, sb, prefix); - if (i + 1 < interface_->GetMethodNumber()) { - sb.Append("\n"); - } - } -} - -void CClientInterfaceCodeEmitter::EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - if (method->GetParameterNumber() == 0) { - sb.Append(prefix).AppendFormat("int32_t (*%s)(struct %s *self);\n", - method->GetName().string(), interfaceName_.string()); - } else { - StringBuilder paramStr; - paramStr.Append(prefix).AppendFormat("int32_t (*%s)(", method->GetName().string()); - paramStr.AppendFormat("struct %s *self, ", interfaceName_.string()); - - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitInterfaceMethodParameter(param, paramStr, ""); - if (i + 1 < method->GetParameterNumber()) { - paramStr.Append(", "); - } - } - - paramStr.Append(");"); - sb.Append(SpecificationParam(paramStr, prefix + g_tab)); - sb.Append("\n"); - } -} - -void CClientInterfaceCodeEmitter::EmitInterfaceInstanceMethod(StringBuilder& sb) -{ - sb.AppendFormat("struct %s *Hdi%sGet();\n", interfaceName_.string(), infName_.string()); - sb.Append("\n"); - sb.AppendFormat("void Hdi%sRelease(struct %s *instance);\n", infName_.string(), interfaceName_.string()); -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h b/tools/hdi-gen/codegen/c_client_interface_code_emitter.h deleted file mode 100755 index 4a17f93f3..000000000 --- a/tools/hdi-gen/codegen/c_client_interface_code_emitter.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H -#define OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H - -#include "codegen/c_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CClientInterfaceCodeEmitter : public CCodeEmitter { -public: - CClientInterfaceCodeEmitter() : CCodeEmitter() {} - - virtual ~CClientInterfaceCodeEmitter() = default; -private: - bool ResolveDirectory(const String& targetDirectory) override; - - void EmitCode() override; - - void EmitInterfaceHeaderFile(); - - void EmitImportInclusions(StringBuilder& sb); - - void EmitForwardDecls(StringBuilder& sb); - - void EmitInterfaceDecl(StringBuilder& sb); - - void EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix); - - void EmitInterfaceInstanceMethod(StringBuilder& sb); -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_C_CLIENT_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index b28d9ca25..d281390a7 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -195,6 +195,8 @@ void CClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& meth void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix) { + String dataName = "data_"; + String replyName = "reply_"; sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); @@ -212,20 +214,20 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth } sb.Append("\n"); - EmitCreateBuf(sb, prefix + g_tab); + EmitCreateBuf(dataName, replyName, sb, prefix + g_tab); sb.Append("\n"); String gotoName = GetGotLabel(method); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - param->EmitCWriteVar("data", gotoName, sb, prefix + g_tab); + param->EmitCWriteVar(dataName, gotoName, sb, prefix + g_tab); sb.Append("\n"); } } - sb.Append(prefix + g_tab).AppendFormat("ec = %sCall(self, CMD_%s, data, reply);\n", - proxyName_.string(), ConstantName(method->GetName()).string()); + sb.Append(prefix + g_tab).AppendFormat("ec = %sCall(self, CMD_%s, %s, %s);\n", + proxyName_.string(), ConstantName(method->GetName()).string(), dataName.string(), replyName.string()); sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); sb.Append(prefix + g_tab + g_tab).Append( "HDF_LOGE(\"%{public}s: call failed! error code is %{public}d\", __func__, ec);\n"); @@ -236,44 +238,46 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadProxyMethodParameter(param, "reply", gotoName, sb, prefix + g_tab); + EmitReadProxyMethodParameter(param, replyName, gotoName, sb, prefix + g_tab); sb.Append("\n"); } } EmitErrorHandle(method, "errors", true, sb, prefix); sb.Append(prefix).Append("finished:\n"); - EmitReleaseBuf(sb, prefix + g_tab); + EmitReleaseBuf(dataName, replyName, sb, prefix + g_tab); sb.Append(prefix + g_tab).Append("return ec;\n"); sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitCreateBuf(StringBuilder& sb, const String& prefix) +void CClientProxyCodeEmitter::EmitCreateBuf(const String& dataBufName, const String& replyBufName, + StringBuilder& sb, const String& prefix) { if (isKernelCode_) { - sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufObtainDefaultSize();\n"); - sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufObtainDefaultSize();\n"); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufObtainDefaultSize();\n", dataBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufObtainDefaultSize();\n", replyBufName.string()); } else { - sb.Append(prefix).Append("struct HdfSBuf *data = HdfSBufTypedObtain(SBUF_IPC);\n"); - sb.Append(prefix).Append("struct HdfSBuf *reply = HdfSBufTypedObtain(SBUF_IPC);\n"); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufTypedObtain(SBUF_IPC);\n", dataBufName.string()); + sb.Append(prefix).AppendFormat("struct HdfSBuf *%s = HdfSBufTypedObtain(SBUF_IPC);\n", replyBufName.string()); } sb.Append("\n"); - sb.Append(prefix).Append("if (data == NULL || reply == NULL) {\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL || %s == NULL) {\n", dataBufName.string(), replyBufName.string()); sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HdfSubf malloc failed!\", __func__);\n"); sb.Append(prefix + g_tab).Append("ec = HDF_ERR_MALLOC_FAIL;\n"); sb.Append(prefix + g_tab).Append("goto finished;\n"); sb.Append(prefix).Append("}\n"); } -void CClientProxyCodeEmitter::EmitReleaseBuf(StringBuilder& sb, const String& prefix) +void CClientProxyCodeEmitter::EmitReleaseBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, + const String& prefix) { - sb.Append(prefix).Append("if (data != NULL) {\n"); - sb.Append(prefix + g_tab).Append("HdfSBufRecycle(data);\n"); + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", dataBufName.string()); + sb.Append(prefix + g_tab).AppendFormat("HdfSBufRecycle(%s);\n", dataBufName.string()); sb.Append(prefix).Append("}\n"); - sb.Append(prefix).Append("if (reply != NULL) {\n"); - sb.Append(prefix + g_tab).Append("HdfSBufRecycle(reply);\n"); + sb.Append(prefix).AppendFormat("if (%s != NULL) {\n", replyBufName.string()); + sb.Append(prefix + g_tab).AppendFormat("HdfSBufRecycle(%s);\n", replyBufName.string()); sb.Append(prefix).Append("}\n"); } diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 83daa85a4..1b97e442d 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -39,9 +39,10 @@ private: void EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix); - void EmitCreateBuf(StringBuilder& sb, const String& prefix); + void EmitCreateBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, const String& prefix); - void EmitReleaseBuf(StringBuilder& sb, const String& prefix); + void EmitReleaseBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, + const String& prefix); void EmitReadProxyMethodParameter(const AutoPtr& param, const String& parcelName, const String& gotoLabel, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp deleted file mode 100755 index 7ee75d035..000000000 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/c_service_interface_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) -{ - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else { - return false; - } - - if (!File::CreateParentDir(directory_)) { - Logger::E("CServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); - return false; - } - - return true; -} - -void CServiceInterfaceCodeEmitter::EmitCode() -{ - if (!isCallbackInterface()) { - EmitInterfaceHeadrFile(); - } -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceHeadrFile() -{ - String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - File file(filePath, File::WRITE); - StringBuilder sb; - - EmitLicense(sb); - EmitHeadMacro(sb, interfaceFullName_); - sb.Append("\n"); - EmitImportInclusions(sb); - sb.Append("\n"); - EmitInterfaceDataDecls(sb); - sb.Append("\n"); - EmitInterfaceMethodCommands(sb); - sb.Append("\n"); - EmitInterfaceDefinition(sb); - sb.Append("\n"); - EmitTailMacro(sb, interfaceFullName_); - - String data = sb.ToString(); - file.WriteData(data.string(), data.GetLength()); - file.Flush(); - file.Close(); -} - -void CServiceInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - - String fileName; - if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK && importAst->GetInterfaceDef() != nullptr) { - String ifaceName = importAst->GetInterfaceDef()->GetName(); - String name = ifaceName.StartsWith("I") ? ifaceName.Substring(1) : ifaceName; - String stubName = name + "Proxy"; - fileName = FileName(importAst->GetInterfaceDef()->GetNamespace()->ToString() + stubName); - } else { - fileName = FileName(importAst->GetFullName()); - } - sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string()); - } -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceDataDecls(StringBuilder& sb) -{ - sb.Append("struct HdfSBuf;\n"); - sb.Append("struct HdfDeviceObject;\n"); - sb.Append("struct HdfDeviceIoClient;\n"); -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) -{ - sb.AppendFormat("struct %s {\n", interfaceName_.string()); - EmitInterfaceMethods(sb, g_tab); - sb.Append("};\n\n"); - EmitInterfaceInstanceMethodDecl(sb); - sb.Append("\n"); - EmitInterfaceReleaseMethodDecl(sb); - sb.Append("\n"); - EmitInterfaceRequestMethodDecl(sb); -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const String& prefix) -{ - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { - AutoPtr method = interface_->GetMethod(i); - EmitInterfaceMethod(method, sb, prefix); - if (i + 1 < interface_->GetMethodNumber()) { - sb.Append("\n"); - } - } -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - if (method->GetParameterNumber() == 0) { - sb.Append(prefix).AppendFormat("int32_t (*%s)(struct %s *self);\n", - method->GetName().string(), interfaceName_.string()); - } else { - StringBuilder paramStr; - paramStr.Append(prefix).AppendFormat("int32_t (*%s)(struct %s *self, ", - method->GetName().string(), interfaceName_.string()); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitInterfaceMethodParameter(param, paramStr, ""); - if (i + 1 < method->GetParameterNumber()) { - paramStr.Append(", "); - } - } - - paramStr.Append(");"); - sb.Append(SpecificationParam(paramStr, prefix + g_tab)); - sb.Append("\n"); - } -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceInstanceMethodDecl(StringBuilder& sb) -{ - sb.AppendFormat("struct %s *Hdi%sInstance(void);\n", interfaceName_.string(), infName_.string()); -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& sb) -{ - sb.AppendFormat("void Hdi%sRelease(struct %s *instance);\n", - infName_.string(), interfaceName_.string()); -} - -void CServiceInterfaceCodeEmitter::EmitInterfaceRequestMethodDecl(StringBuilder& sb) -{ - sb.AppendFormat("int32_t %sServiceOnRemoteRequest(void *service, int cmdId,\n", infName_.string()); - sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply);\n"); -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h b/tools/hdi-gen/codegen/c_service_interface_code_emitter.h deleted file mode 100755 index 02f5db789..000000000 --- a/tools/hdi-gen/codegen/c_service_interface_code_emitter.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_C_SERVICE_INTERFACE_CODEE_MITTER_H -#define OHOS_HDI_C_SERVICE_INTERFACE_CODEE_MITTER_H - -#include "codegen/c_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CServiceInterfaceCodeEmitter : public CCodeEmitter { -public: - CServiceInterfaceCodeEmitter() : CCodeEmitter() {} - - virtual ~CServiceInterfaceCodeEmitter() = default; -private: - bool ResolveDirectory(const String& targetDirectory) override; - - void EmitCode() override; - - void EmitInterfaceHeadrFile(); - - void EmitImportInclusions(StringBuilder& sb); - - void EmitInterfaceDataDecls(StringBuilder& sb); - - void EmitInterfaceDefinition(StringBuilder& sb); - - void EmitInterfaceMethods(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); - - void EmitInterfaceInstanceMethodDecl(StringBuilder& sb); - - void EmitInterfaceReleaseMethodDecl(StringBuilder& sb); - - void EmitInterfaceRequestMethodDecl(StringBuilder& sb); -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_C_SERVICE_INTERFACE_CODEE_MITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index 9ecd7f520..d6e883c8a 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -209,9 +209,11 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpls(StringBuilder& sb, cons void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { + String dataName = "data_"; + String replyName = "reply_"; sb.Append(prefix).AppendFormat( - "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *data, struct HdfSBuf *reply)\n", - method->GetName().string(), interfaceName_.string()); + "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *%s, struct HdfSBuf *%s)\n", + method->GetName().string(), interfaceName_.string(), dataName.string(), replyName.string()); sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).Append("int32_t ec = HDF_FAILURE;\n"); @@ -239,7 +241,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadStubMethodParameter(param, "data", sb, prefix + g_tab); + EmitReadStubMethodParameter(param, dataName, sb, prefix + g_tab); sb.Append("\n"); } } @@ -251,7 +253,7 @@ void CServiceStubCodeEmitter::EmitServiceStubMethodImpl(const AutoPtr for (int i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - param->EmitCWriteVar("reply", gotoName, sb, prefix + g_tab); + param->EmitCWriteVar(replyName, gotoName, sb, prefix + g_tab); sb.Append("\n"); } } diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp deleted file mode 100755 index 6a85a0d22..000000000 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/cpp_client_interface_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CppClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) -{ - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/client/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else { - return false; - } - - if (!File::CreateParentDir(directory_)) { - Logger::E("CppClientInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); - return false; - } - - return true; -} - -void CppClientInterfaceCodeEmitter::EmitCode() -{ - EmitInterfaceHeaderFile(); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceHeaderFile() -{ - String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - File file(filePath, File::WRITE); - StringBuilder sb; - - EmitLicense(sb); - EmitClientInfHeadMacro(sb); - sb.Append("\n"); - EmitInterfaceInclusions(sb); - sb.Append("\n"); - EmitBeginNamespace(sb); - sb.Append("\n"); - EmitUsingNamespace(sb); - sb.Append("\n"); - EmitInterfaceMethodCommands(sb, ""); - sb.Append("\n"); - EmitInterfaceDecl(sb); - sb.Append("\n"); - EmitEndNamespace(sb); - sb.Append("\n"); - EmitClientInfTailMacro(sb); - - String data = sb.ToString(); - file.WriteData(data.string(), data.GetLength()); - file.Flush(); - file.Close(); -} - -void CppClientInterfaceCodeEmitter::EmitClientInfHeadMacro(StringBuilder& sb) -{ - String clientMacroName(interfaceFullName_); - if (!isCallbackInterface()) { - clientMacroName += ".client"; - } - EmitHeadMacro(sb, clientMacroName); -} - -void CppClientInterfaceCodeEmitter::EmitClientInfTailMacro(StringBuilder& sb) -{ - String clientMacroName(interfaceFullName_); - if (!isCallbackInterface()) { - clientMacroName += ".client"; - } - EmitTailMacro(sb, clientMacroName); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb) -{ - EmitInterfaceStdlibInclusions(sb); - EmitInterfaceDBinderInclusions(sb); - EmitInterfaceSelfDefinedTypeInclusions(sb); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb) -{ - bool includeString = false; - bool includeList = false; - bool includeMap = false; - - const AST::TypeStringMap& types = ast_->GetTypes(); - for (const auto& pair : types) { - AutoPtr type = pair.second; - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - if (!includeString) { - sb.Append("#include \n"); - includeString = true; - } - break; - } - case TypeKind::TYPE_ARRAY: - case TypeKind::TYPE_LIST: { - if (!includeList) { - sb.Append("#include \n"); - includeList = true; - } - break; - } - case TypeKind::TYPE_MAP: { - if (!includeMap) { - sb.Append("#include \n"); - includeMap = true; - } - break; - } - default: - break; - } - } -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb) -{ - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - - String fileName; - if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK && importAst->GetInterfaceDef() != nullptr) { - String ifaceName = importAst->GetInterfaceDef()->GetName(); - String name = ifaceName.StartsWith("I") ? ifaceName.Substring(1) : ifaceName; - String stubName = name + "Service"; - fileName = FileName(importAst->GetInterfaceDef()->GetNamespace()->ToString() + stubName); - } else { - fileName = FileName(importAst->GetFullName()); - } - sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string()); - } -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) -{ - sb.AppendFormat("class %s : public IRemoteBroker {\n", interface_->GetName().string()); - sb.Append("public:\n"); - EmitInterfaceBody(sb, g_tab); - sb.Append("};\n\n"); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix) -{ - sb.Append(g_tab).AppendFormat("DECLARE_INTERFACE_DESCRIPTOR(u\"%s\");\n", interfaceFullName_.string()); - sb.Append("\n"); - EmitInterfaceDestruction(sb, g_tab); - sb.Append("\n"); - if (!isCallbackInterface()) { - EmitInterfaceGetMethodDecl(sb, g_tab); - sb.Append("\n"); - } - EmitInterfaceMethodsDecl(sb, g_tab); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceDestruction(StringBuilder& sb, const String& prefix) -{ - sb.Append(prefix).AppendFormat("virtual ~%s() = default;\n", interface_->GetName().string()); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceGetMethodDecl(StringBuilder& sb, const String& prefix) -{ - sb.Append(prefix).AppendFormat("static sptr<%s> Get();\n", interface_->GetName().string()); -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix) -{ - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { - AutoPtr method = interface_->GetMethod(i); - EmitInterfaceMethodDecl(method, sb, prefix); - if (i + 1 < interface_->GetMethodNumber()) { - sb.Append("\n"); - } - } -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - if (method->GetParameterNumber() == 0) { - sb.Append(prefix).AppendFormat("virtual int32_t %s() = 0;\n", method->GetName().string()); - } else { - StringBuilder paramStr; - paramStr.Append(prefix).AppendFormat("virtual int32_t %s(", method->GetName().string()); - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitInterfaceMethodParameter(param, paramStr, ""); - if (i + 1 < method->GetParameterNumber()) { - paramStr.Append(", "); - } - } - - paramStr.Append(") = 0;"); - sb.Append(SpecificationParam(paramStr, prefix + g_tab)); - sb.Append("\n"); - } -} - -void CppClientInterfaceCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, - const String& prefix) -{ - sb.Append(prefix).Append(param->EmitCppParameter()); -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h deleted file mode 100755 index a573ff3af..000000000 --- a/tools/hdi-gen/codegen/cpp_client_interface_code_emitter.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_CPP_CLIENT_INTERFACE_CODE_EMITTER_H -#define OHOS_HDI_CPP_CLIENT_INTERFACE_CODE_EMITTER_H - -#include "codegen/cpp_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CppClientInterfaceCodeEmitter : public CppCodeEmitter { -public: - CppClientInterfaceCodeEmitter() : CppCodeEmitter() {} - - virtual ~CppClientInterfaceCodeEmitter() = default; -private: - bool ResolveDirectory(const String& targetDirectory) override; - - void EmitCode() override; - - void EmitInterfaceHeaderFile(); - - void EmitClientInfHeadMacro(StringBuilder& sb); - - void EmitClientInfTailMacro(StringBuilder& sb); - - void EmitInterfaceInclusions(StringBuilder& sb); - - void EmitInterfaceStdlibInclusions(StringBuilder& sb); - - void EmitInterfaceDBinderInclusions(StringBuilder& sb); - - void EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb); - - void EmitInterfaceDecl(StringBuilder& sb); - - void EmitInterfaceBody(StringBuilder& sb, const String& prefix); - - void EmitInterfaceDestruction(StringBuilder& sb, const String& prefix); - - void EmitInterfaceGetMethodDecl(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethodsDecl(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix); -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_CPP_CLIENT_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index e73a21ea6..6c5059ff0 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -258,24 +258,27 @@ void CppClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr& me void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& method, StringBuilder& sb, const String& prefix) { + String dataName = "data_"; + String replyName = "reply_"; + String optionName = "option_"; sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).Append("MessageParcel data;\n"); - sb.Append(prefix + g_tab).Append("MessageParcel reply;\n"); - sb.Append(prefix + g_tab).Append("MessageOption option(MessageOption::TF_SYNC);\n"); + sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", dataName.string()); + sb.Append(prefix + g_tab).AppendFormat("MessageParcel %s;\n", replyName.string()); + sb.Append(prefix + g_tab).AppendFormat("MessageOption %s(MessageOption::TF_SYNC);\n", optionName.string()); sb.Append("\n"); if (method->GetParameterNumber() > 0) { for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitWriteMethodParameter(param, "data", sb, prefix + g_tab); + EmitWriteMethodParameter(param, dataName, sb, prefix + g_tab); } } sb.Append("\n"); } - sb.Append(prefix + g_tab).AppendFormat("int32_t ec = Remote()->SendRequest(CMD_%s, data, reply, option);\n", - ConstantName(method->GetName()).string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t ec = Remote()->SendRequest(CMD_%s, %s, %s, %s);\n", + ConstantName(method->GetName()).string(), dataName.string(), replyName.string(), optionName.string()); sb.Append(prefix + g_tab).Append("if (ec != HDF_SUCCESS) {\n"); sb.Append(prefix + g_tab + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s failed, error code is %%{public}d\", __func__, ec);\n", method->GetName().string()); @@ -287,7 +290,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& me for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitReadMethodParameter(param, "reply", false, sb, prefix + g_tab); + EmitReadMethodParameter(param, replyName, false, sb, prefix + g_tab); sb.Append("\n"); } } diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp deleted file mode 100755 index 5081476d2..000000000 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "codegen/cpp_service_interface_code_emitter.h" -#include "util/file.h" -#include "util/logger.h" - -namespace OHOS { -namespace HDI { -bool CppServiceInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory) -{ - if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) { - directory_ = File::AdapterPath(String::Format("%s/%s/server/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) { - directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(), - FileName(ast_->GetPackageName()).string())); - } else { - return false; - } - - if (!File::CreateParentDir(directory_)) { - Logger::E("CppServiceInterfaceCodeEmitter", "Create '%s' failed!", directory_.string()); - return false; - } - - return true; -} - -void CppServiceInterfaceCodeEmitter::EmitCode() -{ - if (!isCallbackInterface()) { - EmitInterfaceHeaderFile(); - } -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceHeaderFile() -{ - String filePath = String::Format("%s%s.h", directory_.string(), FileName(interfaceName_).string()); - File file(filePath, File::WRITE); - StringBuilder sb; - - EmitLicense(sb); - EmitServiceInfHeadMacro(sb); - sb.Append("\n"); - EmitInterfaceInclusions(sb); - sb.Append("\n"); - EmitBeginNamespace(sb); - sb.Append("\n"); - EmitUsingNamespace(sb); - sb.Append("\n"); - EmitInterfaceDecl(sb); - sb.Append("\n"); - EmitEndNamespace(sb); - sb.Append("\n"); - EmitServiceInfTailMacro(sb); - - String data = sb.ToString(); - file.WriteData(data.string(), data.GetLength()); - file.Flush(); - file.Close(); -} - -void CppServiceInterfaceCodeEmitter::EmitServiceInfHeadMacro(StringBuilder& sb) -{ - String serviceMacroName(interfaceFullName_); - if (!isCallbackInterface()) { - serviceMacroName += ".service"; - } - EmitHeadMacro(sb, serviceMacroName); -} - -void CppServiceInterfaceCodeEmitter::EmitServiceInfTailMacro(StringBuilder& sb) -{ - String serviceMacroName(interfaceFullName_); - if (!isCallbackInterface()) { - serviceMacroName += ".service"; - } - EmitTailMacro(sb, serviceMacroName); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb) -{ - EmitInterfaceStdlibInclusions(sb); - EmitInterfaceDBinderInclusions(sb); - EmitInterfaceSelfDefinedTypeInclusions(sb); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb) -{ - bool includeString = false; - bool includeList = false; - bool includeMap = false; - - const AST::TypeStringMap& types = ast_->GetTypes(); - for (const auto& pair : types) { - AutoPtr type = pair.second; - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - if (!includeString) { - sb.Append("#include \n"); - includeString = true; - } - break; - } - case TypeKind::TYPE_ARRAY: - case TypeKind::TYPE_LIST: { - if (!includeList) { - sb.Append("#include \n"); - includeList = true; - } - break; - } - case TypeKind::TYPE_MAP: { - if (!includeMap) { - sb.Append("#include \n"); - includeMap = true; - } - break; - } - default: - break; - } - } -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb) -{ - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - - String fileName; - if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK && importAst->GetInterfaceDef() != nullptr) { - String ifaceName = importAst->GetInterfaceDef()->GetName(); - String name = ifaceName.StartsWith("I") ? ifaceName.Substring(1) : ifaceName; - String stubName = name + "Proxy"; - fileName = FileName(importAst->GetInterfaceDef()->GetNamespace()->ToString() + stubName); - } else { - fileName = FileName(importAst->GetFullName()); - } - sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string()); - } -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceDecl(StringBuilder& sb) -{ - EmitInterfaceMethodCommands(sb, ""); - sb.Append("\n"); - - sb.AppendFormat("class %s {\n", interface_->GetName().string()); - sb.Append("public:\n"); - EmitInterfaceBody(sb, g_tab); - sb.Append("};\n"); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceBody(StringBuilder& sb, const String& prefix) -{ - EmitInterfaceDestruction(sb, g_tab); - sb.Append("\n"); - EmitInterfaceMethods(sb, g_tab); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceDestruction(StringBuilder& sb, const String& prefix) -{ - sb.Append(prefix).AppendFormat("virtual ~%s() {}\n", interface_->GetName().string()); -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceMethods(StringBuilder& sb, const String& prefix) -{ - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { - AutoPtr method = interface_->GetMethod(i); - EmitInterfaceMethod(method, sb, prefix); - if (i + 1 < interface_->GetMethodNumber()) { - sb.Append("\n"); - } - } -} - -void CppServiceInterfaceCodeEmitter::EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, - const String& prefix) -{ - if (method->GetParameterNumber() == 0) { - sb.Append(prefix).AppendFormat("virtual int32_t %s() = 0;\n", method->GetName().string()); - } else { - StringBuilder paramStr; - paramStr.Append(prefix).AppendFormat("virtual int32_t %s(", method->GetName().string()); - - for (size_t i = 0; i < method->GetParameterNumber(); i++) { - AutoPtr param = method->GetParameter(i); - EmitInterfaceMethodParameter(param, paramStr, ""); - if (i + 1 < method->GetParameterNumber()) { - paramStr.Append(", "); - } - } - - paramStr.Append(") = 0;"); - - sb.Append(SpecificationParam(paramStr, prefix + g_tab)); - sb.Append("\n"); - } -} -} // namespace HDI -} // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h deleted file mode 100755 index 8a6d8c2ef..000000000 --- a/tools/hdi-gen/codegen/cpp_service_interface_code_emitter.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef OHOS_HDI_CPP_SERVICE_INTERFACE_CODE_EMITTER_H -#define OHOS_HDI_CPP_SERVICE_INTERFACE_CODE_EMITTER_H - -#include "codegen/cpp_code_emitter.h" - -namespace OHOS { -namespace HDI { -class CppServiceInterfaceCodeEmitter : public CppCodeEmitter { -public: - CppServiceInterfaceCodeEmitter() : CppCodeEmitter() {} - - virtual ~CppServiceInterfaceCodeEmitter() = default; -private: - bool ResolveDirectory(const String& targetDirectory) override; - - void EmitCode() override; - - void EmitInterfaceHeaderFile(); - - void EmitServiceInfHeadMacro(StringBuilder& sb); - - void EmitServiceInfTailMacro(StringBuilder& sb); - - void EmitInterfaceInclusions(StringBuilder& sb); - - void EmitInterfaceStdlibInclusions(StringBuilder& sb); - - void EmitInterfaceDBinderInclusions(StringBuilder& sb); - - void EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb); - - void EmitInterfaceUsings(StringBuilder& sb); - - void EmitInterfaceSelfDefinedTypeUsings(StringBuilder& sb); - - void EmitInterfaceDecl(StringBuilder& sb); - - void EmitInterfaceBody(StringBuilder& sb, const String& prefix); - - void EmitInterfaceDestruction(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethods(StringBuilder& sb, const String& prefix); - - void EmitInterfaceMethod(const AutoPtr& method, StringBuilder& sb, const String& prefix); -}; -} // namespace HDI -} // namespace OHOS - -#endif // OHOS_HDI_CPP_SERVICE_INTERFACE_CODE_EMITTER_H \ No newline at end of file diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index 26a229853..040705f83 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -161,8 +161,11 @@ void CppServiceStubCodeEmitter::EmitStubMethodDecls(StringBuilder& sb, const Str void CppServiceStubCodeEmitter::EmitStubMethodDecl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { - sb.Append(prefix).AppendFormat("int32_t %s%s(MessageParcel& data, MessageParcel& reply, MessageOption& option);\n", - stubName_.string(), method->GetName().string()); + String dataName = "data_"; + String replyName = "reply_"; + String optionName = "option_"; + sb.Append(prefix).AppendFormat("int32_t %s%s(MessageParcel& %s, MessageParcel& %s, MessageOption& %s);\n", + stubName_.string(), method->GetName().string(), dataName.string(), replyName.string(), optionName.string()); } void CppServiceStubCodeEmitter::EmitStubOnRequestMethodDecl(StringBuilder& sb, const String& prefix) @@ -292,15 +295,19 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpls(StringBuilder& sb, const Str void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix) { + String dataName = "data_"; + String replyName = "reply_"; + String optionName = "option_"; sb.Append(prefix).AppendFormat( - "int32_t %s::%s%s(MessageParcel& data, MessageParcel& reply, MessageOption& option)\n", - stubName_.string(), stubName_.string(), method->GetName().string()); + "int32_t %s::%s%s(MessageParcel& %s, MessageParcel& %s, MessageOption& %s)\n", + stubName_.string(), stubName_.string(), method->GetName().string(), + dataName.string(), replyName.string(), optionName.string()); sb.Append(prefix).Append("{\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { - EmitReadMethodParameter(param, "data", true, sb, prefix + g_tab); + EmitReadMethodParameter(param, dataName, true, sb, prefix + g_tab); sb.Append("\n"); } else { EmitLocalVariable(param, sb, prefix + g_tab); @@ -315,7 +322,7 @@ void CppServiceStubCodeEmitter::EmitStubMethodImpl(const AutoPtr& met for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_OUT) { - EmitWriteMethodParameter(param, "reply", sb, prefix + g_tab); + EmitWriteMethodParameter(param, replyName, sb, prefix + g_tab); sb.Append("\n"); } } -- Gitee From dba991acc39f8c9fa9c6497c67cb1671cb119cfd Mon Sep 17 00:00:00 2001 From: zhang Date: Sat, 4 Dec 2021 10:48:21 +0800 Subject: [PATCH 238/272] feat: add the function of hdf power manager to linux and liteos-a Signed-off-by: zhang --- core/common/include/manager/devmgr_pm_reg.h | 2 +- test/unittest/pm/pm_driver_test.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/common/include/manager/devmgr_pm_reg.h b/core/common/include/manager/devmgr_pm_reg.h index 839fa3625..cdc8036f0 100755 --- a/core/common/include/manager/devmgr_pm_reg.h +++ b/core/common/include/manager/devmgr_pm_reg.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. diff --git a/test/unittest/pm/pm_driver_test.c b/test/unittest/pm/pm_driver_test.c index bc603b8c6..84580fdce 100755 --- a/test/unittest/pm/pm_driver_test.c +++ b/test/unittest/pm/pm_driver_test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Copyright (c) 2021 Huawei Device Co., Ltd. * * HDF is dual licensed: you can use it either under the terms of * the GPL, or the BSD license, at your option. -- Gitee From cdb449d14948b9a0c999c7b95dad3dac7a672875 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 6 Dec 2021 15:47:40 +0800 Subject: [PATCH 239/272] feat: add gravity drive v10 Signed-off-by: YOUR_NAME --- .../sensor/driver/accel/sensor_accel_driver.c | 28 +- .../sensor/driver/accel/sensor_accel_driver.h | 7 +- .../driver/accel/sensor_gravity_driver.c | 335 ++++++++++++++++++ .../driver/accel/sensor_gravity_driver.h | 44 +++ .../driver/chipset/accel/accel_bmi160.c | 31 +- .../driver/chipset/accel/accel_bmi160.h | 3 +- 6 files changed, 426 insertions(+), 22 deletions(-) mode change 100644 => 100755 model/sensor/driver/accel/sensor_accel_driver.c mode change 100644 => 100755 model/sensor/driver/accel/sensor_accel_driver.h create mode 100755 model/sensor/driver/accel/sensor_gravity_driver.c create mode 100755 model/sensor/driver/accel/sensor_gravity_driver.h mode change 100644 => 100755 model/sensor/driver/chipset/accel/accel_bmi160.c mode change 100644 => 100755 model/sensor/driver/chipset/accel/accel_bmi160.h diff --git a/model/sensor/driver/accel/sensor_accel_driver.c b/model/sensor/driver/accel/sensor_accel_driver.c old mode 100644 new mode 100755 index f967792d7..e63650487 --- a/model/sensor/driver/accel/sensor_accel_driver.c +++ b/model/sensor/driver/accel/sensor_accel_driver.c @@ -29,6 +29,19 @@ static struct AccelDrvData *AccelGetDrvData(void) static struct SensorRegCfgGroupNode *g_regCfgGroup[SENSOR_GROUP_MAX] = { NULL }; +int32_t SubscribeAccelDataCallbackFunc(GravitySubscribeAccelCallback cb) +{ + CHECK_NULL_PTR_RETURN_VALUE(cb, HDF_ERR_INVALID_PARAM); + + struct AccelDrvData *drvData = AccelGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + drvData->cb = cb; + + return HDF_SUCCESS; +} + int32_t AccelRegisterChipOps(const struct AccelOpsCall *ops) { struct AccelDrvData *drvData = AccelGetDrvData(); @@ -44,6 +57,7 @@ int32_t AccelRegisterChipOps(const struct AccelOpsCall *ops) static void AccelDataWorkEntry(void *arg) { struct AccelDrvData *drvData = NULL; + struct SensorReportEvent event; drvData = (struct AccelDrvData *)arg; CHECK_NULL_PTR_RETURN(drvData); @@ -52,8 +66,19 @@ static void AccelDataWorkEntry(void *arg) HDF_LOGI("%s: Accel ReadData function NULl", __func__); return; } - if (drvData->ops.ReadData(drvData->accelCfg) != HDF_SUCCESS) { + + if (drvData->ops.ReadData(drvData->accelCfg, &event) != HDF_SUCCESS) { HDF_LOGE("%s: Accel read data failed", __func__); + return; + } + + if (ReportSensorEvent(&event) != HDF_SUCCESS) { + HDF_LOGE("%s: report accel data failed", __func__); + return; + } + + if (drvData->cb != NULL) { + drvData->cb((int32_t*)event.data, event.dataLen); } } @@ -342,6 +367,7 @@ int32_t AccelInitDriver(struct HdfDeviceObject *device) } drvData->accelCfg->regCfgGroup = &g_regCfgGroup[0]; + drvData->cb = NULL; HDF_LOGI("%s: Init accel driver success", __func__); return HDF_SUCCESS; diff --git a/model/sensor/driver/accel/sensor_accel_driver.h b/model/sensor/driver/accel/sensor_accel_driver.h old mode 100644 new mode 100755 index 4162ae0dd..5a7d00448 --- a/model/sensor/driver/accel/sensor_accel_driver.h +++ b/model/sensor/driver/accel/sensor_accel_driver.h @@ -32,6 +32,8 @@ enum AccelAxisPart { ACCEL_AXIS_BUTT, }; +typedef int32_t (*GravitySubscribeAccelCallback)(int32_t *rawData, int32_t size); + struct AccelData { int32_t x; int32_t y; @@ -40,7 +42,7 @@ struct AccelData { struct AccelOpsCall { int32_t (*Init)(struct SensorCfgData *data); - int32_t (*ReadData)(struct SensorCfgData *data); + int32_t (*ReadData)(struct SensorCfgData *data, struct SensorReportEvent *event); }; struct AccelDrvData { @@ -54,10 +56,11 @@ struct AccelDrvData { int64_t interval; struct SensorCfgData *accelCfg; struct AccelOpsCall ops; + GravitySubscribeAccelCallback cb; }; int32_t AccelRegisterChipOps(const struct AccelOpsCall *ops); struct SensorCfgData *AccelCreateCfgData(const struct DeviceResourceNode *node); void AccelReleaseCfgData(struct SensorCfgData *sensorCfgData); - +int32_t SubscribeAccelDataCallbackFunc(GravitySubscribeAccelCallback cb); #endif /* SENSOR_ACCEL_DRIVER_H */ diff --git a/model/sensor/driver/accel/sensor_gravity_driver.c b/model/sensor/driver/accel/sensor_gravity_driver.c new file mode 100755 index 000000000..8666ec461 --- /dev/null +++ b/model/sensor/driver/accel/sensor_gravity_driver.c @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "sensor_gravity_driver.h" +#include "sensor_accel_driver.h" +#include +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "osal_math.h" +#include "osal_mem.h" +#include "osal_time.h" +#include "sensor_device_manager.h" +#include "sensor_platform_if.h" + +#define HDF_LOG_TAG sensor_gravity_driver_c + +#define HDF_GRAVITY_WORK_QUEUE_NAME "hdf_gravity_work_queue" + +static struct GravityDrvData *g_gravityDrvData = NULL; +static int32_t g_accelRawData[GRAVITY_AXIS_NUM]; + +static struct GravityDrvData *GravityGetDrvData(void) +{ + return g_gravityDrvData; +} + +static int32_t GravitySubscribeAccelData(int32_t *accelData, int32_t size) +{ + CHECK_NULL_PTR_RETURN_VALUE(accelData, HDF_ERR_INVALID_PARAM); + + if (size > GRAVITY_AXIS_NUM * sizeof(int32_t)) { + HDF_LOGE("%s: size exceed max value", __func__); + return HDF_FAILURE; + } + + g_accelRawData[GRAVITY_X_AXIS] = accelData[GRAVITY_X_AXIS]; + g_accelRawData[GRAVITY_Y_AXIS] = accelData[GRAVITY_Y_AXIS]; + g_accelRawData[GRAVITY_Z_AXIS] = accelData[GRAVITY_Z_AXIS]; + + return HDF_SUCCESS; +} + +static void GravityDataWorkEntry(void *arg) +{ + struct GravityDrvData *drvData = NULL; + static int32_t GravityRawData[GRAVITY_AXIS_NUM]; + struct SensorReportEvent event; + drvData = (struct GravityDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + OsalTimespec time; + + GravityRawData[GRAVITY_X_AXIS] = (85 * (GravityRawData[GRAVITY_X_AXIS] - g_accelRawData[GRAVITY_X_AXIS]) + + g_accelRawData[GRAVITY_X_AXIS] * 100) / 100; + GravityRawData[GRAVITY_Y_AXIS] = (85 * (GravityRawData[GRAVITY_Y_AXIS] - g_accelRawData[GRAVITY_Y_AXIS]) + + g_accelRawData[GRAVITY_Y_AXIS] * 100) / 100; + GravityRawData[GRAVITY_Z_AXIS] = (85 * (GravityRawData[GRAVITY_Z_AXIS] - g_accelRawData[GRAVITY_Z_AXIS]) + + g_accelRawData[GRAVITY_Z_AXIS] * 100) / 100; + + if (OsalGetTime(&time) != HDF_SUCCESS) { + HDF_LOGE("%s: Get time failed", __func__); + return; + } + event.timestamp = time.sec * SENSOR_SECOND_CONVERT_NANOSECOND + time.usec * SENSOR_CONVERT_UNIT; /* unit nanosecond */ + event.sensorId = SENSOR_TAG_GRAVITY; + event.option = 0; + event.mode = SENSOR_WORK_MODE_REALTIME; + event.dataLen = sizeof(GravityRawData); + event.data = (uint8_t *)&GravityRawData; + + if (ReportSensorEvent(&event) != HDF_SUCCESS) { + HDF_LOGE("%s: report gravity data failed", __func__); + } +} + +static void GravityTimerEntry(uintptr_t arg) +{ + int32_t ret; + struct GravityDrvData *drvData = (struct GravityDrvData *)arg; + CHECK_NULL_PTR_RETURN(drvData); + + if (!HdfAddWork(&drvData->gravityWorkQueue, &drvData->gravityWork)) { + HDF_LOGE("%s: Gravity add work queue failed", __func__); + } + + ret = OsalTimerSetTimeout(&drvData->gravityTimer, drvData->interval); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity modify time failed", __func__); + } +} + +static int32_t InitGravityData(struct GravityDrvData *drvData) +{ + if (HdfWorkQueueInit(&drvData->gravityWorkQueue, HDF_GRAVITY_WORK_QUEUE_NAME) != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity init work queue failed", __func__); + return HDF_FAILURE; + } + + if (HdfWorkInit(&drvData->gravityWork, GravityDataWorkEntry, drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity create thread failed", __func__); + return HDF_FAILURE; + } + + drvData->interval = GRAVITY_TIMER_MAX_TIME; + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetGravityEnable(void) +{ + int32_t ret; + struct GravityDrvData *drvData = GravityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->gravityCfg, HDF_ERR_INVALID_PARAM); + + if (drvData->enable) { + HDF_LOGE("%s: Gravity sensor is enabled", __func__); + return HDF_SUCCESS; + } + + ret = OsalTimerCreate(&drvData->gravityTimer, GRAVITY_TIMER_MAX_TIME, GravityTimerEntry, (uintptr_t)drvData); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity create timer failed[%d]", __func__, ret); + return ret; + } + + ret = OsalTimerStartLoop(&drvData->gravityTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity start timer failed[%d]", __func__, ret); + return ret; + } + drvData->enable = true; + + return HDF_SUCCESS; +} + +static int32_t SetGravityDisable(void) +{ + int32_t ret; + struct GravityDrvData *drvData = GravityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->gravityCfg, HDF_ERR_INVALID_PARAM); + + if (!drvData->enable) { + HDF_LOGE("%s: Gravity sensor had disable", __func__); + return HDF_SUCCESS; + } + + ret = OsalTimerDelete(&drvData->gravityTimer); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity delete timer failed", __func__); + return ret; + } + drvData->enable = false; + + return HDF_SUCCESS; +} + +static int32_t SetGravityBatch(int64_t samplingInterval, int64_t interval) +{ + (void)interval; + + int64_t ms; + struct GravityDrvData *drvData = NULL; + + drvData = GravityGetDrvData(); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + ms = OsalDivS64(samplingInterval, (SENSOR_CONVERT_UNIT * SENSOR_CONVERT_UNIT)); + + drvData->interval = (ms <= GRAVITY_TIMER_MIN_TIME) ? GRAVITY_TIMER_MIN_TIME : GRAVITY_TIMER_MAX_TIME; + + return HDF_SUCCESS; +} + +static int32_t SetGravityMode(int32_t mode) +{ + return (mode == SENSOR_WORK_MODE_REALTIME) ? HDF_SUCCESS : HDF_FAILURE; +} + +static int32_t SetGravityOption(uint32_t option) +{ + (void)option; + return HDF_SUCCESS; +} + +static int32_t DispatchGravity(struct HdfDeviceIoClient *client, + int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + (void)client; + (void)cmd; + (void)data; + (void)reply; + + return HDF_SUCCESS; +} + +int32_t GravityBindDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + + struct GravityDrvData *drvData = (struct GravityDrvData *)OsalMemCalloc(sizeof(*drvData)); + if (drvData == NULL) { + HDF_LOGE("%s: Malloc gravity drv data fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + drvData->ioService.Dispatch = DispatchGravity; + drvData->device = device; + device->service = &drvData->ioService; + g_gravityDrvData = drvData; + return HDF_SUCCESS; +} + +static int32_t InitGravityOps(struct SensorCfgData *config, struct SensorDeviceInfo *deviceInfo) +{ + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + deviceInfo->ops.Enable = SetGravityEnable; + deviceInfo->ops.Disable = SetGravityDisable; + deviceInfo->ops.SetBatch = SetGravityBatch; + deviceInfo->ops.SetMode = SetGravityMode; + deviceInfo->ops.SetOption = SetGravityOption; + + if (memcpy_s(&deviceInfo->sensorInfo, sizeof(deviceInfo->sensorInfo), + &config->sensorInfo, sizeof(config->sensorInfo)) != EOK) { + HDF_LOGE("%s: Copy sensor info failed", __func__); + return HDF_FAILURE; + } + + if (SubscribeAccelDataCallbackFunc(GravitySubscribeAccelData) != HDF_SUCCESS) { + HDF_LOGE("%s: Gravity register accel failed", __func__); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +static int32_t InitGravityAfterBase(struct SensorCfgData *config) +{ + struct SensorDeviceInfo deviceInfo; + CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); + + if (InitGravityOps(config, &deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Init gravity ops failed", __func__); + return HDF_FAILURE; + } + + if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: Add gravity device failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +static int32_t GravityCreateCfgData(const struct DeviceResourceNode *node) +{ + struct GravityDrvData *drvData = GravityGetDrvData(); + + CHECK_NULL_PTR_RETURN_VALUE(node, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(drvData->gravityCfg, HDF_ERR_INVALID_PARAM); + + if (GetSensorBaseConfigData(node, drvData->gravityCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Get sensor base config failed", __func__); + return HDF_FAILURE; + } + + if (InitGravityAfterBase(drvData->gravityCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: Init gravity sensor device failed", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; +} + +int32_t GravityInitDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); + struct GravityDrvData *drvData = (struct GravityDrvData *)device->service; + CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM); + + if (InitGravityData(drvData) != HDF_SUCCESS) { + HDF_LOGE("%s: Init gravity config failed", __func__); + return HDF_FAILURE; + } + + drvData->gravityCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->gravityCfg)); + if (drvData->gravityCfg == NULL) { + HDF_LOGE("%s: Malloc gravity config data failed", __func__); + return HDF_FAILURE; + } + + if (GravityCreateCfgData(device->property) != HDF_SUCCESS) { + HDF_LOGE("%s: create gravity device failed", __func__); + OsalMemFree(drvData->gravityCfg); + return HDF_FAILURE; + } + HDF_LOGI("%s: Init gravity driver success", __func__); + return HDF_SUCCESS; +} + +void GravityReleaseDriver(struct HdfDeviceObject *device) +{ + CHECK_NULL_PTR_RETURN(device); + + struct GravityDrvData *drvData = (struct GravityDrvData *)device->service; + CHECK_NULL_PTR_RETURN(drvData); + + if (drvData->gravityCfg != NULL) { + (void)DeleteSensorDevice(&drvData->gravityCfg->sensorInfo); + OsalMemFree(drvData->gravityCfg); + drvData->gravityCfg = NULL; + } + + HdfWorkDestroy(&drvData->gravityWork); + HdfWorkQueueDestroy(&drvData->gravityWorkQueue); + OsalMemFree(drvData); +} + +struct HdfDriverEntry g_sensorGravityDevEntry = { + .moduleVersion = 1, + .moduleName = "HDF_SENSOR_GRAVITY", + .Bind = GravityBindDriver, + .Init = GravityInitDriver, + .Release = GravityReleaseDriver, +}; + +HDF_INIT(g_sensorGravityDevEntry); \ No newline at end of file diff --git a/model/sensor/driver/accel/sensor_gravity_driver.h b/model/sensor/driver/accel/sensor_gravity_driver.h new file mode 100755 index 000000000..ab54fa23c --- /dev/null +++ b/model/sensor/driver/accel/sensor_gravity_driver.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef SENSOR_GRAVITY_DRIVER_H +#define SENSOR_GRAVITY_DRIVER_H + +#include "hdf_workqueue.h" +#include "osal_mutex.h" +#include "osal_timer.h" +#include "sensor_config_parser.h" +#include "sensor_platform_if.h" + +#define GRAVITY_TIMER_MIN_TIME 10 +#define GRAVITY_TIMER_MAX_TIME 20 +enum GravityAxisNum { + GRAVITY_X_AXIS = 0, + GRAVITY_Y_AXIS = 1, + GRAVITY_Z_AXIS = 2, + GRAVITY_AXIS_NUM = 3, +}; + +struct GravityData { + int32_t x; + int32_t y; + int32_t z; +}; + +struct GravityDrvData { + struct IDeviceIoService ioService; + struct HdfDeviceObject *device; + HdfWorkQueue gravityWorkQueue; + HdfWork gravityWork; + OsalTimer gravityTimer; + struct SensorCfgData *gravityCfg; + int64_t interval; + bool enable; +}; + +#endif /* SENSOR_GRAVITY_DRIVER_H */ \ No newline at end of file diff --git a/model/sensor/driver/chipset/accel/accel_bmi160.c b/model/sensor/driver/chipset/accel/accel_bmi160.c old mode 100644 new mode 100755 index 8472938fd..6fb7ca2c3 --- a/model/sensor/driver/chipset/accel/accel_bmi160.c +++ b/model/sensor/driver/chipset/accel/accel_bmi160.c @@ -79,24 +79,24 @@ static int32_t ReadBmi160RawData(struct SensorCfgData *data, struct AccelData *r return HDF_SUCCESS; } -int32_t ReadBmi160Data(struct SensorCfgData *data) +int32_t ReadBmi160Data(struct SensorCfgData *cfg, struct SensorReportEvent *event) { int32_t ret; struct AccelData rawData = { 0, 0, 0 }; - int32_t tmp[ACCEL_AXIS_NUM]; - struct SensorReportEvent event; + static int32_t tmp[ACCEL_AXIS_NUM]; - (void)memset_s(&event, sizeof(event), 0, sizeof(event)); + CHECK_NULL_PTR_RETURN_VALUE(cfg, HDF_ERR_INVALID_PARAM); + CHECK_NULL_PTR_RETURN_VALUE(event, HDF_ERR_INVALID_PARAM); - ret = ReadBmi160RawData(data, &rawData, &event.timestamp); + ret = ReadBmi160RawData(cfg, &rawData, &event->timestamp); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: BMI160 read raw data failed", __func__); return HDF_FAILURE; } - event.sensorId = SENSOR_TAG_ACCELEROMETER; - event.option = 0; - event.mode = SENSOR_WORK_MODE_REALTIME; + event->sensorId = SENSOR_TAG_ACCELEROMETER; + event->option = 0; + event->mode = SENSOR_WORK_MODE_REALTIME; rawData.x = rawData.x * BMI160_ACC_SENSITIVITY_2G; rawData.y = rawData.y * BMI160_ACC_SENSITIVITY_2G; @@ -106,24 +106,21 @@ int32_t ReadBmi160Data(struct SensorCfgData *data) tmp[ACCEL_Y_AXIS] = (rawData.y * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT; tmp[ACCEL_Z_AXIS] = (rawData.z * SENSOR_1K_UNIT) / SENSOR_CONVERT_UNIT; - ret = SensorRawDataToRemapData(data->direction, tmp, sizeof(tmp) / sizeof(tmp[0])); + ret = SensorRawDataToRemapData(cfg->direction, tmp, sizeof(tmp) / sizeof(tmp[0])); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: BMI160 convert raw data failed", __func__); return HDF_FAILURE; } - - event.dataLen = sizeof(tmp); - event.data = (uint8_t *)&tmp; - ret = ReportSensorEvent(&event); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: BMI160 report data failed", __func__); - } + + event->dataLen = sizeof(tmp); + event->data = (uint8_t *)&tmp; + return ret; } static int32_t InitBmi160(struct SensorCfgData *data) { - int32_t ret; + int32_t ret; CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); diff --git a/model/sensor/driver/chipset/accel/accel_bmi160.h b/model/sensor/driver/chipset/accel/accel_bmi160.h old mode 100644 new mode 100755 index 1f1fb4de9..49ad6b05d --- a/model/sensor/driver/chipset/accel/accel_bmi160.h +++ b/model/sensor/driver/chipset/accel/accel_bmi160.h @@ -59,8 +59,7 @@ #define BMI160_ACCEL_DATA_READY_MASK 0x80 int32_t DetectAccelBim160Chip(struct SensorCfgData *data); -int32_t ReadBmi160Data(struct SensorCfgData *data); - +int32_t ReadBmi160Data(struct SensorCfgData *cfg, struct SensorReportEvent *event); struct Bmi160DrvData { struct IDeviceIoService ioService; struct HdfDeviceObject *device; -- Gitee From 55a3c7e2033ddbf6f695addb4b5163eb2e4ec502 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 6 Dec 2021 18:07:57 +0800 Subject: [PATCH 240/272] feat: add gravity driver v11 Signed-off-by: YOUR_NAME --- model/sensor/driver/accel/sensor_gravity_driver.c | 14 +++++++------- model/sensor/driver/accel/sensor_gravity_driver.h | 2 ++ model/sensor/driver/chipset/accel/accel_bmi160.c | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/model/sensor/driver/accel/sensor_gravity_driver.c b/model/sensor/driver/accel/sensor_gravity_driver.c index 8666ec461..a697d7d74 100755 --- a/model/sensor/driver/accel/sensor_gravity_driver.c +++ b/model/sensor/driver/accel/sensor_gravity_driver.c @@ -54,12 +54,12 @@ static void GravityDataWorkEntry(void *arg) CHECK_NULL_PTR_RETURN(drvData); OsalTimespec time; - GravityRawData[GRAVITY_X_AXIS] = (85 * (GravityRawData[GRAVITY_X_AXIS] - g_accelRawData[GRAVITY_X_AXIS]) + - g_accelRawData[GRAVITY_X_AXIS] * 100) / 100; - GravityRawData[GRAVITY_Y_AXIS] = (85 * (GravityRawData[GRAVITY_Y_AXIS] - g_accelRawData[GRAVITY_Y_AXIS]) + - g_accelRawData[GRAVITY_Y_AXIS] * 100) / 100; - GravityRawData[GRAVITY_Z_AXIS] = (85 * (GravityRawData[GRAVITY_Z_AXIS] - g_accelRawData[GRAVITY_Z_AXIS]) + - g_accelRawData[GRAVITY_Z_AXIS] * 100) / 100; + GravityRawData[GRAVITY_X_AXIS] = (g_accelRawData[GRAVITY_X_AXIS] * GRAVITY_UNITS + + GRAVITY_FILTER_UNITS * (GravityRawData[GRAVITY_X_AXIS] - g_accelRawData[GRAVITY_X_AXIS])) / GRAVITY_UNITS; + GravityRawData[GRAVITY_Y_AXIS] = (g_accelRawData[GRAVITY_Y_AXIS] * GRAVITY_UNITS + + GRAVITY_FILTER_UNITS * (GravityRawData[GRAVITY_Y_AXIS] - g_accelRawData[GRAVITY_Y_AXIS])) / GRAVITY_UNITS; + GravityRawData[GRAVITY_Z_AXIS] = (g_accelRawData[GRAVITY_Z_AXIS] * GRAVITY_UNITS + + GRAVITY_FILTER_UNITS * (GravityRawData[GRAVITY_Z_AXIS] - g_accelRawData[GRAVITY_Z_AXIS])) / GRAVITY_UNITS; if (OsalGetTime(&time) != HDF_SUCCESS) { HDF_LOGE("%s: Get time failed", __func__); @@ -73,7 +73,7 @@ static void GravityDataWorkEntry(void *arg) event.data = (uint8_t *)&GravityRawData; if (ReportSensorEvent(&event) != HDF_SUCCESS) { - HDF_LOGE("%s: report gravity data failed", __func__); + HDF_LOGE("%s: Report gravity data failed", __func__); } } diff --git a/model/sensor/driver/accel/sensor_gravity_driver.h b/model/sensor/driver/accel/sensor_gravity_driver.h index ab54fa23c..30521c1cd 100755 --- a/model/sensor/driver/accel/sensor_gravity_driver.h +++ b/model/sensor/driver/accel/sensor_gravity_driver.h @@ -17,6 +17,8 @@ #define GRAVITY_TIMER_MIN_TIME 10 #define GRAVITY_TIMER_MAX_TIME 20 +#define GRAVITY_UNITS 100 +#define GRAVITY_FILTER_UNITS 85 enum GravityAxisNum { GRAVITY_X_AXIS = 0, GRAVITY_Y_AXIS = 1, diff --git a/model/sensor/driver/chipset/accel/accel_bmi160.c b/model/sensor/driver/chipset/accel/accel_bmi160.c index 6fb7ca2c3..33f791e3c 100755 --- a/model/sensor/driver/chipset/accel/accel_bmi160.c +++ b/model/sensor/driver/chipset/accel/accel_bmi160.c @@ -120,7 +120,7 @@ int32_t ReadBmi160Data(struct SensorCfgData *cfg, struct SensorReportEvent *even static int32_t InitBmi160(struct SensorCfgData *data) { - int32_t ret; + int32_t ret; CHECK_NULL_PTR_RETURN_VALUE(data, HDF_ERR_INVALID_PARAM); ret = SetSensorRegCfgArray(&data->busCfg, data->regCfgGroup[SENSOR_INIT_GROUP]); -- Gitee From 67076d01f2cd1751dc96c6ba0a6698d5356d3220 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Fri, 3 Dec 2021 18:44:27 +0800 Subject: [PATCH 241/272] fix: clear code alarm in hdmi, fwk, gpio, i3c, pin, regulator source files Signed-off-by: jiaziyang --- .../platform/include/hdmi/hdmi_infoframe.h | 2 +- support/platform/src/fwk/platform_device.c | 7 +++- support/platform/src/hdmi/hdmi_infoframe.c | 28 +++++++-------- test/unittest/platform/common/i3c_test.c | 6 ++-- test/unittest/platform/common/pin_test.c | 34 ++++++++++--------- .../unittest/platform/common/regulator_test.c | 2 +- .../platform/entry/hdf_hdmi_entry_test.c | 3 +- .../platform/entry/hdf_i3c_entry_test.c | 1 - test/unittest/platform/virtual/i3c_virtual.c | 5 --- 9 files changed, 44 insertions(+), 44 deletions(-) diff --git a/support/platform/include/hdmi/hdmi_infoframe.h b/support/platform/include/hdmi/hdmi_infoframe.h index a37f4e457..bd72fe66c 100644 --- a/support/platform/include/hdmi/hdmi_infoframe.h +++ b/support/platform/include/hdmi/hdmi_infoframe.h @@ -478,7 +478,7 @@ int32_t HdmiAviInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); int32_t HdmiDrmInfoFrameSend(struct HdmiInfoFrame *frame, bool enable); int32_t HdmiVsInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, bool dolbyEnable); int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, - const char *vendorName, char *productName, enum HdmiSpdSdi sdi); + const char *vendorName, const char *productName, enum HdmiSpdSdi sdi); int32_t HdmiInfoFrameGetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, union HdmiInfoFrameInfo *infoFrame); int32_t HdmiInfoFrameSetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType type, diff --git a/support/platform/src/fwk/platform_device.c b/support/platform/src/fwk/platform_device.c index 140bf63ce..cc162fe86 100755 --- a/support/platform/src/fwk/platform_device.c +++ b/support/platform/src/fwk/platform_device.c @@ -22,6 +22,7 @@ static void PlatformDeviceOnFirstGet(struct HdfSRef *sref) static void PlatformDeviceOnLastPut(struct HdfSRef *sref) { struct PlatformDevice *device = NULL; + int32_t ret; if (sref == NULL) { return; @@ -34,7 +35,11 @@ static void PlatformDeviceOnLastPut(struct HdfSRef *sref) } device->ready = false; - (void)PlatformDeviceNotify(device, PLAT_EVENT_DEAD); + ret = PlatformDeviceNotify(device, PLAT_EVENT_DEAD); + if (ret != HDF_SUCCESS) { + HDF_LOGE("PlatformDeviceOnLastPut: PlatformDeviceNotify failed!, ret = %d", ret); + return; + } } struct IHdfSRefListener g_platObjListener = { diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index c8b80b901..37bd5bc0e 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -69,13 +69,13 @@ static int32_t HdmiInfoFramePacketVsEncoding(union HdmiInfoFrameInfo *infoFrame, data[UINT8_ARRAY_TElEMENT_6] = HDMI_IEEE_OUI_1_4_3RD; vsifContent = &(vs->vsifContent.vsif); userContent = &(vs->vsifContent.userVsif); - data[UINT8_ARRAY_TElEMENT_7] = (vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << + data[UINT8_ARRAY_TElEMENT_7] = ((uint8_t)vsifContent->format & HDMI_VENDOR_1_4_FORMAT_MARK) << HDMI_VENDOR_1_4_FORMAT_SHIFT; if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_4K) { data[UINT8_ARRAY_TElEMENT_8] = vsifContent->vic; return HDF_SUCCESS; } else if (vsifContent->format == HDMI_VS_VIDEO_FORMAT_3D) { - data[UINT8_ARRAY_TElEMENT_8] = (vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << + data[UINT8_ARRAY_TElEMENT_8] = ((uint8_t)vsifContent->_3dStruct & HDMI_VENDOR_3D_STRUCTURE_MARK) << HDMI_VENDOR_3D_STRUCTURE_SHIFT; } data[UINT8_ARRAY_TElEMENT_9] = ((uint8_t)vsifContent->_3dExtData & HDMI_VENDOR_3D_EXT_DATA_MARK) << @@ -126,23 +126,23 @@ static int32_t HdmiInfoFramePacketAviEncoding(union HdmiInfoFrameInfo *infoFrame buff[UINT8_ARRAY_TElEMENT_0] |= (1 << HDMI_AVI_VERTICAL_BAR_SHIFT); } /* PB2 */ - buff[UINT8_ARRAY_TElEMENT_1] |= (avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; - buff[UINT8_ARRAY_TElEMENT_1] |= (avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << + buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)avi->colorimetry & HDMI_AVI_COLORIMETRY_MARK) << HDMI_AVI_COLORIMETRY_SHIFT; + buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)avi->pictureAspect & HDMI_AVI_PICTURE_ASPECT_RATE_MARK) << HDMI_AVI_PICTURE_ASPECT_RATE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_1] |= (avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); + buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)avi->activeAspect & HDMI_AVI_ACTIVE_FORMAT_ASPECT_RATE_MARK); /* PB3 */ - buff[UINT8_ARRAY_TElEMENT_2] |= (avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << + buff[UINT8_ARRAY_TElEMENT_2] |= ((uint8_t)avi->extColorimetry & HDMI_AVI_EXT_COLORIMETRY_MARK) << HDMI_AVI_EXT_COLORIMETRY_SHIFT; - buff[UINT8_ARRAY_TElEMENT_2] |= (avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << + buff[UINT8_ARRAY_TElEMENT_2] |= ((uint8_t)avi->range & HDMI_AVI_EXT_QUANTIZATION_RANGE_MARK) << HDMI_AVI_EXT_QUANTIZATION_RANGE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_2] |= (avi->nups & HDMI_AVI_NUPS_RANGE_MARK); + buff[UINT8_ARRAY_TElEMENT_2] |= ((uint8_t)avi->nups & HDMI_AVI_NUPS_RANGE_MARK); if (avi->itc == true) { buff[UINT8_ARRAY_TElEMENT_2] |= (1 << HDMI_AVI_IT_CONTENT_SHIFT); } /* PB4 */ buff[UINT8_ARRAY_TElEMENT_3] = avi->vic; /* PB5 */ - buff[UINT8_ARRAY_TElEMENT_4] |= (avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << + buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)avi->yccRange & HDMI_AVI_YCC_QUANTIZATION_RANGE_MARK) << HDMI_AVI_YCC_QUANTIZATION_RANGE_SHIFT; buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)avi->itcType & HDMI_AVI_IT_CONTENT_TYPE_MARK) << HDMI_AVI_IT_CONTENT_TYPE_SHIFT; @@ -222,10 +222,10 @@ static int32_t HdmiInfoFramePacketAudioEncoding(union HdmiInfoFrameInfo *infoFra HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ - buff[UINT8_ARRAY_TElEMENT_0] |= (audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_0] |= (audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); + buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); /* PB2 */ - buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << + buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); /* PB3 */ @@ -235,7 +235,7 @@ static int32_t HdmiInfoFramePacketAudioEncoding(union HdmiInfoFrameInfo *infoFra /* PB5 */ buff[UINT8_ARRAY_TElEMENT_4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_4] |= (audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); + buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); if (audio->dmInh == true) { buff[UINT8_ARRAY_TElEMENT_4] |= (1 << HDMI_AUDIO_DM_INH_SHIFT); } @@ -752,7 +752,7 @@ static void HdmiFillSpdInfoFrame(struct HdmiSpdInfoFrame *spd, } int32_t HdmiSpdInfoFrameSend(struct HdmiInfoFrame *frame, bool enable, - const char *vendorName, char *productName, enum HdmiSpdSdi sdi) + const char *vendorName, const char *productName, enum HdmiSpdSdi sdi) { struct HdmiCntlr *cntlr = NULL; union HdmiInfoFrameInfo infoFrame = {0}; diff --git a/test/unittest/platform/common/i3c_test.c b/test/unittest/platform/common/i3c_test.c index d1e8f47fa..a84b88415 100644 --- a/test/unittest/platform/common/i3c_test.c +++ b/test/unittest/platform/common/i3c_test.c @@ -7,15 +7,15 @@ */ #include "i3c_test.h" -#include "i3c_if.h" -#include "i3c_ccc.h" #include "hdf_base.h" #include "hdf_io_service_if.h" #include "hdf_log.h" +#include "i3c_ccc.h" +#include "i3c_if.h" #include "osal_mem.h" -#include "securec.h" #include "osal_thread.h" #include "osal_time.h" +#include "securec.h" #define HDF_LOG_TAG i3c_test_c diff --git a/test/unittest/platform/common/pin_test.c b/test/unittest/platform/common/pin_test.c index 2224f1cfd..2d3a6b305 100644 --- a/test/unittest/platform/common/pin_test.c +++ b/test/unittest/platform/common/pin_test.c @@ -7,13 +7,13 @@ */ #include "pin_test.h" -#include "pin_if.h" #include "hdf_base.h" #include "hdf_io_service_if.h" #include "hdf_log.h" -#include "securec.h" #include "osal_mem.h" #include "osal_time.h" +#include "pin_if.h" +#include "securec.h" #define HDF_LOG_TAG pin_test_c @@ -113,6 +113,7 @@ static int32_t PinSetGetPullTest(void) int32_t ret; enum PinPullType getPullTypeNum; + getPullTypeNum = 0; tester = PinTesterGet(); if (tester == NULL) { HDF_LOGE("%s: Get tester failed!", __func__); @@ -142,6 +143,7 @@ static int32_t PinSetGetStrengthTest(void) int32_t ret; uint32_t getStrengthNum; + getStrengthNum = 0; tester = PinTesterGet(); if (tester == NULL) { HDF_LOGE("%s: Get tester failed!", __func__); @@ -159,8 +161,8 @@ static int32_t PinSetGetStrengthTest(void) return HDF_FAILURE; } if (tester->config.strengthNum != getStrengthNum) { - HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d",__func__, - tester->config.strengthNum, getStrengthNum); + HDF_LOGE("%s: Pin set strength:%d, but Pin get strength:%d", __func__, + tester->config.strengthNum, getStrengthNum); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -178,23 +180,23 @@ static int32_t PinSetGetFuncTest(void) } ret = PinSetFunc(tester->handle, (const char *)tester->config.funcNameBuf); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Pin set function failed!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcNameBuf); + HDF_LOGE("%s: Pin set function failed!, pinName:%s, functionName:%s", __func__, + tester->config.pinName, tester->config.funcNameBuf); return HDF_FAILURE; } - HDF_LOGI("%s: Pin set function success!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcNameBuf); + HDF_LOGI("%s: Pin set function success!, pinName:%s, functionName:%s", __func__, + tester->config.pinName, tester->config.funcNameBuf); ret = PinGetFunc(tester->handle, &tester->config.funcName); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Pin get function failed!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcName); + HDF_LOGE("%s: Pin get function failed!, pinName:%s, functionName:%s", __func__, + tester->config.pinName, tester->config.funcName); return HDF_FAILURE; } - HDF_LOGI("%s: Pin get function success!, pinName:%s,functionName:%s", - __func__, tester->config.pinName, tester->config.funcName); + HDF_LOGI("%s: Pin get function success!, pinName:%s, functionName:%s", __func__, + tester->config.pinName, tester->config.funcName); if (strcmp((const char *)tester->config.funcNameBuf, tester->config.funcName) != 0) { - HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", - __func__, tester->config.funcNameBuf, tester->config.funcName); + HDF_LOGE("%s: Pin set function:%s, but Pin get function:%s", __func__, + tester->config.funcNameBuf, tester->config.funcName); } HDF_LOGD("%s: done", __func__); return HDF_SUCCESS; @@ -216,8 +218,8 @@ int32_t PinTestSetUpAll(void) tester->fails = 0; cfg = &tester->config; - HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", - __func__, cfg->pinName, cfg->PullTypeNum, cfg->strengthNum); + HDF_LOGD("%s: test on pinName:%s, PullTypeNum:%d, strengthNum:%d", __func__, + cfg->pinName, cfg->PullTypeNum, cfg->strengthNum); ret = PinGetPull(tester->handle, &g_oldPinCfg.pullTypeNum); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get pullTypeNum failed!", __func__); diff --git a/test/unittest/platform/common/regulator_test.c b/test/unittest/platform/common/regulator_test.c index 75ff547e8..78a789e77 100755 --- a/test/unittest/platform/common/regulator_test.c +++ b/test/unittest/platform/common/regulator_test.c @@ -9,9 +9,9 @@ #include "regulator_test.h" #include "device_resource_if.h" #include "hdf_log.h" -#include "regulator_if.h" #include "osal_thread.h" #include "osal_time.h" +#include "regulator_if.h" #define HDF_LOG_TAG regulator_test_c diff --git a/test/unittest/platform/entry/hdf_hdmi_entry_test.c b/test/unittest/platform/entry/hdf_hdmi_entry_test.c index 382546e45..17435b662 100644 --- a/test/unittest/platform/entry/hdf_hdmi_entry_test.c +++ b/test/unittest/platform/entry/hdf_hdmi_entry_test.c @@ -7,11 +7,10 @@ */ #include "hdf_hdmi_entry_test.h" -#include "hdmi_if.h" #include "hdf_log.h" +#include "hdmi_if.h" #include "hdmi_test.h" - #define HDF_LOG_TAG hdf_hdmi_entry_test int32_t HdfHdmiUnitTestEntry(HdfTestMsg *msg) diff --git a/test/unittest/platform/entry/hdf_i3c_entry_test.c b/test/unittest/platform/entry/hdf_i3c_entry_test.c index 1182fa64e..c6219940d 100644 --- a/test/unittest/platform/entry/hdf_i3c_entry_test.c +++ b/test/unittest/platform/entry/hdf_i3c_entry_test.c @@ -9,7 +9,6 @@ #include "hdf_i3c_entry_test.h" #include "hdf_log.h" #include "i3c_test.h" -#include "hdf_log.h" #define HDF_LOG_TAG hdf_adc_entry_test diff --git a/test/unittest/platform/virtual/i3c_virtual.c b/test/unittest/platform/virtual/i3c_virtual.c index f15fbf1f5..28616e419 100644 --- a/test/unittest/platform/virtual/i3c_virtual.c +++ b/test/unittest/platform/virtual/i3c_virtual.c @@ -8,12 +8,7 @@ #include "i3c/i3c_core.h" #include "device_resource_if.h" -#include "hdf_device_desc.h" -#include "hdf_log.h" -#include "osal_io.h" -#include "osal_irq.h" #include "osal_mem.h" -#include "osal_spinlock.h" #include "osal_time.h" #define HDF_LOG_TAG i3c_virtual -- Gitee From 807e09d5f352d4f994e0295060084580a5e6cff2 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 7 Dec 2021 14:40:26 +0800 Subject: [PATCH 242/272] fix:fix sensor controller module codex Signed-off-by: kevin --- model/sensor/driver/common/src/sensor_config_controller.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 414ee69b8..ab1d89b1c 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -186,7 +186,11 @@ static int32_t SensorOpsExtBuffWrite(struct SensorBusCfg *busCfg, struct SensorR CHECK_NULL_PTR_RETURN_VALUE(value, HDF_FAILURE); value[SENSOR_ADDR_INDEX] = cfgItem->regAddr; - memcpy_s(&value[SENSOR_VALUE_INDEX], cfgItem->len, cfgItem->buff, cfgItem->len); + if (memcpy_s(&value[SENSOR_VALUE_INDEX], cfgItem->len, cfgItem->buff, cfgItem->len) != EOK) { + HDF_LOGE("%s: Cpy value failed", __func__); + OsalMemFree(value); + return HDF_FAILURE; + } if (busCfg->busType == SENSOR_BUS_I2C) { ret = WriteSensor(busCfg, value, cfgItem->len); -- Gitee From d6f96c6bed19a26cb9320e6748e41f551676bc5f Mon Sep 17 00:00:00 2001 From: yufengs Date: Thu, 2 Dec 2021 16:03:56 +0800 Subject: [PATCH 243/272] style: fix usb module codex Signed-off-by: yufengs Change-Id: If11421bca906e0d8819a9bc34ee8a4af0ff6bd06 --- model/usb/src/usb_ddk_pnp_loader.c | 8 ++-- .../device/src/usb_device_lite_cdcacm_test.c | 8 ++-- .../model/usb/host/src/usb_raw_test.c | 40 +++++++++---------- test/unittest/model/usb/host/src/usb_test.c | 4 +- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index f01cecdae..c1cc406d2 100644 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -298,7 +298,7 @@ static bool UsbDdkPnpLoaderMatchInterface(const struct UsbPnpNotifyMatchInfoTabl if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_CLASS) { for (i = 0; i < id->interfaceClassLength; i++) { if (id->interfaceClass[i] == dev->interfaceInfo[index].interfaceClass) { - id->interfaceClassMask |= (1 << i); + id->interfaceClassMask |= (1 << (uint32_t)i); break; } } @@ -311,7 +311,7 @@ static bool UsbDdkPnpLoaderMatchInterface(const struct UsbPnpNotifyMatchInfoTabl if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_SUBCLASS) { for (i = 0; i < id->interfaceSubClassLength; i++) { if (id->interfaceSubClass[i] == dev->interfaceInfo[index].interfaceSubClass) { - id->interfaceSubClassMask |= (1 << i); + id->interfaceSubClassMask |= (1 << (uint32_t)i); break; } } @@ -324,7 +324,7 @@ static bool UsbDdkPnpLoaderMatchInterface(const struct UsbPnpNotifyMatchInfoTabl if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_PROTOCOL) { for (i = 0; i < id->interfaceProtocolLength; i++) { if (id->interfaceProtocol[i] == dev->interfaceInfo[index].interfaceProtocol) { - id->interfaceProtocolMask |= (1 << i); + id->interfaceProtocolMask |= (1 << (uint32_t)i); break; } } @@ -337,7 +337,7 @@ static bool UsbDdkPnpLoaderMatchInterface(const struct UsbPnpNotifyMatchInfoTabl if (id->matchFlag & USB_PNP_NOTIFY_MATCH_INT_NUMBER) { for (i = 0; i < id->interfaceLength; i++) { if (id->interfaceNumber[i] == dev->interfaceInfo[index].interfaceNumber) { - id->interfaceMask |= (1 << i); + id->interfaceMask |= (1 << (uint32_t)i); break; } } diff --git a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c index a27c03898..a6254e778 100755 --- a/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c +++ b/test/unittest/model/usb/device/src/usb_device_lite_cdcacm_test.c @@ -394,7 +394,7 @@ static void CtrlComplete(uint8_t pipe, struct UsbFnRequest *req) struct CtrlInfo *ctrlInfo = (struct CtrlInfo *)req->context; struct AcmDevice *acm = ctrlInfo->acm; if (USB_REQUEST_COMPLETED != req->status) { - goto out; + goto OUT; } if (ctrlInfo->request == USB_DDK_CDC_REQ_SET_LINE_CODING) { @@ -404,7 +404,7 @@ static void CtrlComplete(uint8_t pipe, struct UsbFnRequest *req) } acm->connect = true; } -out: +OUT: DListInsertTail(&req->list, &acm->ctrlPool); } @@ -615,7 +615,7 @@ static int Setup(struct AcmDevice *acm, const struct UsbFnCtrlRequest *setup) switch (setup->request) { case USB_DDK_CDC_REQ_SET_LINE_CODING: if (length != sizeof(struct UsbCdcLineCoding)) { - goto out; + goto OUT; } ret = length; break; @@ -637,7 +637,7 @@ static int Setup(struct AcmDevice *acm, const struct UsbFnCtrlRequest *setup) break; } -out: +OUT: ctrlInfo = (struct CtrlInfo *)req->context; ctrlInfo->request = setup->request; req->length = ret; diff --git a/test/unittest/model/usb/host/src/usb_raw_test.c b/test/unittest/model/usb/host/src/usb_raw_test.c index 040ffbe62..679463780 100755 --- a/test/unittest/model/usb/host/src/usb_raw_test.c +++ b/test/unittest/model/usb/host/src/usb_raw_test.c @@ -612,11 +612,11 @@ int32_t CheckRawSdkIfGetDescriptor001(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -640,11 +640,11 @@ int32_t CheckRawSdkIfGetDescriptor002(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -667,11 +667,11 @@ int32_t CheckRawSdkIfGetDescriptor003(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -694,11 +694,11 @@ int32_t CheckRawSdkIfGetDescriptor004(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -741,11 +741,11 @@ int32_t CheckRawSdkIfGetDescriptor006(void) if (ret < 0) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -768,11 +768,11 @@ int32_t CheckRawSdkIfGetDescriptor007(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -809,11 +809,11 @@ int32_t CheckRawSdkIfGetDescriptor009(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -875,11 +875,11 @@ int32_t CheckRawSdkIfGetDescriptor012(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(data); data = NULL; @@ -1305,11 +1305,11 @@ int32_t CheckRawSdkIfFillControlSetup002(void) if (ret != HDF_ERR_INVALID_PARAM) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); ret = HDF_SUCCESS; -error: +ERROR: OsalMemFree(setup); setup = NULL; @@ -1359,11 +1359,11 @@ int32_t CheckRawSdkIfFillControlSetup004(void) if (ret) { HDF_LOGE("%s: error", __func__); ret = HDF_FAILURE; - goto error; + goto ERROR; } HDF_LOGE("%s: success", __func__); -error: +ERROR: OsalMemFree(setup); setup = NULL; diff --git a/test/unittest/model/usb/host/src/usb_test.c b/test/unittest/model/usb/host/src/usb_test.c index 4fc60ca5c..72494b68f 100755 --- a/test/unittest/model/usb/host/src/usb_test.c +++ b/test/unittest/model/usb/host/src/usb_test.c @@ -45,9 +45,9 @@ static void AcmReadBulk(struct UsbRequest *req) case -ESHUTDOWN: return; default: - goto exit; + goto EXIT; } -exit: +EXIT: return; } -- Gitee From 90f9180a981cda0a9ebd3794b68d756018f5de93 Mon Sep 17 00:00:00 2001 From: zhang Date: Tue, 7 Dec 2021 15:26:07 +0800 Subject: [PATCH 244/272] test: modify test case category Signed-off-by: zhang --- test/unittest/osal/osal_all_test.c | 12 ++++++------ test/unittest/osal/osal_work_test.c | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/unittest/osal/osal_all_test.c b/test/unittest/osal/osal_all_test.c index 80931d726..d407b3900 100644 --- a/test/unittest/osal/osal_all_test.c +++ b/test/unittest/osal/osal_all_test.c @@ -451,19 +451,19 @@ void OsaIrqTest(void) ret = OsalRegisterIrq(IRQ_NUM_TEST, 0, IRQHandle, "test", &g_irqData); UT_TEST_CHECK_RET(ret != retFlag, OSAL_IRQ_REG_NORMAL); ret = OsalDisableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL); ret = OsalEnableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL); #if defined(__LITEOS__) ret = OsalUnregisterIrq(IRQ_NUM_TEST, &g_irqData); UT_TEST_CHECK_RET(ret != retFlag, OSAL_IRQ_UNREG_NORMAL); #endif ret = OsalDisableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL); ret = OsalEnableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL); #if defined(__LITEOS__) ret = OsalUnregisterIrq(IRQ_NUM_TEST, &g_irqData); @@ -474,9 +474,9 @@ void OsaIrqTest(void) ret = OsalRegisterIrq(IRQ_NUM_TEST, 0, IRQHandle, "test", &g_irqData); UT_TEST_CHECK_RET(ret != retFlag, OSAL_IRQ_REG_NORMAL_STRESS); ret = OsalDisableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL_STRESS); ret = OsalEnableIrq(IRQ_NUM_TEST); - UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(ret != HDF_SUCCESS, OSAL_IRQ_REG_NORMAL_STRESS); #if defined(__LITEOS__) ret = OsalUnregisterIrq(IRQ_NUM_TEST, &g_irqData); UT_TEST_CHECK_RET(ret != retFlag, OSAL_IRQ_UNREG_NORMAL_STRESS); diff --git a/test/unittest/osal/osal_work_test.c b/test/unittest/osal/osal_work_test.c index 8f9a5eba4..d92636de8 100644 --- a/test/unittest/osal/osal_work_test.c +++ b/test/unittest/osal/osal_work_test.c @@ -83,7 +83,7 @@ void TestAddRoute(int cnt) HdfAddDelayedWork(&g_workQue, &g_delayWork, g_delayTime); } else if (cnt % MSG_SEND_PERIOD == TEST_ITEM_NO_EVENT) { UT_TEST_CHECK_RET(g_osalWorkStatus, OSAL_WORK_RUN_CHECK); - UT_TEST_CHECK_RET(g_osalDelayStatus, OSAL_TEST_OTHER); + UT_TEST_CHECK_RET(g_osalDelayStatus, OSAL_DELAY_WORK_RUN_CHECK); } else if (cnt % MSG_SEND_PERIOD == MSG_NOSEND_CHECK_CNT) { g_delayTime = DELAY_TIME_FOR_OUT; g_osalDelayStatus = true; -- Gitee From 0608ed5024682d6e02ae82353510e18d85b1e43b Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Tue, 7 Dec 2021 19:54:27 +0800 Subject: [PATCH 245/272] The interface layer and core layer of PWM module are separated Signed-off-by: yinshuqing --- support/platform/include/pwm/pwm_core.h | 5 +- support/platform/src/pwm/pwm_core.c | 175 ++------------------ support/platform/src/pwm/pwm_if.c | 202 ++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 162 deletions(-) create mode 100755 support/platform/src/pwm/pwm_if.c diff --git a/support/platform/include/pwm/pwm_core.h b/support/platform/include/pwm/pwm_core.h index 7da216c9a..744cc72d6 100644 --- a/support/platform/include/pwm/pwm_core.h +++ b/support/platform/include/pwm/pwm_core.h @@ -9,10 +9,10 @@ #ifndef PWM_CORE_H #define PWM_CORE_H +#include "pwm_if.h" #include "hdf_base.h" #include "hdf_device_desc.h" #include "osal_spinlock.h" -#include "pwm_if.h" #ifdef __cplusplus #if __cplusplus @@ -40,6 +40,9 @@ struct PwmDev { void *priv; }; +int32_t PwmDeviceGet(struct PwmDev *pwm); +void PwmDevicePut(struct PwmDev *pwm); +int32_t PwmDeviceSetConfig(struct PwmDev *pwm, struct PwmConfig *config); void *PwmGetPriv(struct PwmDev *pwm); int32_t PwmSetPriv(struct PwmDev *pwm, void *priv); int32_t PwmDeviceAdd(struct HdfDeviceObject *obj, struct PwmDev *pwm); diff --git a/support/platform/src/pwm/pwm_core.c b/support/platform/src/pwm/pwm_core.c index 1f77085da..dae896f84 100644 --- a/support/platform/src/pwm/pwm_core.c +++ b/support/platform/src/pwm/pwm_core.c @@ -12,64 +12,40 @@ #include "securec.h" #define HDF_LOG_TAG pwm_core -#define PWM_NAME_LEN 32 -static struct PwmDev *PwmGetDevByNum(uint32_t num) -{ - int ret; - char *name = NULL; - struct PwmDev *pwm = NULL; - - name = (char *)OsalMemCalloc(PWM_NAME_LEN + 1); - if (name == NULL) { - return NULL; - } - ret = snprintf_s(name, PWM_NAME_LEN + 1, PWM_NAME_LEN, "HDF_PLATFORM_PWM_%u", num); - if (ret < 0) { - HDF_LOGE("%s: snprintf_s failed", __func__); - OsalMemFree(name); - return NULL; - } - pwm = (struct PwmDev *)DevSvcManagerClntGetService(name); - OsalMemFree(name); - return pwm; -} - -DevHandle PwmOpen(uint32_t num) +int32_t PwmDeviceGet(struct PwmDev *pwm) { int32_t ret; - struct PwmDev *pwm = PwmGetDevByNum(num); if (pwm == NULL) { - HDF_LOGE("%s: dev is null", __func__); - return NULL; + return HDF_ERR_INVALID_PARAM; } + (void)OsalSpinLock(&(pwm->lock)); if (pwm->busy) { (void)OsalSpinUnlock(&(pwm->lock)); - HDF_LOGE("%s: pwm%u is busy", __func__, num); - return NULL; + HDF_LOGE("%s: pwm%u is busy", __func__, pwm->num); + return HDF_ERR_DEVICE_BUSY; } if (pwm->method != NULL && pwm->method->open != NULL) { ret = pwm->method->open(pwm); if (ret != HDF_SUCCESS) { (void)OsalSpinUnlock(&(pwm->lock)); HDF_LOGE("%s: open failed, ret %d", __func__, ret); - return NULL; + return HDF_FAILURE; } } + pwm->busy = true; (void)OsalSpinUnlock(&(pwm->lock)); - return (DevHandle)pwm; + return HDF_SUCCESS; } -void PwmClose(DevHandle handle) +void PwmDevicePut(struct PwmDev *pwm) { int32_t ret; - struct PwmDev *pwm = (struct PwmDev *)handle; - + if (pwm == NULL) { - HDF_LOGE("%s: dev is null", __func__); return; } @@ -85,21 +61,14 @@ void PwmClose(DevHandle handle) (void)OsalSpinUnlock(&(pwm->lock)); } -int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) +int32_t PwmDeviceSetConfig(struct PwmDev *pwm, struct PwmConfig *config) { int32_t ret; - struct PwmDev *pwm = NULL; - - HDF_LOGI("%s: enter.", __func__); - if (handle == NULL) { - HDF_LOGE("%s: handle is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (config == NULL) { - HDF_LOGE("%s: config is NULL", __func__); + + if (pwm == NULL || config == NULL) { return HDF_ERR_INVALID_PARAM; } - pwm = (struct PwmDev *)handle; + if (memcmp(config, &(pwm->cfg), sizeof(*config)) == 0) { HDF_LOGE("%s: do not need to set config", __func__); return HDF_SUCCESS; @@ -116,126 +85,10 @@ int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) return ret; } pwm->cfg = *config; - HDF_LOGI("%s: success.", __func__); return HDF_SUCCESS; } -int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) -{ - struct PwmDev *pwm = NULL; - - HDF_LOGI("%s: enter.", __func__); - if (handle == NULL) { - HDF_LOGE("%s: handle is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - if (config == NULL) { - HDF_LOGE("%s: config is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - pwm = (struct PwmDev *)handle; - *config = pwm->cfg; - HDF_LOGI("%s: success.", __func__); - - return HDF_SUCCESS; -} - -int32_t PwmEnable(DevHandle handle) -{ - struct PwmConfig config; - uint32_t curValue; - int32_t ret; - - HDF_LOGI("%s: enter.", __func__); - if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { - return HDF_FAILURE; - } - curValue = config.status; - config.status = PWM_ENABLE_STATUS; - ret = PwmSetConfig(handle, &config); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); - } - return ret; -} - -int32_t PwmDisable(DevHandle handle) -{ - struct PwmConfig config; - uint32_t curValue; - int32_t ret; - - HDF_LOGI("%s: enter.", __func__); - if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { - return HDF_FAILURE; - } - curValue = config.status; - config.status = PWM_DISABLE_STATUS; - ret = PwmSetConfig(handle, &config); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); - } - return ret; -} - -int32_t PwmSetPeriod(DevHandle handle, uint32_t period) -{ - struct PwmConfig config; - uint32_t curValue; - int32_t ret; - - HDF_LOGI("%s: enter.", __func__); - if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { - return HDF_FAILURE; - } - curValue = config.period; - config.period = period; - ret = PwmSetConfig(handle, &config); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success. period: %d -> %d.", __func__, curValue, config.period); - } - return ret; -} - -int32_t PwmSetDuty(DevHandle handle, uint32_t duty) -{ - struct PwmConfig config; - uint32_t curValue; - int32_t ret; - - HDF_LOGI("%s: enter.", __func__); - if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { - return HDF_FAILURE; - } - curValue = config.duty; - config.duty = duty; - ret = PwmSetConfig(handle, &config); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success. duty: %d -> %d.", __func__, curValue, config.duty); - } - return ret; -} - -int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity) -{ - struct PwmConfig config; - uint32_t curValue; - int32_t ret; - - HDF_LOGI("%s: enter.", __func__); - if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { - return HDF_FAILURE; - } - curValue = config.polarity; - config.polarity = polarity; - ret = PwmSetConfig(handle, &config); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success. polarity: %d -> %d.", __func__, curValue, config.polarity); - } - return ret; -} - int32_t PwmSetPriv(struct PwmDev *pwm, void *priv) { if (pwm == NULL) { diff --git a/support/platform/src/pwm/pwm_if.c b/support/platform/src/pwm/pwm_if.c new file mode 100755 index 000000000..1a3c9c3cf --- /dev/null +++ b/support/platform/src/pwm/pwm_if.c @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "osal_mem.h" +#include "pwm_core.h" +#include "securec.h" + +#define HDF_LOG_TAG pwm_if +#define PWM_NAME_LEN 32 + +static void *PwmGetDevByNum(uint32_t num) +{ + int32_t ret; + char *name = NULL; + void *pwm = NULL; + + name = (char *)OsalMemCalloc(PWM_NAME_LEN + 1); + if (name == NULL) { + return NULL; + } + ret = snprintf_s(name, PWM_NAME_LEN + 1, PWM_NAME_LEN, "HDF_PLATFORM_PWM_%u", num); + if (ret < 0) { + HDF_LOGE("%s: snprintf_s failed", __func__); + OsalMemFree(name); + return NULL; + } + pwm = (void *)DevSvcManagerClntGetService(name); + OsalMemFree(name); + return pwm; +} + +DevHandle PwmOpen(uint32_t num) +{ + int32_t ret; + void *pwm = PwmGetDevByNum(num); + + if (pwm == NULL) { + HDF_LOGE("%s: dev is null", __func__); + return NULL; + } + + ret = PwmDeviceGet((struct PwmDev *)pwm); + if(ret != HDF_SUCCESS) { + HDF_LOGE("%s: PwmDeviceGet failed, ret: %d", __func__, ret); + return NULL; + } + return (DevHandle)pwm; +} + +void PwmClose(DevHandle handle) +{ + if (handle == NULL) { + HDF_LOGE("%s: dev is null", __func__); + return; + } + + PwmDevicePut((struct PwmDev *)handle); +} + +int32_t PwmSetPeriod(DevHandle handle, uint32_t period) +{ + struct PwmConfig config; + uint32_t curValue; + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { + return HDF_FAILURE; + } + curValue = config.period; + config.period = period; + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. period: %d -> %d.", __func__, curValue, config.period); + } + return ret; +} + +int32_t PwmSetDuty(DevHandle handle, uint32_t duty) +{ + struct PwmConfig config; + uint32_t curValue; + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { + return HDF_FAILURE; + } + curValue = config.duty; + config.duty = duty; + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. duty: %d -> %d.", __func__, curValue, config.duty); + } + return ret; +} + +int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity) +{ + struct PwmConfig config; + uint32_t curValue; + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { + return HDF_FAILURE; + } + curValue = config.polarity; + config.polarity = polarity; + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. polarity: %d -> %d.", __func__, curValue, config.polarity); + } + return ret; +} + +int32_t PwmEnable(DevHandle handle) +{ + struct PwmConfig config; + uint32_t curValue; + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { + return HDF_FAILURE; + } + curValue = config.status; + config.status = PWM_ENABLE_STATUS; + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); + } + return ret; +} + +int32_t PwmDisable(DevHandle handle) +{ + struct PwmConfig config; + uint32_t curValue; + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (PwmGetConfig(handle, &config) != HDF_SUCCESS) { + return HDF_FAILURE; + } + curValue = config.status; + config.status = PWM_DISABLE_STATUS; + ret = PwmSetConfig(handle, &config); + if (ret == HDF_SUCCESS) { + HDF_LOGI("%s: success. enable: %d -> %d.", __func__, curValue, config.status); + } + return ret; +} + +int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) +{ + int32_t ret; + + HDF_LOGI("%s: enter.", __func__); + if (handle == NULL) { + HDF_LOGE("%s: handle is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (config == NULL) { + HDF_LOGE("%s: config is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + + ret = PwmDeviceSetConfig(handle, config); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: PwmSetConfig failed, ret: %d", __func__, ret); + } + + HDF_LOGI("%s: success.", __func__); + return HDF_SUCCESS; +} + +int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) +{ + struct PwmDev *pwm = NULL; + + HDF_LOGI("%s: enter.", __func__); + if (handle == NULL) { + HDF_LOGE("%s: handle is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + if (config == NULL) { + HDF_LOGE("%s: config is NULL", __func__); + return HDF_ERR_INVALID_PARAM; + } + pwm = (struct PwmDev *)handle; + *config = pwm->cfg; + HDF_LOGI("%s: success.", __func__); + + return HDF_SUCCESS; +} \ No newline at end of file -- Gitee From bb3a4e7ea160d577e120162a2754556e8bd5fc6f Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Mon, 6 Dec 2021 17:03:20 +0800 Subject: [PATCH 246/272] fix: clear codex in framework Signed-off-by: YOUR_NAME --- core/common/src/hdf_attribute.c | 9 +-------- core/host/src/devsvc_manager_clnt.c | 4 ---- core/host/src/hdf_device.c | 2 +- core/host/src/hdf_device_object.c | 4 +++- core/host/src/hdf_driver_loader.c | 1 - core/manager/src/devmgr_service.c | 7 ++++++- core/manager/src/devsvc_manager.c | 2 +- core/manager/src/hdf_driver_installer.c | 2 -- test/unittest/manager/sample_driver_test.c | 4 +++- tools/hc-gen/src/macro_gen.cpp | 16 +++++++++++----- tools/hc-gen/src/macro_gen.h | 3 +++ 11 files changed, 29 insertions(+), 25 deletions(-) diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index d404c8992..f9c334bee 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -8,16 +8,9 @@ #include "hdf_attribute_manager.h" #include "devhost_service_clnt.h" -#include "devmgr_service.h" -#include "hcs_blob_if.h" -#include "hcs_parser.h" #include "hcs_tree_if.h" -#include "hdf_base.h" -#include "hdf_device_info.h" #include "hdf_host_info.h" #include "hdf_log.h" -#include "osal_mem.h" -#include "securec.h" #ifdef LOSCFG_DRIVERS_HDF_USB_PNP_NOTIFY #include "usb_pnp_manager.h" #endif @@ -243,4 +236,4 @@ int HdfAttributeManagerGetDeviceList(struct DevHostServiceClnt *hostClnt) } return HDF_SUCCESS; -} +} \ No newline at end of file diff --git a/core/host/src/devsvc_manager_clnt.c b/core/host/src/devsvc_manager_clnt.c index 87bc0cff2..e2309184c 100644 --- a/core/host/src/devsvc_manager_clnt.c +++ b/core/host/src/devsvc_manager_clnt.c @@ -7,10 +7,6 @@ */ #include "devsvc_manager_clnt.h" -#include "devmgr_service.h" -#include "devsvc_manager.h" -#include "hdf_attribute_manager.h" -#include "hdf_base.h" #include "hdf_log.h" #include "hdf_object_manager.h" diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index cce70f4b9..0f9b2fb65 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -31,7 +31,7 @@ static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *dev // for dynamic added device node, assign device id here if (devNode->devId == 0) { devNode->devId = MK_DEVID(HOSTID(device->deviceId), DEVICEID(device->deviceId), - DlistGetCount(&device->devNodes)); + (uint32_t)DlistGetCount(&device->devNodes)); devNode->token->devid = devNode->devId; } diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index 9a805af16..e8238478a 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -190,7 +190,9 @@ int HdfDeviceObjectRegister(struct HdfDeviceObject *dev) struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); struct IDriverLoader *driverLoader = HdfDriverLoaderGetInstance(); - if (dev == NULL || devNode->driverName == NULL || devNode->device == NULL) { + if (dev == NULL || devNode->driverName == NULL || devNode->device == NULL || driverLoader == NULL || + driverLoader->GetDriver == NULL) { + HDF_LOGE("failed to add device, param invalid"); return HDF_ERR_INVALID_PARAM; } diff --git a/core/host/src/hdf_driver_loader.c b/core/host/src/hdf_driver_loader.c index d7d06f63b..9ce739227 100755 --- a/core/host/src/hdf_driver_loader.c +++ b/core/host/src/hdf_driver_loader.c @@ -19,7 +19,6 @@ int32_t HdfDriverEntryConstruct() struct HdfDriverEntry *driverEntry = NULL; size_t *addrBegin = NULL; int32_t count = (int32_t)(((uint8_t *)(HDF_DRIVER_END()) - (uint8_t *)(HDF_DRIVER_BEGIN())) / sizeof(size_t)); - if (count <= 0) { HDF_LOGE("%s: no hdf driver exist", __func__); return HDF_FAILURE; diff --git a/core/manager/src/devmgr_service.c b/core/manager/src/devmgr_service.c index 358b8956f..674ccc2b2 100644 --- a/core/manager/src/devmgr_service.c +++ b/core/manager/src/devmgr_service.c @@ -267,6 +267,7 @@ static int DevmgrServiceStartDeviceHost(struct DevmgrService *devmgr, struct Hdf static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) { + uint32_t ret; struct HdfSList hostList; struct HdfSListIterator it; struct HdfHostInfo *hostAttr = NULL; @@ -279,7 +280,11 @@ static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) HdfSListIteratorInit(&it, &hostList); while (HdfSListIteratorHasNext(&it)) { hostAttr = (struct HdfHostInfo *)HdfSListIteratorNext(&it); - DevmgrServiceStartDeviceHost(inst, hostAttr); + ret = DevmgrServiceStartDeviceHost(inst, hostAttr); + if (ret != HDF_SUCCESS) { + HDF_LOGW("%s failed to start device host, host id is %u, host name is '%s'", + __func__, hostAttr->hostId, hostAttr->hostName); + } } HdfSListFlush(&hostList, HdfHostInfoDelete); return HDF_SUCCESS; diff --git a/core/manager/src/devsvc_manager.c b/core/manager/src/devsvc_manager.c index 06e69de9e..3c08149c2 100644 --- a/core/manager/src/devsvc_manager.c +++ b/core/manager/src/devsvc_manager.c @@ -66,7 +66,7 @@ int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *svcName, st int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcName, struct SubscriberCallback callBack) { - struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance();; + struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); struct HdfObject *deviceService = NULL; if (inst == NULL || svcName == NULL || devMgrSvc == NULL) { return HDF_FAILURE; diff --git a/core/manager/src/hdf_driver_installer.c b/core/manager/src/hdf_driver_installer.c index 655c67595..b972ce743 100644 --- a/core/manager/src/hdf_driver_installer.c +++ b/core/manager/src/hdf_driver_installer.c @@ -6,10 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_attribute_manager.h" #include "hdf_driver_installer.h" #include "devhost_service.h" -#include "hdf_base.h" #include "hdf_log.h" #include "hdf_object_manager.h" diff --git a/test/unittest/manager/sample_driver_test.c b/test/unittest/manager/sample_driver_test.c index b0a696993..04e4ceb50 100644 --- a/test/unittest/manager/sample_driver_test.c +++ b/test/unittest/manager/sample_driver_test.c @@ -11,6 +11,7 @@ #include "hdf_device_object.h" #include "hdf_log.h" #include "hdf_pm.h" +#include "osal_file.h" #include "osal_mem.h" #define HDF_LOG_TAG sample_driver_test @@ -97,7 +98,8 @@ int32_t SampleDriverRegisterDevice(struct HdfDeviceObject *dev, struct HdfSBuf * return HDF_FAILURE; } - ret = HdfDeviceObjectPublishService(devObj, serviceName, SERVICE_POLICY_CAPACITY, 0664); + ret = HdfDeviceObjectPublishService(devObj, serviceName, SERVICE_POLICY_CAPACITY, + OSAL_S_IREAD | OSAL_S_IWRITE | OSAL_S_IRGRP | OSAL_S_IWGRP | OSAL_S_IROTH); if (ret != HDF_SUCCESS) { HDF_LOGE("faild to publish service for %s", serviceName); HdfDeviceObjectRelease(devObj); diff --git a/tools/hc-gen/src/macro_gen.cpp b/tools/hc-gen/src/macro_gen.cpp index b8c6ad7ff..4858a0a20 100755 --- a/tools/hc-gen/src/macro_gen.cpp +++ b/tools/hc-gen/src/macro_gen.cpp @@ -241,11 +241,7 @@ void MacroGen::SetTypeData(uint32_t type, const std::shared_ptr &curr case PARSEROP_UINT16: case PARSEROP_UINT32: case PARSEROP_UINT64: { - if (arraySize != 0) { - GenArray(arrayName, arraySize, arrayType, current); - } else { - ofs_ << " " << current->IntegerValue() << std::endl; - } + SetTypeDataUinit64(arrayName, arraySize, arrayType, current); break; } case PARSEROP_STRING: @@ -284,3 +280,13 @@ void MacroGen::SetTypeData(uint32_t type, const std::shared_ptr &curr break; } } + +void MacroGen::SetTypeDataUinit64(const std::string &arrayName, uint32_t &arraySize, uint32_t arrayType, + const std::shared_ptr ¤t) +{ + if (arraySize != 0) { + GenArray(arrayName, arraySize, arrayType, current); + } else { + ofs_ << " " << current->IntegerValue() << std::endl; + } +} \ No newline at end of file diff --git a/tools/hc-gen/src/macro_gen.h b/tools/hc-gen/src/macro_gen.h index af5574940..9325d3e1a 100755 --- a/tools/hc-gen/src/macro_gen.h +++ b/tools/hc-gen/src/macro_gen.h @@ -36,6 +36,9 @@ private: void SetTypeData(uint32_t type, const std::shared_ptr ¤t, uint32_t &arraySize, uint32_t depth); + void SetTypeDataUinit64(const std::string &arrayName, uint32_t &arraySize, uint32_t arrayType, + const std::shared_ptr ¤t); + bool HeaderTopOutput(); bool HeaderBottomOutput(); -- Gitee From 1beab5a5c82815d58b7cc784a0230f87416aad04 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 7 Dec 2021 14:40:26 +0800 Subject: [PATCH 247/272] fix:fix sensor controller module codex Signed-off-by: kevin --- model/sensor/driver/chipset/als/als_bh1745.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index c17d8b0e8..a24aa7ced 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -72,14 +72,14 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa return HDF_FAILURE; } - if ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX || - rgbcData[ALS_G] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX ) && temp >= BH1745_TIME_320MSEC) { + if (((rgbcData[ALS_R] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX) || + (rgbcData[ALS_G] * BH1745_MULTIPLE_100 > BH1745_TIME_MAX)) && (temp >= BH1745_TIME_320MSEC)) { g_timeMap_flag = 1; index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); index--; WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); } else if ((g_timeMap_flag == 1) && ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN) || - (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { + (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { g_timeMap_flag = 0; index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); index++; -- Gitee From 889f33e545f2f4b142a8ea96aba8cae1b7f638b7 Mon Sep 17 00:00:00 2001 From: s00442234 Date: Wed, 8 Dec 2021 14:45:08 +0800 Subject: [PATCH 248/272] replace keyword slave Signed-off-by: s00442234 --- include/platform/i2s_if.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) mode change 100644 => 100755 include/platform/i2s_if.h diff --git a/include/platform/i2s_if.h b/include/platform/i2s_if.h old mode 100644 new mode 100755 index a5106c689..bbb67caa8 --- a/include/platform/i2s_if.h +++ b/include/platform/i2s_if.h @@ -74,8 +74,8 @@ enum I2sWordWidth { enum I2sMode { I2S_MODE_MASTER_TX_MODE, I2S_MODE_MASTER_RX_MODE, - I2S_MODE_SLAVE_TX_MODE, - I2S_MODE_SLAVE_RX_MODE, + I2S_MODE_STANDBY_TX_MODE, + I2S_MODE_STANDBY_RX_MODE, }; enum I2sLoopMode { @@ -142,7 +142,7 @@ enum I2slFsSel { struct I2sCfg { enum I2sSampleRate sampleRate; /**< I2S sample rate, 8k,16k,32k... */ enum I2sWordWidth width; /**< I2S word width, 8bit,16bit,20bit,24bit... */ - enum I2sMode mode; /**< I2S mode, master/slave, tx/rx */ + enum I2sMode mode; /**< I2S mode, master/standby, tx/rx */ enum I2sPcmFscDelay syncMode; /**< pcm mode, FSC starts location */ enum I2sLoopMode loopMode; /**< is loopback */ enum I2sProtocolType type; /**< I2S protocol type */ -- Gitee From 45f69c2671ce32804ce57da7209e8c9f281637e6 Mon Sep 17 00:00:00 2001 From: chenchong Date: Wed, 8 Dec 2021 19:16:08 +0800 Subject: [PATCH 249/272] fix: The barometer data is not coming up Signed-off-by: chenchong --- model/sensor/driver/common/src/sensor_config_controller.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index ab1d89b1c..2b1b86249 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -221,7 +221,12 @@ int32_t SetSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorReg struct SensorRegCfg *cfgItem = NULL; CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); - CHECK_NULL_PTR_RETURN_VALUE(group, HDF_FAILURE); + + if (group == NULL) { + HDF_LOGI("%s: Pointer group is null", __func__); + return HDF_SUCCESS; + } + CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_FAILURE); count = sizeof(g_doOpsCall) / sizeof(g_doOpsCall[0]); -- Gitee From 6831c7d96f09aeb685ea3d0be661e5a0eeecbe99 Mon Sep 17 00:00:00 2001 From: yue Date: Thu, 9 Dec 2021 15:09:17 +0800 Subject: [PATCH 250/272] fix:modify make clean and header file order Signed-off-by: yue --- tools/hdi-gen/BUILD.gn | 4 +- tools/hdi-gen/Makefile | 58 ++++--- tools/hdi-gen/MakefileLinux | 140 +++++++++-------- tools/hdi-gen/MakefileWin | 142 +++++++++--------- tools/hdi-gen/build_hdi_files.py | 16 +- .../codegen/c_client_proxy_code_emitter.cpp | 33 ++-- .../codegen/c_client_proxy_code_emitter.h | 2 +- tools/hdi-gen/codegen/c_code_emitter.cpp | 9 ++ tools/hdi-gen/codegen/c_code_emitter.h | 3 +- .../codegen/c_custom_types_code_emitter.cpp | 29 +++- .../codegen/c_custom_types_code_emitter.h | 4 +- .../codegen/c_interface_code_emitter.cpp | 16 +- .../codegen/c_interface_code_emitter.h | 2 + .../codegen/c_service_driver_code_emitter.cpp | 23 ++- .../codegen/c_service_driver_code_emitter.h | 2 + .../codegen/c_service_impl_code_emitter.cpp | 38 ++++- .../codegen/c_service_impl_code_emitter.h | 6 +- .../codegen/c_service_stub_code_emitter.cpp | 70 +++++---- .../codegen/c_service_stub_code_emitter.h | 8 +- tools/hdi-gen/codegen/code_emitter.cpp | 2 - tools/hdi-gen/codegen/code_emitter.h | 48 ++++++ .../codegen/cpp_client_proxy_code_emitter.cpp | 46 ++++-- .../codegen/cpp_client_proxy_code_emitter.h | 6 +- tools/hdi-gen/codegen/cpp_code_emitter.cpp | 49 +++++- tools/hdi-gen/codegen/cpp_code_emitter.h | 4 + .../codegen/cpp_custom_types_code_emitter.cpp | 68 +++------ .../codegen/cpp_custom_types_code_emitter.h | 6 +- .../codegen/cpp_interface_code_emitter.cpp | 61 ++------ .../codegen/cpp_interface_code_emitter.h | 6 +- .../cpp_service_driver_code_emitter.cpp | 2 +- .../codegen/cpp_service_impl_code_emitter.cpp | 28 +++- .../codegen/cpp_service_impl_code_emitter.h | 4 + .../codegen/cpp_service_stub_code_emitter.cpp | 51 ++++--- .../codegen/cpp_service_stub_code_emitter.h | 4 +- tools/hdi-gen/util/options.cpp | 15 +- tools/hdi-gen/util/options.h | 10 +- tools/hdi-gen/util/string.cpp | 17 +++ tools/hdi-gen/util/string.h | 2 + 38 files changed, 621 insertions(+), 413 deletions(-) diff --git a/tools/hdi-gen/BUILD.gn b/tools/hdi-gen/BUILD.gn index f2892d4ea..bc63e124e 100755 --- a/tools/hdi-gen/BUILD.gn +++ b/tools/hdi-gen/BUILD.gn @@ -2,7 +2,7 @@ # # HDF is dual licensed: you can use it either under the terms of # the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. +# See the LICENSE file in the root of this repository for complete details. action("build_hdi_gen") { script = "/usr/bin/env" @@ -17,6 +17,6 @@ action("build_hdi_gen") { "-j8", "-C", rebase_path("."), - "OUT_DIR=" + rebase_path(target_out_dir), + "TARGET_DIR=" + rebase_path(target_out_dir), ] } diff --git a/tools/hdi-gen/Makefile b/tools/hdi-gen/Makefile index 538367888..033c25757 100755 --- a/tools/hdi-gen/Makefile +++ b/tools/hdi-gen/Makefile @@ -1,25 +1,35 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -export OUT_DIR:=. -export TARGET:=$(OUT_DIR)/hdi-gen -export CXXFLAGS = -std=c++14 -O2 -w -export Q := @ -export MAKEFLAGS += --no-print-directory - -MAKE_FILE_NAME = MakefileLinux -ifeq ($(findstring ;, $(PATH)), ;) - MAKE_FILE_NAME := MakefileWin -endif - -all: - $(Q) echo start build $(TARGET) ... - $(Q) $(MAKE) -f $(MAKE_FILE_NAME) - -clean: - $(Q) $(MAKE) -f $(MAKE_FILE_NAME) clean - +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +ifeq ($(findstring ;, $(PATH)), ;) + export PWD:=$(subst /,\, $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))) + export TARGET_DIR := $(PWD) + export BUILD_DIR:=$(TARGET_DIR)\build + export TARGET:=$(TARGET_DIR)\hdi-gen.exe +else + export PWD := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) + export TARGET_DIR := $(PWD) + export BUILD_DIR = $(TARGET_DIR)/build + export TARGET:=$(TARGET_DIR)/hdi-gen +endif + +export CXXFLAGS = -std=c++14 -O2 -w +export Q := @ +export MAKEFLAGS += --no-print-directory + +MAKE_FILE_NAME = MakefileLinux +ifeq ($(findstring ;, $(PATH)), ;) + MAKE_FILE_NAME := MakefileWin +endif + +all: + $(Q) echo start build $(TARGET) ... + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) + +clean: + $(Q) $(MAKE) -f $(MAKE_FILE_NAME) clean + .PHONY: clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileLinux b/tools/hdi-gen/MakefileLinux index 6d5eac498..fe4bccf5a 100755 --- a/tools/hdi-gen/MakefileLinux +++ b/tools/hdi-gen/MakefileLinux @@ -1,72 +1,70 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -PWD := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) -BUILD_DIR = $(PWD)/build -BOUNDS_CHECK_DIR := $(abspath ../../../../third_party/bounds_checking_function) -INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_DIR)/include - -CODEGEN_SOURCE_DIR := $(PWD)/codegen -CODEGEN_SOURCE := $(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) -CODEGEN_OBJ_DIR := $(BUILD_DIR)/codegen -CODEGEN_OBJS := $(addprefix $(CODEGEN_OBJ_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) - -PARSER_SOURCE_DIR := $(PWD)/parser -PARSER_SOURCE := $(wildcard $(PARSER_SOURCE_DIR)/*.cpp) -PARSER_OBJS_DIR := $(BUILD_DIR)/parser -PARSER_OBJS := $(addprefix $(PARSER_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) - -AST_SOURCE_DIR := $(PWD)/ast -AST_SOURCE := $(wildcard $(AST_SOURCE_DIR)/*.cpp) -AST_OBJS_DIR := $(BUILD_DIR)/ast -AST_OBJS := $(addprefix $(AST_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) - -UTIL_SOURCE_DIR := $(PWD)/util -UTIL_SOURCE := $(wildcard $(UTIL_SOURCE_DIR)/*.cpp) -UTIL_OBJS_DIR := $(BUILD_DIR)/util -UTIL_OBJS := $(addprefix $(UTIL_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) - -BOUNDS_CHECK_SOURCE_DIR := $(abspath ../../../../third_party/bounds_checking_function/src) -BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) -BOUNDS_CHECK_OBJS_DIR := $(BUILD_DIR)/bounds_checking_function -BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_OBJS_DIR)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) - -MAIN_SOURCE := $(wildcard *.cpp) -MAIN_OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) - -all:$(TARGET) -$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ - $(Q) echo $(TARGET):build successful. - -$(BUILD_DIR)/%.o : %.cpp - $(Q) mkdir -p $(BUILD_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(CODEGEN_OBJ_DIR)/%.o : $(CODEGEN_SOURCE_DIR)/%.cpp - $(Q) mkdir -p $(CODEGEN_OBJ_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(PARSER_OBJS_DIR)/%.o : $(PARSER_SOURCE_DIR)/%.cpp - $(Q) mkdir -p $(PARSER_OBJS_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(AST_OBJS_DIR)/%.o : $(AST_SOURCE_DIR)/%.cpp - $(Q) mkdir -p $(AST_OBJS_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(UTIL_OBJS_DIR)/%.o : $(UTIL_SOURCE_DIR)/%.cpp - $(Q) mkdir -p $(UTIL_OBJS_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(BOUNDS_CHECK_OBJS_DIR)/%.o : $(BOUNDS_CHECK_SOURCE_DIR)/%.c - $(Q) mkdir -p $(BOUNDS_CHECK_OBJS_DIR) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -clean: - $(Q) rm -rf $(TARGET) $(BUILD_DIR) - +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +BOUNDS_CHECK_DIR := $(abspath ../../../../third_party/bounds_checking_function) +INCLUDES = -I$(PWD) -I$(BOUNDS_CHECK_DIR)/include + +CODEGEN_SOURCE_DIR := $(PWD)/codegen +CODEGEN_SOURCE := $(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR := $(BUILD_DIR)/codegen +CODEGEN_OBJS := $(addprefix $(CODEGEN_OBJ_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR := $(PWD)/parser +PARSER_SOURCE := $(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR := $(BUILD_DIR)/parser +PARSER_OBJS := $(addprefix $(PARSER_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR := $(PWD)/ast +AST_SOURCE := $(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR := $(BUILD_DIR)/ast +AST_OBJS := $(addprefix $(AST_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR := $(PWD)/util +UTIL_SOURCE := $(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR := $(BUILD_DIR)/util +UTIL_OBJS := $(addprefix $(UTIL_OBJS_DIR)/, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR := $(abspath ../../../../third_party/bounds_checking_function/src) +BOUNDS_CHECK_SOURCE := $(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR := $(BUILD_DIR)/bounds_checking_function +BOUNDS_CHECK_OBJS := $(addprefix $(BOUNDS_CHECK_OBJS_DIR)/, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE := $(wildcard *.cpp) +MAIN_OBJS := $(addprefix $(BUILD_DIR)/, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all:$(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)/%.o : %.cpp + $(Q) mkdir -p $(BUILD_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)/%.o : $(CODEGEN_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(CODEGEN_OBJ_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)/%.o : $(PARSER_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(PARSER_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)/%.o : $(AST_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(AST_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)/%.o : $(UTIL_SOURCE_DIR)/%.cpp + $(Q) mkdir -p $(UTIL_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)/%.o : $(BOUNDS_CHECK_SOURCE_DIR)/%.c + $(Q) mkdir -p $(BOUNDS_CHECK_OBJS_DIR) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) rm -rf $(TARGET) $(BUILD_DIR) + .PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/MakefileWin b/tools/hdi-gen/MakefileWin index 51c1e8156..c9ef65b68 100755 --- a/tools/hdi-gen/MakefileWin +++ b/tools/hdi-gen/MakefileWin @@ -1,73 +1,71 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -PWD:=$(subst /,\, $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))) -BUILD_DIR:=$(PWD)\build -BOUNDS_CHECK_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function) -INCLUDES:=-I $(PWD) -I $(BOUNDS_CHECK_DIR)\include - -CODEGEN_SOURCE_DIR:=$(PWD)\codegen -CODEGEN_SOURCE:=$(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) -CODEGEN_OBJ_DIR:=$(BUILD_DIR)\codegen -CODEGEN_OBJS:=$(addprefix $(CODEGEN_OBJ_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) - -PARSER_SOURCE_DIR:=$(PWD)\parser -PARSER_SOURCE:=$(wildcard $(PARSER_SOURCE_DIR)/*.cpp) -PARSER_OBJS_DIR:=$(BUILD_DIR)\parser -PARSER_OBJS:=$(addprefix $(PARSER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) - -AST_SOURCE_DIR:=$(PWD)\ast -AST_SOURCE:=$(wildcard $(AST_SOURCE_DIR)/*.cpp) -AST_OBJS_DIR:=$(BUILD_DIR)\ast -AST_OBJS:=$(addprefix $(AST_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) - -UTIL_SOURCE_DIR:=$(PWD)\util -UTIL_SOURCE:=$(wildcard $(UTIL_SOURCE_DIR)/*.cpp) -UTIL_OBJS_DIR:=$(BUILD_DIR)\util -UTIL_OBJS:=$(addprefix $(UTIL_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) - -BOUNDS_CHECK_SOURCE_DIR:=$(abspath ..\..\..\..\third_party\bounds_checking_function\src) -BOUNDS_CHECK_SOURCE:=$(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) -BOUNDS_CHECK_OBJS_DIR:=$(BUILD_DIR)\bounds_checking_function -BOUNDS_CHECK_OBJS:=$(addprefix $(BOUNDS_CHECK_OBJS_DIR)\, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) - -MAIN_SOURCE:=$(wildcard *.cpp) -MAIN_OBJS:=$(addprefix $(BUILD_DIR)\, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) - -all : $(TARGET) -$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ - $(Q) echo $(TARGET):build successful. - -$(BUILD_DIR)\\%.o : %.cpp - $(Q) if not exist $(BUILD_DIR) (mkdir $(BUILD_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(CODEGEN_OBJ_DIR)\\%.o : $(CODEGEN_SOURCE_DIR)\\%.cpp - $(Q) if not exist $(CODEGEN_OBJ_DIR) (mkdir $(CODEGEN_OBJ_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(PARSER_OBJS_DIR)\\%.o : $(PARSER_SOURCE_DIR)\\%.cpp - $(Q) if not exist $(PARSER_OBJS_DIR) (mkdir $(PARSER_OBJS_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(AST_OBJS_DIR)\\%.o : $(AST_SOURCE_DIR)\\%.cpp - $(Q) if not exist $(AST_OBJS_DIR) (mkdir $(AST_OBJS_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(UTIL_OBJS_DIR)\\%.o : $(UTIL_SOURCE_DIR)\\%.cpp - $(Q) if not exist $(UTIL_OBJS_DIR) (mkdir $(UTIL_OBJS_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -$(BOUNDS_CHECK_OBJS_DIR)\\%.o : $(BOUNDS_CHECK_SOURCE_DIR)\\%.c - $(Q) if not exist $(BOUNDS_CHECK_OBJS_DIR) (mkdir $(BOUNDS_CHECK_OBJS_DIR)) - $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ - -clean: - $(Q) if exist $(TARGET).exe (del $(TARGET).exe) - $(Q) if exist $(BUILD_DIR) (rd /s /q $(BUILD_DIR)) - +# Copyright (c) 2021 Huawei Device Co., Ltd. +# +# HDF is dual licensed: you can use it either under the terms of +# the GPL, or the BSD license, at your option. +# See the LICENSE file in the root of this repository for complete details. + +BOUNDS_CHECK_DIR:=$(subst /,\, $(abspath ..\..\..\..\third_party\bounds_checking_function)) +INCLUDES:=-I $(PWD) -I $(BOUNDS_CHECK_DIR)\include + +CODEGEN_SOURCE_DIR:=$(PWD)\codegen +CODEGEN_SOURCE:=$(wildcard $(CODEGEN_SOURCE_DIR)/*.cpp) +CODEGEN_OBJ_DIR:=$(BUILD_DIR)\codegen +CODEGEN_OBJS:=$(addprefix $(CODEGEN_OBJ_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(CODEGEN_SOURCE)))) + +PARSER_SOURCE_DIR:=$(PWD)\parser +PARSER_SOURCE:=$(wildcard $(PARSER_SOURCE_DIR)/*.cpp) +PARSER_OBJS_DIR:=$(BUILD_DIR)\parser +PARSER_OBJS:=$(addprefix $(PARSER_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(PARSER_SOURCE)))) + +AST_SOURCE_DIR:=$(PWD)\ast +AST_SOURCE:=$(wildcard $(AST_SOURCE_DIR)/*.cpp) +AST_OBJS_DIR:=$(BUILD_DIR)\ast +AST_OBJS:=$(addprefix $(AST_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(AST_SOURCE)))) + +UTIL_SOURCE_DIR:=$(PWD)\util +UTIL_SOURCE:=$(wildcard $(UTIL_SOURCE_DIR)/*.cpp) +UTIL_OBJS_DIR:=$(BUILD_DIR)\util +UTIL_OBJS:=$(addprefix $(UTIL_OBJS_DIR)\, $(patsubst %.cpp, %.o, $(notdir $(UTIL_SOURCE)))) + +BOUNDS_CHECK_SOURCE_DIR:=$(subst /,\, $(abspath ..\..\..\..\third_party\bounds_checking_function\src)) +BOUNDS_CHECK_SOURCE:=$(wildcard $(BOUNDS_CHECK_SOURCE_DIR)/*.c) +BOUNDS_CHECK_OBJS_DIR:=$(BUILD_DIR)\bounds_checking_function +BOUNDS_CHECK_OBJS:=$(addprefix $(BOUNDS_CHECK_OBJS_DIR)\, $(patsubst %.c, %.o, $(notdir $(BOUNDS_CHECK_SOURCE)))) + +MAIN_SOURCE:=$(wildcard *.cpp) +MAIN_OBJS:=$(addprefix $(BUILD_DIR)\, $(patsubst %.cpp, %.o, $(MAIN_SOURCE))) + +all : $(TARGET) +$(TARGET) : $(BOUNDS_CHECK_OBJS) $(UTIL_OBJS) $(AST_OBJS) $(PARSER_OBJS) $(CODEGEN_OBJS) $(MAIN_OBJS) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $@ + $(Q) echo $(TARGET):build successful. + +$(BUILD_DIR)\\%.o : %.cpp + $(Q) if not exist $(BUILD_DIR) (mkdir $(BUILD_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(CODEGEN_OBJ_DIR)\\%.o : $(CODEGEN_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(CODEGEN_OBJ_DIR) (mkdir $(CODEGEN_OBJ_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(PARSER_OBJS_DIR)\\%.o : $(PARSER_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(PARSER_OBJS_DIR) (mkdir $(PARSER_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(AST_OBJS_DIR)\\%.o : $(AST_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(AST_OBJS_DIR) (mkdir $(AST_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(UTIL_OBJS_DIR)\\%.o : $(UTIL_SOURCE_DIR)\\%.cpp + $(Q) if not exist $(UTIL_OBJS_DIR) (mkdir $(UTIL_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +$(BOUNDS_CHECK_OBJS_DIR)\\%.o : $(BOUNDS_CHECK_SOURCE_DIR)\\%.c + $(Q) if not exist $(BOUNDS_CHECK_OBJS_DIR) (mkdir $(BOUNDS_CHECK_OBJS_DIR)) + $(Q) $(CXX) $(CXXFLAGS) $(INCLUDES) -c $^ -o $@ + +clean: + $(Q) if exist $(TARGET) (del $(TARGET)) + $(Q) if exist $(BUILD_DIR) (rd /s /q $(BUILD_DIR)) + .PHONY:all clean \ No newline at end of file diff --git a/tools/hdi-gen/build_hdi_files.py b/tools/hdi-gen/build_hdi_files.py index d30e27971..640136b95 100755 --- a/tools/hdi-gen/build_hdi_files.py +++ b/tools/hdi-gen/build_hdi_files.py @@ -69,6 +69,7 @@ def get_idl_file_type(file_path): file.close() return idl_type + def c_interface_file_translate(idl_file, out_dir, part, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -86,7 +87,6 @@ def c_interface_file_translate(idl_file, out_dir, part, outputs): outputs.append(client_proxy_source_file) elif part == "server_lib_source": outputs.append(iface_header_file) - outputs.append(server_driver_source_file) outputs.append(server_stub_header_file) outputs.append(server_stub_source_file) else: @@ -98,6 +98,7 @@ def c_interface_file_translate(idl_file, out_dir, part, outputs): outputs.append(server_impl_header_file) outputs.append(server_impl_source_file) + def c_callback_file_translate(idl_file, out_dir, part, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -124,6 +125,7 @@ def c_callback_file_translate(idl_file, out_dir, part, outputs): outputs.append(server_impl_header_file) outputs.append(server_impl_source_file) + def c_types_file_translate(idl_file, out_dir, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -134,6 +136,7 @@ def c_types_file_translate(idl_file, out_dir, outputs): outputs.append(types_header_file) outputs.append(types_source_file) + def c_idl_translate(idl_files, out_dir): outputs = [] for idl_file in idl_files: @@ -146,6 +149,7 @@ def c_idl_translate(idl_files, out_dir): c_types_file_translate(idl_file, out_dir, outputs) return outputs + def cpp_interface_file_translate(idl_file, out_dir, part, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -165,7 +169,6 @@ def cpp_interface_file_translate(idl_file, out_dir, part, outputs): outputs.append(client_proxy_source_file) elif part == "server_lib_source": outputs.append(iface_header_file) - outputs.append(server_driver_source_file) outputs.append(server_stub_header_file) outputs.append(server_stub_source_file) else: @@ -178,6 +181,7 @@ def cpp_interface_file_translate(idl_file, out_dir, part, outputs): outputs.append(server_impl_header_file) outputs.append(server_impl_source_file) + def cpp_callback_file_translate(idl_file, out_dir, part, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -207,6 +211,7 @@ def cpp_callback_file_translate(idl_file, out_dir, part, outputs): outputs.append(server_impl_header_file) outputs.append(server_impl_source_file) + def cpp_types_file_translate(idl_file, out_dir, outputs): file = idl_file.split("/")[-1] file_name = translate_file_name(file.split(".")[0]) @@ -217,6 +222,7 @@ def cpp_types_file_translate(idl_file, out_dir, outputs): outputs.append(types_header_file) outputs.append(types_source_file) + def cpp_idl_translate(idl_files, out_dir): outputs = [] for idl_file in idl_files: @@ -229,6 +235,7 @@ def cpp_idl_translate(idl_files, out_dir): cpp_types_file_translate(idl_file, out_dir, outputs) return outputs + def idl_translate(idl_files, language, out_dir): outputs = [] if language == "c": @@ -237,6 +244,7 @@ def idl_translate(idl_files, language, out_dir): outputs = cpp_idl_translate(idl_files, out_dir) return outputs + def c_get_compile_source_file(idl_files, out_dir, part): outputs = [] for idl_file in idl_files: @@ -249,6 +257,7 @@ def c_get_compile_source_file(idl_files, out_dir, part): c_types_file_translate(idl_file, out_dir, outputs) return outputs + def cpp_get_compile_source_file(idl_files, out_dir, part): outputs = [] for idl_file in idl_files: @@ -261,6 +270,7 @@ def cpp_get_compile_source_file(idl_files, out_dir, part): cpp_types_file_translate(idl_file, out_dir, outputs) return outputs + def get_compile_source_file(idl_files, language, out_dir, part): outputs = [] if language == "c": @@ -269,6 +279,7 @@ def get_compile_source_file(idl_files, language, out_dir, part): outputs = cpp_get_compile_source_file(idl_files, out_dir, part) return outputs + def main(argv): outputs = [] if len(argv) < 4: @@ -288,5 +299,6 @@ def main(argv): sys.stdout.write('\n'.join(outputs)) + if __name__ == "__main__": main(sys.argv) \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index d281390a7..d325f6a55 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -79,32 +79,37 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() void CClientProxyCodeEmitter::EmitProxyInclusions(StringBuilder& sb) { - EmitProxyStdlibInclusions(sb); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); -} + HeaderFile::HeaderFileSet headerFiles; -void CClientProxyCodeEmitter::EmitProxyStdlibInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - if (!isCallbackInterface() && !isKernelCode_) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_))); + GetHeaderOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); } +} - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); +void CClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); if (isKernelCode_) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_io_service_if")); } else { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "servmgr_hdi")); + if (!isCallbackInterface()) { + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_dlist")); + } } const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 1b97e442d..0c0c6448f 100755 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -29,7 +29,7 @@ private: void EmitProxyInclusions(StringBuilder& sb); - void EmitProxyStdlibInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitProxyCallMethodImpl(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index 1845cb523..6bed30670 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -47,6 +47,15 @@ void CCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb) sb.Append("};\n"); } +void CCodeEmitter::GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + for (const auto& importPair : ast_->GetImports()) { + AutoPtr importAst = importPair.second; + String fileName = FileName(importAst->GetFullName()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(importAst->GetFullName()))); + } +} + void CCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index f9cabda3e..0ed14fa08 100755 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -9,7 +9,6 @@ #ifndef OHOS_HDI_C_CODE_EMITTER_H #define OHOS_HDI_C_CODE_EMITTER_H -#include #include "ast/ast.h" #include "codegen/code_emitter.h" #include "util/autoptr.h" @@ -26,6 +25,8 @@ public: protected: void EmitInterfaceMethodCommands(StringBuilder& sb); + void GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitInterfaceMethodParameter(const AutoPtr& parameter, StringBuilder& sb, const String& prefix); void EmitErrorHandle(const AutoPtr& method, const String& gotoLabel, bool isClient, StringBuilder& sb, diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp index 1ba4a9a95..51942e8af 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.cpp @@ -63,11 +63,21 @@ void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() } void CCustomTypesCodeEmitter::EmitHeaderInclusions(StringBuilder& sb) +{ + HeaderFile::HeaderFileSet headerFiles; + GetHeaderOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CCustomTypesCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { for (size_t i = 0; i < ast_->GetTypeDefinitionNumber(); i++) { AutoPtr type = ast_->GetTypeDefintion(i); if (type->GetTypeKind() == TypeKind::TYPE_STRUCT) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf")); break; } } @@ -168,21 +178,26 @@ void CCustomTypesCodeEmitter::EmitCustomTypesSourceFile() void CCustomTypesCodeEmitter::EmitSoucreIncludsions(StringBuilder& sb) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(infName_).string()); - EmitSourceStdlibInclusions(sb); + HeaderFile::HeaderFileSet headerFiles; + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(infName_))); + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } } -void CCustomTypesCodeEmitter::EmitSourceStdlibInclusions(StringBuilder& sb) +void CCustomTypesCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - sb.Append("#include \n"); - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_STRUCT || type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } diff --git a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h index 02282252d..e7d93c9e8 100755 --- a/tools/hdi-gen/codegen/c_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/c_custom_types_code_emitter.h @@ -27,6 +27,8 @@ private: void EmitHeaderInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitCustomTypeDecls(StringBuilder& sb); void EmitCustomTypeDecl(StringBuilder& sb, const AutoPtr& type); @@ -43,7 +45,7 @@ private: void EmitSoucreIncludsions(StringBuilder& sb); - void EmitSourceStdlibInclusions(StringBuilder& sb); + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitCustomTypeDataProcess(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp index 47b5f421c..2dca6a5d6 100755 --- a/tools/hdi-gen/codegen/c_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp @@ -68,13 +68,21 @@ void CInterfaceCodeEmitter::EmitInterfaceHeaderFile() void CInterfaceCodeEmitter::EmitImportInclusions(StringBuilder& sb) { - sb.Append("#include \n"); - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - sb.AppendFormat("#include \"%s.h\"\n", FileName(importAst->GetFullName()).string()); + HeaderFile::HeaderFileSet headerFiles; + + GetImportInclusions(headerFiles); + GetHeaderOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); } } +void CInterfaceCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::C_STD_HEADER_FILE, "stdint")); +} + void CInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) { sb.AppendFormat("struct %s {\n", interfaceName_.string()); diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.h b/tools/hdi-gen/codegen/c_interface_code_emitter.h index a4e76b859..dfdab7c14 100755 --- a/tools/hdi-gen/codegen/c_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.h @@ -27,6 +27,8 @@ private: void EmitImportInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitInterfaceDefinition(StringBuilder& sb); void EmitInterfaceMethods(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index d03327569..1f3efb4af 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -66,11 +66,22 @@ void CServiceDriverCodeEmitter::EmitDriverSourceFile() void CServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb) { - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(stubName_))); + GetDriverSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CServiceDriverCodeEmitter::GetDriverSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc")); } void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) @@ -156,7 +167,7 @@ void CServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); sb.Append(g_tab).Append(".moduleVersion = 1,\n"); sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", - Options::GetInstance().GetModeName().string()); + Options::GetInstance().GetModuleName().string()); sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h index c4582f276..94fd22721 100755 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.h @@ -27,6 +27,8 @@ private: void EmitDriverIncluions(StringBuilder& sb); + void GetDriverSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitDriverServiceDecl(StringBuilder& sb); void EmitDriverDispatch(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index 2ea8fdf27..e73d3bd93 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -45,7 +45,7 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() EmitLicense(sb); EmitHeadMacro(sb, implFullName_); sb.Append("\n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + EmitServiceImplHeaderInclusions(sb); sb.Append("\n"); EmitHeadExternC(sb); sb.Append("\n"); @@ -61,6 +61,17 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() file.Close(); } +void CServiceImplCodeEmitter::EmitServiceImplHeaderInclusions(StringBuilder& sb) +{ + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_))); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + void CServiceImplCodeEmitter::EmitServiceImplConstructDecl(StringBuilder& sb) { sb.AppendFormat("void %sServiceConstruct(struct %s* service);\n", infName_.string(), interfaceName_.string()); @@ -73,7 +84,7 @@ void CServiceImplCodeEmitter::EmitServiceImplSourceFile() StringBuilder sb; EmitLicense(sb); - EmitServiceImplInclusions(sb); + EmitServiceImplSourceInclusions(sb); sb.Append("\n"); EmitServiceImplMethodImpls(sb, ""); sb.Append("\n"); @@ -85,13 +96,24 @@ void CServiceImplCodeEmitter::EmitServiceImplSourceFile() file.Close(); } -void CServiceImplCodeEmitter::EmitServiceImplInclusions(StringBuilder& sb) +void CServiceImplCodeEmitter::EmitServiceImplSourceInclusions(StringBuilder& sb) +{ + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(implName_))); + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CServiceImplCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(infName_ + "Service").string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); } void CServiceImplCodeEmitter::EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix) diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h index 1ab5fb5e6..c2bc84206 100755 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h @@ -25,11 +25,15 @@ private: void EmitServiceImplHeaderFile(); + void EmitServiceImplHeaderInclusions(StringBuilder& sb); + void EmitServiceImplConstructDecl(StringBuilder& sb); void EmitServiceImplSourceFile(); - void EmitServiceImplInclusions(StringBuilder& sb); + void EmitServiceImplSourceInclusions(StringBuilder& sb); + + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index d6e883c8a..4ccf0d708 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -33,12 +33,11 @@ bool CServiceStubCodeEmitter::ResolveDirectory(const String& targetDirectory) void CServiceStubCodeEmitter::EmitCode() { - - EmitCbServiceStubHeaderFile(); + EmitServiceStubHeaderFile(); EmitServiceStubSourceFile(); } -void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() +void CServiceStubCodeEmitter::EmitServiceStubHeaderFile() { String filePath = String::Format("%s%s.h", directory_.string(), FileName(stubName_).string()); File file(filePath, File::WRITE); @@ -47,7 +46,7 @@ void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() EmitLicense(sb); EmitHeadMacro(sb, stubFullName_); sb.Append("\n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + EmitStubHeaderInclusions(sb); sb.Append("\n"); EmitHeadExternC(sb); sb.Append("\n"); @@ -63,6 +62,17 @@ void CServiceStubCodeEmitter::EmitCbServiceStubHeaderFile() file.Close(); } +void CServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb) +{ + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_))); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb) { if (!isCallbackInterface()) { @@ -82,7 +92,7 @@ void CServiceStubCodeEmitter::EmitServiceStubSourceFile() StringBuilder sb; EmitLicense(sb); - EmitServiceStubInclusions(sb); + EmitStubSourceInclusions(sb); sb.Append("\n"); if (!isKernelCode_) { @@ -119,54 +129,56 @@ void CServiceStubCodeEmitter::EmitServiceStubSourceFile() file.Close(); } -void CServiceStubCodeEmitter::EmitServiceStubInclusions(StringBuilder& sb) +void CServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb) { + HeaderFile::HeaderFileSet headerFiles; if (!isCallbackInterface()) { - EmitServiceStubStdlibInclusions(sb); - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_))); if (isKernelCode_) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(implName_))); } else { for (const auto& importPair : ast_->GetImports()) { AutoPtr importAst = importPair.second; if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK) { String fileName = FileName(importAst->GetInterfaceDef()->GetFullName()); - sb.AppendFormat("#include \"%s.h\"\n", fileName.string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, fileName)); } } } } else { - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); - EmitServiceStubStdlibInclusions(sb); - sb.Append("#include \n"); - sb.AppendFormat("#include \"%s.h\"\n", FileName(implName_).string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_))); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_remote_service")); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(implName_))); + } + + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); } } -void CServiceStubCodeEmitter::EmitServiceStubStdlibInclusions(StringBuilder& sb) +void CServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { if (!isKernelCode_) { - sb.Append("#include \n"); - } - - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - - if (isKernelCode_) { + headerFiles.emplace(HeaderFile(HeaderFileType::SYSTEM_HEADER_FILE, "dlfcn")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); + } else { const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } - } else { - sb.Append("#include \n"); } + + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); } void CServiceStubCodeEmitter::EmitDriverLibPath(StringBuilder& sb) @@ -180,7 +192,6 @@ void CServiceStubCodeEmitter::EmitDriverLibPath(StringBuilder& sb) void CServiceStubCodeEmitter::EmitServConstructTypedef(StringBuilder& sb) { - typedef void (*SERVICE_CONSTRUCT_FUNC)(struct callbacks *); sb.AppendFormat("typedef void (*SERVICE_CONSTRUCT_FUNC)(struct %s *);\n", interfaceName_.string()); } @@ -533,6 +544,5 @@ void CServiceStubCodeEmitter::EmitKernelStubReleaseImpl(StringBuilder& sb) sb.Append(g_tab).Append("OsalMemFree(instance);\n"); sb.Append("}"); } - } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 03350ae39..e888015e5 100755 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -23,15 +23,17 @@ private: void EmitCode() override; - void EmitCbServiceStubHeaderFile(); + void EmitServiceStubHeaderFile(); + + void EmitStubHeaderInclusions(StringBuilder& sb); void EmitCbServiceStubMethodsDcl(StringBuilder& sb); void EmitServiceStubSourceFile(); - void EmitServiceStubInclusions(StringBuilder& sb); + void EmitStubSourceInclusions(StringBuilder& sb); - void EmitServiceStubStdlibInclusions(StringBuilder& sb); + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitDriverLibPath(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/code_emitter.cpp b/tools/hdi-gen/codegen/code_emitter.cpp index 3f1c70283..e092349fa 100755 --- a/tools/hdi-gen/codegen/code_emitter.cpp +++ b/tools/hdi-gen/codegen/code_emitter.cpp @@ -8,8 +8,6 @@ #include "codegen/code_emitter.h" -#include "util/logger.h" - namespace OHOS { namespace HDI { bool CodeEmitter::OutPut(const AutoPtr& ast, const String& targetDirectory, bool isKernelCode) diff --git a/tools/hdi-gen/codegen/code_emitter.h b/tools/hdi-gen/codegen/code_emitter.h index 7a867460e..296bce28b 100755 --- a/tools/hdi-gen/codegen/code_emitter.h +++ b/tools/hdi-gen/codegen/code_emitter.h @@ -9,6 +9,7 @@ #ifndef OHOS_HDI_CODE_EMITTER_H #define OHOS_HDI_CODE_EMITTER_H +#include #include "ast/ast.h" #include "util/autoptr.h" #include "util/light_refcount_base.h" @@ -16,6 +17,53 @@ namespace OHOS { namespace HDI { +enum class HeaderFileType { + OWN_HEADER_FILE, + SYSTEM_HEADER_FILE, + C_STD_HEADER_FILE, + CPP_STD_HEADER_FILE, + OTHER_MODULES_HEADER_FILE, + OWN_MODULE_HEADER_FILE, +}; + +struct HeaderFile { + HeaderFile(HeaderFileType type, String fileName) : type_(type), fileName_(fileName) {} + + struct compare { + bool operator()(const HeaderFile& lhs, const HeaderFile& rhs) + { + if (lhs.type_ < rhs.type_) { + return true; + } else if (lhs.type_ > rhs.type_) { + return false; + } + + return lhs.fileName_.Compare(rhs.fileName_) <= 0; + } + }; + + String ToString() const { + switch(type_) { + case HeaderFileType::OWN_HEADER_FILE: + case HeaderFileType::OWN_MODULE_HEADER_FILE: + return String::Format("#include \"%s.h\"", fileName_.string()); + case HeaderFileType::SYSTEM_HEADER_FILE: + case HeaderFileType::C_STD_HEADER_FILE: + case HeaderFileType::OTHER_MODULES_HEADER_FILE: + return String::Format("#include <%s.h>", fileName_.string()); + case HeaderFileType::CPP_STD_HEADER_FILE: + return String::Format("#include <%s>", fileName_.string()); + default: + return String::Format("//"); + } + } + + using HeaderFileSet = std::set; + + HeaderFileType type_; + String fileName_; +}; + class CodeEmitter : public LightRefCountBase { public: virtual ~CodeEmitter() = default; diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 6c5059ff0..bbb0ad133 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -8,7 +8,6 @@ #include "codegen/cpp_client_proxy_code_emitter.h" #include "util/file.h" - #include "util/logger.h" namespace OHOS { @@ -46,7 +45,7 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderFile() EmitLicense(sb); EmitHeadMacro(sb, proxyFullName_); sb.Append("\n"); - EmitProxyHeadrInclusions(sb); + EmitProxyHeaderInclusions(sb); sb.Append("\n"); EmitBeginNamespace(sb); sb.Append("\n"); @@ -62,10 +61,21 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderFile() file.Close(); } -void CppClientProxyCodeEmitter::EmitProxyHeadrInclusions(StringBuilder& sb) +void CppClientProxyCodeEmitter::EmitProxyHeaderInclusions(StringBuilder& sb) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); - sb.Append("#include \n"); + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(interfaceName_))); + GetHeaderOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CppClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iremote_proxy")); } void CppClientProxyCodeEmitter::EmitProxyDecl(StringBuilder& sb, const String& prefix) @@ -164,21 +174,30 @@ void CppClientProxyCodeEmitter::EmitProxySourceFile() void CppClientProxyCodeEmitter::EmitProxySourceInclusions(StringBuilder& sb) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(proxyName_).string()); - EmitProxySourceStdlibInclusions(sb); + HeaderFile::HeaderFileSet headerFiles; + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(proxyName_))); + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } } -void CppClientProxyCodeEmitter::EmitProxySourceStdlibInclusions(StringBuilder& sb) +void CppClientProxyCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); + if (!isCallbackInterface()) { + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iservmgr_hdi")); + } + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_option")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_parcel")); const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } @@ -207,7 +226,8 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder& sb, con "HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); sb.Append(prefix + g_tab + g_tab + g_tab).Append("break;\n"); sb.Append(prefix + g_tab + g_tab).Append("}\n\n"); - sb.Append(prefix + g_tab + g_tab).Append("sptr remote = servMgr->GetService(serviceName.c_str());\n"); + sb.Append(prefix + g_tab + g_tab).Append("sptr remote = "); + sb.Append("servMgr->GetService(serviceName.c_str());\n"); sb.Append(prefix + g_tab + g_tab).Append("if (remote != nullptr) {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return iface_cast<%s>(remote);\n", interface_->GetName().string()); diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index 868f113ff..dcf10b67a 100755 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -25,7 +25,9 @@ private: void EmitProxyHeaderFile(); - void EmitProxyHeadrInclusions(StringBuilder& sb); + void EmitProxyHeaderInclusions(StringBuilder& sb); + + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitProxyDecl(StringBuilder& sb, const String& prefix); @@ -43,7 +45,7 @@ private: void EmitProxySourceInclusions(StringBuilder& sb); - void EmitProxySourceStdlibInclusions(StringBuilder& sb); + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitGetMethodImpl(StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_code_emitter.cpp index 83b857d03..4a791c6e4 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_code_emitter.cpp @@ -12,8 +12,6 @@ #include #include -#include "util/logger.h" - namespace OHOS { namespace HDI { String CppCodeEmitter::FileName(const String& name) @@ -50,6 +48,53 @@ void CppCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String sb.Append(prefix).Append("};\n"); } +void CppCodeEmitter::GetStdlibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + bool includeString = false; + bool includeList = false; + bool includeMap = false; + + const AST::TypeStringMap& types = ast_->GetTypes(); + for (const auto& pair : types) { + AutoPtr type = pair.second; + switch (type->GetTypeKind()) { + case TypeKind::TYPE_STRING: { + if (!includeString) { + headerFiles.emplace(HeaderFile(HeaderFileType::CPP_STD_HEADER_FILE, "string")); + includeString = true; + } + break; + } + case TypeKind::TYPE_ARRAY: + case TypeKind::TYPE_LIST: { + if (!includeList) { + headerFiles.emplace(HeaderFile(HeaderFileType::CPP_STD_HEADER_FILE, "vector")); + includeList = true; + } + break; + } + case TypeKind::TYPE_MAP: { + if (!includeMap) { + headerFiles.emplace(HeaderFile(HeaderFileType::CPP_STD_HEADER_FILE, "map")); + includeMap = true; + } + break; + } + default: + break; + } + } +} + +void CppCodeEmitter::GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + for (const auto& importPair : ast_->GetImports()) { + AutoPtr importAst = importPair.second; + String fileName = FileName(importAst->GetFullName()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(importAst->GetFullName()))); + } +} + void CppCodeEmitter::EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix) { diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index a7c30f1e3..1ce214c29 100755 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -27,6 +27,10 @@ public: protected: void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix); + void GetStdlibInclusions(HeaderFile::HeaderFileSet& headerFiles); + + void GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitInterfaceMethodParameter(const AutoPtr& param, StringBuilder& sb, const String& prefix); void EmitLicense(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp index 248b801ea..ee6ef6077 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.cpp @@ -66,56 +66,20 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesHeaderFile() void CppCustomTypesCodeEmitter::EmitHeaderFileInclusions(StringBuilder& sb) { - EmitCustomTypesStdlibInclusions(sb); - sb.Append("#include \n"); - EmitImportInclusions(sb); -} + HeaderFile::HeaderFileSet headerFiles; -void CppCustomTypesCodeEmitter::EmitCustomTypesStdlibInclusions(StringBuilder& sb) -{ - bool includeString = false; - bool includeList = false; - bool includeMap = false; + GetStdlibInclusions(headerFiles); + GetImportInclusions(headerFiles); + GetHeaderOtherLibInclusions(headerFiles); - const AST::TypeStringMap& types = ast_->GetTypes(); - for (const auto& pair : types) { - AutoPtr type = pair.second; - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - if (!includeString) { - sb.Append("#include \n"); - includeString = true; - } - break; - } - case TypeKind::TYPE_ARRAY: - case TypeKind::TYPE_LIST: { - if (!includeList) { - sb.Append("#include \n"); - includeList = true; - } - break; - } - case TypeKind::TYPE_MAP: { - if (!includeMap) { - sb.Append("#include \n"); - includeMap = true; - } - break; - } - default: - break; - } + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); } } -void CppCustomTypesCodeEmitter::EmitImportInclusions(StringBuilder& sb) +void CppCustomTypesCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - String fileName = FileName(importAst->GetFullName()); - sb.Append("#include ").AppendFormat("\"%s.h\"\n", fileName.string()); - } + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_parcel")); } void CppCustomTypesCodeEmitter::EmitCustomTypeDecls(StringBuilder& sb) @@ -205,18 +169,24 @@ void CppCustomTypesCodeEmitter::EmitCustomTypesSourceFile() void CppCustomTypesCodeEmitter::EmitSourceFileInclusions(StringBuilder& sb) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(infName_).string()); - EmitSourceStdlibInclusions(sb); + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(infName_))); + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } } -void CppCustomTypesCodeEmitter::EmitSourceStdlibInclusions(StringBuilder& sb) +void CppCustomTypesCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_STRUCT || type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } diff --git a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h index c311c756b..2dae423a3 100755 --- a/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_custom_types_code_emitter.h @@ -27,9 +27,7 @@ private: void EmitHeaderFileInclusions(StringBuilder& sb); - void EmitCustomTypesStdlibInclusions(StringBuilder& sb); - - void EmitImportInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitCustomTypeDecls(StringBuilder& sb); @@ -45,7 +43,7 @@ private: void EmitSourceFileInclusions(StringBuilder& sb); - void EmitSourceStdlibInclusions(StringBuilder& sb); + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitCustomTypeDataProcess(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp index 0e0a7c76a..71f96a652 100755 --- a/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp @@ -66,62 +66,21 @@ void CppInterfaceCodeEmitter::EmitInterfaceHeaderFile() void CppInterfaceCodeEmitter::EmitInterfaceInclusions(StringBuilder& sb) { - EmitInterfaceStdlibInclusions(sb); - EmitInterfaceDBinderInclusions(sb); - EmitInterfaceSelfDefinedTypeInclusions(sb); -} + HeaderFile::HeaderFileSet headerFiles; -void CppInterfaceCodeEmitter::EmitInterfaceStdlibInclusions(StringBuilder& sb) -{ - bool includeString = false; - bool includeList = false; - bool includeMap = false; - - const AST::TypeStringMap& types = ast_->GetTypes(); - for (const auto& pair : types) { - AutoPtr type = pair.second; - switch (type->GetTypeKind()) { - case TypeKind::TYPE_STRING: { - if (!includeString) { - sb.Append("#include \n"); - includeString = true; - } - break; - } - case TypeKind::TYPE_ARRAY: - case TypeKind::TYPE_LIST: { - if (!includeList) { - sb.Append("#include \n"); - includeList = true; - } - break; - } - case TypeKind::TYPE_MAP: { - if (!includeMap) { - sb.Append("#include \n"); - includeMap = true; - } - break; - } - default: - break; - } - } -} + GetStdlibInclusions(headerFiles); + GetImportInclusions(headerFiles); + GetHeaderOtherLibInclusions(headerFiles); -void CppInterfaceCodeEmitter::EmitInterfaceDBinderInclusions(StringBuilder& sb) -{ - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } } -void CppInterfaceCodeEmitter::EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb) +void CppInterfaceCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - for (const auto& importPair : ast_->GetImports()) { - AutoPtr importAst = importPair.second; - sb.Append("#include ").AppendFormat("\"%s.h\"\n", FileName(importAst->GetFullName()).string()); - } + headerFiles.emplace(HeaderFile(HeaderFileType::C_STD_HEADER_FILE, "stdint")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iremote_broker")); } void CppInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) diff --git a/tools/hdi-gen/codegen/cpp_interface_code_emitter.h b/tools/hdi-gen/codegen/cpp_interface_code_emitter.h index 2481aac5e..d4eddb594 100755 --- a/tools/hdi-gen/codegen/cpp_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_interface_code_emitter.h @@ -28,11 +28,7 @@ private: void EmitInterfaceInclusions(StringBuilder& sb); - void EmitInterfaceStdlibInclusions(StringBuilder& sb); - - void EmitInterfaceDBinderInclusions(StringBuilder& sb); - - void EmitInterfaceSelfDefinedTypeInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitInterfaceDefinition(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index 9a08369b4..736f665b4 100755 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -162,7 +162,7 @@ void CppServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb) sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string()); sb.Append(g_tab).Append(".moduleVersion = 1,\n"); sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n", - Options::GetInstance().GetModeName().string()); + Options::GetInstance().GetModuleName().string()); sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string()); sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string()); diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp index 263f68bd6..873ba68de 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.cpp @@ -71,12 +71,16 @@ void CppServiceImplCodeEmitter::EmitImplHeaderFile() void CppServiceImplCodeEmitter::EmitServiceImplInclusions(StringBuilder& sb) { + HeaderFile::HeaderFileSet headerFiles; if (!isCallbackInterface()) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_))); } else { - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_))); + } + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); } - sb.Append("#include \n"); } void CppServiceImplCodeEmitter::EmitServiceImplDecl(StringBuilder& sb) @@ -159,7 +163,7 @@ void CppServiceImplCodeEmitter::EmitImplSourceFile() StringBuilder sb; EmitLicense(sb); - sb.AppendFormat("#include \"%s_service.h\"\n", FileName(infName_).string()); + EmitImplSourceInclusions(sb); sb.Append("\n"); EmitBeginNamespace(sb); sb.Append("\n"); @@ -179,6 +183,22 @@ void CppServiceImplCodeEmitter::EmitImplSourceFile() file.Close(); } +void CppServiceImplCodeEmitter::EmitImplSourceInclusions(StringBuilder& sb) +{ + HeaderFile::HeaderFileSet headerFiles; + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(implName_))); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CppServiceImplCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); +} + void CppServiceImplCodeEmitter::EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix) { for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { diff --git a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.h index 265545a6a..dc0b7f57f 100755 --- a/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_impl_code_emitter.h @@ -43,6 +43,10 @@ private: void EmitImplSourceFile(); + void EmitImplSourceInclusions(StringBuilder& sb); + + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix); void EmitServiceImplMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index 040705f83..e90a0eec8 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -64,13 +64,23 @@ void CppServiceStubCodeEmitter::EmitStubHeaderFile() void CppServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb) { - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); + HeaderFile::HeaderFileSet headerFiles; + + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_))); + GetHeaderOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } +} + +void CppServiceStubCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) +{ + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_parcel")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "message_option")); if (isCallbackInterface()) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iremote_stub")); } - sb.AppendFormat("#include \"%s.h\"\n", FileName(interfaceName_).string()); } void CppServiceStubCodeEmitter::EmitStubDecl(StringBuilder& sb) @@ -238,31 +248,34 @@ void CppServiceStubCodeEmitter::EmitStubSourceFile() void CppServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb) { - sb.AppendFormat("#include \"%s.h\"\n", FileName(stubName_).string()); - EmitStubSourceStdlibInclusions(sb); + HeaderFile::HeaderFileSet headerFiles; + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_))); + GetSourceOtherLibInclusions(headerFiles); + + for (const auto& file : headerFiles) { + sb.AppendFormat("%s\n", file.ToString().string()); + } } -void CppServiceStubCodeEmitter::EmitStubSourceStdlibInclusions(StringBuilder& sb) +void CppServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { if (!isCallbackInterface()) { - sb.Append("#include \n"); - } - sb.Append("#include \n"); - sb.Append("#include \n"); - sb.Append("#include \n"); - - const AST::TypeStringMap& types = ast_->GetTypes(); - if (isCallbackInterface()) { + headerFiles.emplace(HeaderFile(HeaderFileType::SYSTEM_HEADER_FILE, "dlfcn")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf_ipc")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); + } else { + const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { AutoPtr type = pair.second; if (type->GetTypeKind() == TypeKind::TYPE_UNION) { - sb.Append("#include \n"); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); break; } } - } else { - sb.Append("#include \n"); } + + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); } void CppServiceStubCodeEmitter::EmitDriverLibPath(StringBuilder& sb) diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h index 9d8bd615b..c0dd1fd4a 100755 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.h @@ -28,6 +28,8 @@ private: void EmitStubHeaderInclusions(StringBuilder& sb); + void GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitStubUsingNamespace(StringBuilder& sb); void EmitStubDecl(StringBuilder& sb); @@ -57,7 +59,7 @@ private: void EmitStubSourceInclusions(StringBuilder& sb); - void EmitStubSourceStdlibInclusions(StringBuilder& sb); + void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); void EmitDriverLibPath(StringBuilder& sb); diff --git a/tools/hdi-gen/util/options.cpp b/tools/hdi-gen/util/options.cpp index 5960d6ae8..42f7d6215 100755 --- a/tools/hdi-gen/util/options.cpp +++ b/tools/hdi-gen/util/options.cpp @@ -25,7 +25,7 @@ static struct option g_longOpts[] = { {"gen-java", no_argument, nullptr, 'J'}, {"gen-hash", no_argument, nullptr, 'H'}, {"build-target", required_argument, nullptr, 'p'}, - {"mode-name", required_argument, nullptr, 'N'}, + {"module-name", required_argument, nullptr, 'N'}, {"kernel", no_argument, nullptr, 'K'}, {"dump-ast", no_argument, nullptr, 'D'}, {nullptr, 0, nullptr, 0} @@ -56,7 +56,7 @@ void Options::SetOptionData(char op) switch (op) { case 'c': doCompile_ = true; - sourceFiles_.push_back(optarg); + sourceFiles_.push_back(optarg); break; case 'd': doOutDir_ = true; @@ -72,8 +72,8 @@ void Options::SetOptionData(char op) doModeKernel_ = true; break; case 'N': - doSetModeName_ = true; - modeName_ = optarg; + doSetModuleName_ = true; + moduleName_ = optarg; break; case 'C': SetLanguage("c"); @@ -137,9 +137,8 @@ void Options::CheckOptions() if (doGeneratePart_ && !codePart_.Equals("all") && !codePart_.Equals("client") && !codePart_.Equals("server")) { - errors_.push_back( - String::Format("%s: The '--build-target' option parameter must be 'client' 'server' or 'all'.", - program_.string())); + String errorLog = "The '--build-target' option parameter must be 'client' 'server' or 'all'."; + errors_.push_back(String::Format("%s: %s", program_.string(), errorLog.string())); } } else { if (doGetHashKey_ || doDumpAST_ || doGenerateCode_ || doOutDir_) { @@ -178,7 +177,7 @@ void Options::ShowUsage() const " --gen-cpp Generate C++ code\n" " --gen-java Generate Java code\n" " --kernel Generate kernel-mode ioservice stub code, default user-mode ioservice stub code\n" - " --mode-name Set driver module name\n" + " --module-name Set driver module name\n" " --build-target Generate client code, server code or all code\n" " -d Place generated codes into \n"); } diff --git a/tools/hdi-gen/util/options.h b/tools/hdi-gen/util/options.h index e94231200..d33f1aece 100755 --- a/tools/hdi-gen/util/options.h +++ b/tools/hdi-gen/util/options.h @@ -80,9 +80,9 @@ public: return codePart_; } - inline String GetModeName() const + inline String GetModuleName() const { - return doSetModeName_ ? modeName_ : "sample"; + return doSetModuleName_ ? moduleName_ : "sample"; } inline String GetGenerationDirectory() const @@ -112,7 +112,7 @@ private: doGenerateCode_(false), doModeKernel_(false), doGeneratePart_(false), - doSetModeName_(false), + doSetModuleName_(false), doOutDir_(false) {} void SetOptionData(char op); @@ -133,7 +133,7 @@ private: std::vector sourceFiles_; String targetLanguage_; String codePart_; - String modeName_; + String moduleName_; String generationDirectory_; String illegalOptions_; std::vector errors_; @@ -146,7 +146,7 @@ private: bool doGenerateCode_; bool doModeKernel_; bool doGeneratePart_; - bool doSetModeName_; + bool doSetModuleName_; bool doOutDir_; }; } // namespace HDI diff --git a/tools/hdi-gen/util/string.cpp b/tools/hdi-gen/util/string.cpp index 66e26dc37..3359e7905 100755 --- a/tools/hdi-gen/util/string.cpp +++ b/tools/hdi-gen/util/string.cpp @@ -196,6 +196,23 @@ bool String::Equals(const String& other) const return false; } +int String::Compare(const String& other) const +{ + if (string_ == nullptr) { + if (other.string_ == nullptr) { + return 0; + } else { + return -1; + } + } + + if (other.string_ == nullptr) { + return 1; + } + + return strcmp(string_, other.string_); +} + int String::GetHashCode() const { // BKDR Hash Function diff --git a/tools/hdi-gen/util/string.h b/tools/hdi-gen/util/string.h index fc7acf67c..2330f88af 100755 --- a/tools/hdi-gen/util/string.h +++ b/tools/hdi-gen/util/string.h @@ -57,6 +57,8 @@ public: bool Equals(const String& other) const; + int Compare(const String& other) const; + int GetHashCode() const; int IndexOf(char c, int fromIndex = 0) const; -- Gitee From abe469192e82321704f9efe08b10c91ac5e8ab87 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Dec 2021 04:37:34 +0000 Subject: [PATCH 251/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/hdf_wifi_core.c | 4 ++ model/network/wifi/core/module/wifi_base.c | 67 +++++++++++----------- model/network/wifi/include/hdf_wifi_cmd.h | 9 ++- 3 files changed, 44 insertions(+), 36 deletions(-) diff --git a/model/network/wifi/core/hdf_wifi_core.c b/model/network/wifi/core/hdf_wifi_core.c index bbb107ea6..058d3a7b7 100644 --- a/model/network/wifi/core/hdf_wifi_core.c +++ b/model/network/wifi/core/hdf_wifi_core.c @@ -515,6 +515,10 @@ static int32_t HdfWlanMainInit(struct HdfDeviceObject *device) HDF_LOGE("%s:HdfWlanGetConfig get wlan config failed!", __func__); return HDF_FAILURE; } + int regVirtualAddr = IO_DEVICE_ADDR(0x12010000+0x0154); +    uint32_t currentValue = readl(regVirtualAddr); +    currentValue |= 0x0c; // Set to 25MHz +    writel(currentValue, regVirtualAddr); /* feature init */ rootConfig = HdfWlanGetModuleConfigRoot(); moduleConfig = &rootConfig->wlanConfig.moduleConfig; diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index ea7d2c1d8..9aea27b80 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -29,7 +29,7 @@ #endif #define WIFI_24G_CHANNEL_NUM 14 -#define WIFI_5G_CHANNEL_NUM 24 +#define WIFI_MAX_CHANNEL_NUM 24 #define DEFAULT_EAPOL_PACKAGE_SIZE 800 Service *g_baseService = NULL; @@ -466,29 +466,23 @@ static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *req return ret; } -static int32_t WifiCheckChannelNum(struct WlanHwCapability *capability,struct WlanBand **band) +static void WifiGetChannelData(struct WlanBand *band, WifiHwFeatureData **featureData, struct WlanHwCapability *capability, uint32_t iee80211band) { - if (capability == NULL || band == NULL) { - HDF_LOGE("%s: capability or band is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { - *band = capability->bands[IEEE80211_BAND_2GHZ]; - if ((*band)->channelCount > WIFI_24G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, (*band)->channelCount); - return HDF_FAILURE; - } - } else if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { - *band = capability->bands[IEEE80211_BAND_5GHZ]; - if ((*band)->channelCount > WIFI_5G_CHANNEL_NUM) { - HDF_LOGE("%s: channels %u out of range", __func__, (*band)->channelCount); - return HDF_FAILURE; - } - } else { - HDF_LOGE("%s: Supportting 2.4G/5G is required by now!", __func__); - return HDF_FAILURE; + uint32_t loop; + if (band == NULL || featureData == NULL) + { + HDF_LOGE("%s: band or featureData is NULL", __func__); + return; } - return HDF_SUCCESS; + + (*featureData)->bands[iee80211band].channelNum = band->channelCount; + (*featureData)->htCapab = capability->htCapability; + + for (loop = 0; loop < band->channelCount; ++loop) { + (*featureData)->bands[iee80211band].iee80211Channel[loop].freq = band->channels[loop].centerFreq; + (*featureData)->bands[iee80211band].iee80211Channel[loop].flags = band->channels[loop].flags; + (*featureData)->bands[iee80211band].iee80211Channel[loop].channel = band->channels[loop].channelId; + } } static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *featureData) @@ -511,19 +505,24 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe HDF_LOGV("%s: supported rate %u", __func__, capability->supportedRates[loop]); featureData->bitrate[loop] = capability->supportedRates[loop]; } - - if (WifiCheckChannelNum(capability, &band) != HDF_SUCCESS) { - ret = HDF_FAILURE; - break; - } - featureData->channelNum = band->channelCount; - featureData->htCapab = capability->htCapability; - - for (loop = 0; loop < band->channelCount; ++loop) { - featureData->iee80211Channel[loop].flags = band->channels[loop].flags; - featureData->iee80211Channel[loop].freq = band->channels[loop].centerFreq; - featureData->iee80211Channel[loop].channel = band->channels[loop].channelId; + if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { + band = capability->bands[IEEE80211_BAND_2GHZ]; + if (band->channelCount > WIFI_24G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + ret = HDF_FAILURE; + break; + } + WifiGetChannelData(band, &featureData, capability, IEEE80211_BAND_2GHZ); + } + if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { + band = capability->bands[IEEE80211_BAND_5GHZ]; + if (band->channelCount > WIFI_5G_CHANNEL_NUM) { + HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); + ret = HDF_FAILURE; + break; + } + WifiGetChannelData(band, &featureData, capability, IEEE80211_BAND_5GHZ); } } while (false); diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 8096da70d..62583369f 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -313,14 +313,19 @@ typedef struct { } WifiIeee80211Channel; #define MAX_SUPPORTED_RATE 12 -#define WIFI_5G_CHANNEL_NUM 24 +#define WIFI_MAX_CHANNEL_NUM 24 + +typedef struct { + int32_t channelNum; /**< Number of channels */ + WifiIeee80211Channel iee80211Channel[WIFI_MAX_CHANNEL_NUM]; /**< WLAN channel structures */ +}WlanBands; typedef struct { int32_t channelNum; uint16_t bitrate[MAX_SUPPORTED_RATE]; uint16_t htCapab; uint8_t resv[2]; - WifiIeee80211Channel iee80211Channel[WIFI_5G_CHANNEL_NUM]; + WlanBands bands[2]; } WifiHwFeatureData; typedef struct { -- Gitee From 551cf2167c935b4c8a24a1d56f2538d7e061d38f Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Dec 2021 06:29:28 +0000 Subject: [PATCH 252/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index 9aea27b80..70b0db14e 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -517,7 +517,7 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe } if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { band = capability->bands[IEEE80211_BAND_5GHZ]; - if (band->channelCount > WIFI_5G_CHANNEL_NUM) { + if (band->channelCount > WIFI_MAX_CHANNEL_NUM) { HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); ret = HDF_FAILURE; break; -- Gitee From 14e6ef5319e290762510f4a39d15092cb8a7273c Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Dec 2021 07:01:34 +0000 Subject: [PATCH 253/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/hdf_wifi_core.c | 4 ---- model/network/wifi/core/module/wifi_base.c | 5 ++--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/model/network/wifi/core/hdf_wifi_core.c b/model/network/wifi/core/hdf_wifi_core.c index 058d3a7b7..bbb107ea6 100644 --- a/model/network/wifi/core/hdf_wifi_core.c +++ b/model/network/wifi/core/hdf_wifi_core.c @@ -515,10 +515,6 @@ static int32_t HdfWlanMainInit(struct HdfDeviceObject *device) HDF_LOGE("%s:HdfWlanGetConfig get wlan config failed!", __func__); return HDF_FAILURE; } - int regVirtualAddr = IO_DEVICE_ADDR(0x12010000+0x0154); -    uint32_t currentValue = readl(regVirtualAddr); -    currentValue |= 0x0c; // Set to 25MHz -    writel(currentValue, regVirtualAddr); /* feature init */ rootConfig = HdfWlanGetModuleConfigRoot(); moduleConfig = &rootConfig->wlanConfig.moduleConfig; diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index 70b0db14e..b74133d16 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -489,7 +489,6 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe { int32_t ret = HDF_SUCCESS; struct WlanHwCapability *capability = GetHwCapability(netdev); - struct WlanBand *band = NULL; if (capability == NULL) { HDF_LOGE("%s:GetHwCapability failed!", __func__); return HDF_FAILURE; @@ -507,7 +506,7 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe } if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { - band = capability->bands[IEEE80211_BAND_2GHZ]; + struct WlanBand *band = capability->bands[IEEE80211_BAND_2GHZ]; if (band->channelCount > WIFI_24G_CHANNEL_NUM) { HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); ret = HDF_FAILURE; @@ -516,7 +515,7 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe WifiGetChannelData(band, &featureData, capability, IEEE80211_BAND_2GHZ); } if (capability->bands[IEEE80211_BAND_5GHZ] != NULL) { - band = capability->bands[IEEE80211_BAND_5GHZ]; + struct WlanBand *band = capability->bands[IEEE80211_BAND_5GHZ]; if (band->channelCount > WIFI_MAX_CHANNEL_NUM) { HDF_LOGE("%s: channels %u out of range", __func__, band->channelCount); ret = HDF_FAILURE; -- Gitee From afcb7208d2fcf7fa9d4b53fe35ffa2268cdad889 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Fri, 10 Dec 2021 16:10:24 +0800 Subject: [PATCH 254/272] =?UTF-8?q?=E3=80=90Audio=E3=80=91codex=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- test/unittest/model/audio/src/audio_core_test.c | 10 ++++------ .../model/audio/src/audio_platform_base_test.c | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/test/unittest/model/audio/src/audio_core_test.c b/test/unittest/model/audio/src/audio_core_test.c index 37b05af12..fd7eeb68a 100755 --- a/test/unittest/model/audio/src/audio_core_test.c +++ b/test/unittest/model/audio/src/audio_core_test.c @@ -16,8 +16,8 @@ static struct AudioMixerControl g_audioTestReg = { .reg = 0x2004, /* [0] output volume */ .rreg = 0x2004, /* register value */ - .shift = 8, /* reg offset */ - .rshift = 8, /* right reg offset */ + .shift = 0x8, /* reg offset */ + .rshift = 0x8, /* right reg offset */ .min = 0x28, /* min value */ .max = 0x7F, /* max value */ .mask = 0x7F, /* mask value */ @@ -38,15 +38,13 @@ int32_t AudioDeviceReadRegTest(void) { int value; HDF_LOGI("%s: enter", __func__); - return AudioDeviceReadRegMock(0 , 0, &value); - HDF_LOGI("%s: success", __func__); + return AudioDeviceReadRegMock(0, 0, &value); } int32_t AudioDeviceWriteRegTest(void) { HDF_LOGI("%s: enter", __func__); - return AudioDeviceWriteRegMock(0 , 0, 0); - HDF_LOGI("%s: success", __func__); + return AudioDeviceWriteRegMock(0, 0, 0); } int32_t AudioSocRegisterPlatformTest(void) diff --git a/test/unittest/model/audio/src/audio_platform_base_test.c b/test/unittest/model/audio/src/audio_platform_base_test.c index 636b4efd6..1b498b08d 100644 --- a/test/unittest/model/audio/src/audio_platform_base_test.c +++ b/test/unittest/model/audio/src/audio_platform_base_test.c @@ -42,7 +42,7 @@ int32_t AudioBytesToFramesTest(void) int32_t AudioDataBigEndianChangeTest(void) { - const int dataLen = 32; //test data lenth + const int dataLen = 32; // test data lenth char test[dataLen]; memset(&test, 1, dataLen); -- Gitee From 24bfbf57539746bee201bbd94a6156f6d63d7ba0 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Dec 2021 08:15:17 +0000 Subject: [PATCH 255/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/core/module/wifi_base.c | 4 ++-- model/network/wifi/include/hdf_wifi_cmd.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/model/network/wifi/core/module/wifi_base.c b/model/network/wifi/core/module/wifi_base.c index b74133d16..8fc2c0937 100644 --- a/model/network/wifi/core/module/wifi_base.c +++ b/model/network/wifi/core/module/wifi_base.c @@ -469,7 +469,7 @@ static int32_t WifiCmdSetMode(const RequestContext *context, struct HdfSBuf *req static void WifiGetChannelData(struct WlanBand *band, WifiHwFeatureData **featureData, struct WlanHwCapability *capability, uint32_t iee80211band) { uint32_t loop; - if (band == NULL || featureData == NULL) + if (band == NULL || featureData == NULL || *featureData == NULL) { HDF_LOGE("%s: band or featureData is NULL", __func__); return; @@ -504,7 +504,7 @@ static int32_t WifiFillHwFeature(struct NetDevice *netdev, WifiHwFeatureData *fe HDF_LOGV("%s: supported rate %u", __func__, capability->supportedRates[loop]); featureData->bitrate[loop] = capability->supportedRates[loop]; } - + if (capability->bands[IEEE80211_BAND_2GHZ] != NULL) { struct WlanBand *band = capability->bands[IEEE80211_BAND_2GHZ]; if (band->channelCount > WIFI_24G_CHANNEL_NUM) { diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 62583369f..68e9ea943 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -325,7 +325,7 @@ typedef struct { uint16_t bitrate[MAX_SUPPORTED_RATE]; uint16_t htCapab; uint8_t resv[2]; - WlanBands bands[2]; + WlanBands bands[IEEE80211_NUM_BANDS]; } WifiHwFeatureData; typedef struct { -- Gitee From c3cff490e365621349b4a4eea3b1fcfd7633a34f Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Fri, 10 Dec 2021 08:39:54 +0000 Subject: [PATCH 256/272] Description: wlan 5GHz adapter Feature or Bugfix:Feature Binary Source: No Signed-off-by: YOUR_NAME --- model/network/wifi/include/hdf_wifi_cmd.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/network/wifi/include/hdf_wifi_cmd.h b/model/network/wifi/include/hdf_wifi_cmd.h index 68e9ea943..611e05d90 100644 --- a/model/network/wifi/include/hdf_wifi_cmd.h +++ b/model/network/wifi/include/hdf_wifi_cmd.h @@ -314,6 +314,7 @@ typedef struct { #define MAX_SUPPORTED_RATE 12 #define WIFI_MAX_CHANNEL_NUM 24 +#define SUPPORTED_NUM_BANDS 2 typedef struct { int32_t channelNum; /**< Number of channels */ @@ -325,7 +326,7 @@ typedef struct { uint16_t bitrate[MAX_SUPPORTED_RATE]; uint16_t htCapab; uint8_t resv[2]; - WlanBands bands[IEEE80211_NUM_BANDS]; + WlanBands bands[SUPPORTED_NUM_BANDS]; } WifiHwFeatureData; typedef struct { -- Gitee From 0afe0804ea310fa44297cea00b078f1441bd7c65 Mon Sep 17 00:00:00 2001 From: jiaziyang Date: Wed, 8 Dec 2021 09:44:50 +0800 Subject: [PATCH 257/272] fix:modify ambiguous definition variable name and avoid using null pointers in pin source files Signed-off-by: jiaziyang --- support/platform/include/pin/pin_core.h | 2 +- support/platform/src/pin/pin_core.c | 50 ++++++++++++------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/support/platform/include/pin/pin_core.h b/support/platform/include/pin/pin_core.h index c90d811bf..5bb187ae5 100644 --- a/support/platform/include/pin/pin_core.h +++ b/support/platform/include/pin/pin_core.h @@ -34,7 +34,7 @@ struct PinCntlr { struct IDeviceIoService service; struct HdfDeviceObject *device; struct PinCntlrMethod *method; - struct DListHead list; + struct DListHead node; OsalSpinlock spin; uint16_t number; uint16_t pinCount; diff --git a/support/platform/src/pin/pin_core.c b/support/platform/src/pin/pin_core.c index 09e65ba6a..cf8b6958a 100644 --- a/support/platform/src/pin/pin_core.c +++ b/support/platform/src/pin/pin_core.c @@ -13,22 +13,22 @@ #define MAX_CNT_PER_CNTLR 20 -static struct DListHead g_cntlrList; +static struct DListHead g_cntlrListHead; static OsalSpinlock g_listLock; static uint32_t g_irqSave; static struct DListHead *PinCntlrListGet(void) { - static struct DListHead *list = NULL; + static struct DListHead *head = NULL; uint32_t irqSave; - if (list == NULL) { - list = &g_cntlrList; - DListHeadInit(list); + if (head == NULL) { + head = &g_cntlrListHead; + DListHeadInit(head); OsalSpinInit(&g_listLock); } while (OsalSpinLockIrqSave(&g_listLock, &irqSave) != HDF_SUCCESS); g_irqSave = irqSave; - return list; + return head; } static void PinCntlrListPut(void) @@ -38,13 +38,14 @@ static void PinCntlrListPut(void) int32_t PinCntlrAdd(struct PinCntlr *cntlr) { - struct DListHead *list = NULL; + struct DListHead *head = NULL; if (cntlr == NULL) { HDF_LOGE("%s: invalid object cntlr is NULL!", __func__); return HDF_ERR_INVALID_OBJECT; } - + DListHeadInit(&cntlr->node); + if (cntlr->method == NULL) { HDF_LOGE("%s: no method supplied!", __func__); return HDF_ERR_INVALID_OBJECT; @@ -54,15 +55,12 @@ int32_t PinCntlrAdd(struct PinCntlr *cntlr) HDF_LOGE("%s: invalid pinCount:%u", __func__, cntlr->pinCount); return HDF_ERR_INVALID_PARAM; } - - OsalSpinInit(&cntlr->spin); - list = PinCntlrListGet(); + OsalSpinInit(&cntlr->spin); - DListHeadInit(&cntlr->list); - DListInsertTail(&cntlr->list, list); + head = PinCntlrListGet(); + DListInsertTail(&cntlr->node, head); PinCntlrListPut(); - return HDF_SUCCESS; } @@ -74,14 +72,14 @@ void PinCntlrRemove(struct PinCntlr *cntlr) } (void)PinCntlrListGet(); - DListRemove(&cntlr->list); + DListRemove(&cntlr->node); PinCntlrListPut(); (void)OsalSpinDestroy(&cntlr->spin); } struct PinDesc *PinCntlrGetPinDescByName(const char *pinName) { - struct DListHead *list = NULL; + struct DListHead *head = NULL; struct PinCntlr *cntlr = NULL; struct PinCntlr *tmp = NULL; int32_t num; @@ -91,9 +89,9 @@ struct PinDesc *PinCntlrGetPinDescByName(const char *pinName) return NULL; } - list = PinCntlrListGet(); + head = PinCntlrListGet(); - DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, head, struct PinCntlr, node) { for (num = 0; num < cntlr->pinCount; num++) { if (cntlr->pins[num].pinName == NULL) { continue; @@ -112,12 +110,13 @@ struct PinDesc *PinCntlrGetPinDescByName(const char *pinName) struct PinCntlr *PinCntlrGetByNumber(uint16_t number) { - struct DListHead *list = NULL; + struct DListHead *head = NULL; struct PinCntlr *cntlr = NULL; struct PinCntlr *tmp = NULL; - list = PinCntlrListGet(); - DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + head = PinCntlrListGet(); + + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, head, struct PinCntlr, node) { if (cntlr->number == number) { PinCntlrListPut(); HDF_LOGI("%s: get cntlr by number success!", __func__); @@ -131,13 +130,14 @@ struct PinCntlr *PinCntlrGetByNumber(uint16_t number) struct PinCntlr *PinCntlrGetByPin(struct PinDesc *desc) { - struct DListHead *list = NULL; + struct DListHead *head = NULL; struct PinCntlr *cntlr = NULL; struct PinCntlr *tmp = NULL; int32_t num; - list = PinCntlrListGet(); - DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, list, struct PinCntlr, list) { + head = PinCntlrListGet(); + + DLIST_FOR_EACH_ENTRY_SAFE(cntlr, tmp, head, struct PinCntlr, node) { for (num = 0; num pinCount; num++) { if (desc == &cntlr->pins[num]) { PinCntlrListPut(); @@ -386,4 +386,4 @@ int32_t PinCntlrGetPinFunc(struct PinCntlr *cntlr, struct PinDesc *desc, const c ret = cntlr->method->GetPinFunc(cntlr, index, funcName); (void)OsalSpinUnlockIrqRestore(&cntlr->spin, &irqSave); return ret; -} \ No newline at end of file +} -- Gitee From 13c0839761a6d07127309e6f5f6525ed02480426 Mon Sep 17 00:00:00 2001 From: yufengs Date: Fri, 10 Dec 2021 17:42:31 +0800 Subject: [PATCH 258/272] style: fix usb pnp notify module codex Signed-off-by: yufengs Change-Id: I2859fbb19133215a960db939b2dfb5d682464df3 --- model/usb/src/usb_ddk_pnp_loader.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/model/usb/src/usb_ddk_pnp_loader.c b/model/usb/src/usb_ddk_pnp_loader.c index c1cc406d2..49aace587 100644 --- a/model/usb/src/usb_ddk_pnp_loader.c +++ b/model/usb/src/usb_ddk_pnp_loader.c @@ -7,6 +7,7 @@ */ #include "usb_ddk_pnp_loader.h" +#include #include "devhost_service_clnt.h" #include "device_resource_if.h" #include "hcs_tree_if.h" @@ -15,6 +16,7 @@ #include "hdf_device_object.h" #include "hdf_log.h" #include "hdf_sbuf.h" +#include "osal_file.h" #include "osal_mem.h" #include "osal_time.h" #include "securec.h" @@ -155,15 +157,15 @@ int32_t UsbPnpManagerRegisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) HdfDeviceObjectRelease(devObj); return ret; } - ret = HdfDeviceObjectPublishService(devObj, managerInfo->serviceName, SERVICE_POLICY_CAPACITY, 0664); + ret = HdfDeviceObjectPublishService(devObj, managerInfo->serviceName, SERVICE_POLICY_CAPACITY, + OSAL_S_IREAD | OSAL_S_IWRITE | OSAL_S_IRGRP | OSAL_S_IWGRP | OSAL_S_IROTH); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed to regitst device %s", __func__, managerInfo->serviceName); HdfDeviceObjectRelease(devObj); return ret; } // need optimize this code to remove SaveRegistedDevice function later - SaveRegistedDevice(devObj); - return ret; + return SaveRegistedDevice(devObj); } int32_t UsbPnpManagerUnregisterDevice(struct UsbPnpManagerDeviceInfo *managerInfo) -- Gitee From d5d0106378a179c6820f0941836667142c08a95c Mon Sep 17 00:00:00 2001 From: s00442234 Date: Sat, 11 Dec 2021 18:19:14 +0800 Subject: [PATCH 259/272] fix:delete mipi-dis screen refresh logs Signed-off-by: s00442234 --- support/platform/src/mipi/mipi_dsi_core.c | 27 +++++------------------ 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/support/platform/src/mipi/mipi_dsi_core.c b/support/platform/src/mipi/mipi_dsi_core.c index af39f452e..42f8bd285 100644 --- a/support/platform/src/mipi/mipi_dsi_core.c +++ b/support/platform/src/mipi/mipi_dsi_core.c @@ -23,7 +23,6 @@ static struct MipiDsiHandle g_mipiDsihandle[MAX_CNTLR_CNT]; int32_t MipiDsiRegisterCntlr(struct MipiDsiCntlr *cntlr, struct HdfDeviceObject *device) { - HDF_LOGI("%s: enter!", __func__); if (cntlr == NULL) { HDF_LOGE("%s: cntlr is NULL.", __func__); return HDF_ERR_INVALID_OBJECT; @@ -78,7 +77,6 @@ struct MipiDsiCntlr *MipiDsiCntlrFromDevice(struct HdfDeviceObject *device) struct MipiDsiCntlr *MipiDsiCntlrOpen(uint8_t number) { struct MipiDsiCntlr *cntlr = NULL; - HDF_LOGI("%s: enter!", __func__); if (number >= MAX_CNTLR_CNT) { HDF_LOGE("%s: invalid number.", __func__); @@ -119,7 +117,6 @@ void MipiDsiCntlrClose(struct MipiDsiCntlr *cntlr) int32_t MipiDsiCntlrSetCfg(struct MipiDsiCntlr *cntlr, struct MipiCfg *cfg) { int32_t ret; - HDF_LOGI("%s: enter!", __func__); if ((cntlr == NULL) || (cntlr->ops == NULL)) { HDF_LOGE("%s: cntlr or ops is NULL.", __func__); @@ -141,9 +138,7 @@ int32_t MipiDsiCntlrSetCfg(struct MipiDsiCntlr *cntlr, struct MipiCfg *cfg) ret = cntlr->ops->setCntlrCfg(cntlr); (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } @@ -261,9 +256,7 @@ int32_t MipiDsiCntlrTx(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd) } (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } @@ -292,9 +285,7 @@ int32_t MipiDsiCntlrRx(struct MipiDsiCntlr *cntlr, struct DsiCmdDesc *cmd, int32 ret = cntlr->ops->getCmd(cntlr, cmd, readLen, out); (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } @@ -319,9 +310,7 @@ int32_t MipiDsiCntlrPowerControl(struct MipiDsiCntlr *cntlr, uint8_t enable) ret = cntlr->ops->powerControl(cntlr, enable); (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } @@ -346,9 +335,7 @@ int32_t MipiDsiCntlrAttach(struct MipiDsiCntlr *cntlr, uint8_t *name) ret = cntlr->ops->attach(cntlr, name); (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } @@ -373,9 +360,7 @@ int32_t MipiDsiCntlrSetDrvData(struct MipiDsiCntlr *cntlr, void *panelData) ret = cntlr->ops->setDrvData(cntlr, panelData); (void)OsalMutexUnlock(&(cntlr->lock)); - if (ret == HDF_SUCCESS) { - HDF_LOGI("%s: success!", __func__); - } else { + if (ret != HDF_SUCCESS) { HDF_LOGE("%s: failed!", __func__); } -- Gitee From 2c2f8f1b6732293ce208f386712ded7bfc6a43c9 Mon Sep 17 00:00:00 2001 From: YOUR_NAME Date: Thu, 9 Dec 2021 19:16:18 +0800 Subject: [PATCH 260/272] fix: clear warings in framework and delete redundant code Signed-off-by: YOUR_NAME --- sample/config/device_info/device_info.hcs | 20 - sample/config/gpio/gpio_config.hcs | 15 - sample/config/spi/spi_config.hcs | 19 - sample/platform/gpio/BUILD.gn | 11 - sample/platform/gpio/Kconfig | 12 - sample/platform/gpio/dispatch/BUILD.gn | 45 --- sample/platform/gpio/dispatch/gpio_if.c | 127 ------- sample/platform/gpio/dispatch/gpio_if.h | 42 -- .../gpio/dispatch/hello_gpio_dispatch.c | 46 --- .../gpio/include/gpio_dispatch_sample.h | 23 -- .../platform/gpio/include/gpio_pl061_sample.h | 75 ---- sample/platform/gpio/src/BUILD.gn | 23 -- .../platform/gpio/src/gpio_dispatch_sample.c | 119 ------ sample/platform/gpio/src/gpio_pl061_sample.c | 30 -- sample/platform/gpio/src/gpio_sample.c | 359 ------------------ sample/platform/spi/BUILD.gn | 11 - sample/platform/spi/Kconfig | 12 - sample/platform/spi/dispatch/BUILD.gn | 45 --- .../spi/dispatch/hello_spi_dispatch.c | 46 --- sample/platform/spi/dispatch/spi_if.c | 87 ----- sample/platform/spi/dispatch/spi_if.h | 39 -- .../spi/include/spi_dispatch_sample.h | 21 - .../platform/spi/include/spi_pl022_sample.h | 118 ------ sample/platform/spi/include/spi_sample.h | 18 - sample/platform/spi/src/BUILD.gn | 23 -- sample/platform/spi/src/spi_dispatch_sample.c | 58 --- sample/platform/spi/src/spi_pl022_sample.c | 338 ----------------- sample/platform/spi/src/spi_sample.c | 355 ----------------- sample/platform/uart/dispatch/uart_if.c | 1 - .../platform/uart/src/uart_dispatch_sample.c | 1 - 30 files changed, 2139 deletions(-) delete mode 100755 sample/config/gpio/gpio_config.hcs delete mode 100755 sample/config/spi/spi_config.hcs delete mode 100755 sample/platform/gpio/BUILD.gn delete mode 100755 sample/platform/gpio/Kconfig delete mode 100755 sample/platform/gpio/dispatch/BUILD.gn delete mode 100755 sample/platform/gpio/dispatch/gpio_if.c delete mode 100755 sample/platform/gpio/dispatch/gpio_if.h delete mode 100755 sample/platform/gpio/dispatch/hello_gpio_dispatch.c delete mode 100755 sample/platform/gpio/include/gpio_dispatch_sample.h delete mode 100755 sample/platform/gpio/include/gpio_pl061_sample.h delete mode 100755 sample/platform/gpio/src/BUILD.gn delete mode 100755 sample/platform/gpio/src/gpio_dispatch_sample.c delete mode 100755 sample/platform/gpio/src/gpio_pl061_sample.c delete mode 100755 sample/platform/gpio/src/gpio_sample.c delete mode 100755 sample/platform/spi/BUILD.gn delete mode 100755 sample/platform/spi/Kconfig delete mode 100755 sample/platform/spi/dispatch/BUILD.gn delete mode 100755 sample/platform/spi/dispatch/hello_spi_dispatch.c delete mode 100755 sample/platform/spi/dispatch/spi_if.c delete mode 100755 sample/platform/spi/dispatch/spi_if.h delete mode 100755 sample/platform/spi/include/spi_dispatch_sample.h delete mode 100755 sample/platform/spi/include/spi_pl022_sample.h delete mode 100755 sample/platform/spi/include/spi_sample.h delete mode 100755 sample/platform/spi/src/BUILD.gn delete mode 100755 sample/platform/spi/src/spi_dispatch_sample.c delete mode 100755 sample/platform/spi/src/spi_pl022_sample.c delete mode 100755 sample/platform/spi/src/spi_sample.c diff --git a/sample/config/device_info/device_info.hcs b/sample/config/device_info/device_info.hcs index 091cf61d1..f3cd30a2a 100755 --- a/sample/config/device_info/device_info.hcs +++ b/sample/config/device_info/device_info.hcs @@ -3,16 +3,6 @@ root { platform :: host { hostName = "platform_host"; priority = 50; - device_gpio :: device { - device1 :: deviceNode { - policy = 2; - priority = 10; - permission = 0660; - moduleName = "GPIO_SAMPLE"; - serviceName = "GPIO_SAMPLE"; - deviceMatchAttr = "sample_gpio"; - } - } device_uart :: device { device5 :: deviceNode { policy = 2; @@ -23,16 +13,6 @@ root { deviceMatchAttr = "sample_uart_5"; } } - device_spi :: device { - device3 :: deviceNode { - policy = 2; - priority = 60; - permission = 0660; - moduleName = "SPI_SAMPLE"; - serviceName = "HDF_PLATFORM_SPI_3"; - deviceMatchAttr = "sample_spi_3"; - } - } } } } diff --git a/sample/config/gpio/gpio_config.hcs b/sample/config/gpio/gpio_config.hcs deleted file mode 100755 index a7be88262..000000000 --- a/sample/config/gpio/gpio_config.hcs +++ /dev/null @@ -1,15 +0,0 @@ -root { - platform { - gpio_config { - gpio_sample { - match_attr = "sample_gpio"; - groupNum = 12; - bitNum = 8; - regBase = 0x120d0000; - regStep = 0x1000; - irqStart = 48; - irqShare = 0; - } - } - } -} \ No newline at end of file diff --git a/sample/config/spi/spi_config.hcs b/sample/config/spi/spi_config.hcs deleted file mode 100755 index 29064ea0d..000000000 --- a/sample/config/spi/spi_config.hcs +++ /dev/null @@ -1,19 +0,0 @@ -root { - platform { - spi_config { - spi_sample { - serviceName = "SPI_SAMPLE"; - match_attr = "sample_spi_3"; - transferMode = 0; - busNum = 0; - clkRate = 100000000; - bitsPerWord = 8; - mode = 19; - speed = 2000000; - fifoSize = 256; - numCs = 1; - regBase = 0x120c0000; - } - } - } -} \ No newline at end of file diff --git a/sample/platform/gpio/BUILD.gn b/sample/platform/gpio/BUILD.gn deleted file mode 100755 index 7578ab231..000000000 --- a/sample/platform/gpio/BUILD.gn +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -import("//build/lite/config/component/lite_component.gni") - -lite_component("hello_gpio_sample") { - features = [ "dispatch:hello_gpio_dispatch" ] -} diff --git a/sample/platform/gpio/Kconfig b/sample/platform/gpio/Kconfig deleted file mode 100755 index dc445d847..000000000 --- a/sample/platform/gpio/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -config DRIVERS_HDF_PLATFORM_GPIO_SAMPLE - bool "Enable HDF platform gpio sample driver" - default n - depends on DRIVERS_HDF_PLATFORM - help - Answer Y to enable HDF platform gpio sample driver. diff --git a/sample/platform/gpio/dispatch/BUILD.gn b/sample/platform/gpio/dispatch/BUILD.gn deleted file mode 100755 index 06291325d..000000000 --- a/sample/platform/gpio/dispatch/BUILD.gn +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -HDF_FRAMEWORKS = "//drivers/framework" - -executable("hello_gpio_dispatch") { - sources = [ - "gpio_if.c", - "hello_gpio_dispatch.c", - ] - - include_dirs = [ - "$HDF_FRAMEWORKS/ability/sbuf/include", - "$HDF_FRAMEWORKS/core/shared/include", - "$HDF_FRAMEWORKS/core/host/include", - "$HDF_FRAMEWORKS/core/master/include", - "$HDF_FRAMEWORKS/include/core", - "$HDF_FRAMEWORKS/include/utils", - "$HDF_FRAMEWORKS/utils/include", - "$HDF_FRAMEWORKS/include/osal", - "//drivers/adapter/uhdf/posix/include", - "//third_party/bounds_checking_function/include", - "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", - "//drivers/framework/support/platform/include/gpio", - ] - - deps = [ - "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", - "//drivers/adapter/uhdf/manager:hdf_core", - "//drivers/adapter/uhdf/posix:hdf_posix_osal", - ] - - public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] - defines = [ "__USER__" ] - - cflags = [ - "-Wall", - "-Wextra", - "-Wno-format", - "-Wno-format-extra-args", - ] -} diff --git a/sample/platform/gpio/dispatch/gpio_if.c b/sample/platform/gpio/dispatch/gpio_if.c deleted file mode 100755 index 834080b2b..000000000 --- a/sample/platform/gpio/dispatch/gpio_if.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_if.h" -#include "hdf_log.h" -#include "hdf_io_service_if.h" - -#define HDF_LOG_TAG gpio_if - -static struct HdfIoService *GetIoService() -{ - static struct HdfIoService *ioService = NULL; - if (ioService != NULL) { - return ioService; - } - - ioService = HdfIoServiceBind(GPIO_SERVICE_NAME); - if (ioService == NULL) { - HDF_LOGE("Failed to get service %s", GPIO_SERVICE_NAME); - } - return ioService; -} - -static int32_t GpioOperate(enum GpioOps ops, uint16_t gpio, uint16_t val) -{ - int ret = HDF_FAILURE; - struct HdfIoService *service = GetIoService(); - if (service == NULL) { - return ret; - } - struct HdfSBuf *data = HdfSBufObtainDefaultSize(); - if (data == NULL) { - HDF_LOGE("Failed to obtain sBuf"); - return ret; - } - - if (!HdfSbufWriteUint16(data, gpio) || !HdfSbufWriteUint16(data, val)) { - HDF_LOGE("Failed to write sBuf"); - HdfSBufRecycle(data); - return HDF_FAILURE; - } - ret = service->dispatcher->Dispatch(&service->object, ops, data, NULL); - if (ret != HDF_SUCCESS) { - HDF_LOGE("Failed to send service call, ret: %d", ret); - } - HdfSBufRecycle(data); - return ret; -} - -static int32_t GpioQuery(enum GpioOps ops, uint16_t gpio, uint16_t *val) -{ - int ret = HDF_FAILURE; - struct HdfIoService *service = GetIoService(); - if (service == NULL) { - return ret; - } - struct HdfSBuf *data = HdfSBufObtainDefaultSize(); - struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); - if (data == NULL || reply == NULL) { - HDF_LOGE("Failed to obtain sBuf"); - return ret; - } - - if (!HdfSbufWriteUint16(data, gpio)) { - HDF_LOGE("Failed to write data sBuf"); - goto __ERR__; - } - ret = service->dispatcher->Dispatch(&service->object, ops, data, reply); - if (ret != HDF_SUCCESS) { - HDF_LOGE("Failed to send service call"); - goto __ERR__; - } - if (!HdfSbufReadUint16(reply, val)) { - HDF_LOGE("Failed to read reply sBuf"); - goto __ERR__; - } - goto __ERR__; - - __ERR__: - HdfSBufRecycle(data); - HdfSBufRecycle(reply); - return ret; -} - -int32_t GpioOpen() -{ - struct HdfIoService *ioService = GetIoService(); - if (ioService == NULL) { - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -int32_t GpioSetDir(uint16_t gpio, uint16_t dir) -{ - return GpioOperate(GPIO_OPS_SET_DIR, gpio, dir); -} - -int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) -{ - return GpioQuery(GPIO_OPS_GET_DIR, gpio, dir); -} - -int32_t GpioWrite(uint16_t gpio, uint16_t val) -{ - return GpioOperate(GPIO_OPS_WRITE, gpio, val); -} - -int32_t GpioRead(uint16_t gpio, uint16_t *val) -{ - return GpioQuery(GPIO_OPS_READ, gpio, val); -} - -int32_t GpioClose() -{ - struct HdfIoService *ioService = GetIoService(); - if (ioService == NULL) { - return HDF_FAILURE; - } - HdfIoServiceRecycle(ioService); - return HDF_SUCCESS; -} \ No newline at end of file diff --git a/sample/platform/gpio/dispatch/gpio_if.h b/sample/platform/gpio/dispatch/gpio_if.h deleted file mode 100755 index 4efb7870f..000000000 --- a/sample/platform/gpio/dispatch/gpio_if.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef GPIO_IF_H -#define GPIO_IF_H - -#include - -#define GPIO_SERVICE_NAME "GPIO_SAMPLE" - -enum GpioValue { - GPIO_VAL_LOW = 0, - GPIO_VAL_HIGH = 1, - GPIO_VAL_ERR, -}; - -enum GpioDirType { - GPIO_DIR_IN = 0, - GPIO_DIR_OUT = 1, - GPIO_DIR_ERR, -}; - -enum GpioOps { - GPIO_OPS_SET_DIR = 1, - GPIO_OPS_GET_DIR, - GPIO_OPS_WRITE, - GPIO_OPS_READ -}; - -int32_t GpioOpen(); -int32_t GpioClose(); -int32_t GpioSetDir(uint16_t gpio, uint16_t dir); -int32_t GpioGetDir(uint16_t gpio, uint16_t *dir); -int32_t GpioWrite(uint16_t gpio, uint16_t val); -int32_t GpioRead(uint16_t gpio, uint16_t *val); - -#endif // GPIO_IF_H \ No newline at end of file diff --git a/sample/platform/gpio/dispatch/hello_gpio_dispatch.c b/sample/platform/gpio/dispatch/hello_gpio_dispatch.c deleted file mode 100755 index c242acd06..000000000 --- a/sample/platform/gpio/dispatch/hello_gpio_dispatch.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_if.h" -#include "hdf_log.h" -#include "hdf_base.h" - -#define HDF_LOG_TAG hello_gpio_dispatch -#define GPIO_PIN 11 - -int main() -{ - uint16_t dir; - uint16_t val; - if (GpioOpen() != HDF_SUCCESS) { - HDF_LOGE("%s: GpioOpen failed", __func__); - return HDF_FAILURE; - } - if (GpioSetDir(GPIO_PIN, GPIO_DIR_IN) != HDF_SUCCESS) { - HDF_LOGE("%s: GpioSetDir failed, gpio %u, dir %u", __func__, GPIO_PIN, GPIO_DIR_IN); - return HDF_FAILURE; - } - if (GpioWrite(GPIO_PIN, GPIO_VAL_HIGH) != HDF_SUCCESS) { - HDF_LOGE("%s: GpioWrite failed, gpio %u, val %u", __func__, GPIO_PIN, GPIO_VAL_HIGH); - return HDF_FAILURE; - } - if (GpioGetDir(GPIO_PIN, &dir) != HDF_SUCCESS) { - HDF_LOGE("%s: GpioGetDir failed, gpio %u", __func__, GPIO_PIN); - return HDF_FAILURE; - } - if (GpioRead(GPIO_PIN, &val) != HDF_SUCCESS) { - HDF_LOGE("%s: GpioRead failed, gpio %u", __func__, GPIO_PIN); - return HDF_FAILURE; - } - if (GpioClose() != HDF_SUCCESS) { - HDF_LOGE("%s: GpioClose failed", __func__); - return HDF_FAILURE; - } - HDF_LOGD("GPIO %u direction is set to %u, value is set to %u", GPIO_PIN, dir, val); - return HDF_SUCCESS; -} \ No newline at end of file diff --git a/sample/platform/gpio/include/gpio_dispatch_sample.h b/sample/platform/gpio/include/gpio_dispatch_sample.h deleted file mode 100755 index cd33dc127..000000000 --- a/sample/platform/gpio/include/gpio_dispatch_sample.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef GPIO_DISPATCH_SAMPLE_H -#define GPIO_DISPATCH_SAMPLE_H - -#include "gpio_pl061_sample.h" - -enum GpioOps { - GPIO_OPS_SET_DIR = 1, - GPIO_OPS_GET_DIR, - GPIO_OPS_WRITE, - GPIO_OPS_READ -}; - -int32_t SampleGpioDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply); - -#endif // GPIO_DISPATCH_SAMPLE_H diff --git a/sample/platform/gpio/include/gpio_pl061_sample.h b/sample/platform/gpio/include/gpio_pl061_sample.h deleted file mode 100755 index b133a7bd8..000000000 --- a/sample/platform/gpio/include/gpio_pl061_sample.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef GPIO_PL061_SAMPLE_H -#define GPIO_PL061_SAMPLE_H - -#include "gpio_core.h" -#include "gpio_if.h" -#include "osal.h" - -#define GROUP_MAX 32 -#define BIT_MAX 16 - -#define GPIO_DATA(base, bit) ((base) + 0x000 + (1 << ((bit) + 2))) -#define GPIO_DIR(base) ((base) + 0x400) -#define GPIO_IS(base) ((base) + 0x404) -#define GPIO_IBE(base) ((base) + 0x408) -#define GPIO_IEV(base) ((base) + 0x40C) -#define GPIO_IE(base) ((base) + 0x410) -#define GPIO_RIS(base) ((base) + 0x414) -#define GPIO_MIS(base) ((base) + 0x418) -#define GPIO_IC(base) ((base) + 0x41C) - -struct GpioGroup { - volatile unsigned char *regBase; - unsigned int index; - OsalSpinlock lock; -}; - -struct Pl061GpioCntlr { - struct GpioCntlr cntlr; - volatile unsigned char *regBase; - uint32_t phyBase; - uint32_t regStep; - uint32_t irqStart; - uint16_t groupNum; - uint16_t bitNum; - uint8_t irqShare; - struct GpioGroup *groups; -}; - -static struct Pl061GpioCntlr g_samplePl061GpioCntlr = { - .groups = NULL, - .groupNum = GROUP_MAX, - .bitNum = BIT_MAX, -}; - -static inline struct Pl061GpioCntlr *ToPl061GpioCntlr(struct GpioCntlr *cntlr) -{ - return (struct Pl061GpioCntlr *)cntlr; -} - -static inline uint16_t Pl061ToGroupNum(uint16_t gpio) -{ - return (uint16_t)(gpio / g_samplePl061GpioCntlr.bitNum); -} - -static inline uint16_t Pl061ToBitNum(uint16_t gpio) -{ - return (uint16_t)(gpio % g_samplePl061GpioCntlr.bitNum); -} - -static inline uint16_t Pl061ToGpioNum(uint16_t group, uint16_t bit) -{ - return (uint16_t)(group * g_samplePl061GpioCntlr.bitNum + bit); -} - -int32_t Pl061GetGroupByGpioNum(struct GpioCntlr *cntlr, uint16_t gpio, - struct GpioGroup **group); -#endif // GPIO_PL061_SAMPLE_H diff --git a/sample/platform/gpio/src/BUILD.gn b/sample/platform/gpio/src/BUILD.gn deleted file mode 100755 index 847987af1..000000000 --- a/sample/platform/gpio/src/BUILD.gn +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -import("//drivers/adapter/khdf/liteos/hdf.gni") - -module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO_SAMPLE) -module_name = "hdf_gpio_sample" -hdf_driver(module_name) { - FRAMEWORK_GPIO_ROOT = "//drivers/framework/sample/platform/gpio/src" - sources = [ - "$FRAMEWORK_GPIO_ROOT/gpio_dispatch_sample.c", - "$FRAMEWORK_GPIO_ROOT/gpio_pl061_sample.c", - "$FRAMEWORK_GPIO_ROOT/gpio_sample.c", - ] - - include_dirs = [ - "//drivers/framework/sample/platform/gpio/include/", - "//drivers/framework/support/platform/include/gpio", - ] -} diff --git a/sample/platform/gpio/src/gpio_dispatch_sample.c b/sample/platform/gpio/src/gpio_dispatch_sample.c deleted file mode 100755 index b93746ff5..000000000 --- a/sample/platform/gpio/src/gpio_dispatch_sample.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_dispatch_sample.h" - -#define HDF_LOG_TAG gpio_dispatch_sample - -static int32_t SampleGpioSetDir(struct GpioCntlr *cntlr, struct HdfSBuf *data) -{ - uint16_t gpio; - uint16_t dir; - if (!HdfSbufReadUint16(data, &gpio) || !HdfSbufReadUint16(data, &dir)) { - HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (cntlr->ops->setDir == NULL) { - HDF_LOGE("%s: cntlr->ops->setDir is NULL", __func__); - return HDF_DEV_ERR_OP; - } - return cntlr->ops->setDir(cntlr, gpio, dir); -} - -static int32_t SampleGpioGetDir(struct GpioCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - int32_t ret; - uint16_t gpio; - uint16_t dir; - if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (cntlr->ops->getDir == NULL) { - HDF_LOGE("%s: cntlr->ops->getDir is NULL", __func__); - return HDF_DEV_ERR_OP; - } - ret = cntlr->ops->getDir(cntlr, gpio, &dir); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: cntlr->ops->getDir failed, ret: %d", __func__, ret); - return ret; - } - if (!HdfSbufWriteUint16(reply, dir)) { - HDF_LOGE("%s: HdfSbufWriteUint16 failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, struct HdfSBuf *data) -{ - uint16_t gpio; - uint16_t val; - if (!HdfSbufReadUint16(data, &gpio) || !HdfSbufReadUint16(data, &val)) { - HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (cntlr->ops->write == NULL) { - HDF_LOGE("%s: cntlr->ops->read is NULL", __func__); - return HDF_DEV_ERR_OP; - } - return cntlr->ops->write(cntlr, gpio, val); -} - -static int32_t SampleGpioRead(struct GpioCntlr *cntlr, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - int32_t ret; - uint16_t gpio; - uint16_t val; - if (!HdfSbufReadUint16(data, &gpio)) { - HDF_LOGE("%s: HdfSbufReadUint16 failed", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (cntlr->ops->read == NULL) { - HDF_LOGE("%s: cntlr->ops->read is NULL", __func__); - return HDF_DEV_ERR_OP; - } - ret = cntlr->ops->read(cntlr, gpio, &val); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: cntlr->ops->read failed, ret: %d", __func__, ret); - return ret; - } - if (!HdfSbufWriteUint16(reply, val)) { - HDF_LOGE("%s: HdfSbufWriteUint16 failed", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -int32_t SampleGpioDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - if (client == NULL || client->device == NULL) { - HDF_LOGE("%s: client or client->device is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - - struct GpioCntlr *cntlr = (struct GpioCntlr *)client->device->service; - if (cntlr == NULL || cntlr->ops == NULL) { - HDF_LOGE("%s: cntlr or cntlr->ops is NULL", __func__); - return HDF_ERR_INVALID_PARAM; - } - - switch (cmdId) { - case GPIO_OPS_SET_DIR: - return SampleGpioSetDir(cntlr, data); - case GPIO_OPS_GET_DIR: - return SampleGpioGetDir(cntlr, data, reply); - case GPIO_OPS_WRITE: - return SampleGpioWrite(cntlr, data); - case GPIO_OPS_READ: - return SampleGpioRead(cntlr, data, reply); - default: - HDF_LOGE("%s: invalid cmdId %d", __func__, cmdId); - return HDF_FAILURE; - } -} \ No newline at end of file diff --git a/sample/platform/gpio/src/gpio_pl061_sample.c b/sample/platform/gpio/src/gpio_pl061_sample.c deleted file mode 100755 index fb8252b74..000000000 --- a/sample/platform/gpio/src/gpio_pl061_sample.c +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_pl061_sample.h" -#include "osal_irq.h" - -#define HDF_LOG_TAG gpio_pl061_sample - -int32_t Pl061GetGroupByGpioNum(struct GpioCntlr *cntlr, uint16_t gpio, struct GpioGroup **group) -{ - struct Pl061GpioCntlr *pl061 = NULL; - uint16_t groupIndex = Pl061ToGroupNum(gpio); - - if (cntlr == NULL) { - HDF_LOGE("%s: cntlr is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - pl061 = ToPl061GpioCntlr(cntlr); - if (groupIndex >= pl061->groupNum) { - HDF_LOGE("%s: err group index:%u", __func__, groupIndex); - return HDF_ERR_INVALID_PARAM; - } - *group = &pl061->groups[groupIndex]; - return HDF_SUCCESS; -} \ No newline at end of file diff --git a/sample/platform/gpio/src/gpio_sample.c b/sample/platform/gpio/src/gpio_sample.c deleted file mode 100755 index 344929f2d..000000000 --- a/sample/platform/gpio/src/gpio_sample.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "gpio_dispatch_sample.h" -#include "gpio_pl061_sample.h" -#include "device_resource_if.h" -#include "hdf_device_desc.h" -#include "gpio_if.h" -#include "osal.h" -#include "osal_io.h" -#include "gpio_core.h" - -#define HDF_LOG_TAG gpio_sample - -/* HdfDriverEntry hook function prototypes */ -static int32_t SampleGpioDriverBind(struct HdfDeviceObject *device); -static int32_t SampleGpioDriverInit(struct HdfDeviceObject *device); -static void SampleGpioDriverRelease(struct HdfDeviceObject *device); - -/* HdfDriverEntry definition */ -struct HdfDriverEntry g_sampleGpioDriverEntry = { - .moduleVersion = 1, - .moduleName = "GPIO_SAMPLE", - .Bind = SampleGpioDriverBind, - .Init = SampleGpioDriverInit, - .Release = SampleGpioDriverRelease, -}; - -/* Init HdfDriverEntry */ -HDF_INIT(g_sampleGpioDriverEntry); - -/* GPIO function prototypes */ -static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t val); -static int32_t SampleGpioRead(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *val); -static int32_t SampleGpioSetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t dir); -static int32_t SampleGpioGetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *dir); - -/* GpioMethod definition */ -struct GpioMethod g_sampleGpioMethod = { - .request = NULL, - .release = NULL, - .write = SampleGpioWrite, - .read = SampleGpioRead, - .setDir = SampleGpioSetDirection, - .getDir = SampleGpioGetDirection, - .toIrq = NULL, - .setIrq = NULL, - .unsetIrq = NULL, - .enableIrq = NULL, - .disableIrq = NULL, -}; - -/* Private function prototypes */ -/* Read GPIO device resource */ -static int32_t GetGpioDeviceResource(struct Pl061GpioCntlr *cntlr, const struct DeviceResourceNode *node); -/* Init GPIO controller memory */ -static int32_t InitGpioCntlrMem(struct Pl061GpioCntlr *cntlr); -/* Release GPIO controller memory */ -static void ReleaseGpioCntlrMem(struct Pl061GpioCntlr *cntlr); - -/* HdfDriverEntry hook function implementations */ -static int32_t SampleGpioDriverBind(struct HdfDeviceObject *device) -{ - HDF_LOGD("%s: Enter", __func__); - struct Pl061GpioCntlr *pl061Cntlr = &g_samplePl061GpioCntlr; - pl061Cntlr->cntlr.device = device; - device->service = &(pl061Cntlr->cntlr.service); - pl061Cntlr->cntlr.device->service->Dispatch = SampleGpioDispatch; - return HDF_SUCCESS; -} - -static int32_t SampleGpioDriverInit(struct HdfDeviceObject *device) -{ - int32_t ret; - struct Pl061GpioCntlr *pl061Cntlr = &g_samplePl061GpioCntlr; - - HDF_LOGD("%s: Enter", __func__); - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property NULL!", __func__); - return HDF_ERR_INVALID_OBJECT; - } - - ret = GetGpioDeviceResource(pl061Cntlr, device->property); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: get gpio device resource fail:%d", __func__, ret); - return ret; - } - - if (pl061Cntlr->groupNum > GROUP_MAX || pl061Cntlr->groupNum <= 0 || pl061Cntlr->bitNum > BIT_MAX || - pl061Cntlr->bitNum <= 0) { - HDF_LOGE("%s: invalid groupNum:%u or bitNum:%u", __func__, pl061Cntlr->groupNum, - pl061Cntlr->bitNum); - return HDF_ERR_INVALID_PARAM; - } - - pl061Cntlr->regBase = OsalIoRemap(pl061Cntlr->phyBase, pl061Cntlr->groupNum * pl061Cntlr->regStep); - if (pl061Cntlr->regBase == NULL) { - HDF_LOGE("%s: err remap phy:0x%x", __func__, pl061Cntlr->phyBase); - return HDF_ERR_IO; - } - - ret = InitGpioCntlrMem(pl061Cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: err init cntlr mem:%d", __func__, ret); - OsalIoUnmap((void *)pl061Cntlr->regBase); - pl061Cntlr->regBase = NULL; - return ret; - } - pl061Cntlr->cntlr.count = pl061Cntlr->groupNum * pl061Cntlr->bitNum; - pl061Cntlr->cntlr.priv = (void *)device->property; - pl061Cntlr->cntlr.ops = &g_sampleGpioMethod; - ret = GpioCntlrAdd(&pl061Cntlr->cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: err add controller: %d", __func__, ret); - return ret; - } - HDF_LOGI("%s: dev service:%s init success!", __func__, HdfDeviceGetServiceName(device)); - return ret; -} - -static void SampleGpioDriverRelease(struct HdfDeviceObject *device) -{ - struct GpioCntlr *gpioCntlr = NULL; - struct Pl061GpioCntlr *pl061GpioCntlr = NULL; - - HDF_LOGD("%s: Enter", __func__); - if (device == NULL) { - HDF_LOGE("%s: device is null!", __func__); - return; - } - - gpioCntlr = GpioCntlrFromDevice(device); - if (gpioCntlr == NULL) { - HDF_LOGE("%s: no service bound!", __func__); - return; - } - GpioCntlrRemove(gpioCntlr); - - pl061GpioCntlr = (struct Pl061GpioCntlr *)gpioCntlr; - ReleaseGpioCntlrMem(pl061GpioCntlr); - OsalIoUnmap((void *)pl061GpioCntlr->regBase); - pl061GpioCntlr->regBase = NULL; -} - -/* Private function implementations */ -static int32_t GetGpioDeviceResource(struct Pl061GpioCntlr *cntlr, const struct DeviceResourceNode *node) -{ - int32_t ret; - struct DeviceResourceIface *dri = NULL; - - dri = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (dri == NULL || dri->GetUint8 == NULL || dri->GetUint16 == NULL || dri->GetUint32 == NULL) { - HDF_LOGE("%s: invalid dri ops fail!", __func__); - return HDF_FAILURE; - } - - ret = dri->GetUint32(node, "regBase", &cntlr->phyBase, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read regBase fail!", __func__); - return ret; - } - - ret = dri->GetUint32(node, "regStep", &cntlr->regStep, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read regStep fail!", __func__); - return ret; - } - - ret = dri->GetUint16(node, "groupNum", &cntlr->groupNum, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read groupNum fail!", __func__); - return ret; - } - - ret = dri->GetUint16(node, "bitNum", &cntlr->bitNum, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read bitNum fail!", __func__); - return ret; - } - - ret = dri->GetUint32(node, "irqStart", &cntlr->irqStart, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read irqStart fail!", __func__); - return ret; - } - - ret = dri->GetUint8(node, "irqShare", &cntlr->irqShare, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read irqShare fail!", __func__); - return ret; - } - - return HDF_SUCCESS; -} - -static int32_t InitGpioCntlrMem(struct Pl061GpioCntlr *cntlr) -{ - size_t groupMemSize; - struct GpioGroup *groups = NULL; - - if (cntlr == NULL) { - return HDF_ERR_INVALID_PARAM; - } - - groupMemSize = sizeof(struct GpioGroup) * cntlr->groupNum; - groups = (struct GpioGroup *)OsalMemCalloc(groupMemSize); - if (groups == NULL) { - return HDF_ERR_MALLOC_FAIL; - } - cntlr->groups = groups; - - for (uint16_t i = 0; i < cntlr->groupNum; i++) { - groups[i].index = i; - groups[i].regBase = cntlr->regBase + (i * cntlr->regStep); - if (OsalSpinInit(&groups[i].lock) != HDF_SUCCESS) { - for (; i > 0; i--) { - (void)OsalSpinDestroy(&groups[i - 1].lock); - } - OsalMemFree(groups); - return HDF_FAILURE; - } - } - return HDF_SUCCESS; -} - -static void ReleaseGpioCntlrMem(struct Pl061GpioCntlr *cntlr) -{ - if (cntlr == NULL) { - return; - } - if (cntlr->groups != NULL) { - for (uint16_t i = 0; i < cntlr->groupNum; i++) { - (void)OsalSpinDestroy(&cntlr->groups[i].lock); - } - OsalMemFree(cntlr->groups); - cntlr->groups = NULL; - } -} - -/* GPIO function implementations */ -static int32_t SampleGpioWrite(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t val) -{ - HDF_LOGD("%s: Enter", __func__); - - int32_t ret; - uint32_t irqSave; - unsigned int valCur; - unsigned int bitNum = Pl061ToBitNum(gpio); - volatile unsigned char *addr = NULL; - struct GpioGroup *group = NULL; - - ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); - if (ret != HDF_SUCCESS) { - return ret; - } - - addr = GPIO_DATA(group->regBase, bitNum); - if (OsalSpinLockIrqSave(&group->lock, &irqSave) != HDF_SUCCESS) { - return HDF_ERR_DEVICE_BUSY; - } - valCur = OSAL_READL(addr); - if (val == GPIO_VAL_LOW) { - valCur &= ~(1 << bitNum); - } else { - valCur |= (1 << bitNum); - } - OSAL_WRITEL(valCur, addr); - (void)OsalSpinUnlockIrqRestore(&group->lock, &irqSave); - HDF_LOGD("%s: gpio:%u, val:%u", __func__, gpio, val); - return HDF_SUCCESS; -} - -static int32_t SampleGpioRead(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *val) -{ - HDF_LOGD("%s: Enter", __func__); - - int32_t ret; - unsigned int valCur; - volatile unsigned char *addr = NULL; - unsigned int bitNum = Pl061ToBitNum(gpio); - struct GpioGroup *group = NULL; - - ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); - if (ret != HDF_SUCCESS) { - return ret; - } - - addr = GPIO_DATA(group->regBase, bitNum); - valCur = OSAL_READL(addr); - if (valCur & (1 << bitNum)) { - *val = GPIO_VAL_HIGH; - } else { - *val = GPIO_VAL_LOW; - } - HDF_LOGD("%s: gpio:%u, val:%u", __func__, gpio, *val); - return HDF_SUCCESS; -} - -static int32_t SampleGpioSetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t dir) -{ - HDF_LOGD("%s: Enter", __func__); - - int32_t ret; - uint32_t irqSave; - unsigned int val; - volatile unsigned char *addr = NULL; - unsigned int bitNum = Pl061ToBitNum(gpio); - struct GpioGroup *group = NULL; - - HDF_LOGD("%s: gpio:%u, dir:%d", __func__, gpio, dir); - ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); - if (ret != HDF_SUCCESS) { - return ret; - } - - addr = GPIO_DIR(group->regBase); - if (OsalSpinLockIrqSave(&group->lock, &irqSave) != HDF_SUCCESS) { - return HDF_ERR_DEVICE_BUSY; - } - val = OSAL_READL(addr); - if (dir == GPIO_DIR_IN) { - val &= ~(1 << bitNum); - } else if (dir == GPIO_DIR_OUT) { - val |= 1 << bitNum; - } - OSAL_WRITEL(val, addr); - (void)OsalSpinUnlockIrqRestore(&group->lock, &irqSave); - return HDF_SUCCESS; -} -static int32_t SampleGpioGetDirection(struct GpioCntlr *cntlr, uint16_t gpio, uint16_t *dir) -{ - HDF_LOGD("%s: Enter", __func__); - - int32_t ret; - unsigned int val; - volatile unsigned char *addr = NULL; - unsigned int bitNum = Pl061ToBitNum(gpio); - struct GpioGroup *group = NULL; - - HDF_LOGD("%s: gpio:%u, dir:%p", __func__, gpio, dir); - ret = Pl061GetGroupByGpioNum(cntlr, gpio, &group); - if (ret != HDF_SUCCESS) { - return ret; - } - - addr = GPIO_DIR(group->regBase); - val = OSAL_READL(addr); - if (val & (1 << bitNum)) { - *dir = GPIO_DIR_OUT; - } else { - *dir = GPIO_DIR_IN; - } - return HDF_SUCCESS; -} \ No newline at end of file diff --git a/sample/platform/spi/BUILD.gn b/sample/platform/spi/BUILD.gn deleted file mode 100755 index 8781560bb..000000000 --- a/sample/platform/spi/BUILD.gn +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -import("//build/lite/config/component/lite_component.gni") - -lite_component("hello_spi_sample") { - features = [ "dispatch:hello_spi_dispatch" ] -} diff --git a/sample/platform/spi/Kconfig b/sample/platform/spi/Kconfig deleted file mode 100755 index 5141be9d2..000000000 --- a/sample/platform/spi/Kconfig +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -config DRIVERS_HDF_PLATFORM_SPI_SAMPLE - bool "Enable HDF platform spi sample driver" - default n - depends on DRIVERS_HDF_PLATFORM - help - Answer Y to enable HDF platform spi sample driver. diff --git a/sample/platform/spi/dispatch/BUILD.gn b/sample/platform/spi/dispatch/BUILD.gn deleted file mode 100755 index cb5a2aeb4..000000000 --- a/sample/platform/spi/dispatch/BUILD.gn +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -HDF_FRAMEWORKS = "//drivers/framework" - -executable("hello_spi_dispatch") { - sources = [ - "hello_spi_dispatch.c", - "spi_if.c", - ] - - include_dirs = [ - "$HDF_FRAMEWORKS/ability/sbuf/include", - "$HDF_FRAMEWORKS/core/shared/include", - "$HDF_FRAMEWORKS/core/host/include", - "$HDF_FRAMEWORKS/core/master/include", - "$HDF_FRAMEWORKS/include/core", - "$HDF_FRAMEWORKS/include/platform", - "$HDF_FRAMEWORKS/include/utils", - "$HDF_FRAMEWORKS/utils/include", - "$HDF_FRAMEWORKS/include/osal", - "//drivers/adapter/uhdf/posix/include", - "//third_party/bounds_checking_function/include", - "//base/hiviewdfx/hilog_lite/interfaces/native/innerkits", - ] - - deps = [ - "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", - "//drivers/adapter/uhdf/manager:hdf_core", - "//drivers/adapter/uhdf/posix:hdf_posix_osal", - ] - - public_deps = [ "//third_party/bounds_checking_function:libsec_shared" ] - defines = [ "__USER__" ] - - cflags = [ - "-Wall", - "-Wextra", - "-Wno-format", - "-Wno-format-extra-args", - ] -} diff --git a/sample/platform/spi/dispatch/hello_spi_dispatch.c b/sample/platform/spi/dispatch/hello_spi_dispatch.c deleted file mode 100755 index 51730c37c..000000000 --- a/sample/platform/spi/dispatch/hello_spi_dispatch.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "spi_if.h" -#include "hdf_log.h" - -#define HDF_LOG_TAG hello_spi_dispatch - -#define SPI_BUS_NUM 3 -#define SPI_MSG_SPEED 115200 - -int main() -{ - int32_t ret; - struct SpiDevInfo spiDevInfo; /* SPI device descriptor */ - struct DevHandle *spiHandle = NULL; /* SPI device handle */ - spiDevInfo.busNum = SPI_BUS_NUM; /* SPI device bus number */ - spiDevInfo.csNum = 0; /* SPI device CS number */ - spiHandle = SpiOpen(&spiDevInfo); - if (spiHandle == NULL) { - HDF_LOGE("SpiOpen failed"); - return HDF_FAILURE; - } - - uint8_t wbuff[1] = {0x12}; - uint8_t rbuff[1] = {0}; - struct SpiMsg msg; /* Custom message to be transferred */ - msg.wbuf = wbuff; /* Pointer to the data to write */ - msg.rbuf = rbuff; /* Pointer to the data to read */ - msg.len = 1; /* The length of the data to be read or written is 1 bits. */ - msg.csChange = 1; /* Disable the CS before the next transfer. */ - msg.delayUs = 0; /* No delay before the next transfer */ - msg.speed = SPI_MSG_SPEED; /* Speed of this transfer */ - ret = SpiTransfer(spiHandle, &msg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("SpiTransfer failed, ret %d", ret); - return ret; - } - SpiClose(spiHandle); - return ret; -} \ No newline at end of file diff --git a/sample/platform/spi/dispatch/spi_if.c b/sample/platform/spi/dispatch/spi_if.c deleted file mode 100755 index be0958362..000000000 --- a/sample/platform/spi/dispatch/spi_if.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "spi_if.h" -#include "osal_mem.h" -#include "hdf_io_service_if.h" -#include "hdf_log.h" -#include "securec.h" - -#define HDF_LOG_TAG spi_if - -DevHandle SpiOpen(const struct SpiDevInfo *info) -{ - int32_t ret; - void *devHandle = NULL; - uint32_t port; - char *serviceName = NULL; - - if (info == NULL) { - HDF_LOGW("info is NULL"); - return NULL; - } - port = info->busNum; - - serviceName = (char *)OsalMemCalloc(MAX_DEV_NAME_SIZE + 1); - if (serviceName == NULL) { - HDF_LOGE("Failed to OsalMemCalloc serviceName"); - return NULL; - } - ret = snprintf_s(serviceName, MAX_DEV_NAME_SIZE + 1, MAX_DEV_NAME_SIZE, SPI_DEV_SERVICE_NAME_PREFIX, port); - if (ret < 0) { - HDF_LOGE("Failed to snprintf_s"); - OsalMemFree(serviceName); - return NULL; - } - devHandle = (void *)HdfIoServiceBind(serviceName); - OsalMemFree(serviceName); - return devHandle; -} - -void SpiClose(DevHandle handle) -{ - if (handle == NULL) { - HDF_LOGW("handle is NULL"); - return; - } - struct HdfIoService *service = (struct HdfIoService *)handle; - HdfIoServiceRecycle(service); - OsalMemFree(handle); -} - -int32_t SpiTransfer(DevHandle handle, struct SpiMsg *msgs) -{ - int32_t ret; - if (handle == NULL || msgs == NULL) { - HDF_LOGW("handle or msgs is NULL"); - return HDF_ERR_INVALID_PARAM; - } - struct HdfIoService *service = (struct HdfIoService *)handle; - if (service->dispatcher == NULL || service->dispatcher->Dispatch == NULL) { - HDF_LOGE("service->dispatcher or service->dispatcher->Dispatch is NULL"); - return HDF_FAILURE; - } - - struct HdfSBuf *sBuf = HdfSBufObtainDefaultSize(); - if (sBuf == NULL) { - HDF_LOGE("Failed to obtain sBuf"); - return HDF_FAILURE; - } - - if (!HdfSbufWriteBuffer(sBuf, msgs, sizeof(struct SpiMsg))) { - HDF_LOGE("Failed to write sbuf"); - HdfSBufRecycle(sBuf); - return HDF_FAILURE; - } - ret = service->dispatcher->Dispatch(&service->object, SPI_TRANSFER, sBuf, NULL); - if (ret != HDF_SUCCESS) { - HDF_LOGE("Failed to send service call"); - } - HdfSBufRecycle(sBuf); - return ret; -} diff --git a/sample/platform/spi/dispatch/spi_if.h b/sample/platform/spi/dispatch/spi_if.h deleted file mode 100755 index 544c5174f..000000000 --- a/sample/platform/spi/dispatch/spi_if.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SPI_IF_H -#define SPI_IF_H - -#include "hdf_platform.h" - -#define SPI_DEV_SERVICE_NAME_PREFIX "HDF_PLATFORM_SPI_%u" -#define MAX_DEV_NAME_SIZE 32 - -struct SpiDevInfo { - uint32_t busNum; - uint32_t csNum; -}; - -struct SpiMsg { - uint8_t *wbuf; - uint8_t *rbuf; - uint32_t len; - uint32_t speed; - uint16_t delayUs; - uint8_t csChange; -}; - -enum { - SPI_TRANSFER = 1 -}; - -DevHandle SpiOpen(const struct SpiDevInfo *info); -void SpiClose(DevHandle handle); -int32_t SpiTransfer(DevHandle handle, struct SpiMsg *msgs); - -#endif // SPI_IF_H diff --git a/sample/platform/spi/include/spi_dispatch_sample.h b/sample/platform/spi/include/spi_dispatch_sample.h deleted file mode 100755 index e1de74540..000000000 --- a/sample/platform/spi/include/spi_dispatch_sample.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SPI_DISPATCH_SAMPLE_H -#define SPI_DISPATCH_SAMPLE_H - -#include "spi_pl022_sample.h" -#include "spi_core.h" - -enum { - SPI_TRANSFER = 1 -}; - -int32_t SampleSpiDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply); - -#endif // SPI_DISPATCH_SAMPLE_H diff --git a/sample/platform/spi/include/spi_pl022_sample.h b/sample/platform/spi/include/spi_pl022_sample.h deleted file mode 100755 index 95e12a832..000000000 --- a/sample/platform/spi/include/spi_pl022_sample.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SPI_PL022_SAMPLE_H -#define SPI_PL022_SAMPLE_H - -#include "spi_if.h" -#include "osal.h" - -/* ********** spi reg offset define start *************** */ -#define REG_SPI_PL022_CR0 0x00 -#define SPI_PL022_CR0_SCR_SHIFT 8 -#define SPI_PL022_CR0_SPH_SHIFT 7 -#define SPI_PL022_CR0_SPO_SHIFT 6 -#define SPI_PL022_CR0_FRF_SHIFT 4 -#define SPI_PL022_CR0_DSS_SHIFT 0 -#define SPI_PL022_CR0_SCR (0xff << 8) /* clkout=clk/(cpsdvsr*(scr+1)) */ -#define SPI_PL022_CR0_SPH (0x1 << 7) /* spi phase */ -#define SPI_PL022_CR0_SPO (0x1 << 6) /* spi clk polarity */ -#define SPI_PL022_CR0_FRF (0x3 << 4) /* frame format set */ -#define SPI_PL022_CR0_DSS (0xf << 0) /* data bits width */ - -#define REG_SPI_PL022_CR1 0x04 -#define SPI_PL022_CR1_WAIT_EN_SHIFT 15 -#define SPI_PL022_CR1_WAIT_VAL_SHIFT 8 -#define SPI_PL022_CR1_ALT_SHIFT 6 -#define SPI_PL022_CR1_BIG_END_SHIFT 4 -#define SPI_PL022_CR1_MS_SHIFT 2 -#define SPI_PL022_CR1_SSE_SHIFT 1 -#define SPI_PL022_CR1_LBN_SHIFT 0 -#define SPI_PL022_CR1_WAIT_EN (0x1 << 15) -#define SPI_PL022_CR1_WAIT_VAL (0x7f << 8) - -/* alt mode:spi enable csn is select; spi disable csn is cancel */ -#define SPI_PL022_CR1_ALT (0x1 << 6) -#define SPI_PL022_CR1_BIG_END (0x1 << 4) /* big end or little */ -#define SPI_PL022_CR1_MS (0x1 << 2) /* cntlr-device mode */ -#define SPI_PL022_CR1_SSE (0x1 << 1) /* spi enable set */ -#define SPI_PL022_CR1_LBM (0x1 << 0) /* loopback mode */ - -#define REG_SPI_PL022_DR 0x08 - -#define REG_SPI_PL022_SR 0x0c -#define SPI_PL022_SR_BSY_SHIFT 4 -#define SPI_PL022_SR_RFF_SHIFT 3 -#define SPI_PL022_SR_RNE_SHIFT 2 -#define SPI_PL022_SR_TNF_SHIFT 1 -#define SPI_PL022_SR_TFE_SHIFT 0 -#define SPI_PL022_SR_BSY (0x1 << 4) /* spi busy flag */ -#define SPI_PL022_SR_RFF (0x1 << 3) /* Whether to send fifo is full */ -#define SPI_PL022_SR_RNE (0x1 << 2) /* Whether to send fifo is no empty */ -#define SPI_PL022_SR_TNF (0x1 << 1) /* Whether to send fifo is no full */ -#define SPI_PL022_SR_TFE (0x1 << 0) /* Whether to send fifo is empty */ - -#define REG_SPI_PL022_CPSR 0x10 -#define SPI_PL022_CPSR_CPSDVSR_SHIFT 0 -#define SPI_PL022_CPSR_CPSDVSR (0xff << 0) /* even 2~254 */ - -#define REG_SPI_PL022_IMSC 0x14 -#define REG_SPI_PL022_RIS 0x18 -#define REG_SPI_PL022_MIS 0x1c -#define REG_SPI_PL022_ICR 0x20 - -#define REG_SPI_CRG 0x120100e4 /* CRG_REG_BASE(0x12010000) + 0x0e4 */ -#define SPI_CRG_CLK_EN 0 -#define SPI_CRG_CLK_RST 0 - -#define REG_SPI_MISC_CTRL 0x12030024 /* MISC_REG_BASE(0x12030000) + 0x24 */ -#define SPI_MISC_CTRL_CS 0 -#define SPI_MISC_CTRL_CS_SHIFT 0 -/* ********** spi reg offset define end *************** */ - -#define MAX_WAIT 5000 -#define DEFAULT_SPEED 2000000 - -#define SCR_MAX 255 -#define SCR_MIN 0 -#define CPSDVSR_MAX 254 -#define CPSDVSR_MIN 2 -#define SPI_CS_ACTIVE 0 -#define SPI_CS_INACTIVE 1 -#define TWO_BYTES 2 -#define BITS_PER_WORD_MIN 4 -#define BITS_PER_WORD_DEFAULT 8 -#define BITS_PER_WORD_MAX 16 - -struct Pl022SpiCntlr { - struct SpiCntlr *cntlr; - struct DListHead deviceList; - volatile unsigned char *regBase; - uint32_t busNum; - uint32_t numCs; - uint32_t curCs; - uint32_t speed; - uint32_t fifoSize; - uint32_t clkRate; - uint32_t maxSpeedHz; - uint32_t minSpeedHz; - uint32_t regCrg; - uint32_t clkEnBit; - uint32_t clkRstBit; - uint32_t regMiscCtrl; - uint32_t miscCtrlCsShift; - uint32_t miscCtrlCs; - uint16_t mode; - uint8_t bitsPerWord; - uint8_t transferMode; -}; - -int ConfigPl022SpiCntlr(struct Pl022SpiCntlr *cntlr); -int32_t TransferOneMessage(struct Pl022SpiCntlr *cntlr, struct SpiMsg *msg); - -#endif // SPI_PL022_SAMPLE_H diff --git a/sample/platform/spi/include/spi_sample.h b/sample/platform/spi/include/spi_sample.h deleted file mode 100755 index 64b32bfcf..000000000 --- a/sample/platform/spi/include/spi_sample.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#ifndef SPI_SAMPLE_H -#define SPI_SAMPLE_H - -#include "spi_core.h" - -int32_t SampleSpiCntlrTransfer(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count); -int32_t SampleSpiCntlrSetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg); -int32_t SampleSpiCntlrGetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg); - -#endif // SPI_SAMPLE_H diff --git a/sample/platform/spi/src/BUILD.gn b/sample/platform/spi/src/BUILD.gn deleted file mode 100755 index 1aa16f223..000000000 --- a/sample/platform/spi/src/BUILD.gn +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2021 Huawei Device Co., Ltd. -# -# HDF is dual licensed: you can use it either under the terms of -# the GPL, or the BSD license, at your option. -# See the LICENSE file in the root of this repository for complete details. - -import("//drivers/adapter/khdf/liteos/hdf.gni") - -module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_SPI_SAMPLE) -module_name = "hdf_spi_sample" -hdf_driver(module_name) { - FRAMEWORK_SPI_ROOT = "//drivers/framework/sample/platform/spi/src" - sources = [ - "$FRAMEWORK_SPI_ROOT/spi_dispatch_sample.c", - "$FRAMEWORK_SPI_ROOT/spi_pl022_sample.c", - "$FRAMEWORK_SPI_ROOT/spi_sample.c", - ] - - include_dirs = [ - "//drivers/framework/sample/platform/spi/include/", - "//drivers/framework/support/platform/include/spi", - ] -} diff --git a/sample/platform/spi/src/spi_dispatch_sample.c b/sample/platform/spi/src/spi_dispatch_sample.c deleted file mode 100755 index 99bf1d7d5..000000000 --- a/sample/platform/spi/src/spi_dispatch_sample.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "spi_dispatch_sample.h" -#include "spi_sample.h" -#include "hdf_log.h" -#include "hdf_sbuf.h" - -#define HDF_LOG_TAG spi_dispatch_sample - -static int32_t SampleSpiTransfer(struct SpiCntlr *cntlr, struct HdfSBuf *txBuf) -{ - HDF_LOGD("%s: Enter", __func__); - uint32_t readSize = sizeof(struct SpiMsg); - struct SpiMsg *msg = NULL; - - if (cntlr == NULL || cntlr->priv == NULL || txBuf == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - if (!HdfSbufReadBuffer(txBuf, (const void **)&msg, &readSize)) { - HDF_LOGE("%s: Failed to read sbuf", __func__); - return HDF_DEV_ERR_NO_MEMORY; - } - - if (SampleSpiCntlrTransfer(cntlr, msg, msg->len) != HDF_SUCCESS) { - HDF_LOGE("%s: SampleSpiCntlrTransfer error", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -int32_t SampleSpiDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - if (client == NULL || client->device == NULL) { - HDF_LOGE("%s: client or client->device is NULL", __func__); - return HDF_FAILURE; - } - - struct SpiCntlr *cntlr = (struct SpiCntlr *)client->device->service; - if (cntlr == NULL || cntlr->method == NULL) { - HDF_LOGE("%s: cntlr or cntlr->method is NULL", __func__); - return HDF_FAILURE; - } - - switch (cmdId) { - case SPI_TRANSFER: - return SampleSpiTransfer(cntlr, data); - default: - HDF_LOGE("%s: invalid cmdId %d", __func__, cmdId); - return HDF_FAILURE; - } -} \ No newline at end of file diff --git a/sample/platform/spi/src/spi_pl022_sample.c b/sample/platform/spi/src/spi_pl022_sample.c deleted file mode 100755 index 58ae8d24e..000000000 --- a/sample/platform/spi/src/spi_pl022_sample.c +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "spi_pl022_sample.h" -#include "osal_io.h" - -#define HDF_LOG_TAG spi_pl022_sample - -/* Private function prototypes */ -static int Pl022SampleSetCs(struct Pl022SpiCntlr *cntlr, uint32_t cs, uint32_t flag); -static int Pl022SampleFlushFifo(const struct Pl022SpiCntlr *cntlr); -static int Pl022SampleTxRx8(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg); -static int Pl022SampleTxRx16(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg); -static void Pl022SampleEnableCntlr(const struct Pl022SpiCntlr *cntlr); -static void Pl022SampleConfigCPSR(const struct Pl022SpiCntlr *cntlr, uint32_t cpsdvsr); -static void Pl022SampleConfigCR0(const struct Pl022SpiCntlr *cntlr, uint32_t scr); -static void Pl022SampleConfigCR1(const struct Pl022SpiCntlr *cntlr); -static int32_t Pl022SampleCfgCs(struct Pl022SpiCntlr *cntlr, uint32_t cs); -static void Pl022SampleDisableCntlr(const struct Pl022SpiCntlr *cntlr); -static int Pl022SampleCheckTimeout(const struct Pl022SpiCntlr *cntlr); - -int ConfigPl022SpiCntlr(struct Pl022SpiCntlr *cntlr) -{ - uint32_t tmp; - uint32_t scr; - uint32_t cpsdvsr; - - Pl022SampleEnableCntlr(cntlr); - /* Check if we can provide the requested rate */ - if (cntlr->speed > cntlr->maxSpeedHz) { - cntlr->speed = cntlr->maxSpeedHz; - } - /* Min possible */ - if ((cntlr->speed < cntlr->minSpeedHz) || (cntlr->speed == 0)) { - HDF_LOGE("%s: cntlr->speed is %u not support, max %u, min %u", __func__, - cntlr->speed, cntlr->maxSpeedHz, cntlr->minSpeedHz); - return HDF_FAILURE; - } - /* Check if we can provide the requested bits_per_word */ - if ((cntlr->bitsPerWord < BITS_PER_WORD_MIN) || (cntlr->bitsPerWord > BITS_PER_WORD_MAX)) { - HDF_LOGE("%s: cntlr->bitsPerWord is %u not support", __func__, cntlr->bitsPerWord); - return HDF_FAILURE; - } - /* compute spi speed, speed=clk/(cpsdvsr*(scr+1)) */ - tmp = (cntlr->clkRate) / (cntlr->speed); - if (tmp < CPSDVSR_MIN) { - cpsdvsr = CPSDVSR_MIN; - scr = 0; - } else if (tmp <= CPSDVSR_MAX) { - cpsdvsr = tmp & (~0x1); - scr = (tmp / cpsdvsr) - 1; - } else { - cpsdvsr = CPSDVSR_MAX; - scr = (tmp / cpsdvsr) - 1; - } - /* config SPICPSR register */ - Pl022SampleConfigCPSR(cntlr, cpsdvsr); - /* config SPICR0 register */ - Pl022SampleConfigCR0(cntlr, scr); - /* config SPICR1 register */ - Pl022SampleConfigCR1(cntlr); - return HDF_SUCCESS; -} - -int32_t TransferOneMessage(struct Pl022SpiCntlr *cntlr, struct SpiMsg *msg) -{ - int32_t ret; - - if (msg->speed != 0) { - cntlr->speed = msg->speed; - } - ret = ConfigPl022SpiCntlr(cntlr); - if (ret != HDF_SUCCESS) { - return ret; - } - ret = Pl022SampleSetCs(cntlr, cntlr->curCs, SPI_CS_ACTIVE); - if (ret != HDF_SUCCESS) { - return ret; - } - ret = Pl022SampleFlushFifo(cntlr); - if (ret != HDF_SUCCESS) { - return ret; - } - if (cntlr->bitsPerWord <= BITS_PER_WORD_DEFAULT) { - ret = Pl022SampleTxRx8(cntlr, msg); - } else { - ret = Pl022SampleTxRx16(cntlr, msg); - } - if (ret || msg->csChange) { - Pl022SampleSetCs(cntlr, cntlr->curCs, SPI_CS_INACTIVE); - } - return ret; -} - -/* Private function implementations */ -static int Pl022SampleSetCs(struct Pl022SpiCntlr *cntlr, uint32_t cs, uint32_t flag) -{ - if (Pl022SampleCfgCs(cntlr, cs) != HDF_SUCCESS) { - return HDF_FAILURE; - } - if (flag == SPI_CS_ACTIVE) { - Pl022SampleEnableCntlr(cntlr); - } else { - Pl022SampleDisableCntlr(cntlr); - } - return HDF_SUCCESS; -} - -static int Pl022SampleFlushFifo(const struct Pl022SpiCntlr *cntlr) -{ - uint32_t value; - uint32_t ret; - uint32_t tmp = 0; - - ret = Pl022SampleCheckTimeout(cntlr); - if (ret != HDF_SUCCESS) { - return ret; - } - while (true) { - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); - if (!(value & SPI_PL022_SR_RNE)) { - break; - } - if (tmp++ > cntlr->fifoSize) { - HDF_LOGE("%s: spi transfer check rx fifo wait timeout", __func__); - return HDF_ERR_TIMEOUT; - } - OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); - } - return HDF_SUCCESS; -} - -static int Pl022SampleTxRx8(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg) -{ - uint32_t len = msg->len; - uint32_t tmpLen; - uint32_t count; - const uint8_t *tx = (const uint8_t *)(msg->wbuf); - uint8_t *rx = (uint8_t *)(msg->rbuf); - uint8_t value; - uint32_t ret; - - if (tx == NULL && rx == NULL) { - return HDF_ERR_INVALID_PARAM; - } - while (len > 0) { - if (len > cntlr->fifoSize) { - tmpLen = cntlr->fifoSize; - } else { - tmpLen = len; - } - len -= tmpLen; - /* write fifo */ - count = tmpLen; - value = 0; - while (count > 0) { - if (tx != NULL) { - value = *tx++; - } - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); - count -= 1; - OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); - } - ret = Pl022SampleCheckTimeout(cntlr); - if (ret != HDF_SUCCESS) { - return ret; - } - /* read fifo */ - count = tmpLen; - while (count > 0) { - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); - if (rx != NULL) { - *rx++ = value; - } - count -= 1; - OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); - } - } - return HDF_SUCCESS; -} - -static int Pl022SampleTxRx16(const struct Pl022SpiCntlr *cntlr, const struct SpiMsg *msg) -{ - uint32_t len = msg->len; - uint32_t tmpLen; - uint32_t count; - const uint16_t *tx = (const uint16_t *)(msg->wbuf); - uint16_t *rx = (uint16_t *)(msg->rbuf); - uint16_t value; - uint32_t ret; - - if (tx == NULL && rx == NULL) { - return HDF_ERR_INVALID_PARAM; - } - while (len > 0) { - ret = cntlr->fifoSize * TWO_BYTES; - if (len > ret) { - tmpLen = ret; - } else { - tmpLen = len; - } - len -= tmpLen; - /* write fifo */ - count = tmpLen; - value = 0; - while (count >= TWO_BYTES) { - if (tx != NULL) { - value = *tx++; - } - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); - count -= TWO_BYTES; - } - ret = Pl022SampleCheckTimeout(cntlr); - if (ret != 0) { - return ret; - } - /* read fifo */ - count = tmpLen; - while (count >= TWO_BYTES) { - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_DR); - if (rx != NULL) { - *rx++ = value; - } - count -= TWO_BYTES; - } - } - return 0; -} - -static void Pl022SampleEnableCntlr(const struct Pl022SpiCntlr *cntlr) -{ - uint32_t value; - - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); - value |= SPI_PL022_CR1_SSE; - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); -} - -static void Pl022SampleConfigCPSR(const struct Pl022SpiCntlr *cntlr, uint32_t cpsdvsr) -{ - uint32_t value; - - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CPSR); - value &= ~SPI_PL022_CPSR_CPSDVSR; - value |= cpsdvsr << SPI_PL022_CPSR_CPSDVSR_SHIFT; - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CPSR); -} - -static void Pl022SampleConfigCR0(const struct Pl022SpiCntlr *cntlr, uint32_t scr) -{ - uint32_t tmp; - uint32_t value; - - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR0); - value &= ~SPI_PL022_CR0_DSS; - value |= (cntlr->bitsPerWord - 1) << SPI_PL022_CR0_DSS_SHIFT; - value &= ~SPI_PL022_CR0_FRF; - value &= ~SPI_PL022_CR0_SPO; - tmp = (!!(cntlr->mode & SPI_CLK_POLARITY)) ? (1 << SPI_PL022_CR0_SPO_SHIFT) : 0; - value |= tmp; - value &= ~SPI_PL022_CR0_SPH; - tmp = (!!(cntlr->mode & SPI_CLK_PHASE)) ? (1 << SPI_PL022_CR0_SPH_SHIFT) : 0; - value |= tmp; - value &= ~SPI_PL022_CR0_SCR; - value |= (scr << SPI_PL022_CR0_SCR_SHIFT); - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR0); -} - -static void Pl022SampleConfigCR1(const struct Pl022SpiCntlr *cntlr) -{ - uint32_t tmp; - uint32_t value; - - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); - value &= ~SPI_PL022_CR1_LBM; - tmp = (!!(cntlr->mode & SPI_MODE_LOOP)) ? (1 << SPI_PL022_CR1_LBN_SHIFT) : 0; - value |= tmp; - value &= ~SPI_PL022_CR1_MS; - value &= ~SPI_PL022_CR1_BIG_END; - tmp = (!!(cntlr->mode & SPI_MODE_LSBFE)) ? (1 << SPI_PL022_CR1_BIG_END_SHIFT) : 0; - value |= tmp; - value &= ~SPI_PL022_CR1_ALT; - value |= 0x1 << SPI_PL022_CR1_ALT_SHIFT; - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); -} - -static int32_t Pl022SampleCfgCs(struct Pl022SpiCntlr *cntlr, uint32_t cs) -{ - uint32_t value; - uint32_t miscCtrlCs; - - if ((cs + 1) > cntlr->numCs) { - HDF_LOGE("%s: cs %u is big than cntlr csNum %u", __func__, cs, cntlr->numCs); - return HDF_FAILURE; - } - if (cntlr->numCs == 1) { - return HDF_SUCCESS; - } - miscCtrlCs = (UINTPTR)(cntlr->regBase) + REG_SPI_MISC_CTRL; - value = OSAL_READL(miscCtrlCs); - value &= ~miscCtrlCs; - value |= (cs << cntlr->miscCtrlCsShift); - OSAL_WRITEL(value, miscCtrlCs); - return HDF_SUCCESS; -} - -static void Pl022SampleDisableCntlr(const struct Pl022SpiCntlr *cntlr) -{ - uint32_t value; - - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); - value &= ~SPI_PL022_CR1_SSE; - OSAL_WRITEL(value, (UINTPTR)(cntlr->regBase) + REG_SPI_PL022_CR1); -} - -static int Pl022SampleCheckTimeout(const struct Pl022SpiCntlr *cntlr) -{ - uint32_t value; - uint32_t tmp = 0; - - while (true) { - value = OSAL_READL((UINTPTR)(cntlr->regBase) + REG_SPI_PL022_SR); - if ((value & SPI_PL022_SR_TFE) && (!(value & SPI_PL022_SR_BSY))) { - break; - } - if (tmp++ > MAX_WAIT) { - HDF_LOGE("%s: spi transfer wait timeout", __func__); - return HDF_ERR_TIMEOUT; - } - OsalUDelay(1); - } - return HDF_SUCCESS; -} \ No newline at end of file diff --git a/sample/platform/spi/src/spi_sample.c b/sample/platform/spi/src/spi_sample.c deleted file mode 100755 index 526792364..000000000 --- a/sample/platform/spi/src/spi_sample.c +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "spi_sample.h" -#include "spi_pl022_sample.h" -#include "spi_dispatch_sample.h" -#include "device_resource_if.h" -#include "hdf_base.h" -#include "osal_mem.h" -#include "hdf_log.h" -#include "spi_core.h" -#include "los_vm_zone.h" - -#define HDF_LOG_TAG spi_sample - -/* HdfDriverEntry hook function prototypes */ -static int32_t SampleSpiDriverBind(struct HdfDeviceObject *device); -static int32_t SampleSpiDriverInit(struct HdfDeviceObject *device); -static void SampleSpiDriverRelease(struct HdfDeviceObject *device); - -/* SpiCntlrMethod definition */ -struct SpiCntlrMethod g_sampleSpiMethod = { - .Transfer = SampleSpiCntlrTransfer, - .SetCfg = SampleSpiCntlrSetCfg, - .GetCfg = SampleSpiCntlrGetCfg, -}; - -/* HdfDriverEntry definition */ -struct HdfDriverEntry g_sampleSpiDriverEntry = { - .moduleVersion = 1, - .moduleName = "SPI_SAMPLE", - .Bind = SampleSpiDriverBind, - .Init = SampleSpiDriverInit, - .Release = SampleSpiDriverRelease, -}; - -/* Init HdfDriverEntry */ -HDF_INIT(g_sampleSpiDriverEntry); - -/* Private function prototypes */ -static int InitSpiDevice(struct SpiCntlr *cntlr, const struct DeviceResourceNode *property); -static int ConfigSpiDevice(struct Pl022SpiCntlr *pl022Cntlr); -static int32_t InitSpiDeviceResource(struct Pl022SpiCntlr *pl022Cntlr, const struct DeviceResourceNode *node); -static int32_t CreateSpiDev(struct Pl022SpiCntlr *pl022Cntlr); -static void ReleaseSpiDev(struct Pl022SpiCntlr *pl022Cntlr); -static struct SpiDev *FindDeviceByCsNum(const struct Pl022SpiCntlr *pl022Cntlr, uint32_t cs); - -/* HdfDriverEntry hook function implementations */ -static int32_t SampleSpiDriverBind(struct HdfDeviceObject *device) -{ - HDF_LOGD("%s: Enter", __func__); - struct SpiCntlr *cntlr = NULL; - if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - - cntlr = SpiCntlrCreate(device); - if (cntlr == NULL) { - HDF_LOGE("%s: cntlr is NULL", __func__); - return HDF_FAILURE; - } - - cntlr->service.Dispatch = SampleSpiDispatch; - return HDF_SUCCESS; -} - -static int32_t SampleSpiDriverInit(struct HdfDeviceObject *device) -{ - HDF_LOGD("%s: Enter", __func__); - int ret; - struct SpiCntlr *cntlr = NULL; - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or device->property is null", __func__); - return HDF_ERR_INVALID_OBJECT; - } - cntlr = SpiCntlrFromDevice(device); - if (cntlr == NULL) { - HDF_LOGE("%s: cntlr is null", __func__); - return HDF_ERR_INVALID_OBJECT; - } - ret = InitSpiDevice(cntlr, device->property); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: InitSpiDevice failed", __func__); - return ret; - } - ret = ConfigSpiDevice(cntlr->priv); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: ConfigSpiDevice failed", __func__); - return ret; - } - return ret; -} - -static void SampleSpiDriverRelease(struct HdfDeviceObject *device) -{ - HDF_LOGD("%s: Enter", __func__); - struct SpiCntlr *cntlr = NULL; - if (device == NULL) { - HDF_LOGE("%s: device is null", __func__); - return; - } - cntlr = SpiCntlrFromDevice(device); - if (cntlr == NULL) { - HDF_LOGE("%s: cntlr is null", __func__); - return; - } - if (cntlr->priv != NULL) { - ReleaseSpiDev((struct Pl022SpiCntlr *)cntlr->priv); - } - SpiCntlrDestroy(cntlr); -} - -/* SPI function implementations */ -int32_t SampleSpiCntlrTransfer(struct SpiCntlr *cntlr, struct SpiMsg *msg, uint32_t count) -{ - HDF_LOGD("%s: Enter", __func__); - int ret; - struct Pl022SpiCntlr *pl022Cntlr = NULL; - struct SpiDev *spiDev = NULL; - - if (cntlr == NULL || cntlr->priv == NULL || msg == NULL || count == 0) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; - spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); - if (spiDev == NULL) { - HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); - return HDF_FAILURE; - } - pl022Cntlr->mode = spiDev->cfg.mode; - pl022Cntlr->transferMode = spiDev->cfg.transferMode; - pl022Cntlr->bitsPerWord = spiDev->cfg.bitsPerWord; - pl022Cntlr->maxSpeedHz = spiDev->cfg.maxSpeedHz; - pl022Cntlr->curCs = spiDev->csNum; - for (uint32_t i = 0; i < count; i++) { - ret = TransferOneMessage(pl022Cntlr, &(msg[i])); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: transfer error", __func__); - return ret; - } - } - return ret; -} - -int32_t SampleSpiCntlrSetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) -{ - HDF_LOGD("%s: Enter", __func__); - struct Pl022SpiCntlr *pl022Cntlr = NULL; - struct SpiDev *spiDev = NULL; - - if (cntlr == NULL || cntlr->priv == NULL || cfg == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; - spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); - if (spiDev == NULL) { - HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); - return HDF_FAILURE; - } - spiDev->cfg.mode = cfg->mode; - spiDev->cfg.transferMode = cfg->transferMode; - spiDev->cfg.bitsPerWord = cfg->bitsPerWord; - if ((cfg->bitsPerWord < BITS_PER_WORD_MIN) || (cfg->bitsPerWord > BITS_PER_WORD_MAX)) { - HDF_LOGE("%s: bitsPerWord %u not support, use default bitsPerWord %u", - __func__, cfg->bitsPerWord, BITS_PER_WORD_DEFAULT); - spiDev->cfg.bitsPerWord = BITS_PER_WORD_DEFAULT; - } - if (cfg->maxSpeedHz != 0) { - spiDev->cfg.maxSpeedHz = cfg->maxSpeedHz; - } - return HDF_SUCCESS; -} - -int32_t SampleSpiCntlrGetCfg(struct SpiCntlr *cntlr, struct SpiCfg *cfg) -{ - HDF_LOGD("%s: Enter", __func__); - struct Pl022SpiCntlr *pl022Cntlr = NULL; - struct SpiDev *spiDev = NULL; - - if (cntlr == NULL || cntlr->priv == NULL || cfg == NULL) { - HDF_LOGE("%s: invalid parameter", __func__); - return HDF_ERR_INVALID_PARAM; - } - pl022Cntlr = (struct Pl022SpiCntlr *)cntlr->priv; - spiDev = FindDeviceByCsNum(pl022Cntlr, cntlr->curCs); - if (spiDev == NULL) { - HDF_LOGE("%s: spiDev is null, curCs %u", __func__, cntlr->curCs); - return HDF_FAILURE; - } - cfg->mode = spiDev->cfg.mode; - cfg->transferMode = spiDev->cfg.transferMode; - cfg->bitsPerWord = spiDev->cfg.bitsPerWord; - cfg->maxSpeedHz = spiDev->cfg.maxSpeedHz; - return HDF_SUCCESS; -} - -/* Private function implementations */ -static int InitSpiDevice(struct SpiCntlr *cntlr, const struct DeviceResourceNode *property) -{ - int ret; - struct Pl022SpiCntlr *pl022Cntlr = NULL; - - pl022Cntlr = (struct Pl022SpiCntlr *)OsalMemCalloc(sizeof(*pl022Cntlr)); - if (pl022Cntlr == NULL) { - HDF_LOGE("%s: OsalMemCalloc error", __func__); - return HDF_FAILURE; - } - ret = InitSpiDeviceResource(pl022Cntlr, property); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: InitSpiDeviceResource error", __func__); - OsalMemFree(pl022Cntlr); - return HDF_FAILURE; - } - pl022Cntlr->maxSpeedHz = (pl022Cntlr->clkRate) / ((SCR_MIN + 1) * CPSDVSR_MIN); - pl022Cntlr->minSpeedHz = (pl022Cntlr->clkRate) / ((SCR_MAX + 1) * CPSDVSR_MAX); - DListHeadInit(&pl022Cntlr->deviceList); - pl022Cntlr->cntlr = cntlr; - cntlr->priv = pl022Cntlr; - cntlr->busNum = pl022Cntlr->busNum; - cntlr->method = &g_sampleSpiMethod; - ret = CreateSpiDev(pl022Cntlr); - if (ret != HDF_SUCCESS) { - ReleaseSpiDev(pl022Cntlr); - return ret; - } - return HDF_SUCCESS; -} - -static int ConfigSpiDevice(struct Pl022SpiCntlr *pl022Cntlr) -{ - int ret; - - ret = ConfigPl022SpiCntlr(pl022Cntlr); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: HiPl022Config error", __func__); - } - return ret; -} - -static int32_t InitSpiDeviceResource(struct Pl022SpiCntlr *pl022Cntlr, const struct DeviceResourceNode *node) -{ - uint32_t tmp; - struct DeviceResourceIface *resIf = NULL; - - resIf = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (resIf == NULL || resIf->GetUint8 == NULL || resIf->GetUint16 == NULL || resIf->GetUint32 == NULL) { - HDF_LOGE("%s: resource is invalid", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint32(node, "regBase", &tmp, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read regBase fail", __func__); - return HDF_FAILURE; - } - pl022Cntlr->regBase = (void *)(uintptr_t)(IO_DEVICE_ADDR(tmp)); - if (resIf->GetUint32(node, "busNum", &pl022Cntlr->busNum, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read busNum fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint32(node, "numCs", &pl022Cntlr->numCs, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read numCs fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint32(node, "speed", &pl022Cntlr->speed, DEFAULT_SPEED) != HDF_SUCCESS) { - HDF_LOGE("%s: read speed fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint32(node, "fifoSize", &pl022Cntlr->fifoSize, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read fifoSize fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint32(node, "clkRate", &pl022Cntlr->clkRate, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read clkRate fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint16(node, "mode", &pl022Cntlr->mode, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read mode fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint8(node, "bitsPerWord", &pl022Cntlr->bitsPerWord, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read bitsPerWord fail", __func__); - return HDF_FAILURE; - } - if (resIf->GetUint8(node, "transferMode", &pl022Cntlr->transferMode, 0) != HDF_SUCCESS) { - HDF_LOGE("%s: read comMode fail", __func__); - return HDF_FAILURE; - } - pl022Cntlr->regCrg = REG_SPI_CRG; - pl022Cntlr->clkEnBit = SPI_CRG_CLK_EN; - pl022Cntlr->clkRstBit = SPI_CRG_CLK_RST; - pl022Cntlr->regMiscCtrl = REG_SPI_MISC_CTRL; - pl022Cntlr->miscCtrlCs = SPI_MISC_CTRL_CS; - pl022Cntlr->miscCtrlCsShift = SPI_MISC_CTRL_CS_SHIFT; - return HDF_SUCCESS; -} - -static int32_t CreateSpiDev(struct Pl022SpiCntlr *pl022Cntlr) -{ - uint32_t i; - struct SpiDev *device = NULL; - - for (i = 0; i < pl022Cntlr->numCs; i++) { - device = (struct SpiDev *)OsalMemCalloc(sizeof(*device)); - if (device == NULL) { - HDF_LOGE("%s: OsalMemCalloc error", __func__); - return HDF_FAILURE; - } - device->cntlr = pl022Cntlr->cntlr; - device->csNum = i; - device->cfg.bitsPerWord = pl022Cntlr->bitsPerWord; - device->cfg.transferMode = pl022Cntlr->transferMode; - device->cfg.maxSpeedHz = pl022Cntlr->maxSpeedHz; - device->cfg.mode = pl022Cntlr->mode; - DListHeadInit(&device->list); - DListInsertTail(&device->list, &pl022Cntlr->deviceList); - } - return HDF_SUCCESS; -} - -static void ReleaseSpiDev(struct Pl022SpiCntlr *pl022Cntlr) -{ - struct SpiDev *dev = NULL; - struct SpiDev *tmpDev = NULL; - - DLIST_FOR_EACH_ENTRY_SAFE(dev, tmpDev, &(pl022Cntlr->deviceList), struct SpiDev, list) { - if (dev != NULL) { - DListRemove(&(dev->list)); - OsalMemFree(dev); - } - } - OsalMemFree(pl022Cntlr); -} - -static struct SpiDev *FindDeviceByCsNum(const struct Pl022SpiCntlr *pl022Cntlr, uint32_t cs) -{ - struct SpiDev *dev = NULL; - struct SpiDev *tmpDev = NULL; - - if (pl022Cntlr == NULL || pl022Cntlr->numCs <= cs) { - return NULL; - } - DLIST_FOR_EACH_ENTRY_SAFE(dev, tmpDev, &(pl022Cntlr->deviceList), struct SpiDev, list) { - if (dev->csNum == cs) { - break; - } - } - return dev; -} \ No newline at end of file diff --git a/sample/platform/uart/dispatch/uart_if.c b/sample/platform/uart/dispatch/uart_if.c index e3f6152c6..9fdb158c6 100755 --- a/sample/platform/uart/dispatch/uart_if.c +++ b/sample/platform/uart/dispatch/uart_if.c @@ -7,7 +7,6 @@ */ #include "uart_if.h" -#include "securec.h" #include "hdf_log.h" #include "osal_mem.h" #include "hdf_io_service_if.h" diff --git a/sample/platform/uart/src/uart_dispatch_sample.c b/sample/platform/uart/src/uart_dispatch_sample.c index e69ef5d80..6817896f7 100755 --- a/sample/platform/uart/src/uart_dispatch_sample.c +++ b/sample/platform/uart/src/uart_dispatch_sample.c @@ -10,7 +10,6 @@ #include "uart_dispatch_sample.h" #include "hdf_log.h" #include "hdf_sbuf.h" -#include "osal_mem.h" #include "uart_pl011_sample.h" #define HDF_LOG_TAG uart_dispatch_sample -- Gitee From 611fdc297ddadab1e760e790f51ad443072e473d Mon Sep 17 00:00:00 2001 From: zhang Date: Fri, 10 Dec 2021 17:26:23 +0800 Subject: [PATCH 261/272] feat: add the asynchronous power manager interfaces os acquiring device Signed-off-by: zhang --- core/common/src/devmgr_service_start.c | 4 +- .../include/hdf_pm_reg.h} | 6 +- core/host/include/hdf_power_manager.h | 38 ++ core/host/src/hdf_device_object.c | 29 + core/host/src/hdf_power_manager.c | 104 +++ .../test/unittest/common/hdf_pm_test.cpp | 324 +++++++++ include/core/hdf_pm.h | 2 + test/unittest/pm/hdf_pm_driver_test.c | 626 ++++++++++++++++++ test/unittest/pm/hdf_pm_driver_test.h | 39 ++ test/unittest/pm/pm_driver_test.c | 156 ----- utils/include/hdf_task_queue.h | 39 ++ utils/src/hdf_task_queue.c | 203 ++++++ 12 files changed, 1409 insertions(+), 161 deletions(-) rename core/{common/include/manager/devmgr_pm_reg.h => host/include/hdf_pm_reg.h} (83%) create mode 100755 core/host/include/hdf_power_manager.h create mode 100755 core/host/src/hdf_power_manager.c create mode 100755 core/manager/test/unittest/common/hdf_pm_test.cpp create mode 100755 test/unittest/pm/hdf_pm_driver_test.c create mode 100755 test/unittest/pm/hdf_pm_driver_test.h delete mode 100755 test/unittest/pm/pm_driver_test.c create mode 100755 utils/include/hdf_task_queue.h create mode 100755 utils/src/hdf_task_queue.c diff --git a/core/common/src/devmgr_service_start.c b/core/common/src/devmgr_service_start.c index 562658678..ce3d01929 100644 --- a/core/common/src/devmgr_service_start.c +++ b/core/common/src/devmgr_service_start.c @@ -8,7 +8,6 @@ #include "devmgr_service_start.h" #include "devhost_service_clnt.h" -#include "devmgr_pm_reg.h" #include "devmgr_service.h" #include "devsvc_manager.h" #include "devsvc_manager_clnt.h" @@ -16,6 +15,7 @@ #include "hdf_device_node.h" #include "hdf_io_service.h" #include "hdf_log.h" +#include "hdf_power_manager.h" #include "hdf_sbuf.h" #define DEV_MGR_NODE_PERM 0660 @@ -115,7 +115,7 @@ int DeviceManagerStart(void) return ret; } - return DevMgrPmRegister(); + return HdfPowerManagerInit(); } int DeviceManagerStartStep2() diff --git a/core/common/include/manager/devmgr_pm_reg.h b/core/host/include/hdf_pm_reg.h similarity index 83% rename from core/common/include/manager/devmgr_pm_reg.h rename to core/host/include/hdf_pm_reg.h index cdc8036f0..f065a4673 100755 --- a/core/common/include/manager/devmgr_pm_reg.h +++ b/core/host/include/hdf_pm_reg.h @@ -6,8 +6,8 @@ * See the LICENSE file in the root of this repository for complete details. */ -#ifndef DEVMGR_PM_REG_H -#define DEVMGR_PM_REG_H +#ifndef HDF_PM_REG_H +#define HDF_PM_REG_H #ifdef __cplusplus extern "C" { @@ -19,4 +19,4 @@ int DevMgrPmRegister(void); } #endif /* __cplusplus */ -#endif /* DEVMGR_PM_REG_H */ +#endif /* HDF_PM_REG_H */ diff --git a/core/host/include/hdf_power_manager.h b/core/host/include/hdf_power_manager.h new file mode 100755 index 000000000..2ed3cdb3f --- /dev/null +++ b/core/host/include/hdf_power_manager.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_POWER_MANAGER_H +#define HDF_POWER_MANAGER_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "hdf_task_queue.h" +#include "power_state_token.h" + +typedef enum { + HDF_PM_REQUEST_ACQUIRE, + HDF_PM_REQUEST_RELEASE, +} HDF_PM_REQUEST_TYPE; + +struct HdfPmRequest { + struct PowerStateToken *token; + HDF_PM_REQUEST_TYPE pmType; + struct HdfTaskType task; +}; + +int32_t HdfPowerManagerInit(void); +void HdfPmTaskPut(struct PowerStateToken *powerToken, HDF_PM_REQUEST_TYPE type); +void HdfPowerManagerExit(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* HDF_POWER_MANAGER_H */ diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index e8238478a..e8e03e94a 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -15,6 +15,7 @@ #include "hdf_log.h" #include "hdf_object_manager.h" #include "hdf_observer_record.h" +#include "hdf_power_manager.h" #include "hdf_service_observer.h" #include "power_state_token.h" @@ -106,6 +107,34 @@ void HdfPmReleaseDevice(struct HdfDeviceObject *deviceObject) } } +void HdfPmAcquireDeviceAsync(struct HdfDeviceObject *deviceObject) +{ + struct HdfDeviceNode *devNode = NULL; + + if (deviceObject == NULL) { + HDF_LOGE("%s: input param is invalid", __func__); + return; + } + + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); + HdfPmTaskPut(devNode->powerToken, HDF_PM_REQUEST_ACQUIRE); +} + +void HdfPmReleaseDeviceAsync(struct HdfDeviceObject *deviceObject) +{ + struct HdfDeviceNode *devNode = NULL; + + if (deviceObject == NULL) { + HDF_LOGE("%s: input param is invalid", __func__); + return; + } + + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + struct HdfDeviceObject, deviceObject, struct HdfDeviceNode, deviceObject); + HdfPmTaskPut(devNode->powerToken, HDF_PM_REQUEST_RELEASE); +} + void HdfPmSetMode(struct HdfDeviceObject *deviceObject, uint32_t mode) { struct HdfDeviceNode *devNode = NULL; diff --git a/core/host/src/hdf_power_manager.c b/core/host/src/hdf_power_manager.c new file mode 100755 index 000000000..94cc4132a --- /dev/null +++ b/core/host/src/hdf_power_manager.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_power_manager.h" +#include "hdf_log.h" +#include "hdf_pm_reg.h" +#include "osal_mem.h" +#include "power_state_token.h" + +#define HDF_LOG_TAG hdf_power_manager + +struct PmTaskQueue { + struct HdfTaskQueue *taskQueue; +}; + +static struct PmTaskQueue *HdfPmTaskQueueInstance() +{ + static struct PmTaskQueue pmTaskQueue = {NULL}; + return &pmTaskQueue; +} + +struct PmTaskQueue *HdfPmTaskQueueInit(HdfTaskFunc func) +{ + struct PmTaskQueue *pmTaskQueue = HdfPmTaskQueueInstance(); + + if (pmTaskQueue->taskQueue == NULL) { + pmTaskQueue->taskQueue = HdfTaskQueueCreate(func, "pm_queue"); + if (pmTaskQueue->taskQueue != NULL) { + HDF_LOGI("%s HdfTaskQueueCreate success", __func__); + } + } + + return pmTaskQueue; +} + +void HdfPmTaskQueueDestroy(void) +{ + struct PmTaskQueue *pmTaskQueue = HdfPmTaskQueueInstance(); + HdfTaskQueueDestroy(pmTaskQueue->taskQueue); + pmTaskQueue->taskQueue = NULL; +} + +int32_t PmTaskFunc(struct HdfTaskType *para) +{ + struct HdfPmRequest *pmRequest = NULL; + struct IPowerStateToken *tokenIf = NULL; + + if (para == NULL) { + return HDF_FAILURE; + } + + pmRequest = CONTAINER_OF(para, struct HdfPmRequest, task); + tokenIf = (struct IPowerStateToken *)pmRequest->token; + if (pmRequest->pmType == HDF_PM_REQUEST_ACQUIRE) { + if ((tokenIf != NULL) && (tokenIf->AcquireWakeLock != NULL)) { + tokenIf->AcquireWakeLock(tokenIf); + } + } else if (pmRequest->pmType == HDF_PM_REQUEST_RELEASE) { + if ((tokenIf != NULL) && (tokenIf->ReleaseWakeLock != NULL)) { + tokenIf->ReleaseWakeLock(tokenIf); + } + } + OsalMemFree(pmRequest); + return HDF_SUCCESS; +} + +void HdfPmTaskPut(struct PowerStateToken *powerToken, HDF_PM_REQUEST_TYPE type) +{ + struct HdfPmRequest *pmRequest = NULL; + struct PmTaskQueue *pmTaskQueue = NULL; + + if (powerToken == NULL) { + return; + } + + pmTaskQueue = HdfPmTaskQueueInstance(); + pmRequest = (struct HdfPmRequest *)OsalMemCalloc(sizeof(*pmRequest)); + if (pmRequest == NULL) { + HDF_LOGI("%s OsalMemCalloc fail", __func__); + return; + } + + pmRequest->token = powerToken; + pmRequest->pmType = type; + pmRequest->task.func = PmTaskFunc; + HdfTaskEnqueue(pmTaskQueue->taskQueue, &pmRequest->task); +} + +int32_t HdfPowerManagerInit(void) +{ + DevMgrPmRegister(); + HdfPmTaskQueueInit(NULL); + return HDF_SUCCESS; +} + +void HdfPowerManagerExit(void) +{ + HdfPmTaskQueueDestroy(); +} \ No newline at end of file diff --git a/core/manager/test/unittest/common/hdf_pm_test.cpp b/core/manager/test/unittest/common/hdf_pm_test.cpp new file mode 100755 index 000000000..2dc86ac82 --- /dev/null +++ b/core/manager/test/unittest/common/hdf_pm_test.cpp @@ -0,0 +1,324 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "hdf_io_service.h" +#include "hdf_pm_driver_test.h" + +using namespace testing::ext; + +class HdfPmTest : public testing::Test { +public: + static void SetUpTestCase(); + static void TearDownTestCase(); + void SetUp(); + void TearDown(); + static struct HdfIoService *ioService; +}; + +struct HdfIoService *HdfPmTest::ioService = NULL; + +void HdfPmTest::SetUpTestCase() +{ + ioService = HdfIoServiceBind("pm_test_service"); + ASSERT_TRUE(ioService != NULL); + ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_BEGEN, NULL, NULL); +} + +void HdfPmTest::TearDownTestCase() +{ + ASSERT_TRUE(ioService != NULL); + ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_END, NULL, NULL); + HdfIoServiceRecycle(ioService); +} + +void HdfPmTest::SetUp() +{ +} + +void HdfPmTest::TearDown() +{ +} + +/** + * @tc.name: HdfPmTestOneDriverOnce + * @tc.desc: test one driver + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestOneDriverOnce, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_ONE_DRIVER_ONCE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestOneDriverTwice + * @tc.desc: test one driver + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestOneDriverTwice, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_ONE_DRIVER_TWICE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestOneDriverTen + * @tc.desc: test one driver + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestOneDriverTen, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_ONE_DRIVER_TEN, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestOneDriverHundred + * @tc.desc: test one driver + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestOneDriverHundred, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_ONE_DRIVER_HUNDRED, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestOneDriverThousand + * @tc.desc: test one driver + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestOneDriverThousand, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_ONE_DRIVER_THOUSAND, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestTwoDriverOnce + * @tc.desc: test two drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestTwoDriverOnce, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_TWO_DRIVER_ONCE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestTwoDriverTwice + * @tc.desc: test two drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestTwoDriverTwice, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_TWO_DRIVER_TWICE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestTwoDriverTen + * @tc.desc: test two drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestTwoDriverTen, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_TWO_DRIVER_TEN, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestTwoDriverHundred + * @tc.desc: test two drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestTwoDriverHundred, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_TWO_DRIVER_HUNDRED, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestTwoDriverThousand + * @tc.desc: test two drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestTwoDriverThousand, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_TWO_DRIVER_THOUSAND, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverOnce + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverOnce, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_ONCE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverTwice + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverTwice, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_TWICE, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverTen + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverTen, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_TEN, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverHundred + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverHundred, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_HUNDRED, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverThousand + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverThousand, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_THOUSAND, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverSeqHundred + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverSeqHundred, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_SEQ_HUNDRED, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} + +/** + * @tc.name: HdfPmTestThreeDriverHundredWithSync + * @tc.desc: test three drivers + * @tc.type: FUNC + * @tc.require: SR000GGTQF + */ +HWTEST_F(HdfPmTest, HdfPmTestThreeDriverHundredWithSync, TestSize.Level3) +{ + int32_t ret = HDF_FAILURE; + + ASSERT_TRUE(ioService != NULL); + + ret = ioService->dispatcher->Dispatch(&ioService->object, HDF_PM_TEST_THREE_DRIVER_HUNDRED_WITH_SYNC, NULL, NULL); + EXPECT_TRUE(ret == HDF_SUCCESS); +} diff --git a/include/core/hdf_pm.h b/include/core/hdf_pm.h index 1c8412fa4..6d6ddbb59 100644 --- a/include/core/hdf_pm.h +++ b/include/core/hdf_pm.h @@ -38,5 +38,7 @@ int HdfPmRegisterPowerListener(struct HdfDeviceObject *deviceObject, const struc void HdfPmUnregisterPowerListener(struct HdfDeviceObject *deviceObject, const struct IPowerEventListener *listener); void HdfPmAcquireDevice(struct HdfDeviceObject *deviceObject); void HdfPmReleaseDevice(struct HdfDeviceObject *deviceObject); +void HdfPmAcquireDeviceAsync(struct HdfDeviceObject *deviceObject); +void HdfPmReleaseDeviceAsync(struct HdfDeviceObject *deviceObject); void HdfPmSetMode(struct HdfDeviceObject *deviceObject, uint32_t mode); #endif /* HDF_POWER_MANAGEMENT_H */ diff --git a/test/unittest/pm/hdf_pm_driver_test.c b/test/unittest/pm/hdf_pm_driver_test.c new file mode 100755 index 000000000..c1f1e7214 --- /dev/null +++ b/test/unittest/pm/hdf_pm_driver_test.c @@ -0,0 +1,626 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "devmgr_service.h" +#include "devsvc_manager.h" +#include "devsvc_manager_clnt.h" +#include "hdf_device_desc.h" +#include "hdf_device_node.h" +#include "hdf_log.h" +#include "hdf_pm.h" +#include "hdf_pm_driver_test.h" +#include "hdf_power_manager.h" +#include "hdf_task_queue.h" +#include "osal_time.h" +#include "power_state_token.h" + +#define HDF_LOG_TAG pm_driver_test + +#define PM_TEST_COUNT_ONE 1 +#define PM_TEST_COUNT_TWO 2 +#define PM_TEST_COUNT_TEN 10 +#define PM_TEST_COUNT_HUNDRED 100 +#define PM_TEST_COUNT_THOUSAND 1000 + +#define PM_WAIT_TIME 10 +#define PM_WAIT_TIME_OUT 100 +#define PM_WAIT_LOAD_TIME 30 + +#define CHECK_VALUE(index, cnt) \ + (pmTestType[(index)].resumeCnt == (cnt) && pmTestType[(index)].suspendCnt == (cnt)) + +#define WAIT_TEST_END(value, idx) \ + while ((value) == false && (idx) < PM_WAIT_TIME_OUT) { \ + OsalMSleep(PM_WAIT_TIME); \ + (idx)++; \ + } \ + +enum { + HDF_TEST_DRIVER, + SAMPLE_TEST_DRIVER, + PM_TEST_DRIVER, +}; + +struct PmDriverPmListener { + struct IPowerEventListener powerListener; + void *p; +}; +typedef int32_t (*TestFunc)(void); + +struct TestCaseType { + uint32_t cmd; + TestFunc testFunc; +}; +int32_t HdfPmTestBegin(void); +int32_t HdfPmTestOneDriverOnce(void); +int32_t HdfPmTestOneDriverTwice(void); +int32_t HdfPmTestOneDriverTen(void); +int32_t HdfPmTestOneDriverHundred(void); +int32_t HdfPmTestOneDriverThousand(void); +int32_t HdfPmTestTwoDriverOnce(void); +int32_t HdfPmTestTwoDriverTwice(void); +int32_t HdfPmTestTwoDriverTen(void); +int32_t HdfPmTestTwoDriverHundred(void); +int32_t HdfPmTestTwoDriverThousand(void); +int32_t HdfPmTestThreeDriverOnce(void); +int32_t HdfPmTestThreeDriverTwice(void); +int32_t HdfPmTestThreeDriverTen(void); +int32_t HdfPmTestThreeDriverHundred(void); +int32_t HdfPmTestThreeDriverThousand(void); +int32_t HdfPmTestThreeDriverSeqHundred(void); +int32_t HdfPmTestThreeDriverHundredWithSync(void); +int32_t HdfPmTestEnd(void); + +static const struct TestCaseType testCases[] = { + { HDF_PM_TEST_BEGEN, HdfPmTestBegin }, + { HDF_PM_TEST_ONE_DRIVER_ONCE, HdfPmTestOneDriverOnce }, + { HDF_PM_TEST_ONE_DRIVER_TWICE, HdfPmTestOneDriverTwice }, + { HDF_PM_TEST_ONE_DRIVER_TEN, HdfPmTestOneDriverTen }, + { HDF_PM_TEST_ONE_DRIVER_HUNDRED, HdfPmTestOneDriverHundred }, + { HDF_PM_TEST_ONE_DRIVER_THOUSAND, HdfPmTestOneDriverThousand }, + { HDF_PM_TEST_TWO_DRIVER_ONCE, HdfPmTestTwoDriverOnce }, + { HDF_PM_TEST_TWO_DRIVER_TWICE, HdfPmTestTwoDriverTwice }, + { HDF_PM_TEST_TWO_DRIVER_TEN, HdfPmTestTwoDriverTen }, + { HDF_PM_TEST_TWO_DRIVER_HUNDRED, HdfPmTestTwoDriverHundred }, + { HDF_PM_TEST_TWO_DRIVER_THOUSAND, HdfPmTestTwoDriverThousand }, + { HDF_PM_TEST_THREE_DRIVER_ONCE, HdfPmTestThreeDriverOnce }, + { HDF_PM_TEST_THREE_DRIVER_TWICE, HdfPmTestThreeDriverTwice }, + { HDF_PM_TEST_THREE_DRIVER_TEN, HdfPmTestThreeDriverTen }, + { HDF_PM_TEST_THREE_DRIVER_HUNDRED, HdfPmTestThreeDriverHundred }, + { HDF_PM_TEST_THREE_DRIVER_THOUSAND, HdfPmTestThreeDriverThousand }, + { HDF_PM_TEST_THREE_DRIVER_SEQ_HUNDRED, HdfPmTestThreeDriverSeqHundred }, + { HDF_PM_TEST_THREE_DRIVER_HUNDRED_WITH_SYNC, HdfPmTestThreeDriverHundredWithSync }, + { HDF_PM_TEST_END, HdfPmTestEnd }, +}; + +static const char *serviceName[] = { "HDF_TEST", "sample_service", "pm_test_service" }; + +struct PmTestType { + const char *serviceName; + struct HdfDeviceObject *obj; + struct PmDriverPmListener listener; + const struct IPowerEventListener *listenerBak; + uint32_t resumeCnt; + uint32_t suspendCnt; +}; + +extern struct PmWorkQueue *HdfPmTaskQueueInit(HdfTaskFunc func); + +static struct PmTestType pmTestType[PM_TEST_DRIVER + 1]; + +static bool loopTest = false; + +int HdfPmHdfTestDozeResume(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmHdfTestDozeSuspend(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmHdfTestResume(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + + pmTestType[HDF_TEST_DRIVER].resumeCnt++; + return HDF_SUCCESS; +} + +int HdfPmHdfTestSuspend(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + pmTestType[HDF_TEST_DRIVER].suspendCnt++; + return HDF_SUCCESS; +} + +int HdfPmSampleDozeResume(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmSampleDozeSuspend(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmSampleResume(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + pmTestType[SAMPLE_TEST_DRIVER].resumeCnt++; + return HDF_SUCCESS; +} + +int HdfPmSampleSuspend(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + pmTestType[SAMPLE_TEST_DRIVER].suspendCnt++; + return HDF_SUCCESS; +} + +int HdfPmTestDozeResume(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmTestDozeSuspend(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s called", __func__); + return HDF_SUCCESS; +} + +int HdfPmTestResume(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + pmTestType[PM_TEST_DRIVER].resumeCnt++; + return HDF_SUCCESS; +} + +int HdfPmTestSuspend(struct HdfDeviceObject *deviceObject) +{ + if (loopTest == false) { + HDF_LOGI("%s called", __func__); + } + pmTestType[PM_TEST_DRIVER].suspendCnt++; + return HDF_SUCCESS; +} + +void HdfPmSetListeners() +{ + pmTestType[HDF_TEST_DRIVER].listener.powerListener.DozeResume = HdfPmHdfTestDozeResume; + pmTestType[HDF_TEST_DRIVER].listener.powerListener.DozeSuspend = HdfPmHdfTestDozeSuspend; + pmTestType[HDF_TEST_DRIVER].listener.powerListener.Resume = HdfPmHdfTestResume; + pmTestType[HDF_TEST_DRIVER].listener.powerListener.Suspend = HdfPmHdfTestSuspend; + + pmTestType[SAMPLE_TEST_DRIVER].listener.powerListener.DozeResume = HdfPmSampleDozeResume; + pmTestType[SAMPLE_TEST_DRIVER].listener.powerListener.DozeSuspend = HdfPmSampleDozeSuspend; + pmTestType[SAMPLE_TEST_DRIVER].listener.powerListener.Resume = HdfPmSampleResume; + pmTestType[SAMPLE_TEST_DRIVER].listener.powerListener.Suspend = HdfPmSampleSuspend; + + pmTestType[PM_TEST_DRIVER].listener.powerListener.DozeResume = HdfPmTestDozeResume; + pmTestType[PM_TEST_DRIVER].listener.powerListener.DozeSuspend = HdfPmTestDozeSuspend; + pmTestType[PM_TEST_DRIVER].listener.powerListener.Resume = HdfPmTestResume; + pmTestType[PM_TEST_DRIVER].listener.powerListener.Suspend = HdfPmTestSuspend; +} + +void HdfPmClearTestCnt() +{ + uint32_t index; + + for (index = 0; index <= PM_TEST_DRIVER; index++) { + pmTestType[index].resumeCnt = 0; + pmTestType[index].suspendCnt = 0; + } +} + +int32_t HdfPmRegisterTestListener(int32_t index) +{ + struct SubscriberCallback callback = {NULL}; + struct HdfDeviceNode *devNode = NULL; + + pmTestType[index].serviceName = serviceName[index]; + pmTestType[index].obj = DevSvcManagerClntGetDeviceObject(pmTestType[index].serviceName); + if (pmTestType[index].obj == NULL) { + DevSvcManagerClntSubscribeService(pmTestType[index].serviceName, callback); + OsalMSleep(PM_WAIT_LOAD_TIME); + pmTestType[index].obj = DevSvcManagerClntGetDeviceObject(pmTestType[index].serviceName); + } + + if (pmTestType[index].obj) { + devNode = (struct HdfDeviceNode *)HDF_SLIST_CONTAINER_OF( + struct HdfDeviceObject, pmTestType[index].obj, struct HdfDeviceNode, deviceObject); + if ((devNode->powerToken != NULL) && (devNode->powerToken->listener != NULL)) { + pmTestType[index].listenerBak = devNode->powerToken->listener; + HdfPmUnregisterPowerListener(pmTestType[index].obj, pmTestType[index].listenerBak); + } else { + pmTestType[index].listenerBak = NULL; + } + + HdfPmRegisterPowerListener(pmTestType[index].obj, &pmTestType[index].listener.powerListener); + } + HdfPmSetMode(pmTestType[index].obj, HDF_POWER_DYNAMIC_CTRL); + return HDF_SUCCESS; +} + +int32_t HdfPmBakListener(int32_t index) +{ + if (pmTestType[index].listenerBak != NULL) { + HdfPmUnregisterPowerListener(pmTestType[index].obj, &pmTestType[index].listener.powerListener); + HdfPmRegisterPowerListener(pmTestType[index].obj, pmTestType[index].listenerBak); + HdfPmSetMode(pmTestType[index].obj, HDF_POWER_SYS_CTRL); + } + return HDF_SUCCESS; +} + +void HdfPmTestAcquire(uint32_t index) +{ + HdfPmAcquireDeviceAsync(pmTestType[index].obj); +} + +void HdfPmTestRelease(uint32_t index) +{ + HdfPmReleaseDeviceAsync(pmTestType[index].obj); +} + +void HdfPmTestAcquireSync(uint32_t index) +{ + HdfPmAcquireDevice(pmTestType[index].obj); +} + +void HdfPmTestReleaseSync(uint32_t index) +{ + HdfPmReleaseDevice(pmTestType[index].obj); +} + +int32_t HdfPmTestBegin(void) +{ + uint32_t index; + + HdfPmTaskQueueInit(NULL); + HdfPmSetListeners(); + HdfPmClearTestCnt(); + + for (index = 0; index <= PM_TEST_DRIVER; index++) { + HdfPmRegisterTestListener(index); + } + return HDF_SUCCESS; +} + +int32_t HdfPmTestEnd(void) +{ + uint32_t index; + + for (index = 0; index <= PM_TEST_DRIVER; index++) { + HdfPmBakListener(index); + } + + HdfPowerManagerExit(); + HdfPmTaskQueueInit(NULL); + + return HDF_SUCCESS; +} + +int32_t HdfPmTestOneDriver(const int32_t times) +{ + uint32_t index; + uint32_t waitTime = 0; + uint64_t beginTimes = OsalGetSysTimeMs(); + uint32_t expendTimes; + + HdfPmClearTestCnt(); + + for (index = 0; index < times; index++) { + HdfPmTestAcquire(PM_TEST_DRIVER); + HdfPmTestRelease(PM_TEST_DRIVER); + } + + WAIT_TEST_END(CHECK_VALUE(PM_TEST_DRIVER, times), waitTime); + + HDF_LOGI("%s %d %d", __func__, pmTestType[PM_TEST_DRIVER].resumeCnt, pmTestType[PM_TEST_DRIVER].suspendCnt); + + expendTimes = OsalGetSysTimeMs() - beginTimes; + HDF_LOGI("%s test expend times:%d ms", __func__, expendTimes); + + return CHECK_VALUE(PM_TEST_DRIVER, times) ? HDF_SUCCESS : HDF_FAILURE; +} + +int32_t HdfPmTestTwoDriver(const int32_t times) +{ + uint32_t index; + uint32_t waitTime = 0; + uint64_t beginTimes = OsalGetSysTimeMs(); + uint32_t expendTimes; + + HdfPmClearTestCnt(); + + for (index = 0; index < times; index++) { + HdfPmTestAcquire(PM_TEST_DRIVER); + HdfPmTestAcquire(HDF_TEST_DRIVER); + HdfPmTestRelease(PM_TEST_DRIVER); + HdfPmTestRelease(HDF_TEST_DRIVER); + } + + WAIT_TEST_END(CHECK_VALUE(PM_TEST_DRIVER, times) && CHECK_VALUE(HDF_TEST_DRIVER, times), waitTime); + + HDF_LOGI("%s %d %d", __func__, pmTestType[PM_TEST_DRIVER].resumeCnt, pmTestType[PM_TEST_DRIVER].suspendCnt); + HDF_LOGI("%s %d %d", __func__, pmTestType[HDF_TEST_DRIVER].resumeCnt, pmTestType[HDF_TEST_DRIVER].suspendCnt); + + expendTimes = OsalGetSysTimeMs() - beginTimes; + HDF_LOGI("%s test expend times:%d ms", __func__, expendTimes); + + return (CHECK_VALUE(PM_TEST_DRIVER, times) && CHECK_VALUE(HDF_TEST_DRIVER, times)) ? HDF_SUCCESS : HDF_FAILURE; +} + +int32_t HdfPmTestThreeDriver(const int32_t times, bool sync) +{ + uint32_t index; + uint32_t total = times; + uint32_t waitTime = 0; + uint64_t beginTimes = OsalGetSysTimeMs(); + uint32_t expendTimes; + + HdfPmClearTestCnt(); + + if (sync) { + total += PM_TEST_COUNT_ONE; + } + + if (sync) { + HdfPmTestAcquireSync(PM_TEST_DRIVER); + HdfPmTestAcquireSync(HDF_TEST_DRIVER); + HdfPmTestAcquireSync(SAMPLE_TEST_DRIVER); + HdfPmTestReleaseSync(PM_TEST_DRIVER); + HdfPmTestReleaseSync(HDF_TEST_DRIVER); + HdfPmTestReleaseSync(SAMPLE_TEST_DRIVER); + } + + for (index = 0; index < times; index++) { + HdfPmTestAcquire(PM_TEST_DRIVER); + HdfPmTestAcquire(HDF_TEST_DRIVER); + HdfPmTestAcquire(SAMPLE_TEST_DRIVER); + + HdfPmTestRelease(PM_TEST_DRIVER); + HdfPmTestRelease(HDF_TEST_DRIVER); + HdfPmTestRelease(SAMPLE_TEST_DRIVER); + } + + WAIT_TEST_END(CHECK_VALUE(PM_TEST_DRIVER, total) && + CHECK_VALUE(HDF_TEST_DRIVER, total) && + CHECK_VALUE(SAMPLE_TEST_DRIVER, total), waitTime); + + HDF_LOGI("%s %d %d", __func__, pmTestType[PM_TEST_DRIVER].resumeCnt, pmTestType[PM_TEST_DRIVER].suspendCnt); + HDF_LOGI("%s %d %d", __func__, pmTestType[HDF_TEST_DRIVER].resumeCnt, pmTestType[HDF_TEST_DRIVER].suspendCnt); + HDF_LOGI("%s %d %d", __func__, + pmTestType[SAMPLE_TEST_DRIVER].resumeCnt, pmTestType[SAMPLE_TEST_DRIVER].suspendCnt); + + expendTimes = OsalGetSysTimeMs() - beginTimes; + HDF_LOGI("%s test expend times:%d ms", __func__, expendTimes); + + return (CHECK_VALUE(PM_TEST_DRIVER, total) && CHECK_VALUE(HDF_TEST_DRIVER, total) && + CHECK_VALUE(SAMPLE_TEST_DRIVER, total)) ? HDF_SUCCESS : HDF_FAILURE; +} + +int32_t HdfPmTestThreeDriverSeqHundred(void) +{ + uint32_t index; + uint32_t waitTime = 0; + uint64_t beginTimes = OsalGetSysTimeMs(); + uint32_t expendTimes; + + HdfPmClearTestCnt(); + + for (index = 0; index < PM_TEST_COUNT_TWO; index++) { + HdfPmTestAcquire(PM_TEST_DRIVER); + HdfPmTestAcquire(HDF_TEST_DRIVER); + HdfPmTestAcquire(SAMPLE_TEST_DRIVER); + } + + for (index = 0; index < PM_TEST_COUNT_TWO; index++) { + HdfPmTestRelease(PM_TEST_DRIVER); + HdfPmTestRelease(HDF_TEST_DRIVER); + HdfPmTestRelease(SAMPLE_TEST_DRIVER); + } + + WAIT_TEST_END(CHECK_VALUE(PM_TEST_DRIVER, PM_TEST_COUNT_ONE) && + CHECK_VALUE(HDF_TEST_DRIVER, PM_TEST_COUNT_ONE) && + CHECK_VALUE(SAMPLE_TEST_DRIVER, PM_TEST_COUNT_ONE), waitTime); + + HDF_LOGI("%s %d %d", __func__, pmTestType[PM_TEST_DRIVER].resumeCnt, pmTestType[PM_TEST_DRIVER].suspendCnt); + HDF_LOGI("%s %d %d", __func__, pmTestType[HDF_TEST_DRIVER].resumeCnt, pmTestType[HDF_TEST_DRIVER].suspendCnt); + HDF_LOGI("%s %d %d", __func__, + pmTestType[SAMPLE_TEST_DRIVER].resumeCnt, pmTestType[SAMPLE_TEST_DRIVER].suspendCnt); + + expendTimes = OsalGetSysTimeMs() - beginTimes; + HDF_LOGI("%s test expend times:%d ms", __func__, expendTimes); + + return (CHECK_VALUE(PM_TEST_DRIVER, PM_TEST_COUNT_ONE) && CHECK_VALUE(HDF_TEST_DRIVER, PM_TEST_COUNT_ONE) && + CHECK_VALUE(SAMPLE_TEST_DRIVER, PM_TEST_COUNT_ONE)) ? HDF_SUCCESS : HDF_FAILURE; +} + +int32_t HdfPmTestOneDriverOnce(void) +{ + loopTest = false; + return HdfPmTestOneDriver(PM_TEST_COUNT_ONE); +} + +int32_t HdfPmTestOneDriverTwice(void) +{ + loopTest = false; + return HdfPmTestOneDriver(PM_TEST_COUNT_TWO); +} + +int32_t HdfPmTestOneDriverTen(void) +{ + loopTest = true; + return HdfPmTestOneDriver(PM_TEST_COUNT_TEN); +} + +int32_t HdfPmTestOneDriverHundred(void) +{ + loopTest = true; + return HdfPmTestOneDriver(PM_TEST_COUNT_HUNDRED); +} + +int32_t HdfPmTestOneDriverThousand(void) +{ + loopTest = true; + return HdfPmTestOneDriver(PM_TEST_COUNT_THOUSAND); +} + +int32_t HdfPmTestTwoDriverOnce(void) +{ + loopTest = false; + return HdfPmTestTwoDriver(PM_TEST_COUNT_ONE); +} + +int32_t HdfPmTestTwoDriverTwice(void) +{ + loopTest = false; + return HdfPmTestTwoDriver(PM_TEST_COUNT_TWO); +} + +int32_t HdfPmTestTwoDriverTen(void) +{ + loopTest = true; + return HdfPmTestTwoDriver(PM_TEST_COUNT_TEN); +} + +int32_t HdfPmTestTwoDriverHundred(void) +{ + loopTest = true; + return HdfPmTestTwoDriver(PM_TEST_COUNT_HUNDRED); +} + +int32_t HdfPmTestTwoDriverThousand(void) +{ + loopTest = true; + return HdfPmTestTwoDriver(PM_TEST_COUNT_THOUSAND); +} + +int32_t HdfPmTestThreeDriverOnce(void) +{ + loopTest = false; + return HdfPmTestThreeDriver(PM_TEST_COUNT_ONE, false); +} + +int32_t HdfPmTestThreeDriverTwice(void) +{ + loopTest = false; + return HdfPmTestThreeDriver(PM_TEST_COUNT_TWO, false); +} + +int32_t HdfPmTestThreeDriverTen(void) +{ + loopTest = true; + return HdfPmTestThreeDriver(PM_TEST_COUNT_TEN, false); +} + +int32_t HdfPmTestThreeDriverHundred(void) +{ + loopTest = true; + return HdfPmTestThreeDriver(PM_TEST_COUNT_HUNDRED, false); +} + +int32_t HdfPmTestThreeDriverThousand(void) +{ + loopTest = true; + return HdfPmTestThreeDriver(PM_TEST_COUNT_THOUSAND, false); +} + +int32_t HdfPmTestThreeDriverHundredWithSync(void) +{ + loopTest = true; + return HdfPmTestThreeDriver(PM_TEST_COUNT_HUNDRED, true); +} + +void HdfPmDriverRelease(struct HdfDeviceObject *deviceObject) +{ + (void)deviceObject; + return; +} + +int32_t HdfPmDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + int32_t ret = HDF_FAILURE; + uint32_t index; + + HDF_LOGI("%s %d enter!", __func__, cmdId); + + for (index = 0; index <= HDF_PM_TEST_END; index++) { + if (cmdId == testCases[index].cmd) { + ret = testCases[cmdId].testFunc(); + break; + } + } + + return ret; +} + +int HdfPmDriverBind(struct HdfDeviceObject *deviceObject) +{ + HDF_LOGI("%s enter", __func__); + if (deviceObject == NULL) { + return HDF_FAILURE; + } + static struct IDeviceIoService testService = { + .Dispatch = HdfPmDriverDispatch, + .Open = NULL, + .Release = NULL, + }; + deviceObject->service = &testService; + return HDF_SUCCESS; +} + +int HdfPmDriverInit(struct HdfDeviceObject *deviceObject) +{ + static struct PmDriverPmListener pmListener = {0}; + + HDF_LOGI("%s enter!", __func__); + if (deviceObject == NULL) { + HDF_LOGE("%s ptr is null!", __func__); + return HDF_FAILURE; + } + HDF_LOGD("%s Init success", __func__); + + pmListener.powerListener.DozeResume = HdfPmTestDozeResume; + pmListener.powerListener.DozeSuspend = HdfPmTestDozeSuspend; + pmListener.powerListener.Resume = HdfPmTestResume; + pmListener.powerListener.Suspend = HdfPmTestSuspend; + + int ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); + HDF_LOGI("%s register power listener, ret = %d", __func__, ret); + + return HDF_SUCCESS; +} + +struct HdfDriverEntry g_pmDriverEntry = { + .moduleVersion = 1, + .moduleName = "pm_test_driver", + .Bind = HdfPmDriverBind, + .Init = HdfPmDriverInit, + .Release = HdfPmDriverRelease, +}; + +HDF_INIT(g_pmDriverEntry); + diff --git a/test/unittest/pm/hdf_pm_driver_test.h b/test/unittest/pm/hdf_pm_driver_test.h new file mode 100755 index 000000000..26078b601 --- /dev/null +++ b/test/unittest/pm/hdf_pm_driver_test.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_PM_DRIVER_TEST_H +#define HDF_PM_DRIVER_TEST_H + +#include "hdf_object.h" + +#define SAMPLE_SERVICE "pm_service" + +enum { + HDF_PM_TEST_BEGEN = 0, + HDF_PM_TEST_ONE_DRIVER_ONCE, + HDF_PM_TEST_ONE_DRIVER_TWICE, + HDF_PM_TEST_ONE_DRIVER_TEN, + HDF_PM_TEST_ONE_DRIVER_HUNDRED, + HDF_PM_TEST_ONE_DRIVER_THOUSAND, + HDF_PM_TEST_TWO_DRIVER_ONCE, + HDF_PM_TEST_TWO_DRIVER_TWICE, + HDF_PM_TEST_TWO_DRIVER_TEN, + HDF_PM_TEST_TWO_DRIVER_HUNDRED, + HDF_PM_TEST_TWO_DRIVER_THOUSAND, + HDF_PM_TEST_THREE_DRIVER_ONCE, + HDF_PM_TEST_THREE_DRIVER_TWICE, + HDF_PM_TEST_THREE_DRIVER_TEN, + HDF_PM_TEST_THREE_DRIVER_HUNDRED, + HDF_PM_TEST_THREE_DRIVER_THOUSAND, + HDF_PM_TEST_THREE_DRIVER_SEQ_HUNDRED, + HDF_PM_TEST_THREE_DRIVER_HUNDRED_WITH_SYNC, + HDF_PM_TEST_END, +}; + +#endif // HDF_PM_DRIVER_TEST_H + diff --git a/test/unittest/pm/pm_driver_test.c b/test/unittest/pm/pm_driver_test.c deleted file mode 100755 index 84580fdce..000000000 --- a/test/unittest/pm/pm_driver_test.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2021 Huawei Device Co., Ltd. - * - * HDF is dual licensed: you can use it either under the terms of - * the GPL, or the BSD license, at your option. - * See the LICENSE file in the root of this repository for complete details. - */ - -#include "devmgr_service.h" -#include "devsvc_manager_clnt.h" -#include "hdf_device_desc.h" -#include "hdf_log.h" -#include "hdf_pm.h" -#include "osal_time.h" - -#define HDF_LOG_TAG pm_driver_test -#define PM_TEST_COUNT 4 -#define PM_WAIT_TIME 500 - -static int resumeCnt = 0; -static int suspendCnt = 0; - -int32_t HdfPmTest() -{ - struct HdfDeviceObject *pm_test_service_obj = NULL; - struct HdfDeviceObject *sample_service_obj = NULL; - - HDF_LOGI("%s enter!", __func__); - resumeCnt = 0; - suspendCnt = 0; - sample_service_obj = DevSvcManagerClntGetDeviceObject("sample_service"); - if (sample_service_obj == NULL) { - HDF_LOGE("%s sample_service DeviceObject is null!", __func__); - return HDF_FAILURE; - } - - pm_test_service_obj = DevSvcManagerClntGetDeviceObject("pm_test_service"); - if (pm_test_service_obj == NULL) { - HDF_LOGE("%s pm_test_service DeviceObject is null!", __func__); - return HDF_FAILURE; - } - - HdfPmSetMode(sample_service_obj, HDF_POWER_DYNAMIC_CTRL); - HdfPmSetMode(pm_test_service_obj, HDF_POWER_DYNAMIC_CTRL); - - HdfPmAcquireDevice(pm_test_service_obj); - HdfPmReleaseDevice(pm_test_service_obj); - HdfPmAcquireDevice(pm_test_service_obj); - HdfPmReleaseDevice(pm_test_service_obj); - HdfPmAcquireDevice(pm_test_service_obj); - HdfPmAcquireDevice(pm_test_service_obj); - HdfPmReleaseDevice(pm_test_service_obj); - HdfPmReleaseDevice(pm_test_service_obj); - - HdfPmAcquireDevice(pm_test_service_obj); - HdfPmAcquireDevice(sample_service_obj); - HdfPmReleaseDevice(pm_test_service_obj); - HdfPmReleaseDevice(sample_service_obj); - OsalMSleep(PM_WAIT_TIME); - HdfPmSetMode(sample_service_obj, HDF_POWER_SYS_CTRL); - HdfPmSetMode(pm_test_service_obj, HDF_POWER_SYS_CTRL); - HDF_LOGI("%s count:%d %d!", __func__, resumeCnt, suspendCnt); - HDF_LOGI("%s exit!", __func__); - return ((resumeCnt == PM_TEST_COUNT) && (suspendCnt == PM_TEST_COUNT)) ? HDF_SUCCESS : HDF_FAILURE; -} - -void HdfPmDriverRelease(struct HdfDeviceObject *deviceObject) -{ - (void)deviceObject; - return; -} - -int32_t PmDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) -{ - HDF_LOGI("%s enter!", __func__); - - return HdfPmTest(); -} - -int HdfPmDriverBind(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s enter", __func__); - if (deviceObject == NULL) { - return HDF_FAILURE; - } - static struct IDeviceIoService testService = { - .Dispatch = PmDriverDispatch, - .Open = NULL, - .Release = NULL, - }; - deviceObject->service = &testService; - return HDF_SUCCESS; -} - -int HdfPmDozeResume(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s called", __func__); - return HDF_SUCCESS; -} - -int HdfPmDozeSuspend(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s called", __func__); - return HDF_SUCCESS; -} - -int HdfPmResume(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s called", __func__); - resumeCnt++; - return HDF_SUCCESS; -} - -int HdfPmSuspend(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s called", __func__); - suspendCnt++; - return HDF_SUCCESS; -} - -struct PmDriverPmListener { - struct IPowerEventListener powerListener; - void *p; -}; - -int HdfPmDriverInit(struct HdfDeviceObject *deviceObject) -{ - HDF_LOGI("%s enter!", __func__); - if (deviceObject == NULL) { - HDF_LOGE("%s ptr is null!", __func__); - return HDF_FAILURE; - } - HDF_LOGD("%s Init success", __func__); - - static struct PmDriverPmListener pmListener = {0}; - pmListener.powerListener.DozeResume = HdfPmDozeResume; - pmListener.powerListener.DozeSuspend = HdfPmDozeSuspend; - pmListener.powerListener.Resume = HdfPmResume; - pmListener.powerListener.Suspend = HdfPmSuspend; - - int ret = HdfPmRegisterPowerListener(deviceObject, &pmListener.powerListener); - HDF_LOGI("%s register power listener, ret = %d", __func__, ret); - - return HDF_SUCCESS; -} - -struct HdfDriverEntry g_pmDriverEntry = { - .moduleVersion = 1, - .moduleName = "pm_test_driver", - .Bind = HdfPmDriverBind, - .Init = HdfPmDriverInit, - .Release = HdfPmDriverRelease, -}; - -HDF_INIT(g_pmDriverEntry); - diff --git a/utils/include/hdf_task_queue.h b/utils/include/hdf_task_queue.h new file mode 100755 index 000000000..31faa1a9d --- /dev/null +++ b/utils/include/hdf_task_queue.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_TASK_QUEUE_H +#define HDF_TASK_QUEUE_H + +#include "hdf_dlist.h" +#include "osal_sem.h" +#include "osal_mutex.h" +#include "osal_thread.h" + +struct HdfTaskType; +typedef int32_t (*HdfTaskFunc)(struct HdfTaskType *para); + +struct HdfTaskType { + struct DListHead node; + HdfTaskFunc func; +}; + +struct HdfTaskQueue { + struct OsalSem sem; + struct OsalMutex mutex; + struct DListHead head; + struct OsalThread thread; + bool threadRunFlag; + HdfTaskFunc queueFunc; + const char *queueName; +}; + +void HdfTaskEnqueue(struct HdfTaskQueue *queue, struct HdfTaskType *task); +struct HdfTaskQueue *HdfTaskQueueCreate(HdfTaskFunc queueFunc, const char *name); +void HdfTaskQueueDestroy(struct HdfTaskQueue *queue); + +#endif /* HDF_TASK_QUEUE_H */ \ No newline at end of file diff --git a/utils/src/hdf_task_queue.c b/utils/src/hdf_task_queue.c new file mode 100755 index 000000000..a6ed089d3 --- /dev/null +++ b/utils/src/hdf_task_queue.c @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_task_queue.h" +#include "hdf_log.h" +#include "osal_mem.h" +#include "securec.h" + +static int32_t HdfThreadTasker(void *data); + +#define HDF_LOG_TAG hdf_task_queue + +static int32_t HdfCreateThread(struct HdfTaskQueue *queue) +{ + int32_t ret; + + ret = OsalThreadCreate(&queue->thread, (OsalThreadEntry)HdfThreadTasker, queue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("HdfCreateThread: create thread fail!"); + } + + return ret; +} + +struct HdfTaskQueue *HdfTaskQueueCreate(HdfTaskFunc func, const char *name) +{ + int32_t ret; + struct HdfTaskQueue *queue = NULL; + + queue = (struct HdfTaskQueue *)OsalMemCalloc(sizeof(*queue)); + if (queue == NULL) { + HDF_LOGE("%s malloc fail", __func__); + return queue; + } + + DListHeadInit(&queue->head); + + ret = OsalMutexInit(&queue->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalMutexInit fail", __func__); + OsalMemFree(queue); + return NULL; + } + + ret = OsalSemInit(&queue->sem, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalSemInit fail", __func__); + OsalMutexDestroy(&queue->mutex); + OsalMemFree(queue); + return NULL; + } + + ret = HdfCreateThread(queue); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s HdfCreateThread fail", __func__); + (void)OsalMutexDestroy(&queue->mutex); + (void)OsalSemDestroy(&queue->sem); + OsalMemFree(queue); + return NULL; + } + + queue->queueName = name; + queue->threadRunFlag = false; + + if (func != NULL) { + queue->queueFunc = func; + } + + return queue; +} + +static void hdfQueueStopThread(struct HdfTaskQueue *queue) +{ + int32_t ret; + + if (queue == NULL) { + HDF_LOGE("%s queue ptr is null", __func__); + return; + } + + queue->threadRunFlag = false; + + ret = OsalSemPost(&queue->sem); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalSemPost fail", __func__); + } +} + +void HdfTaskQueueDestroy(struct HdfTaskQueue *queue) +{ + if (queue == NULL) { + HDF_LOGE("%s queue ptr is null", __func__); + return; + } + hdfQueueStopThread(queue); +} + +static void hdfQueueStartThread(struct HdfTaskQueue *queue) +{ + int32_t ret; + struct OsalThreadParam param; + + (void)memset_s(¶m, sizeof(param), 0, sizeof(param)); + param.name = (char *)queue->queueName; + param.priority = OSAL_THREAD_PRI_HIGH; + queue->threadRunFlag = true; + + ret = OsalThreadStart(&queue->thread, ¶m); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalThreadStart fail", __func__); + } +} + +void HdfTaskEnqueue(struct HdfTaskQueue *queue, struct HdfTaskType *task) +{ + int32_t ret; + + if (queue == NULL || task == NULL) { + HDF_LOGE("%s ptr is null", __func__); + return; + } + + ret = OsalMutexLock(&queue->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalMutexLock fail", __func__); + return; + } + + if (!queue->threadRunFlag) { + hdfQueueStartThread(queue); + } + + DListInsertTail(&task->node, &queue->head); + + ret = OsalMutexUnlock(&queue->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalMutexUnlock fail", __func__); + return; + } + + ret = OsalSemPost(&queue->sem); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalSemPost fail", __func__); + } +} + +static struct HdfTaskType *HdfTaskDequeue(struct HdfTaskQueue *queue) +{ + struct HdfTaskType *task = NULL; + + if (!DListIsEmpty(&queue->head)) { + task = DLIST_FIRST_ENTRY(&queue->head, struct HdfTaskType, node); + DListRemove(&task->node); + } + + return task; +} + +static int32_t HdfThreadTasker(void *data) +{ + int32_t ret; + struct HdfTaskType *task = NULL; + struct HdfTaskQueue *queue = (struct HdfTaskQueue *)data; + + while (queue->threadRunFlag) { + ret = OsalSemWait(&queue->sem, HDF_WAIT_FOREVER); + if (ret != HDF_SUCCESS) { + continue; + } + ret = OsalMutexLock(&queue->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalMutexLock fail", __func__); + continue; + } + task = HdfTaskDequeue(queue); + while (task != NULL) { + if (task->func) { + task->func(task); + } else if (queue->queueFunc) { + queue->queueFunc(task); + } else { + HDF_LOGE("%s no task and queue function", __func__); + } + task = HdfTaskDequeue(queue); + } + ret = OsalMutexUnlock(&queue->mutex); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s OsalMutexUnlock fail", __func__); + } + } + + (void)OsalMutexDestroy(&queue->mutex); + (void)OsalSemDestroy(&queue->sem); + OsalMemFree(queue); + HDF_LOGI("%s thread exit", __func__); + + return HDF_SUCCESS; +} -- Gitee From 9d988b27d6d3c26b5366705e1ae543b34674c2ea Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 14 Dec 2021 20:26:49 +0800 Subject: [PATCH 262/272] =?UTF-8?q?style=EF=BC=9Amodify=20sensor=20als=20d?= =?UTF-8?q?river=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenchong --- model/sensor/driver/als/sensor_als_driver.c | 22 ++++--- model/sensor/driver/chipset/als/als_bh1745.c | 54 +++++++++++------ model/sensor/driver/chipset/als/als_bh1745.h | 58 +++++++++---------- .../common/src/sensor_config_controller.c | 3 + 4 files changed, 82 insertions(+), 55 deletions(-) diff --git a/model/sensor/driver/als/sensor_als_driver.c b/model/sensor/driver/als/sensor_als_driver.c index e89e9b6c9..cd91f4aeb 100755 --- a/model/sensor/driver/als/sensor_als_driver.c +++ b/model/sensor/driver/als/sensor_als_driver.c @@ -35,7 +35,7 @@ static char *g_extendedAlsGroupName[EXTENDED_ALS_GROUP_MAX] = { int32_t GetTimeByRegValue(uint8_t regValue, struct TimeMap *table, int32_t itemNum) { - int i; + int32_t i; CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); @@ -44,12 +44,13 @@ int32_t GetTimeByRegValue(uint8_t regValue, struct TimeMap *table, int32_t itemN return table[i].timeValue; } } + return HDF_FAILURE; } int32_t GetRegValueByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum) { - int i; + int32_t i; CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); @@ -58,12 +59,13 @@ int32_t GetRegValueByTime(uint32_t timeValue, struct TimeMap *table, int32_t ite return table[i].timeRegValue; } } + return HDF_FAILURE; } int32_t GetRegGroupIndexByTime(uint32_t timeValue, struct TimeMap *table, int32_t itemNum) { - int i; + int32_t i; CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); @@ -72,12 +74,13 @@ int32_t GetRegGroupIndexByTime(uint32_t timeValue, struct TimeMap *table, int32_ return i; } } + return HDF_FAILURE; } int32_t GetGainByRegValue(uint8_t regValue, struct GainMap *table, int32_t itemNum) { - int i; + int32_t i; CHECK_NULL_PTR_RETURN_VALUE(table, HDF_FAILURE); @@ -86,12 +89,13 @@ int32_t GetGainByRegValue(uint8_t regValue, struct GainMap *table, int32_t itemN return table[i].gainValue; } } + return HDF_FAILURE; } -static uint32_t GetExtendedAlsRegGroupNameIndex(const char *name) +static int32_t GetExtendedAlsRegGroupNameIndex(const char *name) { - uint32_t index; + int32_t index; CHECK_NULL_PTR_RETURN_VALUE(name, EXTENDED_ALS_GROUP_MAX); @@ -117,6 +121,7 @@ void ReleaseExtendedAlsRegConfig(struct SensorCfgData *config) OsalMemFree(config->extendedRegCfgGroup[index]->regCfgItem); config->extendedRegCfgGroup[index]->regCfgItem = NULL; } + OsalMemFree(config->extendedRegCfgGroup[index]); config->extendedRegCfgGroup[index] = NULL; } @@ -142,6 +147,7 @@ int32_t ParseExtendedAlsRegConfig(struct SensorCfgData *config) HDF_LOGE("%s:sensor reg node attr is null", __func__); break; } + index = GetExtendedAlsRegGroupNameIndex(extendedRegAttr->name); if (index >= EXTENDED_ALS_GROUP_MAX) { HDF_LOGE("%s: get sensor register group index failed", __func__); @@ -154,11 +160,13 @@ int32_t ParseExtendedAlsRegConfig(struct SensorCfgData *config) goto ERROR; } } + return HDF_SUCCESS; ERROR: ReleaseExtendedAlsRegConfig(config); HDF_LOGE("%s: parse sensor extend register config failed", __func__); + return HDF_FAILURE; } @@ -318,7 +326,7 @@ static int32_t SetAlsOption(uint32_t option) } static int32_t DispatchAls(struct HdfDeviceIoClient *client, - int cmd, struct HdfSBuf *data, struct HdfSBuf *reply) + int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) { (void)client; (void)cmd; diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index a24aa7ced..ff997776e 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -30,6 +30,7 @@ static struct TimeMap g_timeMap[EXTENDED_ALS_TIME_GROUP_INDEX_MAX] = { { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_4, BH1745_TIME_2560MSEC }, { EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_5, BH1745_TIME_5120MSEC } }; + static struct GainMap g_gainMap[EXTENDED_ALS_GAIN_GROUP_INDEX_MAX] = { { EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_0, BH1745_GAIN_1X }, { EXTENDED_ALS_GAIN_GROUP_ATTR_VALUE_1, BH1745_GAIN_2X }, @@ -61,6 +62,10 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa timeGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_TIME_GROUP]; timeItemNum = timeGroupNode->itemNum; + if (timeItemNum > EXTENDED_ALS_TIME_GROUP_INDEX_MAX) { + HDF_LOGE("%s: TimeItemNum out of range ", __func__); + return HDF_FAILURE; + } ReadSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, ®Value, sizeof(uint8_t)); regValue &= timeGroupNode->regCfgItem->mask; @@ -87,6 +92,7 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa HDF_LOGE("%s: Index out of range ", __func__); return HDF_FAILURE; } + WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); } return HDF_SUCCESS; @@ -94,16 +100,13 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) { - uint32_t timeTemp; - uint32_t gainTemp; - uint8_t timeRegValue; - uint8_t gainRegvalue; + uint32_t time; + uint32_t gain; + uint8_t regValue; uint32_t index = 1; uint32_t luxTemp; - uint8_t timeItemNum; - uint8_t gainItemNum; - struct SensorRegCfgGroupNode *timeGroupNode = NULL; - struct SensorRegCfgGroupNode *gainGroupNode = NULL; + uint8_t itemNum; + struct SensorRegCfgGroupNode *GroupNode = NULL; int32_t timeIndex = EXTENDED_ALS_TIME_GROUP_INDEX_0; int32_t gainIndex = EXTENDED_ALS_GAIN_GROUP_INDEX_0; @@ -116,20 +119,31 @@ static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) } luxTemp = g_red[index] * rgbcData[ALS_R] + g_green[index] * rgbcData[ALS_G]; - timeGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_TIME_GROUP]; - timeItemNum = timeGroupNode->itemNum; - gainGroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_GAIN_GROUP]; - gainItemNum = gainGroupNode->itemNum; - ReadSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, timeIndex, &timeRegValue, sizeof(uint8_t)); - timeRegValue &= timeGroupNode->regCfgItem->mask; - timeTemp = GetTimeByRegValue(timeRegValue, g_timeMap, timeItemNum); + GroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_TIME_GROUP]; + itemNum = GroupNode->itemNum; + if (itemNum > EXTENDED_ALS_TIME_GROUP_INDEX_MAX) { + HDF_LOGE("%s: ItemNum out of range ", __func__); + return HDF_FAILURE; + } + + ReadSensorRegCfgArray(&CfgData->busCfg, GroupNode, timeIndex, ®Value, sizeof(uint8_t)); + regValue &= GroupNode->regCfgItem->mask; + time = GetTimeByRegValue(regValue, g_timeMap, itemNum); + + regValue = 0; + GroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_GAIN_GROUP]; + itemNum = GroupNode->itemNum; + if (timeItemNum > EXTENDED_ALS_GAIN_GROUP_INDEX_MAX) { + HDF_LOGE("%s: TimeItemNum out of range ", __func__); + return HDF_FAILURE; + } - ReadSensorRegCfgArray(&CfgData->busCfg, gainGroupNode, gainIndex, &gainRegvalue, sizeof(uint8_t)); - gainRegvalue &= gainGroupNode->regCfgItem->mask; - gainTemp = GetGainByRegValue(gainRegvalue, g_gainMap, gainItemNum); + ReadSensorRegCfgArray(&CfgData->busCfg, GroupNode, gainIndex, ®Value, sizeof(uint8_t)); + regValue &= GroupNode->regCfgItem->mask; + gain = GetGainByRegValue(regValue, g_gainMap, itemNum); - return (((luxTemp * BH1745_TIME_160MSEC * BH1745_GAIN_16X) / gainTemp) / timeTemp); + return (((luxTemp * BH1745_TIME_160MSEC * BH1745_GAIN_16X) / gain) / time); } static int32_t RawDataConvert(struct SensorCfgData *CfgData, struct AlsReportData *reportData, uint32_t* rgbcData) @@ -138,6 +152,7 @@ static int32_t RawDataConvert(struct SensorCfgData *CfgData, struct AlsReportDat reportData->als = (uint32_t)CalLux(CfgData, rgbcData); reportData->als = (reportData->als > 0) ? reportData->als : 0; + ret = DynamicRangCovert(CfgData, rgbcData); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "DynamicRangCovert"); @@ -232,6 +247,7 @@ int32_t ReadBh1745Data(struct SensorCfgData *data) event.dataLen = sizeof(reportData.als); event.data = (uint8_t *)&reportData.als; + ret = ReportSensorEvent(&event); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: BH1745 report data failed", __func__); diff --git a/model/sensor/driver/chipset/als/als_bh1745.h b/model/sensor/driver/chipset/als/als_bh1745.h index 4f9dfd275..34105dee4 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.h +++ b/model/sensor/driver/chipset/als/als_bh1745.h @@ -13,45 +13,45 @@ #include "sensor_config_parser.h" /* ALS DATA REGISTERS ADDR */ -#define BH1745_ALS_R_LSB_ADDR 0X50 -#define BH1745_ALS_R_MSB_ADDR 0X51 -#define BH1745_ALS_G_LSB_ADDR 0X52 -#define BH1745_ALS_G_MSB_ADDR 0X53 -#define BH1745_ALS_B_LSB_ADDR 0X54 -#define BH1745_ALS_B_MSB_ADDR 0X55 -#define BH1745_ALS_C_LSB_ADDR 0X56 -#define BH1745_ALS_C_MSB_ADDR 0X57 -#define BH1745_MODECONTROL3_ADDR 0X44 +#define BH1745_ALS_R_LSB_ADDR 0X50 +#define BH1745_ALS_R_MSB_ADDR 0X51 +#define BH1745_ALS_G_LSB_ADDR 0X52 +#define BH1745_ALS_G_MSB_ADDR 0X53 +#define BH1745_ALS_B_LSB_ADDR 0X54 +#define BH1745_ALS_B_MSB_ADDR 0X55 +#define BH1745_ALS_C_LSB_ADDR 0X56 +#define BH1745_ALS_C_MSB_ADDR 0X57 +#define BH1745_MODECONTROL3_ADDR 0X44 /* ALS DATA READY */ -#define BH1745_ALS_DATA_READY_MASK 0X02 +#define BH1745_ALS_DATA_READY_MASK 0X02 /* ALS MULTIPLE */ -#define BH1745_MULTIPLE_100 100 +#define BH1745_MULTIPLE_100 100 /* ALS COEFFICIENT */ -#define BH1745_COEFFICIENT_RED 2 -#define BH1745_COEFFICIENT_GREEN 2 -#define BH1745_COEFFICIENT_RED_LEVEL_0 77300 // 7.73 * 10000 -#define BH1745_COEFFICIENT_RED_LEVEL_1 92715 // 9.2715 * 10000 -#define BH1745_COEFFICIENT_GREEN_LEVEL_0 131920 // 1.3192 * 10000 -#define BH1745_COEFFICIENT_GREEN_LEVEL_1 214770 // 2.1477 * 10000 -#define BH1745_COEFFICIENT_JUDGE 78 // 0.78*100 +#define BH1745_COEFFICIENT_RED 2 +#define BH1745_COEFFICIENT_GREEN 2 +#define BH1745_COEFFICIENT_RED_LEVEL_0 77300 // 7.73 * 10000 +#define BH1745_COEFFICIENT_RED_LEVEL_1 92715 // 9.2715 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_0 131920 // 1.3192 * 10000 +#define BH1745_COEFFICIENT_GREEN_LEVEL_1 214770 // 2.1477 * 10000 +#define BH1745_COEFFICIENT_JUDGE 78 // 0.78*100 /* ALS TIME */ -#define BH1745_TIME_160MSEC 160 -#define BH1745_TIME_320MSEC 320 -#define BH1745_TIME_640MSEC 640 -#define BH1745_TIME_1280MSEC 1280 -#define BH1745_TIME_2560MSEC 2560 -#define BH1745_TIME_5120MSEC 5120 -#define BH1745_TIME_MAX 5570475 // 65535*0.85*100 -#define BH1745_TIME_MIN 1638375 // 65535*0.25*100 +#define BH1745_TIME_160MSEC 160 +#define BH1745_TIME_320MSEC 320 +#define BH1745_TIME_640MSEC 640 +#define BH1745_TIME_1280MSEC 1280 +#define BH1745_TIME_2560MSEC 2560 +#define BH1745_TIME_5120MSEC 5120 +#define BH1745_TIME_MAX 5570475 // 65535*0.85*100 +#define BH1745_TIME_MIN 1638375 // 65535*0.25*100 /* ALS GAIN */ -#define BH1745_GAIN_1X 1 -#define BH1745_GAIN_2X 2 -#define BH1745_GAIN_16X 16 +#define BH1745_GAIN_1X 1 +#define BH1745_GAIN_2X 2 +#define BH1745_GAIN_16X 16 /* ALS TIME REG VALUE */ #define EXTENDED_ALS_TIME_GROUP_ATTR_VALUE_0 0x00 diff --git a/model/sensor/driver/common/src/sensor_config_controller.c b/model/sensor/driver/common/src/sensor_config_controller.c index 2b1b86249..c70b641a7 100644 --- a/model/sensor/driver/common/src/sensor_config_controller.c +++ b/model/sensor/driver/common/src/sensor_config_controller.c @@ -314,6 +314,7 @@ int32_t ReadSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorRe cfgItem = group->regCfgItem + index; len = (cfgItem->len > len) ? len : cfgItem->len; + ret = ReadSensor(busCfg, cfgItem->regAddr, buf, len); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "read i2c reg"); @@ -324,6 +325,7 @@ int32_t WriteSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorR int32_t index, int32_t len) { struct SensorRegCfg *cfgItem = NULL; + CHECK_NULL_PTR_RETURN_VALUE(busCfg, HDF_FAILURE); CHECK_NULL_PTR_RETURN_VALUE(group, HDF_FAILURE); CHECK_NULL_PTR_RETURN_VALUE(group->regCfgItem, HDF_FAILURE); @@ -334,6 +336,7 @@ int32_t WriteSensorRegCfgArray(struct SensorBusCfg *busCfg, const struct SensorR } cfgItem = group->regCfgItem + index; + int32_t ret = SensorOpsUpdateBitwise(busCfg, cfgItem); CHECK_PARSER_RESULT_RETURN_VALUE(ret, "Write i2c reg"); -- Gitee From 1bcee1a00b72ce7f177afbc6870175e4cff7b9e5 Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 14 Dec 2021 20:36:46 +0800 Subject: [PATCH 263/272] =?UTF-8?q?style=EF=BC=9Amodify=20sensor=20als=20d?= =?UTF-8?q?river=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenchong --- model/sensor/driver/chipset/als/als_bh1745.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index ff997776e..02169fe21 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -82,6 +82,7 @@ static int32_t DynamicRangCovert(struct SensorCfgData *CfgData, uint32_t *rgbcDa g_timeMap_flag = 1; index = GetRegGroupIndexByTime(temp, g_timeMap, timeItemNum); index--; + WriteSensorRegCfgArray(&CfgData->busCfg, timeGroupNode, index, sizeof(uint8_t)); } else if ((g_timeMap_flag == 1) && ((rgbcData[ALS_R] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN) || (rgbcData[ALS_G] * BH1745_MULTIPLE_100 < BH1745_TIME_MIN))) { @@ -135,7 +136,7 @@ static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) GroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_GAIN_GROUP]; itemNum = GroupNode->itemNum; if (timeItemNum > EXTENDED_ALS_GAIN_GROUP_INDEX_MAX) { - HDF_LOGE("%s: TimeItemNum out of range ", __func__); + HDF_LOGE("%s: ItemNum out of range ", __func__); return HDF_FAILURE; } -- Gitee From 915b01f3a40afa263a3b5d8484dd123865c2f791 Mon Sep 17 00:00:00 2001 From: yinshuqing Date: Tue, 14 Dec 2021 20:00:58 +0800 Subject: [PATCH 264/272] Watchdog test case repair Signed-off-by: yinshuqing --- include/platform/watchdog_if.h | 2 +- .../platform/include/watchdog/watchdog_core.h | 2 +- support/platform/src/watchdog/watchdog_core.c | 7 +-- support/platform/src/watchdog/watchdog_if.c | 16 +++++-- test/unittest/platform/common/watchdog_test.c | 45 ++++++++++++++++++- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/include/platform/watchdog_if.h b/include/platform/watchdog_if.h index be2682670..cb443e463 100644 --- a/include/platform/watchdog_if.h +++ b/include/platform/watchdog_if.h @@ -63,7 +63,7 @@ enum WatchdogStatus { * * @since 1.0 */ -DevHandle WatchdogOpen(int16_t wdtId); +int32_t WatchdogOpen(int16_t wdtId, DevHandle *handle); /** * @brief Closes a watchdog. diff --git a/support/platform/include/watchdog/watchdog_core.h b/support/platform/include/watchdog/watchdog_core.h index 846204735..7af3ce29f 100644 --- a/support/platform/include/watchdog/watchdog_core.h +++ b/support/platform/include/watchdog/watchdog_core.h @@ -100,7 +100,7 @@ int32_t WatchdogCntlrGetTimeout(struct WatchdogCntlr *cntlr, uint32_t *seconds); int32_t WatchdogCntlrFeed(struct WatchdogCntlr *cntlr); -void WatchdogGetPrivData(struct WatchdogCntlr *cntlr); +int32_t WatchdogGetPrivData(struct WatchdogCntlr *cntlr); void WatchdogReleasePriv(struct WatchdogCntlr *cntlr); diff --git a/support/platform/src/watchdog/watchdog_core.c b/support/platform/src/watchdog/watchdog_core.c index ba522098b..cdf901f5b 100644 --- a/support/platform/src/watchdog/watchdog_core.c +++ b/support/platform/src/watchdog/watchdog_core.c @@ -55,14 +55,15 @@ void WatchdogCntlrRemove(struct WatchdogCntlr *cntlr) (void)OsalSpinDestroy(&cntlr->lock); } -void WatchdogGetPrivData(struct WatchdogCntlr *cntlr) +int32_t WatchdogGetPrivData(struct WatchdogCntlr *cntlr) { if (cntlr == NULL || cntlr->ops == NULL) { - return; + return HDF_ERR_INVALID_OBJECT; } if (cntlr->ops->getPriv != NULL) { - cntlr->ops->getPriv(cntlr); + return cntlr->ops->getPriv(cntlr); } + return HDF_SUCCESS; } void WatchdogReleasePriv(struct WatchdogCntlr *cntlr) diff --git a/support/platform/src/watchdog/watchdog_if.c b/support/platform/src/watchdog/watchdog_if.c index b67506eef..f1f85aee2 100644 --- a/support/platform/src/watchdog/watchdog_if.c +++ b/support/platform/src/watchdog/watchdog_if.c @@ -46,16 +46,24 @@ static struct Watchdog *WatchdogGetById(int16_t wdtId) return service; } -DevHandle WatchdogOpen(int16_t wdtId) +int32_t WatchdogOpen(int16_t wdtId, DevHandle *handle) { struct Watchdog *service = NULL; + int32_t ret; service = WatchdogGetById(wdtId); if (service == NULL) { - return NULL; + *handle = NULL; + return HDF_ERR_INVALID_OBJECT; + } + + ret = WatchdogGetPrivData((struct WatchdogCntlr *)service); + if (ret == HDF_SUCCESS) { + *handle = (DevHandle)service; + return ret; } - WatchdogGetPrivData((struct WatchdogCntlr *)service); - return (DevHandle)service; + + return ret; } void WatchdogClose(DevHandle handle) diff --git a/test/unittest/platform/common/watchdog_test.c b/test/unittest/platform/common/watchdog_test.c index ee2d92360..9a4ad18b0 100644 --- a/test/unittest/platform/common/watchdog_test.c +++ b/test/unittest/platform/common/watchdog_test.c @@ -19,13 +19,21 @@ #define WATCHDOG_TEST_TIMEOUT 2 #define WATCHDOG_TEST_FEED_TIME 6 +static int32_t g_wdtState = 0; + static int32_t WatchdogTestSetUp(struct WatchdogTester *tester) { + int32_t ret; + if (tester == NULL) { return HDF_ERR_INVALID_OBJECT; } if (tester->handle == NULL) { - tester->handle = WatchdogOpen(0); + ret = WatchdogOpen(0, &tester->handle); + if (ret == HDF_ERR_DEVICE_BUSY) { + g_wdtState = ret; + return HDF_SUCCESS; + } } if (tester->handle == NULL) { return HDF_ERR_DEVICE_BUSY; @@ -38,6 +46,11 @@ static int32_t WatchdogTestSetUp(struct WatchdogTester *tester) static void WatchdogTestTearDown(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return; + } + int ret; if (tester == NULL || tester->handle == NULL) { @@ -56,6 +69,11 @@ static void WatchdogTestTearDown(struct WatchdogTester *tester) static int32_t TestCaseWatchdogSetGetTimeout(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + int32_t ret; uint32_t timeoutGet = 0; const uint32_t timeoutSet = WATCHDOG_TEST_TIMEOUT; @@ -80,6 +98,11 @@ static int32_t TestCaseWatchdogSetGetTimeout(struct WatchdogTester *tester) static int32_t TestCaseWatchdogStartStop(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + int32_t ret; int32_t status; @@ -116,6 +139,11 @@ static int32_t TestCaseWatchdogStartStop(struct WatchdogTester *tester) static int32_t TestCaseWatchdogFeed(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + int32_t ret; int32_t i; @@ -141,6 +169,11 @@ static int32_t TestCaseWatchdogFeed(struct WatchdogTester *tester) static int32_t TestCaseWatchdogBark(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + #ifdef WATCHDOG_TEST_BARK_RESET int32_t ret; int32_t i; @@ -166,6 +199,11 @@ static int32_t TestCaseWatchdogBark(struct WatchdogTester *tester) static int32_t TestCaseWatchdogReliability(struct WatchdogTester *tester) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + int32_t status; uint32_t timeout; @@ -198,6 +236,11 @@ static int32_t TestCaseWatchdogReliability(struct WatchdogTester *tester) static int32_t WatchdogTestByCmd(struct WatchdogTester *tester, int32_t cmd) { + if (g_wdtState == HDF_ERR_DEVICE_BUSY) { + HDF_LOGE("%s: DEVICE IS BUSY", __func__); + return HDF_SUCCESS; + } + int32_t i; if (cmd == WATCHDOG_TEST_SET_GET_TIMEOUT) { -- Gitee From 2257aa9acfa8b0addca981070a54e398fed671cb Mon Sep 17 00:00:00 2001 From: chenchong Date: Tue, 14 Dec 2021 21:09:49 +0800 Subject: [PATCH 265/272] =?UTF-8?q?style=EF=BC=9Amodify=20sensor=20als=20d?= =?UTF-8?q?river=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: chenchong --- model/sensor/driver/chipset/als/als_bh1745.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/sensor/driver/chipset/als/als_bh1745.c b/model/sensor/driver/chipset/als/als_bh1745.c index 02169fe21..4555a71b9 100755 --- a/model/sensor/driver/chipset/als/als_bh1745.c +++ b/model/sensor/driver/chipset/als/als_bh1745.c @@ -135,7 +135,7 @@ static uint32_t CalLux(struct SensorCfgData *CfgData, uint32_t *rgbcData) regValue = 0; GroupNode = CfgData->extendedRegCfgGroup[EXTENDED_ALS_GAIN_GROUP]; itemNum = GroupNode->itemNum; - if (timeItemNum > EXTENDED_ALS_GAIN_GROUP_INDEX_MAX) { + if (itemNum > EXTENDED_ALS_GAIN_GROUP_INDEX_MAX) { HDF_LOGE("%s: ItemNum out of range ", __func__); return HDF_FAILURE; } -- Gitee From 9e4bbcb70601464223855be02a7b1880c56c14b4 Mon Sep 17 00:00:00 2001 From: zhang Date: Wed, 15 Dec 2021 11:22:20 +0800 Subject: [PATCH 266/272] fix: optimize test case of hdf asynchronous pm interface Signed-off-by: zhang --- core/host/src/hdf_power_manager.c | 2 +- test/unittest/pm/hdf_pm_driver_test.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/host/src/hdf_power_manager.c b/core/host/src/hdf_power_manager.c index 94cc4132a..a7f50fd92 100755 --- a/core/host/src/hdf_power_manager.c +++ b/core/host/src/hdf_power_manager.c @@ -45,7 +45,7 @@ void HdfPmTaskQueueDestroy(void) pmTaskQueue->taskQueue = NULL; } -int32_t PmTaskFunc(struct HdfTaskType *para) +static int32_t PmTaskFunc(struct HdfTaskType *para) { struct HdfPmRequest *pmRequest = NULL; struct IPowerStateToken *tokenIf = NULL; diff --git a/test/unittest/pm/hdf_pm_driver_test.c b/test/unittest/pm/hdf_pm_driver_test.c index c1f1e7214..f07a77600 100755 --- a/test/unittest/pm/hdf_pm_driver_test.c +++ b/test/unittest/pm/hdf_pm_driver_test.c @@ -265,8 +265,8 @@ int32_t HdfPmRegisterTestListener(int32_t index) int32_t HdfPmBakListener(int32_t index) { + HdfPmUnregisterPowerListener(pmTestType[index].obj, &pmTestType[index].listener.powerListener); if (pmTestType[index].listenerBak != NULL) { - HdfPmUnregisterPowerListener(pmTestType[index].obj, &pmTestType[index].listener.powerListener); HdfPmRegisterPowerListener(pmTestType[index].obj, pmTestType[index].listenerBak); HdfPmSetMode(pmTestType[index].obj, HDF_POWER_SYS_CTRL); } @@ -317,6 +317,7 @@ int32_t HdfPmTestEnd(void) HdfPowerManagerExit(); HdfPmTaskQueueInit(NULL); + loopTest = false; return HDF_SUCCESS; } -- Gitee From 36fb60bcf691d9a1c9e3ad69961a64f9357efb33 Mon Sep 17 00:00:00 2001 From: mahai Date: Wed, 15 Dec 2021 12:17:51 +0800 Subject: [PATCH 267/272] fix: clear code alarm in platform driver Signed-off-by: mahai --- support/platform/src/hdmi/hdmi_infoframe.c | 11 ++++++----- support/platform/src/pwm/pwm_core.c | 2 -- support/platform/src/rtc/rtc_base.c | 1 - 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/support/platform/src/hdmi/hdmi_infoframe.c b/support/platform/src/hdmi/hdmi_infoframe.c index 37bd5bc0e..f6207f944 100644 --- a/support/platform/src/hdmi/hdmi_infoframe.c +++ b/support/platform/src/hdmi/hdmi_infoframe.c @@ -115,7 +115,7 @@ static int32_t HdmiInfoFramePacketAviEncoding(union HdmiInfoFrameInfo *infoFrame buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ buff[UINT8_ARRAY_TElEMENT_0] |= (avi->colorSpace & HDMI_AVI_COLOR_SPACE_MARK) << HDMI_AVI_COLOR_SPACE_SHIFT; - buff[UINT8_ARRAY_TElEMENT_0] |= (avi->scanMode & HDMI_AVI_SCAN_MODE_MARK); + buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)avi->scanMode & HDMI_AVI_SCAN_MODE_MARK); if (avi->activeFormatInformationPresent == true) { buff[UINT8_ARRAY_TElEMENT_0] |= (1 << HDMI_AVI_ACTIVE_INFORMATION_SHIFT); } @@ -222,18 +222,19 @@ static int32_t HdmiInfoFramePacketAudioEncoding(union HdmiInfoFrameInfo *infoFra HdmiInfoFrameFillHeader(&(infoFrame->header), data, len); buff += HDMI_INFOFRAME_PACKET_HEADER_LEN; /* PB1 */ - buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << HDMI_AUDIO_CODING_TYPE_SHIFT; + buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)audio->codingType & HDMI_AUDIO_CODING_TYPE_MARK) << + HDMI_AUDIO_CODING_TYPE_SHIFT; buff[UINT8_ARRAY_TElEMENT_0] |= ((uint8_t)audio->channelCount & HDMI_AUDIO_CHANNEL_COUNT_MARK); /* PB2 */ buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)audio->sampleFreq & HDMI_AUDIO_SAMPLE_FREQUENCY_MARK) << HDMI_AUDIO_SAMPLE_FREQUENCY_SHIFT; - buff[UINT8_ARRAY_TElEMENT_1] |= (audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); + buff[UINT8_ARRAY_TElEMENT_1] |= ((uint8_t)audio->sampleSize & HDMI_AUDIO_SAMPLE_SIZE_MARK); /* PB3 */ buff[UINT8_ARRAY_TElEMENT_2] |= ((uint8_t)audio->codingExtType & HDMI_AUDIO_CXT_MARK); /* PB4 */ buff[UINT8_ARRAY_TElEMENT_3] |= audio->channelAllocation; /* PB5 */ - buff[UINT8_ARRAY_TElEMENT_4] |= (audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << + buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)audio->levelShiftValue & HDMI_AUDIO_LEVEL_SHIFT_VALUE_MARK) << HDMI_AUDIO_LEVEL_SHIFT_VALUE_SHIFT; buff[UINT8_ARRAY_TElEMENT_4] |= ((uint8_t)audio->playBackLevel & HDMI_AUDIO_LEF_PLAYBACK_LEVEL_MARK); if (audio->dmInh == true) { @@ -828,4 +829,4 @@ int32_t HdmiInfoFrameSetInfo(struct HdmiInfoFrame *frame, enum HdmiPacketType ty return HDF_ERR_INVALID_PARAM; } return HDF_SUCCESS; -} \ No newline at end of file +} diff --git a/support/platform/src/pwm/pwm_core.c b/support/platform/src/pwm/pwm_core.c index dae896f84..82c7736af 100644 --- a/support/platform/src/pwm/pwm_core.c +++ b/support/platform/src/pwm/pwm_core.c @@ -8,8 +8,6 @@ #include "pwm_core.h" #include "hdf_log.h" -#include "osal_mem.h" -#include "securec.h" #define HDF_LOG_TAG pwm_core diff --git a/support/platform/src/rtc/rtc_base.c b/support/platform/src/rtc/rtc_base.c index e975babd5..f98003ee2 100644 --- a/support/platform/src/rtc/rtc_base.c +++ b/support/platform/src/rtc/rtc_base.c @@ -7,7 +7,6 @@ */ #include "rtc_base.h" -#include "hdf_log.h" #include "platform_core.h" #define HDF_LOG_TAG rtc_base -- Gitee From 88d18655c3e438c2a0aef6868038d6161972b4e6 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Wed, 15 Dec 2021 08:41:26 +0800 Subject: [PATCH 268/272] feat: support device service status notify Signed-off-by: yuanbo --- .../adapter/syscall/src/hdf_syscall_adapter.c | 2 +- core/adapter/vnode/src/hdf_vnode_adapter.c | 6 +- core/common/src/devlite_object_config.c | 7 +- core/common/src/devmgr_service_start.c | 4 +- core/common/src/hdf_attribute.c | 6 +- core/host/include/devsvc_manager_clnt.h | 5 +- core/host/include/hdf_device.h | 1 + core/host/include/hdf_device_node.h | 1 + core/host/include/hdf_device_object.h | 5 +- core/host/src/devhost_service.c | 6 +- core/host/src/devsvc_manager_clnt.c | 31 ++- core/host/src/hdf_device.c | 31 ++- core/host/src/hdf_device_node.c | 6 +- core/host/src/hdf_device_object.c | 33 ++- core/manager/include/devsvc_listener_holder.h | 28 +++ core/manager/include/devsvc_manager.h | 13 +- core/manager/include/devsvc_manager_ext.h | 15 ++ core/manager/src/devmgr_service.c | 6 + core/manager/src/devsvc_manager.c | 175 ++++++++++--- core/manager/src/devsvc_manager_ext.c | 209 ++++++++++++++++ core/manager/src/servstat_listener_holder.c | 127 ++++++++++ .../unittest/common/hdf_ioservice_test.cpp | 235 +++++++++++++++++- core/shared/include/devsvc_manager_if.h | 7 +- core/shared/include/hdf_service_record.h | 8 +- core/shared/include/hdf_service_status.h | 53 ++++ core/shared/include/ioservstat_listener.h | 34 +++ core/shared/include/power_state_token_if.h | 8 + core/shared/include/svcmgr_ioservice.h | 40 +++ core/shared/src/hdf_service_record.c | 8 +- core/shared/src/ioserstat_listener.c | 54 ++++ core/shared/src/service_status.c | 48 ++++ core/shared/src/svcmgr_ioservice.c | 130 ++++++++++ include/core/hdf_io_service_if.h | 30 +-- test/unittest/manager/sample_driver_test.c | 23 +- test/unittest/manager/sample_driver_test.h | 1 + 35 files changed, 1304 insertions(+), 92 deletions(-) create mode 100644 core/manager/include/devsvc_listener_holder.h create mode 100644 core/manager/include/devsvc_manager_ext.h create mode 100644 core/manager/src/devsvc_manager_ext.c create mode 100644 core/manager/src/servstat_listener_holder.c create mode 100644 core/shared/include/hdf_service_status.h create mode 100644 core/shared/include/ioservstat_listener.h create mode 100644 core/shared/include/svcmgr_ioservice.h create mode 100644 core/shared/src/ioserstat_listener.c create mode 100644 core/shared/src/service_status.c create mode 100644 core/shared/src/svcmgr_ioservice.c diff --git a/core/adapter/syscall/src/hdf_syscall_adapter.c b/core/adapter/syscall/src/hdf_syscall_adapter.c index 2759120dc..88db2dc93 100644 --- a/core/adapter/syscall/src/hdf_syscall_adapter.c +++ b/core/adapter/syscall/src/hdf_syscall_adapter.c @@ -664,7 +664,7 @@ static int32_t HdfSyscallAdapterDispatch(struct HdfObject *object, int32_t code, wrBuf.cmdCode = code; int32_t ret = ioctl(ioService->fd, HDF_WRITE_READ, &wrBuf); if (ret < 0) { - HDF_LOGE("Failed to dispatch serv call ioctl %d", errno); + HDF_LOGE("Failed to dispatch serv call ioctl %{public}d", errno); } if (reply != NULL) { HdfSbufSetDataSize(reply, wrBuf.readConsumed); diff --git a/core/adapter/vnode/src/hdf_vnode_adapter.c b/core/adapter/vnode/src/hdf_vnode_adapter.c index b3c7de643..90e357ec0 100644 --- a/core/adapter/vnode/src/hdf_vnode_adapter.c +++ b/core/adapter/vnode/src/hdf_vnode_adapter.c @@ -199,8 +199,10 @@ static int HdfVNodeAdapterServCall(const struct HdfVNodeAdapterClient *client, u struct HdfSBuf *reply = NULL; int ret; - if (client->serv == NULL) { - return HDF_DEV_ERR_NO_DEVICE; + if (client->serv == NULL || client->adapter == NULL || + client->adapter->ioService.dispatcher == NULL || + client->adapter->ioService.dispatcher->Dispatch == NULL) { + return HDF_ERR_INVALID_OBJECT; } if (bwrUser == NULL) { diff --git a/core/common/src/devlite_object_config.c b/core/common/src/devlite_object_config.c index bea66407d..8be58a208 100644 --- a/core/common/src/devlite_object_config.c +++ b/core/common/src/devlite_object_config.c @@ -6,15 +6,16 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include "hdf_object_manager.h" #include "devhost_service.h" #include "devmgr_service.h" #include "devsvc_manager.h" +#include "devsvc_manager_ext.h" #include "hdf_device.h" #include "hdf_device_node_ext.h" #include "hdf_device_token.h" #include "hdf_driver_installer.h" #include "hdf_driver_loader.h" +#include "hdf_object_manager.h" static const struct HdfObjectCreator g_liteObjectCreators[] = { [HDF_OBJECT_ID_DEVMGR_SERVICE] = @@ -24,8 +25,8 @@ static const struct HdfObjectCreator g_liteObjectCreators[] = { }, [HDF_OBJECT_ID_DEVSVC_MANAGER] = { - .Create = DevSvcManagerCreate, - .Release = DevSvcManagerRelease, + .Create = DevSvcManagerExtCreate, + .Release = DevSvcManagerExtRelease, }, [HDF_OBJECT_ID_DEVHOST_SERVICE] = { diff --git a/core/common/src/devmgr_service_start.c b/core/common/src/devmgr_service_start.c index ce3d01929..b537fbc27 100644 --- a/core/common/src/devmgr_service_start.c +++ b/core/common/src/devmgr_service_start.c @@ -38,7 +38,7 @@ int DeviceManagerDispatch(struct HdfObject *stub, int code, struct HdfSBuf *data int ret = HDF_FAILURE; int32_t deviceClass = 0; const char *svcName = NULL; - struct DevmgrService *devMgrSvc = (struct DevmgrService *)stub; + struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); static struct SubscriberCallback callback = { .deviceObject = NULL, .OnServiceConnected = NULL, @@ -107,7 +107,7 @@ int DeviceManagerStart(void) .Dispatch = DeviceManagerDispatch, }; ioService->dispatcher = &dispatcher; - ioService->target = &instance->base; + ioService->target = NULL; } ret = instance->StartService(instance); if (ret != HDF_SUCCESS) { diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index f9c334bee..d20e6ae73 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -180,7 +180,7 @@ static bool GetDeviceNodeInfo(const struct DeviceResourceNode *deviceNode, struc static bool GetDevcieNodeList(const struct DeviceResourceNode *device, struct DevHostServiceClnt *hostClnt, uint16_t deviceIdx) { - uint8_t deviceNodeIdx = 0; + uint8_t deviceNodeIdx = 1; uint16_t hostId = hostClnt->hostId; struct HdfDeviceInfo *deviceNodeInfo = NULL; const struct DeviceResourceNode *devNodeResource = device->child; @@ -210,12 +210,12 @@ static bool GetDevcieNodeList(const struct DeviceResourceNode *device, deviceNodeIdx++; } - return deviceNodeIdx > 0; + return deviceNodeIdx > 1; } int HdfAttributeManagerGetDeviceList(struct DevHostServiceClnt *hostClnt) { - uint16_t deviceIdx = 0; + uint16_t deviceIdx = 1; const struct DeviceResourceNode *hostNode = NULL; const struct DeviceResourceNode *device = NULL; int ret = HDF_DEV_ERR_NO_DEVICE; diff --git a/core/host/include/devsvc_manager_clnt.h b/core/host/include/devsvc_manager_clnt.h index 991be8d21..34c748069 100644 --- a/core/host/include/devsvc_manager_clnt.h +++ b/core/host/include/devsvc_manager_clnt.h @@ -17,7 +17,10 @@ struct DevSvcManagerClnt { struct DevSvcManagerClnt *DevSvcManagerClntGetInstance(void); struct HdfDeviceObject *DevSvcManagerClntGetDeviceObject(const char *svcName); -int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *service); +int DevSvcManagerClntAddService(const char *svcName, uint16_t devClass, + struct HdfDeviceObject *service, const char *servinfo); +int DevSvcManagerClntUpdateService(const char *svcName, uint16_t devClass, + struct HdfDeviceObject *service, const char *servinfo); void DevSvcManagerClntRemoveService(const char *svcName); int DevSvcManagerClntSubscribeService(const char *svcName, struct SubscriberCallback callback); int DevSvcManagerClntUnsubscribeService(const char *svcName); diff --git a/core/host/include/hdf_device.h b/core/host/include/hdf_device.h index 5525ed37c..9b4328612 100644 --- a/core/host/include/hdf_device.h +++ b/core/host/include/hdf_device.h @@ -51,6 +51,7 @@ struct HdfDevice { struct DListHead devNodes; uint16_t deviceId; uint16_t hostId; + uint16_t devidIndex; }; int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode); void HdfDeviceConstruct(struct HdfDevice *device); diff --git a/core/host/include/hdf_device_node.h b/core/host/include/hdf_device_node.h index 29077b22c..c0e5a034f 100644 --- a/core/host/include/hdf_device_node.h +++ b/core/host/include/hdf_device_node.h @@ -37,6 +37,7 @@ struct HdfDeviceNode { struct HdfDriver *driver; struct HdfDevice *device; char *servName; + const char *servInfo; char *driverName; devid_t devId; uint16_t policy; diff --git a/core/host/include/hdf_device_object.h b/core/host/include/hdf_device_object.h index 2df158ec3..8c52698a9 100644 --- a/core/host/include/hdf_device_object.h +++ b/core/host/include/hdf_device_object.h @@ -18,6 +18,7 @@ int HdfDeviceObjectRegister(struct HdfDeviceObject *deviceObject); int HdfDeviceObjectUnRegister(struct HdfDeviceObject *deviceObject); int HdfDeviceObjectPublishService(struct HdfDeviceObject *deviceObject, const char *servName, uint8_t policy, uint32_t perm); -int HdfDeviceObjectRemoveService(struct HdfDeviceObject *deviceObject); - +int HdfRemoveService(struct HdfDeviceObject *deviceObject); +int HdfDeviceObjectSetServInfo(struct HdfDeviceObject *dev, const char *info); +int HdfDeviceObjectUpdate(struct HdfDeviceObject *dev); #endif /* HDF_DEVICE_OBJECT_H */ diff --git a/core/host/src/devhost_service.c b/core/host/src/devhost_service.c index 428fd119a..2524e0e85 100644 --- a/core/host/src/devhost_service.c +++ b/core/host/src/devhost_service.c @@ -78,7 +78,11 @@ int DevHostServiceAddDevice(struct IDevHostService *inst, const struct HdfDevice ret = HDF_DEV_ERR_NO_DEVICE; goto error; } - + devNode = device->super.GetDeviceNode(&device->super, deviceInfo->deviceId); + if (devNode != NULL) { + HDF_LOGE("failed to add device %d, device already exist", deviceInfo->deviceId); + return HDF_ERR_DEVICE_BUSY; + } driver = driverLoader->GetDriver(deviceInfo->moduleName); if (driver == NULL) { ret = HDF_DEV_ERR_NODATA; diff --git a/core/host/src/devsvc_manager_clnt.c b/core/host/src/devsvc_manager_clnt.c index e2309184c..e3643a05c 100644 --- a/core/host/src/devsvc_manager_clnt.c +++ b/core/host/src/devsvc_manager_clnt.c @@ -12,7 +12,8 @@ #define HDF_LOG_TAG devsvc_manager_clnt -int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *service) +int DevSvcManagerClntAddService(const char *svcName, uint16_t devClass, + struct HdfDeviceObject *service, const char *servinfo) { struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); struct IDevSvcManager *serviceManager = NULL; @@ -20,13 +21,39 @@ int DevSvcManagerClntAddService(const char *svcName, struct HdfDeviceObject *ser HDF_LOGE("failed to add service, client is null"); return HDF_FAILURE; } + if (devClass >= DEVICE_CLASS_MAX) { + HDF_LOGE("failed to add service, invalid class"); + return HDF_FAILURE; + } serviceManager = devSvcMgrClnt->devSvcMgrIf; if (serviceManager == NULL || serviceManager->AddService == NULL) { HDF_LOGE("serviceManager AddService function is null"); return HDF_FAILURE; } - return serviceManager->AddService(serviceManager, svcName, service); + return serviceManager->AddService(serviceManager, svcName, devClass, service, servinfo); +} + +int DevSvcManagerClntUpdateService(const char *svcName, uint16_t devClass, + struct HdfDeviceObject *service, const char *servinfo) +{ + struct DevSvcManagerClnt *devSvcMgrClnt = DevSvcManagerClntGetInstance(); + struct IDevSvcManager *serviceManager = NULL; + if (devSvcMgrClnt == NULL) { + HDF_LOGE("failed to add service, client is null"); + return HDF_FAILURE; + } + if (devClass >= DEVICE_CLASS_MAX) { + HDF_LOGE("failed to add service, invalid class"); + return HDF_FAILURE; + } + + serviceManager = devSvcMgrClnt->devSvcMgrIf; + if (serviceManager == NULL || serviceManager->UpdateService == NULL) { + HDF_LOGE("serviceManager UpdateService function is null"); + return HDF_FAILURE; + } + return serviceManager->UpdateService(serviceManager, svcName, devClass, service, servinfo); } const struct HdfObject *DevSvcManagerClntGetService(const char *svcName) diff --git a/core/host/src/hdf_device.c b/core/host/src/hdf_device.c index 0f9b2fb65..43487d5fd 100644 --- a/core/host/src/hdf_device.c +++ b/core/host/src/hdf_device.c @@ -18,26 +18,45 @@ #define HDF_LOG_TAG hdf_device +static void UpdateDeivceNodeIdIndex(struct HdfDevice *device, devid_t nodeDevid) +{ + if (device->devidIndex < DEVICEID(nodeDevid)) { + device->devidIndex = DEVICEID(nodeDevid); + } +} + +static int AcquireNodeDeivceId(struct HdfDevice *device, devid_t *devid) +{ + if (device->devidIndex >= DEVICEID_MASK) { + return HDF_FAILURE; + } + device->devidIndex++; + *devid = MK_DEVID(HOSTID(device->deviceId), DEVICEID(device->deviceId), device->devidIndex); + + return HDF_SUCCESS; +} + static int HdfDeviceAttach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) { int ret; struct HdfDevice *device = (struct HdfDevice *)devInst; struct IDeviceNode *nodeIf = (struct IDeviceNode *)devNode; + if (device == NULL || nodeIf == NULL || nodeIf->LaunchNode == NULL) { HDF_LOGE("failed to attach device, input params invalid"); return HDF_ERR_INVALID_PARAM; } // for dynamic added device node, assign device id here - if (devNode->devId == 0) { - devNode->devId = MK_DEVID(HOSTID(device->deviceId), DEVICEID(device->deviceId), - (uint32_t)DlistGetCount(&device->devNodes)); - devNode->token->devid = devNode->devId; + if (devNode->devId == 0 && AcquireNodeDeivceId(device, &devNode->devId) != HDF_SUCCESS) { + HDF_LOGE("failed to attach device, invalid device id"); + return HDF_ERR_INVALID_PARAM; } - + devNode->token->devid = devNode->devId; ret = nodeIf->LaunchNode(devNode); if (ret == HDF_SUCCESS) { DListInsertTail(&devNode->entry, &device->devNodes); + UpdateDeivceNodeIdIndex(device, devNode->devId); } return ret; @@ -51,7 +70,7 @@ int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode) } device = CONTAINER_OF(devInst, struct HdfDevice, super); - if (device->deviceId != DEVICEID(devNode->devId)) { + if (DEVICEID(device->deviceId) != DEVICEID(devNode->devId)) { HDF_LOGE("%s: device %x detach unknown devnode %x", __func__, device->deviceId, devNode->devId); return HDF_DEV_ERR_NO_DEVICE; } diff --git a/core/host/src/hdf_device_node.c b/core/host/src/hdf_device_node.c index 80fdd1066..5bb1309df 100644 --- a/core/host/src/hdf_device_node.c +++ b/core/host/src/hdf_device_node.c @@ -155,7 +155,8 @@ int HdfDeviceNodePublishPublicService(struct HdfDeviceNode *devNode) return HDF_FAILURE; } - ret = DevSvcManagerClntAddService(devNode->servName, &devNode->deviceObject); + ret = DevSvcManagerClntAddService(devNode->servName, + devNode->deviceObject.deviceClass, &devNode->deviceObject, devNode->servInfo); if (ret == HDF_SUCCESS) { devNode->servStatus = true; } @@ -233,8 +234,10 @@ void HdfDeviceNodeDestruct(struct HdfDeviceNode *devNode) PowerStateTokenFreeInstance(devNode->powerToken); devNode->powerToken = NULL; OsalMemFree(devNode->servName); + OsalMemFree((char *)devNode->servInfo); OsalMemFree(devNode->driverName); devNode->servName = NULL; + devNode->servInfo = NULL; break; case DEVNODE_NONE: break; @@ -261,6 +264,7 @@ struct HdfDeviceNode *HdfDeviceNodeNewInstance(const struct HdfDeviceInfo *devic devNode->token->devid = deviceInfo->deviceId; devNode->servName = HdfStringCopy(deviceInfo->svcName); if (devNode->servName == NULL) { + HdfDeviceNodeFreeInstance(devNode); return NULL; } devNode->deviceObject.property = HcsGetNodeByMatchAttr(HdfGetHcsRootNode(), deviceInfo->deviceMatchAttr); diff --git a/core/host/src/hdf_device_object.c b/core/host/src/hdf_device_object.c index e8e03e94a..a1f2d4853 100644 --- a/core/host/src/hdf_device_object.c +++ b/core/host/src/hdf_device_object.c @@ -8,6 +8,7 @@ #include "hdf_device_object.h" #include "devhost_service.h" +#include "devsvc_manager_clnt.h" #include "hdf_base.h" #include "hdf_cstring.h" #include "hdf_device_node.h" @@ -17,10 +18,13 @@ #include "hdf_observer_record.h" #include "hdf_power_manager.h" #include "hdf_service_observer.h" +#include "osal_mem.h" #include "power_state_token.h" #define HDF_LOG_TAG device_object +#define SERVICE_INFO_LEN_MAX 128 + int32_t HdfDeviceSubscribeService( struct HdfDeviceObject *deviceObject, const char *serviceName, struct SubscriberCallback callback) { @@ -291,4 +295,31 @@ int HdfDeviceObjectRemoveService(struct HdfDeviceObject *dev) } return devNode->super.RemoveService(devNode); -} \ No newline at end of file +} +int HdfDeviceObjectSetServInfo(struct HdfDeviceObject *dev, const char *info) +{ + if (dev == NULL || info == NULL || strlen(info) > SERVICE_INFO_LEN_MAX) { + return HDF_ERR_INVALID_PARAM; + } + + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (devNode->servInfo != NULL) { + OsalMemFree((char *)devNode->servInfo); + } + devNode->servInfo = HdfStringCopy(info); + if (devNode->servInfo == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + return HDF_SUCCESS; +} + +int HdfDeviceObjectUpdate(struct HdfDeviceObject *dev) +{ + struct HdfDeviceNode *devNode = CONTAINER_OF(dev, struct HdfDeviceNode, deviceObject); + if (dev == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + return DevSvcManagerClntUpdateService( + devNode->servName, devNode->deviceObject.deviceClass, &devNode->deviceObject, devNode->servInfo); +} diff --git a/core/manager/include/devsvc_listener_holder.h b/core/manager/include/devsvc_listener_holder.h new file mode 100644 index 000000000..b39f20895 --- /dev/null +++ b/core/manager/include/devsvc_listener_holder.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DEVICE_SERVICE_LISTENER_HOLDER_H +#define DEVICE_SERVICE_LISTENER_HOLDER_H + +#include "hdf_service_status.h" +#include "hdf_dlist.h" + +struct ServStatListenerHolder { + uint16_t listenClass; + struct DListHead node; + uint64_t index; + void (*NotifyStatus)(struct ServStatListenerHolder *holder, struct ServiceStatus *status); +}; + +void ServStatListenerHolderinit(void); + +struct ServStatListenerHolder *ServStatListenerHolderCreate(uintptr_t listener, uint16_t listenClass); +void ServStatListenerHolderRelease(struct ServStatListenerHolder *holder); +struct ServStatListenerHolder *ServStatListenerHolderGet(uint64_t index); + +#endif /* DEVICE_SERVICE_LISTENER_HOLDER_H */ diff --git a/core/manager/include/devsvc_manager.h b/core/manager/include/devsvc_manager.h index 2ee3daa5b..a1bf6d0cd 100644 --- a/core/manager/include/devsvc_manager.h +++ b/core/manager/include/devsvc_manager.h @@ -11,21 +11,26 @@ #include "devsvc_manager_if.h" #include "hdf_service_observer.h" -#include "hdf_slist.h" +#include "hdf_dlist.h" #include "osal_mutex.h" struct DevSvcManager { struct IDevSvcManager super; - struct HdfSList services; + struct DListHead services; struct HdfServiceObserver observer; + struct DListHead svcstatListeners; struct OsalMutex mutex; }; struct HdfObject *DevSvcManagerCreate(void); bool DevSvcManagerConstruct(struct DevSvcManager *inst); -void DevSvcManagerRelease(struct HdfObject *object); +void DevSvcManagerRelease(struct IDevSvcManager *inst); struct IDevSvcManager *DevSvcManagerGetInstance(void); -int DevSvcManagerAddService(struct IDevSvcManager *manager, const char *svcName, struct HdfDeviceObject *service); + +int DevSvcManagerStartService(void); + +int DevSvcManagerAddService(struct IDevSvcManager *manager, const char *svcName, + uint16_t devClass, struct HdfDeviceObject *service, const char *servInfo); struct HdfObject *DevSvcManagerGetService(struct IDevSvcManager *manager, const char *svcName); void DevSvcManagerRemoveService(struct IDevSvcManager *manager, const char *svcName); void DevSvcManagerListService(struct HdfSBuf *serviecNameSet, DeviceClass deviceClass); diff --git a/core/manager/include/devsvc_manager_ext.h b/core/manager/include/devsvc_manager_ext.h new file mode 100644 index 000000000..262b9e504 --- /dev/null +++ b/core/manager/include/devsvc_manager_ext.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DEVICE_SERVICE_MANAGER_EXT_H +#define DEVICE_SERVICE_MANAGER_EXT_H + +struct HdfObject *DevSvcManagerExtCreate(void); +void DevSvcManagerExtRelease(struct HdfObject *object); + +#endif // DEVICE_SERVICE_MANAGER_EXT_H \ No newline at end of file diff --git a/core/manager/src/devmgr_service.c b/core/manager/src/devmgr_service.c index 674ccc2b2..b8b6897a8 100644 --- a/core/manager/src/devmgr_service.c +++ b/core/manager/src/devmgr_service.c @@ -9,6 +9,7 @@ #include "devmgr_service.h" #include "devhost_service_clnt.h" #include "device_token_clnt.h" +#include "devsvc_manager.h" #include "hdf_attribute_manager.h" #include "hdf_base.h" #include "hdf_driver_installer.h" @@ -292,11 +293,16 @@ static int DevmgrServiceStartDeviceHosts(struct DevmgrService *inst) int DevmgrServiceStartService(struct IDevmgrService *inst) { + int ret; struct DevmgrService *dmService = (struct DevmgrService *)inst; if (dmService == NULL) { HDF_LOGE("failed to start device manager service, dmService is null"); return HDF_FAILURE; } + + ret = DevSvcManagerStartService(); + HDF_LOGI("start svcmgr result %d", ret); + return DevmgrServiceStartDeviceHosts(dmService); } diff --git a/core/manager/src/devsvc_manager.c b/core/manager/src/devsvc_manager.c index 3c08149c2..2c3380389 100644 --- a/core/manager/src/devsvc_manager.c +++ b/core/manager/src/devsvc_manager.c @@ -14,12 +14,12 @@ #include "hdf_object_manager.h" #include "hdf_service_record.h" #include "hdf_device_node.h" +#include "osal_mem.h" #define HDF_LOG_TAG devsvc_manager static struct DevSvcRecord *DevSvcManagerSearchService(struct IDevSvcManager *inst, uint32_t serviceKey) { - struct HdfSListIterator it; struct DevSvcRecord *record = NULL; struct DevSvcRecord *searchResult = NULL; struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; @@ -29,10 +29,8 @@ static struct DevSvcRecord *DevSvcManagerSearchService(struct IDevSvcManager *in } OsalMutexLock(&devSvcManager->mutex); - HdfSListIteratorInit(&it, &devSvcManager->services); - while (HdfSListIteratorHasNext(&it)) { - record = (struct DevSvcRecord *)HdfSListIteratorNext(&it); - if ((record != NULL) && (record->key == serviceKey)) { + DLIST_FOR_EACH_ENTRY(record, &devSvcManager->services, struct DevSvcRecord, entry) { + if (record->key == serviceKey) { searchResult = record; break; } @@ -40,12 +38,30 @@ static struct DevSvcRecord *DevSvcManagerSearchService(struct IDevSvcManager *in OsalMutexUnlock(&devSvcManager->mutex); return searchResult; } +static void NotifyServiceStatusLocked(struct DevSvcManager *devSvcManager, + struct DevSvcRecord *record, uint32_t status) +{ + struct ServStatListenerHolder *listenerHolder = NULL; + struct ServiceStatus svcstat = { + .deviceClass = record->devClass, + .serviceName = record->servName, + .status = status, + .info = record->servInfo, + }; + + DLIST_FOR_EACH_ENTRY(listenerHolder, &devSvcManager->svcstatListeners, struct ServStatListenerHolder, node) { + if ((listenerHolder->listenClass & record->devClass) && listenerHolder->NotifyStatus != NULL) { + listenerHolder->NotifyStatus(listenerHolder, &svcstat); + } + } +} -int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *svcName, struct HdfDeviceObject *service) +int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *servName, + uint16_t devClass, struct HdfDeviceObject *service, const char *servInfo) { struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; struct DevSvcRecord *record = NULL; - if ((devSvcManager == NULL) || (service == NULL) || (svcName == NULL)) { + if (devSvcManager == NULL || service == NULL || servName == NULL) { HDF_LOGE("failed to add service, input param is null"); return HDF_FAILURE; } @@ -56,14 +72,61 @@ int DevSvcManagerAddService(struct IDevSvcManager *inst, const char *svcName, st return HDF_FAILURE; } - record->key = HdfStringMakeHashKey(svcName, 0); + record->key = HdfStringMakeHashKey(servName, 0); record->value = service; + record->devClass = devClass; + record->servName = HdfStringCopy(servName); + record->servInfo = HdfStringCopy(servInfo); + if (record->servName == NULL) { + DevSvcRecordFreeInstance(record); + return HDF_ERR_MALLOC_FAIL; + } OsalMutexLock(&devSvcManager->mutex); - HdfSListAdd(&devSvcManager->services, &record->entry); + DListInsertTail(&record->entry, &devSvcManager->services); + NotifyServiceStatusLocked(devSvcManager, record, SERVIE_STATUS_START); OsalMutexUnlock(&devSvcManager->mutex); return HDF_SUCCESS; } +int DevSvcManagerUpdateService(struct IDevSvcManager *inst, const char *servName, + uint16_t devClass, struct HdfDeviceObject *service, const char *servInfo) +{ + struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; + struct DevSvcRecord *record = NULL; + char *servNameStr = NULL; + char *servInfoStr = NULL; + if (devSvcManager == NULL || service == NULL || servName == NULL) { + HDF_LOGE("failed to add service, input param is null"); + return HDF_FAILURE; + } + + record = DevSvcManagerSearchService(inst, HdfStringMakeHashKey(servName, 0)); + if (record == NULL) { + return HDF_DEV_ERR_NO_DEVICE; + } + + servNameStr = HdfStringCopy(servName); + if (servNameStr == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + servInfoStr = HdfStringCopy(servInfo); + if (servInfoStr == NULL) { + OsalMemFree(servNameStr); + return HDF_ERR_MALLOC_FAIL; + } + OsalMemFree((char *)record->servName); + OsalMemFree((char *)record->servInfo); + + record->value = service; + record->devClass = devClass; + record->servName = servNameStr; + record->servInfo = servInfoStr; + + NotifyServiceStatusLocked(devSvcManager, record, SERVIE_STATUS_CHANGE); + return HDF_SUCCESS; +} + int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcName, struct SubscriberCallback callBack) { struct DevmgrService *devMgrSvc = (struct DevmgrService *)DevmgrServiceGetInstance(); @@ -86,17 +149,21 @@ int DevSvcManagerSubscribeService(struct IDevSvcManager *inst, const char *svcNa void DevSvcManagerRemoveService(struct IDevSvcManager *inst, const char *svcName) { struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; - uint32_t serviceKey = HdfStringMakeHashKey(svcName, 0); struct DevSvcRecord *serviceRecord = NULL; + uint32_t serviceKey = HdfStringMakeHashKey(svcName, 0); + if (svcName == NULL || devSvcManager == NULL) { return; } serviceRecord = DevSvcManagerSearchService(inst, serviceKey); - if (serviceRecord != NULL) { - OsalMutexLock(&devSvcManager->mutex); - HdfSListRemove(&devSvcManager->services, &serviceRecord->entry); - OsalMutexUnlock(&devSvcManager->mutex); + if (serviceRecord == NULL) { + return; } + OsalMutexLock(&devSvcManager->mutex); + NotifyServiceStatusLocked(devSvcManager, serviceRecord, SERVIE_STATUS_STOP); + DListRemove(&serviceRecord->entry); + OsalMutexUnlock(&devSvcManager->mutex); + DevSvcRecordFreeInstance(serviceRecord); } @@ -118,9 +185,7 @@ struct HdfDeviceObject *DevSvcManagerGetObject(struct IDevSvcManager *inst, cons // only use for kernel space void DevSvcManagerListService(struct HdfSBuf *serviecNameSet, DeviceClass deviceClass) { - struct HdfSListIterator it; struct DevSvcRecord *record = NULL; - struct HdfDeviceNode *devNode = NULL; struct DevSvcManager *devSvcManager = (struct DevSvcManager *)DevSvcManagerGetInstance(); if (devSvcManager == NULL) { HDF_LOGE("failed to list service, devSvcManager is null"); @@ -128,15 +193,9 @@ void DevSvcManagerListService(struct HdfSBuf *serviecNameSet, DeviceClass device } OsalMutexLock(&devSvcManager->mutex); - HdfSListIteratorInit(&it, &devSvcManager->services); - while (HdfSListIteratorHasNext(&it)) { - record = (struct DevSvcRecord *)HdfSListIteratorNext(&it); - if (record == NULL) { - continue; - } - devNode = CONTAINER_OF(record->value, struct HdfDeviceNode, deviceObject); - if (devNode->deviceObject.deviceClass == deviceClass) { - HdfSbufWriteString(serviecNameSet, devNode->servName); + DLIST_FOR_EACH_ENTRY(record, &devSvcManager->services, struct DevSvcRecord, entry) { + if (record->devClass == deviceClass) { + HdfSbufWriteString(serviecNameSet, record->servName); } } OsalMutexUnlock(&devSvcManager->mutex); @@ -151,6 +210,34 @@ struct HdfObject *DevSvcManagerGetService(struct IDevSvcManager *inst, const cha return (struct HdfObject *)deviceObject->service; } +int DevSvcManagerRegsterServListener(struct IDevSvcManager *inst, + struct ServStatListenerHolder *listenerHolder) +{ + struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; + if (devSvcManager == NULL || listenerHolder == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + OsalMutexLock(&devSvcManager->mutex); + DListInsertTail(&listenerHolder->node, &devSvcManager->svcstatListeners); + OsalMutexUnlock(&devSvcManager->mutex); + + return HDF_SUCCESS; +} + +void DevSvcManagerUnregsterServListener(struct IDevSvcManager *inst, + struct ServStatListenerHolder *listenerHolder) +{ + struct DevSvcManager *devSvcManager = (struct DevSvcManager *)inst; + if (devSvcManager == NULL || listenerHolder == NULL) { + return; + } + + OsalMutexLock(&devSvcManager->mutex); + DListRemove(&listenerHolder->node); + OsalMutexUnlock(&devSvcManager->mutex); +} + bool DevSvcManagerConstruct(struct DevSvcManager *inst) { struct IDevSvcManager *devSvcMgrIf = NULL; @@ -160,19 +247,43 @@ bool DevSvcManagerConstruct(struct DevSvcManager *inst) } devSvcMgrIf = &inst->super; devSvcMgrIf->AddService = DevSvcManagerAddService; + devSvcMgrIf->UpdateService = DevSvcManagerUpdateService; devSvcMgrIf->SubscribeService = DevSvcManagerSubscribeService; devSvcMgrIf->UnsubscribeService = NULL; devSvcMgrIf->RemoveService = DevSvcManagerRemoveService; devSvcMgrIf->GetService = DevSvcManagerGetService; devSvcMgrIf->GetObject = DevSvcManagerGetObject; - HdfSListInit(&inst->services); + devSvcMgrIf->RegsterServListener = DevSvcManagerRegsterServListener; + devSvcMgrIf->UnregsterServListener = DevSvcManagerUnregsterServListener; if (OsalMutexInit(&inst->mutex) != HDF_SUCCESS) { HDF_LOGE("failed to create device service manager mutex"); return false; } + DListHeadInit(&inst->services); + DListHeadInit(&inst->svcstatListeners); return true; } +int DevSvcManagerStartService(void) +{ + int ret; + struct IDevSvcManager *svcmgr = DevSvcManagerGetInstance(); + + if (svcmgr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + if (svcmgr->StartService == NULL) { + return HDF_SUCCESS; + } + + ret = svcmgr->StartService(svcmgr); + if (ret != HDF_SUCCESS) { + HDF_LOGE("failed to start service manager"); + } + + return ret; +} + struct HdfObject *DevSvcManagerCreate() { static bool isDevSvcManagerInit = false; @@ -186,13 +297,17 @@ struct HdfObject *DevSvcManagerCreate() return (struct HdfObject *)&devSvcManagerInstance; } -void DevSvcManagerRelease(struct HdfObject *object) +void DevSvcManagerRelease(struct IDevSvcManager *inst) { - struct DevSvcManager *devSvcManager = (struct DevSvcManager *)object; - if (object == NULL) { + struct DevSvcManager *devSvcManager = CONTAINER_OF(inst, struct DevSvcManager, super); + if (inst == NULL) { return; } - HdfSListFlush(&devSvcManager->services, DevSvcRecordDelete); + struct DevSvcRecord *record = NULL; + struct DevSvcRecord *tmp = NULL; + DLIST_FOR_EACH_ENTRY_SAFE(record, tmp, &devSvcManager->services, struct DevSvcRecord, entry) { + DevSvcRecordFreeInstance(record); + } OsalMutexDestroy(&devSvcManager->mutex); } diff --git a/core/manager/src/devsvc_manager_ext.c b/core/manager/src/devsvc_manager_ext.c new file mode 100644 index 000000000..d38b2eea6 --- /dev/null +++ b/core/manager/src/devsvc_manager_ext.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "devsvc_listener_holder.h" +#include "devsvc_manager.h" +#include "hdf_base.h" +#include "hdf_device_node.h" +#include "hdf_io_service.h" +#include "hdf_log.h" +#include "hdf_object_manager.h" +#include "osal_mem.h" +#include "svcmgr_ioservice.h" +#include "osal_mutex.h" + +#define HDF_LOG_TAG devsvc_mger +#define SVC_MGR_NODE_PERM 0660 + +struct DevSvcManagerExt { + struct DevSvcManager super; + struct IDeviceIoService ioService; + struct HdfIoService *serv; + struct OsalMutex mutex; + bool started; +}; + +int32_t DeviceSvcMgrOpen(struct HdfDeviceIoClient *client) +{ + (void)client; + return HDF_SUCCESS; +} + +static int32_t DevSvcManagerExtRegisterListener(struct HdfDeviceIoClient *client, struct HdfSBuf *data) +{ + struct ServStatListenerHolder *holder = NULL; + uint16_t devClass = DEVICE_CLASS_MAX; + struct DevSvcManagerExt *svcmgrInst = NULL; + if (client->device == NULL || client->device->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + svcmgrInst = (struct DevSvcManagerExt *)DevSvcManagerGetInstance(); + + if (!HdfSbufReadUint16(data, &devClass)) { + return HDF_ERR_INVALID_PARAM; + } + + holder = ServStatListenerHolderGet((uintptr_t)client); + if (holder != NULL) { + HDF_LOGE("%s:register listener exist, update and return", __func__); + holder->listenClass = devClass; + return HDF_SUCCESS; + } + + holder = ServStatListenerHolderCreate((uintptr_t)client, devClass); + if (holder == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + return svcmgrInst->super.super.RegsterServListener(&svcmgrInst->super.super, holder); +} + +static int32_t DevSvcManagerExtUnRegisterListener(struct HdfDeviceIoClient *client) +{ + struct ServStatListenerHolder *holder = NULL; + struct DevSvcManagerExt *svcmgrInst = NULL; + + if (client->device == NULL || client->device->priv == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + svcmgrInst = (struct DevSvcManagerExt *)client->device->priv; + OsalMutexLock(&svcmgrInst->mutex); + holder = ServStatListenerHolderGet((uintptr_t)client); + if (holder == NULL) { + OsalMutexUnlock(&svcmgrInst->mutex); + return HDF_DEV_ERR_NO_DEVICE_SERVICE; + } + if (holder->node.next != NULL) { + svcmgrInst->super.super.UnregsterServListener(&svcmgrInst->super.super, holder); + } + ServStatListenerHolderRelease(holder); + OsalMutexUnlock(&svcmgrInst->mutex); + + return HDF_SUCCESS; +} + +int32_t DeviceSvcMgrDispatch(struct HdfObject *service, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) +{ + uint64_t ioClientPtr = 0; + struct HdfDeviceIoClient *client = NULL; + if (service == NULL || data == NULL || reply == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (!HdfSbufReadUint64(reply, &ioClientPtr) || ioClientPtr == 0) { + HDF_LOGE("device svc dispatch: ioClient is null"); + return HDF_FAILURE; + } + HdfSbufFlush(reply); + client = (struct HdfDeviceIoClient *)(uintptr_t)ioClientPtr; + switch (cmdId) { + case SVCMGR_REGISTER_LISTENER: + return DevSvcManagerExtRegisterListener(client, data); + case SVCMGR_UNREGISTER_LISTENER: + return DevSvcManagerExtUnRegisterListener(client); + default: + break; + } + + return HDF_ERR_NOT_SUPPORT; +} + +void DeviceSvcMgrRelease(struct HdfDeviceIoClient *client) +{ + if (client == NULL) { + return; + } + DevSvcManagerExtUnRegisterListener(client); +} + +int DevSvcManagerExtStart(struct IDevSvcManager *svcmgr) +{ + struct DevSvcManagerExt *inst = (struct DevSvcManagerExt *)svcmgr; + static struct HdfDeviceObject svcmgrDevObj = { 0 }; + static struct IDeviceIoService svcmgrIoService = { + .Open = DeviceSvcMgrOpen, + .Dispatch = NULL, + .Release = DeviceSvcMgrRelease, + }; + if (inst == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + if (inst->started) { + return HDF_SUCCESS; + } + + svcmgrDevObj.service = &svcmgrIoService; + svcmgrDevObj.property = NULL; + svcmgrDevObj.deviceClass = DEVICE_CLASS_DEFAULT; + svcmgrDevObj.priv = (void *)svcmgr; + + inst->serv = HdfIoServicePublish(DEV_SVCMGR_NODE, SVC_MGR_NODE_PERM); + if (inst->serv == NULL) { + HDF_LOGE("failed to pushlish svcmgr ioservice"); + } else { + static struct HdfIoDispatcher dispatcher = { + .Dispatch = DeviceSvcMgrDispatch, + }; + inst->serv->dispatcher = &dispatcher; + inst->serv->target = (struct HdfObject *)&svcmgrDevObj; + } + + ServStatListenerHolderinit(); + inst->started = true; + return HDF_SUCCESS; +} + +static bool DevSvcManagerExtConstruct(struct DevSvcManagerExt *inst) +{ + if (inst == NULL) { + return false; + } + if (!DevSvcManagerConstruct(&inst->super)) { + HDF_LOGE("failed to construct device service manager"); + return false; + } + if (OsalMutexInit(&inst->mutex) != HDF_SUCCESS) { + HDF_LOGE("failed to create devsvcmgrext mutex"); + return false; + } + inst->super.super.StartService = DevSvcManagerExtStart; + + return true; +} + +struct HdfObject *DevSvcManagerExtCreate(void) +{ + static struct DevSvcManagerExt *instance; + if (instance != NULL) { + return (struct HdfObject *)instance; + } + + instance = OsalMemCalloc(sizeof(struct DevSvcManagerExt)); + if (!DevSvcManagerExtConstruct(instance)) { + OsalMemFree(instance); + instance = NULL; + } + + return (struct HdfObject *)instance; +} + +void DevSvcManagerExtRelease(struct IDevSvcManager *inst) +{ + struct DevSvcManagerExt *instance = (struct DevSvcManagerExt *)inst; + if (instance == NULL) { + return; + } + if (instance->serv != NULL) { + HdfIoServiceRemove(instance->serv); + instance->serv = NULL; + } + DevSvcManagerRelease(inst); + instance->started = false; +} diff --git a/core/manager/src/servstat_listener_holder.c b/core/manager/src/servstat_listener_holder.c new file mode 100644 index 000000000..25f305c39 --- /dev/null +++ b/core/manager/src/servstat_listener_holder.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#include "devsvc_listener_holder.h" +#include "hdf_base.h" +#include "hdf_device_desc.h" +#include "hdf_log.h" +#include "osal_mutex.h" +#include "osal_mem.h" + +struct KServStatListenerHolder { + struct DListHead node; + struct ServStatListenerHolder holder; + struct HdfDeviceIoClient *listenerClient; +}; + +struct SvcStatListenerHolderList { + struct OsalMutex mutex; + struct DListHead list; +}; + +static struct SvcStatListenerHolderList g_holoderList; + +static void KServStatListenerHolderListInit() +{ + OsalMutexInit(&g_holoderList.mutex); + DListHeadInit(&g_holoderList.list); +} + +void ServStatListenerHolderinit(void) +{ + KServStatListenerHolderListInit(); +} + +void KServStatListenerHolderNotifyStatus(struct ServStatListenerHolder *holder, + struct ServiceStatus *status) +{ + if (holder == NULL || status == NULL) { + return; + } + struct KServStatListenerHolder *holderInst = CONTAINER_OF(holder, struct KServStatListenerHolder, holder); + if (holderInst->listenerClient == NULL) { + HDF_LOGE("failed to notify service status, invalid holder"); + return; + } + + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + HDF_LOGE("failed to notify service status, oom"); + return; + } + + if (ServiceStatusMarshalling(status, data) != HDF_SUCCESS) { + HDF_LOGE("failed to marshalling service status"); + HdfSBufRecycle(data); + return; + } + + if (HdfDeviceSendEventToClient(holderInst->listenerClient, 0, data) != HDF_SUCCESS) { + HDF_LOGE("failed to notify service status, send error"); + } + + HdfSBufRecycle(data); +} + +struct ServStatListenerHolder *ServStatListenerHolderCreate(uintptr_t listener, uint16_t listenClass) +{ + struct HdfDeviceIoClient *client = (struct HdfDeviceIoClient *)listener; + struct KServStatListenerHolder *holder = NULL; + + if (listener == 0) { + return NULL; + } + + holder = OsalMemCalloc(sizeof(struct KServStatListenerHolder)); + if (holder == NULL) { + return NULL; + } + holder->listenerClient = client; + holder->holder.index = listener; + holder->holder.listenClass = listenClass; + holder->holder.NotifyStatus = KServStatListenerHolderNotifyStatus; + + OsalMutexLock(&g_holoderList.mutex); + DListInsertTail(&holder->node, &g_holoderList.list); + OsalMutexUnlock(&g_holoderList.mutex); + return &holder->holder; +} + +struct ServStatListenerHolder *ServStatListenerHolderGet(uint64_t index) +{ + struct KServStatListenerHolder *it = NULL; + struct KServStatListenerHolder *holder = NULL; + + OsalMutexLock(&g_holoderList.mutex); + DLIST_FOR_EACH_ENTRY(it, &g_holoderList.list, struct KServStatListenerHolder, node) { + if (it->holder.index == index) { + holder = it; + break; + } + } + OsalMutexUnlock(&g_holoderList.mutex); + return holder != NULL ? &holder->holder : NULL; +} + +void ServStatListenerHolderRelease(struct ServStatListenerHolder *holder) +{ + struct KServStatListenerHolder *holderInst = NULL; + if (holder == NULL) { + return; + } + + holderInst = CONTAINER_OF(holder, struct KServStatListenerHolder, holder); + OsalMutexLock(&g_holoderList.mutex); + if (holderInst->node.next != NULL) { + DListRemove(&holderInst->node); + } + OsalMutexUnlock(&g_holoderList.mutex); + + holderInst->listenerClient = NULL; + OsalMemFree(holderInst); +} + diff --git a/core/manager/test/unittest/common/hdf_ioservice_test.cpp b/core/manager/test/unittest/common/hdf_ioservice_test.cpp index 8e12f229a..e0dfa25c4 100644 --- a/core/manager/test/unittest/common/hdf_ioservice_test.cpp +++ b/core/manager/test/unittest/common/hdf_ioservice_test.cpp @@ -17,8 +17,11 @@ #include #include #include +#include #include +#include #include +#include #include using namespace testing::ext; @@ -34,14 +37,15 @@ public: static void TearDownTestCase(); void SetUp(); void TearDown(); - static int OnDevEventReceived(struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, - struct HdfSBuf *data); + static int OnDevEventReceived( + struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data); static struct Eventlistener listener0; static struct Eventlistener listener1; const char *testSvcName = SAMPLE_SERVICE; const int eventWaitTimeUs = (150 * 1000); static int eventCount; + const int servstatWaitTime = 15; // ms }; int IoServiceTest::eventCount = 0; @@ -73,8 +77,8 @@ void IoServiceTest::TearDown() { } -int IoServiceTest::OnDevEventReceived(struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, - struct HdfSBuf *data) +int IoServiceTest::OnDevEventReceived( + struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data) { OsalTimespec time; OsalGetTime(&time); @@ -680,4 +684,225 @@ HWTEST_F(IoServiceTest, HdfIoService014, TestSize.Level0) HdfIoServiceRecycle(serv); HdfIoServiceRecycle(serv1); -} \ No newline at end of file +} + +struct IoServiceStatusData { + IoServiceStatusData() + : devClass(0) + , servStatus(0) + , callbacked(false) + { + } + ~IoServiceStatusData() = default; + std::string servName; + std::string servInfo; + uint16_t devClass; + uint16_t servStatus; + bool callbacked; +}; + +static void TestOnServiceStatusReceived(struct ServiceStatusListener *listener, struct ServiceStatus *servstat) +{ + struct IoServiceStatusData *issd = (struct IoServiceStatusData *)listener->priv; + if (issd == NULL) { + return; + } + issd->servName = servstat->serviceName; + issd->servInfo = servstat->info != NULL ? servstat->info : ""; + issd->devClass = servstat->deviceClass; + issd->servStatus = servstat->status; + issd->callbacked = true; + + HDF_LOGI("service status listener callback: %{public}s, %{public}s, %{public}d", servstat->serviceName, + issd->servName.data(), issd->servStatus); +} + +/* * + * @tc.name: HdfIoService015 + * @tc.desc: ioservice status listener test + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(IoServiceTest, HdfIoService015, TestSize.Level0) +{ + struct ISvcMgrIoservice *servmgr = SvcMgrIoserviceGet(); + ASSERT_NE(servmgr, nullptr); + + struct HdfIoService *serv = HdfIoServiceBind(testSvcName); + ASSERT_NE(serv, nullptr); + serv->priv = (void *)"serv"; + + struct IoServiceStatusData issd; + struct ServiceStatusListener *listener = IoServiceStatusListenerNewInstance(); + listener->callback = TestOnServiceStatusReceived; + listener->priv = (void *)&issd; + + int status = servmgr->RegisterServiceStatusListener(servmgr, listener, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(status, HDF_SUCCESS); + + struct HdfIoService *testService = HdfIoServiceBind(SAMPLE_SERVICE); + ASSERT_TRUE(testService != NULL); + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + ASSERT_TRUE(data != NULL); + const char *newServName = "sample_service1"; + ASSERT_TRUE(HdfSbufWriteString(data, "sample_driver")); + ASSERT_TRUE(HdfSbufWriteString(data, newServName)); + + int ret = testService->dispatcher->Dispatch(&testService->object, SAMPLE_DRIVER_REGISTER_DEVICE, data, NULL); + ASSERT_EQ(ret, HDF_SUCCESS); + + int count = servstatWaitTime; + while (!issd.callbacked && count > 0) { + OsalMSleep(1); + count--; + } + ASSERT_TRUE(issd.callbacked); + ASSERT_EQ(issd.servName, newServName); + ASSERT_EQ(issd.devClass, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(issd.servInfo, std::string(SAMPLE_SERVICE)); + ASSERT_EQ(issd.servStatus, SERVIE_STATUS_START); + + issd.callbacked = false; + ret = testService->dispatcher->Dispatch(&testService->object, SAMPLE_DRIVER_UNREGISTER_DEVICE, data, NULL); + ASSERT_TRUE(ret == HDF_SUCCESS); + + count = servstatWaitTime; + while (!issd.callbacked && count > 0) { + OsalMSleep(1); + count--; + } + ASSERT_TRUE(issd.callbacked); + ASSERT_EQ(issd.servName, newServName); + ASSERT_EQ(issd.devClass, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(issd.servInfo, std::string(SAMPLE_SERVICE)); + ASSERT_EQ(issd.servStatus, SERVIE_STATUS_STOP); + + status = servmgr->UnregisterServiceStatusListener(servmgr, listener); + ASSERT_EQ(status, HDF_SUCCESS); + + IoServiceStatusListenerFree(listener); + HdfIoServiceRecycle(testService); + SvcMgrIoserviceRelease(servmgr); + HdfSBufRecycle(data); +} + +/* * + * @tc.name: HdfIoService016 + * @tc.desc: ioservice status listener update info test + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(IoServiceTest, HdfIoService016, TestSize.Level0) +{ + struct ISvcMgrIoservice *servmgr = SvcMgrIoserviceGet(); + ASSERT_NE(servmgr, nullptr); + + struct HdfIoService *serv = HdfIoServiceBind(testSvcName); + ASSERT_NE(serv, nullptr); + serv->priv = (void *)"serv"; + + struct IoServiceStatusData issd; + struct ServiceStatusListener *listener = IoServiceStatusListenerNewInstance(); + listener->callback = TestOnServiceStatusReceived; + listener->priv = (void *)&issd; + + HDF_LOGI("YDEBUG:%{public}s:%{public}d", __func__, __LINE__); + int status = servmgr->RegisterServiceStatusListener(servmgr, listener, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(status, HDF_SUCCESS); + + HDF_LOGI("YDEBUG:%{public}s:%{public}d", __func__, __LINE__); + struct HdfIoService *testService = HdfIoServiceBind(SAMPLE_SERVICE); + ASSERT_TRUE(testService != NULL); + HdfSBuf *data = HdfSBufObtainDefaultSize(); + ASSERT_TRUE(data != NULL); + + HDF_LOGI("YDEBUG:%{public}s:%{public}d", __func__, __LINE__); + std::string servinfo = "foo"; + ASSERT_TRUE(HdfSbufWriteString(data, servinfo.data())); + int ret = testService->dispatcher->Dispatch(&testService->object, SAMPLE_DRIVER_UPDATE_SERVICE_INFO, data, NULL); + ASSERT_EQ(ret, HDF_SUCCESS); + + HDF_LOGI("YDEBUG:%{public}s:%{public}d", __func__, __LINE__); + int count = servstatWaitTime; + while (!issd.callbacked && count > 0) { + OsalMSleep(1); + count--; + } + HDF_LOGI("YDEBUG:%{public}s:%{public}d", __func__, __LINE__); + ASSERT_TRUE(issd.callbacked); + ASSERT_EQ(issd.servName, SAMPLE_SERVICE); + ASSERT_EQ(issd.devClass, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(issd.servInfo, servinfo); + ASSERT_EQ(issd.servStatus, SERVIE_STATUS_CHANGE); + + status = servmgr->UnregisterServiceStatusListener(servmgr, listener); + ASSERT_EQ(status, HDF_SUCCESS); + + IoServiceStatusListenerFree(listener); + HdfIoServiceRecycle(testService); + SvcMgrIoserviceRelease(servmgr); + HdfSBufRecycle(data); +} + +/* * + * @tc.name: HdfIoService017 + * @tc.desc: ioservice status listener unregister test + * @tc.type: FUNC + * @tc.require: + */ +HWTEST_F(IoServiceTest, HdfIoService017, TestSize.Level0) +{ + struct ISvcMgrIoservice *servmgr = SvcMgrIoserviceGet(); + ASSERT_NE(servmgr, nullptr); + + struct HdfIoService *serv = HdfIoServiceBind(testSvcName); + ASSERT_NE(serv, nullptr); + serv->priv = (void *)"serv"; + + struct IoServiceStatusData issd; + struct ServiceStatusListener *listener = IoServiceStatusListenerNewInstance(); + listener->callback = TestOnServiceStatusReceived; + listener->priv = (void *)&issd; + + HDF_LOGI("%{public}s:%{public}d", __func__, __LINE__); + int status = servmgr->RegisterServiceStatusListener(servmgr, listener, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(status, HDF_SUCCESS); + + struct HdfIoService *testService = HdfIoServiceBind(SAMPLE_SERVICE); + ASSERT_TRUE(testService != NULL); + HdfSBuf *data = HdfSBufObtainDefaultSize(); + ASSERT_TRUE(data != NULL); + const char *newServName = "sample_service1"; + ASSERT_TRUE(HdfSbufWriteString(data, "sample_driver")); + ASSERT_TRUE(HdfSbufWriteString(data, newServName)); + int ret = testService->dispatcher->Dispatch(&testService->object, SAMPLE_DRIVER_REGISTER_DEVICE, data, NULL); + ASSERT_EQ(ret, HDF_SUCCESS); + + int count = 10; + while (!issd.callbacked && count > 0) { + OsalMSleep(1); + count--; + } + ASSERT_TRUE(issd.callbacked); + ASSERT_EQ(issd.servName, newServName); + ASSERT_EQ(issd.devClass, DEVICE_CLASS_DEFAULT); + ASSERT_EQ(issd.servInfo, std::string(SAMPLE_SERVICE)); + ASSERT_EQ(issd.servStatus, SERVIE_STATUS_START); + + status = servmgr->UnregisterServiceStatusListener(servmgr, listener); + ASSERT_EQ(status, HDF_SUCCESS); + + issd.callbacked = false; + ret = testService->dispatcher->Dispatch(&testService->object, SAMPLE_DRIVER_UNREGISTER_DEVICE, data, NULL); + ASSERT_EQ(status, HDF_SUCCESS); + + OsalMSleep(10); + + ASSERT_FALSE(issd.callbacked); + status = servmgr->UnregisterServiceStatusListener(servmgr, listener); + ASSERT_NE(status, HDF_SUCCESS); + IoServiceStatusListenerFree(listener); + HdfIoServiceRecycle(testService); + SvcMgrIoserviceRelease(servmgr); + HdfSBufRecycle(data); +} diff --git a/core/shared/include/devsvc_manager_if.h b/core/shared/include/devsvc_manager_if.h index 394f4b507..805dd43db 100644 --- a/core/shared/include/devsvc_manager_if.h +++ b/core/shared/include/devsvc_manager_if.h @@ -9,17 +9,22 @@ #ifndef DEVSVC_MANAGER_IF_H #define DEVSVC_MANAGER_IF_H +#include "devsvc_listener_holder.h" #include "hdf_device_desc.h" #include "hdf_object.h" struct IDevSvcManager { struct HdfObject object; - int (*AddService)(struct IDevSvcManager *, const char *, struct HdfDeviceObject *); + int (*StartService)(struct IDevSvcManager *); + int (*AddService)(struct IDevSvcManager *, const char *, uint16_t, struct HdfDeviceObject *, const char *); + int (*UpdateService)(struct IDevSvcManager *, const char *, uint16_t, struct HdfDeviceObject *, const char *); int (*SubscribeService)(struct IDevSvcManager *, const char *, struct SubscriberCallback); int (*UnsubscribeService)(struct IDevSvcManager *, const char *); struct HdfObject *(*GetService)(struct IDevSvcManager *, const char *); struct HdfDeviceObject *(*GetObject)(struct IDevSvcManager *, const char *); void (*RemoveService)(struct IDevSvcManager *, const char *); + int (*RegsterServListener)(struct IDevSvcManager *, struct ServStatListenerHolder *); + void (*UnregsterServListener)(struct IDevSvcManager *, struct ServStatListenerHolder *); }; #endif /* DEVSVC_MANAGER_IF_H */ diff --git a/core/shared/include/hdf_service_record.h b/core/shared/include/hdf_service_record.h index 0e8651dc3..d3e5ec5aa 100644 --- a/core/shared/include/hdf_service_record.h +++ b/core/shared/include/hdf_service_record.h @@ -10,17 +10,19 @@ #define DEVSVC_RECORD_H #include "hdf_object.h" -#include "hdf_slist.h" +#include "hdf_dlist.h" struct DevSvcRecord { - struct HdfSListNode entry; + struct DListHead entry; uint32_t key; struct HdfDeviceObject *value; + const char *servName; + const char *servInfo; + uint16_t devClass; }; struct DevSvcRecord *DevSvcRecordNewInstance(void); void DevSvcRecordFreeInstance(struct DevSvcRecord *inst); -void DevSvcRecordDelete(struct HdfSListNode *listEntry); #endif /* DEVSVC_RECORD_H */ diff --git a/core/shared/include/hdf_service_status.h b/core/shared/include/hdf_service_status.h new file mode 100644 index 000000000..734c45b32 --- /dev/null +++ b/core/shared/include/hdf_service_status.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ +#ifndef HDF_SERVICE_STATUS_H +#define HDF_SERVICE_STATUS_H + +#include "hdf_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct HdfSBuf; +struct ServiceStatusListener; + +enum ServiceStatusType { + SERVIE_STATUS_START, + SERVIE_STATUS_CHANGE, + SERVIE_STATUS_STOP, + SERVIE_STATUS_MAX, +}; + +enum ServiceStatusListenerCmd { + SERVIE_STATUS_LISTENER_NOTIFY, + SERVIE_STATUS_LISTENER_MAX, +}; + +struct ServiceStatus { + const char* serviceName; + uint16_t deviceClass; /* ref to DeviceClass */ + uint16_t status; /* ref to ServiceStatusType */ + const char *info; +}; + +typedef void (*OnServiceStatusReceived)(struct ServiceStatusListener *, struct ServiceStatus *); + +struct ServiceStatusListener { + OnServiceStatusReceived callback; + void *priv; +}; + +int ServiceStatusMarshalling(struct ServiceStatus *status, struct HdfSBuf *buf); +int ServiceStatusUnMarshalling(struct ServiceStatus *status, struct HdfSBuf *buf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* HDF_SERVICE_STATUS_H */ \ No newline at end of file diff --git a/core/shared/include/ioservstat_listener.h b/core/shared/include/ioservstat_listener.h new file mode 100644 index 000000000..b7b9a8caf --- /dev/null +++ b/core/shared/include/ioservstat_listener.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef HDF_IOSERVICE_STATUS_LISTENER_H +#define HDF_IOSERVICE_STATUS_LISTENER_H + +#include "hdf_dlist.h" +#include "hdf_io_service_if.h" +#include "hdf_service_status.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct IoServiceStatusListener { + struct ServiceStatusListener svcstatListener; + struct HdfDevEventlistener ioservListener; + struct DListHead node; + uint16_t deviceClass; +}; + +struct ServiceStatusListener *IoServiceStatusListenerNewInstance(void); +void IoServiceStatusListenerFree(struct ServiceStatusListener *listener); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // HDF_IOSERVICE_STATUS_LISTENER_H diff --git a/core/shared/include/power_state_token_if.h b/core/shared/include/power_state_token_if.h index 0e054c01a..c1af0b70e 100644 --- a/core/shared/include/power_state_token_if.h +++ b/core/shared/include/power_state_token_if.h @@ -9,6 +9,10 @@ #ifndef POWER_STATE_TOKEN_IF_H #define POWER_STATE_TOKEN_IF_H +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + typedef enum { PSM_STATE_IDLE, /* Idle state */ PSM_STATE_ACTIVE, /* Activated state */ @@ -20,4 +24,8 @@ struct IPowerStateToken { void (*ReleaseWakeLock)(struct IPowerStateToken *); }; +#ifdef __cplusplus +} +#endif /* __cplusplus */ + #endif /* POWER_STATE_TOKEN_IF_H */ \ No newline at end of file diff --git a/core/shared/include/svcmgr_ioservice.h b/core/shared/include/svcmgr_ioservice.h new file mode 100644 index 000000000..6886189c5 --- /dev/null +++ b/core/shared/include/svcmgr_ioservice.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#ifndef DEVSVC_SVCMGR_IOSERVICE_H +#define DEVSVC_SVCMGR_IOSERVICE_H + +#include "hdf_base.h" +#include "hdf_service_status.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define DEV_SVCMGR_NODE "devsvc_mgr" + +enum SvcMgrIoCmd { + SVCMGR_REGISTER_LISTENER , + SVCMGR_UNREGISTER_LISTENER, +}; + +struct ISvcMgrIoservice { + int32_t (*RegisterServiceStatusListener)(struct ISvcMgrIoservice *self, + struct ServiceStatusListener *listener, uint16_t deviceClass); + int32_t (*UnregisterServiceStatusListener)(struct ISvcMgrIoservice *self, + struct ServiceStatusListener *listener); +}; + +struct ISvcMgrIoservice *SvcMgrIoserviceGet(void); +void SvcMgrIoserviceRelease(struct ISvcMgrIoservice *svcmgr); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif // DEVSVC_SVCMGR_IOSERVICE_H \ No newline at end of file diff --git a/core/shared/src/hdf_service_record.c b/core/shared/src/hdf_service_record.c index ebc9c3896..138648b27 100644 --- a/core/shared/src/hdf_service_record.c +++ b/core/shared/src/hdf_service_record.c @@ -17,13 +17,9 @@ struct DevSvcRecord *DevSvcRecordNewInstance(void) void DevSvcRecordFreeInstance(struct DevSvcRecord *inst) { if (inst != NULL) { + OsalMemFree((char *)inst->servName); + OsalMemFree((char *)inst->servInfo); OsalMemFree(inst); } } -void DevSvcRecordDelete(struct HdfSListNode *listEntry) -{ - if (listEntry != NULL) { - OsalMemFree(listEntry); - } -} diff --git a/core/shared/src/ioserstat_listener.c b/core/shared/src/ioserstat_listener.c new file mode 100644 index 000000000..b592c200d --- /dev/null +++ b/core/shared/src/ioserstat_listener.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "ioservstat_listener.h" +#include "osal_mem.h" + +static int OnIoServiceEventReceive( + struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data) +{ + if (listener == NULL || service == NULL || data == NULL) { + return HDF_ERR_INVALID_PARAM; + } + (void)id; + struct ServiceStatus status = { 0 }; + if (ServiceStatusUnMarshalling(&status, data) != HDF_SUCCESS) { + return HDF_ERR_INVALID_PARAM; + } + + struct IoServiceStatusListener *statusListener = listener->priv; + if (statusListener->svcstatListener.callback != NULL && + (statusListener->deviceClass & status.deviceClass)) { + statusListener->svcstatListener.callback(&statusListener->svcstatListener, &status); + } + + return HDF_SUCCESS; +} + +struct ServiceStatusListener *IoServiceStatusListenerNewInstance(void) +{ + struct IoServiceStatusListener *listener = OsalMemCalloc(sizeof(struct IoServiceStatusListener)); + if (listener == NULL) { + return NULL; + } + + listener->ioservListener.onReceive = OnIoServiceEventReceive; + listener->ioservListener.priv = (void *)listener; + + return &listener->svcstatListener; +} + +void IoServiceStatusListenerFree(struct ServiceStatusListener *listener) +{ + if (listener == NULL) { + return; + } + struct IoServiceStatusListener *ioservListener + = CONTAINER_OF(listener, struct IoServiceStatusListener, svcstatListener); + OsalMemFree(ioservListener); +} \ No newline at end of file diff --git a/core/shared/src/service_status.c b/core/shared/src/service_status.c new file mode 100644 index 000000000..5e6ef8abf --- /dev/null +++ b/core/shared/src/service_status.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "hdf_log.h" +#include "hdf_sbuf.h" +#include "hdf_service_status.h" + +int ServiceStatusMarshalling(struct ServiceStatus *status, struct HdfSBuf *buf) +{ + if (status == NULL || buf == NULL || status->serviceName == NULL) { + return HDF_ERR_INVALID_PARAM; + } + if (!HdfSbufWriteString(buf, status->serviceName) + || !HdfSbufWriteUint16(buf, status->deviceClass) + || !HdfSbufWriteUint16(buf, status->status) + || !HdfSbufWriteString(buf, status->info != NULL ? status->info : "")) { + HDF_LOGI("failed to marshalling service status"); + return HDF_FAILURE; + } + + return HDF_SUCCESS; +} + +int ServiceStatusUnMarshalling(struct ServiceStatus *status, struct HdfSBuf *buf) +{ + + if (status == NULL || buf == NULL) { + return HDF_ERR_INVALID_PARAM; + } + status->serviceName = HdfSbufReadString(buf); + if (status->serviceName == NULL) { + HDF_LOGI("failed to unmarshalling service status, service name is null"); + return HDF_FAILURE; + } + + if (!HdfSbufReadUint16(buf, &status->deviceClass) || !HdfSbufReadUint16(buf, &status->status)) { + HDF_LOGI("failed to unmarshalling service status, deviceClass or status invalid"); + return HDF_FAILURE; + } + + status->info = HdfSbufReadString(buf); + return HDF_SUCCESS; +} diff --git a/core/shared/src/svcmgr_ioservice.c b/core/shared/src/svcmgr_ioservice.c new file mode 100644 index 000000000..363dc1bc0 --- /dev/null +++ b/core/shared/src/svcmgr_ioservice.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2021 Huawei Device Co., Ltd. + * + * HDF is dual licensed: you can use it either under the terms of + * the GPL, or the BSD license, at your option. + * See the LICENSE file in the root of this repository for complete details. + */ + +#include "svcmgr_ioservice.h" +#include "hdf_base.h" +#include "hdf_dlist.h" +#include "hdf_io_service_if.h" +#include "hdf_log.h" +#include "hdf_sbuf.h" +#include "ioservstat_listener.h" +#include "osal_mem.h" + +struct SvcMgrIoservice { + struct ISvcMgrIoservice svcmgr; + struct HdfIoService *iosvc; + struct DListHead listeners; +}; + +static int32_t SetListenClass(struct SvcMgrIoservice *svcmgrInst, uint16_t devClass) +{ + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + (void)HdfSbufWriteUint16(data, devClass); + if (svcmgrInst->iosvc == NULL || svcmgrInst->iosvc->dispatcher == NULL + || svcmgrInst->iosvc->dispatcher->Dispatch == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return svcmgrInst->iosvc->dispatcher->Dispatch( + (struct HdfObject *)svcmgrInst->iosvc, SVCMGR_REGISTER_LISTENER, data, NULL); +} + +static int32_t UnSetListenClass(struct SvcMgrIoservice *svcmgrInst, uint16_t devClass) +{ + struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + if (data == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + + (void)HdfSbufWriteUint16(data, devClass); + if (svcmgrInst->iosvc == NULL || svcmgrInst->iosvc->dispatcher == NULL + || svcmgrInst->iosvc->dispatcher->Dispatch == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return svcmgrInst->iosvc->dispatcher->Dispatch( + (struct HdfObject *)svcmgrInst->iosvc, SVCMGR_UNREGISTER_LISTENER, data, NULL); +} + +int32_t SvcMgrIoserviceRegSvcStatListener( + struct ISvcMgrIoservice *self, struct ServiceStatusListener *listener, uint16_t deviceClass) +{ + if (self == NULL || listener == NULL || deviceClass >= DEVICE_CLASS_MAX) { + return HDF_ERR_INVALID_PARAM; + } + + struct SvcMgrIoservice *svcmgrInst = CONTAINER_OF(self, struct SvcMgrIoservice, svcmgr); + struct IoServiceStatusListener *listenerInst + = CONTAINER_OF(listener, struct IoServiceStatusListener, svcstatListener); + + listenerInst->deviceClass = deviceClass; + int ret = SetListenClass(svcmgrInst, deviceClass); + if (ret != HDF_SUCCESS) { + HDF_LOGE("failed to set listen class"); + return ret; + } + + return HdfDeviceRegisterEventListener(svcmgrInst->iosvc, &listenerInst->ioservListener); +} + +int32_t SvcMgrIoserviceUnRegSvcStatListener(struct ISvcMgrIoservice *self, struct ServiceStatusListener *listener) +{ + if (self == NULL || listener == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + struct SvcMgrIoservice *svcmgrInst = CONTAINER_OF(self, struct SvcMgrIoservice, svcmgr); + struct IoServiceStatusListener *listenerInst + = CONTAINER_OF(listener, struct IoServiceStatusListener, svcstatListener); + + int ret = HdfDeviceUnregisterEventListener(svcmgrInst->iosvc, &listenerInst->ioservListener); + if (ret != HDF_SUCCESS) { + return ret; + } + + if (HdfIoserviceGetListenerCount(svcmgrInst->iosvc) == 0) { + ret = UnSetListenClass(svcmgrInst, listenerInst->deviceClass); + } + + return ret; +} + +static void SvcMgrIoserviceConstruct(struct ISvcMgrIoservice *svcmgrInst) +{ + svcmgrInst->RegisterServiceStatusListener = SvcMgrIoserviceRegSvcStatListener; + svcmgrInst->UnregisterServiceStatusListener = SvcMgrIoserviceUnRegSvcStatListener; +} + +struct ISvcMgrIoservice *SvcMgrIoserviceGet(void) +{ + struct SvcMgrIoservice *svcmgrInst = OsalMemCalloc(sizeof(struct SvcMgrIoservice)); + if (svcmgrInst == NULL) { + return NULL; + } + + svcmgrInst->iosvc = HdfIoServiceBind(DEV_SVCMGR_NODE); + if (svcmgrInst->iosvc == NULL) { + HDF_LOGE("ioserivce %s not exist", DEV_SVCMGR_NODE); + OsalMemFree(svcmgrInst); + return NULL; + } + SvcMgrIoserviceConstruct(&svcmgrInst->svcmgr); + return &svcmgrInst->svcmgr; +} + +void SvcMgrIoserviceRelease(struct ISvcMgrIoservice *svcmgr) +{ + if (svcmgr == NULL) { + return; + } + struct SvcMgrIoservice *svcmgrInst = CONTAINER_OF(svcmgr, struct SvcMgrIoservice, svcmgr); + HdfIoServiceRecycle(svcmgrInst->iosvc); + OsalMemFree(svcmgrInst); +} \ No newline at end of file diff --git a/include/core/hdf_io_service_if.h b/include/core/hdf_io_service_if.h index 9dc9fd901..16aa78059 100644 --- a/include/core/hdf_io_service_if.h +++ b/include/core/hdf_io_service_if.h @@ -47,18 +47,15 @@ struct HdfIoService; * @since 1.0 */ typedef enum { - /** Default device */ - DEVICE_CLASS_DEFAULT = 0, - /** Platform device */ - DEVICE_CLASS_PAL, - /** Sensor device */ - DEVICE_CLASS_SENSOR, - /** Input device */ - DEVICE_CLASS_INPUT, - /** Display device */ - DEVICE_CLASS_DISPLAY, - /** Maximum value of a device class */ - DEVICE_CLASS_MAX + DEVICE_CLASS_DEFAULT = 0x1 << 0, /** Default device */ + DEVICE_CLASS_PALT = 0x1 << 1, /** Platform device */ + DEVICE_CLASS_SENSOR = 0x1 << 2, /** Sensor device */ + DEVICE_CLASS_INPUT = 0x1 << 3, /** Input device */ + DEVICE_CLASS_DISPLAY = 0x1 << 4, /** Display device */ + DEVICE_CLASS_AUDIO = 0x1 << 5, /** Audio device */ + DEVICE_CLASS_CAMERA = 0x1 << 6, /** Camera device */ + DEVICE_CLASS_USB = 0x1 << 7, /** USB device */ + DEVICE_CLASS_MAX = 0x1 << 8, /** Maximum value of a device class */ } DeviceClass; /** @@ -88,8 +85,8 @@ typedef int (*OnEventReceived)(void *priv, uint32_t id, struct HdfSBuf *data); * * @since 1.0 */ -typedef int (*OnDevEventReceive)(struct HdfDevEventlistener *listener, - struct HdfIoService *service, uint32_t id, struct HdfSBuf *data); +typedef int (*OnDevEventReceive)( + struct HdfDevEventlistener *listener, struct HdfIoService *service, uint32_t id, struct HdfSBuf *data); /** * @brief Defines a driver event listener object. @@ -130,9 +127,9 @@ struct HdfIoService { /** Pointer to the bound service entity, which is used for framework management. You can ignore it. */ struct HdfObject *target; /** Service call dispatcher */ - struct HdfIoDispatcher* dispatcher; + struct HdfIoDispatcher *dispatcher; /** Private data of the service */ - void* priv; + void *priv; }; /** @@ -176,7 +173,6 @@ void HdfIoServiceGroupRecycle(struct HdfIoServiceGroup *group); */ int32_t HdfIoServiceGroupAddService(struct HdfIoServiceGroup *group, struct HdfIoService *service); - /** * @brief Removes a driver service object from a specified driver service group. * diff --git a/test/unittest/manager/sample_driver_test.c b/test/unittest/manager/sample_driver_test.c index 04e4ceb50..deb892656 100644 --- a/test/unittest/manager/sample_driver_test.c +++ b/test/unittest/manager/sample_driver_test.c @@ -164,6 +164,24 @@ int32_t SampleDriverPowerStateInject(uint32_t powerState) return ret; } +int32_t SampleDriverUpdateService(struct HdfDeviceIoClient *client, struct HdfSBuf *data) +{ + const char *servInfo = HdfSbufReadString(data); + int32_t ret; + if (servInfo == NULL) { + HDF_LOGE("%s: miss servce info", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if(HdfDeviceObjectSetServInfo(client->device, servInfo) != HDF_SUCCESS) { + HDF_LOGE("%s: failed to set servce info", __func__); + return HDF_ERR_INVALID_PARAM; + } + ret = HdfDeviceObjectUpdate(client->device); + HDF_LOGE("%s:set servce info done, ret = %d", __func__, ret); + return ret; +} + int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply) { uint32_t powerState = 0; @@ -181,6 +199,9 @@ int32_t SampleDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct ret = SampleDriverUnregisterDevice(data); HdfSbufWriteInt32(reply, ret); break; + case SAMPLE_DRIVER_UPDATE_SERVICE_INFO: + ret = SampleDriverUpdateService(client, data); + break; case SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE: ret = SampleDriverSendEvent(client, cmdId, data, false); HdfSbufWriteInt32(reply, INT32_MAX); @@ -254,7 +275,7 @@ int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) return HDF_FAILURE; } HDF_LOGD("%s:Init success", __func__); - + HdfDeviceObjectSetServInfo(deviceObject, SAMPLE_SERVICE); pmListener.powerListener.DozeResume = HdfSampleDozeResume; pmListener.powerListener.DozeSuspend = HdfSampleDozeSuspend; pmListener.powerListener.Resume = HdfSampleResume; diff --git a/test/unittest/manager/sample_driver_test.h b/test/unittest/manager/sample_driver_test.h index a2ce58f49..25eba3bb5 100644 --- a/test/unittest/manager/sample_driver_test.h +++ b/test/unittest/manager/sample_driver_test.h @@ -16,6 +16,7 @@ typedef enum { SAMPLE_DRIVER_REGISTER_DEVICE = 0, SAMPLE_DRIVER_UNREGISTER_DEVICE, + SAMPLE_DRIVER_UPDATE_SERVICE_INFO, SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE, SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE, SAMPLE_DRIVER_PM_STATE_INJECT, -- Gitee From 85307d026086c91381b53d94a46dff16c77d8a6f Mon Sep 17 00:00:00 2001 From: vb6174 Date: Thu, 16 Dec 2021 16:37:57 +0800 Subject: [PATCH 269/272] =?UTF-8?q?style=EF=BC=9Amodify=20audio=20driver?= =?UTF-8?q?=20codex=20style?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- model/audio/common/src/audio_accessory_base.c | 2 +- model/audio/common/src/audio_codec_base.c | 4 ++-- model/audio/common/src/audio_dai_base.c | 2 +- model/audio/common/src/audio_platform_base.c | 4 ++-- model/audio/core/src/audio_core.c | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/model/audio/common/src/audio_accessory_base.c b/model/audio/common/src/audio_accessory_base.c index 2448d5ee1..7e79e56fc 100755 --- a/model/audio/common/src/audio_accessory_base.c +++ b/model/audio/common/src/audio_accessory_base.c @@ -331,7 +331,7 @@ int32_t AccessoryDeviceCfgGet(struct AccessoryData *accessoryData, g_audioControls[index].name = g_audioControlsList[ctlcfgItem[index].arrayIndex]; g_audioControls[index].Info = AudioInfoCtrlOps; g_audioControls[index].privateValue = - (unsigned long)&g_audioRegCfgGroupNode[AUDIO_CTRL_PATAM_GROUP]->regCfgItem[index]; + (unsigned long)(uintptr_t)(void*)(&g_audioRegCfgGroupNode[AUDIO_CTRL_PATAM_GROUP]->regCfgItem[index]); g_audioControls[index].Get = AudioAccessoryGetCtrlOps; g_audioControls[index].Set = AudioAccessorySetCtrlOps; } diff --git a/model/audio/common/src/audio_codec_base.c b/model/audio/common/src/audio_codec_base.c index 600fbdb76..ee753581d 100755 --- a/model/audio/common/src/audio_codec_base.c +++ b/model/audio/common/src/audio_codec_base.c @@ -148,7 +148,7 @@ static int32_t CodecSetSapmConfigInfo(struct CodecData *codeData, struct AudioRe for (index = 0; index < regCfgGroup[AUDIO_SAPM_CFG_GROUP]->itemNum; index++) { audioSapmControls[index].iface = sapmCtrlItem[index].iface; audioSapmControls[index].name = g_audioSapmCfgNameList[sapmCtrlItem[index].arrayIndex]; - audioSapmControls[index].privateValue = (unsigned long)&ctlSapmRegCfgItem[index]; + audioSapmControls[index].privateValue = (unsigned long)(uintptr_t)(void*)(&ctlSapmRegCfgItem[index]); audioSapmControls[index].Info = AudioInfoCtrlOps; audioSapmControls[index].Get = AudioCodecSapmGetCtrlOps; audioSapmControls[index].Set = AudioCodecSapmSetCtrlOps; @@ -215,7 +215,7 @@ int32_t CodecSetConfigInfo(struct CodecData *codeData, struct DaiData *daiData) codeData->controls[index].iface = compItem[index].iface; codeData->controls[index].name = g_audioControlsList[compItem[index].arrayIndex]; codeData->controls[index].Info = AudioInfoCtrlOps; - codeData->controls[index].privateValue = (unsigned long)&ctlRegCfgItem[index]; + codeData->controls[index].privateValue = (unsigned long)(uintptr_t)(void*)(&ctlRegCfgItem[index]); if (compItem[index].enable) { codeData->controls[index].Get = AudioCodecGetCtrlOps; codeData->controls[index].Set = AudioCodecSetCtrlOps; diff --git a/model/audio/common/src/audio_dai_base.c b/model/audio/common/src/audio_dai_base.c index 3f470cfaf..0b9822acd 100644 --- a/model/audio/common/src/audio_dai_base.c +++ b/model/audio/common/src/audio_dai_base.c @@ -104,7 +104,7 @@ int32_t DaiSetConfigInfo(struct DaiData *data) } data->controls[index].name = g_audioControlsList[item[index].arrayIndex]; data->controls[index].Info = AudioInfoCtrlOps; - data->controls[index].privateValue = (unsigned long)&patRegCfgItemTmp[index]; + data->controls[index].privateValue = (unsigned long)(uintptr_t)(void*)(&patRegCfgItemTmp[index]); data->controls[index].Get = AudioCpuDaiGetCtrlOps; data->controls[index].Set = AudioCpuDaiSetCtrlOps; } diff --git a/model/audio/common/src/audio_platform_base.c b/model/audio/common/src/audio_platform_base.c index 952e60bd3..f64fe0455 100755 --- a/model/audio/common/src/audio_platform_base.c +++ b/model/audio/common/src/audio_platform_base.c @@ -25,12 +25,12 @@ const int SLEEP_TIME = 5; unsigned int SysReadl(unsigned long addr) { - return *(volatile unsigned int *)(addr); + return *(volatile unsigned int *)(uintptr_t)(addr); } void SysWritel(unsigned long addr, unsigned int value) { - *(volatile unsigned int *)(addr) = value; + *(volatile unsigned int *)(uintptr_t)(addr) = value; } struct PlatformData *PlatformDataFromCard(const struct AudioCard *card) diff --git a/model/audio/core/src/audio_core.c b/model/audio/core/src/audio_core.c index b533100bd..8115d8689 100755 --- a/model/audio/core/src/audio_core.c +++ b/model/audio/core/src/audio_core.c @@ -147,7 +147,7 @@ int32_t AudioRegisterCodec(struct HdfDeviceObject *device, struct CodecData *cod ret = AudioSocRegisterDai(device, daiData); if (ret != HDF_SUCCESS) { - OsalIoUnmap((void *)((uintptr_t)(void*)&(codec->devData->virtualAddress))); + OsalIoUnmap((void *)((uintptr_t)(codec->devData->virtualAddress))); OsalMemFree(codec); ADM_LOG_ERR("Register dai device fail ret=%d", ret); return HDF_ERR_IO; -- Gitee From 29c94740895648bee18f9489ea5e1a7df101af64 Mon Sep 17 00:00:00 2001 From: vb6174 Date: Fri, 17 Dec 2021 16:09:19 +0800 Subject: [PATCH 270/272] =?UTF-8?q?style=EF=BC=9Amodify=20audio=20driver?= =?UTF-8?q?=20safety=20function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: vb6174 --- .../model/audio/src/audio_codec_base_test.c | 4 +- .../model/audio/src/audio_dai_base_test.c | 4 +- .../model/audio/src/audio_dma_base_test.c | 20 +++---- .../audio/src/audio_platform_base_test.c | 54 +++++++++---------- 4 files changed, 41 insertions(+), 41 deletions(-) diff --git a/test/unittest/model/audio/src/audio_codec_base_test.c b/test/unittest/model/audio/src/audio_codec_base_test.c index 7c90f655a..58c5f77df 100644 --- a/test/unittest/model/audio/src/audio_codec_base_test.c +++ b/test/unittest/model/audio/src/audio_codec_base_test.c @@ -65,8 +65,8 @@ int32_t CodecSetConfigInfoTest(void) struct DaiData device; struct CodecData codecData; - memset(&device, 0, sizeof(struct DaiData)); - memset(&codecData, 0, sizeof(struct CodecData)); + (void)memset_s(&device, sizeof(struct DaiData), 0, sizeof(struct DaiData)); + (void)memset_s(&codecData, sizeof(struct CodecData), 0, sizeof(struct CodecData)); if (CodecSetConfigInfo(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; } diff --git a/test/unittest/model/audio/src/audio_dai_base_test.c b/test/unittest/model/audio/src/audio_dai_base_test.c index e09ddc325..245338b76 100644 --- a/test/unittest/model/audio/src/audio_dai_base_test.c +++ b/test/unittest/model/audio/src/audio_dai_base_test.c @@ -19,7 +19,7 @@ int32_t DaiDataFromCardTest(void) return HDF_FAILURE; } - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (DaiDataFromCard(&card) != NULL) { return HDF_FAILURE; } @@ -59,7 +59,7 @@ int32_t DaiSetConfigInfoTest(void) return HDF_FAILURE; } - memset(&data, 0, sizeof(struct DaiData)); + (void)memset_s(&data, sizeof(struct DaiData), 0, sizeof(struct DaiData)); if (DaiSetConfigInfo(&data) == HDF_SUCCESS) { return HDF_FAILURE; } diff --git a/test/unittest/model/audio/src/audio_dma_base_test.c b/test/unittest/model/audio/src/audio_dma_base_test.c index e013099c8..12560fb15 100644 --- a/test/unittest/model/audio/src/audio_dma_base_test.c +++ b/test/unittest/model/audio/src/audio_dma_base_test.c @@ -17,7 +17,7 @@ int32_t AudioDmaBufAllocTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaBufAlloc(NULL, 0) == HDF_SUCCESS) { return HDF_FAILURE; @@ -34,7 +34,7 @@ int32_t AudioDmaBufFreeTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaBufFree(NULL, 0) == HDF_SUCCESS) { return HDF_FAILURE; @@ -50,7 +50,7 @@ int32_t AudioDmaBufFreeTest(void) int32_t AudioDmaRequestChannelTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaRequestChannel(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -65,7 +65,7 @@ int32_t AudioDmaRequestChannelTest(void) int32_t AudioDmaConfigChannelTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaConfigChannel(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -80,7 +80,7 @@ int32_t AudioDmaConfigChannelTest(void) int32_t AudioDmaPrepTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaPrep(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -95,7 +95,7 @@ int32_t AudioDmaPrepTest(void) int32_t AudioDmaSubmitTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaSubmit(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -110,7 +110,7 @@ int32_t AudioDmaSubmitTest(void) int32_t AudioDmaPendingTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaPending(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -125,7 +125,7 @@ int32_t AudioDmaPendingTest(void) int32_t AudioDmaPauseTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaPause(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -140,7 +140,7 @@ int32_t AudioDmaPauseTest(void) int32_t AudioDmaResumeTest(void) { struct PlatformData data; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaResume(NULL) == HDF_SUCCESS) { return HDF_FAILURE; } @@ -156,7 +156,7 @@ int32_t AudioDmaPointerTest(void) { struct PlatformData data; uint32_t pointer = 0; - memset(&data, 0, sizeof(struct PlatformData)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); if (AudioDmaPointer(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; } diff --git a/test/unittest/model/audio/src/audio_platform_base_test.c b/test/unittest/model/audio/src/audio_platform_base_test.c index 1b498b08d..bffa0ae00 100644 --- a/test/unittest/model/audio/src/audio_platform_base_test.c +++ b/test/unittest/model/audio/src/audio_platform_base_test.c @@ -16,7 +16,7 @@ int32_t PlatformDataFromCardTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (PlatformDataFromCard(NULL) != NULL) { return HDF_FAILURE; @@ -44,7 +44,7 @@ int32_t AudioDataBigEndianChangeTest(void) { const int dataLen = 32; // test data lenth char test[dataLen]; - memset(&test, 1, dataLen); + (void)memset_s(&test, dataLen, 1, dataLen); if (AudioDataBigEndianChange(NULL, 0, 0) == HDF_SUCCESS) { return HDF_FAILURE; @@ -101,8 +101,8 @@ int32_t AudioSetPcmInfoTest(void) { struct PlatformData platformData; struct AudioPcmHwParams param; - memset(&platformData, 0, sizeof(struct PlatformData)); - memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + (void)memset_s(&platformData, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); + (void)memset_s(¶m, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams)); if (AudioSetPcmInfo(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -118,8 +118,8 @@ int32_t AudioSetRenderBufInfoTest(void) { struct PlatformData data; struct AudioPcmHwParams param; - memset(&data, 0, sizeof(struct PlatformData)); - memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); + (void)memset_s(¶m, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams)); if (AudioSetRenderBufInfo(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -136,8 +136,8 @@ int32_t AudioSetCaptureBufInfoTest(void) { struct PlatformData data; struct AudioPcmHwParams param; - memset(&data, 0, sizeof(struct PlatformData)); - memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + (void)memset_s(&data, sizeof(struct PlatformData), 0, sizeof(struct PlatformData)); + (void)memset_s(¶m, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams)); if (AudioSetCaptureBufInfo(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -154,8 +154,8 @@ int32_t AudioPcmWriteTest(void) { struct AudioCard card; struct AudioTxData txData; - memset(&card, 0, sizeof(struct AudioCard)); - memset(&txData, 0, sizeof(struct AudioTxData)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); + (void)memset_s(&txData, sizeof(struct AudioTxData), 0, sizeof(struct AudioTxData)); if (AudioPcmWrite(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -172,8 +172,8 @@ int32_t AudioPcmReadTest(void) { struct AudioCard card; struct AudioRxData rxData; - memset(&card, 0, sizeof(struct AudioCard)); - memset(&rxData, 0, sizeof(struct AudioRxData)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); + (void)memset_s(&rxData, sizeof(struct AudioRxData), 0, sizeof(struct AudioRxData)); if (AudioPcmRead(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -189,8 +189,8 @@ int32_t AudioPcmMmapWriteTest(void) { struct AudioCard card; struct AudioMmapData txMmapData; - memset(&card, 0, sizeof(struct AudioCard)); - memset(&txMmapData, 0, sizeof(struct AudioMmapData)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); + (void)memset_s(&txMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData)); if (AudioPcmMmapWrite(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -206,8 +206,8 @@ int32_t AudioPcmMmapReadTest(void) { struct AudioCard card; struct AudioMmapData rxMmapData; - memset(&card, 0, sizeof(struct AudioCard)); - memset(&rxMmapData, 0, sizeof(struct AudioMmapData)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); + (void)memset_s(&rxMmapData, sizeof(struct AudioMmapData), 0, sizeof(struct AudioMmapData)); if (AudioPcmMmapRead(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -222,7 +222,7 @@ int32_t AudioPcmMmapReadTest(void) int32_t AudioRenderOpenTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioRenderOpen(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -237,7 +237,7 @@ int32_t AudioRenderOpenTest(void) int32_t AudioCaptureOpenTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioCaptureOpen(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -252,7 +252,7 @@ int32_t AudioCaptureOpenTest(void) int32_t AudioRenderCloseTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioRenderClose(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -268,7 +268,7 @@ int32_t AudioPcmPointerTest(void) { uint32_t pointer = 0; struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioPcmPointer(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -283,7 +283,7 @@ int32_t AudioPcmPointerTest(void) int32_t AudioCaptureCloseTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioCaptureClose(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -299,8 +299,8 @@ int32_t AudioHwParamsTest(void) { struct AudioCard card; struct AudioPcmHwParams param; - memset(&card, 0, sizeof(struct AudioCard)); - memset(¶m, 0, sizeof(struct AudioPcmHwParams)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); + (void)memset_s(¶m, sizeof(struct AudioPcmHwParams), 0, sizeof(struct AudioPcmHwParams)); if (AudioHwParams(NULL, NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -316,7 +316,7 @@ int32_t AudioHwParamsTest(void) int32_t AudioRenderPrepareTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioRenderPrepare(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -332,7 +332,7 @@ int32_t AudioRenderPrepareTest(void) int32_t AudioCapturePrepareTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioCapturePrepare(NULL) == HDF_SUCCESS) { return HDF_FAILURE; @@ -348,7 +348,7 @@ int32_t AudioCapturePrepareTest(void) int32_t AudioRenderTriggerTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioRenderTrigger(NULL, AUDIO_DRV_PCM_IOCTL_RENDER_START) == HDF_SUCCESS) { return HDF_FAILURE; @@ -376,7 +376,7 @@ int32_t AudioRenderTriggerTest(void) int32_t AudioCaptureTriggerTest(void) { struct AudioCard card; - memset(&card, 0, sizeof(struct AudioCard)); + (void)memset_s(&card, sizeof(struct AudioCard), 0, sizeof(struct AudioCard)); if (AudioCaptureTrigger(NULL, AUDIO_DRV_PCM_IOCTL_CAPTURE_START) == HDF_SUCCESS) { return HDF_FAILURE; -- Gitee From b430d7d4cffcfa3c6877f68600e837b8c055d343 Mon Sep 17 00:00:00 2001 From: yuanbo Date: Mon, 20 Dec 2021 15:50:15 +0800 Subject: [PATCH 271/272] fix: pass device id with uint16 lost accuracy issue Signed-off-by: yuanbo --- core/common/src/hdf_attribute.c | 1 - core/shared/include/hdf_device_info.h | 3 +-- core/shared/src/hdf_device_info.c | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/core/common/src/hdf_attribute.c b/core/common/src/hdf_attribute.c index d20e6ae73..4ceb22c92 100644 --- a/core/common/src/hdf_attribute.c +++ b/core/common/src/hdf_attribute.c @@ -196,7 +196,6 @@ static bool GetDevcieNodeList(const struct DeviceResourceNode *device, continue; } - deviceNodeInfo->hostId = hostId; deviceNodeInfo->deviceId = MK_DEVID(hostId, deviceIdx, deviceNodeIdx); if (deviceNodeInfo->preload != DEVICE_PRELOAD_DISABLE) { if (!HdfSListAddOrder(&hostClnt->unloadDevInfos, &deviceNodeInfo->node, HdfDeviceListCompare)) { diff --git a/core/shared/include/hdf_device_info.h b/core/shared/include/hdf_device_info.h index 8c351b12d..9880181a3 100644 --- a/core/shared/include/hdf_device_info.h +++ b/core/shared/include/hdf_device_info.h @@ -27,8 +27,7 @@ struct HdfDeviceInfo { bool isDynamic; uint16_t status; uint16_t deviceType; - uint16_t hostId; - uint16_t deviceId; + uint32_t deviceId; uint16_t policy; uint16_t priority; uint16_t preload; diff --git a/core/shared/src/hdf_device_info.c b/core/shared/src/hdf_device_info.c index 440ab1adb..a691edcf8 100644 --- a/core/shared/src/hdf_device_info.c +++ b/core/shared/src/hdf_device_info.c @@ -18,7 +18,6 @@ void HdfDeviceInfoConstruct(struct HdfDeviceInfo *deviceInfo) return; } deviceInfo->isDynamic = false; - deviceInfo->hostId = 0; deviceInfo->status = HDF_SERVICE_UNUSABLE; deviceInfo->deviceType = HDF_DEV_LOCAL_SERVICE; deviceInfo->deviceId = 0; -- Gitee From 20c853b3a4be779e0d52b36ddcc7772d7b16e0e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E4=BC=9F=E6=B0=91?= Date: Tue, 21 Dec 2021 09:25:35 +0800 Subject: [PATCH 272/272] fixed 799e24f from https://gitee.com/zhangweimin24026/drivers_framework/pulls/489 fix: fix the bug that release the memory and lock resource of manager->eventMutex. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 张伟民 --- model/sensor/driver/common/src/sensor_device_manager.c | 1 + 1 file changed, 1 insertion(+) diff --git a/model/sensor/driver/common/src/sensor_device_manager.c b/model/sensor/driver/common/src/sensor_device_manager.c index e72dd5db2..c38271e7a 100644 --- a/model/sensor/driver/common/src/sensor_device_manager.c +++ b/model/sensor/driver/common/src/sensor_device_manager.c @@ -371,6 +371,7 @@ void ReleaseSensorDevManager(struct HdfDeviceObject *device) } OsalMutexDestroy(&manager->mutex); + OsalMutexDestroy(&manager->eventMutex); OsalMemFree(manager); g_sensorDeviceManager = NULL; } -- Gitee