驱动代码与文件系统中的设备信息的关系

不使用mknod,在驱动代码里自动生成设备号:

1.在内核驱动中用class_create,device_create两个函数,内核启动后就会在sysfs文件系统中建立相应的设备信息,记得把sysfs文件系统挂载到/sys,为下一步做准备
2.去官网下载udev,编译生成udevd,udevstart......等9个工具,只要把udevd,udevstart拷到自己的文件系统,配置好udev,并在系统启动时运行(可以在rcS脚本中加入),这样内核启动后,udev就会根据/sys里信息在/dev下建立设备文件.[1]

以作者所写的一个字符设备驱动为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。[2]
大致用法如下:
struct class *myclass ; class_create(THIS_MODULE, "my_device_driver"); device_create(myclass, NULL, MKDEV(major_num, minor_num), NULL, "my_device"); 这样的module被加载时,udev daemon就会自动在/dev下创建my_device设备文件。 我们在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在 /dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。

测试:查看设备,对比文件系统中的设备和驱动代码的关系

1. ls /dev/
    class_dev_name_led1 ptyv4 ttyd3
    class_dev_name_led2 ptyv5 ttyd4
    class_dev_name_led3 ptyv6 ttyd5
    class_name_leds
    …..
 
  2 . cd /dev/ ;  ls -l |grep 设备名 //显示主设备号和次设备号]
# ls -l|grep led*
crw-rw---- 1 0 0 252, 1 Oct 20 2014 class_dev_name_led1
crw-rw---- 1 0 0 252, 2 Oct 20 2014 class_dev_name_led2
crw-rw---- 1 0 0 252, 3 Oct 20 2014 class_dev_name_led3
crw-rw---- 1 0 0 252, 0 Oct 20 2014 class_name_leds
3. cat /proc/devices //只显示主设备号
 252 leds_dev_name
…..
 
4. ls /sys/class
    leds_class …
__________________________________________________________________________________
Driver_Code:
#define LEDS_DEV_NAME "leds_dev_name" register_chrdev_region(devno , LEDS_DEV_COUNT , LEDS_DEV_NAME); class_device_create(leds_class, NULL, MKDEV(leds_major, 0), NULL, "class_name_leds"); class_device_create(leds_class, NULL, MKDEV(leds_major, minor), NULL, "class_dev_name_led%d", minor);

 

参考:

1.  加载驱动时怎么使系统自动创建设备文件
    http://bbs.chinaunix.net/thread-1960639-1-1.html
2.  linux-2.6.35内核版本中class_create()和device_create的使用
    http://blog.csdn.net/farsight2009/article/details/8814121

 

你可能感兴趣的:(文件系统)