2013-09-23 4 views
1

Сводка: это поле platform_datastruct device свободно использовать в модуле драйвера устройства?sysfs: можно использовать поле struct device_data struct device?

Я создаю очень простую sysfs запись для моего персонажа модуля драйвера устройства, чтобы позволить мне контролировать внутреннюю переменную (потому что я знаю, используя ioctl() и proc файловой системы являются устаревшими.) Я призываю class_create() сделать класс в /sys/class/ и затем device_create(), чтобы сделать запись нового устройства. Затем я вызываю device_create_file(), чтобы настроить загрузку и сохранить подпрограммы для драйвера. Я хочу заблокировать мой драйвер в этих подпрограммах. У меня есть мьютекс в основной структуре моего драйвера. Могу ли я использовать поле platform_data для хранения указателя на эту структуру, как я бы сделал private_data поле struct file в модуле open() или это зарезервировано? Он установлен в NULL после device_create, поэтому он будет выглядеть нормально, но я точно не знаю.

То, что я хотел бы сделать, это:

struct mymodule mymod; // main module structure, has a mutex called lockmx 

static ssize_t mydev_store_val(struct device *dev, 
           struct device_attribute *attr, 
           const char *buf,size_t count) 
{ 
    struct mymodule *mymodp=(struct mymodule*)dev->platform_data; 

    if(mutex_lock_interruptible(&mymodp->lockmx)) 
     return 0; 

    // get data from buf 

    mutex_unlock(&mymodp->lockmx); 

    return count; 
} 

DEVICE_ATTR(mydeva,S_IWUSR|S_IRUGO,NULL,mydev_store_val); 

static int __init modinit(void) 
{ 
    ... 

    dev_t dev; // alloc'ed already 

    myclass=class_create(THIS_MODULE,"myclass"); 
    mydev=device_create(myclass,NULL,dev,NULL,"mydev"); 
    mydev->platform_data=&mymod; 
    device_create_file(mydev,&dev_attr_mydeva); 

    ... 
} 

Так что это создаст запись /sys/class/myclass/mydev/mydeva который может быть записан. Если поле platform_data доступно, я могу избежать использования глобальных переменных. Но если он движется под меня, мое ядро ​​собирается в лучшем случае и, вероятно, панику.

ответ

1

Такой указатель может быть сохранен в поле drvdata (которое было умышленно скрыто, так что вы не увидите его, если взглянете на определение struct device).

Инициализировать его через четвертый параметр device_create, и читать его с dev_get_drvdata:

mydev = device_create(myclass, NULL, dev, &mymod, "mydev"); 
... 
struct mymodule *mymodp = dev_get_drvdata(dev); 
+0

Спасибо, это было именно то, что я искал. Я работаю с LDD3 (мне жаль, что они не напишут 4-е изд., Поскольку кривая обучения крутая.) В поисках кода ядра есть аналогичный dev_set_drvdata(), который устанавливает dev-> p-> driver_data, если он не уже. Полезно знать. –