关于mkmod
不使用mknod,在驱动代码里自动生成设备号:
- 1.在内核驱动中用class_create,device_create两个函数,内核启动后就会在sysfs文件系统中建立相应的设备信息,记得把sysfs文件系统挂载到/sys,为下一步做准备
- 2.去官网下载udev,编译生成udevd,udevstart......等9个工具,只要把udevd,udevstart拷到自己的文件系统,配置好udev,并在系统启动时运行(可以在rcS脚本中加入),这样内核启动后,udev就会根据/sys里信息在/dev下建立设备文件
- 具体可以去这里看看http://blog.csdn.net/farsight2009/archive/2009/05/31/4228136.aspx
?
- 以作者所写的一个字符设备驱动为例,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用device_create创建对应的设备。大致用法如下:
- ?
- 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。
?
参考:
- 加载驱动时怎么使系统自动创建设备文件
http://bbs.chinaunix.net/thread-1960639-1-1.html
- linux-2.6.35内核版本中class_create()和device_create的使用
http://blog.csdn.net/farsight2009/article/details/8814121
,对比文件系统中的设备和驱动代码的关系
?
- 1. ls /dev/
- ????class_dev_name_led1 ptyv4 ttyd3
- ????class_dev_name_led2 ptyv5 ttyd4
- ????class_dev_name_led3 ptyv6 ttyd5
- ????class_name_leds
- ????…..
- ?
- ??1.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
- 2. cat /proc/devices //只显示主设备号
- ?252 leds_dev_name
- …..
- 补充:
- 3. ls /sys/class
- ????leds_class …
- Drv_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);
时间: 2024-10-30 11:15:29