Use software serial for Sun.
9 files changed, 284 insertions(+), 279 deletions(-) M common/mousekey.h M converter/sun_usb/Makefile M converter/sun_usb/README M converter/sun_usb/config.h M converter/sun_usb/keymap.c M converter/sun_usb/led.c M converter/sun_usb/matrix.c R protocol/{serial => serial_soft}.c M rules.mk
M common/mousekey.h => common/mousekey.h +1 -1
@@ 45,7 45,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define MOUSEKEY_TIME_TO_MAX 20 #endif #ifndef MOUSEKEY_WHEEL_MAX_SPEED #define MOUSEKEY_WHEEL_MAX_SPEED 16 #define MOUSEKEY_WHEEL_MAX_SPEED 8 #endif #ifndef MOUSEKEY_WHEEL_TIME_TO_MAX #define MOUSEKEY_WHEEL_TIME_TO_MAX 40
M converter/sun_usb/Makefile => converter/sun_usb/Makefile +32 -40
@@ 1,8 1,3 @@ # # Makefile for PJRC Teensy # # Target file name (without extension). TARGET = sun_usb @@ 16,7 11,7 @@ TARGET_DIR = . SRC = keymap.c \ matrix.c \ led.c \ protocol/serial.c protocol/serial_soft.c CONFIG_H = config.h @@ 37,46 32,43 @@ MCU = atmega32u4 # Teensy 2.0 F_CPU = 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). ARCH = AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the # input clock frequency (before any prescaling is performed) in Hz. This value may # differ from F_CPU if prescaling is used on the latter, and is required as the # raw input clock is fed directly to the PLL sections of the AVR for high speed # clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' # at the end, this will be done automatically to create a 32-bit value in your # source code. # # If no clock division is performed on the input clock inside the AVR (via the # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) # Interrupt driven control endpoint task OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Build Options # *Comment out* to disable the options. # MOUSEKEY_ENABLE = yes # Mouse keys EXTRAKEY_ENABLE = yes # Audio control and System control NKRO_ENABLE = yes # USB Nkey Rollover #---------------- Programming Options -------------------------- AVRDUDE = avrdude # Type: avrdude -c ? to get a full listing. AVRDUDE_PROGRAMMER = avr109 AVRDUDE_PORT = /dev/ttyACM0 AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex #AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep # Uncomment the following if you want avrdude's erase cycle counter. # Note that this counter needs to be initialized first using -Yn, # see avrdude manual. #AVRDUDE_ERASE_COUNTER = -y # Uncomment the following if you do /not/ wish a verification to be # performed after programming the device. #AVRDUDE_NO_VERIFY = -V # Increase verbosity level. Please use this when submitting bug # reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> # to submit bug reports. #AVRDUDE_VERBOSE = -v -v CONSOLE_ENABLE = yes # Console for debug #NKRO_ENABLE = yes # USB Nkey Rollover AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) #AVRDUDE_FLAGS = -p $(MCU) -c $(AVRDUDE_PROGRAMMER) AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) #PROGRAM_CMD = $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) #PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex PROGRAM_CMD = dfu-programmer atmega32u4 flash $(TARGET).hex # Boot Section Size in bytes # Teensy halfKay 512 # Atmel DFU loader 4096 # LUFA bootloader 4096 OPT_DEFS += -DBOOT_SIZE=4096 @@ # Search Path 84,7 76,7 @@ VPATH += $(TARGET_DIR) VPATH += $(TOP_DIR) include $(TOP_DIR)/protocol/pjrc.mk include $(TOP_DIR)/protocol/lufa.mk include $(TOP_DIR)/protocol.mk include $(TOP_DIR)/common.mk include $(TOP_DIR)/rules.mk
M converter/sun_usb/README => converter/sun_usb/README +58 -120
@@ 1,20 1,15 @@ Sun to USB keyboard protocol converter ====================================== Target MCU is ATMega32u4 but other USB capable AVR will also work. Supported keyboards: Sun Type 5 Keyboard, CTCSP SHORT TYPE KEYBOARD(CKUB) CTCSP SHORT TYPE KEYBOARD: http://imgur.com/a/QIv6p TODO ---- AVR UART engine expect positive logic while Sun keyboard signal is inverted serial. To use AVR UART engine you need inverter in front of RX and TX pin. Otherwise you can software serial routine to communicate the keyboard. Hardware -------- Target MCU is ATMega32u4 but other USB capable AVR will also work. You can use PJRC Teensy as dev board. http://www.pjrc.com/teensy/ Connector --------- 8Pin mini DIN ___ ___ @@ / |_| \ 24,118 19,61 @@ Connector \_____/ (receptacle) Wiring: Pin mini DIN Teensy ---------------------------------- 1 GND GND 2 GND GND 3 5V 4 RX/TX(Mouse) 5 RX PD2 6 TX PD3 7 GND GND 8 5V VCC Wiring: Pin mini DIN MCU ---------------------------------- 1 GND GND 2 GND GND 3 5V 4 RX/TX(Mouse) 5 RX PD3 6 TX PD2 7 GND GND 8 5V VCC Firmware Protocol -------- Build: Singnal: Asynchronous, Negative logic, 1200baud, No Flow control Frame format: 1-Start bit, 8-Data bits, No-Parity, 1-Stop bit AVR USART engine expects positive logic while Sun keyboard signal is negative. To use AVR UART engine you need exteral inverter in front of RX and TX pin. Otherwise you can software serial routine to communicate the keyboard. This converter uses software method, you doesn't need any inverter part. Commands From System To Keyboard 0x01 Reset Keyboard responds with following byte sequence: Success: 0xFF 0x04 0x7F Fail: 0x7E 0x01 0x7F 0x02 Bell On 0x03 Bell Off 0x0A Click On 0x0B Click Off 0x0E LED followed by LED status byte: bit: 3 2 1 0 LED: CapsLk ScrLk Compose NumLk 0x0F Layout Keyboard responds with 'Layout Response' 0xFE 0xXX Commands From Keyboard To System 0x7F Idle means no keys pressed. 0xFE Layout Response 0xFF Reset Response(followed by 0x04) Reference http://kentie.net/article/sunkbd/page2.htm http://kentie.net/article/sunkbd/KBD.pdf Build Firmware -------------- Just use 'make' $ cd sun_usb $ make And load the binary to MCU with your favorite programmer. If you use Teensy you can load with PJRC Teensy Loader tool. http://www.pjrc.com/teensy/loader.html * * * * * * * * * * * * * * * * * * X68000 Keyboard Protocol ======================== http://kyoutan.jpn.org/uts/pc/pic/x68key/ Connector --------- Mini DIN 7pin(female connector on computer side) 7 6 5 o o o 4 o = o 3 o o 2 1 Mini-DIN ------------- pin1 +5V pin2 MOUSE pin3 RXD pin4 TXD pin5 READY pin6 REMOTE pin7 GND Signaling --------- - TXD,RXD Asynchronous, 2400baud, 1-startbit(L), 8-databit, 1-stopbit(H) - READY ready/not ready(1/0) Data from keyboard ------------------ bit 7 make/break flag(0/1) bit 6-0 following scan code Data from computer ------------------ - LED contorol ON/OFF(0/1) bit 7 1(fixed) bit 6 全角 bit 5 ひらがな bit 4 INS bit 3 CAPS bit 2 コード入力 bit 1 ローマ字 bit 0 かな - Repeat delay bit 7 0(fixed) bit 6 1(fixed) bit 5 1(fixed) bit 4 0(fixed) bit 3-0 delay REPEAT_DELAY = 200+delay*100 ms default: 500ms - Repeat time bit 7 0(fixed) bit 6 1(fixed) bit 5 1(fixed) bit 4 1(fixed) bit 3-0 time REPEAT_TIME = 30+time^2*5 ms default: 110ms Scan Codes ---------- ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| `---' `---' `-------------------' `-------------------' `-----------' `---------------' ,-----------------------------------------------------------. ,-----------. ,---------------. | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| |-----------------------------------------------------------| |------------ |---------------| | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| |------------------------------------------------------. 1D | `---=====---' |---------------| | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29| | ___| 3C|___ | 47| 48| 49| 4A| |-----------------------------------------------------------| | 3B|---| 3D| |-----------|---| | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 70 | `---| 3E|---' | 4B| 4C| 4D| | `-----------------------------------------------------------| .---=====---. |-----------| 4E| | 5F| 55 | 56 | 35 | 57 | 58 | 59 | 60| | 72 | 73 | | 4F| 50| 51| | `---------------------------------------------' `-----------' `---------------' Then, load the binary to MCU with your favorite programmer.
M converter/sun_usb/config.h => converter/sun_usb/config.h +23 -17
@@ 18,11 18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #ifndef CONFIG_H #define CONFIG_H /* controller configuration */ #include "controller_teensy.h" #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x3333 #define DEVICE_VER 0x0100 #define MANUFACTURER t.m.k. #define PRODUCT Sun keyboard converter @@ #define DESCRIPTION converts Sun keyboard protocol into USB 36,7 34,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* key combination for command */ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) @@ 44,18 43,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. * asynchronous, negative logic, 1200baud, no flow control * 1-start bit, 8-data bit, non parity, 1-stop bit */ #ifdef __AVR_ATmega32U4__ # define SERIAL_RX_VECT USART1_RX_vect # define SERIAL_RX_DATA UDR1 # define SERIAL_RX_BAUD 1200 # define SERIAL_RX_UBBR ((F_CPU/(16UL*SERIAL_RX_BAUD))-1) # define SERIAL_RX_INIT() do { \ UBRR1L = (uint8_t) SERIAL_RX_UBBR; \ UBRR1H = (uint8_t) (SERIAL_RX_UBBR>>8); \ UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \ } while(0) #else # error "Serial(USART) configuration is needed." #endif #define SERIAL_NEGATIVE_LOGIC #define SERIAL_BAUD 1200 #define SERIAL_RXD_DDR DDRD #define SERIAL_RXD_PORT PORTD #define SERIAL_RXD_PIN PIND #define SERIAL_RXD_BIT 2 #define SERIAL_RXD_VECT INT2_vect #define SERIAL_RXD_INIT() do { \ /* pin configuration: input with pull-up */ \ SERIAL_RXD_DDR &= ~(1<<SERIAL_RXD_BIT); \ SERIAL_RXD_PORT |= (1<<SERIAL_RXD_BIT); \ /* enable interrupt: INT2(rising edge) */ \ EICRA |= ((1<<ISC21)|(1<<ISC20)); \ EIMSK |= (1<<INT2); \ } while (0) #define SERIAL_RXD_INT_ENTER() #define SERIAL_RXD_INT_EXIT() do { \ /* clear interrupt flag */ \ EIFR = (1<<INTF2); \ } while (0) #endif
M converter/sun_usb/keymap.c => converter/sun_usb/keymap.c +107 -55
@@ 25,34 25,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. // Following macros help you to define a keymap with the form of actual keyboard layout. /* X68000 Keyboard Scan codes ,-------. ,-------------------. ,---------------. ,---------------. ,-----------. ,---------------. | | | 61| | | | | | 63| 65| 66| 67| | 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| `-------' `-------------------' `---------------' `---------------' `-----------' `---------------' /* Sun type 5 keyboard ,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. | 76 | | | | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. | | | | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| | 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| |-------| |-----------------------------------------------------------| |------------ |---------------| | | | | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| |-------| |-----------------------------------------------------------| `-----------' |-----------| | | | | | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29 | | 47| 48| 49| 4A| | 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | |-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| | 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | |-------| |-----------------------------------------------------------| ,---. |-----------|---| | | | | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 70 | | 3E| | 4B| 4C| 4D| | |-------| |-----------------------------------------------------------| .-----------. |-----------| 4E| | | | | | | | 35 | | | | | | |73 | | 4F| 50| 51| | | 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | |-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| | 5F| 61| | 77 | 13| 78 |*73 | 79 |*74 |*75| 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | `-------' `-----------------------------------------------------------' `-----------' `---------------' */ #define KEYMAP( \ K61,K62, K63,K64,K65,K66,K67, K68,K69,K6A,K6B,K6C, K5A,K5B,K5C, K5D,K52,K53,K54, \ K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E,K0F, K36,K5E,K37, K3F,K40,K41,K42, \ K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B,K1C, K1D, K38,K39,K3A, K43,K44,K45,K46, \ K71,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29, K3C, K47,K48,K49,K4A, \ K70,K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34, K3B,K3E,K3D, K4B,K4C,K4D,K4E, \ K5F,K55,K56, K35, K57,K58,K59,K60, K72, K73, K4F,K50,K51 \ K76, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ ) { \ { KC_NO, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F }, \ { KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_NO, }, \ { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ { KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F }, \ @@ { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ 60,21 58,39 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37 }, \ { KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K3C, KC_##K3D, KC_##K3E, KC_##K3F }, \ { KC_##K40, KC_##K41, KC_##K42, KC_##K43, KC_##K44, KC_##K45, KC_##K46, KC_##K47 }, \ { KC_##K48, KC_##K49, KC_##K4A, KC_##K4B, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ { KC_##K48, KC_##K49, KC_##K4A, KC_NO, KC_##K4C, KC_##K4D, KC_##K4E, KC_##K4F }, \ { KC_##K50, KC_##K51, KC_##K52, KC_##K53, KC_##K54, KC_##K55, KC_##K56, KC_##K57 }, \ { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_##K5C, KC_##K5D, KC_##K5E, KC_##K5F }, \ { KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67 }, \ { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_NO, KC_NO, KC_NO }, \ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_NO, KC_NO, KC_NO, KC_NO, }, \ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ { KC_##K68, KC_##K69, KC_##K6A, KC_##K6B, KC_##K6C, KC_##K6D, KC_##K6E, KC_NO }, \ { KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74, KC_##K75, KC_##K76, KC_##K77 }, \ { KC_##K78, KC_##K79, KC_##K7A, KC_##K7B, KC_NO, KC_##K7D, KC_NO, KC_NO } \ } /* CTCSP SHORT TYPE KEYBOARD */ #define SHORT_TYPE( \ K01, K05,K06,K08,K0A,K0C,K0E, K61,K49,K33, K30, K2C,K34,K60, \ K10,K11,K12,K07,K09,K0B, K42,K4A,K7B, \ K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, \ K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, \ K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, \ K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K0D,K14,K6E, \ K77,K13, K78, K79, K7A,K43,K62,K18,K1B,K1C \ ) KEYMAP( \ HELP, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, \ K01, AGAIN, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C, K34, K60, K62, PSLS,PAST,PMNS, \ MENU, UNDO, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42, K4A, K7B, P7, P8, P9, PPLS, \ SELECT, COPY, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, P4, P5, P6, \ EXECUTE,PASTE, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, P1, P2, P3, PENT, \ FIND, CUT, K77,K13, K78, HENK, K79, MHEN, KANA, K7A,K43,K0D, K18, K1B, K1C, P0, PDOT \ ) // Assign Fn key(0-7) to a layer to which switch with the Fn key pressed. static const uint8_t PROGMEM fn_layer[] = { 0, // Fn0 0, // Fn1 0, // Fn2 2, // Fn0 3, // Fn1 4, // Fn2 0, // Fn3 0, // Fn4 @@ 0, // Fn5 86,8 102,8 @@ static const uint8_t PROGMEM fn_layer[] = { // See layer.c for details. static const uint8_t PROGMEM fn_keycode[] = { KC_NO, // Fn0 KC_NO, // Fn1 KC_NO, // Fn2 KC_SCLN, // Fn1 KC_SLSH, // Fn2 KC_NO, // Fn3 KC_NO, // Fn4 @@ KC_NO, // Fn5 97,29 113,65 @@ static const uint8_t PROGMEM fn_keycode[] = { static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* X68000 Keyboard Scan codes ,---. ,---. ,-------------------, ,-------------------. ,-----------. ,---------------. | 61| | 62| | 63| 64| 65| 66| 67| | 68| 69| 6A| 6B| 6C| | 5A| 5B| 5C| | 5D| 52| 53| 54| `---' `---' `-------------------' `-------------------' `-----------' `---------------' ,-----------------------------------------------------------. ,-----------. ,---------------. | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| 0F| | 36| 5E| 37| | 3F| 40| 41| 42| |-----------------------------------------------------------| |------------ |---------------| | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| | | 38| 39| 3A| | 43| 44| 45| 46| |------------------------------------------------------. 1D | `---=====---' |---------------| | 71 | 1E| 1F| 20| 21| 2l| 23| 24| 25| 26| 27| 28| 29| | ___| 3C|___ | 47| 48| 49| 4A| |-----------------------------------------------------------| | 3B|---| 3D| |-----------|---| | 70 | 2A| 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 70 | `---| 3E|---' | 4B| 4C| 4D| | `-----------------------------------------------------------| .---=====---. |-----------| 4E| | 5F| 55 | 56 | 35 | 57 | 58 | 59 | 60| | 72 | 73 | | 4F| 50| 51| | `---------------------------------------------' `-----------' `---------------' */ /* KEYMAP( NO, NO, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, PSCR,SLCK,PAUS, CAPS,NO, NO, NO, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,ENT, UP, P4, P5, P6, PEQL, LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH,GRV, LEFT,DOWN,RGHT, P1, P2, P3, PENT, LGUI,LALT,NO, SPC, RALT,RGUI,RCTL,APP, NO, NO, P0, PCMM,PDOT HELP, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10,F11,F12, PSCR,SLCK,PAUS, MUTE,VOLD,VOLU,PWR, STOP, AGAIN, ESC,1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, MENU, UNDO, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, DEL, END, PGDN, P7, P8, P9, PPLS, SELECT, COPY, LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, EXECUTE,PASTE, LSFT, Z, X, C, V, B, N, M, COMM,DOT,SLSH, RSFT, UP, P1, P2, P3, PENT, FIND, CUT, CAPS, LALT, LGUI,HENK, SPC, MHEN,KANA,RGUI,APP, RALT, LEFT,DOWN,RGHT, P0, PDOT ), */ // 0: default SHORT_TYPE( STOP, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, F7,F8,F9,F10,F11,F12, DEL, END, PGDN, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, LCTL, A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, LSFT, Z, X, C, V, B, N, M, COMM,DOT, SLSH, RALT,UP, RSFT, CAPS,LALT,LGUI, SPC, RGUI,APP, NLCK,LEFT,DOWN,RGHT ), // 1: with layer keys SHORT_TYPE( ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, F7,F8,F9,F10,F11,F12, DEL, END, PGDN, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSLS,GRV, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSPC, LCTL, A, S, D, F, G, H, J, K, L, FN1, QUOT, ENT, LSFT, Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,UP, FN0, CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, LEFT,DOWN,RGHT ), // 2: HHKB SHORT_TYPE( ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, F7,F8,F9,F10,F11,F12, DEL, END, PGDN, GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, CAPS, NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,PAUS,UP, NO, BSPC, LCTL, VOLD,VOLU,MUTE,NO, NO, NO, NO, HOME,PGUP,LEFT,RGHT, ENT, LSFT, Z, X, C, V, B, NO, NO, END, PGDN,DOWN, RSFT,PGUP,FN0, CAPS,LALT,LGUI, SPC, RGUI,RALT,FN0, HOME,PGDN,END ), // 3: Mousekey SHORT_TYPE( ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, F7,F8,F9,F10,F11,F12, DEL, END, PGDN, GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, CAPS, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, LCTL, NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN1, NO, ENT, LSFT, NO, NO, NO, NO, BTN3,BTN2,BTN1,NO, NO, NO, RSFT,UP, NO, CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT ), // 4: Cursor SHORT_TYPE( ESC, F1,F2,F3,F4, F5, F6, CUT,PASTE,COPY,PWR, INS, HOME,PGUP, F7,F8,F9,F10,F11,F12, DEL, END, PGDN, GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, CAPS, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, LCTL, NO, NO, NO, NO, NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, LSFT, NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,UP, NO, CAPS,LALT,LGUI, BTN1, RGUI,RALT,NO, LEFT,DOWN,RGHT ), }; @@ 129,12 181,12 @@ uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col) return pgm_read_byte(&keymaps[(layer)][(row)][(col)]); } uint8_t keymap_fn_layer(uint8_t fn_bits) uint8_t keymap_fn_layer(uint8_t index) { return pgm_read_byte(&fn_layer[biton(fn_bits)]); return pgm_read_byte(&fn_layer[index]); } uint8_t keymap_fn_keycode(uint8_t fn_bits) uint8_t keymap_fn_keycode(uint8_t index) { return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); return pgm_read_byte(&fn_keycode[index]); }
M converter/sun_usb/led.c => converter/sun_usb/led.c +0 -1
@@ 16,7 16,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "stdint.h" #include "serial.h" #include "led.h"
M converter/sun_usb/matrix.c => converter/sun_usb/matrix.c +19 -40
@@ 21,9 21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <util/delay.h> #include "print.h" #include "util.h" #include "serial.h" #include "matrix.h" #include "debug.h" #include "protocol/serial.h" @@ /* 41,39 41,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. * E|70 ... 77| * F|78 ... 7F| * +---------+ * * Command From System To Keyboard * 0x01 Reset * 0x02 Bell On * 0x03 Bell Off * 0x0A Click On * 0x0B Click Off * 0x0E LED * 0x0F Layout * * Command From Keyboard To System * 0x7F Idle * 0xFE Layout Response * 0xFF Reset Response(followed by 0x04) * * bit: 3 2 1 0 * LED: CapsLk ScrLk Compose NumLk * * Connector * 8Pin mini DIN * 8 7 6 * 5 4 3 * 2 1 * receptacle * * 1: GND * 2: GND * 3: 5V * 4: RX/TX(Mouse) * 5: RX * 6: TX * 7: GND * 8: 5V */ static uint8_t matrix[MATRIX_ROWS]; @@ #define ROW(code) ((code>>3)&0xF) 113,14 80,26 @@ uint8_t matrix_scan(void) uint8_t code; code = serial_recv(); if (code == 0) { return 0; if (!code) return 0; debug_hex(code); debug(" "); switch (code) { case 0x7E: // reset fail case 0xFE: // layout case 0xFF: // reset success _delay_ms(500); // ignore response byte debug("(response ignored:"); while ((code = serial_recv())) { debug(" "); debug_hex(code); } debug(") "); // FALL THROUGH case 0x7F: // all keys up for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; return 0; } phex(code); print("("); code = ~code; phex(code); print(")"); return 0; if (code&0x80) { // break code if (matrix_is_on(ROW(code), COL(code))) {
R protocol/serial.c => protocol/serial_soft.c +43 -4
@@ 38,12 38,19 @@ POSSIBILITY OF SUCH DAMAGE. #include <stdbool.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "serial.h" /* * Stupid Inefficient Busy-wait Software Serial * is still useful for negative logic signal like Sun protocol not supported by hardware USART. */ #define WAIT_US (1000000/SERIAL_BAUD) void serial_init(void) { SERIAL_RX_INIT(); SERIAL_RXD_INIT(); } @@ // RX ring buffer 64,12 71,44 @@ uint8_t serial_recv(void) return data; } // USART RX complete interrupt ISR(SERIAL_RX_VECT) //ISR(INT2_vect) ISR(SERIAL_RXD_VECT) { SERIAL_RXD_INT_ENTER() uint8_t data = 0; #ifdef SERIAL_BIT_ORDER_MSB uint8_t pos = 0x80; #else uint8_t pos = 0x01; #endif // to center of start bit _delay_us(WAIT_US/2); do { // to center of next bit _delay_us(WAIT_US); if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) { data |= pos; } #ifdef SERIAL_BIT_ORDER_MSB pos >>= 1; #else pos <<= 1; #endif } while (pos); // to center of stop bit _delay_us(WAIT_US); #ifdef SERIAL_NEGATIVE_LOGIC data = ~data; #endif uint8_t next = (rbuf_head + 1) % RBUF_SIZE; if (next != rbuf_tail) { rbuf[rbuf_head] = SERIAL_RX_DATA; rbuf[rbuf_head] = data; rbuf_head = next; } SERIAL_RXD_INT_EXIT(); }
M rules.mk => rules.mk +1 -1
@@ 252,7 252,7 @@ EXTMEMOPTS = # (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12' # LDFLAGS = -Wl,-Map=$(TARGET).map,--cref LDFLAGS += -Wl,--relax #LDFLAGS += -Wl,--relax LDFLAGS += -Wl,--gc-sections LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))