前言
在项目中碰到有人用switch_dev_register注册了switch_dev类设备,并且应用层能读到它的状态信息,感觉挺好奇,于是网上搜了些资料,自个又琢磨了一下,算是理解了,现在整理一下。
switch_dev是一个开关设备类,跟其它很多类一样的,像misc类,都是对一类设备的总称,使用起来很简单,大部分工作内核已经给你干了,通过switch_dev_register函数注册switch_dev类之后,系统会自动在/sys/class下生成你定义的文件夹,可以进入/sys/class/switch查看:
实际是链接到了/sys/device/virtual/switch/目录,都包含了name/power/state/subsystem/uevent,其中name是驱动中可以修改的设备名称,state是驱动中提供给用户空间的状态值。
驱动中可以直接调用switch_set_state来设置不同的状态值。对应地,应用层读取这个文件就可以实现状态获取。
代码实例
#include <linux/init.h>
#include <linux/module.h>
#include <linux/switch.h>
struct switch_dev sdev;
static int touch_switch(void)
{
int state, ret;
sdev.name = "touch";//注册之后就会在/sys/class/switch下生成相应名字命名的文件
sdev.state = 0;
sdev.index = 0;
//注册switch_dev类设备
ret = switch_dev_register(&sdev);
if (ret < 0)
return ret;
state = 1;
sdev.name = "hello";//这里改变的是switch文件下name的值,cat name可以看到
//向用户态传递消息,应用层读取这个就能够实现状态获取。
switch_set_state(&sdev, state);
return 0;
}
static int touch_init(void)
{
printk(KERN_ALERT "touch_init\n");
if(touch_switch()) {
printk(KERN_ERR "failed to create touch switch\n");
return -ENODEV;
}
return 0;
}
static void touch_exit(void)
{
printk(KERN_ALERT "exit\n");
}
module_init(touch_init);
module_exit(touch_exit);
MODULE_AUTHOR("mstar");
MODULE_DESCRIPTION("touch");
MODULE_LICENSE("GPL");
编译进内核,烧录程序后验证如下:
参考文献:
https://blog.csdn.net/kangear/article/details/37961151