ADB Protocol | |||||
============ | |||||
Resources | |||||
--------- | |||||
ADB - The Untold Story: Space Aliens Ate My Mouse | |||||
http://developer.apple.com/legacy/mac/library/#technotes/hw/hw_01.html | |||||
Apple IIgs Hardware Reference Second Edition [p80(Chapter6 p121)] | |||||
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIgs%20Hardware%20Reference.pdf | |||||
ADB Keycode | |||||
http://72.0.193.250/Documentation/macppc/adbkeycodes/ | |||||
http://m0115.web.fc2.com/m0115.jpg | |||||
[Inside Macintosh volume V, pages 191-192] | |||||
ADB Signaling | |||||
http://kbdbabel.sourceforge.net/doc/kbd_signaling_pcxt_ps2_adb.pdf | |||||
ADB Overview & History | |||||
http://en.wikipedia.org/wiki/Apple_Desktop_Bus | |||||
Microchip Application Note: ADB device(with code for PIC16C) | |||||
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011062 | |||||
AVR ATtiny2131 ADB to PS/2 converter(Japanese) | |||||
http://hp.vector.co.jp/authors/VA000177/html/KeyBoardA5DEA5CBA5A2II.html | |||||
Pinouts | |||||
------- | |||||
ADB female socket from the front: | |||||
__________ | |||||
| | <--- top | |||||
| 4o o3 | | |||||
|2o o1| | |||||
| == | | |||||
|________| <--- bottom | |||||
| | <--- 4pins | |||||
ADB female socket from bottom: | |||||
========== <--- front | |||||
| | | |||||
| | | |||||
|2o o1| | |||||
|4o o3| | |||||
---------- <--- back | |||||
1: Data | |||||
2: Power SW(low when press Power key) | |||||
3: Vcc(5V) | |||||
4: GND | |||||
Commands | |||||
-------- | |||||
ADB command is 1byte and consists of 4bit-address, 2bit-command | |||||
type and 2bit-register. The commands are always sent by Host. | |||||
Command format: | |||||
7 6 5 4 3 2 1 0 | |||||
| | | |------------ address | |||||
| |-------- command type | |||||
| |---- register | |||||
bits commands | |||||
------------------------------------------------------ | |||||
- - - - 0 0 0 0 Send Request(reset all devices) | |||||
A A A A 0 0 0 1 Flush(reset a device) | |||||
- - - - 0 0 1 0 Reserved | |||||
- - - - 0 0 1 1 Reserved | |||||
- - - - 0 1 - - Reserved | |||||
A A A A 1 0 R R Listen(write to a device) | |||||
A A A A 1 1 R R Talk(read from a device) | |||||
The command to read keycodes from keyboard is 0x2C which | |||||
consist of keyboard address 2 and Talk against register 0. | |||||
Address: | |||||
2: keyboard | |||||
3: mice | |||||
Registers: | |||||
0: application(keyobard uses this to store its data.) | |||||
1: application | |||||
2: application(keyboard uses this for LEDs and state of modifiers) | |||||
3: status and command | |||||
Communication | |||||
------------- | |||||
This is a minimum information for keyboard communication. | |||||
See "Resources" for detail. | |||||
Signaling: | |||||
~~~~____________~~||||||||||||__~~~~~_~~|||||||||||||||__~~~~ | |||||
|800us | |7 Command 0| | | |15-64 Data 0|Stopbit(0) | |||||
+Attention | | | +Startbit(1) | |||||
+Startbit(1) | +Tlt(140-260us) | |||||
+stopbit(0) | |||||
Bit cells: | |||||
bit0: ______~~~ | |||||
65 :35us | |||||
bit1: ___~~~~~~ | |||||
35 :65us | |||||
bit0 low time: 60-70% of bit cell(42-91us) | |||||
bit1 low time: 30-40% of bit cell(21-52us) | |||||
bit cell time: 70-130us | |||||
[from Apple IIgs Hardware Reference Second Edition] | |||||
Criterion for bit0/1: | |||||
After 55us if line is low/high then bit is 0/1. | |||||
Attention & start bit: | |||||
Host asserts low in 560-1040us then places start bit(1). | |||||
Tlt(Stop to Start): | |||||
Bus stays high in 140-260us then device places start bit(1). | |||||
Global reset: | |||||
Host asserts low in 2.8-5.2ms. All devices are forced to reset. | |||||
Send request from device(Srq): | |||||
Device can request to send at commad(Global only?) stop bit. | |||||
keep low for 300us to request. | |||||
Keyboard Data(Register0) | |||||
This 16bit data can contains two keycodes and two released flags. | |||||
First keycode is palced in upper byte. When one keyocode is sent, | |||||
lower byte is 0xFF. | |||||
Release flag is 1 when key is released. | |||||
1514 . . . . . 8 7 6 . . . . . 0 | |||||
| | | | | | | | | +-+-+-+-+-+-+- Keycode2 | |||||
| | | | | | | | +--------------- Released2(1 when the key is released) | |||||
| +-+-+-+-+-+-+----------------- Keycode1 | |||||
+------------------------------- Released1(1 when the key is released) | |||||
Keycodes: | |||||
Scancode consists of 7bit keycode and 1bit release flag. | |||||
Device can send two keycodes at once. If just one keycode is sent | |||||
keycode1 contains it and keyocode2 is 0xFF. | |||||
Power switch: | |||||
You can read the state from PSW line(active low) however | |||||
the switch has a special scancode 0x7F7F, so you can | |||||
also read from Data line. It uses 0xFFFF for release scancode. | |||||
Keyboard LEDs & state of keys(Register2) | |||||
This register hold current state of three LEDs and nine keys. | |||||
The state of LEDs can be changed by sending Listen command. | |||||
1514 . . . . . . 7 6 5 . 3 2 1 0 | |||||
| | | | | | | | | | | | | | | +- LED1(NumLock) | |||||
| | | | | | | | | | | | | | +--- LED2(CapsLock) | |||||
| | | | | | | | | | | | | +----- LED3(ScrollLock) | |||||
| | | | | | | | | | +-+-+------- Reserved | |||||
| | | | | | | | | +------------- ScrollLock | |||||
| | | | | | | | +--------------- NumLock | |||||
| | | | | | | +----------------- Apple/Command | |||||
| | | | | | +------------------- Option | |||||
| | | | | +--------------------- Shift | |||||
| | | | +----------------------- Control | |||||
| | | +------------------------- Reset/Power | |||||
| | +--------------------------- CapsLock | |||||
| +----------------------------- Delete | |||||
+------------------------------- Reserved | |||||
END_OF_ADB |
t.m.k. Keyboard Firmware | t.m.k. Keyboard Firmware | ||||
======================== | ======================== | ||||
http://github.com/tmk/tmk_keyboard | |||||
This is keyboard firmware for AVR USB MCUs or Teensy/Teensy++. | |||||
http://www.pjrc.com/teensy | |||||
This is keyboard firmware for Teensy(AVR USB MCU) and V-USB board. | |||||
The project is heavily based on PJRC USB Keyboard/Mouse Example and | |||||
owes a debt to preceding keyboard firmware projects. | |||||
source code repository: | |||||
http://github.com/tmk/tmk_keyboard | |||||
This firmware is used in following projects: | This firmware is used in following projects: | ||||
HHKB mod: http://geekhack.org/showwiki.php?title=Island:12047 | HHKB mod: http://geekhack.org/showwiki.php?title=Island:12047 | ||||
Macway mod: http://geekhack.org/showwiki.php?title=Island:11930 | Macway mod: http://geekhack.org/showwiki.php?title=Island:11930 | ||||
PS2 to USB: http://geekhack.org/showwiki.php?title=Island:14618 | |||||
ADB to USB: http://geekhack.org/showwiki.php?title=Island:14290 | |||||
The project is heavily based on PJRC USB Keyboard/Mouse Example and | |||||
owes a debt to preceding keyboard firmware projects. | |||||
http://www.pjrc.com/teensy | |||||
Features | Features | ||||
----------- | ----------- | ||||
Files & Directories | |||||
------------------- | |||||
Target: | |||||
hhkb/ keyboard controller for PFU HHKB pro | |||||
macway/ keyboard controller for Macway mod | |||||
ps2_usb/ PS2 to USB keyboard converter | |||||
adb_usb/ ADB to USB keyboard converter | |||||
USB Protocol Stack: | |||||
pjrc/ PJRC USB stack | |||||
vusb/ V-USB USB stack | |||||
ps2.[ch] PS/2 protocol | |||||
adb.[ch] ADB protocol | |||||
Build | Build | ||||
----- | ----- | ||||
To compile needs AVR GCC, AVR Libc and GNU make. | To compile needs AVR GCC, AVR Libc and GNU make. | ||||
You can use WinAVR on Windows. http://winavr.sourceforge.net/ | You can use WinAVR on Windows. http://winavr.sourceforge.net/ | ||||
$ cd <target> (hhkb or macway currently) | |||||
$ cd <target> | |||||
$ make | $ make | ||||
The firmware will be compiled as a file tmk_<target>.hex. | The firmware will be compiled as a file tmk_<target>.hex. | ||||
Debuging & Rescue | Debuging & Rescue | ||||
----------------- | ----------------- | ||||
Use PJRC's hid_listen.exe to see debug messages. | Use PJRC's hid_listen.exe to see debug messages. | ||||
Press right Control + Shift + Alt + GUI + H to debug menu. | |||||
Press <COMMAND> + H to debug menu. | |||||
(see config.h for <COMMAND> key combination.) | |||||
Pressing any 3 keys when connected enables debug output. | Pressing any 3 keys when connected enables debug output. | ||||
Pressing any 4 keys when connected makes bootloader comes up. | Pressing any 4 keys when connected makes bootloader comes up. |
TODO & IDEAS | |||||
------------ | |||||
Code cleaning | |||||
keymap layer definition | |||||
Debug/Config console | |||||
keymap/layer setting | |||||
layer switching timing | |||||
matrix display | |||||
help | |||||
display keymap | |||||
display matrix(row, col) | |||||
debug console | |||||
through PJRC console | |||||
through UART/USB CDC | |||||
mouse acceleration | |||||
store setting to EEPROM | |||||
Document | |||||
development | |||||
Interchangable protocol stack | |||||
USB | |||||
PJRC stack(default currently) | |||||
LUFA | |||||
original minimal stack for keyboard/mouse | |||||
PS/2 | |||||
from keyboard-upgrade? | |||||
Layer switch | |||||
toggle layer switch | |||||
Debouncing logic | |||||
will be coded when bouncing occurs. | |||||
bouncing doesnt occur on my ALPS switch so far. | |||||
scan rate is too slow?(to be measure) | |||||
Child lock | |||||
disable keyboard to protect against atacking by child | |||||
Windows key blocking | |||||
disable Windows keys for gamers | |||||
OneHand operation | |||||
RAlt + Del(or \) to Alt + Tab | |||||
Licensings(GPL) | |||||
GPL will not be infringement of PJRC license. | |||||
Extra switch | |||||
foot sw for layer switching | |||||
mouse button | |||||
PS/2->USB keyboard converter | |||||
PS/2 keyboard host protocol support | |||||
PS/2,USB detection | |||||
act as PS/2 keyboard or USB keyboard. | |||||
PS/2 keyboard device protocol support | |||||
Thinkpad keyboard support | |||||
turn to USB keyboard/mouse composite device | |||||
Other MCU/board support | |||||
architectures on which GCC is available. | |||||
AT90USBKEY and other AVR USB boards | |||||
Cortex-M3 ARM board(STM32) | |||||
http://strawberry-linux.com/catalog/items?code=32105 | |||||
Separate keyboard support | |||||
comunicate between keyboards by I2C? | |||||
this is for ergo keyoboard style. | |||||
DONE & STATUS | |||||
------------- | |||||
PS2 mouse bug to be FIX'd | |||||
macway/matrix: line select changes pins for mouse. | |||||
2010/01/02 | |||||
support for HHKB pro matrix signal | |||||
exchange controller board with teensy | |||||
2010/10/11 | |||||
OneHand operation | |||||
Matias half keyboard style | |||||
2010/10/23 | |||||
souce code cleaning | |||||
2010/10/23 | |||||
debug on/off | |||||
debug off by default | |||||
pressing keys during booting | |||||
2010/10/23 | |||||
mouse horizontal wheel | |||||
http://www.microchip.com/forums/tm.aspx?high=&m=391435&mpage=1#391521 | |||||
http://www.keil.com/forum/15671/ | |||||
http://www.microsoft.com/whdc/device/input/wheel.mspx | |||||
2010/10/13 | |||||
debug on/off | |||||
Fn key conbination during normal operation | |||||
matrix print on/off | |||||
key print on/off | |||||
mouse print on/off | |||||
2010/10/26 | |||||
layer switching | |||||
time before switching | |||||
timeout when not used during specific time | |||||
2010/10/30 | |||||
Build Option | |||||
windows media keys suport | |||||
2010/01/06 | |||||
Document | |||||
build, customize | |||||
2010/01/06 | |||||
Trackpoint(PS/2) | |||||
receive PS/2 signal from TrackPoint | |||||
2010/01/02 | |||||
send USB HID report | |||||
EOF |
/* | |||||
Copyright (c) 2011 Jun WAKO <[email protected]> | |||||
This software is licensed with a Modified BSD License. | |||||
All of this is supposed to be Free Software, Open Source, DFSG-free, | |||||
GPL-compatible, and OK to use in both free and proprietary applications. | |||||
Additions and corrections to this file are welcome. | |||||
Redistribution and use in source and binary forms, with or without | |||||
modification, are permitted provided that the following conditions are met: | |||||
* Redistributions of source code must retain the above copyright | |||||
notice, this list of conditions and the following disclaimer. | |||||
* Redistributions in binary form must reproduce the above copyright | |||||
notice, this list of conditions and the following disclaimer in | |||||
the documentation and/or other materials provided with the | |||||
distribution. | |||||
* Neither the name of the copyright holders nor the names of | |||||
contributors may be used to endorse or promote products derived | |||||
from this software without specific prior written permission. | |||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE | |||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |||||
POSSIBILITY OF SUCH DAMAGE. | |||||
*/ | |||||
#include <stdbool.h> | #include <stdbool.h> | ||||
#include <util/delay.h> | #include <util/delay.h> | ||||
#include <avr/io.h> | #include <avr/io.h> | ||||
} | } | ||||
return us; | return us; | ||||
} | } | ||||
/* | |||||
ADB Protocol | |||||
============ | |||||
Resources | |||||
--------- | |||||
ADB - The Untold Story: Space Aliens Ate My Mouse | |||||
http://developer.apple.com/legacy/mac/library/#technotes/hw/hw_01.html | |||||
Apple IIgs Hardware Reference Second Edition [p80(Chapter6 p121)] | |||||
ftp://ftp.apple.asimov.net/pub/apple_II/documentation/Apple%20IIgs%20Hardware%20Reference.pdf | |||||
ADB Keycode | |||||
http://72.0.193.250/Documentation/macppc/adbkeycodes/ | |||||
http://m0115.web.fc2.com/m0115.jpg | |||||
[Inside Macintosh volume V, pages 191-192] | |||||
ADB Signaling | |||||
http://kbdbabel.sourceforge.net/doc/kbd_signaling_pcxt_ps2_adb.pdf | |||||
ADB Overview & History | |||||
http://en.wikipedia.org/wiki/Apple_Desktop_Bus | |||||
Microchip Application Note: ADB device(with code for PIC16C) | |||||
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011062 | |||||
AVR ATtiny2131 ADB to PS/2 converter(Japanese) | |||||
http://hp.vector.co.jp/authors/VA000177/html/KeyBoardA5DEA5CBA5A2II.html | |||||
Pinouts | |||||
------- | |||||
ADB female socket from the front: | |||||
__________ | |||||
| | <--- top | |||||
| 4o o3 | | |||||
|2o o1| | |||||
| == | | |||||
|________| <--- bottom | |||||
| | <--- 4pins | |||||
ADB female socket from bottom: | |||||
========== <--- front | |||||
| | | |||||
| | | |||||
|2o o1| | |||||
|4o o3| | |||||
---------- <--- back | |||||
1: Data | |||||
2: Power SW(low when press Power key) | |||||
3: Vcc(5V) | |||||
4: GND | |||||
Commands | |||||
-------- | |||||
ADB command is 1byte and consists of 4bit-address, 2bit-command | |||||
type and 2bit-register. The commands are always sent by Host. | |||||
Command format: | |||||
7 6 5 4 3 2 1 0 | |||||
| | | |------------ address | |||||
| |-------- command type | |||||
| |---- register | |||||
bits commands | |||||
------------------------------------------------------ | |||||
- - - - 0 0 0 0 Send Request(reset all devices) | |||||
A A A A 0 0 0 1 Flush(reset a device) | |||||
- - - - 0 0 1 0 Reserved | |||||
- - - - 0 0 1 1 Reserved | |||||
- - - - 0 1 - - Reserved | |||||
A A A A 1 0 R R Listen(write to a device) | |||||
A A A A 1 1 R R Talk(read from a device) | |||||
The command to read keycodes from keyboard is 0x2C which | |||||
consist of keyboard address 2 and Talk against register 0. | |||||
Address: | |||||
2: keyboard | |||||
3: mice | |||||
Registers: | |||||
0: application(keyobard uses this to store its data.) | |||||
1: application | |||||
2: application(keyboard uses this for LEDs and state of modifiers) | |||||
3: status and command | |||||
Communication | |||||
------------- | |||||
This is a minimum information for keyboard communication. | |||||
See "Resources" for detail. | |||||
Signaling: | |||||
~~~~____________~~||||||||||||__~~~~~_~~|||||||||||||||__~~~~ | |||||
|800us | |7 Command 0| | | |15-64 Data 0|Stopbit(0) | |||||
+Attention | | | +Startbit(1) | |||||
+Startbit(1) | +Tlt(140-260us) | |||||
+stopbit(0) | |||||
Bit cells: | |||||
bit0: ______~~~ | |||||
65 :35us | |||||
bit1: ___~~~~~~ | |||||
35 :65us | |||||
bit0 low time: 60-70% of bit cell(42-91us) | |||||
bit1 low time: 30-40% of bit cell(21-52us) | |||||
bit cell time: 70-130us | |||||
[from Apple IIgs Hardware Reference Second Edition] | |||||
Criterion for bit0/1: | |||||
After 55us if line is low/high then bit is 0/1. | |||||
Attention & start bit: | |||||
Host asserts low in 560-1040us then places start bit(1). | |||||
Tlt(Stop to Start): | |||||
Bus stays high in 140-260us then device places start bit(1). | |||||
Global reset: | |||||
Host asserts low in 2.8-5.2ms. All devices are forced to reset. | |||||
Send request from device(Srq): | |||||
Device can request to send at commad(Global only?) stop bit. | |||||
keep low for 300us to request. | |||||
Keyboard Data(Register0) | |||||
This 16bit data can contains two keycodes and two released flags. | |||||
First keycode is palced in upper byte. When one keyocode is sent, | |||||
lower byte is 0xFF. | |||||
Release flag is 1 when key is released. | |||||
1514 . . . . . 8 7 6 . . . . . 0 | |||||
| | | | | | | | | +-+-+-+-+-+-+- Keycode2 | |||||
| | | | | | | | +--------------- Released2(1 when the key is released) | |||||
| +-+-+-+-+-+-+----------------- Keycode1 | |||||
+------------------------------- Released1(1 when the key is released) | |||||
Keycodes: | |||||
Scancode consists of 7bit keycode and 1bit release flag. | |||||
Device can send two keycodes at once. If just one keycode is sent | |||||
keycode1 contains it and keyocode2 is 0xFF. | |||||
Power switch: | |||||
You can read the state from PSW line(active low) however | |||||
the switch has a special scancode 0x7F7F, so you can | |||||
also read from Data line. It uses 0xFFFF for release scancode. | |||||
Keyboard LEDs & state of keys(Register2) | |||||
This register hold current state of three LEDs and nine keys. | |||||
The state of LEDs can be changed by sending Listen command. | |||||
1514 . . . . . . 7 6 5 . 3 2 1 0 | |||||
| | | | | | | | | | | | | | | +- LED1(NumLock) | |||||
| | | | | | | | | | | | | | +--- LED2(CapsLock) | |||||
| | | | | | | | | | | | | +----- LED3(ScrollLock) | |||||
| | | | | | | | | | +-+-+------- Reserved | |||||
| | | | | | | | | +------------- ScrollLock | |||||
| | | | | | | | +--------------- NumLock | |||||
| | | | | | | +----------------- Apple/Command | |||||
| | | | | | +------------------- Option | |||||
| | | | | +--------------------- Shift | |||||
| | | | +----------------------- Control | |||||
| | | +------------------------- Reset/Power | |||||
| | +--------------------------- CapsLock | |||||
| +----------------------------- Delete | |||||
+------------------------------- Reserved | |||||
END_OF_ADB | |||||
*/ |