OpenHarmony GPIO應用開發-LED

學習于:
https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-develop.md
https://docs.openharmony.cn/pages/v5.0/zh-cn/device-dev/driver/driver-platform-gpio-des.md
通過OpenHarmony官方文檔指導可獲知:芯片廠商應當按照系統的平臺驅動接口實現GPIO控制器驅動后,設備開發人員就可以按照系統GPIO的HDI接口使用GPIO,具體接口函數有:
在這里插入圖片描述
其中函數參數gpioName指定IO口名,gpio指定IO口的ID,參數具體值由芯片廠商在.hcs配置文件中描述,如海思Hi3516中GPIO控制器驅動的描述:
在這里插入圖片描述
Hi3516 GPIO控制器驅動自定義屬性的描述:
在這里插入圖片描述
其中屬性groupNum指定Hi3516共有12組IO口,bitNum指定每組有8個IO口,由0 ~ 95數值分別表示96個IO,如GPIO2_3,則由數值19表示(2*8 + 3 = 19)。
屬性gpioCustomName指定IO口的名稱,依此名稱可通過函數GpioGetByName獲取IO口對應的ID。

接下來通過應用GPIO實現LED驅動:
開發板LED原理圖
在這里插入圖片描述
在這里插入圖片描述
通過原理圖可發現有: GPIO2_3 GPIO3_4 GPIO5_1控制LED的工作。

簡單的LED驅動
在上篇簡單的HDF驅動驅動源碼基礎上加入控制一個LED的代碼,具體驅動源碼:

#include <hdf_device_desc.h>
#include <hdf_log.h>
#include <hdf_base.h>
#include <gpio_if.h>  // GPIO驅動調用接口static int idGpio = 0;static int32_t myDispatch(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply)
{HDF_LOGD("### in %s : %d\n", __func__, id);GpioWrite(idGpio, id%2); //配置GPIO輸出高低電平return HDF_SUCCESS;
}int32_t myBind(struct HdfDeviceObject *obj)
{static struct IDeviceIoService testService = {.Dispatch = myDispatch,};obj->service = &testService;HDF_LOGD("#### in %s\n", __func__);idGpio = GpioGetByName("GPIO2_3"); //獲取GPIO的IDGpioSetDir(idGpio, GPIO_DIR_OUT); //配置GPIO作輸出用途return HDF_SUCCESS;
}
int32_t myInit(struct HdfDeviceObject *obj)
{HDF_LOGD("#### in %s\n", __func__);return HDF_SUCCESS;
}
void myRelease(struct HdfDeviceObject *obj)
{HDF_LOGD("#### in %s\n", __func__);
}struct HdfDriverEntry myTestEntry = {.Bind = myBind,.Init = myInit,.Release = myRelease,.moduleName = "myTestDriver",.moduleVersion = 1
};
HDF_INIT(myTestEntry);

沿用上篇里的應用程序,當應用程序執行起來后,開發板的LED會在GPIO輸出高電平時亮,低電平時熄。

硬件資源分離與可重用的LED驅動
按照OpenHarmony文檔指導,硬件相關的資源應當在.hcs配置文件中描述。這里三個LED分別作為一個設備進行描述 :
在這里插入圖片描述
然后在vendor/hisilicon/hispark_taurus/hdf_config/目錄下創建myLight文件夾,并在文件夾里創建myLight.hcs配置文件,描述設備自定義的屬性:
在這里插入圖片描述
每個節點通過match_attr與設備節點的deviceMatchAttr進行匹配,相同值表示此節點資源由對應的設備使用。 gpioName自定義屬性向LED驅動提供LED設備的控制IO。
然后修改vendor/hisilicon/hispark_taurus/hdf_config/hdf.hcs配置文件,增加myLight.hcs文件的使用:
在這里插入圖片描述

驅動源文件myTestDriver.c代碼修改為:

#include <hdf_device_desc.h>
#include <hdf_log.h>
#include <hdf_base.h>
#include <gpio_if.h>
#include <device_resource_if.h>
#include <osal_mem.h>struct myLightService {struct IDeviceIoService service;int idGpio;const char *gpioName;
};static int32_t myDispatch(struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply)
{struct HdfDeviceObject *obj = client->device;struct myLightService *srv = (struct myLightService *)(obj->service);HDF_LOGD("### in %s, %s  %d\n", __func__,  srv->gpioName, id);GpioWrite(srv->idGpio, !!id);return HDF_SUCCESS;
}int32_t myBind(struct HdfDeviceObject *obj)
{struct myLightService *srv = NULL;struct DeviceResourceIface *dr = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);srv = OsalMemCalloc(sizeof(struct myLightService));dr->GetString(obj->property, "gpioName", &srv->gpioName, NULL);srv->service.Dispatch = myDispatch;srv->idGpio = GpioGetByName(srv->gpioName);GpioSetDir(srv->idGpio, GPIO_DIR_OUT);obj->service = &srv->service;return HDF_SUCCESS;
}
int32_t myInit(struct HdfDeviceObject *obj)
{return HDF_SUCCESS;
}
void myRelease(struct HdfDeviceObject *obj)
{struct myLightService *srv = (struct myLightService *)(obj->service);OsalMemFree(srv);
}struct HdfDriverEntry myTestEntry = {.Bind = myBind,.Init = myInit,.Release = myRelease,.moduleName = "myTestDriver",.moduleVersion = 1
};
HDF_INIT(myTestEntry);

應用程序mytest.c代碼修改為:

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "hdf_log.h"
#include "hdf_sbuf.h"
#include "hdf_io_service_if.h"int main(int argc, char *argv[])
{if (3 != argc){printf("usage: %s  serviceName  num \n", argv[0]);return 1;}struct HdfIoService *srv = HdfIoServiceBind(argv[1]);if (srv == NULL) {printf("fail to get service\n");return 1;}int ret = srv->dispatcher->Dispatch(&srv->object, atoi(argv[2]), NULL, NULL);printf("test end\n");HdfIoServiceRecycle(srv);return 0;
}

應用程序執行時通過指定不同的服務名與電平值控制LED,如:

  ./bin/mytest  myTestService0   1      ./bin/mytest  myTestService1   1    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81891.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81891.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81891.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

XILINX原語之——xpm_fifo_async(異步FIFO靈活設置位寬、深度)

目錄 一、"fwft"模式&#xff08;First-Word-Fall-Through read mode&#xff09; 1、寫FIFO 2、讀FIFO 二、"std"模式&#xff08;standard read mode&#xff09; 1、寫FIFO 2、讀FIFO 調用方式和xpm_fifo_sync基本一致&#xff1a; XILINX原語之…

系統學習算法:動態規劃(斐波那契+路徑問題)

題目一&#xff1a; 思路&#xff1a; 作為動態規劃的第一道題&#xff0c;這個題很有代表性且很簡單&#xff0c;適合入門 先理解題意&#xff0c;很簡單&#xff0c;就是斐波那契數列的加強版&#xff0c;從前兩個數變為前三個數 算法原理&#xff1a; 這五步可以說是所有…

《讓內容“活”起來:Flutter社交應用瀑布流布局的破界實踐》

用戶動態的展示方式如同舞臺的布景&#xff0c;直接影響著觀眾——用戶的體驗。而瀑布流布局&#xff0c;以其獨特的美感和高效的信息展示能力&#xff0c;成為眾多社交應用的心頭好。當我們滑動著Instagram、Pinterest&#xff0c;或是國內熱門的小紅書&#xff0c;那種內容如…

微機控制技術復習【一】

填空題&#xff1a; 簡答題&#xff1a; 1、什么是計算機控制系統?其典型形式有哪些? 2、給出 DDC &#xff08;直接數字控制&#xff09;控制系統結構框圖&#xff0c;并說明各組成部分的作用&#xff1f; 3、采樣周期選擇的理論依據是什么?工程應用中應如何選擇?選擇采樣…

前端學習基礎—VScode環境配置及html基礎知識

作為初學者&#xff0c;一個好的開發環境能極大地提高理解與學習的效率&#xff0c;本文分享我的VScode環境配置方法&#xff0c;涵蓋插件、主題、快捷鍵等&#xff0c;希望能助你快速搭建舒適邊界的前端學習環境。 一、VSCode環境配置 首先找到vscode插件商店&#xff0c;在這…

【一】 基本概念與應用領域【830數字圖像處理】

考綱 文章目錄 1 概念2005甄題【名詞解釋】2008、2012甄題【名詞解釋】可考題【簡答題】可考題【簡答題】 2 應用領域【了解】2.1 伽馬射線成像【核醫學影像】☆2.2 X射線成像2.3 紫外波段成像2.4 可見光和紅外波段成像2.5 微波波段成像2.6 無線電波段成像2.7 電子顯微鏡成像2…

QuecPython錯誤碼匯總

QuecPython中定義的各種錯誤代碼常量 錯誤碼常量錯誤碼釋義QUEC_PY_FAIL-1Generic failure codesQUEC_PY_OK0Quec_py value indicating success (no error)QUEC_PY_EPERM1Operation not permittedQUEC_PY_ENOENT2No such file or directoryQUEC_PY_ESRCH3No such processQUEC_…

C++學習-入門到精通-【4】函數與遞歸入門

C學習-入門到精通-【4】函數與遞歸入門 函數與遞歸入門 C學習-入門到精通-【4】函數與遞歸入門一、 數學庫函數sqrt()ceil()cos()exp()fabs()floor()fmod()log()log10()pow()sin()tan()總結 二、具有多個形參的函數定義三、函數原型、函數簽名和實參的強制類型轉換函數原型函數…

天線測試報告解讀學習

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、無源測試和有源測試二、無源測試報告1.駐波2.回損3.史密斯圓圖4.效率5.增益6.天線方向圖7.天線隔離度8.無源測試總結 三、有源測試報告1.TRP與TIS2.測試指標…

GEC6818蜂鳴器驅動開發

相關知識&#xff1a;Linux設備驅動開發 insmod 編譯好的.ko文件后再運行beep_app.c編譯完成的可執行文件即可使板子蜂鳴。 beep_drv.c: #include <linux/module.h> //包含了加載模塊時需要使用的大量符號和函數聲明 #include <linux/kernel.h> //包含了printk內…

電腦定時管家!Wise Auto Shutdown 深度測評:多任務執行 + 靈活定時

各位電腦小達人&#xff0c;今天給大家介紹一款超厲害的Windows系統定時任務管理工具——Wise Auto Shutdown&#xff01;這玩意兒就像電腦的貼心小管家&#xff0c;能自動執行關機、重啟這些操作&#xff0c;時間設定靈活得很&#xff0c;還有提醒機制呢。下面我給大家好好嘮嘮…

vscode 配置qt

工具&#xff1a;vscode、qttools、qtconfigure Search Mode改成基于cmake的。 # 在項目中指定Qt的路徑 set(Qt5_DIR "/home/jp/qt-everywhere-src-5.12.9/arm-qt/lib/cmake/Qt5") # 用于指定 Qt5 的安裝路徑 find_package(Qt5 REQUIRED COMPONENTS Widgets)這樣就…

基于Boost庫、Jsoncpp、cppjieba、cpp-httplib等構建Boost搜索引擎

??個人主頁&#xff1a;小羊 ??所屬專欄&#xff1a;項目 很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~ 目錄 項目背景技術棧和項目環境正排索引和倒排索引數據去標簽與清洗下載數據源去標簽 建立索引構建正排索引構建倒排索引 建立搜索引擎h…

QMK機械鍵盤固件開發指南:從源碼到實踐

QMK機械鍵盤固件開發指南&#xff1a;從源碼到實踐 前言 QMK&#xff08;Quantum Mechanical Keyboard&#xff09;是一款開源的鍵盤固件&#xff0c;支持眾多自定義鍵盤的功能配置。通過QMK&#xff0c;您可以完全掌控鍵盤的每一個按鍵&#xff0c;實現復雜的宏指令、多層按…

WPF 導航

WPF 導航相關控件/機制 控件 / 類說明常用屬性/方法Frame用來承載不同的頁面 (Page) 并在它們之間切換的容器。Source&#xff08;導航到的 URI&#xff09; Navigate()&#xff08;導航方法&#xff09; CanGoBack / GoBack() CanGoForward / GoForward()Page表示一個單獨的可…

時序建模演進之路:從 MLP、RNN 到 LSTM 與 GRU

時序建模演進之路&#xff1a;從 MLP、RNN 到 LSTM 與 GRU 您是否好奇機器如何能像人類一樣理解、生成流暢的文本&#xff0c;甚至是從海量代碼中自動生成文檔&#xff1f;這些自然語言處理 (NLP) 領域的迷人挑戰&#xff0c;其核心在于模型處理和記憶 序列數據 的能力。 然而…

【Redis——數據類型和內部編碼和Redis使用單線程模型的分析】

文章目錄 Redis的數據類型和內部編碼單線程模型的工作過程Redis在處理命令時雖然是一個單線程模型&#xff0c;為啥效率那么高&#xff0c;速度快呢&#xff1f; 總而言之&#xff0c;Redis提供的哈希表容器并不一定真的是真的哈希表&#xff0c;而是在特點的場景下&#xff0c…

鴻蒙NEXT開發動畫(風格的旋轉加載動畫組件)

1.創建空白項目 2.Page文件夾下面新建Spin.ets文件&#xff0c;代碼如下&#xff1a; /*** SpinKit 風格的旋轉加載動畫組件。** component* param spinSize - 動畫容器大小&#xff08;必須為正數&#xff09;* param spinColor - 動畫顏色&#xff08;支持資源引用&#xf…

后端接口請求http改為https

1、使用 OpenSSL 生成自簽名證書 在Linxu服務器上執行如下命令&#xff1a; openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes 運行此命令后&#xff0c;會提示輸入一些信息&#xff08;如國家、省份、城市、組織名稱等&#xff09;&…

工作記錄 2017-12-12 + 在IIS下發布wordpress

工作記錄 2017-12-12 序號 工作 相關人員 1 修改郵件上的問題。 更新RD服務器。 在IIS下發布wordpress。 郝 服務器更新 RD服務器更新了&#xff0c;更新的文件放在190的D:\Temp\CHTeam\fnehr_update_20171212\下了。 數據庫更新: 數據庫沒有更新 更新的文件&#xf…