@@ -1,173 +0,0 @@ | |||
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 |
@@ -1,16 +1,19 @@ | |||
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: | |||
HHKB mod: http://geekhack.org/showwiki.php?title=Island:12047 | |||
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 | |||
@@ -31,12 +34,27 @@ Limitations | |||
----------- | |||
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 | |||
----- | |||
To compile needs AVR GCC, AVR Libc and GNU make. | |||
You can use WinAVR on Windows. http://winavr.sourceforge.net/ | |||
$ cd <target> (hhkb or macway currently) | |||
$ cd <target> | |||
$ make | |||
The firmware will be compiled as a file tmk_<target>.hex. | |||
@@ -100,7 +118,8 @@ Build Options | |||
Debuging & Rescue | |||
----------------- | |||
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 4 keys when connected makes bootloader comes up. |
@@ -1,103 +0,0 @@ | |||
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 |
@@ -1,3 +1,39 @@ | |||
/* | |||
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 <util/delay.h> | |||
#include <avr/io.h> | |||
@@ -191,3 +227,180 @@ static inline uint8_t wait_data_hi(uint8_t 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 | |||
*/ |