PC ATkeyboard

    技术2022-05-11  54

    For PC AT or newer: - 8048 chip in the keyboard - 8042 chip on the PC motherboard Both are tiny 8-bit microprocessors, programmed to understand simple one- or two-byte commands. Features of the 8042 chip: - I/O ports: 60h read/write Data register 64h write Command register 64h read Status register - Can be in "AT mode" or "PS/2 mode", depending on the motherboard type. If your PC has a PS/2 mouse port, the 8042 uses PS/2 mode. - "Output Port"; used for controlling the A20 gate, resetting the PC, etc. This port is written by 8042 command byte D1h, and read by command byte D0h - "Input Port"; used for reading the status of the keyboard lock keyswitch (located on the front of many PCs). This port is read by 8042 command byte C0h - The poorly-named "Command Byte register"; various functions. This register is written by 8042 command byte 60h, and read by 8042 command byte 20h ================================================================ 8042 REGISTERS IN "AT MODE" ================================================================ Bits in 8042 Status register b7 PERR parity error in data received from keyboard b6 RxTO receive (Rx) timeout b5 TxTO transmit (Tx) timeout b4 INH keyboard communications inhibited b3 A2 0=60h was the port last written to, 1=64h was last b2 SYS distinguishes reset types: 0=cold reboot, 1=warm reboot b1 IBF input buffer full (data from host to keyboard) b0 OBF output buffer full (data from keyboard to host) Bits in 8042 Output Port (Table P0383 in PORTS.A) b7 1=keyboard data line pulled low (inhibited) b6 1=keyboard clock line pulled low (inhibited) b5 output buffer empty (xxx - input buffer NOT full?) b4 input buffer full (xxx - output buffer NOT empty?) b3 (undefined) b2 (undefined) b1 A20 gate on/off b0 reset the PC (THIS BIT SHOULD ALWAYS BE SET TO 1) Bits in 8042 Input Port b7 1=keyboard inhibit switch is activated (locked) b6 display type switch status (1=color, 0=monochrome) b5 manufacturing setting (?) b4 external RAM (?) b3 (undefined) b2 (undefined) b1 (undefined) b0 (undefined) Bits in Command Byte register (Table P0404 in PORTS.A) b7 (reserved) b6 XLAT convert set 2 scancodes to set 1 ("IBM PC compatibility mode") b5 PC ? b4 _EN disables keyboard when set b3 OVR 1=override inhibit keyswitch b2 SYS System Flag (same as b2 in Status register) b1 (reserved) b0 INT enables IRQ 1 interrupt on keyboard IBF ================================================================ 8042 REGISTERS IN "PS/2 MODE" ================================================================ Bits in 8042 Status register b7 PERR parity error in data received from keyboard b6 TO general timeout (Rx or Tx) b5 MOBF mouse output buffer full b4 INH keyboard communications inhibited b3 A2 0=60h was the port last written to, 1=64h was last b2 SYS distinguishes reset types: 0=cold reboot, 1=warm reboot b1 IBF input buffer full (data from host to keyboard) b0 OBF output buffer full (data from keyboard to host) Bits in 8042 Output Port b7 1=keyboard data line pulled low (inhibited) b6 1=keyboard clock line pulled low (inhibited) b5 enables IRQ 12 interrupt on mouse IBF b4 enables IRQ 1 interrupt on keyboard IBF b3 1=mouse clock line pulled low (inhibited) b2 1=mouse data line pulled low (inhibited) b1 A20 gate on/off b0 reset the PC (THIS BIT SHOULD ALWAYS BE SET TO 1) Bits in 8042 Input Port b7 1=keyboard inhibit switch is activated (locked) b6 display type switch status (1=color, 0=monochrome) b5 manufacturing setting (?) b4 external RAM (?) b3 (undefined) b2 (undefined) b1 mouse data line b0 keyboard data line Bits in Command Byte register b7 (reserved) b6 XLAT convert set 2 scancodes to set 1 ("IBM PC compatibility mode") b5 _EN2 disables mouse when set b4 _EN disables keyboard when set b3 (reserved) b2 SYS System Flag (same as b2 in Status register) b1 INT2 enables IRQ 12 interrupt on mouse IBF b0 INT enables IRQ 1 interrupt on keyboard IBF ================================================================ 8042 CONTROLLER COMMANDS (from Table P0401 of PORTS.A) ================================================================ Before writing each byte of these commands to port 64h, poll the status register (port 64h) until bit b1=0. 20h-3Fh reads byte from 8042 RAM at address=lower 5 bits of command The byte at address 0 is the "Command Byte". 60h-7Fh nn writes byte nn to 8042 RAM at address=lower 5 bits of command The byte at address 0 is the "Command Byte". (xxx - It may be that only address 0 [the "Command Byte"] can be read and written. In that case, only command bytes 20h and 60h will work.) 90h-9Fh write bottom 4 bits of command to bottom 4 bits of Output Port A7h disables PS/2 mouse port A8h enables PS/2 mouse port A9h self-test mouse interface, returns Result Byte (see below) AAh self-test 8042; returns 55h if success, FCh if failure ABh self-test keyboard interface, returns Result Byte (see below) ADh disables keyboard (sets b4 of Command Byte register) AEh enables keyboard (clears b4 of Command Byte register) C0h reads Input Port D0h reads Output Port D1h nn writes Output Port Important: bit 0 (system reset) should always be set here, as the system may hang constantly. To reset the PC, pulse b0 of the Output Port with command FEh instead. D4h nn send command byte to PS/2 mouse DDh disable A20 ("Vectra" method; see http://www.execpc.com/~geezer/osd/boot/a20.asm) DFh enable A20 ("Vectra" method) F0h-FFh pulse bit(s) of Output Port low for 6 microseconds. If b0-b3 of the command is low, the corresponding bit in the Output Port will be pulsed low. b0=system reset, and should ALWAYS be PULSED low, never set low constantly. ================================================================ 8048 KEYBOARD COMMANDS (from Table P0386 of PORTS.A) ================================================================ Before writing each byte of these commands to port 60h, poll the status register (port 64h) until bit b1=0. Unless otherwise noted: each command responds with FAh (ACKnowledge) or FEh (Resend) after receiving each byte of the command. EDh nn write LEDs. nn= b2 Caps Lock b1 Num Lock b0 Scroll Lock EEh Echo, keyboard responds with EEh F0h nn Selects scancode set nn=1-3 or 0 to return current set. Only scancode set 2 is widely (and correctly) supported. F2h Read ID. Keyboard responds with ACK (FAh) and two optional ID bytes: (none) AT keyboard 83h ABh (?) ABh 41h MF2, translation mode ABh 83h MF2, pass-through mode F3h nn Set typematic (auto-repeat) rate/delay. nn= b7 unused b6..5 Repeat delay (00=250 msec ... 11=1000msec) b4..0 Repeat rate (00000=30 Hz ... 11111=2 Hz). F4h Clears output buffer, enables keyboard F5h Disables keyboard, resets to defaults F6h Sets keyboard default typematic rate/delay and selects scancode set 2 F7h [*] Make all keys make/typematic (auto-repeat; no break) F8h [*] Make all keys make/break (no typematic) F9h [*] Make all keys make-only (no typematic or break) FAh [*] Make all keys typematic/make/break FBh nn [*] Make one key make/typematic nn is the key's Set 3 scancode FCh nn [*] Make one key make/break FDh nn [*] Make one key make-only FEh Resend previous byte (unless previous byte is FEh) FFh Reset 8048, do power-on self-test, return test result byte [*] These functions work only when the keyboard is using scancode Set 3 Result Byte for interface self-tests (Table P0406 in PORTS.A) Returned by controller commands A9h or ABh 0 no error 1 clock line stuck low 2 clock line stuck high 3 data line stuck low 4 data line stuck high non-key status bytes -------------------- 00h Key detection error or buffer full. AAh Power-on/reset diagnostics successful. E0h (scancode sets 1 and 2) Prefix byte for "gray" keys (keys not on original 83-/84-key keyboard) EEh Sent in response to ECHO command. F0h (scancode sets 2 and 3) Prefix byte for break codes. FAh ACKnowledge; response to most commands. FCh Diagnostics failed (MF keyboard). FDh Diagnostics failed (AT keyboard). The keyboard stops scanning and waits for next command after returning code FCh or FDh FEh Last command was invalid or had parity error; resend it. FFh Key detection error or buffer full.  

    最新回复(0)