**
自动创建节点
**
在驱动中加入对 udev 的支持(自动创建设备节点)的主要做法是:在驱动初始化的代码里调用 class_create() 为该设备创建一个 class,再为每个设备调用 device_create() 创建对应的设备。
内核中定义的 struct class 结构体,顾名思义,一个 struct class 结构体类型的变量对应一个类,内核同时提供了 class_create() 函数,可以用它来创建一个类(class),这个类(class)存放在 sysfs 下面,一旦创建好了这个类,再调用 device_create() 函数来在 /dev 目录下创建相应的设备节点。
这样,加载模块的时候,用户空间中的 udev 会自动响应 device_create() 函数,去 /sysfs 下寻找对应的类,从而在/dev 创建设备节点。
例如:
static int led_init()
{
major = register_chrdev(0, "led_drv", &led_fops); //注册设备,同时注册主设备号
led_drv_class = class_create("THIS_MODULE", "led_drv"); //将放于/sysfs 查看#ls /sys/class
device_create(led_drv_class, NULL, MKDEV(major, 0), NULL, "myled"); //生成设备节点将存放于/dev,这条函数也会注册次设备号
return 0;
}
static void led_exit()
{
unregister_chrdev(major, "led_drv");
device_destroy(led_drv_class, MKDEV(major, 0));
class_destroy(led_drv_class);
}
宏:
MKDEV(MAJOR, MINOR);
说明: 获取设备在设备表中的位置。
MAJOR 主设备号
MINOR 次设备号 //1 ~ 250 (次设备号的 0 不能使用)
注意:杂项设备主设备号固定为10
之前写的字符类设备驱动,没有自动创建设备节点,因为只使用了register_chrdev()函数,只是注册了这个设备。然后在系统启动后,就要自己创建设备节点mknod,
register_chrdev(MEM_MAJOR,“mem”,&memory_fops) 向内核注册了一个字符设备(不只是注册了设备号,还做了 cdev 的初始化以及 cdev 的注册)。第一个参数为主设备号,0代表动态分配,这里的 MEM_MAJOR 为1;第二个参数是设备的名字;第三个参数为文件操作指针,完成注册后,在 /proc/devices 中第一个字符设备我们就看到了 :/mem。
怎样查看内核中已经注册过的字符设备驱动(和块设备驱动)以及主设备号:cat /proc/devices
/ # cat /proc/devices
cat /proc/devices
Character devices:
1 mem
256 msm_rng
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
21 sg
86 ch
89 i2c
90 mtd
108 ppp
116 alsa
246 dia
247 smdpkt
248 smd
249 ttyHSL
250 ttyHS
251 bsg
252 rtc
253 msm_thermal_query
254 msm_sps
Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
31 mtdblock
65 sd
66 sd
67 sd
**
字符设备号简介
**
Linux 的设备管理是和文件系统紧密结合的, 各种设备都以文件的形式存放在/dev 目录下, 称为设备文件。 应用程序可以打开、 关闭和读写这些设备文件, 完成对设备的操作, 就像操作普通的数据文件一样。为了管理这些设备, 系统为设备编了号, 每个设备号又分为主设备号和次设备号。 主设备号用来区分不同类型的设备, 而次设备号用来区分同一类型的多个设备。
**
杂项设备的设备节点名字,对应驱动中的.name。
**例如:
驱动文件中如下定义:
static struct miscdevice pin_test_misc ={
.minor = MISC_DYNAMIC_MINOR,
.name = "pintest_gpio",
.fops = &pin_fops,
};
那么会在/dev下生成pintest_gpio的设备节点。则对应的在/proc/misc下也有个pintest_gpio名字
怎样查看内核中已经注册过的杂项设备以及次设备号:cat /proc/misc
/sys # cat /proc/misc
cat /proc/misc
46 embms_tm_device
47 android_serial_device
48 usb_accessory
49 android_rndis_qc
50 mtp_usb
51 ccid_bulk
52 ccid_ctrl
53 dpl_ctrl
54 rmnet_ctrl3
55 rmnet_ctrl2
56 rmnet_ctrl1
57 rmnet_ctrl
58 android_mbim
92 pintest_gpio