[文章]HarmonyOS HDF驱动框架---开发实例

阅读量0
0
3
下面基于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_***uf.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(“无法获取***uf数据”);
  •         返回1;
  •     }
  •     struct HdfSBuf * reply = HdfSBufObtainDefaultSize();
  •     如果(回复== NULL){
  •         HDF_LOGE(“无法获得***uf答复”);
  •         ret = HDF_DEV_ERR_NO_MEMORY;
  •         出去
  •     }
  •     如果(!HdfSbufWriteString(data,eventData)){
  •         HDF_LOGE(“无法写入***uf”);
  •         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”,

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友