当前位置:  技术问答>linux和unix

驱动中怎样自动分配一个主设备两个子设备号?

    来源: 互联网  发布时间:2017-02-28

    本文导语:  使用busybox提供的mdev管理设备节点,现在有个问题,一个字符设备,控制两路硬件,即两个子设备,这是设备号应该怎么自动分配?比如一个CAN驱动程序,下面有两路CAN接口,CAN1和CAN2, struct mcp251x {     struct cdev...

使用busybox提供的mdev管理设备节点,现在有个问题,一个字符设备,控制两路硬件,即两个子设备,这是设备号应该怎么自动分配?比如一个CAN驱动程序,下面有两路CAN接口,CAN1和CAN2,

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就是这样的例子

|
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) 最好

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有两个USB键盘怎么用自己写的USB键盘驱动程序只替换其中一个驱动?
  • 两个驱动程序能互相访问么?
  • SD驱动应该如何修改才能支持两个相同的SD控制器?
  • 关于两个网卡的网卡驱动程序编写的问题?
  • 内核驱动两个.c文件的问题!
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • 关于linux块设备驱动程序的两个问题
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 字符设备驱动,混杂设备驱动,总线、设备、驱动模型、平台驱动
  • UIO(linux Userspace I/O子系统)用户空间设备驱动I/O技术介绍
  • 好不容易下到sis900网卡for unix的驱动,但装上驱动后系统驱动时: SiS900 adapter initialization failure!
  • 我的网卡在redhat7.3下不能自动驱动,但我有for linux的驱动程序,请问如何才能驱动我的网卡,我是菜菜,请详细说明,谢谢!
  • Linux环境下,“PC机的驱动”与“嵌入式驱动”有什么区别?
  • linux:怎么在驱动中调用IIC驱动?
  • linux驱动 单片机驱动
  • linux下一个驱动怎么调用另一个驱动
  • u boot中怎样写flash驱动以及串口驱动
  • Linux环境下,如何一个驱动中调用另外一个驱动
  • 一个驱动文件,生成多个驱动模块??
  • -------------- 请问大家,做好一个PCI设备驱动了,如何做个应用程序来使用这个驱动呢??
  • pcie驱动和pci驱动
  • usb驱动中 hcd,pcd,device,gadget驱动有什么区别啊?
  • 移植pci驱动和RTL8139网卡驱动,只发生一次中断?
  • 想试着编写简单驱动玩,但是手头上没有什么好驱动的设备,大家支招
  • 请教有关linux驱动开发,按关机键关机时,驱动应作哪些结束工作?
  • Linux源代码中ata驱动为什么要调用pci驱动的代码
  • Linux设备驱动(第三版)- 字符设备驱动 - 例子
  • Linux 9.0+865G,只能上到640×480,Intel官方站点的最新驱动安装失败,那位有驱动?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3