不同驱动模块间的函数调用

2024-09-06 07:20

本文主要是介绍不同驱动模块间的函数调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux层的处理

函数注册:

    if (ECNT_REGISTER_SUCCESS != ecnt_register_hook(&phy_api_dispatch_hook_ops) ){                                                          
        panic("Register hook function failed! %s:%d", __FUNCTION__, __LINE__);
    }

int ecnt_register_hook(struct ecnt_hook_ops *reg)^M
{^Mstruct ecnt_hook_ops *elem;^M
^Mif(!reg){^Mprintk("ecnt_register_hook fail, reg is NULL\n");^Mreturn ECNT_REGISTER_FAIL;^M}^Mif((reg->maintype >= ECNT_NUM_MAINTYPE) || (reg->subtype >= ECNT_MAX_SUBTYPE)){^Mprintk("ecnt_register_hook fail, maintype = %d, subtype=%d, out of range\n", reg->maintype, reg->subtype);^Mreturn ECNT_REGISTER_FAIL;^M}^Mif(reg->list.next!= NULL){^Mprintk("ecnt_register_hook fail, %s already registered\n", reg->name);^Mreturn ECNT_REGISTER_FAIL;^M}^Mif(hook_id >= 0xFFFFFFFF){^Mprintk("ecnt_register_hook fail, hook_id out of range\n");^Mreturn ECNT_REGISTER_FAIL;^M}^Mspin_lock(&ecnt_hook_lock);^Mlist_for_each_entry(elem, &ecnt_hooks[reg->maintype][reg->subtype], list) {^Mif (reg->priority < elem->priority)^Mbreak;^M}^Mreg->hook_id = ++hook_id;^Mreg->info.drop_num = 0;^Mlist_add_rcu(&reg->list, elem->list.prev);^Mspin_unlock(&ecnt_hook_lock);^M
^Mreturn ECNT_REGISTER_SUCCESS;^M
}^M
EXPORT_SYMBOL(ecnt_register_hook);

函数调用:

static inline int CALL_PON_PHY_ENCT_HOOK(struct xpon_phy_api_data_s * data)
{

    if(ECNT_HOOK_ERROR == __ECNT_HOOK(ECNT_XPON_PHY, ECNT_XPON_PHY_API, (struct ecnt_data * )data) ){                                       
        panic("ECNT_HOOK_ERROR occur with cmd_id:0x%x\n", data->cmd_id);
    }   

    if(PHY_NO_API == data->ret){
        panic("No such API with type:%d, cmd_id:0x%x\n", data->api_type, data->cmd_id);
    }   

    return data->ret;
}
 

__IMEM ecnt_ret_val __ECNT_HOOK(unsigned int maintype, unsigned int subtype,struct ecnt_data *in_data)^M
{^Mecnt_ret_val ret;^Mstruct ecnt_hook_ops *elem;^Mstruct list_head* ptr = &ecnt_hooks[maintype][subtype];^M^M  if((maintype >= ECNT_NUM_MAINTYPE) || (subtype >= ECNT_MAX_SUBTYPE)){^Mprintk("__ECNT_HOOK fail, max maintype %d, max subtype %d\n", ECNT_NUM_MAINTYPE, ECNT_MAX_SUBTYPE);^Mreturn ECNT_HOOK_ERROR;^M}^M if (list_empty(&ecnt_hooks[maintype][subtype])){^Mreturn ECNT_HOOK_ERROR;^M}^M ^M  /* We may already have this, but read-locks nest anyway */rcu_read_lock();
^Melem = list_entry_rcu(ptr, struct ecnt_hook_ops, list); ^M/* We may already have this, but read-locks nest anyway */^Mret = ecnt_iterate(&ecnt_hooks[maintype][subtype], &elem, in_data);^Mrcu_read_unlock();^M^M  return ret;^M
}^M
EXPORT_SYMBOL(__ECNT_HOOK);

注册格式:

struct ecnt_hook_ops phy_api_dispatch_hook_ops = {                                                                                          
    .name = "pon_phy_api_dispatch",
    .hookfn = pon_phy_api_dispatch,
    .is_execute = 1, 
    .maintype = ECNT_XPON_PHY,
    .subtype = ECNT_XPON_PHY_API,
    .priority   = 1, 
};
 

这篇关于不同驱动模块间的函数调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141369

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语