Пользовательский SPI-драйвер для реализации lseek

Я пытаюсь реализовать драйвер SPI для нестандартного оборудования. Я начал с копии драйвера spidev, который поддерживает практически все, что мне нужно.

Мы используем протокол, который состоит из трех частей: командный бит (чтение / запись) адреса и произвольный объем данных.

Я предполагал, что простое добавление возможностей lseek будет лучшим способом сделать это. "Искать" по нужному адресу, затем прочитать или записать любое количество байтов. Я создал собственный.llseek в файле file_operations нового драйвера, но я никогда не видел, чтобы эта функция даже вызывалась. Я попытался использовать fseek(), lseek() и pread(), и ни одна из этих функций не вызывает новую функцию my_lseek(). Каждый звонок сообщает "errno 29 ESPIPE Незаконный поиск"

Устройство определено в файле board.c:

static struct spi_board_info my_spi_board_info[] __initdata = {
[0] = {
    .modalias      = "myspi",
    .bus_num        = 1,
    .chip_select    = 0,
    .max_speed_hz   = 3000000,
    .mode           = SPI_MODE_0,
    .controller_data = &spidev_mcspi_config,
}, ...

Я подозреваю, что может быть что-то с тем, как создаются файлы dev, главным образом потому, что пример, который я нашел, ссылается на filp->f_pos

static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
    ...
    newpos = filp->f_pos + off;
    ...
}

Итак, мои вопросы: есть ли способ, чтобы этот драйвер (слегка модифицированный spidev) поддерживал вызов "seek"? В какой момент это определяется, чтобы вернуть errno 29? Нужно ли начинать с нового драйвера, и я не смогу положиться на установку spi_board_info() и spi_register_board_info()?

Только один драйвер в каталоге /drivers/spi (spi-dw) ссылается на lseek, и они используют реализацию default_llseek. Есть несколько "хаков", которые мы придумали, чтобы все заработало и работало, но я склонен быть человеком, который хочет научиться делать это правильно.

Любые предложения с благодарностью! (PS, версия ядра 3.4.48 для системы OMAP Android)

1 ответ

Spi драйвер не поддерживает функциональность llseek или fseek. У этого есть много функций обратного вызова.

 struct spi_driver {
    const struct spi_device_id *id_table;
    int                     (*probe)(struct spi_device *spi);
    int                     (*remove)(struct spi_device *spi);
    void                    (*shutdown)(struct spi_device *spi);
    int                     (*suspend)(struct spi_device *spi, pm_message_t mesg);
    int                     (*resume)(struct spi_device *spi);
    struct device_driver    driver;

};

Теперь drivers/spi/spi-dw.c регистрируется как драйвер чартера (debugfs_create_file("registers", S_IFREG | S_IRUGO, dws->debugfs, (void *)dws, &dw_spi_regs_ops);). Поэтому они реализуют создание файла в файловой системе debugfs. они реализуют функцию обратного вызова lseek.

static const struct file_operations dw_spi_regs_ops = {
    .owner          = THIS_MODULE,
    .open           = simple_open,
    .read           = dw_spi_show_regs,
    .llseek         = default_llseek,

}; Структура file_operations определена в linux/fs.h и содержит указатели на функции, определенные драйвером, которые выполняют различные операции на устройстве. Каждое поле структуры соответствует адресу некоторой функции, определенной драйвером для обработки запрошенной операции.

lseek -: lseek - системный вызов, который используется для изменения местоположения указателя чтения / записи дескриптора файла.

SPI -: "Последовательный периферийный интерфейс" (SPI) - это синхронный четырехпроводный последовательный канал, используемый для подключения микроконтроллеров к датчикам, памяти и периферийным устройствам. SPI не может обеспечить функциональность lseek и fseek.

Существует два типа драйверов SPI ( https://www.kernel.org/doc/Documentation/spi/spi-summary)

Драйверы контроллера... контроллеры могут быть встроены в процессоры System-On-Chip и часто поддерживают роли как Master, так и Slave. Эти драйверы касаются аппаратных регистров и могут использовать DMA. Или они могут быть бит-баннерами PIO, нуждающимися только в выводах GPIO.

Драйверы протокола... они передают сообщения через драйвер контроллера для связи с ведомым или ведущим устройством на другой стороне канала SPI.

Если вы хотите, чтобы пользователь читал, писал и просматривал, вам нужно будет зарегистрировать чартер-драйвер поверх SPI. Тогда вы сможете добиться своего приобретения.

Другие вопросы по тегам