From effdef418747406b81e3b4545fa3e911d0931d2f Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 19 Aug 2018 08:39:41 +0900 Subject: [PATCH 1/4] pc98_usb: Fix pin configuration in README --- converter/pc98_usb/Makefile | 3 +++ converter/pc98_usb/README | 5 ++++- converter/pc98_usb/config.h | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/converter/pc98_usb/Makefile b/converter/pc98_usb/Makefile index b8438d2d..24606d69 100644 --- a/converter/pc98_usb/Makefile +++ b/converter/pc98_usb/Makefile @@ -8,6 +8,9 @@ TMK_DIR = ../../tmk_core TARGET_DIR = . # keyboard dependent files +# Add one of lines below to select serial protocol implementation +# protocol/serial_uart.c +# protocol/serial_soft.c SRC = matrix.c \ protocol/serial_uart.c diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README index 0914f229..6da54178 100644 --- a/converter/pc98_usb/README +++ b/converter/pc98_usb/README @@ -25,7 +25,7 @@ Wiring: You can change this with editing config.h. 2 GND GND 3 ~RDY PD4 4 RXD PD2 - 5 ~RTY PD5 + 5 ~RTY PD1 6 NC 7 NC 8 5V VCC @@ -140,6 +140,9 @@ Its scan code map is very different from standard types. This is not tested. Other PC98 converter projects and resource ------------------------------------------ +PC-9800シリーズ テクニカルデータブック HARDWARE 編 1993年 p139, p343 +https://archive.org/stream/PC9800TechnicalDataBookHARDWARE1993/PC-9800TechnicalDataBook_HARDWARE1993#page/n355 + PC98 to USB http://davy.nyacom.net/kbd98usb/ diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h index 9341708f..c6315d00 100644 --- a/converter/pc98_usb/config.h +++ b/converter/pc98_usb/config.h @@ -64,8 +64,10 @@ along with this program. If not, see . * asynchronous, positive logic, 19200baud, bit order: LSB first * 1-start bit, 8-data bit, odd parity, 1-stop bit */ + /* * Software Serial + * Add protocol/serial_soft.c to SRC in Makefile */ #define SERIAL_SOFT_BAUD 19200 #define SERIAL_SOFT_PARITY_ODD @@ -110,6 +112,7 @@ along with this program. If not, see . /* * Hardware Serial(UART) + * Add protocol/serial_uart.c to SRC in Makefile */ #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U2__) #define SERIAL_UART_BAUD 19200 From f57b7b9087fbded607883a372a3acbb811a622da Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 8 Sep 2018 09:34:50 +0900 Subject: [PATCH 2/4] pc98_usb: Add ATMega32u4 support --- converter/pc98_usb/Makefile | 34 +++++++++++++++------------------- converter/pc98_usb/README | 8 +++++++- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/converter/pc98_usb/Makefile b/converter/pc98_usb/Makefile index 24606d69..a3cf2a29 100644 --- a/converter/pc98_usb/Makefile +++ b/converter/pc98_usb/Makefile @@ -1,29 +1,25 @@ # Target file name (without extension). -TARGET = pc98_usb +TARGET ?= pc98_usb # Directory common source filess exist -TMK_DIR = ../../tmk_core +TMK_DIR ?= ../../tmk_core # Directory keyboard dependent files exist -TARGET_DIR = . +TARGET_DIR ?= . # keyboard dependent files # Add one of lines below to select serial protocol implementation # protocol/serial_uart.c # protocol/serial_soft.c -SRC = matrix.c \ +SRC ?= matrix.c \ protocol/serial_uart.c -CONFIG_H = config.h +CONFIG_H ?= config.h # MCU name, you MUST set this to match the board you are using # type "make clean" after changing this, so all files will be rebuilt -#MCU = at90usb162 # Teensy 1.0 -#MCU = atmega32u4 # Teensy 2.0 -#MCU = at90usb646 # Teensy++ 1.0 -#MCU = at90usb1286 # Teensy++ 2.0 -MCU = atmega32u2 # TMK Converter +MCU ?= atmega32u2 # TMK Converter # Processor frequency. @@ -31,14 +27,14 @@ MCU = atmega32u2 # TMK Converter # so your program will run at the correct speed. You should also set this # variable to same clock speed. The _delay_ms() macro uses this, and many # examples use this variable to calculate timings. Do not add a "UL" here. -F_CPU = 16000000 +F_CPU ?= 16000000 # # LUFA specific # # Target architecture (see library "Board Types" documentation). -ARCH = AVR8 +ARCH ?= AVR8 # Input clock frequency. # This will define a symbol, F_USB, in all source code files equal to the @@ -51,7 +47,7 @@ ARCH = AVR8 # # 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) +F_USB ?= $(F_CPU) # Interrupt driven control endpoint task OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -60,12 +56,12 @@ 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 -CONSOLE_ENABLE = yes # Console for debug -COMMAND_ENABLE = yes # Commands for debug and configuration -#NKRO_ENABLE = yes # USB Nkey Rollover -UNIMAP_ENABLE = yes +MOUSEKEY_ENABLE ?= yes # Mouse keys +EXTRAKEY_ENABLE ?= yes # Audio control and System control +CONSOLE_ENABLE ?= yes # Console for debug +COMMAND_ENABLE ?= yes # Commands for debug and configuration +#NKRO_ENABLE ?= yes # USB Nkey Rollover +UNIMAP_ENABLE ?= yes # Boot Section Size in bytes diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README index 6da54178..24200d83 100644 --- a/converter/pc98_usb/README +++ b/converter/pc98_usb/README @@ -42,7 +42,7 @@ Frame format: 1-Start bit(Lo), 8-Data bits, Odd-Parity, 1-Stop bit Build Firmware -------------- -Just use 'make' to bild firmware +Just use 'make' to bild firmware for TMK PC98 converter. $ make clean $ make @@ -53,6 +53,12 @@ To flash firmware then push button on converter to flash firmware. +If you are using ATMega32u4 based board instead of premade TMK PC98 converter(ATMega32u2) use following commands. + + $ make -f Makefile.32u4 clean + $ make -f Makefile.32u4 + $ make -f Makefile.32u4 dfu + PC98 Scan Codes From cb1f4284881096cf467cb93ce9775c7c39805743 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 8 Sep 2018 09:35:24 +0900 Subject: [PATCH 3/4] pc98_usb: Remove keymap.c of rakuraku support --- converter/pc98_usb/keymap.c | 115 ------------------------------------ 1 file changed, 115 deletions(-) delete mode 100644 converter/pc98_usb/keymap.c diff --git a/converter/pc98_usb/keymap.c b/converter/pc98_usb/keymap.c deleted file mode 100644 index 34fe8422..00000000 --- a/converter/pc98_usb/keymap.c +++ /dev/null @@ -1,115 +0,0 @@ -/* -Copyright 2012 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include -#include "keycode.h" -#include "action.h" -#include "action_macro.h" -#include "util.h" -#include "keymap.h" - - - - -/* PC-9801-98-S02 Raku Raku keyboard(Luckyboard) Normal Mode - ,---------------------------------------------------------------. - | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| - `---------------------------------------------------------------' - ,---------------------------------------------------------------. - | 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E| - |---------------------------------------------------------------| - | 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C| - |---------------------------------------------------------'. | - | 74| 20| 21| 22| 23| 24| 3B | 3C | 25| 26| 27| 28| 29| | - |---------------------------------------------------------------| - | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70| - `---------------------------------------------------------------' - | 73| 51| 5B| 59| 34| 5A| 35| xx| - `-----------------------------------------------' - xx: 74 35 F4 B5 -*/ -#define KEYMAP( \ - K60, K61, K62, K63, K64, K65, K66, K67, K68, K69, K6A, K6B, K36, K37, K3F, K3E, \ - K00, K01, K02, K03, K04, K05, K58, K71, K06, K07, K08, K09, K0A, K0E, \ - K0F, K10, K11, K12, K13, K14, K3A, K15, K16, K17, K18, K19, K1C, \ - K74, K20, K21, K22, K23, K24, K3B, K3C, K25, K26, K27, K28, K29, \ - K70,K2A, K2B, K2C, K2D, K2E, K38, K3D, K39, K2F, K30, K31, K32, K33, \ - K73, K51, K5B, K59, K34, K5A, K35 \ -) { \ - { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07 }, \ - { KC_##K08, KC_##K09, KC_##K0A, KC_NO, KC_NO, KC_NO, KC_##K0E, KC_##K0F }, \ - { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17 }, \ - { KC_##K18, KC_##K19, KC_NO, KC_NO, KC_##K1C, KC_NO, KC_NO, KC_NO }, \ - { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27 }, \ - { KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F }, \ - { 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_NO, 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_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K58, KC_##K59, KC_##K5A, KC_##K5B, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { 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_NO, KC_NO, KC_NO, KC_NO }, \ - { KC_##K70, KC_##K71, KC_NO, KC_##K73, KC_##K74, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ -} - - - -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* - ,---------------------------------------------------------------. - | 60| 61| 62| 63| 64| 65| 66| 67| 68| 69| 6A| 6B| 36| 37| 3F| 3E| - `---------------------------------------------------------------' - ,---------------------------------------------------------------. - | 00| 01| 02| 03| 04| 05| 58| 71| 06| 07| 08| 09| 0A| 0E| - |---------------------------------------------------------------| - | 0F| 10| 11| 12| 13| 14| 3A | 15| 16| 17| 18| 19| 1C| - |---------------------------------------------------------------| - | 74| 20| 21| 22| 23| 24| MINS| EQL| 25| 26| 27| 28| 29| | - |---------------------------------------------------------------| - | 70| 2A| 2B| 2C| 2D| 2E| 38| 3D | 39| 2F| 30| 31| 32| 33| 70| - `---------------------------------------------------------------' - | 73| 51| 5B| 59| 34| 5A| 35| xx| - `-----------------------------------------------' - */ - KEYMAP( - STOP,PSCR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, F13, F14, - ESC, 1, 2, 3, 4, 5, LNUM,LCAP, 6, 7, 8, 9, 0, BSPC, - TAB, Q, W, E, R, T, UP, Y, U, I, O, P, ENT, - LCTL, A, S, D, F, G, LEFT, RGHT, H, J, K, L,SCLN, - LSFT, Z, X, C, V, B, INS, DOWN, DEL, N, M,COMM, DOT,SLSH, - LGUI, LALT, LCTL, FN0, SPC, FN0, RALT - ), - KEYMAP( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SLCK,PAUS, - GRV, TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,MINS, EQL, BSLS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,LBRC,RBRC, TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS, HOME, END, TRNS,TRNS,TRNS,TRNS,QUOT, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, PGDN, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS - ), -}; - - -/* - * Fn actions - */ -const action_t PROGMEM fn_actions[] = { - ACTION_LAYER_MOMENTARY(1), // FN0 -}; From 5d24932e78cf210ec0ce03f632cd792c30d3cc21 Mon Sep 17 00:00:00 2001 From: tmk Date: Sat, 8 Sep 2018 21:23:30 +0900 Subject: [PATCH 4/4] pc98_usb: Update reset and LED control command --- converter/pc98_usb/README | 23 +++++++++++ converter/pc98_usb/config.h | 2 +- converter/pc98_usb/matrix.c | 77 +++++++++++++++++++++---------------- 3 files changed, 68 insertions(+), 34 deletions(-) diff --git a/converter/pc98_usb/README b/converter/pc98_usb/README index 24200d83..4d0d0bfe 100644 --- a/converter/pc98_usb/README +++ b/converter/pc98_usb/README @@ -147,6 +147,7 @@ Its scan code map is very different from standard types. This is not tested. Other PC98 converter projects and resource ------------------------------------------ PC-9800シリーズ テクニカルデータブック HARDWARE 編 1993年 p139, p343 +https://archive.org/stream/PC9800TechnicalDataBookHARDWARE1993/PC-9800TechnicalDataBook_HARDWARE1993#page/n151 https://archive.org/stream/PC9800TechnicalDataBookHARDWARE1993/PC-9800TechnicalDataBook_HARDWARE1993#page/n355 PC98 to USB @@ -158,3 +159,25 @@ http://www.tsp.ne.jp/~sawada/mago/src/gka98at.asm scan code: http://ixsvr.dyndns.org/usb2pc98 + + + +NOTES +----- +### Tested on +- PC-9801V +- DIGITAL WAVE Dboard + + +### RDY +Current firmware does not control RDY line and it is drived as low to receive data always. While sending command firmware drive the line high. + +PC98 host keeps RDY line high to prevent keyboard from sending data while processing. + +https://archive.org/stream/PC9800TechnicalDataBookHARDWARE1993/PC-9800TechnicalDataBook_HARDWARE1993#page/n359 + +### Inhibit key repeating +The command(9Ch, 70h) works with Raku Raku keybaord but not with Dboard. + +### LED indicater +Dboard has LEDs but it seems to ignore LED control command. diff --git a/converter/pc98_usb/config.h b/converter/pc98_usb/config.h index c6315d00..c74b434b 100644 --- a/converter/pc98_usb/config.h +++ b/converter/pc98_usb/config.h @@ -43,7 +43,7 @@ along with this program. If not, see . #define LOCKING_RESYNC_ENABLE /* Control LED indicatiors, which doesn't work well with locking support */ -//#define PC98_LED_CONTROL +#define PC98_LED_CONTROL /* PC98 Reset Port shared with TXD */ diff --git a/converter/pc98_usb/matrix.c b/converter/pc98_usb/matrix.c index 54bb3041..39afb43c 100644 --- a/converter/pc98_usb/matrix.c +++ b/converter/pc98_usb/matrix.c @@ -68,23 +68,34 @@ static int16_t pc98_wait_response(void) static void pc98_inhibit_repeat(void) { uint16_t code; - - // clear recv buffer - while (serial_recv()) ; RETRY: - _delay_ms(100); pc98_send(0x9C); code = pc98_wait_response(); if (code != -1) xprintf("PC98: send 9C: %02X\n", code); if (code != 0xFA) goto RETRY; - _delay_ms(100); pc98_send(0x70); code = pc98_wait_response(); if (code != -1) xprintf("PC98: send 70: %02X\n", code); if (code != 0xFA) goto RETRY; } +static uint8_t pc98_led = 0; +static void pc98_led_set(void) +{ + uint16_t code; +RETRY: + pc98_send(0x9D); + code = pc98_wait_response(); + if (code != -1) xprintf("PC98: send 9D: %02X\n", code); + if (code != 0xFA) goto RETRY; + + pc98_send(pc98_led); + code = pc98_wait_response(); + if (code != -1) xprintf("PC98: send %02X: %02X\n", pc98_led, code); + if (code != 0xFA) goto RETRY; +} + void matrix_init(void) { debug_keyboard = true; @@ -99,36 +110,40 @@ void matrix_init(void) serial_init(); // PC98 reset -/* - PC98_RST_PORT &= ~(1< 13us + PC98_RST_PORT |= (1<