Страниц: [1] 2
  Печать  
Автор Тема: вектор прерывания PCI QNX 4.25  (Прочитано 11549 раз)
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« : Апреля 25, 2011, 01:25:34 pm »

Добрый день!

У меня есть PCI плата.
Используя функции из pci.h (_CA_PCI_Write_Config_Word) меняю прерывание
Interrupt line.
Значение "PCI Int Pin" выставляется самостоятельно, операционкой.

Где можно узнать как соотносятся прерывание с вектором прерывания?
Где храниться? Можно ли его (вектор прерывания) менять?

Спасибо.

Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #1 : Апреля 26, 2011, 12:44:08 am »

"PCI Int Pin" выставляется не операционкой, а изготовителем платы. Если на плате реализована одна функция, то плата обязана использовать контакт А. БИОС или операционка уже смотрит куда заведена этот контакт (если вы переместите плату в соседний слот, то контакт А уже пойдет на другую линию), и для информации драйвера записывает номер линии.Interrupt line - это просто регистр в конфигпространстве устройства, который ни на что не влияет, а служит для передачи информации (изначально от БИОС до драйвера ОС).
Поменять линию прерывания иногда можно, но это не просто вписать нужную вам линию в регистр (вы просто обдурите драйвер, который не сможет работать с устройством по прерываниям, потому что будет их ждать не на той линии), но и еще поприседать с регистрами настройки чипсета. Иногда сменить линию не получится. Для начала, чтобы понимать как это работает почитайте PCI local bus спецификацию.
В ОС защищенного режима вам вроде бы не надо знать как соотносится линия прерывания с вектором прерывания. Это настраивается самой ОС, обычно ядром, ну или читайте доки от интел на интеррапт дескриптор табл.

Записан
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #2 : Апреля 27, 2011, 03:37:24 pm »

Все еще борюсь с прерыванием на PCI плате

Есть некая структура (pci.h)
struct _pci_config_regs
{
        unsigned short          Vendor_ID;
        unsigned short          Device_ID;
        unsigned short          Command;
        unsigned short          Status;
        char                    Revision_ID;
        char                    Class_Code[3];
        char                    Cache_Line_Size;
        char                    Latency_Timer;
        char                    Header_Type;
        char                    BIST;
        unsigned long           Base_Address_Regs[6];
        unsigned long           CardBus_CIS;
      unsigned short          Sub_Vendor_ID;
      unsigned short          Sub_System_ID;
        unsigned long           ROM_Base_Address;
      char                    Capabilities_Pointer;
      char                    Reserved2 [3];
        unsigned long           Reserved3;
        char                    Interrupt_Line;
        char                    Interrupt_Pin;
        char                    Min_Gnt;
        char                    Max_Lat;
        char                    Device_Dependent_Regs[192];
};


если в ней менять значение Interrupt_Line функциями

_CA_PCI_Write_Config_Word или _CA_PCI_Write_Config_DWord(_CA_PCI_Write_Config_Byte не получается), автоматически меняется и Interrupt_Pin, причем не на то значение, которое бы меня устроило.

Вроде есть еще функция int _CA_PCI_Set_Hardware_Interrupt, но она ничего не меняет.

Может кто-то знает, как решить проблему?

Записан
-Al-
Jr. Member
**
Offline Offline

Сообщений: 71


Просмотр профиля
« Ответ #3 : Апреля 27, 2011, 04:14:14 pm »

А зачем Вы все это делаете?? Interrupt Line выставляет PnP BIOS и данное поле является информационным для Вас. Изменение значения в нем не приведет к перенастройке контроллера прерываний. Interrupt Pin задает разработчик платы и как правило он вообще фиксированный (INT A).
« Последнее редактирование: Апреля 27, 2011, 04:17:17 pm от -Al- » Записан
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #4 : Апреля 27, 2011, 04:25:19 pm »

На плате, по-умолчанию, Interrupt Line выставлено в 0 (контроллер прерываний таймера).
И у меня скорость обмена очень зависит от ticksize (разрешение системного таймера). Слишком маленький (минимум 0.5) тоже выставить не могу - не корректно все начинает работать, рвутся процессы...
Вот решила попробовать со сменой Interrupt Line
Записан
Basil-64
Sr. Member
****
Offline Offline

Сообщений: 282



Просмотр профиля
« Ответ #5 : Апреля 28, 2011, 12:05:14 pm »

На плате, по-умолчанию, Interrupt Line выставлено в 0 (контроллер прерываний таймера).
show_pci -v в студию. И скажите таки  вендор-девайс
Записан

В жизни всегда есть место подвигу - главное быть подальше от этого места. Но никак не получается.
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #6 : Апреля 28, 2011, 01:27:59 pm »

результат show_pci -v


Vendor ID      = 1234h,
Device ID      = 2h,
PCI index      = 0h
Class Code     = ff0000h Unknown(9fbdh)
Revision ID    = 3h
Bus number     = 2
Device number  = 9
Function num   = 0
Status Reg     = 0h
Command Reg    = 102h
Header type    = 0h Single-function
BIST           = 0h Build-in-self-test not supported
Latency Timer  = 0h
Cache Line Size= 0h
Base Address   = MEM@fea00000h,32bit length 524288
Max Lat        = 0ns
Min Gnt        = 0ns
PCI Int Pin    = 1, INT A
Interrupt line = 0
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #7 : Мая 04, 2011, 08:16:37 am »

А вы укажите побольше v, скажите "show_pci -vvvvv" и посмотрите внимательно, желательно со стандартом "local PCI bus" в руках, на выводимую в конце таблицу мэпинга линий прерываний. По той таблице можно определить возможно ли изменить линию прерывания для вашего устройства и какие еще устройства за вашим потянуться (т.е. они физически соединены одной электрической цепью, и сменив стиринг прерываний на материнке, все устройства на этой цепи окажутся на другой линии прерываний). Так вот смена линии прерывания это двухшаговая процедура:
0) определить возможна ли смена и какие устройства на шине PCI это зацепит
1)  вызвать функцию_CA_PCI_Set_Hardware_Interrupt (насколько я знаю это обертка для точки входа в соответствующую PCI BIOS функцию - почитайте еще PCI BIOS specification)
2) записать регистр Interrupt Line в config space всех зацепленных устройств новое значение линии прерывания
2б) перезапустить драйвера зацепленных сменой линии прерывания устройств, если надо скормить драйверу параметром новую линию прерывания.

А устройство ваше похоже какой-то жесткий самопал.

Записан
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #8 : Мая 10, 2011, 11:33:25 am »

Продолжаю по теме.
Как заметил ed1k:
Цитировать
А устройство ваше похоже какой-то жесткий самопал.
К сожалению это так, но легче нам от этого не становится...)

Проблема стала более понятна:
При старте системы, это PCI устройство определяется и ему выделяется правильное прерывание (ловили приборами). Только разработчики намудрили и записаться нужному прерыванию не удается, потому и 0.

Мы можем программно потом менять это прерывание Interrupt_Line функциями _CA_PCI_Write_Config_Word или _CA_PCI_Write_Config_DWord.

Но нам бы хотелось знать, что хотел при старте выделить этому устройству POST.

Если мы смотрим "show_pci -vvvvv" то таблице map irq routing уже проставлен 0.

Как понять (поймать, запросить), а какое прерывание ПЛАНИРОВАЛОСЬ присвоить?

Спасибо.

Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 633


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #9 : Мая 10, 2011, 11:43:26 am »

Бывают материнские платы, которые позволяют привязывать номер прерывания к PCI-слоту. Думаю, что это самый простой вариант.
Записан
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #10 : Мая 10, 2011, 03:08:41 pm »

Но нам такой вариант (с материнской платой) не подходит...(
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #11 : Мая 11, 2011, 05:24:32 pm »

наклонять железячников чтобы таки БИОС мог вписать номер выделенного прерывания. бо никак, для того и нужен этот регистр чтения-записи. нужно хоть чуточку стандарты уважать.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #12 : Мая 11, 2011, 05:36:04 pm »

в принципе, можно написать свою ловушку, которая опытным путем найдет на какой линии прерывания сидит устройство и уже с той линией и работать. что-то похожее я когда-то давно в линукс ядре видел.
Записан
Zaca
Jr. Member
**
Offline Offline

Сообщений: 64



Просмотр профиля
« Ответ #13 : Мая 11, 2011, 05:41:28 pm »

Ну может и ловушку... Мне бы хоть как-то понять, что с этой проблемой делать. Так как просто присвоением свободного прерывания проблема решается очень коряво. Переносимости просто никакой..)
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 633


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #14 : Мая 11, 2011, 05:45:22 pm »

Эта железка в принципе никуда не переносима, разве что только на кладбище... Так что только частное решение может быть оправдано.
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: