字符设备驱动程序之自动创建设备节点
2015-11-06 15:20
309 查看
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/device.h>
static struct class *led_class;
int led_open(struct inode *inode, struct file *file)
{
printk("led_open\n");
return 0;
}
ssize_t led_write(struct file *file, const char __user *user, size_t size, loff_t *off)
{
printk("led_write\n");
return 0;
}
static struct file_operations led_operation = {
.owner=THIS_MODULE,
.open=led_open,
.write=led_write,
};
int major;
int led_init(void)
{
major=register_chrdev(0,"led",&led_operation);
led_class = class_create(THIS_MODULE, "led_class");
device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");
return 0;
}
void led_exit(void)
{
unregister_chrdev(major,"led");
device_destroy(led_class,MKDEV(major, 0));
class_destroy(led_class);
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev/led_device可以查看到!
需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!
但是,系统做了什么呢?在开发板的/etc/init.d/rcS文件里面有如下的信息:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
这两行信息就是说,一旦发生了热插拔事件(比如创建了类,在类下创建了设备),就会调用/sbin/mdev命令,mdev命令会通过环境变量中的 ACTION 和 DEVPATH来判断此次热插拔事件影响了/sys目录下的那个文件,一旦发现了这个文件,就会进入这个文件里面去查找dev的属性文件,并根据属性创建设备节点!比如我们加载驱动的的时候,会在 /sys/class/目录下创建类,在 /sys/class/led_class目录下创建设备,在
/sys/class/led_class目录下有个dev文件,dev文件里面就有设备的主次设备号,mdev就会根据主次设备号在/dev/目录下创建设备节点!
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/device.h>
static struct class *led_class;
int led_open(struct inode *inode, struct file *file)
{
printk("led_open\n");
return 0;
}
ssize_t led_write(struct file *file, const char __user *user, size_t size, loff_t *off)
{
printk("led_write\n");
return 0;
}
static struct file_operations led_operation = {
.owner=THIS_MODULE,
.open=led_open,
.write=led_write,
};
int major;
int led_init(void)
{
major=register_chrdev(0,"led",&led_operation);
led_class = class_create(THIS_MODULE, "led_class");
device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");
return 0;
}
void led_exit(void)
{
unregister_chrdev(major,"led");
device_destroy(led_class,MKDEV(major, 0));
class_destroy(led_class);
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");
主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev/led_device可以查看到!
需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!
但是,系统做了什么呢?在开发板的/etc/init.d/rcS文件里面有如下的信息:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
这两行信息就是说,一旦发生了热插拔事件(比如创建了类,在类下创建了设备),就会调用/sbin/mdev命令,mdev命令会通过环境变量中的 ACTION 和 DEVPATH来判断此次热插拔事件影响了/sys目录下的那个文件,一旦发现了这个文件,就会进入这个文件里面去查找dev的属性文件,并根据属性创建设备节点!比如我们加载驱动的的时候,会在 /sys/class/目录下创建类,在 /sys/class/led_class目录下创建设备,在
/sys/class/led_class目录下有个dev文件,dev文件里面就有设备的主次设备号,mdev就会根据主次设备号在/dev/目录下创建设备节点!
相关文章推荐
- java nio原理和它的优点
- mysql 卸载
- 深入理解JavaScript的变量作用域
- Verilog三段式状态机描述
- Java基础语法(二)---流程控制与函数
- 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
- JackJson的一些方法
- OpenCV 2.4.10 + Visual Studio 2013 + Win7 64位的配置(未完成)
- protobuffer java
- C#字典Dictionary排序(顺序、倒序)
- unity笔录
- css3实现手机菜单展开收起动画
- eclipse里面 run as 和 Debug as
- 在 Ubuntu 用 OpenNI支持 使用 ASUS Xtion 传感器
- 发送到
- Caffe代码解读:Protobuf
- 全局常量
- 调用微信支付遇到的问题
- ios 设置启动页
- 【案例】关于weblogic性能问题的分析和解决方法