Я создал простое тестовое устройство. Мое намерение состоит в том, чтобы создать несколько пользовательских файлов 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 и поставлю этот атрибут под это.
http://kernel.org/doc/Documentation/filesystems/sysfs.txt предоставит некоторые подсказки. Вам нужно будет реализовать struct sysfs_ops, а также – nos
sysfs_ops можно добавить, если родительский файл создан моим драйвером. Но родительский kobject/kset создается ядром платформы, и я пытаюсь добавить дополнительные атрибуты, характерные для моего устройства. Как я уже упоминал, я могу легко добавить свой собственный kobject и заставить его работать, но я пытаюсь понять, могу ли я создать атрибут без необходимости явного kobject. – preetam