Пользовательский 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. Тогда вы сможете добиться своего приобретения.