Есле работать из под вины, то где в IDT находится вектор IRQ0. Собственно таймер нужен для Для синхронизации картридера. Возможно есть более продвинутые методы на совлеменных платах. И вообще где надыбать инфу!
skyproc используй RTE (Redirection Table Entry) I/O APIC-а, которая соответствует IRQ0 вот пример Код (Text): read_apic_irq: mov dword [0xFEC00000], 0x10 ; redirection table entry number for IRQ0 mov eax, [0xFEC00010] and eax, 0x000000FF ; eax contains IDT descriptor number for IRQ0 да, если из ядра ОС работаешь, надо посмотреть, на какой адрес отображены регистры I/O APIC-а (0xFEC000xx) (или самому их отобразить)
ВО! Но с RTE (Redirection Table Entry) I/O APIC-а я не знаком. Где взять подробную инфу, желательно на русском. Заранее спосибо!
skyproc на русском, пожалуй, не найдешь а так в Intel Datasheets поищи информацию, благо ее там много если не найдешь, могу кратко рассказать что к чему
skyproc I/O APIC - PCI устройство VENDOR ID = 0x8086 DEVICE ID = 0x1361 в конфигурационном пространстве есть два основных регистра 1. BAR (offset 0x10), биты 31-12 содержат 20 старших бит страницы, куда отображаются регистры I/O APIC-а 2. I/O APIC Base Register (offset 0x40-0x41), бит 15 включает альтернативное отображение регистров по адресу 0xFECXYZ00, где X - биты 11-8, Y - 7-4, Z - 3-0 По-умолчанию X = Y = Z = 0, значит базовый адрес = 0xFEC00000 I/O APIC имеет 4 регистра, которые напрямую отображены на память, основные это: 1. Index Register (offset 0), R/W, младшие 8 бит - номер регистра, к которому будем обращаться косвенно с помощью Window Register 2. Window Register (offset 0x10), R/W, собственно окно, через которое читаем/пишем в регистр, выбранный через Index Register Номера регистров, которые можем выбрать через Index Register: 1. APIC ID (0x00) 2. Version (0x01) (биты 23-16 содержат количество элементов Redirection Table - 1) 3. Arbitration ID (0x02) 4. Redirection Table Registers (0x10 - N, где N - максимальное количество элементов Redirection Table * 2) Каждый элемент Redirection Table занимает 8 байт, младшее двойное слово - 0x10, 0x12, 0x14, ... старшее - 0x11, 0x13, 0x15, ... т. е грубо говоря IRQ0 -> 0x10-0x11, IRQ1 -> 0x12-0x13, ... в не SMP машине старшее двойное слово можно не трогать, формат младшего следующий (основные биты) 31-17: зарезервированы 16: если 1 - линия замаскирована 15: Trigger Mode (0 - edge sensitive, 1 - level sensetive) 14: Remote IRR (устанавливается в 1, когда Local APIC подтвердил получение сообщения от I/O APIC-а, сбрасывается, когда Local APIC посылает EOI сообщение I/O APIC-у) 10-8: delivery mode (fixed, SMI, NMI, INIT, ExtINT) 7-0: вектор
rei3er skyproc в теме не разбираюсь, просто хочу заметить, что VENDOR ID = 0x8086 только на интеловских чипсетах, да и DeviceID тоже специфичен для каждого производителя искать нужно по Class/Subclass code
rei3er Начнем с того что APIC состоит из двух частей. I/O APIC и Local APIC. I/O APIC - не обязан быть PCI устройством. При этом I/O APIC Base Register - может распологаться в любом из системных PCI устройств. Чаще всего на мосту ISA. Так что придеться заводить базу чипсетов, для поиска I/O APIC. Поэтому предлогаю на первое время оставить базовый адресс 0xFEC00000