Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Что значит по прерыванию ?

Из пользовательского пространства нет возможности работать с аппаратурой на прямую, только через драйвер.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит по прерыванию ?

Из пользовательского пространства нет возможности работать с аппаратурой на прямую, только через драйвер.

вот и я о том же. Вот и задаю вопрос как написать такой драйвер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ликусксе 2.6 есть примеры драйверов SPI, например ядно 2.6.x поддерживает SPI для Atmel-овского проца AT91RM9200, в Development Kit от Atmel-а на один из SPI интерфесвов повешена SPI флэш типа AT45DB321/AT45DB642 , которая может использоваться в качестве диска.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ликусксе 2.6 есть примеры драйверов SPI, например ядно 2.6.x поддерживает SPI для Atmel-овского проца AT91RM9200, в Development Kit от Atmel-а на один из SPI интерфесвов повешена SPI флэш типа AT45DB321/AT45DB642 , которая может использоваться в качестве диска.

но память не посылает сигнал прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что такое "внешнее устройство"? как оно подключено к Linux-устройству? каким образом оно собирается прерывать Linux-устройство? Если я ничего не путаю, то SPI это master-slave интерфейс, и slave не может просто так начать слать мастеру пакеты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо помимо SPI от устройства к хост-процессору идет еще и сигнал IRQ.

Посмотрите, например, как это сделано в drivers/net/can/mcp251x.c .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что такое "внешнее устройство"? как оно подключено к Linux-устройству? каким образом оно собирается прерывать Linux-устройство? Если я ничего не путаю, то SPI это master-slave интерфейс, и slave не может просто так начать слать мастеру пакеты.

прерывание - это сигнал готовности данных с внешнего АЦП. По этому сигналу мастер забирает данные со слейва.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прерывание - это сигнал готовности данных с внешнего АЦП. По этому сигналу мастер забирает данные со слейва.

Сразу могли бы сказать что и как у вас подключено, а то поди угадай зачем прерывание к SPI??? :laughing:

В драйвере устройства заведите обработчик прерывания, в обработчике прерывания считывайте данные с АЦП складывайте в промежуточный буфер например, затем по запросу пользователя отдавайте содержимое буфера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть еще вариант вообще не трогать драйвер. Ногу процессора, на которой висит сигнал готовности, объявить входом для кнопки. В пользовательском приложении создать обработчик событий по нажатию на эту кнопку. В нем считывать данные с АЦП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

Мне очень нужно чтобы драйвер отобразился в /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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Я делаю at91_add_device_spi(...), аргументом которого служит указатель на массив структур SPI устройств, где и описаны параметры йстройства(номер шины, чипселект, имя)

При всём при этом при инициализации драйвера функция probe проходит нормально, регистрируя драйвер толкьо в /sys/bus/iio/devices

Изменено пользователем Dubov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте указать в своей структуре, в которой "описано" ваше устройство, что то наподобие этого

.irq = gpio_to_irq(AT91_PIN_PA31)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте указать в своей структуре, в которой "описано" ваше устройство, что то наподобие этого
.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/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...