当前位置: 技术问答>linux和unix
驱动中怎样自动分配一个主设备两个子设备号?
来源: 互联网 发布时间:2017-02-28
本文导语: 使用busybox提供的mdev管理设备节点,现在有个问题,一个字符设备,控制两路硬件,即两个子设备,这是设备号应该怎么自动分配?比如一个CAN驱动程序,下面有两路CAN接口,CAN1和CAN2, struct mcp251x { struct cdev...
使用busybox提供的mdev管理设备节点,现在有个问题,一个字符设备,控制两路硬件,即两个子设备,这是设备号应该怎么自动分配?比如一个CAN驱动程序,下面有两路CAN接口,CAN1和CAN2,
我按照上述的方法加载驱动后,显示了如下错误信息
------------[ cut here ]------------
WARNING: at fs/sysfs/dir.c:463 sysfs_add_one+0x34/0x48()
sysfs: duplicate filename 'can' can not be created
struct mcp251x {
struct cdev cdev;
struct device sdev;
struct class *cclass;
int dev; /* device number */
}
static struct mcp251x *mcp251x_dev;
static int mcp251x_count=2;
static int __init mcp251x_init(void)
{
mcp251x_dev = kmalloc(sizeof(struct mcp251x)*mcp251x_count,GFP_KERNEL);
for (i=0; idev,/*base minor*/ 0, 1, DRIVER_NAME);//这里是不是重复申请了设备号,应该就一个主设备号啊
chip->cclass = class_create(THIS_MODULE, DRIVER_NAME);
cdev_init(&chip->cdev, &mcp251x_fops);
chip->cdev.owner = THIS_MODULE;
chip->cdev.ops = &mcp251x_fops;
ret = cdev_add (&chip->cdev, chip->dev, 1);
/* Fail gracefully if need be */
if (ret)
printk (KERN_NOTICE "Error %d adding can_lpc2xxxn", ret);
if (device_create(chip->cclass, NULL,
MKDEV(MAJOR(chip->dev), i), chip, DRIVER_NAME) == NULL) {
printk("err----%s %d n",__FILE__,__LINE__);
}
}
}
我按照上述的方法加载驱动后,显示了如下错误信息
------------[ cut here ]------------
WARNING: at fs/sysfs/dir.c:463 sysfs_add_one+0x34/0x48()
sysfs: duplicate filename 'can' can not be created
|
1、
alloc_chrdev_region 确实只应该执行一次,申请一个主设备号
2、
cdev_add (&chip->cdev, chip->dev, 1); 改为
cdev_add (&chip->cdev, chip->dev+i, 1);
3、
device_create 最后一个参数要弄成变长参数那样,设备名才不一样
device_create(chip->cclass, NULL, MKDEV(MAJOR(chip->dev), i), chip, "can%d",i)
Prentice.Hall.Essential.Linux.Device.Drivers.Apr.2008.chm 这本书可以免费下载到,代码5-1就是这样的例子
alloc_chrdev_region 确实只应该执行一次,申请一个主设备号
2、
cdev_add (&chip->cdev, chip->dev, 1); 改为
cdev_add (&chip->cdev, chip->dev+i, 1);
3、
device_create 最后一个参数要弄成变长参数那样,设备名才不一样
device_create(chip->cclass, NULL, MKDEV(MAJOR(chip->dev), i), chip, "can%d",i)
Prentice.Hall.Essential.Linux.Device.Drivers.Apr.2008.chm 这本书可以免费下载到,代码5-1就是这样的例子
|
5-1 里的cmos_dev_number 是alloc_chrdev_region 申请到的完整的dev_t
alloc_chrdev_region 包含主设备号和从设备号,当然从设备号是0
在5-1 的例子里i确实在是device_create和cdev_add里做次设备号
cmos_dev_number+i 和 MKDEV(MAJOR(cmos_dev_number), i) 等效
但是我觉得作者不严谨,全部改用 MKDEV(MAJOR(cmos_dev_number), i) 最好
alloc_chrdev_region 包含主设备号和从设备号,当然从设备号是0
在5-1 的例子里i确实在是device_create和cdev_add里做次设备号
cmos_dev_number+i 和 MKDEV(MAJOR(cmos_dev_number), i) 等效
但是我觉得作者不严谨,全部改用 MKDEV(MAJOR(cmos_dev_number), i) 最好