定义:字符设备的一种,它们共享一个主设备号(10),但次设备号不同,所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的miscdevice设备。
例如:触摸屏,LED,按键,串口。
即:为了节约主设备号,将某些设备用链表的形式连接在一起,最后通过查找次设备区分。这里用主设备无法匹配出设备驱动,只能找到链表,再通过次设备号,才能找到设备驱动。而之前所学的,一般字符设备,通过主设备号,就能找到设备驱动了。
混杂设备驱动内置有自动创建设备节点的代码,所以编译好之后,能自动创建设备节点。
相关的宏,定义在
-
#ifndef
_LINUX_MISCDEVICE_H -
#define
_LINUX_MISCDEVICE_H -
#include
-
#include
-
-
-
-
#define
PSMOUSE_MINOR 1 -
#define
MS_BUSMOUSE_MINOR 2 -
#define
ATIXL_BUSMOUSE_MINOR 3 -
-
#define
ATARIMOUSE_MINOR 5 -
#define
SUN_MOUSE_MINOR 6 -
#define
APOLLO_MOUSE_MINOR 7 -
#define
PC110PAD_MINOR 9 -
-
#define
WATCHDOG_MINOR 130 -
#define
TEMP_MINOR 131 -
#define
RTC_MINOR 135 -
#define
EFI_RTC_MINOR 136 -
#define
SUN_OPENPROM_MINOR 139 -
#define
DMAPI_MINOR 140 -
#define
NVRAM_MINOR 144 -
#define
SGI_MMTIMER 153 -
#define
STORE_QUEUE_MINOR 155 -
#define
I2O_MINOR 166 -
#define
MICROCODE_MINOR 184 -
#define
TUN_MINOR 200 -
#define
MWAVE_MINOR 219 -
#define
MPT_MINOR 220 -
#define
MPT2SAS_MINOR 221 -
#define
HPET_MINOR 228 -
#define
FUSE_MINOR 229 -
#define
KVM_MINOR 232 -
#define
BTRFS_MINOR 234 -
#define
AUTOFS_MINOR 235 -
#define
MISC_DYNAMIC_MINOR 255 -
-
struct
device; -
-
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; -
};
-
-
extern
int misc_register( structmiscdevice * misc); //混杂设备注册 -
extern
int misc_deregister( structmiscdevice *misc); //混杂设备注销 -
-
#define
MODULE_ALIAS_MISCDEV(minor) -
MODULE_ALIAS("char-major-" __stringify(MISC_MAJOR) -
"-" __stringify(minor)) -
#endif
杂项设备的核心函数的定义位于:kernel/drivers/char/misc.c
int
{
//获得设备号
//创建设备节点
}
int
{
EXPORT_SYMBOL(misc_register);
EXPORT_SYMBOL(misc_deregister);
static char *misc_devnode(struct device *dev, mode_t
*mode)
{
}
static int __init misc_init(void)
{
#ifdef CONFIG_PROC_FS
#endif
fail_printk:
fail_remove:
}
subsys_initcall(misc_init);
以下是创建自动设备节点相关代码
struct device *device_create(struct class *class, struct device
*parent,
{
}
EXPORT_SYMBOL_GPL(device_create);
static int __match_devt(struct device *dev, void *data)
{
}
void device_destroy(struct class *class, dev_t devt)
{
}
EXPORT_SYMBOL_GPL(device_destroy);