现在我有一个驱动文件xxx.c 编译加载后可以在 /dev/ 看到已经加载ok ,现在想要添加 sys/class/ 的设备节点 ,就是想做这件事情而已
假如 现在需要添加一个 gpio节点,配置gpio_control的属性文件接口
比如 echo 1 > /sys/class/gpio/gpio_control 可以设置某个io高电平
#include <linux/cdev.h>
。。。
+struct class *my_class;
+struct cdev mydev;
+int gpio_major = 240;
+int gpio_minor = 0;
第一步是devno
dev_t devno;
devno = MKDEV(gpio_major, gpio_minor);
if (gpio_major)
{
result = register_chrdev_region(devno,number_devices, "gpio");
} else
{
result =alloc_chrdev_region(&devno, 0, number_devices,"gpio");
gpio_major = MAJOR(devno);
}
第二步是mydev
cdev_init(&mydev, &gpio_fops);
mydev.owner = THIS_MODULE;
cdev_add(&mydev , devno , 1);
第三步是生成节点
my_class = class_create(THIS_MODULE, "gpio"); //生成节点
device_create(my_class, NULL, MKDEV(gpio_major,gpio_minor), NULL, "gpio");
第四步生成节点文件
我们准备添加的文件的名字是gpio_control
class_create_file(my_class, &class_attr_gpio_control);
在class_attr_gpio_control
这个文件可以链接到my_gpio_control 函数
static CLASS_ATTR(gpio_control, 0666,NULL, my_gpio_control);
函数的格式
static ssize_t my_gpio_control(struct class *cls,struct class_attribute *attr, const char *_buf, size_t _count)
{
int cmd = 0;
cmd = simple_strtol(_buf, NULL, 10);
switch(cmd)
{
case 1:
gpio_direction_output(gpio, 1);
break;
。。。
default:
break;
}
return _count;
}
这部分的code的添加可以放到 probe 也可以放到 init,加载驱动的时候运行了就可以
然后启动后可以看到/sys/class/gpio/gpio_control 文件
echo 1 > /sys/class/gpio/gpio_control
就可以控制io 输出高电平
这样做的好处可以看一下参数,比如很多mtd参数或者是其他驱动类似
还有就是一些 cmd可以手动简单设置,不用在写一个应用或者app上层jni 的搭建。
读的函数也可以自行添加。