99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony HDF傳感器模型框架介紹與傳感器驅(qū)動(dòng)開(kāi)發(fā)指導(dǎo)

OpenAtom OpenHarmony ? 來(lái)源:OpenAtom OpenHarmony ? 作者: 劉飛虎 ? 2021-09-24 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者介紹

劉飛虎(kevin),擔(dān)任OpenHarmony社區(qū)SIG_DriverFramework組committer,主要負(fù)責(zé)傳感器驅(qū)動(dòng)模型驅(qū)動(dòng)開(kāi)發(fā)工作,貢獻(xiàn)傳感器驅(qū)動(dòng)模型驅(qū)動(dòng)和加速度傳感器驅(qū)動(dòng)。

概述

隨著物聯(lián)網(wǎng),移動(dòng)互聯(lián)網(wǎng)的快速發(fā)展,在數(shù)字時(shí)代,傳感器在智能交通,智能工業(yè),智能穿戴等領(lǐng)域有著廣闊的應(yīng)用空間。傳感器是檢測(cè)到被測(cè)量信息,將非電量信息轉(zhuǎn)換成電信號(hào)的檢測(cè)裝置。就像眼睛是人類(lèi)心靈的窗戶(hù),傳感器則是計(jì)算機(jī)感知世界萬(wàn)物的眼睛。

近年來(lái),傳感器技術(shù)和制造工藝的快速發(fā)展,目前市場(chǎng)可供開(kāi)發(fā)者選擇的傳感器越來(lái)越多,比如:加速度傳感器,陀螺儀傳感器,磁力傳感器,溫度傳感器等類(lèi)型。每種傳感器廠(chǎng)家都有各自的傳感器驅(qū)動(dòng)。

在產(chǎn)品開(kāi)發(fā)時(shí)就需要對(duì)不同廠(chǎng)家或者同一廠(chǎng)家的不同型號(hào)進(jìn)行適配開(kāi)發(fā),就會(huì)增加開(kāi)發(fā)者的開(kāi)發(fā)難度。為了快速開(kāi)發(fā)或者移植傳感器驅(qū)動(dòng),基于HDF(Hardware Driver Foundation)驅(qū)動(dòng)框架開(kāi)發(fā)了Sensor(傳感器)驅(qū)動(dòng)模型。Sensor驅(qū)動(dòng)模型主要為上層提供穩(wěn)定接口能力,對(duì)驅(qū)動(dòng)開(kāi)發(fā)者提供開(kāi)放的接口實(shí)現(xiàn)和抽象的配置接口能力。

傳感器模型框架介紹

Sensor設(shè)備作為外接設(shè)備重要組成模塊,Sensor驅(qū)動(dòng)模型為上層Sensor服務(wù)系統(tǒng)提供穩(wěn)定的Sensor基礎(chǔ)能力接口,包括Sensor列表查詢(xún)、Sensor啟停、Sensor訂閱及去訂閱,Sensor參數(shù)配置等功能。傳感器驅(qū)動(dòng)模型總體框架如圖1所示。

995711cc-10b0-11ec-8fb8-12bb97331649.png

圖1 傳感器驅(qū)動(dòng)模型總體框架圖

Sensor驅(qū)動(dòng)抽象模型主要位于OpenHarmony軟件的HAL層,其核心包括三個(gè)子模塊:

1)Sensor HDI子模塊:提供Sensor南向的標(biāo)準(zhǔn)接口定義和實(shí)現(xiàn)。

2)Sensor設(shè)備管理和通用配置子模塊:提供Sensor設(shè)備管理,Sensor通用配置能力,Sensor通用數(shù)據(jù)解析能力。

3)Sensor器件驅(qū)動(dòng)子模塊:提供Sensor器件通用驅(qū)動(dòng)和差異化驅(qū)動(dòng)實(shí)現(xiàn)。

傳感器設(shè)備驅(qū)動(dòng)模型介紹

Sensor設(shè)備作為外接設(shè)備重要組成模塊,通過(guò)Sensor驅(qū)動(dòng)模型屏蔽硬件器件差異,為上層Sensor服務(wù)系統(tǒng)提供穩(wěn)定的Sensor基礎(chǔ)能力接口,包括Sensor列表查詢(xún)、Sensor啟停、Sensor訂閱及取消訂閱,Sensor參數(shù)配置等功能;

Sensor設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)是基于HDF驅(qū)動(dòng)框架基礎(chǔ)上,結(jié)合操作系統(tǒng)適配層(OSAL)和平臺(tái)驅(qū)動(dòng)接口(比如I2C/SPI/UART總線(xiàn)等平臺(tái)資源)能力,屏蔽不同操作系統(tǒng)和平臺(tái)總線(xiàn)資源差異,實(shí)現(xiàn)Sensor驅(qū)動(dòng)“一次開(kāi)發(fā),多系統(tǒng)部署”的目標(biāo)。傳感器設(shè)備驅(qū)動(dòng)模型框圖如圖2。

9978315e-10b0-11ec-8fb8-12bb97331649.png

圖2 傳感器驅(qū)動(dòng)模型框圖

Sensor驅(qū)動(dòng)模型作為HDF框架中一個(gè)Device Host(驅(qū)動(dòng)宿主),完成對(duì)Sensor設(shè)備管理,包括Sensor驅(qū)動(dòng)加載,注冊(cè),卸載,綁定,配置管理,接口發(fā)布。

Sensor驅(qū)動(dòng)模型主要包括Sensor HDI子模塊,Sensor設(shè)備管理和通用配置子模塊和Sensor器件驅(qū)動(dòng)子模塊。Sensor HDI子模塊抽象出Sensor設(shè)備的基本能力Sensor列表查詢(xún)、Sensor啟停、Sensor訂閱及取消訂閱,Sensor參數(shù)配置接口,接口和類(lèi)型定義參考sensor_if.h和sensor_type.h。

Sensor設(shè)備管理和通用配置子模塊,其中,Sensor設(shè)備管理完成Sensor設(shè)備的注冊(cè)、管理能力,數(shù)據(jù)報(bào)告能力,接口定義參考sensor_device_if.h;通用配置子模塊完成寄存器配置操作接口抽象,Sensor HCS通用配置解析能力,接口定義參考sensor_config_parser.h、sensor_config_controller.h。Sensor器件驅(qū)動(dòng)子模塊完成每類(lèi)Sensor類(lèi)型驅(qū)動(dòng)的抽象和器件差異化驅(qū)動(dòng)實(shí)現(xiàn)。

傳感器驅(qū)動(dòng)模型工作流程解析

通過(guò)介紹Sensor驅(qū)動(dòng)模型的加載以及運(yùn)行流程,對(duì)模型內(nèi)部關(guān)鍵組件以及關(guān)聯(lián)組件之間的關(guān)系進(jìn)行了劃分,整體加載流程如圖3。

998856d8-10b0-11ec-8fb8-12bb97331649.png

圖3 Sensor驅(qū)動(dòng)模型運(yùn)行圖

Sensor驅(qū)動(dòng)模型以標(biāo)準(zhǔn)系統(tǒng)Hi3516DV300產(chǎn)品中的加速度計(jì)驅(qū)動(dòng)為例,介紹整個(gè)驅(qū)動(dòng)加載及運(yùn)行流程為:

1)從device info HCS 的Sensor Host里讀取Sensor設(shè)備管理配置信息。

2)HDF配置框架從HCB數(shù)據(jù)庫(kù)解析Sensor設(shè)備管理配置信息,并關(guān)聯(lián)到對(duì)應(yīng)設(shè)備驅(qū)動(dòng)。

3)加載并初始化Sensor設(shè)備管理驅(qū)動(dòng)。

4)Sensor設(shè)備管理驅(qū)動(dòng)向HDI發(fā)布Sensor基礎(chǔ)能力接口。

5)從device info HCS 的Sensor Host里讀取加速度計(jì)驅(qū)動(dòng)配置信息。

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

7)從accel_xxx_config HCS里讀取加速度器件差異化驅(qū)動(dòng)配置和私有化配置信息。

8)加速度計(jì)差異化驅(qū)動(dòng),調(diào)用通用配置解析接口,完成器件屬性信息解析,器件寄存器解析。

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

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

為了讓開(kāi)發(fā)者更清晰的了解Sensor驅(qū)動(dòng)模型工作流程,本節(jié)將對(duì)Sensor驅(qū)動(dòng)模型加載的關(guān)鍵流程代碼進(jìn)行說(shuō)明。

Sensor設(shè)備管理驅(qū)動(dòng)實(shí)現(xiàn)

HDF驅(qū)動(dòng)框架從device info HCS 的Sensor Host里讀取Sensor設(shè)備管理配置信息,加載并初始化Sensor設(shè)備管理驅(qū)動(dòng)。

步驟1-步驟4實(shí)現(xiàn)關(guān)鍵代碼介紹如下,參考完整代碼實(shí)現(xiàn)路徑driversframeworkmodelsensordrivercommonsrcsensor_device_manager.c。

定義Sensor設(shè)備管理驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中Driver Entry入口函數(shù)定義如下:

struct HdfDriverEntry g_sensorDevManagerEntry = { .moduleVersion = 1, .moduleName = “HDF_SENSOR_MGR_AP”, // 值與設(shè)備信息HCS中的moduleName一樣 .Bind = BindSensorDevManager, .Init = InitSensorDevManager, .Release = ReleaseSensorDevManager,};

Sensor設(shè)備管理模塊負(fù)責(zé)系統(tǒng)中所有Sensor器件接口發(fā)布,在系統(tǒng)啟動(dòng)過(guò)程中,HDF框架機(jī)制通過(guò)Sensor Host里設(shè)備HCS配置信息,加載設(shè)備管理驅(qū)動(dòng)。

// Sensor host配置包含所有Sensor器件設(shè)備信息sensor :: host { hostName = “sensor_host”; // host 名字 device_sensor_manager :: device { // Sensor管理設(shè)備信息 device0 :: deviceNode { policy = 1; // 發(fā)布策略,1表示對(duì)內(nèi)核態(tài)發(fā)布,2表示對(duì)用戶(hù)態(tài)和內(nèi)核態(tài)發(fā)布 priority = 100; // device的加載優(yōu)先級(jí),同一host內(nèi)有效,值越小優(yōu)先級(jí)越高 preload = 0; // 設(shè)備驅(qū)動(dòng)是否加載標(biāo)志,0表示加載,2表示不加載 permission = 0664; // 驅(qū)動(dòng)設(shè)備節(jié)點(diǎn)權(quán)限 moduleName = “HDF_SENSOR_MGR_AP”; // 驅(qū)動(dòng)名稱(chēng),該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName值一致 serviceName = “hdf_sensor_manager_ap”;// 驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱(chēng),必須唯一 } }}

Sensor設(shè)備管理驅(qū)動(dòng)DispatchSensor接口完成Sensor設(shè)備對(duì)外能力的發(fā)布,DispatchSensor接口實(shí)現(xiàn)如下:

static int32_t DispatchSensor(struct HdfDeviceIoClient *client, int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply){…… DLIST_FOR_EACH_ENTRY(pos, &manager-》sensorDevInfoHead, struct SensorDevInfoNode, node) { if (sensorId == pos-》devInfo.sensorInfo.sensorId) { // Dispatch函數(shù)處理Sensor對(duì)外發(fā)布的接口能力 ret = DispatchCmdHandle(&pos-》devInfo, data, reply); (void)OsalMutexUnlock(&manager-》mutex); return ret; } }…… return HDF_FAILURE;}int32_t BindSensorDevManager(struct HdfDeviceObject *device){ CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM);……// 通過(guò)ioService.Dispatch注冊(cè)Sensor對(duì)外接口能力 manager-》ioService.Dispatch = DispatchSensor; manager-》device = device; device-》service = &manager-》ioService; g_sensorDeviceManager = manager; return HDF_SUCCESS;}

加速度計(jì)抽象驅(qū)動(dòng)實(shí)現(xiàn)HDF驅(qū)動(dòng)框架從device info HCS 的Sensor Host里讀取加速度計(jì)抽象驅(qū)動(dòng)配置信息,加載并初始化加速度計(jì)抽象驅(qū)動(dòng),完成Sensor器件驅(qū)動(dòng)資源分配和數(shù)據(jù)處理隊(duì)列創(chuàng)建。

步驟5-步驟6實(shí)現(xiàn)關(guān)鍵代碼介紹如下,參考完整代碼實(shí)現(xiàn)路徑driversframeworkmodelsensordriveraccelsensor_accel_driver.c。

定義加速度計(jì)抽象驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中,Driver Entry入口函數(shù)定義如下:

struct HdfDriverEntry g_sensorAccelDevEntry = { .moduleVersion = 1, .moduleName = “HDF_SENSOR_ACCEL”, // 值與設(shè)備信息HCS中的moduleName一樣 .Bind = AccelBindDriver, .Init = AccelInitDriver, .Release = AccelReleaseDriver,};

加速度計(jì)抽象驅(qū)動(dòng)的配置信息在Sensor Host定義如下:

// Sensor Host配置包含所有Sensor器件設(shè)備信息sensor :: host { hostName = “sensor_host”; // host 名字 device_sensor_accel :: device { // Sensor管理設(shè)備信息 device0 :: deviceNode { policy = 1; // 發(fā)布策略,1表示對(duì)內(nèi)核態(tài)發(fā)布服務(wù),2表示對(duì)用戶(hù)態(tài)和內(nèi)核態(tài)發(fā)布 priority = 110; // device的加載優(yōu)先級(jí),同一host內(nèi)有效,值越小優(yōu)先級(jí)越高 preload = 0; // 設(shè)備驅(qū)動(dòng)是否加載標(biāo)志,0表示加載,2表示不加載 permission = 0664; // 驅(qū)動(dòng)設(shè)備節(jié)點(diǎn)權(quán)限 moduleName = “HDF_SENSOR_ACCEL”; // 驅(qū)動(dòng)名稱(chēng),該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName值一致 serviceName = “hdf_sensor_accel”;// 驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱(chēng),必須唯一 } }}

不同型號(hào)的加速度器件在初始化時(shí),會(huì)進(jìn)行器件探測(cè),探測(cè)器件是否在位,如果在位,會(huì)對(duì)加速度器件分配資源,用于存放器件HCS配置信息。加速度計(jì)抽象驅(qū)動(dòng)提供初始化過(guò)程中器件探測(cè),器件屬性配置,寄存器配置資源分配和釋放接口。

1、創(chuàng)建加速度配置數(shù)據(jù)接口

此接口在差異化器件驅(qū)動(dòng)初始化時(shí)調(diào)用,解析器件HCS私有配置,讀取sensor的基本信息,總線(xiàn)方式,器件探測(cè)寄存器,并校驗(yàn)器件是否在位。如果器件探測(cè)成功,完成加速度器件資源分配,并返回傳感器配置數(shù)據(jù)結(jié)構(gòu)體地址。

struct SensorCfgData *AccelCreateCfgData(const struct DeviceResourceNode *node){ struct AccelDrvData *drvData = AccelGetDrvData();…… // 器件是否已經(jīng)探測(cè)成功 if (drvData-》detectFlag) { HDF_LOGE(“%s: Accel sensor have detected”, __func__); return NULL; }…… // 解析器件HCS私有配置,讀取sensor的基本信息,總線(xiàn)方式,器件探測(cè)寄存器。 if (GetSensorBaseConfigData(node, drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGE(“%s: Get sensor base config failed”, __func__); goto BASE_CONFIG_EXIT; } // 器件探測(cè)并校驗(yàn)器件是否在位 if (DetectSensorDevice(drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGI(“%s: Accel sensor detect device no exist”, __func__); drvData-》detectFlag = false; goto BASE_CONFIG_EXIT; } // 器件在位,繼續(xù)解析剩余HCS寄存器配置。 drvData-》detectFlag = true; if (InitAccelAfterDetected(drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGE(“%s: Accel sensor detect device no exist”, __func__); goto INIT_EXIT; } return drvData-》accelCfg;……}

2、釋放加速度配置數(shù)據(jù)接口

此接口在差異化器件驅(qū)動(dòng)初始化失敗,或者加速度抽象驅(qū)動(dòng)卸載時(shí)調(diào)用,釋放已分配的資源。

void AccelReleaseCfgData(struct SensorCfgData *accelCfg){ CHECK_NULL_PTR_RETURN(accelCfg); (void)DeleteSensorDevice(&accelCfg-》sensorInfo); ReleaseSensorAllRegConfig(accelCfg); (void)ReleaseSensorBusHandle(&accelCfg-》busCfg); 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-》sensorAttr, sizeof(struct SensorAttr), 0, sizeof(struct SensorAttr));}

3、注冊(cè)加速度差異化接口

此接口在差異化器件驅(qū)動(dòng)初始化成功時(shí),注冊(cè)差異實(shí)現(xiàn)接口,方便實(shí)現(xiàn)器件差異的驅(qū)動(dòng)接口,此接口支持?jǐn)U展。

int32_t AccelRegisterChipOps(const struct AccelOpsCall *ops){ struct AccelDrvData *drvData = AccelGetDrvData();…… drvData-》ops.Init = NULL; drvData-》ops.ReadData = ops-》ReadData; return HDF_SUCCESS;}

加速度計(jì)差異化驅(qū)動(dòng)實(shí)現(xiàn)

加速度計(jì)差異化驅(qū)動(dòng)主要實(shí)現(xiàn)因?yàn)槠骷町悷o(wú)法通過(guò)加速度計(jì)HCS差異化配置文件實(shí)現(xiàn)的能力接口。HDF驅(qū)動(dòng)框架從device info HCS 的Sensor Host里讀取加速度計(jì)差異化驅(qū)動(dòng)配置信息,加載并初始化加速度計(jì)抽象驅(qū)動(dòng),完成器件探測(cè),并分配加速度傳感器配置資源,完成加速度計(jì)差異化接口注冊(cè)。另外,初始化過(guò)程中會(huì)從accel_xxx_config HCS里讀取私有化配置信息。

步驟7-步驟9實(shí)現(xiàn)關(guān)鍵代碼介紹如下,參考完整代碼實(shí)現(xiàn)路徑driversframeworkmodelsensordriveraccelsensor_accel_driver.c。

定義加速度計(jì)差異化驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中,Driver Entry入口函數(shù)定義如下:

struct HdfDriverEntry g_accelBmi160DevEntry = { .moduleVersion = 1, .moduleName = “HDF_SENSOR_ACCEL_BMI160”, // 值與設(shè)備信息HCS中的moduleName一樣 .Bind = Bmi160BindDriver, .Init = Bmi160InitDriver, .Release = Bmi160ReleaseDriver,

加速度計(jì)差異化驅(qū)動(dòng)的配置信息在Sensor Host定義如下:

// Sensor Host配置包含所有Sensor器件設(shè)備信息sensor :: host { hostName = “sensor_host”; // host 名字 device_sensor_accel :: device { // Sensor管理設(shè)備信息 device0 :: deviceNode { policy = 1; // 發(fā)布策略,1表示對(duì)內(nèi)核態(tài)發(fā)布 priority = 120; // device的加載優(yōu)先級(jí),同一host內(nèi)有效,值越小優(yōu)先級(jí)越高 preload = 0; // 設(shè)備驅(qū)動(dòng)是否加載標(biāo)志,0表示加載,2表示不加載 permission = 0664; // 驅(qū)動(dòng)設(shè)備節(jié)點(diǎn)權(quán)限 moduleName = “HDF_SENSOR_ACCEL_BMI160”; // 驅(qū)動(dòng)名稱(chēng),該字段的值必須和驅(qū)動(dòng)入口結(jié)構(gòu)的moduleName值一致 serviceName = “hdf_accel_bmi160”;// 驅(qū)動(dòng)對(duì)外發(fā)布服務(wù)的名稱(chēng),必須唯一 deviceMatchAttr = “hdf_sensor_accel_bmi160_driver”; } }}

加速度計(jì)私有化配置信息主要包括總線(xiàn)信息,sensor信息,sensor寄存器等資源信息。加速度計(jì)私有化配置信息在如下路徑vendorhisiliconHi3516DV300hdf_configkhdfsensoraccelaccel_bmi160_config.hcs。

為了方面開(kāi)發(fā)者使用傳感器HCS私有配置,在sensor_common.hcs里面定義通用的傳感器配置模板,其他器件直接引用模板修改對(duì)應(yīng)的屬性值,如果需要新增功能,可以在私有的配置文件里擴(kuò)展新的節(jié)點(diǎn)即可。

// accel sensor common config templateroot { sensorConfig { template sensorInfo { //在注冊(cè)設(shè)備時(shí)需要解析傳感器配置信息 sensorName = “accelerometer”; // 器件名字 vendorName = “vendor_xxx”; // 器件廠(chǎng)商名字 firmwareVersion = “1.0”;// 固件版本 hardwareVersion = “1.0”;// 硬件版本 sensorTypeId = 1; // 傳感器設(shè)備注冊(cè)時(shí)定義的類(lèi)型,必須是系統(tǒng)定義類(lèi)型enum SensorTypeTag sensorId = 1; // 用戶(hù)自定義傳感器ID,兼容不同廠(chǎng)商定義,ID值要求全局唯一,無(wú)特殊要求默認(rèn)和sensorTypeId保持一致,設(shè)備訪(fǎng)問(wèn)時(shí)采用SensorId作為系統(tǒng)中器件唯一標(biāo)識(shí) maxRange = 0; // 最大量程,根據(jù)器件需要定義 accuracy = 0; // 精度值,根據(jù)器件需要定義 power = 0; // 功耗(uA),根據(jù)器件需要定義 } template sensorBusConfig { // 器件支持的總線(xiàn)信息 busType = 0; // 0:i2c 1:spi busNum = 6; // 總線(xiàn)號(hào) busAddr = 0; // 總線(xiàn)地址 regWidth = 1;// 數(shù)據(jù)寬度 regBigEndian = 0;// 字節(jié)序 } template sensorAttr { chipName = “”;// 器件名字 chipIdRegister = 0xf;// 器件探測(cè)地址 chipIdValue = 0xd1;// 器件探測(cè)校驗(yàn)值 } }}

每個(gè)Sensor器件都要根據(jù)業(yè)務(wù)需求增加或者修改對(duì)應(yīng)的Sensor 寄存器分組以滿(mǎn)足器件業(yè)務(wù)需求,當(dāng)前基本業(yè)務(wù)分組如下:

enum SensorRegOpsType { SENSOR_INIT_GROUP = 0, // 初始寄存器組 SENSOR_ENABLE_GROUP, // 使能寄存器組 SENSOR_DISABLE_GROUP, // 去使能寄存器組 SENSOR_GROUP_MAX, };

通用配置子模塊提供寄存器配置操作和HCS通用配置解析接口。驅(qū)動(dòng)開(kāi)發(fā)者基于通用Sensor HCS配置模板實(shí)現(xiàn)的HCS,無(wú)需實(shí)現(xiàn)解析接口,直接調(diào)用如下抽象接口解析即可。

1、傳感器設(shè)備HCS抽象接口

Sensor器件驅(qū)動(dòng)模型提供設(shè)備資源通用接口,解析配置文件中的通用節(jié)點(diǎn)信息。配置接口會(huì)在驅(qū)動(dòng)加載過(guò)程中初始化的兩個(gè)階段調(diào)用,第一個(gè)階段調(diào)用GetSensorBaseConfigData接口,解析設(shè)備資源HCS中的節(jié)點(diǎn)(sensorInfo,sensorBusConfig,sensorAttr)信息。

第二個(gè)階段在Sensor器件探測(cè)成功之后,調(diào)用ParseSensorRegConfig接口,解析Sensor寄存器配置信息。最后器件驅(qū)動(dòng)卸載時(shí)調(diào)用ReleaseSensorAllRegConfig接口釋放所有配置資源。接口定義在sensor_config_parser.h文件。

傳感器基本配置數(shù)據(jù)解析接口函數(shù)定義int32_t GetSensorBaseConfigData(const struct DeviceResourceNode *node, struct SensorCfgData *config);傳感器寄存器配置數(shù)據(jù)解析接口函數(shù)定義int32_t ParseSensorRegConfig(struct SensorCfgData *config);釋放傳感器所有配置數(shù)據(jù)接口函數(shù)定義void ReleaseSensorAllRegConfig(struct SensorCfgData *config);傳感器器件探測(cè)在位接口int32_t DetectSensorDevice(struct SensorCfgData *config);

2、傳感器讀寫(xiě)寄存器接口

器件驅(qū)動(dòng)開(kāi)發(fā)時(shí),需要用到不同總線(xiàn)接口,配置器件。由于不同操作系統(tǒng)或者平臺(tái),總線(xiàn)接口總是有差異,導(dǎo)致開(kāi)發(fā)過(guò)程中,需要不斷地進(jìn)行適配修改。傳感器驅(qū)動(dòng)模型依賴(lài)HDF框架提供的平臺(tái)接口能力,封裝了傳感器器讀寫(xiě)設(shè)備的接口,支持的總線(xiàn)有I2C,SPI接口。

讀傳感器寄存器接口函數(shù)定義int32_t ReadSensor(struct SensorBusCfg *busCfg, uint16_t regAddr, uint8_t *data, uint16_t dataLen);讀傳感器寄存器接口函數(shù)定義int32_t WriteSensor(struct SensorBusCfg *busCfg, uint8_t *writeData, uint16_t len);

Sensor設(shè)備管理能力接口

加速度器件探測(cè)成功之后,加速度差異化驅(qū)動(dòng)通知加速度抽象驅(qū)動(dòng),注冊(cè)加速度設(shè)備到Sensor設(shè)備管理中,對(duì)應(yīng)步驟10。Sensor設(shè)備管理模塊還提供如下接口能力:

1、注冊(cè)設(shè)備

設(shè)備注冊(cè)接口AddSensorDevice把加速度計(jì)設(shè)備信息注冊(cè)到Sensor設(shè)備管理模塊。調(diào)用注冊(cè)設(shè)備函數(shù)時(shí),系統(tǒng)要求sensorTpyeId和sensorId全局唯一,并實(shí)現(xiàn)Sensor信息和Sensor接口,才能確保Sensor設(shè)備注冊(cè)成功。

struct SensorOps { int32_t (*Enable)(void); // 使能傳感器 int32_t (*Disable)(void);// 使能傳感器 int32_t (*SetBatch)(int64_t samplingInterval, int64_t reportInterval);// 配置傳感器采樣率和上報(bào)時(shí)延 int32_t (*SetMode)(int32_t mode);// 配置傳感器模式 int32_t (*SetOption)(uint32_t option);// 配置傳感器可選項(xiàng)參數(shù)};struct SensorDeviceInfo { struct SensorBasicInfo sensorInfo; // 傳感器信息,包括傳感器名字,廠(chǎng)商名,傳感類(lèi)型ID,傳感ID等信息

注冊(cè)設(shè)備接口函數(shù)定義如下:

int32_t AddSensorDevice(const struct SensorDeviceInfo *deviceInfo);

2、刪除設(shè)備

設(shè)備注冊(cè)失敗或者驅(qū)動(dòng)需要卸載時(shí),需要?jiǎng)h除注冊(cè)到Sensor設(shè)備管理里的設(shè)備信息。調(diào)用DeleteSensorDevice接口完成設(shè)備信息的刪除。

int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo);

3、設(shè)備數(shù)據(jù)報(bào)告

Sensor設(shè)備管理模塊提供了抽象的數(shù)據(jù)上報(bào)接口,器件驅(qū)動(dòng)產(chǎn)生數(shù)據(jù)事件后,調(diào)用ReportSensorEvent接口,把數(shù)據(jù)事件上報(bào)給Sensor服務(wù)端

上報(bào)數(shù)據(jù)事件格式定義如下:

// 傳感器數(shù)據(jù)上報(bào)事件struct SensorReportEvent { int32_t sensorId; // 用戶(hù)自定義傳感器ID,兼容不同廠(chǎng)商定義,ID值要求全局唯一,無(wú)特殊要求默認(rèn)和sensorTypeId保持一致,設(shè)備訪(fǎng)問(wèn)時(shí)采用SensorId作為系統(tǒng)中器件唯一標(biāo)識(shí) int32_t version; // 傳感器版本號(hào),有HAL層定義 int64_t timestamp; // 采樣數(shù)據(jù)產(chǎn)生時(shí)的時(shí)間戳 uint32_t option; // 傳感器可選配置,如量程,精度 int32_t mode; // 傳感器數(shù)據(jù)上報(bào)模式 uint8_t *data; // 采樣數(shù)據(jù),根據(jù)器件特性定義傳感器數(shù)據(jù)格式和單位,此數(shù)據(jù)可以是一組采樣數(shù)據(jù)或者多組采樣數(shù)據(jù) uint32_t dataLen; // 采樣數(shù)據(jù)存儲(chǔ)長(zhǎng)度

數(shù)據(jù)事件上報(bào)接口函數(shù)定義如下:

int32_t ReportSensorEvent(const struct SensorReportEvent *events);

對(duì)于Sensor驅(qū)動(dòng)模型來(lái)說(shuō),已經(jīng)實(shí)現(xiàn)了Sensor HDI接口定義,設(shè)備管理驅(qū)動(dòng)和通用配置解析接口,及一些平臺(tái)無(wú)關(guān)的讀寫(xiě)寄存的接口能力,驅(qū)動(dòng)開(kāi)發(fā)者新增一款傳感器器件,只需要實(shí)現(xiàn)文件里struct SensorOps結(jié)構(gòu)體定義接口,并調(diào)用AddSensorDevice接口添加。

傳感器驅(qū)動(dòng)開(kāi)發(fā)指導(dǎo)

本示例介紹新開(kāi)發(fā)一款加速度BMI160器件傳感器驅(qū)動(dòng)的實(shí)現(xiàn)步驟為例。設(shè)備的通訊方式采用I2C總線(xiàn)方式。

加速計(jì)傳感器驅(qū)動(dòng)開(kāi)發(fā)主要包括兩個(gè)部分:加速度抽象驅(qū)動(dòng)和加速度差異化驅(qū)動(dòng)。

1)基于HDF驅(qū)動(dòng)框架,按照驅(qū)動(dòng)Driver Entry程序,完成加速度抽象驅(qū)動(dòng)開(kāi)發(fā),主要有Bind,Init,Release,Dispatch函數(shù)接口實(shí)現(xiàn)。

2)完成加速度傳感器驅(qū)動(dòng)的設(shè)備信息配置。

3)完成加速度抽象驅(qū)動(dòng)內(nèi)部接口開(kāi)發(fā),包括定時(shí)器,工作隊(duì)列,Enable,Disable,SetBatch,SetMode,SetOption,AccelCreateCfgData,AccelReleaseCfgData,AccelRegisterChipOps接口實(shí)現(xiàn)。

4)基于HDF驅(qū)動(dòng)框架,按照驅(qū)動(dòng)Driver Entry程序,完成加速度差異化驅(qū)動(dòng)開(kāi)發(fā),主要有Bind,Init,Release,Dispatch函數(shù)接口實(shí)現(xiàn)。

5)完成加速度傳感器差異化驅(qū)動(dòng)中差異化接口ReadData函數(shù)實(shí)現(xiàn)。

6)新增文件腳本適配。

加速度抽象驅(qū)動(dòng)實(shí)現(xiàn)示例

定義加速度抽象驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中Driver Entry入口函數(shù)定義如下:

struct HdfDriverEntry g_sensorAccelDevEntry = { .moduleVersion = 1, .moduleName = “HDF_SENSOR_ACCEL”, .Bind = BindAccelDriver, .Init = InitAccelDriver, .Release = ReleaseAccelDriver,};HDF_INIT(g_sensorAccelDevEntry);

Bind接口實(shí)現(xiàn)驅(qū)動(dòng)接口實(shí)例化,實(shí)現(xiàn)示例:

int32_t AccelBindDriver(struct HdfDeviceObject *device){ CHECK_NULL_PTR_RETURN_VALUE(device, HDF_ERR_INVALID_PARAM); // 私有數(shù)據(jù)分配資源 struct AccelDrvData *drvData = (struct AccelDrvData *)OsalMemCalloc(sizeof(*drvData)); …… // 需要發(fā)布接口函數(shù) drvData-》ioService.Dispatch = DispatchAccel; drvData-》device = device; device-》service = &drvData-》ioService; g_accelDrvData = drvData; return HDF_SUCCESS;}

Init接口實(shí)現(xiàn)驅(qū)動(dòng)接口實(shí)例化,實(shí)現(xiàn)示例:

int32_t AccelInitDriver(struct HdfDeviceObject *device){ …… // 工作隊(duì)列資源初始化 if (InitAccelData(drvData) != HDF_SUCCESS) { HDF_LOGE(“%s: Init accel config failed”, __func__); return HDF_FAILURE; } // 分配加速度配置信息資源 drvData-》accelCfg = (struct SensorCfgData *)OsalMemCalloc(sizeof(*drvData-》accelCfg)); if (drvData-》accelCfg == NULL) { HDF_LOGE(“%s: Malloc accel config data failed”, __func__); return HDF_FAILURE; } // 掛接寄存器分組信息 drvData-》accelCfg-》regCfgGroup = &g_regCfgGroup[0]; …… return HDF_SUCCESS;}

Release接口在驅(qū)動(dòng)卸載或者Init執(zhí)行失敗時(shí),會(huì)調(diào)用此接口釋放資源:

void AccelReleaseDriver(struct HdfDeviceObject *device){ CHECK_NULL_PTR_RETURN(device); struct AccelDrvData *drvData = (struct AccelDrvData *)device-》service; CHECK_NULL_PTR_RETURN(drvData); // 器件在位,釋放已分配資源 if (drvData-》detectFlag) { AccelReleaseCfgData(drvData-》accelCfg); } OsalMemFree(drvData-》accelCfg); drvData-》accelCfg = NULL; // 器件在位,銷(xiāo)毀工作隊(duì)列資源 HdfWorkDestroy(&drvData-》accelWork); HdfWorkQueueDestroy(&drvData-》accelWorkQueue); OsalMemFree(drvData);}

加速度抽象驅(qū)動(dòng)配置示例

加速度計(jì)設(shè)備配置信息在device_info.hcs文件Sensor_host里面,配置HCS文件在源碼倉(cāng)位置為

// accel器件設(shè)備信息device_sensor_accel :: device { device0 :: deviceNode { policy = 1; // 加速計(jì)直接注冊(cè)到sensor管理模塊,無(wú)需對(duì)用戶(hù)態(tài)發(fā)布 priority = 110; // 優(yōu)先級(jí)105低于Sensor管理模塊優(yōu)先級(jí)100 preload = 0; permission = 0664; moduleName = “HDF_SENSOR_ACCEL”;// 加速計(jì)驅(qū)動(dòng)名稱(chēng) serviceName = “sensor_accel”;// 加速計(jì)驅(qū)動(dòng)對(duì)外發(fā)布的服務(wù)名稱(chēng) deviceMatchAttr = “hdf_sensor_accel_driver”; // 驅(qū)動(dòng)私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動(dòng)私有數(shù)據(jù)配置表中的match_attr值相等 }}

vendorhisiliconHi3516DV300hdf_configkhdfdevice_infodevice_info.hcs:

加速度抽象驅(qū)動(dòng)內(nèi)部接口開(kāi)發(fā)實(shí)現(xiàn)示例

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

static int32_t InitAccelAfterDetected(struct SensorCfgData *config){ struct SensorDeviceInfo deviceInfo; CHECK_NULL_PTR_RETURN_VALUE(config, HDF_ERR_INVALID_PARAM); // 初始化加速度計(jì)接口函數(shù) if (InitAccelOps(config, &deviceInfo) != HDF_SUCCESS) { HDF_LOGE(“%s: Init accel ops failed”, __func__); return HDF_FAILURE; } // 注冊(cè)加速度計(jì)設(shè)備到傳感器管理模塊 if (AddSensorDevice(&deviceInfo) != HDF_SUCCESS) { HDF_LOGE(“%s: Add accel 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 *AccelCreateCfgData(const struct DeviceResourceNode *node){ …… // 如果探測(cè)不到器件在位,返回進(jìn)行下個(gè)器件探測(cè) if (drvData-》detectFlag) { HDF_LOGE(“%s: Accel sensor have detected”, __func__); return NULL; } if (drvData-》accelCfg == NULL) { HDF_LOGE(“%s: Accel accelCfg pointer NULL”, __func__); return NULL; } // 設(shè)備基本配置信息解析 if (GetSensorBaseConfigData(node, drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGE(“%s: Get sensor base config failed”, __func__); goto BASE_CONFIG_EXIT; } // 如果探測(cè)不到器件在位,返回進(jìn)行下個(gè)器件探測(cè) if (DetectSensorDevice(drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGI(“%s: Accel sensor detect device no exist”, __func__); drvData-》detectFlag = false; goto BASE_CONFIG_EXIT; } drvData-》detectFlag = true; // 器件寄存器解析 if (InitAccelAfterDetected(drvData-》accelCfg) != HDF_SUCCESS) { HDF_LOGE(“%s: Accel sensor detect device no exist”, __func__); goto INIT_EXIT; } return drvData-》accelCfg; ……}

加速度計(jì)差異化驅(qū)動(dòng)實(shí)現(xiàn)示例

定義加速度差異化驅(qū)動(dòng)對(duì)應(yīng)的HdfDriverEntry對(duì)象,其中Driver Entry入口函數(shù)定義如下:

struct HdfDriverEntry g_accelBmi160DevEntry = { .moduleVersion = 1, .moduleName = “HDF_SENSOR_ACCEL_BMI160”, .Bind = Bmi160BindDriver, .Init = Bmi160InitDriver, .Release = Bmi160ReleaseDriver,};HDF_INIT(g_accelBmi160DevEntry);

Bind驅(qū)動(dòng)接口實(shí)例化,實(shí)現(xiàn)示例:

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

Init驅(qū)動(dòng)接口實(shí)例化,實(shí)現(xiàn)示例:

int32_t Bmi160InitDriver(struct HdfDeviceObject *device){ …… // 加速度計(jì)差異化初始化配置 ret = InitAccelPreConfig(); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: Init BMI160 bus mux config”, __func__); return HDF_FAILURE; } // 創(chuàng)建傳感器配置數(shù)據(jù)接口,完成器件探測(cè),私有數(shù)據(jù)配置解析 drvData-》sensorCfg = AccelCreateCfgData(device-》property); if (drvData-》sensorCfg == NULL) { return HDF_ERR_NOT_SUPPORT; } // 注冊(cè)差異化接口 ops.Init = NULL; ops.ReadData = ReadBmi160Data; ret = AccelRegisterChipOps(&ops); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: Register BMI160 accel failed”, __func__); return HDF_FAILURE; } // 初始化器件配置 ret = InitBmi160(drvData-》sensorCfg); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: Init BMI160 accel failed”, __func__); return HDF_FAILURE; } return HDF_SUCCESS;}

Release驅(qū)動(dòng)接口實(shí)例化,實(shí)現(xiàn)示例:

void Bmi160ReleaseDriver(struct HdfDeviceObject *device){ CHECK_NULL_PTR_RETURN(device); struct Bmi160DrvData *drvData = (struct Bmi160DrvData *)device-》service; CHECK_NULL_PTR_RETURN(drvData); AccelReleaseCfgData(drvData-》sensorCfg); drvData-》sensorCfg = NULL; OsalMemFree(drvData);}

加速度計(jì)差異化驅(qū)動(dòng)私有HCS配置實(shí)現(xiàn)示例

加速度計(jì)器件私有HCS配置在如下路徑vendorhisiliconHi3516DV300hdf_configkhdfsensoraccelaccel_bmi160_config.hcs。為了方面開(kāi)發(fā)者使用傳感器HCS配置,在accel_config.hcs里面配置通用的傳感器模板,加速度計(jì)器件直接引用模板并修改對(duì)應(yīng)的屬性值,在此基礎(chǔ)上新增寄存器配置,生成accel_bmi160_config.hcs配置文件。

#include “accel_config.hcs”root { accel_bmi160_chip_config : sensorConfig { match_attr = “hdf_sensor_accel_bmi160_driver”; sensorInfo :: sensorDeviceInfo { vendorName = “borsh_bmi160”; // max string length is 16 bytes sensorTypeId = 1; // enum SensorTypeTag sensorId = 1; // user define sensor id } sensorBusConfig:: sensorBusInfo { busType = 0; // 0:i2c 1:spi busNum = 6; busAddr = 0x68; regWidth = 1; // 1btye } sensorIdAttr :: sensorIdInfo{ chipName = “bmi160”; chipIdRegister = 0x00; chipIdValue = 0xd1; } 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 = [ 0x7e, 0xb6, 0xff, 1, 5, 2, 0, 0, 0, 0, 0x7e, 0x10, 0xff, 1, 5, 2, 0, 0, 0, 0 ]; // 使能寄存器組 enableSeqConfig = [ 0x7e, 0x11, 0xff, 1, 5, 2, 0, 0, 0, 0, 0x41, 0x03, 0xff, 1, 0, 2, 0, 0, 0, 0, 0x40, 0x08, 0xff, 1, 0, 2, 0, 0, 0, 0 ]; // 去使能寄存器組 disableSeqConfig = [ 0x7e, 0x10, 0xff, 1, 5, 2, 0, 0, 0, 0 ]; } }}

加速度計(jì)差異化函數(shù)接口實(shí)現(xiàn)示例

需要開(kāi)發(fā)者實(shí)現(xiàn)的ReadBmi160Data接口函數(shù),在Bmi160InitDriver函數(shù)里面注冊(cè)此函數(shù)。

int32_t ReadBmi160Data(struct SensorCfgData *data){ int32_t ret; struct AccelData rawData = { 0, 0, 0 }; int32_t tmp[ACCEL_AXIS_NUM]; struct SensorReportEvent event; (void)memset_s(&event, sizeof(event), 0, sizeof(event)); ret = ReadBmi160RawData(data, &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; …… ret = ReportSensorEvent(&event); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: BMI160 report data failed”, __func__); } return ret;}

適配編譯入口示例

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

標(biāo)準(zhǔn)系統(tǒng)Linux內(nèi)核加速度模塊配置宏定義CONFIG_DRIVERS_HDF_SENSOR_ACCEL、CONFIG_DRIVERS_HDF_SENSOR_ACCEL_BMI160在kernel/linux/config/linux-4.19/arch/arm/configs/hi3516dv300_standard_defconfig文件,若開(kāi)啟模塊則CONFIG_DRIVERS_HDF_SENSOR_ACCEL=y,

SENSOR_ROOT_DIR = 。。/。。/。。/。。/。。/framework/model/sensor/driverobj-$(CONFIG_DRIVERS_HDF_SENSOR) += $(SENSOR_ROOT_DIR)/common/src/sensor_config_controller.o $(SENSOR_ROOT_DIR)/common/src/sensor_config_parser.o $(SENSOR_ROOT_DIR)/common/src/sensor_device_manager.o $(SENSOR_ROOT_DIR)/common/src/sensor_platform_if.o obj-$(CONFIG_DRIVERS_HDF_SENSOR_ACCEL) += $(SENSOR_ROOT_DIR)/accel/sensor_accel_driver.oobj-$(CONFIG_DRIVERS_HDF_SENSOR_ACCEL_BMI160) += $(SENSOR_ROOT_DIR)/chipset/accel/accel_bmi160.occflags-y += -Idrivers/hdf/framework/model/sensor/driver/include -Idrivers/hdf/framework/model/sensor/driver/common/include -Idrivers/hdf/framework/model/sensor/driver/chipset/accel -Idrivers/hdf/framework/model/sensor/driver/accel -Idrivers/hdf/framework/include/core -Idrivers/hdf/framework/core/common/include/host -Idrivers/hdf/framework/include/utils -Idrivers/hdf/framework/include/osal -Idrivers/hdf/framework/ability/sbuf/include -Idrivers/hdf/framework/include/platform -Idrivers/hdf/framework/include/config -Idrivers/hdf/khdf/osal/include -I$(PROJECT_ROOT)/third_party/bounds_checking_function/include

CONFIG_DRIVERS_HDF_SENSOR_ACCEL_BMI160=y,若關(guān)閉模塊則刪除宏即可。

Makefile腳本入口在drivers/adapter/khdf路徑下,根據(jù)不同操作系統(tǒng)選擇不同目錄,以標(biāo)準(zhǔn)系統(tǒng)為例說(shuō)明腳本適配步驟,腳本路徑如下/drivers/adapter/khdf/linux/model/sensor/Makefile。

總結(jié)

本文主要和大家分享傳感器驅(qū)動(dòng)模型,重點(diǎn)分析傳感驅(qū)動(dòng)模型框架原理和傳感器抽象驅(qū)動(dòng)適配開(kāi)發(fā)過(guò)程。以開(kāi)源板Hi3516DV300標(biāo)準(zhǔn)系統(tǒng)版本加速度計(jì)為例進(jìn)行了詳細(xì)的代碼說(shuō)明,希望通過(guò)本文檔您能初步掌握基于HDF框架的傳感器設(shè)備的開(kāi)發(fā)步驟與流程。關(guān)于傳感器驅(qū)動(dòng)框架的更多分析,請(qǐng)關(guān)注后續(xù)文章。

代碼參考原文鏈接:傳送門(mén)

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2565

    文章

    52954

    瀏覽量

    766996
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8993

    瀏覽量

    153685
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3298

    瀏覽量

    118808
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64803
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3851

    瀏覽量

    18562

原文標(biāo)題:OpenHarmony HDF傳感器設(shè)備驅(qū)動(dòng)模型分析與使用

文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    選擇溫度傳感器的考慮因素

    溫度傳感器在眾多應(yīng)用場(chǎng)景中扮演著重要角色,包括消費(fèi)電子產(chǎn)品、環(huán)境監(jiān)測(cè)和工業(yè)加工。為確保溫度讀數(shù)準(zhǔn)確,選擇合適的溫度傳感器至關(guān)重要。市場(chǎng)上有各種各樣的溫度傳感器,選擇最合適的溫度傳感器
    的頭像 發(fā)表于 04-09 09:13 ?886次閱讀
    選擇溫度<b class='flag-5'>傳感器</b>的考慮因素

    轉(zhuǎn)子位置傳感器之霍爾磁敏傳感器介紹(可下載)

    一、轉(zhuǎn)子位置傳感器概述:轉(zhuǎn)子位置傳感器在無(wú)刷直流永磁電動(dòng)機(jī)中,主要起兩個(gè)作用:一、通過(guò)它檢測(cè)出轉(zhuǎn)子永磁體磁極相對(duì)定子電樞繞組所處的位置,以便確定電子換相驅(qū)動(dòng)電路中 功率晶體管的導(dǎo)通順序;二、確定電子
    發(fā)表于 04-02 13:41 ?0次下載

    霍爾傳感器介紹(可下載)

    霍爾傳感器是一種磁傳感器。用它可以檢測(cè)磁場(chǎng)及其變化,可在各種與磁場(chǎng)有關(guān)的場(chǎng)合中使用?;?爾傳感器以霍爾效應(yīng)為其工作基礎(chǔ),是由霍爾元件和它的附屬電路組成的集成傳感器。霍爾
    發(fā)表于 03-14 17:27 ?2次下載

    北京迅為RK3568開(kāi)發(fā)OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)框架架構(gòu)

    北京迅為RK3568開(kāi)發(fā)OpenHarmony系統(tǒng)南向驅(qū)動(dòng)開(kāi)發(fā)內(nèi)核HDF驅(qū)動(dòng)
    的頭像 發(fā)表于 03-11 14:13 ?1102次閱讀
    北京迅為RK3568<b class='flag-5'>開(kāi)發(fā)</b>板<b class='flag-5'>OpenHarmony</b>系統(tǒng)南向<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開(kāi)發(fā)</b>內(nèi)核<b class='flag-5'>HDF</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>框架</b>架構(gòu)

    傳感器應(yīng)用技巧141例

    本書(shū)主要介紹了光敏傳感器,紅外傳感器,熱敏電阻,鉑電阻,熱電偶,氣體傳感器,磁敏傳感器,霍爾器
    發(fā)表于 03-06 15:16

    電機(jī)驅(qū)動(dòng)中霍爾轉(zhuǎn)子位置傳感器介紹

    做直流無(wú)刷電機(jī)控制時(shí),必須要知道轉(zhuǎn)子的位置才能驅(qū)動(dòng)電機(jī)運(yùn)轉(zhuǎn),而獲取轉(zhuǎn)子位置的方法分為:傳感器計(jì)算法跟無(wú)傳感器估算法兩種。轉(zhuǎn)子位置傳感器,根據(jù)成本及應(yīng)用場(chǎng)景來(lái)分有:旋轉(zhuǎn)變壓
    發(fā)表于 02-12 17:35

    干簧管傳感器屬于什么傳感器

    干簧管傳感器,又稱(chēng)磁簧開(kāi)關(guān)傳感器或磁敏開(kāi)關(guān),是一種基于干簧管(Reed Switch)原理工作的傳感器。作為一種重要的磁傳感器,干簧管傳感器
    的頭像 發(fā)表于 01-30 15:33 ?1305次閱讀

    戈帥《OpenHarmony輕量系統(tǒng)從入門(mén)到精通50例》開(kāi)發(fā)板與傳感器配置說(shuō)明

    戈帥《OpenHarmony輕量系統(tǒng)從入門(mén)到精通50例》開(kāi)發(fā)板與傳感器配置說(shuō)明,請(qǐng)查看附件*附件:《OpenHarmony輕量系統(tǒng)從入門(mén)到精通50例》
    發(fā)表于 12-03 15:46

    閉環(huán)傳感器與開(kāi)環(huán)傳感器的區(qū)別

    PLC等控制進(jìn)行處理。根據(jù)工作方式的不同,傳感器可以劃分為開(kāi)環(huán)和閉環(huán)兩種模式。以下將對(duì)閉環(huán)傳感器和開(kāi)環(huán)傳感器的定義及其區(qū)別進(jìn)行詳細(xì)介紹。
    的頭像 發(fā)表于 10-22 18:22 ?1383次閱讀

    mems傳感器是什么意思_mems傳感器原理是什么

    MEMS傳感器是一種微型電子機(jī)械系統(tǒng)(Micro-Electro-Mechanical Systems)傳感器,它將傳感器和微機(jī)電系統(tǒng)集成在一起,利用微納技術(shù)實(shí)現(xiàn)微型化。這種傳感器通常
    的頭像 發(fā)表于 10-18 15:33 ?5756次閱讀

    怎么區(qū)分PNP傳感器和NPN傳感器

    PNP傳感器和NPN傳感器在工業(yè)自動(dòng)化、電子控制等領(lǐng)域中扮演著重要角色,它們的主要區(qū)別在于電流方向、電壓輸出以及在電路中的接線(xiàn)方式。以下將從多個(gè)方面詳細(xì)闡述如何區(qū)分PNP傳感器和NPN傳感器
    的頭像 發(fā)表于 09-13 17:39 ?8942次閱讀

    車(chē)載傳感器主要有哪些傳感器

    車(chē)載傳感器是現(xiàn)代汽車(chē)中不可或缺的組成部分,它們?yōu)檐?chē)輛提供關(guān)鍵信息,以確保駕駛安全、提高燃油效率、增強(qiáng)駕駛體驗(yàn)和實(shí)現(xiàn)自動(dòng)駕駛功能。車(chē)載傳感器的種類(lèi)繁多,每種傳感器都有其特定的功能和應(yīng)用場(chǎng)景。以下是一些
    的頭像 發(fā)表于 09-07 09:30 ?1388次閱讀

    常用遙感傳感器中成像的傳感器是什么

    常用遙感傳感器中成像的傳感器主要包括以下幾類(lèi): 一、光學(xué)成像傳感器 多波段掃描儀 :多波段掃描儀是一種重要的光學(xué)成像傳感器,它能夠同時(shí)獲取多個(gè)波段的圖像信息,從而提供更為豐富的地物特征
    的頭像 發(fā)表于 09-04 14:25 ?1636次閱讀

    lidar傳感器和激光測(cè)距傳感器的區(qū)別

    LiDAR傳感器和激光測(cè)距傳感器是兩種不同類(lèi)型的傳感器,它們?cè)谠?、?yīng)用和性能方面存在一些區(qū)別。 原理區(qū)別 LiDAR傳感器(Light Detection and Ranging)是
    的頭像 發(fā)表于 08-29 15:56 ?1081次閱讀

    用于開(kāi)發(fā)傳感器模塊的磁傳感器

    電子發(fā)燒友網(wǎng)站提供《用于開(kāi)發(fā)傳感器模塊的磁傳感器.pdf》資料免費(fèi)下載
    發(fā)表于 08-29 11:13 ?3次下載
    用于<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>傳感器</b>模塊的磁<b class='flag-5'>傳感器</b>