更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com1.流程概述驱动调用的流程和纯代码开发很相似。本文重点介绍驱动调用的逻辑。创建目录和对应的源码文件–>编写驱动调用代码–>编写编译构建文件BUILD.gn–>编译、烧录、运行2.源码目录结构在./applications/BearPi/BearPi-HM_Micro下创建my_led_app源码/samples/目录*my_led_app.c驱动调用源码*BUILD.gn源码编译脚本如图3.编写驱动调用代码在my_led_app.c中写入如下代码#include#include#include#include#include#include"hdf_sbuf.h"#include"hdf_io_service_if.h"#defineLED_WRITE_READ1#defineLED_SERVICE“hdf_led”staticintSendEvent(structHdfIoService*serv,uint8_teventData){intret=0;结构HdfSBuf*数据=HdfSBufObtainDefaultSize();if(data==NULL){printf("获取sbuf数据失败!\r\n");返回1;}structHdfSBuf*reply=HdfSBufObtainDefaultSize();if(reply==NULL){printf("获取sbuf回复失败!\r\n");ret=HDF_DEV_ERR_NO_MEMORY;出去;}/*写入数据*/if(!HdfSbufWriteUint8(data,eventData)){printf("写入sbuf失败!\r\n");ret=HDF_FAILURE;出去;}/*通过Dispatch发送到驱动*/ret=serv->dispatcher->Dispatch(&serv->object,LED_WRITE_READ,data,reply);if(ret!=HDF_SUCCESS){printf("发送服务调用失败!\r\n");出去;}intreplyData=0;/*读取驱动的回复数据*/if(!HdfSbufReadInt32(reply,&replyData)){printf("获取服务调用回复失败!\r\n");ret=HDF_ERR_INVALID_OBJECT;出去;}printf("\r\nGetreplyis:%d\r\n",replyData);out:HdfSBufRecycle(data);HdfSBufRecycle(回复);returnret;}intmain(intargc,char**argv){inti;/*获取服务*/structHdfIoService*serv=HdfIoServiceBind(LED_SERVICE);if(serv==NULL){printf("获取服务%s失败!\r\n",LED_SERVICE);返回HDF_FAILURE;}for(i=0;idispatcher->Dispatch(&serv->object,LED_WRITE_READ,数据,回复);if(ret!=HDF_SUCCESS){printf("发送服务调用失败!\r\n");出去;}intreplyData=0;这段代码实现了发送命令给driverdrivercommand接受的代码是上一篇led.c驱动代码中的LedDriverDispatch函数//Dispatch用于处理从用户态发送过来的消息int32_tLedDriverDispatch(structHdfDeviceIoClient*client,intcmdCode,结构HdfSBuf*数据,结构HdfSBuf*回复){uint8_t控制;HDF_LOGE("LED驱动调度");if(client==NULL||client->device==NULL){HDF_LOGE("LeddriverdeviceisNULL");返回HDF_ERR_INVALID_OBJECT;}switch(cmdCode){/*从用户模式接收到LED_WRITE_READ命令*/caseLED_WRITE_READ:/*读取data中的数据并赋值给control*/HdfSbufReadUint8(data,&control);switch(control){/*打开灯*/caseLED_ON:GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_LOW);状态=1;休息;/*关灯*/caseLED_OFF:GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_HIGH);状态=0;休息;/*状态翻转*/caseLED_TOGGLE:if(status==0){GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_LOW);状态=1;}else{GpioWrite(g_Stm32Mp1ILed.gpioNum,GPIO_VAL_HIGH);状态=0;写回复,可以带给用户程序*/if(!HdfSbufWriteInt32(reply,status)){HDF_LOGE("replayisfail");返回HDF_FAILURE;}休息;默认:休息;}returnHDF_SUCCESS;}3.2从驱动接收数据刚刚实现了从用户态向内核态发送指令,同理,内核态也可以向用户态发送数据再看驱动代码中向用户发送LED状态信息的代码(led.c中LedDriverDispatch函数的一部分)/*将LED的状态值写入reply中,可以带给用户程序*/if(!HdfSbufWriteInt32(reply,status)){HDF_LOGE("replayisfail");返回HDF_FAILURE;}以下是用户程序接收到的部分/*从驱动中读取回复数据*/if(!HdfSbufReadInt32(reply,&replyData)){printf("获取服务调用回复失败!\r\n");ret=HDF_ERR_INVALID_OBJECT;出去;}printf("\r\n得到的回复是:%d\r\n",replyData);4.编译构建文件BUILD.gn在BUILD.gn中添加如下代码){output_name="my_led"sources=["my_led_app.c",]include_dirs=["$HDF_FRAMEWORKS/ability/sbuf/include","$HDF_FRAMEWORKS/core/shared/include","$HDF_FRAMEWORKS/core/host/包括","$HDF_FRAMEWORKS/core/master/include","$HDF_FRAMEWORKS/include/core","$HDF_FRAMEWORKS/include/utils","$HDF_FRAMEWORKS/utils/include","$HDF_FRAMEWORKS/include/osal","//drivers/adapter/uhdf/posix/include","//third_party/bounds_checking_function/include","//base/hiviewdfx/hilog_lite/interfaces/native/innerkits",]deps=["//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared","//drivers/adapter/uhdf/manager:hdf_core","//drivers/adapter/uhdf/posix:hdf_posix_osal",]}lite_component("my_led_app"){features=[":led_lib",]}5.编译烧录参考上一篇Linux下配置BearPi-鸿蒙大叔设备开发(南向)六、运行串口连接BearPi终端。/bin/my_led0#关闭LED。/bin/my_led1#打开LED。/bin/my_led2#翻转LED更多信息,请访问:与华为官方共建Harmonyos技术社区https://harmonyos.51cto.com