diff --git a/converter/sun_usb/Makefile b/converter/sun_usb/Makefile
index f046bfdd..12eceb5e 100644
--- a/converter/sun_usb/Makefile
+++ b/converter/sun_usb/Makefile
@@ -11,8 +11,8 @@ TARGET_DIR = .
SRC = keymap.c \
matrix.c \
led.c \
- command_extra.c \
- protocol/serial_soft.c
+ command_extra.c
+
CONFIG_H = config.h
@@ -64,8 +64,15 @@ 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
+#HARDWARE_SERIAL = yes # Use hardware serial (requires inverted serial, see README)
#NKRO_ENABLE = yes # USB Nkey Rollover
+ifdef HARDWARE_SERIAL
+ SRC := protocol/serial_uart.c $(SRC)
+ OPT_DEFS += -DHARDWARE_SERIAL
+else
+ SRC := protocol/serial_soft.c $(SRC)
+endif
# Boot Section Size in bytes
# Teensy halfKay 512
diff --git a/converter/sun_usb/README b/converter/sun_usb/README
index 98340dd3..405a86ba 100644
--- a/converter/sun_usb/README
+++ b/converter/sun_usb/README
@@ -48,7 +48,9 @@ Frame format: 1-Start bit, 8-Data bits, No-Parity, 1-Stop bit
To use AVR UART engine you need external 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.
+This converter uses software method by default, so you don't need any inverter part. But
+it can also be built with 'make HARDWARE_SERIAL=y' to enable hardware serial if there
+is an inverter present. Good results have been obtained using a 74LS04 and hardware serial.
Commands From System To Keyboard
diff --git a/converter/sun_usb/command_extra.c b/converter/sun_usb/command_extra.c
index aba3fe6d..08f3a710 100644
--- a/converter/sun_usb/command_extra.c
+++ b/converter/sun_usb/command_extra.c
@@ -5,41 +5,47 @@
#include "print.h"
#include "command.h"
+bool sun_bell = false;
+bool sun_click = false;
+
+
bool command_extra(uint8_t code)
{
switch (code) {
case KC_H:
case KC_SLASH: /* ? */
print("\n\n----- Sun converter Help -----\n");
- print("Up: Bell On\n");
- print("Down: Bell Off\n");
- print("Left: Click On\n");
- print("Right: Click Off\n");
- print("PgUp: LED all On\n");
- print("PgDown: LED all On\n");
- print("Insert: Layout\n");
- print("Delete: Reset\n");
+ print("Home: Toggle Bell\n");
+ print("End: Toggle Click\n");
+ print("PgUp: LED all On\n");
+ print("PgDown: LED all On\n");
+ print("Insert: Layout\n");
+ print("Delete: Reset\n");
return false;
case KC_DEL:
print("Reset\n");
serial_send(0x01);
break;
- case KC_UP:
- print("Bell On\n");
- serial_send(0x02);
- break;
- case KC_DOWN:
- print("Bell Off\n");
- serial_send(0x03);
- break;
- case KC_LEFT:
- print("Click On\n");
- serial_send(0x0A);
- break;
- case KC_RIGHT:
- print("Click Off\n");
- serial_send(0x0B);
+ case KC_HOME:
+ sun_bell = !sun_bell;
+ if (sun_bell) {
+ print("Bell On\n");
+ serial_send(0x02);
+ } else {
+ print("Bell Off\n");
+ serial_send(0x03);
+ }
break;
+ case KC_END:
+ sun_click = !sun_click;
+ if (sun_click) {
+ print("Click On\n");
+ serial_send(0x0A);
+ } else {
+ print("Click Off\n");
+ serial_send(0x0B);
+ }
+ break;
case KC_PGUP:
print("LED all on\n");
serial_send(0x0E);
@@ -55,6 +61,7 @@ bool command_extra(uint8_t code)
serial_send(0x0F);
break;
default:
+ xprintf("Unknown extra command: %02X\n", code);
return false;
}
return true;
diff --git a/converter/sun_usb/config.h b/converter/sun_usb/config.h
index 66036da9..414fd563 100644
--- a/converter/sun_usb/config.h
+++ b/converter/sun_usb/config.h
@@ -39,57 +39,88 @@ along with this program. If not, see .
/* legacy keymap support */
#define USE_LEGACY_KEYMAP
-
-/* Serial(USART) configuration
- * asynchronous, negative logic, 1200baud, no flow control
- * 1-start bit, 8-data bit, non parity, 1-stop bit
+/* HARDWARE_SERAIL assumes that a logic inverter (7404) is placed
+ * in front of RX/TX to produce the positive logic the MCU expects.
+ * The default is Software Serial.
*/
-#define SERIAL_SOFT_BAUD 1200
-#define SERIAL_SOFT_PARITY_NONE
-#define SERIAL_SOFT_BIT_ORDER_LSB
-#define SERIAL_SOFT_LOGIC_NEGATIVE
-/* RXD Port */
-#define SERIAL_SOFT_RXD_ENABLE
-#define SERIAL_SOFT_RXD_DDR DDRD
-#define SERIAL_SOFT_RXD_PORT PORTD
-#define SERIAL_SOFT_RXD_PIN PIND
-#define SERIAL_SOFT_RXD_BIT 2
-#define SERIAL_SOFT_RXD_VECT INT2_vect
-/* RXD Interupt */
-#ifdef SERIAL_SOFT_LOGIC_NEGATIVE
-/* enable interrupt: INT2(rising edge) */
-#define INTR_TRIG_EDGE ((1<>8); /* baud rate */ \
+ UCSR1B = (1<