Jump to content

    

SPI драйвер

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

Share this post


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

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

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

 

Share this post


Link to post
Share on other sites
Что значит по прерыванию ?

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

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

Share this post


Link to post
Share on other sites

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

Share this post


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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


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

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

Share this post


Link to post
Share on other sites
прерывание - это сигнал готовности данных с внешнего АЦП. По этому сигналу мастер забирает данные со слейва.

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Спасибо.

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

Edited by Dubov

Share this post


Link to post
Share on other sites

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

.irq = gpio_to_irq(AT91_PIN_PA31)

Share this post


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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now