分享
收藏
返回
elecfans小能手
关注
私信
[文章]
HarmonyOS HDF驱动框架---开发实例
鸿蒙系统
开发实例
HarmonyOS
鸿蒙OS
下面基于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
#include
#include
#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
#include
#include
#include
#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”,
更多回帖
rotate(-90deg);
回复
我也要说两句
回帖
回复评论
相关经验
HarmonyOS
HDF
驱动
框架
---
驱动
开发
HarmonyOS
HDF
驱动
框架
---
开发
概述
HarmonyOS
HDF
驱动
框架
---
驱动
消息机制管理
HarmonyOS
HDF
驱动
框架
---
驱动
服务管理
HarmonyOS_HDF
框架
(直播课件)
HarmonyOS
HDF
驱动
框架
---配置管理
HDF
驱动
框架
中USB DDK的解析与
开发
指导
OpenHarmony系统
HDF
驱动
框架
概述
基于
HarmonyOS
HDF
驱动
框架
的控制AI Camera
开发
板LED闪烁
OpenHarmony
HDF
平台
驱动
框架
及
驱动
适配介绍
×
长按上方图片保存到相册
复制链接
长按二维码打开
发帖