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

小熊派驱动开发流程(以LED照明为例)

时间:2023-03-15 19:30:15 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com1.流程概述创建驱动目录并添加驱动源代码文件和编译脚本–>添加驱动配置目录和驱动配置文件2.添加驱动文件2.1在./device/st/drivers路径下创建驱动文件夹新建一个led目录,用于存放驱动源代码文件。2.2创建驱动源码文件新建一个led.c文件,写入驱动源码#include"hdf_device_desc.h"#include"hdf_log.h"#include"device_resource_if.h"#include"osal_io.h"#include"osal.h"#include"osal_mem.h"#include"gpio_if.h"#defineHDF_LOG_TAGled_driver//打印日志包含的tag,如果没有定义,使用默认的HDF_TAGtag#defineLED_WRITE_READ1//读写writeoperationcode1enumLedOps{LED_OFF,LED_ON,LED_TOGGLE,};structStm32Mp1ILed{uint32_tgpioNum;};staticstructStm32Mp1ILedg_Stm32Mp1ILed;uint8_tstatus=0;//Dispatch用于处理来自用户态的消息int32_tLedDriverDispatch(structHdfDeviceIoClient*cmclientHdfSBuf*data,structHdfSBuf*reply){uint8_tcontrol;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,&co控制);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_HIG=H);状态0;}休息;默认值:中断;}/*将LED的状态值写入reply,可以带给用户程序*/if(!HdfSbufWriteInt32(reply,status)){HDF_LOGE("回放失败");返回HDF_FAILURE;}休息;默认值:中断;}returnHDF_SUCCESS;}//读取驱动私有配置staticint32_tStm32LedReadDrs(structStm32Mp1ILed*led,conststructDeviceResourceNode*node){int32_tret;结构DeviceResourceIface*drsOps=NULL;drsOps=DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);if(drsOps==NULL||drsOps->GetUint32==NULL){HDF_LOGE("%s:无效的drsops!",__func__);returnHDF_FAILURE/*读取led.hcs中led_gpio_num的值*/ret=drsOps->GetUint32(node,"led_gpio_num",&led->gpioNum,0);if(ret!=HDF_SUCCESS){HDF_LOGE("%s:readledgpionumfail!",__func__);返还;}returnHDF_SUCCESS;}//驱动对外提供的服务能力,将相关服务接口绑定到HDF框架int32_tHdfLedDriverBind(structHdfDeviceObject*deviceObject){if(deviceObject==NULL){HDF_LOGE("Leddriverbindfailed!");返回HDF_ERR_INVALID_目的;}staticstructIDeviceIoServiceledDriver={.Dispatch=LedDriverDispatch,};deviceObject->service=(structIDeviceIoService*)(&ledDriver);HDF_LOGD("Led驱动绑定成功");returnHDF_SUCCESS;}//驱动自身业务初始化int32_tHdfLedDriverInit(structHdfDeviceObject*device){structStm32Mp1ILed*led=&g_Stm32Mp1ILed;int32_t退役;if(device==NULL||device->property==NULL){HDF_LOGE("%s:deviceorpropertyNULL!",__func__);返回HDF_ERR_INVALID_OBJECT;}/*读取hcs私有属性值*/ret=Stm32LedReadDrs(led,device->property);if(ret!=HDF_SUCCESS){HDF_LOGE("%s:getleddeviceresourcefail:%d",__func__,ret);返还;}/*将GPIO引脚配置为输出*/ret=GpioSetDir(led->gpioNum,GPIO_DIR_OUT);if(ret!=0){HDF_LOGE("GpioSerDir:failed,ret%d\n",ret);返还;}HDF_LOGD("Led驱动初始化成功");返回HDF_SUCCESS;}//驱动资源释放接口返回;}HDF_LOGD("Led驱动发布成功");return;}//定义驱动入口的对象必须是HdfDriverEntry类型的全局变量(在hdf_device_desc.h中定义)structHdfDriverEntryg_ledDriverEntry={.moduleVersion=1,.moduleName="HDF_LED",.Bind=HdfLedDriverBind,.Init=HdfLedDriverInit,.Release=HdfLedDriverRelease,};//调用HDF_INIT将驱动入口注册到HDF框架中HDF_INIT(g_ledDriverEntry);2.3创建编译脚本文件新建一个BUILD.gn文件,添加如下内容",]}2.4修改驱动的编译脚本,编译到内核/device/st/drivers/BUILD.gn中,在deps中添加"led"3.添加驱动配置文件驱动配置包括两部分,HDF框架定义的驱动私有配置信息和驱动设备描述3.1在./device/st/bearpi_hm_micro/liteos_a/hdf_config中创建驱动配置文件夹在该路径下创建一个led目录,用于存放led驱动配置文件3.2创建驱动私有配置文件在led文件夹下创建led_config.hcs文件,即驱动配置文件。添加以下内容root{LedDriverConfig{led_gpio_num=13;match_attr="st_stm32mp157_led";//该字段的值必须和device_info.hcs中deviceMatchAttr的值一致}}3.3在device\st\bearpi_hm_micro\liteos_a\hdf_config中添加驱动设备描述在\device_info\device_info.hcs文件device_led中添加如下代码::device{//led设备节点device0::deviceNode{//leddriver的DeviceNode节点policy=2;服务管理章节有详细介绍。优先级=10;//驱动启动优先级(0-200),值越大优先级越低。建议默认配置100。如果优先级相同,则无法保证设备的加载顺序。预载=1;//驱动加载字段permission=0777;//驱动程序创建设备节点权限moduleName="HDF_LED";//驱动名称,该字段的值必须与驱动入口结构体的moduleName值保持一致serviceName="hdf_led";//Driver对外发布服务的名称必须是唯一的deviceMatchAttr="st_stm32mp157_led";//匹配驱动私有数据的关键字必须等于驱动私有数据配置表中的match_attr值}}如图,moduleName必须与led.c**中的一致。moduleName="HDF_LED"**参数一致serviceName必须和led_config.hcs中的参数**match_attr="st_stm32mp157_led"**保持一致3.4将写好的驱动添加到device\st\bearpi_hm_micro中的板级配置入口添加\liteos_a\hdf_config\hdf.hcs文件中的以下代码#include"led/led_config.hcs"4.总结到此结束,开发LED驱动的过程就结束了。更多信息请访问:鸿蒙科技社区,与华为官方共建https://harmonyos.51cto.com