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