hi,
ich versuch mich gerade an einem tastaturtreiber. dazu hab ich die irqs des master/slave-pics auf die interrupts 20h-27h und 28h-2fh gemappt. soweit ich das richtig verstanden hab, wird bei einer tastatureingabe der irq1 aufgerufen (wobei danach auf port 0x60 der scancode abgelesen werden kann). dem irq1 ist bei mir die isr 21h zugeordnet. allerdings wird diese isr nicht aufgerufen, wenn ich eine taste drücke.
jetzt frag ich mich, obs an der remapping routine liegt, oder an was anderem. hier der code den ich zum remappen verwende:
;; PIC ports
%define PIC_MASTER_CMD 20h
%define PIC_MASTER_DATA 21h
%define PIC_SLAVE_CMD 0a0h
%define PIC_SLAVE_DATA 0a1h
;; -----------------------------------------------
;; remapping PICs IRQs to not-reserved interrupts
;; -----------------------------------------------
remap_pic:
;; ICW1
mov al, 10001b ; bit1=1: forth ICW, bit2=0: pic cascading
out PIC_MASTER_CMD, al
out PIC_SLAVE_CMD, al
;; now starting to send the 3 inizialisation words on the data port
;; ICW2: its vector offset
;; ICW3: tell it how it is wired to master/slaves
;; ICW4: gives additionnal infos about the environment
;; ICW2
mov al, 20h
out PIC_MASTER_DATA, al ; map master irqs to int 20h-27h
mov al, 28h
out PIC_SLAVE_DATA, al ; map slave ircq to 28h-2fh
;; ICW3
mov al, 4 ; 4 == bit3=1 -> irq2@master wired with slave ...
out PIC_MASTER_DATA, al
shr al, 2 ; number of master irq necessary -> also irq2
out PIC_SLAVE_DATA, al
;; ICW4
;; before isr finishes, the pic needs to be notified,
;; so he knows when to restart work
mov al, 1
out PIC_MASTER_DATA, al
out PIC_SLAVE_DATA, al
;; end of interrupt(eoi) signal to both pics
mov al, 20h
out PIC_MASTER_CMD, al
out PIC_SLAVE_CMD, al
ret
wenn ich den irq1 per software-interrupt aufrufe, wird die entsprechende isr auch ausgeführt, was mich vermuten lässt, dass es nichts mit einer möglicherweise falschen initialisierung der idt zu tun.
meine allgemeine ablaufreihenfolge sieht so aus:
;; interrupts disabled
;; ...
pmode:
;; ...
;; init idt
;; ...
call remap_pic
call enable_irqs
sti
;; kernel main
;; ...
kann mir jemand sagen, was da schief läuft?