DevEco Device Tool:HDF框架一鍵生成!
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
概述
HDF驅(qū)動(dòng)框架,為驅(qū)動(dòng)開(kāi)發(fā)者提供驅(qū)動(dòng)框架能力,包括驅(qū)動(dòng)加載、驅(qū)動(dòng)服務(wù)管理和驅(qū)動(dòng)消息機(jī)制。旨在構(gòu)建統(tǒng)一的驅(qū)動(dòng)架構(gòu)系統(tǒng),為驅(qū)動(dòng)開(kāi)發(fā)者提供更精準(zhǔn)、更高效的開(kāi)發(fā)環(huán)境,力求做到一次開(kāi)發(fā),多系統(tǒng)部署。
開(kāi)發(fā)者可以通過(guò)DevEco Device Tool的HDF功能管理和添加設(shè)備的驅(qū)動(dòng),添加驅(qū)動(dòng)時(shí),工具會(huì)自動(dòng)生成相應(yīng)的驅(qū)動(dòng)目錄結(jié)構(gòu)、初始化驅(qū)動(dòng)模板、代碼及頭文件等信息。
前提條件
- 開(kāi)發(fā)板:Hi3516DV300開(kāi)發(fā)板(目前只支持該開(kāi)發(fā)板,并且支持LiteOS內(nèi)核和Linux內(nèi)核的HDF驅(qū)動(dòng)模板生成)
- 源碼:OpenHarmonyV3.1 Release及后續(xù)版本源碼。
- 工具:DevEco Device Tool。
使用體驗(yàn)
通過(guò)HDF框架自動(dòng)生成確實(shí)對(duì)于小型系統(tǒng)和標(biāo)準(zhǔn)系統(tǒng)的開(kāi)發(fā)帶來(lái)很大便利,編寫(xiě)驅(qū)動(dòng)代碼時(shí)可以減少對(duì)編譯構(gòu)建的關(guān)注,而更加關(guān)注到驅(qū)動(dòng)代碼編寫(xiě)本身,提高代碼編寫(xiě)效率,并且會(huì)生成代碼框架,命名格式什么都比較規(guī)范,可以省去很多時(shí)間用于框架的編寫(xiě)或復(fù)制修改。缺點(diǎn)就是目前支持的開(kāi)發(fā)板只有一個(gè),希望后續(xù)可以完善,支持更多的開(kāi)發(fā)板,這個(gè)功能是真的很好用。
新建HDF驅(qū)動(dòng)模塊
點(diǎn)開(kāi)Deveco Device Tool插件圖標(biāo),在工具控制區(qū)中點(diǎn)擊HDF進(jìn)入驅(qū)動(dòng)添加頁(yè)面,選擇產(chǎn)品,目前只有ipcamera_hispark_taurus與ipcamera_hispark_taurus_linux與hispark_taurus_standard三款產(chǎn)品支持使用,未支持的產(chǎn)品無(wú)法點(diǎn)擊+號(hào)添加HDF模塊。
在添加驅(qū)動(dòng)模塊對(duì)話框中,填寫(xiě)模塊名稱,然后點(diǎn)擊添加。
說(shuō)明:
只有標(biāo)準(zhǔn)系統(tǒng)的產(chǎn)品,在添加驅(qū)動(dòng)的時(shí)候,需要選擇“RunMode”:user和kernel;小型系統(tǒng)的產(chǎn)品只需要填寫(xiě)Module名稱即可。
添加后,可點(diǎn)擊Action下的刪除按鈕刪除已添加的模塊。
添加后,可以在Driver Module下看到已添加的模塊,使用LiteOS內(nèi)核與Linux內(nèi)核生成的會(huì)有所不同。
生成后會(huì)自動(dòng)幫我們配置好編譯鏈,自動(dòng)生成MakeFile,BUILD.gn,Kconfig,C++驅(qū)動(dòng)代碼模板等。
驅(qū)動(dòng)代碼實(shí)現(xiàn)
點(diǎn)擊模塊文件下的文件圖標(biāo),可以打開(kāi)文件,進(jìn)行驅(qū)動(dòng)開(kāi)發(fā)。點(diǎn)擊c/c++即可進(jìn)行驅(qū)動(dòng)代碼的開(kāi)發(fā)。生成的模板如下。(找了官方的含有中文注釋的圖)。
為了驗(yàn)證HDF驅(qū)動(dòng)是否成功編譯進(jìn)內(nèi)核,對(duì)驅(qū)動(dòng)代碼進(jìn)行些許修改,在Init函數(shù)中加入了紅外LED燈的點(diǎn)亮,通過(guò)查閱原理圖得到,紅外led的引腳號(hào)為41,代碼如下,需包含#include "gpio_if.h"頭文件用于控制gpio,只是驗(yàn)證的話就不寫(xiě)用戶態(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ū)動(dòng)頭文件
#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)行編譯燒錄啟動(dòng),不清楚的可以看下面這篇文章:
Hi3516DV300 OpenHarmony3.1環(huán)境配置及燒錄。
點(diǎn)擊monitor開(kāi)啟串口監(jiān)視,可以看到打印出了Hello Linux的LOG,說(shuō)明驅(qū)動(dòng)成功初始化,同時(shí)可以看到紅外燈成功點(diǎn)亮。
后記
雖然通過(guò)工具自動(dòng)生成代碼很方便,但還是建議初學(xué)者要搞清楚HDF框架的具體實(shí)現(xiàn)流程,手動(dòng)實(shí)現(xiàn)一遍,了解編譯的整個(gè)流程,這對(duì)理解OpenHarmony代碼及框架還是非常有幫助的,工具最好當(dāng)成你能熟練掌握后提高效率的助手。而且工具也不一定支持所有情況,理解整個(gè)HDF后即使遇到一些特殊情況也能有辦法解決,后面的一篇文章我將會(huì)深入HDF的驅(qū)動(dòng)開(kāi)發(fā)流程,并且比較LiteOS內(nèi)核與Linux內(nèi)核HDF驅(qū)動(dòng)開(kāi)發(fā)的區(qū)別。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??