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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> SPI драйвер, забирать данные по прерыванию
Dubov
сообщение May 28 2012, 19:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Нужно забирать в драйвере данные по SPI по прерыванию от внешнего устройства. Нашёл классную статью(http://habrahabr.ru/post/123145/), но нигде невстречал примера забора данных по прерыванию.
Go to the top of the page
 
+Quote Post
cpl
сообщение May 29 2012, 08:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Цитата(Dubov @ May 28 2012, 22:17) *
Нужно забирать в драйвере данные по SPI по прерыванию от внешнего устройства. Нашёл классную статью(http://habrahabr.ru/post/123145/), но нигде невстречал примера забора данных по прерыванию.

Что значит по прерыванию ?
Из пользовательского пространства нет возможности работать с аппаратурой на прямую, только через драйвер.
Go to the top of the page
 
+Quote Post
Dubov
сообщение May 29 2012, 11:40
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(cpl @ May 29 2012, 12:42) *
Что значит по прерыванию ?
Из пользовательского пространства нет возможности работать с аппаратурой на прямую, только через драйвер.

вот и я о том же. Вот и задаю вопрос как написать такой драйвер
Go to the top of the page
 
+Quote Post
dch
сообщение May 29 2012, 13:21
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



В ликусксе 2.6 есть примеры драйверов SPI, например ядно 2.6.x поддерживает SPI для Atmel-овского проца AT91RM9200, в Development Kit от Atmel-а на один из SPI интерфесвов повешена SPI флэш типа AT45DB321/AT45DB642 , которая может использоваться в качестве диска.
Go to the top of the page
 
+Quote Post
Dubov
сообщение May 30 2012, 04:45
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(dch @ May 29 2012, 17:21) *
В ликусксе 2.6 есть примеры драйверов SPI, например ядно 2.6.x поддерживает SPI для Atmel-овского проца AT91RM9200, в Development Kit от Atmel-а на один из SPI интерфесвов повешена SPI флэш типа AT45DB321/AT45DB642 , которая может использоваться в качестве диска.

но память не посылает сигнал прерывания.
Go to the top of the page
 
+Quote Post
kurtis
сообщение May 30 2012, 16:00
Сообщение #6


Местный
***

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



Что такое "внешнее устройство"? как оно подключено к Linux-устройству? каким образом оно собирается прерывать Linux-устройство? Если я ничего не путаю, то SPI это master-slave интерфейс, и slave не может просто так начать слать мастеру пакеты.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение May 31 2012, 08:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Видимо помимо SPI от устройства к хост-процессору идет еще и сигнал IRQ.
Посмотрите, например, как это сделано в drivers/net/can/mcp251x.c .


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Dubov
сообщение May 31 2012, 12:07
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(kurtis @ May 30 2012, 20:00) *
Что такое "внешнее устройство"? как оно подключено к Linux-устройству? каким образом оно собирается прерывать Linux-устройство? Если я ничего не путаю, то SPI это master-slave интерфейс, и slave не может просто так начать слать мастеру пакеты.

прерывание - это сигнал готовности данных с внешнего АЦП. По этому сигналу мастер забирает данные со слейва.
Go to the top of the page
 
+Quote Post
cpl
сообщение May 31 2012, 12:14
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 6-12-04
Пользователь №: 1 340



Цитата(Dubov @ May 31 2012, 15:07) *
прерывание - это сигнал готовности данных с внешнего АЦП. По этому сигналу мастер забирает данные со слейва.

Сразу могли бы сказать что и как у вас подключено, а то поди угадай зачем прерывание к SPI??? laughing.gif
В драйвере устройства заведите обработчик прерывания, в обработчике прерывания считывайте данные с АЦП складывайте в промежуточный буфер например, затем по запросу пользователя отдавайте содержимое буфера.
Go to the top of the page
 
+Quote Post
Drozd2
сообщение May 31 2012, 14:23
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 19-11-09
Пользователь №: 53 743



Есть еще вариант вообще не трогать драйвер. Ногу процессора, на которой висит сигнал готовности, объявить входом для кнопки. В пользовательском приложении создать обработчик событий по нажатию на эту кнопку. В нем считывать данные с АЦП.
Go to the top of the page
 
+Quote Post
Dubov
сообщение May 31 2012, 18:56
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Спасибо.
Мне очень нужно чтобы драйвер отобразился в /sys/device/platform
как это сделать?
Хотелось бы пример увидеть или литературу толковую где написано как регистрировать драйвера.
Ато читаю рекомендации с сайта Analog Devices:
http://wiki.analog.com/resources/tools-sof.../iio-adc/ad7606

и в моей системе вот это появляется:
Код
root:/> cd /sys/bus/iio/devices/
root:/sys/bus/iio/devices> ls
device0                  trigger0


а этого не вижу

Код
root:/sys/devices/platform/ad7606-8.0


Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jun 1 2012, 09:59
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



В бордовом файле вы делаете platform_add_devices(...) для своего устройства? struct platform_device ...{} для своенго устройства заполнили? Драйвер вкомпилировали?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jun 1 2012, 16:19
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(Dron_Gus @ Jun 1 2012, 12:59) *
В бордовом файле вы делаете platform_add_devices(...) для своего устройства? struct platform_device ...{} для своенго устройства заполнили? Драйвер вкомпилировали?

Я делаю at91_add_device_spi(...), аргументом которого служит указатель на массив структур SPI устройств, где и описаны параметры йстройства(номер шины, чипселект, имя)
При всём при этом при инициализации драйвера функция probe проходит нормально, регистрируя драйвер толкьо в /sys/bus/iio/devices

Сообщение отредактировал Dubov - Jun 1 2012, 16:20
Go to the top of the page
 
+Quote Post
xor.kruger
сообщение Jun 2 2012, 11:16
Сообщение #14


Местный
***

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



Попробуйте указать в своей структуре, в которой "описано" ваше устройство, что то наподобие этого
Код
.irq = gpio_to_irq(AT91_PIN_PA31)
Go to the top of the page
 
+Quote Post
Dubov
сообщение Jun 2 2012, 12:39
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(xor.kruger @ Jun 2 2012, 14:16) *
Попробуйте указать в своей структуре, в которой "описано" ваше устройство, что то наподобие этого
Код
.irq = gpio_to_irq(AT91_PIN_PA31)

с прерыванием разобрался.
теперь проблема прописать устройство в /sys/devices/platform/
для инициализации устройства вызывается функция at91_add_device_spi(...), которая вызывает функции:
1) spi_register_board_info(), на входе которой структура с МОИМ устройством
2) platform_device_register(), а она в свою очередь регистрирует только atmel_spi1 в /sys/devices/platform/

при этом на входе platform_device_register() ВСЕГДА:

Код
static struct platform_device at91sam9260_spi1_device = {
       .name           = "atmel_spi",      
  .id             = 1,
         .dev            = {
                                .dma_mask               = &spi_dmamask,
                                .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .resource       = spi1_resources,
       .num_resources  = ARRAY_SIZE(spi1_resources),
};


Получается что независимо от того какое устройство я регистрирую в
Код
/sys/devices/platform/
будет всегда
Код
atmel_spiX

НО! На входе at91_add_device_spi(...) у меня структура, где прописано устройство с другим именем (.name = SPI_device) и я никак не могу увидеть его в
Код
/sys/devices/platform/
Go to the top of the page
 
+Quote Post

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

 


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


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