DevEco Device Tool:HDF框架一鍵生成!
??想了解更多關(guān)于開源的內(nèi)容,請訪問:??
概述
HDF驅(qū)動框架,為驅(qū)動開發(fā)者提供驅(qū)動框架能力,包括驅(qū)動加載、驅(qū)動服務(wù)管理和驅(qū)動消息機(jī)制。旨在構(gòu)建統(tǒng)一的驅(qū)動架構(gòu)系統(tǒng),為驅(qū)動開發(fā)者提供更精準(zhǔn)、更高效的開發(fā)環(huán)境,力求做到一次開發(fā),多系統(tǒng)部署。
開發(fā)者可以通過DevEco Device Tool的HDF功能管理和添加設(shè)備的驅(qū)動,添加驅(qū)動時,工具會自動生成相應(yīng)的驅(qū)動目錄結(jié)構(gòu)、初始化驅(qū)動模板、代碼及頭文件等信息。
前提條件
- 開發(fā)板:Hi3516DV300開發(fā)板(目前只支持該開發(fā)板,并且支持LiteOS內(nèi)核和Linux內(nèi)核的HDF驅(qū)動模板生成)
- 源碼:OpenHarmonyV3.1 Release及后續(xù)版本源碼。
- 工具:DevEco Device Tool。
使用體驗(yàn)
通過HDF框架自動生成確實(shí)對于小型系統(tǒng)和標(biāo)準(zhǔn)系統(tǒng)的開發(fā)帶來很大便利,編寫驅(qū)動代碼時可以減少對編譯構(gòu)建的關(guān)注,而更加關(guān)注到驅(qū)動代碼編寫本身,提高代碼編寫效率,并且會生成代碼框架,命名格式什么都比較規(guī)范,可以省去很多時間用于框架的編寫或復(fù)制修改。缺點(diǎn)就是目前支持的開發(fā)板只有一個,希望后續(xù)可以完善,支持更多的開發(fā)板,這個功能是真的很好用。
新建HDF驅(qū)動模塊
點(diǎn)開Deveco Device Tool插件圖標(biāo),在工具控制區(qū)中點(diǎn)擊HDF進(jìn)入驅(qū)動添加頁面,選擇產(chǎn)品,目前只有ipcamera_hispark_taurus與ipcamera_hispark_taurus_linux與hispark_taurus_standard三款產(chǎn)品支持使用,未支持的產(chǎn)品無法點(diǎn)擊+號添加HDF模塊。
在添加驅(qū)動模塊對話框中,填寫模塊名稱,然后點(diǎn)擊添加。
說明:
只有標(biāo)準(zhǔn)系統(tǒng)的產(chǎn)品,在添加驅(qū)動的時候,需要選擇“RunMode”:user和kernel;小型系統(tǒng)的產(chǎn)品只需要填寫Module名稱即可。
添加后,可點(diǎn)擊Action下的刪除按鈕刪除已添加的模塊。
添加后,可以在Driver Module下看到已添加的模塊,使用LiteOS內(nèi)核與Linux內(nèi)核生成的會有所不同。
生成后會自動幫我們配置好編譯鏈,自動生成MakeFile,BUILD.gn,Kconfig,C++驅(qū)動代碼模板等。
驅(qū)動代碼實(shí)現(xiàn)
點(diǎn)擊模塊文件下的文件圖標(biāo),可以打開文件,進(jìn)行驅(qū)動開發(fā)。點(diǎn)擊c/c++即可進(jìn)行驅(qū)動代碼的開發(fā)。生成的模板如下。(找了官方的含有中文注釋的圖)。
為了驗(yàn)證HDF驅(qū)動是否成功編譯進(jìn)內(nèi)核,對驅(qū)動代碼進(jìn)行些許修改,在Init函數(shù)中加入了紅外LED燈的點(diǎn)亮,通過查閱原理圖得到,紅外led的引腳號為41,代碼如下,需包含#include "gpio_if.h"頭文件用于控制gpio,只是驗(yàn)證的話就不寫用戶態(tài)的函數(shù)了。
#include "hdf_device_desc.h" // Header file that describes the APIs provided by the HDF to the driver.
#include "hdf_log.h" // Header file that describes the log APIs provided by the HDF.
#include "gpio_if.h" //添加GPIO驅(qū)動頭文件
#define HDF_LOG_TAG hello_linux_driver // Tag contained in logs. If no tag is not specified, the default HDF_TAG is used.
// The driver service struct definition
struct ITestDriverService {
struct IDeviceIoService ioService; // The first member of the service structure must be a member of type IDeviceIoService
};
// The driver service interface must be bound to the HDF for you to use the service capability.
static int32_t HdfHelloLinuxDriverBind(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("hello_linux driver bind success");
return 0;
}
// Initialize the driver service.
static int32_t HdfHelloLinuxDriverInit(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("Hello Linux");
GpioSetDir(41,GPIO_DIR_OUT);//引腳設(shè)置為輸出
GpioWrite(41,GPIO_VAL_HIGH);//輸出高電平,紅外燈亮
return 0;
}
// Release the driver resources.
static void HdfHelloLinuxDriverRelease(struct HdfDeviceObject *deviceObject) {
HDF_LOGI("hello_linux driver Release success");
return;
}
// Define the object of the driver entry. The object must be a global variable of the HdfDriverEntry type (defined in hdf_device_desc.h).
struct HdfDriverEntry g_hello_linuxDriverEntry = {
.moduleVersion = 1,
.moduleName = "hello_linux_driver",
.Bind = HdfHelloLinuxDriverBind,
.Init = HdfHelloLinuxDriverInit,
.Release = HdfHelloLinuxDriverRelease,
};
// Call HDF_INIT to register the driver entry with the HDF framework. When loading the driver, call the Bind function and then the Init function. If the Init function fails to be called, the HDF will call Release to release the driver resource and exit.
HDF_INIT(g_hello_linuxDriverEntry);
燒錄驗(yàn)證
接著進(jìn)行編譯燒錄啟動,不清楚的可以看下面這篇文章:
Hi3516DV300 OpenHarmony3.1環(huán)境配置及燒錄。
點(diǎn)擊monitor開啟串口監(jiān)視,可以看到打印出了Hello Linux的LOG,說明驅(qū)動成功初始化,同時可以看到紅外燈成功點(diǎn)亮。
后記
雖然通過工具自動生成代碼很方便,但還是建議初學(xué)者要搞清楚HDF框架的具體實(shí)現(xiàn)流程,手動實(shí)現(xiàn)一遍,了解編譯的整個流程,這對理解OpenHarmony代碼及框架還是非常有幫助的,工具最好當(dāng)成你能熟練掌握后提高效率的助手。而且工具也不一定支持所有情況,理解整個HDF后即使遇到一些特殊情況也能有辦法解決,后面的一篇文章我將會深入HDF的驅(qū)動開發(fā)流程,并且比較LiteOS內(nèi)核與Linux內(nèi)核HDF驅(qū)動開發(fā)的區(qū)別。