TigerSHARC 0 29 июля, 2012 Опубликовано 29 июля, 2012 · Жалоба В учебных целях хочу написать драйвер(модуль ядра), который работал бы слейвом в режиме SPI и записывал данные с мастера в буфер. Прочитал тольковую статью http://dmilvdv.narod.ru/Translate/WDDL/index.html но как применительно к моему процессору (SAM9G45) написать модуль SPI-slave не знаю. Драйверы для Linux до этого момента не писал. У меня есть standalone-приложение, реализующее требуемые функции. Если просто перенести соотвествующие процессору *.h файлы, описывающие перифирийные регистры, и, написать функции опроса и записи в эти регистры (как в standalone-приложении) в код модуля ядра? такое будет работать? где можно примеры посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 30 июля, 2012 Опубликовано 30 июля, 2012 (изменено) · Жалоба подсистема spi не поддерживает slave http://lxr.linux.no/linux+v3.5/Documentati...pi-summary#L158, драйвер будет полностью свой Изменено 30 июля, 2012 пользователем Idle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xor.kruger 0 30 июля, 2012 Опубликовано 30 июля, 2012 · Жалоба В свое время разобрался с SPI в GNU/Linux с помощью драйвера от пользователя sasamy для дисплея ls020. Принцип очень простой. Есть структура spi_device описывающая сам SPI и его режим работы. Сами функции для работы с SPI описаны в linux/spi/spi.h Естественно, перед тем как юзать SPI его нужно описать в файле platform. Думаю sasamy будет не против если я выложу здесь его исходник :) Посмотрите и вы сразу все поймете :) ls020.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 30 июля, 2012 Опубликовано 30 июля, 2012 (изменено) · Жалоба В свое время разобрался с SPI в GNU/Linux с помощью драйвера от пользователя sasamy для дисплея ls020. Принцип очень простой. Есть структура spi_device описывающая сам SPI и его режим работы. Сами функции для работы с SPI описаны в linux/spi/spi.h Естественно, перед тем как юзать SPI его нужно описать в файле platform. Думаю sasamy будет не против если я выложу здесь его исходник :) Посмотрите и вы сразу все поймете :) Интересно, а позволяет ли подсистема Linux для работы с SPI работать в режиме slave? и можно увидеть примеры работы с драйвером который вы привели в пример. Мне нужно от мастера принимать данные, складывать в кольцевой буфер и по запросу пользователя отдавать данные "наверх" Изменено 30 июля, 2012 пользователем TigerSHARC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба http://electronix.ru/forum/index.php?showt...t&p=1080226 а как сформулировал учебную цель? может прицепить что-нибудь простое на spi слейвом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба http://electronix.ru/forum/index.php?showt...t&p=1080226 а как сформулировал учебную цель? может прицепить что-нибудь простое на spi слейвом? а если замахнуться и написать свой slave драйвер? с чего начать? если без ОС понятно как инициализировать периферию соответствующим образом, то для Linux непонятно как осуществить приём от мастера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба с драйвером слейва проблема в том, что надо успеть ответить на запрос There's an issue of response time ... since SPI has no flow control, typical types of request/response protocol have hard response time limits. So the RT stack may be implicitly required, except for very slow slave. вот здесь, например, обсуждение http://www.mail-archive.com/spi-devel-gene...t/msg00368.html а если по-простому, то выключите spi в линуксе совсем, чтобы ОС не знала ничего о нём и оформите исходники, которые работают с регистрами SPI-контроллера в виде модуля ядра просто в этом случае линуксовый фреймворк spi не будет использоваться, тогда не понятно в чём учебная цель Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 31 июля, 2012 Опубликовано 31 июля, 2012 (изменено) · Жалоба а если по-простому, то выключите spi в линуксе совсем, чтобы ОС не знала ничего о нём и оформите исходники, которые работают с регистрами SPI-контроллера в виде модуля ядра просто в этом случае линуксовый фреймворк spi не будет использоваться, тогда не понятно в чём учебная цель Вот это наверное то что надо! Но насколько я понял из вашей ссылки то проблема в латентности Linux. Если писать с нуля без фреймворка ОСи то эта проблема будет решена? Но как такое сделать нигде не видел. Так же как и в standalone приложении? просто добавить файл *.h где определены регистры и работать с ними? нужно принимать данные на уровне ядра от SPI мастера и писать в кольцевой буфер и по запросу выдавать. Изменено 31 июля, 2012 пользователем TigerSHARC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 31 июля, 2012 Опубликовано 31 июля, 2012 · Жалоба просто добавить файл *.h где определены регистры и работать с ними? да, работать с регистрами, они же промаплены в память; здесь лучше уточнить у работавших непосредственно с arm, возможно там есть какие-то тонкости, как достучаться до этих регистров Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zelepuk 0 2 августа, 2012 Опубликовано 2 августа, 2012 · Жалоба да, работать с регистрами, они же промаплены в память; здесь лучше уточнить у работавших непосредственно с arm, возможно там есть какие-то тонкости, как достучаться до этих регистров Насколько я знаю работать напрямую с регистрами можно только из пространства пользователя, предварительно вручную промапив регистры в память. Думаю на уровне ядра такое не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 2 августа, 2012 Опубликовано 2 августа, 2012 (изменено) · Жалоба Насколько я знаю работать напрямую с регистрами можно только из пространства пользователя, предварительно вручную промапив регистры в память. Думаю на уровне ядра такое не получится. это не так, как дрова-то писать тогда heh :) :) тебя, наверное, спутали примеры под арм где народ дёргает gpio промапив регистры на память в юзерспейсе, друг-другу скидывают на это ссылки и делают по аналогии :) я пять лет назад, когда только начинал, пытался что-то промапить под mips, ничего не вышло :) в mips и blackfin это делается напрямую, с arm не работал, поэтому лучше уточнить у армоводов Изменено 2 августа, 2012 пользователем Idle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zelepuk 0 2 августа, 2012 Опубликовано 2 августа, 2012 · Жалоба это не так, как дрова-то писать тогда heh :) :) тебя, наверное, спутали примеры под арм где народ дёргает gpio промапив регистры на память в юзерспейсе, друг-другу скидывают на это ссылки и делают по аналогии :) я пять лет назад, когда только начинал, пытался что-то промапить под mips, ничего не вышло :) в mips и blackfin это делается напрямую, с arm не работал, поэтому лучше уточнить у армоводов Как пишутся драйвера пока не до конца понимаю, так как в книгах все равно дается подход высокого уровня. Ниразу еще не видел, чтобы кто-то писал в регистры напрямую, а хочется разобраться досконально что происходит в драйверах, да и привычнее мне писать в регистры напрямую. Да, все именно та как вы пишите. Мне дали ссылку на пример ногодрынга из пользовательской программы. Получается для blackfin даже вручную мапить ничего не надо? Про арм спросить не у кого... Ау! Армоводы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Idle 0 2 августа, 2012 Опубликовано 2 августа, 2012 · Жалоба тут история такая что, регистры soc ведь находятся в памяти по определённым адресам в любом случае из юзеспейса получить доступ к ним напрямую нельзя(тут спецы по блекфину меня поправят, возможно, т.к. там линукс без мму), поскольку пользовательские приложения выполняются в своём отдельном для каждого процесса адресном пространстве однако (не уверен что на всех архитектурах), можно при помощи системного вызова mmap запросить отображение региона памяти с регистрами soc на регион памяти пользовательского процесса в ядре же этот регион доступен напрямую (опять же лучше уточнять), и драйверы пишут и читают сразу по этим адресам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ubobrov 0 23 ноября, 2012 Опубликовано 23 ноября, 2012 · Жалоба Вот, я переделывал драйвер SPI от атмела чтоб он работал как слейв. Все то же самое, что и мастер, тока ждет CS. Все работает. atmel_mpi.c.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 9 декабря, 2012 Опубликовано 9 декабря, 2012 · Жалоба Вот, я переделывал драйвер SPI от атмела чтоб он работал как слейв. Все то же самое, что и мастер, тока ждет CS. Все работает. Не могли бы Вы пояснить работу вашего драйвера с таймерами? А именно, что происходит при возникновении таймаута? И еще один момент мне непонятен. В обработчике прерываний RXBUFF/ENDRX/NSSR Вы запрещаете только фактически возникшие прерывания (spi_writel(as, IDR, pending);). Допустим, принят/передан последний байт последней транзакции, и возникло прерывание по RXBUFF/ENDRX, но сигнал CS еще активен. В результате RXBUFF/ENDRX будут запрещены обработчиком, но NSSR останется разрешенным. as->current_transfer становится равным NULL. Далее мастер снимает сигнал CS, в результате возникает прерывание NSSR, и мы снова попадаем в ту же ветку обработчика, в которой падаем, так как xfer равен NULL! Я что-то где-то не учел или неправильно понял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться