Presentation is loading. Please wait.

Presentation is loading. Please wait.

The Keyboard Controller Essential steps for implementing an interrupt service routine for the Keyboard Controller.

Similar presentations


Presentation on theme: "The Keyboard Controller Essential steps for implementing an interrupt service routine for the Keyboard Controller."— Presentation transcript:

1 The Keyboard Controller Essential steps for implementing an interrupt service routine for the Keyboard Controller

2 Our near-term goal To build a ‘mini’ x86 operating system It should be able run a Linux application It needs to support: –basic console input/output (keyboard, screen) –handling of device-interrupts (timer, keyboard) –‘exit’ gracefully when application is finished –utilize x86 privilege restrictions and 32bit code Most needed building-blocks already done

3 Keyboard and its controller Keyboard Controller CPU PIC bus KEYBOARDPS/2 MOUSE output port TIMER output bufferstatus regcontrol reg 0x64 0x60 input buffer input port RAM PIC

4 6 KB Controller Status PARETIMAUXBKEYLC / DSYSFINPBOUTB 7543210 LEGEND OUTB: Output-Buffer Full (1=yes, 0=no) INPB: Input-Buffer Full (1=yes, 0=no) SYSF: System-Flag (1=self-test successful, 0=power-on reset) C/D: Command/Data was written to (1=port 0x64, 0=port 0x60) KEYL: Keyboard-Lock status (1=keyboard available, 0=locked) AUXB: Output-Buffer’s data is (1=for mouse, 0=for keyboard) TIM: General Timeout-Error has occurred (1=yes, 0=no) PARE: Parity-Error on last byte from keyboard/mouse (1=yes, 0=no)

5 A few Controller Commands 0xAD: Disable Keyboard 0xAE: Enable Keyboard 0xA7: Disable PS/2 Mouse 0xA8: Enable PS/2 Mouse 0xC0: Read input-port (to output buffer) 0XD0: Read output-port (to output buffer)

6 Interrupt-Handler actions When the keyboard-controller issues an interrupt, these actions should be taken: –Save values in the working CPU registers –Read keyboard-controller’s status-register –If the output-buffer has new data, read it –If a “special” key (shift/toggle), adjust kb_flags –For a normal key, translate scancode to ascii –Insert the code-pair at tail-end of kb-queue –Send EOI-command to Interrupt Controller –Restore the saved values from CPU registers –Resume the interrupted procedure (with ‘iret’)

7 Keyboard Queue KBHEAD KBTAIL

8 BIOS DATA AREA KBFLAGS is word at address 0x40:0x17 KBHEAD is word at address 0x40:0x1A KBTAIL is word at address 0x40:0x1C KBQUEUE is array of 16 words array base-address at 0x40:0x1E KBBASE is word at 0x40:0x80 KBTAIL is word at 0x40:0x82

9 Format of KBFLAGS LSB Left-Shift key is pressed (1=yes, 0=no) Right-Shift key is pressed (1=yes, 0=no) 01 Ctrl-Key is pressed (1=yes, 0=no) Alt-Key is pressed (1=yes, 0=no) 234567 Caps-Lock is active (1=yes, 0=no) Num-Lock is active (1=yes, 0=no) Scroll-Lock is active (1=yes, 0=no) Insert-mode is active (1=yes, 0=no)

10 Demo ‘minikybd.s’ It shows a minimal implementation for the keyboard-controller’s interrupt-handler It runs in Real-Mode It ‘echos’ a user’s keystrokes IN-CLASS EXERCISE: modify this demo to run in Protected-Mode


Download ppt "The Keyboard Controller Essential steps for implementing an interrupt service routine for the Keyboard Controller."

Similar presentations


Ads by Google