欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 不同驱动模块间的函数调用

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

2025/3/10 6:14:22 来源:https://blog.csdn.net/lixiaofeng0/article/details/141931245  浏览:    关键词:不同驱动模块间的函数调用

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, 
};
 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词