THE
COMPLETE AMIGA HARDWARE
REFERENCE MANUAL
APPENDIX H KEYBOARD This appendix contains the keyboard interface specification for A1000, A500 and A2000. The keyboard plugs into the Amiga computer via a cable with four primary connections. The four wires provide 5-volt power, ground, and signals called KCLK (keyboard clock) and KDAT keyboard data). KCLK is unidirectional and always driven by the keyboard; KDAT is driven by both the keyboard and the computer. Both signals are open-collector, there are pullup resistors in both the keyboard (inside the keyboard microprocessor) and the computer. - Appendix H 343 - KEYBOARD COMMUNICATIONS The keyboard transmits 8-bit data words serially to the main unit. Before the transmission starts, both KCLK and KDAT are high. The keyboard starts the transmission by putting out the first data bit (on KDAT), followed by a pulse on KCLK (low then high); then it puts out the second data bit and pulses KCLK until all eight data bits have been sent. After the end of the last KCLK pulse, the keyboard pulls KDAT high again. When the computer has received the eighth bit, it must pulse KDAT low for at least 1 (one) microsecond, as a handshake signal to the keyboard. The handshake detection on the keyboard end will typically use a hardware latch The keyboard must be able to detect pulses greater than or equal to 1 microsecond. Sofware MUST pulse the line low for 85 microseconds to ensure compatibility with all keyboard models. All codes transmitted to the computer are rotated one bit before transmission. The transmitted order is therefore 6-5-4-3-2-1-0-7. The reason for this is to transmit the up/down flag last, in order to cause a key-up code to be transmitted in case the keyboard is forced to restore lost sync (explained in more detail below). The KDAT line is active low; that is, a high level (+5V) is interpreted as 0, and a low level (0V) is interpreted as 1. ___ ___ ___ ___ ___ ___ ___ ___ _______ KCLK \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ _______________________________________________________ KDAT \_____x_____x_____x_____x_____x_____x_____x_____/ (6) (5) (4) (3) (2) (1) (0) (7) First Last sent sent The keyboard processor sets the KDAT line about 20 microseconds before it pulls KCLK low. KCLK stays low for about 20 microseconds, then goes high again. The processor waits another 20 microseconds before changing KDAT. Therefore, the bit rate during transmission is about 60 microseconds per bit, or 17 kbits/sec. - 344 Appendix H - KEYCODES Each key has a keycode associated with it (see accompanying table). Keycodes are always 7 bits long. The eighth bit is a "key-up"/"key-down" flag; a 0 (high level) means that the key was pushed down, and a 1 (low level) means the key was released (the CAPS LOCK key is different - see below). For example, here is a diagram of the "B" key being pushed down. The keycode for "B" is $35=00110101; due to the rotation of the byte, the bits transmitted are 01101010. ___ ___ ___ ___ ___ ___ ___ ___ _______ KCLK \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ _______ ______ ______ ____________ KDAT \__________/ \____/ \____/ 0 1 1 0 1 0 1 0 In the next example, the "B" key is released. The keycode is still $35, except that bit 7 is set to indicate "key-up," resulting in a code of $B5 = 10110101. After rotating, the transmission will be 01101011: ___ ___ ___ ___ ___ ___ ___ ___ _______ KCLK \_/ \_/ \_/ \_/ \_/ \_/ \_/ \_/ _______ ______ ______ ______ KDAT \__________/ \____/ \__________/ 0 1 1 0 1 0 1 0 CAPS LOCK KEY This key is different from all the others in that it generates a keycode only when it is pushed down, never when it is released. However, the up/down bit is still used. When pushing the CAPS LOCK key turns on the CAPS LOCK LED, the up/down bit will be 0; when pushing CAPS LOCK shuts off the LED, the up/down bit will be 1. - Appendix H 345 - "OUT-OF-SYNC" CONDITION Noise or other glitches may cause the keyboard to get out of sync with the computer. This means that the keyboard is finished transmitting a code, but the computer is somewhere in the middle of receiving it. If this happens, the keyboard will not receive its handshake pulse at the end of its transmission. If the handshake pulse does not arrive within 143 ms of the last clock of the transmission, the keyboard will assume that the computer is still waiting for the rest of the transmission and is therefore out of sync. The keyboard will then attempt to restore sync by going into "resync mode." In this mode, the keyboard clocks out a 1 and waits for a handshake pulse. If none arrives within 143 ms, it clocks out another 1 and waits again. This process will continue until a handshake pulse arrives. Once sync is restored, the keyboard will have clocked a garbage character into the computer. That is why the key-up/key-down flag is always transmitted last. Since the keyboard clocks out 1's to restore sync, the garbage character thus transmitted will appear as a key release, which is less dangerous than a key hit. Whenever the keyboard detects that it has lost sync, it will assume that the computer failed to receive the keycode that it had been trying to transmit. Since the computer is unable to detect lost sync, it is the keyboard's responsibility to inform the computer of the disaster. It does this by transmitting a "lost sync" code (value $F9 = 11111001) to the computer. Then it retransmits the code that had been garbled. NOTE The only reason to transmit the "lost sync" code to the computer is to alert the software that something may be screwed up. The "lost sync" code does not help the recovery process, because the garbage keycode can't be deleted, and the correct key code could simply be retransmitted without telling the computer that there was an error in the previous one. POWER-UP SEQUENCE There are two possible ways for the keyboard to be powered up under normal circumstances: <1> the computer can be turned on with the keyboard plugged in, or <2> the keyboard can be plugged into an already "on" computer. The keyboard and computer must handle either case without causing any upset. - 346 Appendix H - The first thing the keyboard does on power-up is to perform a self-test. This involves a ROM checksum test, simple RAM test, and watchdog timer test. Whenever the keyboard is powered up (or restarted - see below), it must not transmit anything until it has achieved synchronization with the computer. The way it does this is by slowly clocking out 1 bits, as described above, until it receives a handshake pulse. If the keyboard is plugged in before power-up, the keyboard may continue this process for several minutes as the computer struggles to boot up and get running. The keyboard must continue clocking out ls for however long is necessary, until it receives its handshake. If the keyboard is plugged in after power-up, no more than eight clocks will be needed to achieve sync. In this case, however, the computer may be in any state imaginable but must not be adversely affected by the garbage character it will receive. Again, because it receives a key release, the damage should be minimal. The keyboard driver must anticipate this happening and handle it, as should any application that uses raw keycodes. NOTE The keyboard must not transmit a "lost sync" code after re-synchronizing due to a power-up or restart; only after re-synchronizing due to a handshake time-out. Once the keyboard and computer are in sync, the keyboard must inform the computer of the results of the self-test. If the self-test failed for any reason, a "selftest failed" code (value $FC = 11111100) is transmitted (the keyboard does not wait for a handshake pulse after sending the" selftest failed" code). After this, the keyboard processor goes into a loop in which it blinks the CAPS LOCK LED to inform the user of the failure. The blinks are coded as bursts of one, two, three, or four blinks, approximately one burst per second: One blink ROM checksum failure. Two blinks RAM test failed. Three blinks Watchdog timer test failed. Four blinks A short exists between two row lines or one of the seven special keys (not implemented). If the self-test succeeds, then the keyboard will proceed to transmit any keys that are currently down. First, it sends an "initiate power-up key stream" code (value $FD = 11111101), followed by the key codes of all depressed keys (with keyup/down set to "down" for each key). After any keys are sent (usually there won't be any at all), a "terminate key stream" code (value $FE = 11111110) is sent. Finally, the CAPS LOCK LED is shut off. This marks the end of the start-up sequence, and normal processing commences. The usual sequence of events will therefore be: power-up; synchronize; transmit "initiate power-up key stream" ($FD); transmit "terminate key stream2 ($FE). - Appendix H 347 - RESET WARNING NOTE Available on some A1000 and A2000 keyboards. You cannot rely on this feature for all Amigas. The keyboard has the additional task of resetting the computer on the command of the user. The user initiates Reset Warning by simultaneously pressing the CTRL key and the two "AMIGA" keys. The keyboard responds to this input by syncing up any pending transmit operations. The keyboard then sends a "reset warning" to the Amiga. This action alerts the Amiga software to finish up any pending operations (such as disk DMA) and prepare for reset. A specific sequence of operations ensure that the Amiga is in a state where it can respond to the reset warning. The keyboard sends two actual "reset warning" keycodes. The Amiga must handshake to the first code like any normal keystroke, else the keyboard goes directly to Hard Reset. On the second "reset warning" code the Amiga must drive KDAT low within 250 milliseconds, else the keyboard goes directly to Hard Reset. If the all the tests are passed, the Amiga has 10 full seconds to do emergency processing. When the Amiga pulls KDAT high again, the keyboard finally asserts hard reset. If the Amiga fails to pull KDAT high within 10 seconds, Hard Reset is asserted anyway. HARD RESET NOTE This happens after Reset Warning. Valid for all keyboards except the Amiga 500. The keyboard Hard Resets the Amiga by pulling KCLK low and starting a 500 millisecond timer. When one or more of the keys is released AND 500 milliseconds have passed, the keyboard will release KCLK. 500 milliseconds is the minimum time KCLK must be held low. The maximum KCLK time depends on how long the user holds the three keys down. NOTE Circuitry on the Amiga motherboard detects the 500 millisecond KCLK pulse. - 348 Appendix H - After releasing KCLK, the keyboard jumps to its start-up code (internal RESET). This will initialize the keyboard in the same way as cold power- on. NOTE The keyboard must resend the "powerup key stream"! SPECIAL CODES The special codes that the keyboard uses to communicate with the main unit are summarized here. NOTE The special codes are 8-bit numbers; there is no up/down flag associated with them. However, the transmission bit order is the same as previously described. CODE NAME MEANING ----------------------------------------------------------------------- 78 Reset warning. CTRL-AMIGA, AMIGA has been hit - computer will be reset in 10 seconds. (see text) F9 Last key code bad, next code i9 the same code retransmitted (used when keyboard and main unit get out of sync). FA Keyboard output buffer overflow FB Unused (was controller failure) FC Keyboard selftest failed FD Initiate power-up key stream (keys pressed at powerup) FE Terminate power-up key stream FF Unused (was interrupt) - Appendix H 349 - MATRIX TABLE Row 5 Row 4 Row 3 Row 2 Row 1 Row 0 Column (Bit 7) (Bit 6) (Bit 5) (Bit 4) (Bit 3) (Bit 2) +-------+-------+-------+-------+-------+-------+ 15 |(spare)|(spare)|(spare)|(spare)|(spare)|(spare)| (PD.7)| | | | | | | | (0E) | (1C) | (2C) | (47) | (48) | (49) | +-------+-------+-------+-------+-------+-------+ 14 | * | |