LINUX.ORG.RU

Зависит от цели

Можно и так и так, в зависимости от того что надо. Проще всего свой софт (c/c++ или питон) + userspace. Благо это не трудно - куча документации и примеров. Драйвер - ну не знаю, тоже в принципе не очень трудно, вопрос - а оно надо ?

guskov_roman
()

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

spbob
()
Ответ на: комментарий от spbob

Единтсвенное где может быть удобней spidev - самоделка на fpga

Мой случай.

однозначно драйвер если устройство стандартное.

Могу и драйвер запилить, не проблема. Хотелось узнать, как правильнее. В случае драйвера, как тогда лучше общение с user space организовать потом? Обычный character device подцепить если, то это почти тоже самое, что и spidev, только вид сбоку (ну разве что сам протоколо обмена в драйвере формируется)?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Могу и драйвер запилить, не проблема. Хотелось узнать, как правильнее.

если устройство не попадает под какой-то стандартный API ядра то какая в принципе разница ? как удобней так и делают. Драйвер ядра удобен тем что пишешь драйвер и потом твоё устройство используется всем что уже есть в юзерспейс для этого класса устройств.

spbob
()
Ответ на: комментарий от Harald

а тебе для чего

-> самоделка на fpga <-

UVV ★★★★★
() автор топика
Ответ на: комментарий от spbob

Понял, спс. Короч в зависимости от того, со сколькими устройствами буду ощаться и разного ли она класса.

UVV ★★★★★
() автор топика

Если тебе наплевать на latency и то что каждый read-write будет переключением контекста - spidev пойдёт.

Если надо производительно или нормальный интерфейс для юзерспейса - модуль ядра.

В целом, отладиться можно на spidev а потом переписать на ядерный модуль, но это надо иметь желание «сделать хорошо», а не «хуяк-хуяк-продакшен».

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

В целом, отладиться можно на spidev а потом переписать на ядерный модуль, но это надо иметь желание «сделать хорошо», а не «хуяк-хуяк-продакшен».

Да, такое желание есть.

Если надо производительно или нормальный интерфейс для юзерспейса - модуль ядра.

Да, надо. Подскажи, какой тогда лучше интерфейс для userspace замутить в этом случае. Обычно я делал либо character device, либо sysfs регистры.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

какой тогда лучше интерфейс для userspace замутить в этом случае

так что это устройство делает ? если какая-то гирлянда с зажиганием лампочек по программируемому алгоритму - тогда проще в юзерспейс всё сделать, а если это видеодекодер, АЦП или устройство ввода и тд - оно попадает под стандартные API для соответствующих устройств и тогда вопросов не возникнет - v4l2, IIO, evdev и тд

spbob
()
Ответ на: комментарий от UVV

Зависит от того что за самоделка. Если что-то что можно утрамбовать в логику IIO или тому подобного - лучше так. Если специфичное, то по классике char/block device + ioctl.

Dark_SavanT ★★★★★
()

Драйвер в ядре нужен, если:

  • Важна сверхнизкая latency или ты собираешься гонять там мегабайты данных в секунду

  • Твоё устройство относится к какому-то стандартному классу, поддержка которого уже есть в ядре. Например, ты делаешь свою мышку, клавиатуру, контроллер питания и т. д. Если сделать драйвер в ядре, то весь userspace софт из коробки подхватит твой девайс и будет с ним работать как надо

spidev нужен, когда у тебя что-то кастомное (например, какой-нибудь программатор, умная гирлянда на ардуино или числодробилка) и работать с твоей железкой с шансом 99% будет только твоя программа, при этом сверхжёстких требований по производительности и задержкам нет.

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

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

ОК, всем спасибо за дискуссию

UVV ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Драйвер в ядре нужен, если:

… или ты собираешься гонять там мегабайты данных в секунду

С помощью libusb можно гонять до немногим более 50 МБ в секнду по USB 2.0 HiSpeed. А вот с USB 3 чипами libftdi всё ещё не работает, насколько я знаю, иначе было бы интересно посмотреть, сколько вытянула бы libusb.

gag ★★★★★
()
Ответ на: комментарий от gag

Скорее всего нагрузка на CPU в таком режиме будет неплохая. Так что если гонять долго, то лучше всё же через kernel space.

KivApple ★★★★★
()
Ответ на: комментарий от UVV

Единтсвенное где может быть удобней spidev - самоделка на fpga

Мой случай.

Если там нет аппаратного SPI (а такой мне попадался только на маленьком Lattice ICE40UP5k) и не нужно скоростей более 1-8 Мбит/с, то согласно тому, что известно о поставленной задаче, не всё ли равно, реализовывать интерфейс SPI или UART на FPGA? Особенно учитывая, что на стороне PC с UART в user space удобнее работать.

gag ★★★★★
()
21 февраля 2021 г.
Ответ на: комментарий от Dark_SavanT

Мне важно latency и на spidev его не хватает. Требуется из юзерспейса посылать-принимать пачки по 128-256 байт примерно раз в милисекунду.

FIFO буфер на другом конце есть, но периодические лаги spidev до 10-15мс не устраивают.

Кто-нибудь может подсказать где посмотреть примеры модуля ядра для общения по SPI?

Есть ли площадки, где можно отдать написание на аутсорс, если самому не получится справится?

cnc42
()
Ответ на: комментарий от cnc42

Смотри в исходники spi модулей собственно, прямо в дереве. Начать можешь с gpio expander там можно понять как пилить модуль, а дальше смотреть на IIO какое-нибудь.

Dark_SavanT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.