реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Linux программирование, доступ к SPI
Zelepuk
сообщение Dec 2 2011, 13:56
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



допустим в системе есть
\dev\SPIdev0
как в контектсе Си будет выглядеть запрос и обмен по устройству SPI?
можно ли применить функции работы с файлами из стандартной библиотеки, если SPIdev0 - это файл?
требуется организовать в пользовательском приложении связь по SPI с подчинённым устройством в приложении
незнаю как подступиться
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 2 2011, 15:33
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Zelepuk @ Dec 2 2011, 17:56) *
незнаю как подступиться


В первую очередь - смотреть документацию
http://lxr.free-electrons.com/source/Docum...tion/spi/spidev
http://lxr.free-electrons.com/source/Docum...pi/spidev_fdx.c
http://lxr.free-electrons.com/source/Docum...i/spidev_test.c
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Dec 2 2011, 16:04
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 290
Регистрация: 17-08-08
Из: Чернигов
Пользователь №: 39 647



Вот по этой ссылке есть как раз подобный пример.
Go to the top of the page
 
+Quote Post
Lampus
сообщение Dec 4 2011, 11:42
Сообщение #4





Группа: Участник
Сообщений: 11
Регистрация: 27-05-11
Пользователь №: 65 310



Цитата(Zelepuk @ Dec 2 2011, 17:56) *
допустим в системе есть
\dev\SPIdev0

Во-первых, скорее всего имеется в виду /dev/spidevB.X,
где B - номер шины, X - номер Chip-Select'а.
Цитата(Zelepuk @ Dec 2 2011, 17:56) *
как в контектсе Си будет выглядеть запрос и обмен по устройству SPI?

Если требуетсмя half-duplex обмен данными, то тупо read()/write() из файла устройства. Если нужен full-duplex обмен данными, то это придётся делать через соответсвующий ioctl(). Ссылки на примеры выше уже привели.
Цитата(Zelepuk @ Dec 2 2011, 17:56) *
можно ли применить функции работы с файлами из стандартной библиотеки, если SPIdev0 - это файл?
требуется организовать в пользовательском приложении связь по SPI с подчинённым устройством в приложении
незнаю как подступиться

Правильный метод - написать модуль ядра, который будет предоставлять userspace прриложению интерфейс через атрибуты sysfs или символьное устройство. Городить огород через spidev не очень светлая мысль, а если понадобится прерывание обрабатывать или GPIO дёргать? Будете /dev/mem мучать?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Dec 4 2011, 14:03
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Lampus @ Dec 4 2011, 14:42) *
Во-первых, скорее всего имеется в виду /dev/spidevB.X,
где B - номер шины, X - номер Chip-Select'а.

Если требуетсмя half-duplex обмен данными, то тупо read()/write() из файла устройства. Если нужен full-duplex обмен данными, то это придётся делать через соответсвующий ioctl(). Ссылки на примеры выше уже привели.

Правильный метод - написать модуль ядра, который будет предоставлять userspace прриложению интерфейс через атрибуты sysfs или символьное устройство. Городить огород через spidev не очень светлая мысль, а если понадобится прерывание обрабатывать или GPIO дёргать? Будете /dev/mem мучать?

Интересно, можно подробнее об этом, что такое sysfs ?
Go to the top of the page
 
+Quote Post
kurtis
сообщение Dec 5 2011, 12:03
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Смотрите в исходниках Documentation/filesystems/sysfs.txt или поиском в гугл
Если коротко, то это виртуалньая файловая система, с помощью которой из userspace можно получить доступ к интерфейсам в ядре линукс.
Go to the top of the page
 
+Quote Post
gosha
сообщение Dec 7 2011, 05:50
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 216
Регистрация: 15-06-04
Из: Менделеево
Пользователь №: 30



QUOTE (Zelepuk @ Dec 2 2011, 16:56) *
допустим в системе есть
\dev\SPIdev0
как в контектсе Си будет выглядеть запрос и обмен по устройству SPI?
можно ли применить функции работы с файлами из стандартной библиотеки, если SPIdev0 - это файл?
требуется организовать в пользовательском приложении связь по SPI с подчинённым устройством в приложении
незнаю как подступиться

Стандартно: через системные вызовы : open("/devspi"), ioctl("/devspi"), read("/devspi"), write("/devspi"), close("/devspi"), select("/devspi")
Все, что пишется ф-ей по write-: уходит в spi
Все, что читается по read- ,берется из буфера драйвера (ранее пришло из spi)
select("/devspi") - ожидание прихода данных по spi
можно организовать ввод/вывод не read()/write()?, а через ioctl()

Go to the top of the page
 
+Quote Post
Lampus
сообщение Dec 11 2011, 08:28
Сообщение #8





Группа: Участник
Сообщений: 11
Регистрация: 27-05-11
Пользователь №: 65 310



Если кому интересно, можете почитать мои старые статьи на эту тему:
http://habrahabr.ru/blogs/linux/123145/
http://habrahabr.ru/blogs/linux/123266/
Может содержать некоторые ошибки, ибо когда писал, только начинал вникать в эту тему, но в целом понимание основных структур давать должно.
Что касается прриведённого там примера драйвера, то там для "полного счастья" следует все совместно используемые данные выносить в структуру с общей блокировкой.
Go to the top of the page
 
+Quote Post
Alesha
сообщение Dec 28 2011, 07:40
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 72
Регистрация: 28-05-08
Из: Минск
Пользователь №: 37 873



Цитата(Lampus @ Dec 4 2011, 14:42) *
Правильный метод - написать модуль ядра, который будет предоставлять userspace прриложению интерфейс через атрибуты sysfs или символьное устройство. Городить огород через spidev не очень светлая мысль, а если понадобится прерывание обрабатывать или GPIO дёргать? Будете /dev/mem мучать?


Собственно никто не мешает включить поддержку в ядре gpio в sysfs. Через /dev/spidev можно вполне себе производить первоначальную отладку программы, религия это не запрещает, а в книге по Linux Device Drivers именно этот и описывается как опциональный первоначальный вариант разработки драйвера через userspace, т.к. имеется возможность использовать дебаггер и не перезагружать постоянно модули
Go to the top of the page
 
+Quote Post
Olej
сообщение Feb 28 2012, 11:55
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(Lampus @ Dec 4 2011, 14:42) *
Во-первых, скорее всего имеется в виду /dev/spidevB.X,
где B - номер шины, X - номер Chip-Select'а.

Если требуетсмя half-duplex обмен данными, то тупо read()/write() из файла устройства. Если нужен full-duplex обмен данными, то это придётся делать через соответсвующий ioctl(). Ссылки на примеры выше уже привели.

Правильный метод - написать модуль ядра, который будет предоставлять userspace прриложению интерфейс через атрибуты sysfs или символьное устройство. Городить огород через spidev не очень светлая мысль, а если понадобится прерывание обрабатывать или GPIO дёргать? Будете /dev/mem мучать?


"Модули ядра Linux" + с примерами того, что вам надо.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.02153 секунд с 7
ELECTRONIX ©2004-2016