成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于HDF驅動框架的溫度傳感器驅動開發

開發 前端
? Sensor驅動模型提供標準化的器件驅動,開發者無需獨立開發,通過配置即可完成驅動的部署。對驅動模型抽象,屏蔽驅動與不同系統組件間的交互,使得驅動更具備通用性。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

概述

溫度傳感器(Temperature)Sensor驅動,對溫度傳感器進行上電,通過驅動入口,將溫度傳感器注冊到HDF驅動框架,對溫度傳感器驅動進行初始化,探測器件是否在位,并解析配置文件,最后通過溫度傳感器差異化代碼實現,為上層服務提供穩定的實時數據。溫度傳感器sensor開發主要包括三個部分:溫度傳感器通用傳感器驅動、溫度傳感器通用傳感器配置和器件差異化驅動。基于HDF(Hardware Driver Foundation)驅動框架的Sensor驅動模型,實現跨操作系統遷移,器件差異配置等功能。

備注:后續會考慮進入到OpenHarmony主線,濕度傳感器相關開發類似溫度傳感器

開發指導

開發步驟

(1)從device info HCS 的Sensor Host里讀取溫度傳感器驅動配置信息。

(2)加載溫度傳感器抽象驅動,調用初始化接口,完成Sensor器件驅動資源分配和數據處理隊列創建。

(3)從temperature_xxx_config HCS里讀取溫度傳感器器件差異化驅動配置和私有化配置信息。

(4)溫度傳感器差異化驅動,調用通用配置解析接口,完成器件屬性信息解析,器件寄存器解析。

(5)溫度傳感器差異化驅動完成器件探測,并分配溫度傳感器配置資源,完成溫度傳感器差異化接口注冊。

(6)溫度傳感器器件探測成功之后,溫度傳感器差異化驅動通知溫度傳感器抽象驅動,注冊溫度傳感器設備到Sensor設備管理中。

開發實例

Sensor驅動模型提供標準化的器件驅動,開發者無需獨立開發,通過配置即可完成驅動的部署。對驅動模型抽象,屏蔽驅動與不同系統組件間的交互,使得驅動更具備通用性。基于Sensor驅動模型,加載溫度傳感器驅動。溫度傳感器選擇通訊接口方式為IIC,廠家選擇Sensirion,器件類型為SHT30的溫度傳感器傳器。

1.溫度傳感器抽象驅動實現。

  • 溫度傳感器抽象驅動在Sensor Host中的配置信息。
    代碼實現路徑為:
    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配置路徑)
    具體代碼如下:
/* 溫度傳感器設備HCS配置 */
device_sensor_temperature :: device {
device0 :: deviceNode {
policy = 1; /* policy字段是驅動服務發布的策略 */
priority = 130; /* 溫度傳感器驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序 */
preload = 0; /* 驅動按需加載字段,0表示加載,2表示不加載 */
permission = 0664; /* 驅動創建設備節點權限 */
moduleName = "HDF_SENSOR_TEMPERATURE"; /* 溫度傳感器驅動名稱,該字段的值必須和驅動入口結構的moduleName值一致 */
serviceName = "hdf_sensor_temperature"; /* 溫度傳感器驅動對外發布服務的名稱,必須唯一 */
deviceMatchAttr = "hdf_sensor_temperature_driver"; /* 驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等 */
}
}
  • 溫度傳感器抽象驅動入口函數實現。
    代碼實現路徑為 \drivers\framework\model\sensor\driver\temperature\sensor_temperature_driver.c
    定義溫度傳感器抽象驅動對應的HdfDriverEntry對象,其中,Driver Entry入口函數定義如下:
/*注冊溫度傳感器入口數據結構體對象*/
struct HdfDriverEntry g_sensorTemperatureDevEntry = {
.moduleVersion = 1, /*溫度傳感器模塊版本號*/
.moduleName = "HDF_SENSOR_TEMPERATURE", /*溫度傳感器模塊名,要與device_info.hcs文件里溫度傳感器moduleName字段值一樣*/
.Bind = TemperatureBindDriver, /*溫度傳感器綁定函數*/
.Init = TemperatureInitDriver, /*溫度傳感器初始化函數*/
.Release = TemperatureReleaseDriver, /*溫度傳感器資源釋放函數*/
};

/* 調用HDF_INIT將驅動入口注冊到HDF框架中,在加載驅動時HDF框架會先調用Bind函數,再調用Init函數加載該驅動,當Init調用異常時,HDF框架會調用Release釋放驅動資源并退出 */
HDF_INIT(g_sensorTemperatureDevEntry);

Bind接口實現驅動接口實例化,實現示例:

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接口實現驅動接口實例化,實現示例:

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接口在驅動卸載或者Init執行失敗時,會調用此接口釋放資源:

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);
}

溫度傳感器抽象驅動內部接口開發實現示例:

提供給差異化驅動的初始化接口,完成溫度傳感器器件的基本配置信息解析(溫度傳感器信息,溫度傳感器總線配置,溫度傳感器器件探測寄存器配置),器件探測,器件寄存器解析。

static int32_t InitTemperatureAfterDetected(struct SensorCfgData *config)
{
struct SensorDeviceInfo deviceInfo;
CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM);

//初始化溫度傳感器接口函數
if (InitTemperatureOps(config, &deviceInfo) != HDF_SUCCESS) {
HDF_LOGE("%s: Init Temperature ops failed", __func__);
return HDF_FAILURE;
}

//注冊溫度傳感器設備到設備管理模塊
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;
}

//設備基本配置信息解析
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.溫度傳感器差異化驅動實現。

  • 溫度傳感器差異化驅動在Sensor Host中的配置信息。
    代碼實現路徑為:
    vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs
    vendor\unionman\unionpi_tiger\hdf_config\device_info\device_info.hcs
/* 溫度傳感器SHT30設備HCS配置 */
device_temperature_sht30 :: device {
device0 :: deviceNode {
policy = 1; /* policy字段是驅動服務發布的策略 */
priority = 140; /* 溫度傳感器SHT30驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序 */
preload = 0; /* 驅動按需加載字段,0表示加載,2表示不加載 */
permission = 0664; /* 驅動創建設備節點權限 */
moduleName = "HDF_SENSOR_TEMPERATURE_SHT30"; /* 溫度傳感器結構的moduleName值一致 */
serviceName = "hdf_temperature_sht30"; /* 溫度傳感器SHT30驅動對外發布服務的名稱,必須唯一 */
deviceMatchAttr = "hdf_sensor_temperature_sht30_driver"; /* 溫度傳感器SHT30驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等 */
}
}

溫度傳感器差異化驅動私有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
];
}
}
}
  • 溫度傳感器差異化驅動入口函數實現:
    代碼實現路徑為 drivers/peripheral/sensor/chipset/temperature/temperature_sht30.c
    定義溫度傳感器差異化驅動對應的HdfDriverEntry對象,其中,Driver Entry入口函數定義如下:
/*注冊溫度傳感器SHT30入口數據結構體對象*/
struct HdfDriverEntry g_temperatureSht30DevEntry = {
.moduleVersion = 1, /*溫度傳感器模塊版本號*/
.moduleName = "HDF_SENSOR_TEMPERATURE_SHT30", /*溫度傳感器SHT30模塊名,要與device_info.hcs文件里溫度傳感器SHT30 moduleName字段值一樣*/
.Bind = Sht30BindDriver, /*溫度傳感器SHT30綁定函數*/
.Init = Sht30InitDriver, /*溫度傳感器SHT30初始化函數*/
.Release = Sht30ReleaseDriver, /*溫度傳感器SHT30資源釋放函數*/
};

/* 調用HDF_INIT將驅動入口注冊到HDF框架中,在加載驅動時HDF框架會先調用Bind函數,再調用Init函數加載該驅動,當Init調用異常時,HDF框架會調用Release釋放驅動資源并退出 */
HDF_INIT(g_temperatureSht30DevEntry);

Bind驅動接口實例化,實現示例:

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驅動接口實例化,實現示例:

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);

//創建傳感器配置數據接口,完成器件探測,私有數據配置解析
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驅動接口實例化,實現示例:

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);
}

溫度傳感器差異化函數接口實現示例。

需要開發者實現的ReadSht30Data接口函數,在Sht30InitDriver函數里面注冊此函數。

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;
}

編譯指導

在編譯的過程中,首先需要在Sensor Host中的配置信息中設置具體器件是否要驅動加載。

HCS路徑:

vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs

device_sensor_temperature :: device {
device0 :: deviceNode {
policy = 1;
priority = 130;
preload = 0; /* 驅動按需加載字段,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; /* 驅動按需加載字段,0表示加載,2表示不加載 */
permission = 0664;
moduleName = "HDF_SENSOR_TEMPERATURE_SHT30";
serviceName = "hdf_temperature_sht30";
deviceMatchAttr = "hdf_sensor_temperature_sht30_driver";
}
}

傳感器驅動實現在內核態,代碼參與編譯通過適配makefile實現,并通過內核模塊宏定義,控制溫度傳感器設備驅動是否參與編譯。

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

溫度傳感器驅動加載,將DRIVERS_HDF_SENSOR_TEMPERATURE;

DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段設置為y即可。

溫度傳感器驅動不加載,將DRIVERS_HDF_SENSOR_TEMPERATURE; DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段設置為is not set即可。

內核配置路徑(以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"

/* 創建回調函數 */
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; /* 數據采樣率設置200毫秒,單位納秒 */
int32_t reportInterval = 400000000;

/* 1.創建傳感器接口實例 */
const struct SensorInterface *sensorDev = NewSensorInterfaceInstance();
if (sensorDev == NULL) {
return;
}
printf("NewSensorInterfaceInstance success\n");

/* 2.訂閱者注冊傳感器數據回調處理函數 */
ret = sensorDev->Register(TRADITIONAL_SENSOR_TYPE, SensorDataCallback);
if (ret != 0) {
return;
}
printf("Register success\n");

/* 3.獲取設備支持的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.設置傳感器采樣率 */
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.取消傳感器數據訂閱函數 */
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運行日志如下:

基于HDF驅動框架的溫度傳感器驅動開發-開源基礎軟件社區

A311D運行日志:

基于HDF驅動框架的溫度傳感器驅動開發-開源基礎軟件社區

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-03-20 16:05:49

HDF傳感器驅動開發

2021-12-23 10:02:58

鴻蒙HarmonyOS應用

2021-11-30 14:52:41

鴻蒙HarmonyOS應用

2022-08-08 19:35:37

HDF驅動開發鴻蒙

2023-03-22 09:23:53

I2C總線溫度傳感器

2022-09-30 13:50:07

設備開發鴻蒙

2021-11-22 16:46:59

鴻蒙HarmonyOS應用

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2023-03-24 14:47:24

NAPI框架HDF框架

2021-12-15 15:30:38

鴻蒙HarmonyOS應用

2021-01-03 15:37:33

傳感器物聯網大數據

2022-04-20 20:28:40

HDF 驅動框架鴻蒙操作系統

2022-12-07 14:45:16

數據中心溫度傳感器

2023-03-20 16:21:26

ADC數字轉換器

2021-12-15 10:02:25

鴻蒙HarmonyOS應用

2012-12-13 14:48:55

GAF無線傳感器MAC

2023-03-21 18:06:49

ADC數字轉換器

2021-01-21 13:27:37

鴻蒙HarmonyOS應用開發

2014-08-07 15:01:36

無線RFID

2023-09-14 15:49:42

PWM鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美三区 | 精品中文字幕视频 | 国产精品三级久久久久久电影 | 久久久久久久久一区 | 日韩一区二区三区在线 | www.国产精品 | 91激情电影 | av黄色免费在线观看 | 国产在线a| 日日爱夜夜操 | 一区二区三区中文字幕 | 福利片在线观看 | 欧美精产国品一二三区 | 久久这里只有精品首页 | 国产欧美日韩一区二区三区在线 | 精品无码三级在线观看视频 | 97色在线观看免费视频 | 欧美激情精品久久久久久变态 | 成人三级在线观看 | 国产亚洲精品精品国产亚洲综合 | 亚洲欧美日韩系列 | 亚洲午夜精品一区二区三区他趣 | 一本色道久久综合亚洲精品高清 | 精品欧美一区二区精品久久久 | 日本一二三区电影 | 日日噜噜夜夜爽爽狠狠 | 国产成人免费在线观看 | 日韩精品一区二区三区中文字幕 | 日韩毛片在线免费观看 | 欧美日韩精品久久久免费观看 | 中文在线а√在线8 | 在线看日韩 | av网站在线播放 | 亚洲免费一| 天天干天天色 | 97超在线视频| 在线观看日本高清二区 | 久久久久国产精品人 | 国产免费一区二区 | 欧美一区二区三区在线观看 | 国产精品久久久久久久久久久免费看 |