Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Advantech PCI-1755

46K
11 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Господа, кто-нибудь имел дело с сабжевым девайсом?

Девайс на сайте производителя

Суть проблемы... Пишу драйвер устройства для работы с 8 линиями General-purpose DI/O. Линии аппаратно настроены на ввод, при приходе TTL-сигнала (регистрируется по фронту) в соответствующих регистрах (регистр данных, регистр статуса прерываний) корректно выставляется статус приема прерываний, но прерывания не генерируются. Иными словами работает только поллинг, хотя ISR зарегистрирован и прерывания разрешены:

BASE+0xC <- 0xffff
BASE+0xE <- 0x8000

Что может быть не так?
252
11 января 2011 года
koderAlex
1.4K / / 07.09.2005
проверте поля int line и int pin .
разделяемое прерывание или нет ?
46K
11 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
проверте поля int line и int pin .


Что именно проверить?

прерывание с девайсом делят еще несколько устройств, однако обработчики прерываний они не навешивают.

260
11 января 2011 года
Ramon
1.1K / / 16.08.2003
На какую платформу пишите? Код? Линк на тряпку по котрой пишите?

PS: Хрустальный шар и бубен с варганом ни вам не окружающим не помогут.
46K
11 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата: Ramon
На какую платформу пишите?



QNX

Цитата: Ramon
Код?



Сэмплы отсутствуют.

Выжимка из разных фрагментов кода. Инициализация устройства примитивна до безобразия:

 
Код:
/* Disable IRQs and set positive IRQ polarity */
    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 );

Остальной код к девайсу не относится.

Цитата: Ramon
Линк на тряпку по котрой пишите?



МАН:
http://downloadt.advantech.com/download/downloadsr.aspx?File_Id=1-FT87VY

260
11 января 2011 года
Ramon
1.1K / / 16.08.2003
А где код ответственный за регистрацию и обработку прерывания ибо плевки по портам это же еще не все, не так ли?

PS: Для пущей уверености проверьте регстры PCI'ом конфигурационном пространстве устройства включая командный и как правильно заметил тов. koderAlex, Interrupt Line и Interrupt Pin.
252
11 января 2011 года
koderAlex
1.4K / / 07.09.2005
кажется регистр 0x0E не сконфигурирован .
значение 0х8000 - это только общее разрешение вывода сигнала на шину . а конкретный источник не указан .
46K
11 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
А где код ответственный за регистрацию и обработку прерывания ибо плевки по портам это же еще не все, не так ли?



Прерывание обрабатывается в потоке, ISR фактически вырожден (маскирование производится автоматически). Для интересующихся обработкой прерываний в потоке. В первых же строках потока-обработчика выводится строка в консоль.

Иными словами, если бы прерывание возникло, это бы всплыло. Тут траблов быть в принципе не может, не впервой. Проблема может быть только:
1. аппаратного характера;
2. при инициализация девайса.

Цитата:
PS: Для пущей уверености проверьте регстры PCI'ом конфигурационном пространстве устройства включая командный и как правильно заметил тов. koderAlex, Interrupt Line и Interrupt Pin.



Pin: A
Line: 5

Единственный момент, если зарезервировать 5-е прерывание в биосе, то девайсу иное не назначается (в результате становится Pin: A, Line: 0).

Что конкретно с командным регистром может быть не так?

Цитата:
кажется регистр 0x0E не сконфигурирован .
значение 0х8000 - это только общее разрешение вывода сигнала на шину . а конкретный источник не указан .



Конкретные источники заданы через порт 0xC. При экспериментах пробовал и источники, указанные в 0xD, ситуация таже самая.

252
11 января 2011 года
koderAlex
1.4K / / 07.09.2005
"3. CH4:CH0 = Channel of change detection
4. CD = Interrupt by DI change detection enable
5. PM = Interrupt by pattern match enable.." в 0х0Е . это источники . )
46K
11 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
"3. CH4:CH0 = Channel of change detection
4. CD = Interrupt by DI change detection enable
5. PM = Interrupt by pattern match enable.." в 0х0Е . это источники . )



Они не относятся к 8-линиям общего назначения, только к 32 высокоскоростным каналам. Мне же нужна точная идентификация источника прерывания (CD позволяет идентифицировать только 1 канал) на линиях общего назначения.

Как я уже говорил, флаги в регистре статуса IRQ выставляются корректно => девайс адекватно регистрирует прерывания, но не генерирует их.

252
11 января 2011 года
koderAlex
1.4K / / 07.09.2005
это каналы отмеченные на блок-схеме как Aux.DIO0-7 ?
их конфигурация вообще в 0х30 идёт . )
260
12 января 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: @.n.g.e.r

Что конкретно с командным регистром может быть не так?



В нем есть бит, запрещающий генерацию прерываний.

А по поводу кода, в доке пишут как должно быть, а не как у вас есть на самом деле.

Если IRQ назначен биосом, разрешена их генерация в командном регистре PCI, контроллере прерываний и девайсе, а в девайсе судя по всему они сконфигурены, если только вы с базой регистров не ошиблись, то остается только регистрация ISR'а и иже с ним.

46K
12 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
это каналы отмеченные на блок-схеме как Aux.DIO0-7 ?
их конфигурация вообще в 0х30 идёт . )



Да это именно они, только вот в 0x30 не конфигурация, а байт, отправляемый через данные линии.

Цитата: Ramon
В нем есть бит, запрещающий генерацию прерываний.



Разрешены - Cmd=0x17

Цитата: Ramon

А по поводу кода, в доке пишут как должно быть, а не как у вас есть на самом деле.

Если IRQ назначен биосом, разрешена их генерация в командном регистре PCI, контроллере прерываний и девайсе, а в девайсе судя по всему они сконфигурены, если только вы с базой регистров не ошиблись, то остается только регистрация ISR'а и иже с ним.



Дабы исключить этот пункт. Код потока обработки:

Код:
/* Enable I/O-ports access */
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 );
}
46K
12 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
После перестановки девайса в другой слот прерывания пошли.

Для другого слота биос назначил:
Pin: A
Line: 11

--
Всем спасибо
260
12 января 2011 года
Ramon
1.1K / / 16.08.2003
В общем похоже на правду, однако используйте предназначенный для инициализации события макрос SIGEV_INTR_INIT, и не важно, что вы набиваете "тоже самое" руками, используйте стандартные средства.

PS: Прерывания небось пошарелись еще с кем-то.
46K
12 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Похоже, я поспешил с выводами.

Прерывания генерировал контроллер HDD. Похоже девайс все-таки битый. Ни в одном PCI слоте не выдает прерываний (по всем остальным признакам работая нормально).

Цитата:
В общем похоже на правду, однако используйте предназначенный для инициализации события макрос SIGEV_INTR_INIT, и не важно, что вы набиваете "тоже самое" руками, используйте стандартные средства.

PS: Прерывания небось пошарелись еще с кем-то.



Угу... 2-а USB-девайса, сетевая карта, контроллеры IDE и SATA.

252
12 января 2011 года
koderAlex
1.4K / / 07.09.2005
Цитата: @.n.g.e.r
Да это именно они, только вот в 0x30 не конфигурация, а байт, отправляемый через данные линии.



что в нём сейчас ? в каком положении sw2 ?
осциллографом смотрели ?

46K
13 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
что в нём сейчас ? в каком положении sw2 ?
осциллографом смотрели ?



sw2 все в положении DI (т.е. эти 8 линий настроены на ввод). Конфигурация стенда следующая:

[TTL-генератор] -> девайс (линия DI0) <- [осциллограф]

Из 0x30 читается соответственно: 0xfffe или 0xffff в зависимости от сгенерированного сигнала на первой линии.

252
14 января 2011 года
koderAlex
1.4K / / 07.09.2005
а на PCI сигнал осциллографом виден?
46K
14 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
а на PCI сигнал осциллографом виден?



Не могу посмотреть, стенд опечатан

252
16 января 2011 года
koderAlex
1.4K / / 07.09.2005
Цитата: @.n.g.e.r
Не могу посмотреть, стенд опечатан



а как тогда осциллограф подключали ? что это за стенд , если инженер-разработчик до железа дотянутся не может ? ремонт не предусмотрен ?

что вы по моему темните .

46K
17 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Цитата:
а как тогда осциллограф подключали ? что это за стенд , если инженер-разработчик до железа дотянутся не может ? ремонт не предусмотрен ?



Осциллограф подключен ко входам девайса для контроля подающегося сигнала. Другой возможности, к сожалению, нет.

Стенд представляет собой промышленный компьютер и опечатан "соответствующими службами" еще до окончания разработки. Причины такого решения мне не ясны и прокомментировать данный факт не могу. Нам, как сторонним разработчикам, стенд передан исключительно для написания драйвера под конкретное оборудование.

Ремонт, соответственно, осуществлять в случае чего будем явно не мы.

46K
18 января 2011 года
@.n.g.e.r
19 / / 07.07.2009
Как оказалось, для инициирования прерываний с PCI-1755 недостаточно инициализации девайса и размаскирования прерывания на уровне PCI Config Space.

Нужно было еще до инициализировать PLX (в частности, его регистр INTCSR).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог