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_GPON
    if(_IOC_TYPE(cmd) == GPON_MAGIC) {
        ret = gpon_cmd_proc(cmd, arg) ;
    } else 
#endif /* TCSUPPORT_WAN_GPON */
#ifdef TCSUPPORT_WAN_EPON
    if(_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文件系统

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘多拉的面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值