Linux按键驱动程序设计(1)-混杂设备驱动模型

1.混杂设备概念

  • 在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。
  • 混杂设备是字符设备的一种,它们共享一个主设备号(10),但次设备号不同,所有混杂设备形成一个链表,对设备发起访问时,内核根据次设备号查找到相应的miscdevice设备。这样做的好处,节约主设备号,将某些设备用链表的形式链接在一起,最后通过查找次设备号区分。一般来说LED驱动程序和按键驱动程序都可以分类成混杂设备。

2.设备描述

  • Linux中使用struct 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;
};
  • 这里主要关注次设备号设备名文件操作3个成员。

3、设备注册及注销

  • 注册
    • Linux中使用misc_register函数来注册一个混杂设备驱动。
    • int misc_register(struct miscdevice * misc)
  • 注销
    • int misc_deregister(struct miscdevice * misc)

4.实例代码

  • 混杂设备的驱动仍然是一个模块代码,同时按照上述的介绍可以写出混杂设备驱动程序的框架了。
    • 编写模块代码框架
      • 1.初始化miscdevice:主要是minor、name、fops成员
      • 2.注册miscdevice
      • 3.实现file_operations里面的函数代码
      • 4.注销miscdevice
  • 按键驱动框架

key.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/miscdevice.h>

int key_open(struct inode *node, struct file *filp)
{
    return 0;
}

struct file_operations key_fops = 
{
    .open = key_open,		
};

// 初始化miscdevice
struct miscdevice key_miscdev = 
{
    .minor = 200,   // 次设备号
    .name = key,   // 设备名
    .fops = &key_fops,  // 文件操作
};	

static int key_init()
{
    // 注册miscdevice
    misc_register(&key_miscdev);
    
    return 0;	
}

static void key_exit()
{	
     // 注销miscdevice
    misc_deregister(&key_miscdev);   	
}

MODULE_LICENSE("GPL");

module_init(key_init);
module_exit(key_exit);

猜你喜欢

转载自blog.csdn.net/qq_22847457/article/details/91377664