Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:5
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:9
Форум » starterkit.ru » Embedded Linux
прерывание от SPI устройства
Franky
Добавлено 08.05.2012 20:45 Редактировалось 08.05.2012 20:46
0
Сообщение: 1
Franky
5

Пункты: 5030
Регистрация: 29.06.2010
Хочу прикрутить по SPI АЦП. В линукс есть драйвер.
От АЦП поступает прерывание, по которому нужно забирать данные.
Соотвественно в файле борды(в моём случае board-at91g45.c) нужно инициализировать SPI устройство задействовав поле структуры

static struct spi_board_info board_spi_board_info[] __initdata = {
...
.irq = [прерывание]
....
};

1) Что нужно указать? Можно ли просто указать GPIO? Или нужно как-то указать прерывание?
2) Требуется ли какая-либо отдельная инициализация для самой системы прерываний?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 08.05.2012 23:06 Редактировалось 08.05.2012 23:06 Сообщение: 2
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
я обычно шарюсь в соседних файлах архитектуры, а если там нет похожего смотрю по всем структурам - как правило все уже изобретено до нас..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Franky
Добавлено 08.05.2012 23:22 Редактировалось 09.05.2012 00:01 Сообщение: 3
Franky
5

Пункты: 5030
Регистрация: 29.06.2010
Цитата
я обычно шарюсь в соседних файлах архитектуры, а если там нет похожего смотрю по всем структурам - как правило все уже изобретено до нас..

Что за соседние файлы вы имеете ввиду?
не в одной структуре, описывающей SPI не задействовано прерывание.
Вопрос:
1) если напишу просто:
...
.irq = AT91_PIN_PA31,
...
это будет справедливо? или нужно как-то именно пин прерывания указать?
2) вот пример для Blackfin
...
.irq = IRQ_PH6,
...


Нашёл в файле ядра irqs.h коментарий:
"IRQ interrupt symbols are the AT91xxx_ID^ symbols for IRQs handled directly through the AIC, or else the AT91_PIN_* symbols in file for ones handled indirectly as GPIOs.
We make provision for 5 banks of GPIO."
Я так пониамю можно смело писать
.irq = AT91_PIN_PA31,
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.05.2012 01:28 Редактировалось 09.05.2012 01:29 Сообщение: 4
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Что за соседние файлы вы имеете ввиду?

обычно в ядре в каталоге с файлом платы есть еще какое-то количество файлов - я о них..

Цитата
Я так пониамю можно смело писать
.irq = AT91_PIN_PA31,

вполне можно попробовать - все зависит от смышлености драйвера вашего ацп.. можно попробовать так или так (примеры из "соседнего" файла board-usb-a926x.c), поправив имена и значения под свой драйвер..
Код
/*
* MACB Ethernet device
*/
static struct at91_eth_data __initdata ek_macb_data = {
.phy_irq_pin = AT91_PIN_PE31,
.is_rmii = 1,
};
static void __init ek_add_device_eth(void)
{
if (machine_is_usb_a9260() || machine_is_usb_a9g20())
ek_macb_data.phy_irq_pin = AT91_PIN_PA31;

at91_add_device_eth(&ek_macb_data);
}

Код
#define MMC_SPI_CARD_DETECT_INT AT91_PIN_PC4
static int at91_mmc_spi_init(struct device *dev,
irqreturn_t (*detect_int)(int, void *), void *data)
{
/* Configure Interrupt pin as input, no pull-up */
at91_set_gpio_input(MMC_SPI_CARD_DETECT_INT, 0);
return request_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), detect_int,
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
"mmc-spi-detect", data);
}

static void at91_mmc_spi_exit(struct device *dev, void *data)
{
free_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), data);
}

static struct mmc_spi_platform_data at91_mmc_spi_pdata = {
.init = at91_mmc_spi_init,
.exit = at91_mmc_spi_exit,
.detect_delay = 100, /* msecs */
};


кстати, если у вас 9g45, то в ядре может быть реализована поддержка ads7846 - там вроде spi-gpio + прерывание с чипа..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 09.05.2012 09:10 Редактировалось 09.05.2012 09:12 Сообщение: 5
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Цитата

Я так пониамю можно смело писать
.irq = AT91_PIN_PA31,


Более безопасно и правильно написать

.irq = gpio_to_irq(AT91_PIN_PA31),

Например в ядре 2.6.36
http://lxr.free-electrons.com/source/arch/arm/mach-at91/include/mach/gpio.h?v=2.6.36;a=arm#L223

223 static inline int gpio_to_irq(unsigned gpio)
224 {
225 return gpio;
226 }


в ядре 3.3 уже по-другому
http://lxr.free-electrons.com/source/arch/arm/mach-at91/include/mach/gpio.h#L209

216 #define gpio_to_irq(gpio) (gpio + NR_AIC_IRQS)
Спуститься к концу Подняться к началу
Персональная информация
Franky
Добавлено 09.05.2012 22:20 Редактировалось 09.05.2012 22:20 Сообщение: 6
Franky
5

Пункты: 5030
Регистрация: 29.06.2010
Дабы не плодить темы, пытаюсь собрать ядро с драйвермо АЦП и вот что пишет:


include/linux/spi/ad7606.h:53: error: expected specifier-qualifier-list before 'u16'
include/linux/spi/ad7606.h:67: error: field 'poll_work' has incomplete type
include/linux/spi/ad7606.h:68: error: expected specifier-qualifier-list before 'wait_queue_head_t'
include/linux/spi/ad7606.h:88: warning: 'struct iio_dev' declared inside parameter list
include/linux/spi/ad7606.h:88: warning: its scope is only this definition or declaration, which is probably not what you want
include/linux/spi/ad7606.h:89: warning: 'struct iio_dev' declared inside parameter list
include/linux/spi/ad7606.h:91: error: expected ';', ',' or ')' before '*' token


Никак не пойму в чём дело. Драйвер "от производителя"
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 09.05.2012 23:22 Сообщение: 7
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
вот нечего было в партизана играть..
хотя бы для информации изучайте - тыц

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
Franky
Добавлено 10.05.2012 00:05 Сообщение: 8
Franky
5

Пункты: 5030
Регистрация: 29.06.2010
Цитата
вот нечего было в партизана играть..
хотя бы для информации изучайте - тыц


так в том то и дело, что непонятно почему такие варнинги и ошибки вылезли.
я так понял там с дефайнами проблемы. Скорее всего драйвер на сайте AnalogDevices заточен под Blackfin и для AT91 нужно рукми править некоторые дефайны (например u16)
Спуститься к концу Подняться к началу
Персональная информация
Franky
Добавлено 10.05.2012 00:13 Сообщение: 9
Franky
5

Пункты: 5030
Регистрация: 29.06.2010
Цитата
Цитата

Я так пониамю можно смело писать
.irq = AT91_PIN_PA31,


Более безопасно и правильно написать

.irq = gpio_to_irq(AT91_PIN_PA31),

Например в ядре 2.6.36
http://lxr.free-electrons.com/source/arch/arm/mach-at91/include/mach/gpio.h?v=2.6.36;a=arm#L223

223 static inline int gpio_to_irq(unsigned gpio)
224 {
225 return gpio;
226 }


в ядре 3.3 уже по-другому
http://lxr.free-electrons.com/source/arch/arm/mach-at91/include/mach/gpio.h#L209

216 #define gpio_to_irq(gpio) (gpio + NR_AIC_IRQS)


нужно ли предварительно инициализировать прерывания от GPIO? если да, то как?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.05.2012 10:48 Сообщение: 10
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Цитата

нужно ли предварительно инициализировать прерывания от GPIO?


Нужно соответствующий GPIO на ввод переключить, все остальное делает ядро и драйвер.
at91_set_gpio_input(AT91_PIN_PA31, 1);

1 - это если pull up нужен.
http://lxr.free-electrons.com/source/arch/arm/mach-at91/gpio.c#L164
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux