1. 程式人生 > >linux_DEVICE_ATTR建立裝置節點程式[轉]

linux_DEVICE_ATTR建立裝置節點程式[轉]

一、簡述:

     通過DEVICE_ATTR建立裝置節點,可以完成一些簡單的驅動的測試工作,可以向節點做echo cat相關的操作。

二、程式碼如下:

(1)驅動程式碼:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
 
//執行cat會呼叫到此函式
static ssize_t hello_test_show(struct device *dev, struct device_attribute *attr, char *buf)
{
    size_t size = 123;
    char *ptr = NULL;
    printk("hello_test %s,%d\n",__FUNCTION__,__LINE__);
    
    ptr = kmalloc(size, GFP_KERNEL);
    if(!ptr){
        pr_err("Allocation failed! \n");
        return -1;
    }
    ptr[size] = 'X';
    kfree(ptr);
    
   return 0;
}
 
//執行echo 1 >  hello_test會執行到此函式
static ssize_t hello_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
    int test;
    printk("hello_test %s,%d\n",__FUNCTION__,__LINE__);
    
    test = 4;
    
    return printk("%s() test = %d\n",__FUNCTION__,test);
}
 
 
static DEVICE_ATTR(hello_test, 0664, hello_test_show, hello_test_store);
 
 
//probe初始化函式
static int hello_test_probe(struct platform_device *pdev)
{
	printk("%s()\n",__FUNCTION__);
	
    //建立對應的節點file
    device_create_file(&pdev->dev, &dev_attr_hello_test);
    
	return 0;
}
 
static const struct of_device_id hello_of_match[] = {
        { .compatible = "mediatek,hello_test"},
        { },
};
 
//platform_driver 的結構
static struct platform_driver hello_test_driver = {
	.probe = hello_test_probe, 
    .driver = {
		.name = "hello_test",
        .of_match_table = hello_of_match, //需要再dts中做匹配
	}
};
 
static int __init hello_init(void)
{
    printk("%s()\n",__FUNCTION__);
	platform_driver_register(&hello_test_driver);
    
    return 0;
}
 
static void __exit hello_exit(void)
{
    printk("%s()\n",__FUNCTION__);
    platform_driver_unregister(&hello_test_driver);
}
 
module_init(hello_init);
module_exit(hello_exit);
 
/* Module information */
MODULE_AUTHOR("hello_test");
MODULE_DESCRIPTION("hello driver");
MODULE_LICENSE("GPL v2");

(2)makefile  Kconfig dts:

//makefile
obj-$(CONFIG_HELLO_TEST)      +=hello_test/
 
//Kconfig
config HELLO_TEST
        bool "HELLO_TEST for transsion solution"
        default n
 
//dts
hello_test: hello_test {
    compatible = "mediatek,hello_test";
    status = "okay";
};

三、測試:

(1)adb 到裝置中可以看到如下節點:

        /sys/bus/platform/drivers/hello_test/odm:hello_test/

             driver driver_override   hello_test   modalias of_node power subsystem uevent

(2)執行如下的命令會呼叫到hello_test_show或hello_test_store函式:

        cat hello_test

        echo 1 > hello_test

(3)執行如下命令可以看到對應的kernel log中有輸出列印:

        while  true; do cat /proc/kmsg | grep -nr hello ; done;