Собственно, реализовал.
Механизм следующий - пишу в два регистра числа, когда они сложатся, выставляю прерывание. Прерывания на PCI шине разделяемые, на одной линии может "сидеть" несколько плат, поэтому надо проверять, кто выставил прерывание. Для этого я создал регистр, в который писал определенное число, если выставил прерывание. В функции-обработчике прерывания просто читал этот регистр, и если прерывание выставил я, то читаю результат суммы.
Однако, я решил немного модернизировать устройство, сделать "по человечески" интерфейс. Хочу оставить только 2 БАРа. Но не могу понять одну вещь, касающуюся адресации. БАРы у меня определены как порты I/O. В драйвере получаю нач. адреса этих портов и их длину. Например, получаю BAR0 - 9f00 (16). Если я буду обращаться по адресу 9f00 попаду в BAR0, если по адресу 9f00+4 тоже в этот БАР, если 9f08 тоже BAR0 и если 9f0c тоже BAR0. Тут все понятно. Теперь я смотрю что выставляет моей локальной логике мегафункция в качестве адреса (линии l_adro). А выставляет она мне тот же адрес, что присутствует на шине. Т.е. если я обращусь к BAR0 по адресу 9f00, то мегафункция выдаст мне на линиях l_adro 9f00. Собственно вопрос. Младшие два разряда этого адреса - 00 это и есть "относительный" адрес для моей локальной логики? Начальный адрес любого бара будет начинаться с 00 (9f00, 9c00, 9a00)?
|