символьное устройство: выберите устройство для чтения/записи

В качестве примера я нашел хороший код для модуля символьного устройства: https://github.com/euspectre/kedr/blob/master/sources/examples/sample_target/cfake.c

Я не модифицировал код и тестировал его. Я получил два устройства (/dev/cfake0 и /dev/cfake1), но хотел бы кое-что понять.

Экспортируются два устройства, но только одна функция чтения. Как указать, какую функцию чтения использовать для каждого устройства (если реализованы две функции чтения)?

В конце концов, я хотел бы иметь два символьных устройства (одно для связи I2C, другое для SPI) на одном модуле, модуль и пользовательское пространство нуждаются в связи, поэтому мне нужно экспортировать их оба.


person PierreOlivier    schedule 20.06.2017    source источник


Ответы (1)


У вас есть одна функция для каждого вызова в вашем файле:

  • открытие
  • чтение
  • письмо
  • закрытие
  • ...

Но все функции имеют параметр struct file в качестве параметра.

Эта структура, содержащая информацию о файле, создается модулем при его загрузке в ядро. (см. функцию static int __init cfake_init_module(void);).

В конце концов, я хотел бы иметь два символьных устройства (одно для связи I2C, другое для SPI).

Вы могли бы сделать так:

В приведенном вами примере каждый файл создается с помощью minor device number (см. cfake_construct_device()). Вы можете использовать этот номер, чтобы выбрать, является ли устройство устройством SPI или I2C.

Ваша функция read может выглядеть так:

ssize_t 
cfake_read(struct file *filp, char __user *buf, size_t count, 
    loff_t *f_pos)
{
   /* reading minor device number */
   unsigned int mn = iminor(filp->f_inode);

   /* select specialized function to use */ 
   if (0 == mn)
       return cfake_read_i2c(filp, buf, count, f_pos);
   else 
       return cfake_read_spi(filp, buf, count, f_pos);
}

Сказал, что не думаю, что это хорошая идея иметь два разных протокола в одном модуле (если только два устройства не должны обмениваться данными): при сбое модуля вы потеряете два канала связи, и модуль будет трудно отлаживать .

person Mathieu    schedule 20.06.2017
comment
Спасибо за подсказку, я знаю, что это не очень хорошая идея, но у меня есть FPGA, взаимодействующая по SPI, и мне нужно передать данные камере, которая обменивается данными по I2C. - person PierreOlivier; 20.06.2017