Linux 编写一个 字符设备驱动

Linux-DEVICE_ATTR()介绍及使用示例

驱动中动态创建设备号、设备节点

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/rockchip/common.h>
#include <linux/kdev_t.h>
#include <linux/device.h>

/**
struct hello_test_data
{
	struct device *classdev;
	int blue=456;
}

static struct hello_test_data *hello_data;
**/

static struct class  *hello_test_class; //定义设备类
static struct device *classdev;
static  char mybuf[100]="123";

//执行cat会调用到此函数     show对应的是read
static ssize_t hello_test_show(struct device *dev, struct device_attribute *attr, char *buf)
{ 
    return sprintf(buf, "%s\n", mybuf);
} 
//执行echo 1 >  hello_test会执行到此函数   store 对应的是write
static ssize_t hello_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	sprintf(mybuf, "%s", buf);
	return count;
}



//                  _name     _mode(权限)  (显示函数) (写入)
static DEVICE_ATTR(hello_test, 0777, hello_test_show, hello_test_store);
                //设备属性文件 名
				

// probe初始化函数                                 //cdev 分配设备对象空间
static int hello_test_probe(struct platform_device *pdev)
{ 
    printk("Gatsby  probe hello_test\n"); 
	
	// 创建对应的节点file 
	   //device_create_file(&pdev->dev, &dev_attr_hello_test); 
      classdev=device_create(hello_test_class, &pdev->dev, MKDEV(0, 0), NULL,"hello_test_device",0);
	  sysfs_create_file(&pdev->dev.kobj, &dev_attr_hello_test.attr);
	  
	    return 0; 
}

static const struct of_device_id hello_of_match[] = {
        { .compatible = "rockchip,hello_test"},
        { },
}; 

// platform_driver 的结构
static struct platform_driver hello_test_driver = { 
         .probe = hello_test_probe,
		 
		 .driver = { 
		             .name = "hello_test_class",
					 .owner = THIS_MODULE,
					 .of_match_table = hello_of_match, //需要再dts中做匹配 
					} 
};



static int __init hello_init(void)
{
    printk("Gatsby hello_init\n");
	
	/**
	struct device *classdev;
	
	classdev = device_create(hello_test, 0, MKDEV(0,0),NULL,"mytest_device");    //创建mytest_device设备
	**/
	
	hello_test_class = class_create(THIS_MODULE, "hello_test_class");//  在/sys/class目录下生成 hello_test目录
	
	platform_driver_register(&hello_test_driver);
    
    return 0;
}

static void __exit hello_exit(void)
{
    printk("Gatsby hello_exit\n");
    platform_driver_unregister(&hello_test_driver);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("hello_test");
MODULE_DESCRIPTION("Gatsby");
MODULE_LICENSE("GPL");
makefile
obj-$(CONFIG_HELLO_TEST)			+= hello_test.o
kconfig

config HELLO_TEST
	tristate "Hello world for Gatsby"
	help
	  Hello for Gatsby
上一级目录 makefile
obj-y				+= gatsby/
kconfig
source "drivers/gatsby/Kconfig" 

  

  

  

  

 

  

posted @ 2021-07-17 16:50  CrushGirl  阅读(204)  评论(0编辑  收藏  举报