当前位置: 首页 > 科技观察

HDF驱动框架探路(三):基于3516,配置一套可以通过

时间:2023-03-16 18:41:10 科技观察

打通的HDF驱动,更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto。com的老规矩,最后还是放出了你要跑出来的效果。如下:前言如果你看过第二篇文章,你可能会发现,本文中的内核态驱动直接引用了源码中已经存在的一个HDF驱动模块。所以本文着重解决这个问题,即自己配置一个HDF驱动模块。本文基于3516小系统进行验证。观察本文框架图中的上图。事实上,这篇文章进一步提炼了上述过程。上面的驱动程序分为三部分,分别是:HCS文件配置、内核态代码、编译进内核的liteos_a配置。这三个部分共同构成了构建您自己的HDF驱动程序的步骤。1、HDF配置这里的HDF配置是根据源码中已有的sample_driver模块打开vendor/hisilicon/hispark_taurus/hdf_config/hdf_test/hdf_test_manager/device_info.hcs文件,然后在下面的代码中添加device2。device1::deviceNode{policy=2;priority=10;preload=0;permission=0644;moduleName="sample_driver";serviceName="sample_service";}device2::deviceNode{//DeviceNodeofthesampledriverpolicy=2;//Driverservicereleasepolicy.Fordetails,见DriverServiceManagement.priority=10;//Driver启动优先级(0-200)。值越大优先级越低。推荐使用默认值100。如果优先级相同,则设备加载顺序随机。preload=0;//按需加载驱动程序。详见本节末尾的“NOTE”。permission=066666666;//为驱动程序创建节点4;//为驱动程序创建任务权限moduleName="talkweb_driver";//Drivername.ThevalueofthisfieldmustbethesameasthevalueofmoduleNameinthedriverentrystructure.serviceName="talkweb_service";//Nameoftheservicereleasedbythedriver.Thenamemustbeunique.}}device_platform_test::device{platform_test::deviceNode{policy=1;priority=150;preload=0;permission=0644;模块名称=“PLATFORM_TEST_DRIVER";serviceName="PLATFORM_TEST";deviceMatchAttr="platform_test";}}2.liteos_a编译配置这一步是将第三步的驱动编译进内核2.1在BUILD.gn文件中配置打开drivers/adapter/khdf/liteos/test/BUILD.gn文件---a/khdf/liteos/test/BUILD.gn+++b/khdf/liteos/test/BUILD。gn@@-37,6+37,7@@hdf_driver(模块名称){sources=["$HDF_TEST_FRAMWORK_ROOT/common/hdf_main_test.c","$HDF_TEST_FRAMWORK_ROOT/manager/sample_driver_test.c",+"$HDF_TEST_FRAMWORK_ROOT/talkwebtest/talkweb.c","$HDF_TEST_FRAMWORK_ROOT/osal/osal_all_test.c","$HDF_TEST_FRAMWORK_ROOT/osal/osal_file_test.c","$HDF_TEST_FRAMWORK_ROOT/osal/osal_get_case_test.c",2.2在Makefile中进行添加配置drivers/adapter/khdf/liteos/test/Makefile---a/khdf/liteos/test/Makefile+++b/khdf/liteos/test/Makefile@@-34,6+34,7@@HDF_TEST_FRAMWORK_ROOT=$(LITEOSTOPDIR)/../../drivers/framework/test/unittestLOCAL_SRCS:=$(HDF_TEST_FRAMWORK_ROOT)/common/hdf_main_test.c\$(HDF_TEST_FRAMWORK_ROOT)/manager/sample_driver_test.c\+$(HDF_TEST_FRAMWORK_ROOT)/talkwebtest/talkweb.c\$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_test_entry.c\$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_all_test.c\$(HDF_TEST_FRAMWORK_ROOT)/osal/osal_file_test.c\3。驱动进入drivers/framework/test/unittest目录,新建talkwebtest目录。3.1Createanewtalkweb.hfileintheabovedirectory.下述代码放入#ifndefHDF_SAMPLE_DRIVER_H#defineHDF_SAMPLE_DRIVER_H#include"hdf_object.h"#defineSAMPLE_SERVICE"sample_service"typedefenum{SAMPLE_DRIVER_REGISTER_DEVICE=0,SAMPLE_DRIVER_UNREGISTER_DEVICE,SAMPLE_DRIVER_SENDEVENT_SINGLE_DEVICE,SAMPLE_DRIVER_SENDEVENT_BROADCAST_DEVICE,SAMPLE_DRIVER_PM_STATE_INJECT,}SAMPLE_DRIVER_CMDID;structHdfDeviceObject*GetDeviceObject(void);#endif//HDF_MAIN_TEST_H3.2在上述目录新建talkweb.c文件,将以下代码放入/**Copyright(c)2020-2021HuaweiDeviceCo.,Ltd.**HDFisduallicensed:您可以根据*GPL或BSD许可证的条款使用它们,这是您的选择。*请参阅此存储库根目录中的许可文件以获取完整的详细信息。*/#include"talkweb.h"#include"devsvc_manager_clnt.h"#include"devmgr_service.h"#include"hdf_log.h"#include"hdf_device_desc.h"#include"hdf_pm.h"#include"device_resource_if.h"#include"osal_io.h"#include"osal_mem.h"#include"gpio_if.h"#include"osal_irq.h"#include"osal_time.h"//#defineHDF_LOG_TAGled_driver//打印日志所包含的标签,如果不定义则用默认>定义的HDF_TAG标签#defineLED_WRITE_READ88#defineHDF_LOG_TAGsample_driver_test#ifndefINT32_MAX#defineINT32_MAX0x7fffffff#endifvoidHdftalkwebDriverRelease(structHdfDeviceObject*deviceObject){(void)deviceObject;return;}int32_ttalkwebDriverRegisterDevice(structHdfSBuf*data){constchar*moduleName=NULL;constchar*serviceName=NULL;structHdfDeviceObject*devObj=NULL;if(data==NULL){returnHDF_FAILURE;}moduleName=HdfSbufReadString(data);if(moduleName==NULL){returnHDF_FAILURE;}serviceName=HdfSbufReadString(data);if(serviceName==NULL){returnHDF_FAILURE;}devObj=HdfRegisterDevice(moduleName,serviceName,NULL);if(devObj==NULL){returnHDF_FAILURE;}returnHDF_SUCCESS;}intDr32iverUnregisterDevice(structHdfSBuf*data){constchar*moduleName=NULL;constchar*serviceName=NULL;if(data==NULL){returnHDF_FAILURE;}moduleName=HdfSbufReadString(data);if(moduleName==NULL){returnHDF_FAILURE;}serviceName=HdfSbufReadString(数据);if(serviceName==NULL){returnHDF_FAILURE;}HdfUnregisterDevice(moduleName,serviceName);returnHDF_SUCCESS;}int32_ttalkwebDriverSendEvent(structHdfDeviceIoClient*client,intid,structHdfSBuf*data,boolbroadcast){returnbroadcast?HdfDeviceSendEvent,(客户端->id、数据):HdfDeviceSendEventToClient(客户端、id、数据);}int32_ttalkwebDriverPowerStateInject(uint32_tpowerState){intret;structIDevmgrService*devmgrService=DevmgrServiceGetInstance();if(devmgrService==NULL||devmgrService->PowerStateChange==NULL){returnHDF_ERR_INVALID_OBJECT;}ret=devmgrService->PowerStateChange(devmgrService,powerState);HDF_LOGI("%s:injectpowerstate(%d)done,ret=%d",__func__,powerState,ret);returnret;}staticint32_tCtlLED(intmode){int32_tret;uint16_tvalRead;/*LEDGPIO引脚号*/uint16_tgpio=5*8+1;//红外补光//uint16_tgpio=2*8+3;//绿光//uint16_tgpio=3*8+4;//红色LED/*将GPIO引脚配置为输出*/ret=GpioSetDir(gpio,GPIO_DIR_OUT);if(ret!=0){HDF_LOGE("GpioSerDir:failed,ret%d\n",ret);returnret;}if(mode==-1){//翻转输出端口(void)GpioRead(gpio,&valRead);ret=GpioWrite(gpio,(valRead==GPIO_VAL_LOW)?GPIO_VAL_HIGH:GPIO_VAL_LOW);}else{ret=GpioWrite(gpio,mode);}if(ret!=0){HDF_LOGE("GpioWrite:failed,ret%d\n",ret);returnret;}returnret;}int32_ttalkwebDriverDispatch(structHdfDeviceIoClient*client,intcmdId,structHdfSBuf*data,structHdfSBuf*reply){HDF_LOGD("%s::qzk-enter",__func__);uint32_tpowerState=0;int32_tret=HDF_SUCCESS;if(reply==NULL||client==NULL){returnHDF_FAILURE;}int32_tresult=HDF_FAILURE;switch(cmdId){caseLED_WRITE_READ:constchar*recv=HdfSbufReadString(data);if(recv!=NULL){//HDF_LOGI("recv:%s",recv);result=CtlLED(-1);//CtlLED(GPIO_VAL_HIGH);if(!HdfSbufWriteInt32(回复,结果)){//HDF_LOGE("replayisfail");}returnHdfDeviceSendEvent(client->device,cmdId,data);}break;caseSAMPLE_DRIVER_REGISTER_DEVICE:{ret=talkwebDriverRegisterDevice(data);HdfSbufWriteInt32(reply,ret);break;}caseSAMPLE_DRIVER_UNREGISTER_DEVICE:ret=talkwebdriverunregisterdevice(data);hdfsbufwriteInt32(回复,ret);break;casespample_driver_sendevent_single_device:ret=ret=talkwebdriversendevent(client,client,cmdid,cmdid,cmdid,cmdid,data,data,data,false,false);数据,真);HdfSbufWriteInt32(回复,INT32_MAX);中断;caseSAMPLE_DRIVER_PM_STATE_INJECT:HdfSbufReadUint32(数据,&powerState);returntalkwebDriverPowerStateInject(powerState);默认:中断;}returnret;}intHdftalkwebDriverBind(structHdfDeviceObject*deviceObject){staticstructIDeviceIrDriverDisptestService,.Open=NULL,.Release=NULL,};HDF_LOGD("%s::enter",__func__);if(deviceObject==NULL){returnHDF_FAILURE;}deviceObject->service=&testService;returnHDF_SUCCESS;}intHdftalkwebDozeResume(structHdfDeviceObject*deviceObject){HDF_LOGI("%s:called",__func__);returnHDF_SUCCESS;}intHdftalkwebDozeSuspend(structHdfDeviceObject*deviceObject){HDF_LOGI("%s:called",__func__);returnHDF_SUCCESS;}intHdftalkwebResume(structHdfDeviceObject*deviceObject){HDF_LOGI("%s:called",__func__);returnHDF_SUCCESS;}intHdftalkwebSuspend(structHdfDeviceObject*deviceObject){HDF_LOGI("%s:called",__func__);returnHDF_SUCCESS;}structtalkwebDriverPmListener{structIPowerEventListenerpowerListener;void*p;};intHdftalkwebDriverInit(structHdfDeviceObject*deviceObject){staticstructtalkwebDriverPmListenerpmListener={0};intret;HDF_LOGI("%s::enter!",__func__);if(deviceObject==NULL){HDF_LOGE("%s::ptrisnull!",__func__);returnHDF_FAILURE;}HDF_LOGE("%s:Initsuccess",__func__);pmListener.powerListener.DozeResume=HdftalkwebDozeResume;pmListener.powerListener.DozeSuspend=HdftalkwebDozeSuspend;pmListener.powerListener.Resume=HdftalkwebResume;pmListener.powerListener.Suspend=HdftalkwebSuspend;ret=HdfPmRegisterPowerListener(deviceObject,&pmListener.powerListener);HDF_LOGI(“,ret=registerpower%listd",__func__,ret);returnHDF_SUCCESS;}structHdfDriverEntryg_talkwebDriverEntry={.moduleVersion=1,.moduleName="talkweb_driver",.Bind=HdftalkwebDriverBind,.Init=HdftalkwebDriverInit,.Release=HdftalkwebDriverRelease,};HDF_INIT(Driver_)应用状态程序这里的应用状态程序的代码和编译方式可以直接采用上面的,这里只需要修改宏SAMPLE_SERVICE_NAME即可。#defineSAMPLE_SERVICE_NAME"talkweb_service"更多信息请访问:与华为官方共建的鸿蒙科技社区https://harmonyos.51cto.com