首页 > 代码库 > 驱动代码与文件系统中的设备信息

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

关于mkmod

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

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

?

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

?

参考:

  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

查看设备

,对比文件系统中的设备和驱动代码的关系

?

  1. 1. ls /dev/
  2. ????class_dev_name_led1 ptyv4 ttyd3
  3. ????class_dev_name_led2 ptyv5 ttyd4
  4. ????class_dev_name_led3 ptyv6 ttyd5
  5. ????class_name_leds
  6. ????…..
  7. ?
  8. ??1.2 .[cd /dev/ ; ?ls -l |grep 设备名 //显示主设备号和次设备号]
  9. # ls -l|grep led*
  10. crw-rw---- 1 0 0 252, 1 Oct 20 2014 class_dev_name_led1
  11. crw-rw---- 1 0 0 252, 2 Oct 20 2014 class_dev_name_led2
  12. crw-rw---- 1 0 0 252, 3 Oct 20 2014 class_dev_name_led3
  13. crw-rw---- 1 0 0 252, 0 Oct 20 2014 class_name_leds
  14. 2. cat /proc/devices //只显示主设备号
  15. ?252 leds_dev_name
  16. …..
  17. 补充:
  18. 3. ls /sys/class
  19. ????leds_class …
  20. Drv_Code:
  21. #define LEDS_DEV_NAME "leds_dev_name"
  22. register_chrdev_region(devno , LEDS_DEV_COUNT , LEDS_DEV_NAME);
  23. class_device_create(leds_class, NULL, MKDEV(leds_major, 0), NULL, "class_name_leds");
  24. class_device_create(leds_class, NULL, MKDEV(leds_major, minor), NULL, "class_dev_name_led%d", minor);

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