
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
??51CTO 開源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??
概述
 溫度傳感器(Temperature)Sensor驅(qū)動,對溫度傳感器進行上電,通過驅(qū)動入口,將溫度傳感器注冊到HDF驅(qū)動框架,對溫度傳感器驅(qū)動進行初始化,探測器件是否在位,并解析配置文件,最后通過溫度傳感器差異化代碼實現(xiàn),為上層服務(wù)提供穩(wěn)定的實時數(shù)據(jù)。溫度傳感器sensor開發(fā)主要包括三個部分:溫度傳感器通用傳感器驅(qū)動、溫度傳感器通用傳感器配置和器件差異化驅(qū)動?;贖DF(Hardware Driver Foundation)驅(qū)動框架的Sensor驅(qū)動模型,實現(xiàn)跨操作系統(tǒng)遷移,器件差異配置等功能。
備注:后續(xù)會考慮進入到OpenHarmony主線,濕度傳感器相關(guān)開發(fā)類似溫度傳感器
開發(fā)指導(dǎo)
開發(fā)步驟
(1)從device info HCS 的Sensor Host里讀取溫度傳感器驅(qū)動配置信息。
(2)加載溫度傳感器抽象驅(qū)動,調(diào)用初始化接口,完成Sensor器件驅(qū)動資源分配和數(shù)據(jù)處理隊列創(chuàng)建。
(3)從temperature_xxx_config HCS里讀取溫度傳感器器件差異化驅(qū)動配置和私有化配置信息。
(4)溫度傳感器差異化驅(qū)動,調(diào)用通用配置解析接口,完成器件屬性信息解析,器件寄存器解析。
(5)溫度傳感器差異化驅(qū)動完成器件探測,并分配溫度傳感器配置資源,完成溫度傳感器差異化接口注冊。
(6)溫度傳感器器件探測成功之后,溫度傳感器差異化驅(qū)動通知溫度傳感器抽象驅(qū)動,注冊溫度傳感器設(shè)備到Sensor設(shè)備管理中。
開發(fā)實例
 Sensor驅(qū)動模型提供標準化的器件驅(qū)動,開發(fā)者無需獨立開發(fā),通過配置即可完成驅(qū)動的部署。對驅(qū)動模型抽象,屏蔽驅(qū)動與不同系統(tǒng)組件間的交互,使得驅(qū)動更具備通用性?;赟ensor驅(qū)動模型,加載溫度傳感器驅(qū)動。溫度傳感器選擇通訊接口方式為IIC,廠家選擇Sensirion,器件類型為SHT30的溫度傳感器傳器。
1.溫度傳感器抽象驅(qū)動實現(xiàn)。
- 溫度傳感器抽象驅(qū)動在Sensor Host中的配置信息。
代碼實現(xiàn)路徑為:
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs (RK3568配置路徑)
vendor\unionman\unionpi_tiger\hdf_config\khdf\device_info\device_info.hcs (A311D配置路徑)
具體代碼如下: 
/* 溫度傳感器設(shè)備HCS配置 */
device_sensor_temperature :: device {
    device0 :: deviceNode {
        policy = 1; /* policy字段是驅(qū)動服務(wù)發(fā)布的策略 */
        priority = 130; /* 溫度傳感器驅(qū)動啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證device的加載順序 */
        preload = 0; /* 驅(qū)動按需加載字段,0表示加載,2表示不加載 */
        permission = 0664; /* 驅(qū)動創(chuàng)建設(shè)備節(jié)點權(quán)限 */
        moduleName = "HDF_SENSOR_TEMPERATURE"; /* 溫度傳感器驅(qū)動名稱,該字段的值必須和驅(qū)動入口結(jié)構(gòu)的moduleName值一致 */
        serviceName = "hdf_sensor_temperature"; /* 溫度傳感器驅(qū)動對外發(fā)布服務(wù)的名稱,必須唯一 */
        deviceMatchAttr = "hdf_sensor_temperature_driver"; /* 驅(qū)動私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動私有數(shù)據(jù)配置表中的match_attr值相等 */
    }
}
- 溫度傳感器抽象驅(qū)動入口函數(shù)實現(xiàn)。
代碼實現(xiàn)路徑為 \drivers\framework\model\sensor\driver\temperature\sensor_temperature_driver.c
定義溫度傳感器抽象驅(qū)動對應(yīng)的HdfDriverEntry對象,其中,Driver Entry入口函數(shù)定義如下: 
/*注冊溫度傳感器入口數(shù)據(jù)結(jié)構(gòu)體對象*/
struct HdfDriverEntry g_sensorTemperatureDevEntry = {
    .moduleVersion = 1, /*溫度傳感器模塊版本號*/
    .moduleName = "HDF_SENSOR_TEMPERATURE", /*溫度傳感器模塊名,要與device_info.hcs文件里溫度傳感器moduleName字段值一樣*/
    .Bind = TemperatureBindDriver, /*溫度傳感器綁定函數(shù)*/
    .Init = TemperatureInitDriver, /*溫度傳感器初始化函數(shù)*/
    .Release = TemperatureReleaseDriver, /*溫度傳感器資源釋放函數(shù)*/
};
/* 調(diào)用HDF_INIT將驅(qū)動入口注冊到HDF框架中,在加載驅(qū)動時HDF框架會先調(diào)用Bind函數(shù),再調(diào)用Init函數(shù)加載該驅(qū)動,當Init調(diào)用異常時,HDF框架會調(diào)用Release釋放驅(qū)動資源并退出 */
HDF_INIT(g_sensorTemperatureDevEntry);
Bind接口實現(xiàn)驅(qū)動接口實例化,實現(xiàn)示例:
int32_t TemperatureBindDriver(struct HdfDeviceObject *device)
{
    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
    struct TemperatureDrvData *drvData = (struct TemperatureDrvData *)OsalMemCalloc(sizeof(*drvData));
    if (drvData == NULL) {
        HDF_LOGE("%s: Malloc Temperature drv data fail!", __func__);
        return HDF_ERR_MALLOC_FAIL;
    }
    drvData->ioService.Dispatch = DispatchTemperature;
    drvData->device = device;
    device->service = &drvData->ioService;
    g_TemperatureDrvData = drvData;
    return HDF_SUCCESS;
}
Init接口實現(xiàn)驅(qū)動接口實例化,實現(xiàn)示例:
int32_t TemperatureInitDriver(struct HdfDeviceObject *device)
{
    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
    struct TemperatureDrvData *drvData = (struct TemperatureDrvData *)device->service;
    CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM);
    if (InitTemperatureData(drvData) != HDF_SUCCESS) {
        HDF_LOGE("%s: Init Temperature config failed", __func__);
        return HDF_FAILURE;
    }
    drvData->TemperatureCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData->TemperatureCfg));
    if (drvData->TemperatureCfg == NULL) {
        HDF_LOGE("%s: Malloc Temperature config data failed", __func__);
        return HDF_FAILURE;
    }
    drvData->TemperatureCfg->regCfgGroup = &g_regCfgGroup[0];
    HDF_LOGI("%s: Init Temperature driver success", __func__);
    return HDF_SUCCESS;
}
Release接口在驅(qū)動卸載或者Init執(zhí)行失敗時,會調(diào)用此接口釋放資源:
void TemperatureReleaseDriver(struct HdfDeviceObject *device)
{
    CHECK_NULL_PTR_RETURN(device);
    struct TemperatureDrvData *drvData = (struct TemperatureDrvData *)device->service;
    CHECK_NULL_PTR_RETURN(drvData);
    //器件在位,釋放已分配資源
    if (drvData->detectFlag && drvData->TemperatureCfg != NULL) {
        TemperatureReleaseCfgData(drvData->TemperatureCfg);
    }
    OsalMemFree(drvData->TemperatureCfg);
    drvData->TemperatureCfg = NULL;
    //器件在位,銷毀工作隊列資源
    HdfWorkDestroy(&drvData->TemperatureWork);
    HdfWorkQueueDestroy(&drvData->TemperatureWorkQueue);
    OsalMemFree(drvData);
}
溫度傳感器抽象驅(qū)動內(nèi)部接口開發(fā)實現(xiàn)示例:
 提供給差異化驅(qū)動的初始化接口,完成溫度傳感器器件的基本配置信息解析(溫度傳感器信息,溫度傳感器總線配置,溫度傳感器器件探測寄存器配置),器件探測,器件寄存器解析。
static int32_t InitTemperatureAfterDetected(struct SensorCfgData *config)
{
    struct SensorDeviceInfo deviceInfo;
    CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM);
    //初始化溫度傳感器接口函數(shù)
    if (InitTemperatureOps(config, &deviceInfo) != HDF_SUCCESS) {
        HDF_LOGE("%s: Init Temperature ops failed", __func__);
        return HDF_FAILURE;
    }
    //注冊溫度傳感器設(shè)備到設(shè)備管理模塊
    if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) {
        HDF_LOGE("%s: Add Temperature 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);
        ReleaseSensorDirectionConfig(config);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}
struct SensorCfgData *TemperatureCreateCfgData(const struct DeviceResourceNode *node)
{
    struct TemperatureDrvData *drvData = TemperatureGetDrvData();
    if (drvData == NULL || node == NULL) {
        HDF_LOGE("%s: Temperature node pointer NULL", __func__);
        return NULL;
    }
    //如果器件不在位,返回進行下個器件探測
    if (drvData->detectFlag) {
        HDF_LOGE("%s: Temperature sensor have detected", __func__);
        return NULL;
    }
    if (drvData->TemperatureCfg == NULL) {
        HDF_LOGE("%s: Temperature TemperatureCfg pointer NULL", __func__);
        return NULL;
    }
    //設(shè)備基本配置信息解析
    if (GetSensorBaseConfigData(node, drvData->TemperatureCfg) != HDF_SUCCESS) {
        HDF_LOGE("%s: Get sensor base config failed", __func__);
        goto BASE_CONFIG_EXIT;
    }
    //如果器件不在位,返回進行下個器件探測
    if (DetectSensorDevice(drvData->TemperatureCfg) != HDF_SUCCESS) {
        HDF_LOGI("%s: Temperature sensor detect device no exist", __func__);
        drvData->detectFlag = false;
        goto BASE_CONFIG_EXIT;
    }
    drvData->detectFlag = true;
    
    //器件寄存器解析
    if (InitTemperatureAfterDetected(drvData->TemperatureCfg) != HDF_SUCCESS) {
        HDF_LOGI("%s: Temperature sensor detect device no exist", __func__);
        goto INIT_EXIT;
    }
    return drvData->TemperatureCfg;
INIT_EXIT:
    (void)ReleaseSensorBusHandle(&drvData->TemperatureCfg->busCfg);
BASE_CONFIG_EXIT:
    drvData->TemperatureCfg->root = NULL;
    (void)memset_s(&drvData->TemperatureCfg->sensorInfo,
        sizeof(struct SensorBasicInfo), 0, sizeof(struct SensorBasicInfo));
    (void)memset_s(&drvData->TemperatureCfg->busCfg, sizeof(struct SensorBusCfg), 0, sizeof(struct SensorBusCfg));
    (void)memset_s(&drvData->TemperatureCfg->sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr));
    return drvData->TemperatureCfg;
}
2.溫度傳感器差異化驅(qū)動實現(xiàn)。
- 溫度傳感器差異化驅(qū)動在Sensor Host中的配置信息。
代碼實現(xiàn)路徑為:
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs
vendor\unionman\unionpi_tiger\hdf_config\device_info\device_info.hcs 
/* 溫度傳感器SHT30設(shè)備HCS配置 */
device_temperature_sht30 :: device {
    device0 :: deviceNode {
        policy = 1; /* policy字段是驅(qū)動服務(wù)發(fā)布的策略 */
        priority = 140; /* 溫度傳感器SHT30驅(qū)動啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證device的加載順序 */
        preload = 0; /* 驅(qū)動按需加載字段,0表示加載,2表示不加載 */
        permission = 0664; /* 驅(qū)動創(chuàng)建設(shè)備節(jié)點權(quán)限 */
        moduleName = "HDF_SENSOR_TEMPERATURE_SHT30"; /* 溫度傳感器結(jié)構(gòu)的moduleName值一致 */
        serviceName = "hdf_temperature_sht30"; /* 溫度傳感器SHT30驅(qū)動對外發(fā)布服務(wù)的名稱,必須唯一 */
        deviceMatchAttr = "hdf_sensor_temperature_sht30_driver"; /* 溫度傳感器SHT30驅(qū)動私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動私有數(shù)據(jù)配置表中的match_attr值相等 */
    }
}
溫度傳感器差異化驅(qū)動私有HCS配置。
代碼路徑如下:
vendor\hihope\rk3568\hdf_config\khdf\sensor\temperature\temperature_sht30_config.hcs
vendor\unionman\unionpi_tiger\hdf_config\khdf\sensor\temperature\temperature_sht30_config.hcs
#include "../sensor_common.hcs"
root {
    temperature_sht30_chip_config : sensorConfig {
        match_attr = "hdf_sensor_temperature_sht30_driver";
        sensorInfo :: sensorDeviceInfo {
            sensorName = "temperature_sht30";
            vendorName = "sensirion"; // max string length is 16 bytes
            sensorTypeId = 9; // enum SensorTypeTag
            sensorId = 2; // user define sensor id
            power = 230;
            minDelay = 0;
            maxDelay = 0;
        }
        sensorBusConfig :: sensorBusInfo {
            busType = 0; // 0:i2c 1:spi
            busNum = 3;
            busAddr = 0x44;
            regWidth = 2; // 2 byte
        }
        sensorIdAttr :: sensorIdInfo {
            chipName = "sht30";
            chipIdRegister = 0xf32d;
            chipIdValue = 0x80;
        }
        sensorRegConfig {
            /*  regAddr: register address
                value: config register value
                len: size of value
                mask: mask of value
                delay: config register delay time (ms)
                opsType: enum SensorOpsType 0-none 1-read 2-write 3-read_check 4-update_bit
                calType: enum SensorBitCalType 0-none 1-set 2-revert 3-xor 4-left shift 5-right shift
                shiftNum: shift bits
                debug: 0-no debug 1-debug
                save: 0-no save 1-save
            */
            /* regAddr, value, mask, len, delay, opsType, calType, shiftNum, debug, save */
            initSeqConfig = [
                0x30a2,   0x0,  0x0,   0,     5,       2,       0,        0,     0,    0
            ];
            enableSeqConfig = [
                0x2c06,   0x0,  0x0,   0,     5,       2,       0,        0,     0,    0
            ];
            disableSeqConfig = [
                0x2400,   0x0,  0x0,   0,     5,       2,       0,        0,     0,    0
            ];
        }
    }
}
- 溫度傳感器差異化驅(qū)動入口函數(shù)實現(xiàn):
代碼實現(xiàn)路徑為 drivers/peripheral/sensor/chipset/temperature/temperature_sht30.c
定義溫度傳感器差異化驅(qū)動對應(yīng)的HdfDriverEntry對象,其中,Driver Entry入口函數(shù)定義如下: 
/*注冊溫度傳感器SHT30入口數(shù)據(jù)結(jié)構(gòu)體對象*/
struct HdfDriverEntry g_temperatureSht30DevEntry = {
    .moduleVersion = 1, /*溫度傳感器模塊版本號*/
    .moduleName = "HDF_SENSOR_TEMPERATURE_SHT30", /*溫度傳感器SHT30模塊名,要與device_info.hcs文件里溫度傳感器SHT30 moduleName字段值一樣*/
    .Bind = Sht30BindDriver, /*溫度傳感器SHT30綁定函數(shù)*/
    .Init = Sht30InitDriver, /*溫度傳感器SHT30初始化函數(shù)*/
    .Release = Sht30ReleaseDriver, /*溫度傳感器SHT30資源釋放函數(shù)*/
};
/* 調(diào)用HDF_INIT將驅(qū)動入口注冊到HDF框架中,在加載驅(qū)動時HDF框架會先調(diào)用Bind函數(shù),再調(diào)用Init函數(shù)加載該驅(qū)動,當Init調(diào)用異常時,HDF框架會調(diào)用Release釋放驅(qū)動資源并退出 */
HDF_INIT(g_temperatureSht30DevEntry);
Bind驅(qū)動接口實例化,實現(xiàn)示例:
static int32_t Sht30BindDriver(struct HdfDeviceObject *device)
{
    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
    struct Sht30DrvData *drvData = (struct Sht30DrvData *)OsalMemCalloc(sizeof(*drvData));
    if (drvData == NULL) {
        HDF_LOGE("%s: malloc drv data fail", __func__);
        return HDF_ERR_MALLOC_FAIL;
    }
    drvData->ioService.Dispatch = DispatchSht30;
    drvData->device = device;
    device->service = &drvData->ioService;
    g_sht30DrvData = drvData;
    return HDF_SUCCESS;
}
Init驅(qū)動接口實例化,實現(xiàn)示例:
static int32_t Sht30InitDriver(struct HdfDeviceObject *device)
{
    int32_t ret;
    struct TemperatureOpsCall ops;
    CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);
    struct Sht30DrvData *drvData = (struct Sht30DrvData *)device->service;
    CHECK_NULL_PTR_RETURN_VALUE(drvData, HDF_ERR_INVALID_PARAM);
    //創(chuàng)建傳感器配置數(shù)據(jù)接口,完成器件探測,私有數(shù)據(jù)配置解析
    drvData->sensorCfg = TemperatureCreateCfgData(device->property);
    if (drvData->sensorCfg == NULL || drvData->sensorCfg->root == NULL) {
        HDF_LOGD("%s: Creating temperature cfg failed because detection failed", __func__);
        return HDF_ERR_NOT_SUPPORT;
    }
    //注冊差異化接口
    ops.Init = NULL;
    ops.ReadData = ReadSht30Data;
    ret = TemperatureRegisterChipOps(&ops);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: Register temperature failed", __func__);
        return HDF_FAILURE;
    }
    //初始化器件配置
    ret = InitSht30(drvData->sensorCfg);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: Init SHT30 temperature sensor failed", __func__);
        return HDF_FAILURE;
    }
    return HDF_SUCCESS;
}
Release驅(qū)動接口實例化,實現(xiàn)示例:
static void Sht30ReleaseDriver(struct HdfDeviceObject *device)
{
    CHECK_NULL_PTR_RETURN(device);
    struct Sht30DrvData *drvData = (struct Sht30DrvData *)device->service;
    CHECK_NULL_PTR_RETURN(drvData);
    if (drvData->sensorCfg != NULL) {
        TemperatureReleaseCf gData(drvData->sensorCfg);
        drvData->sensorCfg = NULL;
    }
    OsalMemFree(drvData);
}
溫度傳感器差異化函數(shù)接口實現(xiàn)示例。
需要開發(fā)者實現(xiàn)的ReadSht30Data接口函數(shù),在Sht30InitDriver函數(shù)里面注冊此函數(shù)。
int32_t ReadSht30Data(struct SensorCfgData *data)
{
    int32_t ret;
    static int32_t temperature;
    struct TemperatureData rawData = { 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 = ReadSht30RawData(data, &rawData, &event.timestamp);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: SHT30 read raw data failed", __func__);
        return HDF_FAILURE;
    }
    temperature = rawData.temperature;
    event.sensorId = data->sensorInfo.sensorId;
    event.mode = SENSOR_WORK_MODE_REALTIME;
    event.dataLen = sizeof(temperature);
    event.data = (uint8_t *)&temperature;
    ret = ReportSensorEvent(&event);
    if (ret != HDF_SUCCESS) {
        HDF_LOGE("%s: report data failed", __func__);
    }
    return ret;
}
編譯指導(dǎo)
在編譯的過程中,首先需要在Sensor Host中的配置信息中設(shè)置具體器件是否要驅(qū)動加載。
HCS路徑:
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs
device_sensor_temperature :: device {
                device0 :: deviceNode {
                    policy = 1;
                    priority = 130;
                    preload = 0; /* 驅(qū)動按需加載字段,0表示加載,2表示不加載 */
                    permission = 0664;
                    moduleName = "HDF_SENSOR_TEMPERATURE";
                    serviceName = "hdf_sensor_temperature";
                    deviceMatchAttr = "hdf_sensor_temperature_driver";
                }
            }
            device_temperature_sht30 :: device {
                device0 :: deviceNode {
                    policy = 1;
                    priority = 140;
                    preload = 0; /* 驅(qū)動按需加載字段,0表示加載,2表示不加載 */
                    permission = 0664;
                    moduleName = "HDF_SENSOR_TEMPERATURE_SHT30";
                    serviceName = "hdf_temperature_sht30";
                    deviceMatchAttr = "hdf_sensor_temperature_sht30_driver";
                }
            }傳感器驅(qū)動實現(xiàn)在內(nèi)核態(tài),代碼參與編譯通過適配makefile實現(xiàn),并通過內(nèi)核模塊宏定義,控制溫度傳感器設(shè)備驅(qū)動是否參與編譯。
Makefile路徑:
drivers\hdf_core\adapter\khdf\linux\model\sensor\Makefile
......
obj-$(CONFIG_DRIVERS_HDF_SENSOR_TEMPERATURE) += $(SENSOR_ROOT_DIR)/temperature/sensor_temperature_driver.o
obj-$(CONFIG_DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30) += $(SENSOR_ROOT_DIR)/chipset/temperature/temperature_sht30.o
.....
-Idrivers/peripheral/sensor/driver/temperature \
-Idrivers/peripheral/sensor/driver/chipset/temperature \
......
Kconfig路徑:
drivers\hdf_core\adapter\khdf\linux\model\sensor\Kconfig
溫度傳感器驅(qū)動加載,將DRIVERS_HDF_SENSOR_TEMPERATURE;
DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段設(shè)置為y即可。
溫度傳感器驅(qū)動不加載,將DRIVERS_HDF_SENSOR_TEMPERATURE; DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段設(shè)置為is not set即可。
內(nèi)核配置路徑(以RK3568為例):
kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig
......
# CONFIG_DRIVERS_HDF_INPUT_INFRARED is not set
# CONFIG_DRIVERS_HDF_WIFI is not set
# CONFIG_DRIVERS_HDF_BT is not set
CONFIG_DRIVERS_HDF_SENSOR=y
CONFIG_DRIVERS_HDF_SENSOR_ACCEL=y
CONFIG_DRIVERS_HDF_SENSOR_ACCEL_MXC6655XA=y
CONFIG_DRIVERS_HDF_SENSOR_TEMPERATURE=y
CONFIG_DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30=y
.....
實例運行
參考代碼:
#include <stdio.h>
#include <unistd.h>
#include "hdf_base.h"
#include "hdf_log.h"
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"
#include "sensor_if.h"
#include "sensor_type.h"
/* 創(chuàng)建回調(diào)函數(shù) */
static int32_t SensorDataCallback(const struct SensorEvents *event)
{
    if (event == NULL) {
        return HDF_FAILURE;
    }
    float sensorData =*((float *)event->data);
    printf("sensor id [%d], data : %.2f\n", event->sensorId, sensorData);
    return HDF_SUCCESS;
}
void SensorSample(void)
{
    int ret;
    struct SensorInformation *sensorInfo = NULL;
    int32_t count = 0;
    int32_t sensorInterval = 200000000; /* 數(shù)據(jù)采樣率設(shè)置200毫秒,單位納秒 */
    int32_t reportInterval = 400000000;
    /* 1.創(chuàng)建傳感器接口實例 */
    const struct SensorInterface *sensorDev = NewSensorInterfaceInstance();
    if (sensorDev == NULL) {
        return;
    }
    printf("NewSensorInterfaceInstance success\n");
    /* 2.訂閱者注冊傳感器數(shù)據(jù)回調(diào)處理函數(shù) */
    ret = sensorDev->Register(TRADITIONAL_SENSOR_TYPE, SensorDataCallback);
    if (ret != 0) {
        return;
    }
    printf("Register success\n");
    /* 3.獲取設(shè)備支持的Sensor列表 */
    ret = sensorDev->GetAllSensors(&sensorInfo, &count);
    if (ret != 0) {
        return;
    }
    printf("GetAllSensors count: %d\n", count);
    for (int i = 0; i < count; i++)
    {
        printf("sensor [%d] : sensorName:%s, vendorName:%s, sensorTypeId:%d, sensorId:%d\n", i,
               sensorInfo[i].sensorName, sensorInfo[i].vendorName, sensorInfo[i].sensorTypeId, sensorInfo[i].sensorId);
    }
    for (int i = 0; i < count; i++)
    {
        /* 4.設(shè)置傳感器采樣率 */
        ret = sensorDev->SetBatch(sensorInfo[i].sensorId, sensorInterval, reportInterval);
        if (ret != 0) {
            printf("SetBatch failed\n ,ret: %d",ret);
            continue;
        }
        printf("SetBatch success\n");
        /* 5.使能傳感器 */
        ret = sensorDev->Enable(sensorInfo[i].sensorId);
        if (ret != 0) {
            continue;
        }
        printf("Enable success\n");
        usleep(1000 * 1000);
        /* 6.去使能傳感器 */
        ret = sensorDev->Disable(sensorInfo[i].sensorId);
        if (ret != 0) {
            continue;
        }
        printf("Disable success\n");
    }
    /* 7.取消傳感器數(shù)據(jù)訂閱函數(shù) */
    ret = sensorDev->Unregister(TRADITIONAL_SENSOR_TYPE, SensorDataCallback);
    if (ret != 0) {
        return;
    }
    printf("Unregister success\n");
    /* 8.釋放傳感器接口實例 */
    ret = FreeSensorInterfaceInstance();
    if (ret != 0) {
        return;
    }
    printf("FreeSensorInterfaceInstance success\n");
}
int main(int argc, char *argv[])
{
    SensorSample();
    return HDF_SUCCESS;
}
RK3568運行日志如下:

A311D運行日志:

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
??51CTO 開源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??