2013-02-19 2 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

+0

sysfs_ops можно добавить, если родительский файл создан моим драйвером. Но родительский kobject/kset создается ядром платформы, и я пытаюсь добавить дополнительные атрибуты, характерные для моего устройства. Как я уже упоминал, я могу легко добавить свой собственный kobject и заставить его работать, но я пытаюсь понять, могу ли я создать атрибут без необходимости явного kobject. – preetam

ответ

2

«Голый атрибут не содержит средств для чтения или записи значения атрибута. Подсистемам предлагается определить их собственную структуру атрибутов и функции-обертки для добавления и удаления атрибутов для определенного типа объекта». - from kernel.org/doc/Documentation/filesystems/sysfs.txt.

Вы можете попробовать device_attribute вместо этой открытой структуры атрибутов. Также определите свое собственное шоу и сохраните, чтобы читать и писать запись sysfs.

Смежные вопросы