返回发烧友论坛
帖子
发 帖
提问题
发文章
发资料
发讨论
发活动
草稿箱
注册/登录
[文章]HarmonyOS HDF驱动框架---开发实例
elecfans小能手
2020-09-16 18:18:31
0
鸿蒙系统
开发实例
HarmonyOS
鸿蒙OS
扫一扫,分享给好友
复制链接分享
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”,
举报
回帖
高级模式
发布
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
侵权投诉
链接复制成功,分享给好友