2017-01-21 4 views
0

Как функции чтения и записи в драйверах I2C для Linux передаются в linux? Во всех драйверах для устройств на I2C в источнике Linux структура file_operations не используется, чтобы сообщить ядру о функциях. Как различные функции передаются ядру, поэтому их можно вызывать из пользовательского пространства без использования file_operations?Функции чтения I2C для чтения в linux

+1

Возможный дубликат http://stackoverflow.com/questions/41492850/does-i2c-driver-need-to-be-implemented-just-like-any-other-character-device-driv – 0andriy

+1

Окончательно дубликат, ответ точно такой же. Также ошибочно ошибочно, существует только один клиентский драйвер, использующий file_ops: http://lxr.free-electrons.com/source/drivers/i2c/i2c-dev.c –

+0

Возможный дубликат [Требуется ли реализовать драйвер i2c просто как любой другой драйвер устройства символов?] (http://stackoverflow.com/questions/41492850/does-i2c-driver-need-to-be-implemented-just-like-any-other-character-device-driv) –

ответ

-1

Драйвер I2C в linux также поддерживает работу с файлом. Потому что когда вы начинаете открывать i2c из своего приложения;

snprintf(filename, 19, "/dev/i2c-%d", adapter_nr); 
file = open(filename, O_RDWR); 

Он призовет к файлу i2c-dev.c в ядре Linux

static int i2cdev_open(struct inode *inode, struct file *file); 

static const struct file_operations i2cdev_fops = { 
    .owner   = THIS_MODULE, 
    .llseek   = no_llseek, 
    .read   = i2cdev_read, 
    .write   = i2cdev_write, 
    .unlocked_ioctl = i2cdev_ioctl, 
    .open   = i2cdev_open, 
    .release  = i2cdev_release, 
}; 

Но если вы хотите, чтобы читать и писать из пользовательского пространства без file_operatoin, то вы можете использовать kobject в вашем драйвер для чтения и записи через sysfs.

Для чтения из пользовательского пространства:

static ssize_t module_show_status(struct kobject *kobj,struct kobj_attribute *attr,char *buf); 

Для написания из пользовательского пространства

static ssize_t module_store__status(struct kobject *kobj,struct kobj_attribute *attr,const char *buf, size_t count); 

Но прежде чем использовать эти API-интерфейсы, необходимые для создания kboject в драйвере.

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