Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.