驱动添加设备节点/sys/class/

来源:互联网 发布:泸州市网络问政 编辑:程序博客网 时间:2024/05/16 14:20

现在我有一个驱动文件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 的搭建。


读的函数也可以自行添加。







原创粉丝点击