Advantech PCI-1755
Девайс на сайте производителя
Суть проблемы... Пишу драйвер устройства для работы с 8 линиями General-purpose DI/O. Линии аппаратно настроены на ввод, при приходе TTL-сигнала (регистрируется по фронту) в соответствующих регистрах (регистр данных, регистр статуса прерываний) корректно выставляется статус приема прерываний, но прерывания не генерируются. Иными словами работает только поллинг, хотя ISR зарегистрирован и прерывания разрешены:
BASE+0xC <- 0xffff
BASE+0xE <- 0x8000
Что может быть не так?
разделяемое прерывание или нет ?
Что именно проверить?
прерывание с девайсом делят еще несколько устройств, однако обработчики прерываний они не навешивают.
PS: Хрустальный шар и бубен с варганом ни вам не окружающим не помогут.
QNX
Сэмплы отсутствуют.
Выжимка из разных фрагментов кода. Инициализация устройства примитивна до безобразия:
out16( dev->base + 0x0C, 0x0 );
out16( dev->base + 0x0E, 0x0 );
/* Configure IRQs */
out8( dev->base + 0x0D, 0xff );
out8( dev->base + 0x0C, 0xff );
out16( dev->base + 0x0E, 0x8000 );
Остальной код к девайсу не относится.
МАН:
http://downloadt.advantech.com/download/downloadsr.aspx?File_Id=1-FT87VY
PS: Для пущей уверености проверьте регстры PCI'ом конфигурационном пространстве устройства включая командный и как правильно заметил тов. koderAlex, Interrupt Line и Interrupt Pin.
значение 0х8000 - это только общее разрешение вывода сигнала на шину . а конкретный источник не указан .
Прерывание обрабатывается в потоке, ISR фактически вырожден (маскирование производится автоматически). Для интересующихся обработкой прерываний в потоке. В первых же строках потока-обработчика выводится строка в консоль.
Иными словами, если бы прерывание возникло, это бы всплыло. Тут траблов быть в принципе не может, не впервой. Проблема может быть только:
1. аппаратного характера;
2. при инициализация девайса.
Pin: A
Line: 5
Единственный момент, если зарезервировать 5-е прерывание в биосе, то девайсу иное не назначается (в результате становится Pin: A, Line: 0).
Что конкретно с командным регистром может быть не так?
значение 0х8000 - это только общее разрешение вывода сигнала на шину . а конкретный источник не указан .
Конкретные источники заданы через порт 0xC. При экспериментах пробовал и источники, указанные в 0xD, ситуация таже самая.
4. CD = Interrupt by DI change detection enable
5. PM = Interrupt by pattern match enable.." в 0х0Е . это источники . )
4. CD = Interrupt by DI change detection enable
5. PM = Interrupt by pattern match enable.." в 0х0Е . это источники . )
Они не относятся к 8-линиям общего назначения, только к 32 высокоскоростным каналам. Мне же нужна точная идентификация источника прерывания (CD позволяет идентифицировать только 1 канал) на линиях общего назначения.
Как я уже говорил, флаги в регистре статуса IRQ выставляются корректно => девайс адекватно регистрирует прерывания, но не генерирует их.
их конфигурация вообще в 0х30 идёт . )
Что конкретно с командным регистром может быть не так?
В нем есть бит, запрещающий генерацию прерываний.
А по поводу кода, в доке пишут как должно быть, а не как у вас есть на самом деле.
Если IRQ назначен биосом, разрешена их генерация в командном регистре PCI, контроллере прерываний и девайсе, а в девайсе судя по всему они сконфигурены, если только вы с базой регистров не ошиблись, то остается только регистрация ISR'а и иже с ним.
их конфигурация вообще в 0х30 идёт . )
Да это именно они, только вот в 0x30 не конфигурация, а байт, отправляемый через данные линии.
Разрешены - Cmd=0x17
А по поводу кода, в доке пишут как должно быть, а не как у вас есть на самом деле.
Если IRQ назначен биосом, разрешена их генерация в командном регистре PCI, контроллере прерываний и девайсе, а в девайсе судя по всему они сконфигурены, если только вы с базой регистров не ошиблись, то остается только регистрация ISR'а и иже с ним.
Дабы исключить этот пункт. Код потока обработки:
ThreadCtl( _NTO_TCTL_IO, 0 );
/* Attach IRQ */
event.sigev_notify = SIGEV_INTR;
iid = InterruptAttachEvent( (int)irq, &event, 0 );
if ( dev->iid < 0 )
exit(-1);
while ( 1 ) {
/* Wait for IRQ */
InterruptWait( 0, NULL );
printf( ">>>>> IRQ\n" );
/* IRQ processing */
...
/* IRQ unmasking (masked by default ISR) */
InterruptUnmask( irq, iid );
}
Для другого слота биос назначил:
Pin: A
Line: 11
--
Всем спасибо
PS: Прерывания небось пошарелись еще с кем-то.
Прерывания генерировал контроллер HDD. Похоже девайс все-таки битый. Ни в одном PCI слоте не выдает прерываний (по всем остальным признакам работая нормально).
PS: Прерывания небось пошарелись еще с кем-то.
Угу... 2-а USB-девайса, сетевая карта, контроллеры IDE и SATA.
что в нём сейчас ? в каком положении sw2 ?
осциллографом смотрели ?
осциллографом смотрели ?
sw2 все в положении DI (т.е. эти 8 линий настроены на ввод). Конфигурация стенда следующая:
[TTL-генератор] -> девайс (линия DI0) <- [осциллограф]
Из 0x30 читается соответственно: 0xfffe или 0xffff в зависимости от сгенерированного сигнала на первой линии.
Не могу посмотреть, стенд опечатан
а как тогда осциллограф подключали ? что это за стенд , если инженер-разработчик до железа дотянутся не может ? ремонт не предусмотрен ?
что вы по моему темните .
Осциллограф подключен ко входам девайса для контроля подающегося сигнала. Другой возможности, к сожалению, нет.
Стенд представляет собой промышленный компьютер и опечатан "соответствующими службами" еще до окончания разработки. Причины такого решения мне не ясны и прокомментировать данный факт не могу. Нам, как сторонним разработчикам, стенд передан исключительно для написания драйвера под конкретное оборудование.
Ремонт, соответственно, осуществлять в случае чего будем явно не мы.
Нужно было еще до инициализировать PLX (в частности, его регистр INTCSR).