现在的位置: 首页 > 综合 > 正文

混杂设备驱动程序

2013年02月04日 ⁄ 综合 ⁄ 共 1206字 ⁄ 字号 评论关闭

混杂设备驱动程序是那些简单的字符驱动程序,它们拥有一些相同的特性。内核将这些共同行抽象至一个API中(具体实现代码见 drivers/char/misc),这些简化了驱动程序的初始化的方式。所有的混杂设备都被分配一个主设备号10,但每个设备可选择一个单独的次设备号。

普通的字符驱动程序完成初始化的顺序如下。

  1,通过alloc_chrdev_region()及相关函数分配主/次设备号。

  2,使用device_create()创建/dev和/sys节点。

  3,使用cdev_init()和cdev_add()将自身注册为字符驱动程序。

混杂驱动只需要调用misc_register()即可完成字符驱动的所有步骤:

       static struct misdevice mydrv_dev={

            MYDRV_MINOR,

             "mydrv",

            &mydrv_fops

};

 misc_register(&mydrv_dev);

其中MYDRV_MINOR是静态分配给混杂驱动程序的次设备号。也可以在mydrv_dev机构中通过指定MISC_DYNAMIC_MINOR而不是MYDRV_MINOR以要求动态分配的次设备号。每一个混杂驱动程序自动出现在/sys/class/misc 文件中。

下面以友善6410提供的buttons驱动来说明一下。

#define DEVICE_NAME     "buttons"

..

..

..

static struct file_operations dev_fops = {
    .owner   =   THIS_MODULE,
    .open    =   s3c64xx_buttons_open,
    .release =   s3c64xx_buttons_close, 
    .read    =   s3c64xx_buttons_read,
    .poll    =   s3c64xx_buttons_poll,
};

static struct miscdevice misc = {
 .minor = MISC_DYNAMIC_MINOR,//动态分配次设备号
 .name = DEVICE_NAME,//设备名
 .fops = &dev_fops,//文件操作的方法
};

static int __init dev_init(void)
{
 int ret;

 ret = misc_register(&misc);//设备初始化

 printk (DEVICE_NAME"/tinitialized/n");

 return ret;
}

static void __exit dev_exit(void)
{
 misc_deregister(&misc);
}

总的来看混杂设备驱动程序主要是简化了驱动程序初始化的方式。

主要是参考<<essential linux device driver>>和友善的按键驱动程序。

抱歉!评论已关闭.