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

跟著小白一起學鴻蒙--寫個簡單的LED驅動(九)

系統 OpenHarmony
HDF(Hardware Driver Framework)是OpenHarmony的驅動子系統,包括驅動框架,配置管理,配置解析,驅動通用框架模型,硬件通用平臺能力接口等。

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

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

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

接下來我們需要學習下如何開發一個驅動應用。

HDF框架簡介

HDF(Hardware Driver Framework)是OpenHarmony的驅動子系統,包括驅動框架,配置管理,配置解析,驅動通用框架模型,硬件通用平臺能力接口等。下圖是一副標準系統的框架模型,但是在小型或者輕量級系統使用的時候時候沒有VFS也沒有這么復雜的分層。

  • 標準系統

#沖刺創作新星# #跟著小白一起學鴻蒙# [九] 寫個簡單的LED驅動-開源基礎軟件社區

  • 小型、輕量系統

#沖刺創作新星# #跟著小白一起學鴻蒙# [九] 寫個簡單的LED驅動-開源基礎軟件社區

詳細的內容介紹在一下鏈接內可以看到官方的說明:

參考鏈接:https://gitee.com/openharmony/drivers_hdf_core

此樣例參考小熊派設計,使用小熊派HM_Micro開發板進行驗證

Driver開發流程

graph LR
編寫driver --> 編寫驅動配置 --> 編寫私有配置 --> 添加驅動應用 --> 編譯生成
  • 編寫driver: led.c, BUILD.gn
//實現Hdf結構體,HdfDriverEntry(在hdf_device_desc.h中定義)類型的全局變量
struct HdfDriverEntry g_ledDriverEntry = {
.moduleVersion = 1,
.moduleName = "HDF_LED",
.Bind = HdfLedDriverBind,
.Init = HdfLedDriverInit,
.Release = HdfLedDriverRelease,
};
// 調用HDF_INIT將驅動入口注冊到HDF框架中
HDF_INIT(g_ledDriverEntry);
  • 實現對應的方法:初始化
//Led設備結構體
struct TestLed {
uint32_t gpioNum;
};
static struct TestLed g_testLed;
// 讀取驅動私有配置
static int32_t LedReadDrs(struct TestLed *led, const struct
DeviceResourceNode *node)
{
int32_t ret;
struct DeviceResourceIface *drsOps = NULL;
drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
if (drsOps == NULL || drsOps->GetUint32 == NULL) {
HDF_LOGE("%s: invalid drs ops!", __func__);
return HDF_FAILURE;
}
/* 讀取led.hcs里面led_gpio_num的值 */
ret = drsOps->GetUint32(node, "led_gpio_num", &led->gpioNum,
0);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: read led gpio num fail!", __func__);
return ret;
}
return HDF_SUCCESS;
}
// HDF框架:驅動初始化
int32_t HdfLedDriverInit(struct HdfDeviceObject *device)
{
struct TestLed *led = &g_testLed;
int32_t ret;
if (device == NULL || device->property == NULL) {
HDF_LOGE("%s: device or property NULL!", __func__);
return HDF_ERR_INVALID_OBJECT;
}
/* 讀取hcs私有屬性值 */
ret = LedReadDrs(led, device->property);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: get led device resource fail:%d", __func__, ret);
return ret;
}
/* 將GPIO管腳配置為輸出 */
ret = GpioSetDir(led->gpioNum, GPIO_DIR_OUT);
if (ret != 0)
{
HDF_LOGE("GpioSerDir: failed, ret %d\n", ret);
return ret;
}
HDF_LOGD("Led driver Init success");
return HDF_SUCCESS;
}
  • 實現對應的方法:初始化
//HDF框架:驅動綁定
int32_t HdfLedDriverBind(struct HdfDeviceObject *deviceObject)
{
if (deviceObject == NULL)
{
HDF_LOGE("Led driver bind failed!");
return HDF_ERR_INVALID_OBJECT;
}
static struct IDeviceIoService ledDriver = {
.Dispatch = LedDriverDispatch,
};
deviceObject->service = (struct IDeviceIoService *)(&ledDriver);
HDF_LOGD("Led driver bind success");
return HDF_SUCCESS;
}
  • 實現對應的方法:驅動資源釋放
// HDF框架:驅動資源釋放
void HdfLedDriverRelease(struct HdfDeviceObject *deviceObject)
{
if (deviceObject == NULL)
{
HDF_LOGE("Led driver release failed!");
return;
}
HDF_LOGD("Led driver release success");
return;
}
  • 驅動編譯gn腳本
import("http://drivers/adapter/khdf/liteos/hdf.gni")
hdf_driver("hdf_led") {
sources = [
"led.c",
]
}

驅動配置。

在鴻蒙源碼目錄下vendor目錄里是不同廠家的開發板,之下有hdf_config目錄,里面有對應的device_info.hcs設備硬件配置文件,在此文件里增加以下內容。

device_led :: device { // led設備節點
device0 :: deviceNode { // led驅動的DeviceNode節點
policy = 2; // policy字段是驅動服務發布的策略,在驅動服務管理章節有詳細介紹
priority = 10; // 驅動啟動優先級(0-200),值越大優先級越低,建議默認配100,優先級相同則不保證device的加載順序
preload = 1; // 驅動按需加載字段
permission = 0777; // 驅動創建設備節點權限
moduleName = "HDF_LED"; // 驅動名稱,該字段的值必須和驅動入口結構的moduleName值一致
serviceName = "hdf_led"; // 驅動對外發布服務的名稱,必須唯一
deviceMatchAttr = "st_stm32mp157_led"; //
驅動私有數據匹配的關鍵字,必須和驅動私有數據配置表中的match_attr值相等
}
}

同時在同級目錄里也需要增加led_config.hcs文件。

root {
LedDriverConfig {
led_gpio_num = 13;
match_attr = "st_stm32mp157_led";
//該字段的值必須和device_info.hcs中的deviceMatchAttr值一致
}
}

同時在同級目錄里也需要修改hdf.hcs文件,增加以下代碼:

#include "led/led_config.hcs"

編譯生成。

./build.sh --product-name PRODUCT_NAME
//看到success則為編譯成功,可以通過find out/[PRODUCT_NAME] -name "my_led"看到對應的應用

總結

device_info.hcs文件中的moduleName必須要和驅動文件中的moduleName字段匹配,這樣驅動才會加載起來。

device_info.hcs文件中的deviceMatchAttr的字段必須和私有配置文件中led_config.hcs的match_attr的字段匹配,這樣私有配置才能生效。

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

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

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

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

2022-10-09 15:05:50

NAPI框架鴻蒙

2022-10-20 16:40:16

JS應用控制LED鴻蒙

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-29 16:35:02

Tetris鴻蒙

2023-03-30 09:32:27

2022-11-14 17:01:34

游戲開發畫布功能

2023-02-27 16:30:32

鴻蒙開源協議分析

2022-08-19 19:02:20

開源鴻蒙操作系統

2023-03-30 09:19:54

SELinux安全子系統

2023-04-04 09:24:11

鴻蒙HiDumper

2022-10-10 14:47:04

藍牙應用鴻蒙

2022-11-03 15:47:04

HTTP通信協議

2023-01-03 15:09:10

鴻蒙常用工具

2022-11-24 14:34:41

Hap程序鴻蒙

2022-12-06 15:39:16

鴻蒙主干代碼

2023-03-15 16:19:03

BinderIPC工具

2022-11-22 15:15:46

Wi-Fi鴻蒙

2023-02-24 16:02:45

WebSocket網絡通訊協議

2022-11-08 15:43:45

開源鴻蒙藍牙協議棧

2022-10-31 15:35:02

Wi-Fi藍牙子系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 97精品国产一区二区三区 | 欧美一区二区三区视频在线观看 | 天堂网中文字幕在线观看 | 四虎永久免费影院 | 国产精品久久久久久一区二区三区 | 国产美女高潮 | 成人在线视频看看 | 欧美一级片中文字幕 | 国产精品久久久久久久久图文区 | 国产高清视频一区 | 国产性网 | 国产精品久久久久影院色老大 | 亚洲精品一区二区三区蜜桃久 | av免费网站在线观看 | 91视频播放 | 久久久久久久国产 | 久久久久久九九九九 | 成人在线视频一区 | 亚洲精品二区 | 91视频91 | 国产精品自拍视频网站 | 人人人人人爽 | 亚洲一区三区在线观看 | 成人精品 | av首页在线| 国产美女高潮 | 91精品国产乱码久久久久久久久 | 日韩羞羞| 欧美精品乱码久久久久久按摩 | 综合久久av | www.99热这里只有精品 | 日韩精品在线播放 | 中文字幕在线观看一区 | 视频一区二区三区中文字幕 | 亚洲一区精品视频 | 四虎成人免费视频 | 日韩欧美国产精品一区二区 | 欧美久久一区二区 | 国产精品中文字幕在线观看 | av大全在线观看 | aaa在线 |