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文件系统