精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于HDF驅(qū)動(dòng)框架的溫度傳感器驅(qū)動(dòng)開發(fā)

開發(fā) 前端
? Sensor驅(qū)動(dòng)模型提供標(biāo)準(zhǔn)化的器件驅(qū)動(dòng),開發(fā)者無需獨(dú)立開發(fā),通過配置即可完成驅(qū)動(dòng)的部署。對(duì)驅(qū)動(dòng)模型抽象,屏蔽驅(qū)動(dòng)與不同系統(tǒng)組件間的交互,使得驅(qū)動(dòng)更具備通用性。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

概述

溫度傳感器(Temperature)Sensor驅(qū)動(dòng),對(duì)溫度傳感器進(jìn)行上電,通過驅(qū)動(dòng)入口,將溫度傳感器注冊(cè)到HDF驅(qū)動(dòng)框架,對(duì)溫度傳感器驅(qū)動(dòng)進(jìn)行初始化,探測(cè)器件是否在位,并解析配置文件,最后通過溫度傳感器差異化代碼實(shí)現(xiàn),為上層服務(wù)提供穩(wěn)定的實(shí)時(shí)數(shù)據(jù)。溫度傳感器sensor開發(fā)主要包括三個(gè)部分:溫度傳感器通用傳感器驅(qū)動(dòng)、溫度傳感器通用傳感器配置和器件差異化驅(qū)動(dòng)?;贖DF(Hardware Driver Foundation)驅(qū)動(dòng)框架的Sensor驅(qū)動(dòng)模型,實(shí)現(xiàn)跨操作系統(tǒng)遷移,器件差異配置等功能。

備注:后續(xù)會(huì)考慮進(jìn)入到OpenHarmony主線,濕度傳感器相關(guān)開發(fā)類似溫度傳感器

開發(fā)指導(dǎo)

開發(fā)步驟

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

(2)加載溫度傳感器抽象驅(qū)動(dòng),調(diào)用初始化接口,完成Sensor器件驅(qū)動(dòng)資源分配和數(shù)據(jù)處理隊(duì)列創(chuàng)建。

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

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

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

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

開發(fā)實(shí)例

Sensor驅(qū)動(dòng)模型提供標(biāo)準(zhǔn)化的器件驅(qū)動(dòng),開發(fā)者無需獨(dú)立開發(fā),通過配置即可完成驅(qū)動(dòng)的部署。對(duì)驅(qū)動(dòng)模型抽象,屏蔽驅(qū)動(dòng)與不同系統(tǒng)組件間的交互,使得驅(qū)動(dòng)更具備通用性。基于Sensor驅(qū)動(dòng)模型,加載溫度傳感器驅(qū)動(dòng)。溫度傳感器選擇通訊接口方式為IIC,廠家選擇Sensirion,器件類型為SHT30的溫度傳感器傳器。

1.溫度傳感器抽象驅(qū)動(dòng)實(shí)現(xiàn)。

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

/* 調(diào)用HDF_INIT將驅(qū)動(dòng)入口注冊(cè)到HDF框架中,在加載驅(qū)動(dòng)時(shí)HDF框架會(huì)先調(diào)用Bind函數(shù),再調(diào)用Init函數(shù)加載該驅(qū)動(dòng),當(dāng)Init調(diào)用異常時(shí),HDF框架會(huì)調(diào)用Release釋放驅(qū)動(dòng)資源并退出 */
HDF_INIT(g_sensorTemperatureDevEntry);

Bind接口實(shí)現(xiàn)驅(qū)動(dòng)接口實(shí)例化,實(shí)現(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接口實(shí)現(xiàn)驅(qū)動(dòng)接口實(shí)例化,實(shí)現(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ū)動(dòng)卸載或者Init執(zhí)行失敗時(shí),會(huì)調(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;

//器件在位,銷毀工作隊(duì)列資源
HdfWorkDestroy(&drvData->TemperatureWork);
HdfWorkQueueDestroy(&drvData->TemperatureWorkQueue);
OsalMemFree(drvData);
}

溫度傳感器抽象驅(qū)動(dòng)內(nèi)部接口開發(fā)實(shí)現(xiàn)示例:

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

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

//注冊(cè)溫度傳感器設(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;
}

//如果器件不在位,返回進(jìn)行下個(gè)器件探測(cè)
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;
}

//如果器件不在位,返回進(jìn)行下個(gè)器件探測(cè)
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ū)動(dòng)實(shí)現(xiàn)。

  • 溫度傳感器差異化驅(qū)動(dòng)在Sensor Host中的配置信息。
    代碼實(shí)現(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ū)動(dòng)服務(wù)發(fā)布的策略 */
priority = 140; /* 溫度傳感器SHT30驅(qū)動(dòng)啟動(dòng)優(yōu)先級(jí)(0-200),值越大優(yōu)先級(jí)越低,建議默認(rèn)配100,優(yōu)先級(jí)相同則不保證device的加載順序 */
preload = 0; /* 驅(qū)動(dòng)按需加載字段,0表示加載,2表示不加載 */
permission = 0664; /* 驅(qū)動(dòng)創(chuàng)建設(shè)備節(jié)點(diǎn)權(quán)限 */
moduleName = "HDF_SENSOR_TEMPERATURE_SHT30"; /* 溫度傳感器結(jié)構(gòu)的moduleName值一致 */
serviceName = "hdf_temperature_sht30"; /* 溫度傳感器SHT30驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱,必須唯一 */
deviceMatchAttr = "hdf_sensor_temperature_sht30_driver"; /* 溫度傳感器SHT30驅(qū)動(dòng)私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動(dòng)私有數(shù)據(jù)配置表中的match_attr值相等 */
}
}

溫度傳感器差異化驅(qū)動(dòng)私有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ū)動(dòng)入口函數(shù)實(shí)現(xiàn):
    代碼實(shí)現(xiàn)路徑為 drivers/peripheral/sensor/chipset/temperature/temperature_sht30.c
    定義溫度傳感器差異化驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中,Driver Entry入口函數(shù)定義如下:
/*注冊(cè)溫度傳感器SHT30入口數(shù)據(jù)結(jié)構(gòu)體對(duì)象*/
struct HdfDriverEntry g_temperatureSht30DevEntry = {
.moduleVersion = 1, /*溫度傳感器模塊版本號(hào)*/
.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ū)動(dòng)入口注冊(cè)到HDF框架中,在加載驅(qū)動(dòng)時(shí)HDF框架會(huì)先調(diào)用Bind函數(shù),再調(diào)用Init函數(shù)加載該驅(qū)動(dòng),當(dāng)Init調(diào)用異常時(shí),HDF框架會(huì)調(diào)用Release釋放驅(qū)動(dòng)資源并退出 */
HDF_INIT(g_temperatureSht30DevEntry);

Bind驅(qū)動(dòng)接口實(shí)例化,實(shí)現(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ū)動(dòng)接口實(shí)例化,實(shí)現(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ù)接口,完成器件探測(cè),私有數(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;
}

//注冊(cè)差異化接口
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ū)動(dòng)接口實(shí)例化,實(shí)現(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ù)接口實(shí)現(xiàn)示例。

需要開發(fā)者實(shí)現(xiàn)的ReadSht30Data接口函數(shù),在Sht30InitDriver函數(shù)里面注冊(cè)此函數(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ū)動(dòng)加載。

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ū)動(dòng)按需加載字段,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ū)動(dòng)按需加載字段,0表示加載,2表示不加載 */
permission = 0664;
moduleName = "HDF_SENSOR_TEMPERATURE_SHT30";
serviceName = "hdf_temperature_sht30";
deviceMatchAttr = "hdf_sensor_temperature_sht30_driver";
}
}

傳感器驅(qū)動(dòng)實(shí)現(xiàn)在內(nèi)核態(tài),代碼參與編譯通過適配makefile實(shí)現(xiàn),并通過內(nèi)核模塊宏定義,控制溫度傳感器設(shè)備驅(qū)動(dòng)是否參與編譯。

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ū)動(dòng)加載,將DRIVERS_HDF_SENSOR_TEMPERATURE;

DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段設(shè)置為y即可。

溫度傳感器驅(qū)動(dòng)不加載,將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
.....

實(shí)例運(yùn)行

參考代碼:

#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)建傳感器接口實(shí)例 */
const struct SensorInterface *sensorDev = NewSensorInterfaceInstance();
if (sensorDev == NULL) {
return;
}
printf("NewSensorInterfaceInstance success\n");

/* 2.訂閱者注冊(cè)傳感器數(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.釋放傳感器接口實(shí)例 */
ret = FreeSensorInterfaceInstance();
if (ret != 0) {
return;
}
printf("FreeSensorInterfaceInstance success\n");
}

int main(int argc, char *argv[])
{
SensorSample();
return HDF_SUCCESS;
}

RK3568運(yùn)行日志如下:

基于HDF驅(qū)動(dòng)框架的溫度傳感器驅(qū)動(dòng)開發(fā)-開源基礎(chǔ)軟件社區(qū)

A311D運(yùn)行日志:

基于HDF驅(qū)動(dòng)框架的溫度傳感器驅(qū)動(dòng)開發(fā)-開源基礎(chǔ)軟件社區(qū)

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-03-20 16:05:49

HDF傳感器驅(qū)動(dòng)開發(fā)

2021-12-23 10:02:58

鴻蒙HarmonyOS應(yīng)用

2021-11-30 14:52:41

鴻蒙HarmonyOS應(yīng)用

2022-08-08 19:35:37

HDF驅(qū)動(dòng)開發(fā)鴻蒙

2023-03-22 09:23:53

I2C總線溫度傳感器

2022-09-30 13:50:07

設(shè)備開發(fā)鴻蒙

2021-11-22 16:46:59

鴻蒙HarmonyOS應(yīng)用

2021-09-07 15:48:28

鴻蒙HarmonyOS應(yīng)用

2023-03-24 14:47:24

NAPI框架HDF框架

2021-12-15 15:30:38

鴻蒙HarmonyOS應(yīng)用

2021-01-03 15:37:33

傳感器物聯(lián)網(wǎng)大數(shù)據(jù)

2022-04-20 20:28:40

HDF 驅(qū)動(dòng)框架鴻蒙操作系統(tǒng)

2022-12-07 14:45:16

數(shù)據(jù)中心溫度傳感器

2023-03-20 16:21:26

ADC數(shù)字轉(zhuǎn)換器

2021-12-15 10:02:25

鴻蒙HarmonyOS應(yīng)用

2012-12-13 14:48:55

GAF無線傳感器MAC

2023-03-21 18:06:49

ADC數(shù)字轉(zhuǎn)換器

2021-01-21 13:27:37

鴻蒙HarmonyOS應(yīng)用開發(fā)

2014-08-07 15:01:36

無線RFID

2023-09-06 15:35:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美精品videosex极品1| 黄页免费欧美| 欧美偷拍自拍| 亚洲一区二区偷拍精品| 国产男女猛烈无遮挡91| 三级电影在线看| 国产精品久久影视| 精品一二三区| 狠狠做深爱婷婷久久综合一区| 亚洲一区二区三区777| 18啪啪污污免费网站| 男人av在线播放| 国产福利一区二区三区视频| 日韩有码视频在线| 丁香婷婷激情网| 免费在线观看污视频| 久草在线综合| 亚洲午夜久久久| 日韩av一区二区三区美女毛片| 羞羞影院体验区| 免费观看成人www动漫视频| 亚洲一区中文日韩| 视频一区二区在线| 亚洲天堂avav| 91精品国产自产在线观看永久∴| 欧美日韩一区二区三区在线| 亚洲欧美精品| 国产又粗又长又大视频| 欧美亚洲网站| 国产一区二区日韩| 中文字幕亚洲乱码| av网址在线免费观看| 日韩激情一二三区| 一区二区三区四区视频| 亚洲欧美日韩一级| 超碰人人在线| 国产精品欧美综合在线| 国产裸体写真av一区二区| 日韩女同强女同hd| 久久91成人| 欧美视频中文字幕| 亚洲五码在线观看视频| 五月婷在线视频| 日日摸夜夜添夜夜添国产精品| 欧美日韩xxxxx| 不卡一区二区在线观看| 日本成人福利| 一区二区三区蜜桃| 国产精品制服诱惑| 无码人妻精品一区二区50| 99久久精品费精品国产| 精品sm捆绑视频| 激情五月婷婷久久| 香蕉久久aⅴ一区二区三区| aa级大片欧美| 国产日韩精品综合网站| 国产午夜激情视频| 国产调教一区二区三区| 欧美一区二区播放| 日韩视频在线免费看| 久热国产在线| 久久免费的精品国产v∧| 成人免费观看a| 西西44rtwww国产精品| 欧美激情 亚洲a∨综合| 亚洲色图13p| 91亚洲一线产区二线产区 | 色系列之999| 麻豆网站免费观看| 成人小电影网站| 亚洲精品少妇30p| 欧美日韩精品久久| 国产福利第一页| 日本在线观看不卡视频| 国内精品免费午夜毛片| 黄色片子在线观看| 少妇精品久久久一区二区| 亚洲视频视频在线| 亚洲综合图片一区| 国产精品美女久久久久久不卡| 亚洲午夜av电影| 欧美一级特黄高清视频| 九九视频精品全部免费播放| 中文字幕av一区中文字幕天堂 | 国产亚洲亚洲国产一二区| 黑人狂躁日本妞一区二区三区| a√天堂在线观看| 性欧美video高清bbw| 亚洲18色成人| 日韩在线视频在线| 免费在线看黄网站| 国产精品无圣光一区二区| 久久偷看各类wc女厕嘘嘘偷窃| 国产人妻精品一区二区三| 日本v片在线高清不卡在线观看| 国产欧亚日韩视频| 亚洲精品久久久久久久久久久久久久| 麻豆久久久久久| 国产精品白嫩初高中害羞小美女| 日韩精品在线不卡| 亚洲日本激情| 午夜精品久久久久久99热| 久久亚洲av午夜福利精品一区| 亚洲成人99| 88xx成人精品| 欧美三级一区二区三区| 久久精品av麻豆的观看方式| 国产精品久久精品国产| 天堂аⅴ在线地址8| 国产精品久久久久一区二区三区共| 欧美 日韩 国产精品| 日韩在线短视频| 日本韩国精品一区二区在线观看| 日韩激情免费视频| 日本一区二区乱| 欧美日韩成人综合天天影院| 日本三级黄色网址| 清纯唯美亚洲经典中文字幕| 久久国产精品久久久久久| 国产日韩欧美在线观看视频| 永久亚洲成a人片777777| 久久精品久久久久久| 男人操女人的视频网站| 首页国产欧美日韩丝袜| 国产精品久久久久久五月尺| 在线观看毛片网站| 久久久久久夜精品精品免费| 日韩精品伦理第一区| 国产精选在线| 在线观看欧美日本| 在线看免费毛片| 在线综合色站| 亚洲欧美日韩高清| 91香蕉国产视频| 视频在线观看国产精品| 久久精品一二三区| 一区二区三区视频在线观看视频| 欧美日韩国产精品一区二区三区四区 | 国产大屁股喷水视频在线观看| 亚洲欧美高清| 欧美不卡1区2区3区| 看黄在线观看| 日韩激情av在线播放| www.久久国产| 亚洲专区一区二区三区| 久久国产精品亚洲va麻豆| av中文字幕在线观看第一页| 色哟哟国产精品| 中文字幕 欧美日韩| 久久看人人摘| 97久久国产精品| 日本黄色三级视频| 日本一二三不卡| 国产九九热视频| 我不卡影院28| 97久久夜色精品国产九色 | 波多野结衣小视频| 国内精品自线一区二区三区视频| 国产99午夜精品一区二区三区| 免费国产在线观看| 欧美性受极品xxxx喷水| 亚洲毛片亚洲毛片亚洲毛片| 精品在线一区二区| 欧美精品欧美精品| 欧美最新精品| 日韩一区二区福利| 午夜精品久久久久久久99老熟妇| 久久精品综合网| 欧美午夜aaaaaa免费视频| 久久精品国产68国产精品亚洲| 91九色国产视频| 成人亚洲综合天堂| 亚洲第一av色| 1314成人网| 在线日韩中文| 品久久久久久久久久96高清| gratisvideos另类灌满| 日韩成人在线观看| 中文字幕 亚洲视频| 91丝袜美腿高跟国产极品老师 | 婷婷免费在线视频| 日韩美女视频在线| 国产又粗又长又硬| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美性色xo影院| 日韩高清一二三区| 国产亚洲精品久久久久婷婷瑜伽| 亚洲综合一区二区不卡| av日韩中文| 少妇精69xxtheporn| 午夜精品久久久久久久99老熟妇| 欧美性猛交xxxx乱大交| 免费在线观看a级片| 99re视频精品| 国产v片免费观看| 成人福利免费在线观看| 欧美精品免费在线观看| 欧美在线观看在线观看| 姬川优奈aav一区二区| 性农村xxxxx小树林| 国产精品magnet| 懂色中文一区二区三区在线视频| 男人久久天堂| 久久中文字幕在线视频| 国产三级午夜理伦三级| 黑人精品xxx一区| 欧美精品videos极品| 国产91丝袜在线18| 福利视频免费在线观看| 豆花视频一区二区| 午夜精品久久久久久久99热浪潮 | 亚洲色图20p| 一区二区三区四区毛片| 国产深夜精品| 蜜桃视频一区二区在线观看| 成人中文视频| 精品高清视频| 精品3atv在线视频| 久久久在线观看| 成人看av片| 最近2019免费中文字幕视频三 | 久久最新资源网| 国产二区视频在线观看| 欧美三电影在线| 亚洲午夜18毛片在线看| 国产日韩欧美一区二区三区乱码| 99草草国产熟女视频在线| 亚洲天堂黄色| 欧美日本亚洲| 欧美xxxx在线| 国产视频99| 午夜av成人| 欧美性在线视频| 电影av在线| 精品亚洲精品福利线在观看| 日批视频免费观看| 亚洲精品视频免费看| 成人三级视频在线观看| 国产精品网友自拍| 国产精品情侣呻吟对白视频| 国产一区二区三区免费观看| 免费网站在线观看视频 | 国产乱子伦视频一区二区三区| 老司机激情视频| 你懂的亚洲视频| 妞干网这里只有精品| 欧美精品密入口播放| 国产一区喷水| 日韩黄色网络| 91久久中文字幕| 亚洲热av色在线播放| 高清欧美性猛交| 2021中文字幕在线| 欧美一区二区三区精品电影| 伊人网在线播放| 久热99视频在线观看| h片在线免费| 久久久久久国产精品| 国模精品视频| 国产福利成人在线| 成年网站在线视频网站| 亚洲欧美中文另类| 韩国免费在线视频| 精品日韩成人av| 亚洲天堂免费av| 91麻豆精品国产91久久久久久久久 | 国产经典自拍视频在线观看| 中文字幕一精品亚洲无线一区| 999国产在线视频| 亚洲黄页网在线观看| 国产又黄又大又爽| 日韩欧美一级二级三级| 手机看片福利永久| 日韩视频一区在线观看| 中文字幕免费视频观看| 88在线观看91蜜桃国自产| 精品久久久久成人码免费动漫| 欧美成人伊人久久综合网| 天天爽夜夜爽夜夜爽| 一区二区三区日韩在线| 国产在线激情| 45www国产精品网站| 看片一区二区| 国产高清在线精品一区二区三区| 一本色道久久综合亚洲精品酒店| 国产精品区一区二区三在线播放| 日韩mv欧美mv国产网站| 一区二区视频在线观看| 成人区精品一区二区婷婷| 亚洲欧美日韩不卡| 色135综合网| 日韩精品av一区二区三区| 亚洲有吗中文字幕| 欧美牲交a欧美牲交aⅴ免费下载| 黄色av成人| 国产成人精品视频ⅴa片软件竹菊| 国产一区二区三区综合| 中文人妻一区二区三区| 亚洲欧美日韩综合aⅴ视频| 麻豆成人免费视频| 色婷婷综合久色| 亚洲AV无码精品色毛片浪潮| 亚洲人成网站免费播放| 牛牛电影国产一区二区| 久久99精品视频一区97| 性欧美hd调教| 国产精自产拍久久久久久蜜| 91成人短视频| 影音先锋亚洲视频| 老司机久久99久久精品播放免费| 1314成人网| 中文字幕日韩精品一区| 9999热视频| 欧美在线播放高清精品| 欧美一级特黄aaaaaa| www.久久撸.com| 亚洲wwww| 久久综合色一本| 精品电影一区| aa免费在线观看| 成人在线一区二区三区| 国产吞精囗交久久久| 一区二区三区精品在线| 国产精品人妻一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 国产极品在线观看| 国产伦理久久久| 欧美三区在线| 一区二区三区人妻| a亚洲天堂av| 久久无码精品丰满人妻| 日韩三级电影网址| 成人免费网址| 91麻豆国产语对白在线观看| 日韩精品首页| 国产又大又黄又粗又爽| 国产丝袜欧美中文另类| 精人妻无码一区二区三区| 亚洲精品久久久久久下一站 | 韩曰欧美视频免费观看| 香蕉久久国产av一区二区| 久久久精品亚洲| 国产高清日韩| 91视频成人免费| 国产剧情av麻豆香蕉精品| 中文字幕亚洲欧美日韩| 7777精品伊人久久久大香线蕉完整版 | 久久精品人人做人人爽97| 99久久久久久久久| 国产亚洲欧美日韩美女| yw.尤物在线精品视频| 日韩欧美三级电影| 久色婷婷小香蕉久久| 久久成人小视频| 日韩欧美电影一区| 3344国产永久在线观看视频| 久久99精品久久久久久久久久| 一区二区三区国产在线| 我看黄色一级片| 国产精品久久久久久福利一牛影视| 精品肉丝脚一区二区三区| 日韩欧美三级在线| missav|免费高清av在线看| 久久av免费一区| 日本欧美大码aⅴ在线播放| 亚洲综合久久av一区二区三区| 在线不卡欧美精品一区二区三区| 少妇无码一区二区三区| 97久久精品视频| 欧美亚洲在线日韩| 午夜影院免费版| 黄色一区二区三区| 99青草视频在线播放视| 91在线视频精品| 国产亚洲精品v| 精品伦精品一区二区三区视频密桃 | 久久久久影视| 一级在线免费视频| 亚洲伦理在线精品| 四虎精品在永久在线观看| 欧美成人高清视频| 日韩美女毛片| 奇米影视四色在线| 午夜久久久影院| 自拍视频在线免费观看| 国产精品免费一区二区三区| 性感少妇一区| 久久中文免费视频| 亚洲女人天堂av| 嫩呦国产一区二区三区av | 国产精品成人一区二区网站软件| 白嫩情侣偷拍呻吟刺激| 欧美丝袜自拍制服另类| 九色91在线| 午夜视频久久久| 不卡欧美aaaaa| 日本一区二区欧美| 中文字幕亚洲二区| 欧美人与动xxxxz0oz| 在线免费看污网站|