电子产业一站式赋能平台

PCB联盟网

搜索
查看: 3347|回复: 0
收起左侧

HarmonyOS HDF驱动框架---开发实例

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-9-16 19:56:52 | 显示全部楼层 |阅读模式
HarmonyOS HDF驱动框架---开发实例, 下面基于HDF框架,提供一个完整的样例,包含配置文件的添加,驱动代码的实现以及用户状态程序和驱动交互的流程。


添加配置 在HDF框架的配置文件中(例如,vendor / hisi / hi35xx / hi3516dv300 / config / device_info / device_info.hcs)中添加该驱动的配置信息,如下所示:

  • 根 {
  •     设备信息 {
  •         match_attr =“ hdf_manager”;
  •         模板主机{
  •             hostName =“”;
  •             优先级= 100;
  •             模板设备{
  •                 模板deviceNode {
  •                     策略= 0;
  •                     优先级= 100;
  •                     预载= 0;
  •                     许可= 0664;
  •                     moduleName =“”;
  •                     serviceName =“”;
  •                     deviceMatchAttr =“”;
  •                 }
  •             }
  •         }
  •         sample_host ::主机{
  •             hostName =“ sample_host”;
  •             sample_device ::设备{
  •                 device0 :: deviceNode {
  •                     策略= 2;
  •                     优先级= 100;
  •                     预载= 1;
  •                     许可= 0664;
  •                     moduleName =“ sample_driver”;
  •                     serviceName =“ sample_service”;
  •                 }
  •             }
  •         }
  •     }
  • }
      

编写驱动代码 基于HDF框架编写的样本驱动代码如下:

  • #include <fcntl.h>
  • #include <sys / stat.h>
  • #include <sys / ioctl.h>
  • #include“ hdf_log.h”
  • #include“ hdf_base.h”
  • #include“ hdf_device_desc.h”

  • #define HDF_LOG_TAG sample_driver

  • #定义SAMPLE_WRITE_READ 123

  • int32_t HdfSampLEDriverDispatch(
  •     struct HdfDeviceObject * deviceObject,int id,struct HdfSBuf * data,struct HdfSBuf * reply)
  • {
  •     HDF_LOGE(“%s:收到cmd%d”,__ func __,id);
  •     如果(id == SAMPLE_WRITE_READ){
  •         const char * readData = HdfSbufReadString(data);
  •         如果(readData!= NULL){
  •             HDF_LOGE(“%s:读取的数据为:%s”,__func__,readData);
  •         }
  •         如果(!HdfSbufWriteInt32(reply,INT32_MAX)){
  •             HDF_LOGE(“%s:回复int32失败”,__func__);
  •         }
  •         返回HdfDeviceSendEvent(deviceObject,id,data);
  •     }
  •     返回HDF_FAILURE;
  • }

  • HdfSampleDriverRelease(结构HdfDeviceObject * deviceObject)
  • {
  •     //在此处释放资源
  •     返回;
  • }

  • int HdfSampleDriverBind(结构HdfDeviceObject * deviceObject)
  • {
  •     如果(deviceObject == NULL){
  •         返回HDF_FAILURE;
  •     }
  •     静态结构IDeviceIoService testService = {
  •         .Dispatch = HdfSampleDriverDispatch,
  •     };
  •     deviceObject-> service =&testService;
  •     返回HDF_SUCCESS;
  • }

  • int HdfSampleDriverInit(结构HdfDeviceObject * deviceObject)
  • {
  •     如果(deviceObject == NULL){
  •         HDF_LOGE(“%s :: ptr为空!”,__func__);
  •         返回HDF_FAILURE;
  •     }
  •     HDF_LOGE(“示例驱动程序初始化成功”);
  •     返回HDF_SUCCESS;
  • }

  • struct HdfDriverEntry g_sampleDriverEntry = {
  •     .moduleVersion = 1,
  •     .moduleName =“ sample_driver”,
  •     .Bind = HdfSampleDriverBind,
  •     .Init = HdfSampleDriverInit,
  •     .Release = HdfSampleDriverRelease,
  • };

  • HDF_INIT(g_sampleDriverEntry);
      

编写用户程序和驱动交互代码 基于HDF框架编写的用户状态程序和驱动交互的代码如下:

  • #include <fcntl.h>
  • #include <sys / stat.h>
  • #include <sys / ioctl.h>
  • #include <unistd.h>
  • #include“ hdf_log.h”
  • #include“ hdf_sbuf.h”
  • #include“ hdf_io_service_IF.h”

  • #define HDF_LOG_TAG“ sample_test”
  • #define SAMPLE_SERVICE_NAME“ sample_service”

  • #定义SAMPLE_WRITE_READ 123

  • int g_replyFlag = 0;

  • 静态int OnDevEventReceived(void * priv,uint32_t id,struct HdfSBuf * data)
  • {
  •     const char * string = HdfSbufReadString(data);
  •     if(string == NULL){
  •         HDF_LOGE(“无法读取事件数据中的字符串”);
  •         g_replyFlag = 1;
  •         返回HDF_FAILURE;
  •     }
  •     HDF_LOGE(“%s:已收到开发人员事件:%u%s”,(char *)priv,id,string);
  •     g_replyFlag = 1;
  •     返回HDF_SUCCESS;
  • }

  • 静态int SendEvent(struct HdfIoService * serv,char * eventData)
  • {
  •     int ret = 0;
  •     struct HdfSBuf * data = HdfSBufObtainDefaultSize();
  •     如果(数据== NULL){
  •         HDF_LOGE(“无法获取sbuf数据”);
  •         返回1;
  •     }

  •     struct HdfSBuf * reply = HdfSBufObtainDefaultSize();
  •     如果(回复== NULL){
  •         HDF_LOGE(“无法获得sbuf答复”);
  •         ret = HDF_DEV_ERR_NO_MEMORY;
  •         出去
  •     }

  •     如果(!HdfSbufWriteString(data,eventData)){
  •         HDF_LOGE(“无法写入sbuf”);
  •         ret = HDF_FAILURE;
  •         出去
  •     }

  •     ret = serv-> dispatcher-> Dispatch(&serv->对象,SAMPLE_WRITE_READ,数据,回复);
  •     if(ret!= HDF_SUCCESS){
  •         HDF_LOGE(“无法发送服务呼叫”);
  •         出去
  •     }

  •     int replyData = 0;
  •     如果(!HdfSbufReadInt32(reply,&replyData)){
  •         HDF_LOGE(“无法获得服务呼叫回复”);
  •         ret = HDF_ERR_INVALID_OBJECT;
  •         出去
  •     }
  •     HDF_LOGE(“获取答复为:%d”,replyData);
  • 出:
  •     HdfSBufRecycle(data);
  •     HdfSBufRecycle(回复);
  •     返回ret
  • }

  • int main()
  • {
  •     char * sendData =“默认事件信息”;
  •     struct HdfIoService * serv = HdfIoServiceBind(SAMPLE_SERVICE_NAME,0);
  •     如果(serv == NULL){
  •         HDF_LOGE(“无法获得服务%s”,SAMPLE_SERVICE_NAME);
  •         返回HDF_FAILURE;
  •     }

  •     静态结构HdfDevEventlistener侦听器= {
  •         .callBack = OnDevEventReceived,
  •         .priv =“ Service0”
  •     };

  •     如果(HdfDeviceRegisterEventListener(serv,&listener)!= HDF_SUCCESS){
  •         HDF_LOGE(“未能注册事件监听器”);
  •         返回HDF_FAILURE;
  •     }
  •     如果(SendEvent(serv,sendData)){
  •         HDF_LOGE(“发送事件失败”);
  •         返回HDF_FAILURE;
  •     }

  •     / *等待事件接收事件完成* /
  •     而(g_replyFlag == 0){
  •         睡眠(1);
  •     }

  •     如果(HdfDeviceUnregisterEventListener(serv,&listener)){
  •         HDF_LOGE(“未能注销监听器失败”);
  •         返回HDF_FAILURE;
  •     }

  •     HdfIoServiceRecycle(serv);
  •     返回HDF_SUCCESS;
  • }
      

说明

用户态应用程序使用了HDF框架中的消息发送接口,因此在编译用户态程序的过程中需要依赖HDF框架对外提供的hdf_core和osal的动态库,在gn编译文件中添加如下依赖项: 单位= [ “ // drivers / hdf / lite / manager:hdf_core”, “ // drivers / hdf / lite / adapter / osal / posix:hdf_posix_osal”,
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表