ioctl的注册方式

2024-09-06 04:12
文章标签 方式 注册 ioctl

本文主要是介绍ioctl的注册方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、通过内核文件进行注册

注册形式:

long pon_mci_ioctl(struct file *filp, uint cmd, ulong arg) 
{int ret = -EINVAL ;while(TRUE == should_iotcl_wait() ){msleep(100) ;}#ifdef TCSUPPORT_WAN_GPONif(_IOC_TYPE(cmd) == GPON_MAGIC) {ret = gpon_cmd_proc(cmd, arg) ;} else 
#endif /* TCSUPPORT_WAN_GPON */
#ifdef TCSUPPORT_WAN_EPONif(_IOC_TYPE(cmd) == EPON_MAGIC) {ret = epon_cmd_proc(cmd, arg) ;} else 
#endif /* TCSUPPORT_WAN_EPON */if(_IOC_TYPE(cmd) == INTERFACE_MAGIC) {ret = if_cmd_proc(cmd, arg) ;} else if(_IOC_TYPE(cmd) == FDET_MAGIC) {ret = fdet_cmd_proc(cmd, arg) ;} else if(_IOC_TYPE(cmd) == PHY_MAGIC) {ret = phy_cmd_proc(cmd, arg) ;}return ret ;
}struct file_operations xmci_fops = {.owner          = THIS_MODULE,.unlocked_ioctl = pon_mci_ioctl,
} ;int pon_mci_init(void)
{int ret = 0 ;dev_t devNo ;devNo = MKDEV(COSNT_XMCI_MAJOR_NUN, 0) ;ret = register_chrdev_region(devNo, 1, CONST_XMCI_DEV_NAME) ;if(ret < 0) {PON_MSG(MSG_ERR, "Get the PON MCI device number (register_chrdev_region()) failed\n") ;return ret ;}gpMcsPriv->pPonMciDev = cdev_alloc() ;if(gpMcsPriv->pPonMciDev == NULL) {PON_MSG(MSG_ERR, "Alloc character device (cdev_alloc()) failed\n") ;ret = -ENOMEM ;goto out ;}cdev_init(gpMcsPriv->pPonMciDev, &xmci_fops) ;gpMcsPriv->pPonMciDev->owner = THIS_MODULE ;gpMcsPriv->pPonMciDev->ops = &xmci_fops ;ret = cdev_add(gpMcsPriv->pPonMciDev, devNo, 1) ;if(ret < 0) {PON_MSG(MSG_ERR, "PON MCI driver register failed\n") ;goto out ;}

unlocked_ioctl注册

关联设备:

ret = register_chrdev_region(devNo, 1, CONST_XMCI_DEV_NAME)

相关资料:

注册设备

如前所述,char设备是通过设备文件访问的,通常位于/ dev [7]中 。 主要编号告诉您哪个驱动程序处理哪个设备文件。 次要编号仅由驱动程序本身使用,以区分它正在操作的设备,以防驱动程序处理多个设备。

向系统添加驱动程序意味着将其注册到内核。 这与在模块初始化期间为其分配主编号同义。 您可以使用由linux / fs.h定义的register_chrdev函数来完成此操作 。

int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
  • 1

其中unsigned int major是您要请求的主要编号, const char * name是设备的名称,因为它将出现在/ proc / devices和struct file_operations中* fops是指向驱动程序的file_operations表的指针。 负返回值表示注册失败。 请注意,我们没有将次要编号传递给register_chrdev 。 那是因为内核并不关心次要数字; 只有我们的司机使用它。

现在的问题是,如何在不劫持已使用的数字的情况下获得一个主要数字? 最简单的方法是查看Documentation / devices.txt并选择一个未使用的文件。 这是一种糟糕的做事方式,因为你永远不会确定你选择的号码是否会在以后分配。 答案是你可以要求内核为你分配一个动态的主号码。

如果将主要编号0传递给register_chrdev ,则返回值将是动态分配的主编号。 缺点是您无法提前制作设备文件,因为您不知道主要编号是什么。 有几种方法可以做到这一点。 首先,驱动程序本身可以打印新分配的号码,我们可以手动制作设备文件。 其次,新注册的设备将在/ proc / devices中有一个条目,我们可以手工制作设备文件,也可以编写shell脚本来读取文件并制作设备文件。 第三种方法是我们可以让我们的驱动程序在成功注册后使用mknod系统调用来生成设备文件,并在调用cleanup_module期间使用rm。

注册到proc 和 dev下的区别:

字符设备文件和 proc文件系统

 

这篇关于ioctl的注册方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室