linux 混杂设备 miscdevice设备介绍

混杂设备是字符设备的一种混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备。

struct miscdevice  {
    int minor;           //次设备号
    const char *name;
    const struct file_operations *fops;  //文件操作集
    struct list_head list;
    struct device *parent;
    struct device *this_device;
    const char *nodename;
    mode_t mode;
};

通常情况下,一个字符设备都在初始化的过程中的步骤:

1,通过alloc_chrdev_region()分配主/次设备号。2,使用cdev_init()和cdev_add()来以一个字符设备注册自己。 详细介绍见http://my.oschina.net/u/274829/blog/283702

而一个misc驱动,则可以只用一个调用misc_register()来完成这所有的步骤。

使用流程

static int __init dev_init(void)
{
    int ret;
   
    ret = misc_register(&misc);  //注册设备号
    
    return ret;
}

设备结构

static struct miscdevice misc = {
    .minor = MISC_DYNAMIC_MINOR,  //这里注意,一般分配为0,意思:让系统自动分配,防止冲突
    .name = DEVICE_NAME,
    .fops = &dev_fops,
};

文件操作集

static struct file_operations dev_fops = {
    .owner    =    THIS_MODULE,
    .ioctl    =    leds_ioctl,
};

static int sbc2440_leds_ioctl(
    struct inode *inode, 
    struct file *file, 
    unsigned int cmd, 
    unsigned long arg)
{
    switch(cmd) {
    case 0:
          ....;
          break;
    default:
        return -EINVAL;
    }
}

退出注册

static void __exit dev_exit(void)
{
    misc_deregister(&misc);  //退出设备
  printk (DEVICE_NAME"\tuninstalled\n");
}

详细应用例程见ok6410-led流水灯控制文件 http://my.oschina.net/u/274829/blog/267552

转载于:https://my.oschina.net/u/274829/blog/285164

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值