2013-02-19 114 views
1

我创建了一个简单的测试设备。我的意图是创建一些自定义的sysfs文件并从中获取设置。我首先尝试添加一个kobject并使用我自己的sys_ops。这很好。然而,试图通过使用平台设备来做同样的事情就是给我一个我无法读取或写入的文件。任何人都可以告诉我这里有什么问题吗?在linux内核驱动程序中添加属性到平台设备

============= sysfs_file.c ============================== ====

#include <linux/kernel.h> 
    #include <linux/module.h> 
    #include <linux/init.h> 
    #include <linux/platform_device.h> 
    #include <linux/kobject.h> 
    #include <linux/slab.h> 

    struct kobject *myob; 
    char *ops_buffer; 
    struct attribute my_atr = { 
    .name = "custom_attrbute", 
    .mode = S_IWUGO|S_IRUGO, 
    }; 
    int atp_probe(struct platform_device *dev) 
    { 
     printk("%s\n", __func__); 
     myob = &dev->dev.kobj; 
     ops_buffer = kzalloc(PAGE_SIZE, GFP_KERNEL); 
     sysfs_create_file(myob, &my_atr); 
     return 0; 
    } 
    int atp_remove(struct platform_device *dev) 
    { 
    printk("%s\n", __func__); 
     sysfs_remove_file(myob, &my_atr); 
     kfree(ops_buffer); 
     return 0; 
    } 
    struct platform_device atp_dev = { 
     .name = "Aerrow_Test_Platform", 
     .id = 0, 
    }; 
    struct platform_driver atp_drv = { 
     .driver = { 
     .name = "Aerrow_Test_Platform", 
     .owner = THIS_MODULE, 
     }, 
     .probe = atp_probe, 
     .remove = atp_remove, 
    }; 
    static int __init sfst_init(void) 
    { 
     int ret; 
     printk("%s\n",__func__); 
     ret = platform_device_register(&atp_dev); 
     printk("%s: device add ret = %d\n", __func__, ret); 
     ret = platform_driver_register(&atp_drv); 
     printk("%s: driver register ret = %d\n", __func__, ret); 
     return 0; 
    } 
    static void __exit sfst_exit(void) 
    { 
     printk("%s", __func__); 
     platform_driver_unregister(&atp_drv); 
     platform_device_del(&atp_dev); 
    } 
    module_init(sfst_init); 
    module_exit(sfst_exit); 
    MODULE_LICENSE("GPL"); 

======================================= ============================================= 输出是:

 
[email protected]:ko_training$ cd /sys/devices/platform/Aerrow_Test_Platform.0/ 
[email protected]:Aerrow_Test_Platform.0$ ls 
custom_attrbute driver modalias power subsystem uevent 
[email protected]:Aerrow_Test_Platform.0$ cat custom_attrbute 
cat: custom_attrbute: Input/output error 
[email protected]:Aerrow_Test_Platform.0$ echo "HELLO" > custom_attrbute 
bash: echo: write error: Input/output error 
[email protected]:Aerrow_Test_Platform.0$ cat custom_attrbute cat: custom_attrbute: Input/output error 

平台设备的ktype ops方法无法处理其他属性或者我的代码有问题吗?如果我创建自己的kobject并将该属性放在该属性下,同样的方法也可以工作。 “

+0

http://kernel.org/doc/Documentation/filesystems/sysfs.txt将提供一些提示。你需要实现struct sysfs_ops – nos 2013-02-19 12:44:04

+0

如果我的驱动程序创建了父级,则可以添加sysfs_ops。但是,父Kobject/Kset是由平台设备内核创建的,我试图添加特定于我的设备的其他属性。就像我已经提到的那样,我可以轻松添加自己的kobject并使其工作,但我试图查看是否可以在不需要明确的kobject的情况下创建该属性。 – preetam 2013-02-19 13:26:28

回答

2

”裸属性不包含读取或写入属性值的方法,我们鼓励子系统定义它们自己的属性结构和包装函数,以便为特定对象类型添加和删除属性。 - 来自kernel.org/doc/Documentation/filesystems/sysfs.txt。

您可以尝试device_attribute而不是此裸露属性结构。还要定义你自己的show和store来读写你的sysfs条目。

相关问题