From edce1d19a6af040df994243e7b6b1851e3eccebc Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 21 Oct 2012 22:12:36 +0900 Subject: [PATCH 1/2] Add LED feature to Sun converter --- common/keyboard.c | 7 +++++ converter/sun_usb/config.h | 17 +++++++++++- converter/sun_usb/led.c | 10 ++++++- protocol/serial.h | 1 + protocol/serial_soft.c | 57 +++++++++++++++++++++++++++----------- 5 files changed, 74 insertions(+), 18 deletions(-) diff --git a/common/keyboard.c b/common/keyboard.c index e973c46d..b0e0ed79 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -555,6 +555,7 @@ void keyboard_init(void) void keyboard_task(void) { static matrix_row_t matrix_prev[MATRIX_ROWS]; + static uint8_t led_status = 0; matrix_row_t matrix_row = 0; matrix_row_t matrix_change = 0; @@ -617,6 +618,12 @@ void keyboard_task(void) } } + // update LED + if (led_status != host_keyboard_leds()) { + led_status = host_keyboard_leds(); + keyboard_set_leds(led_status); + } + return; } diff --git a/converter/sun_usb/config.h b/converter/sun_usb/config.h index 66961d93..b4f0ff97 100644 --- a/converter/sun_usb/config.h +++ b/converter/sun_usb/config.h @@ -43,8 +43,8 @@ along with this program. If not, see . * asynchronous, negative logic, 1200baud, no flow control * 1-start bit, 8-data bit, non parity, 1-stop bit */ -#define SERIAL_NEGATIVE_LOGIC #define SERIAL_BAUD 1200 + #define SERIAL_RXD_DDR DDRD #define SERIAL_RXD_PORT PORTD #define SERIAL_RXD_PIN PIND @@ -63,5 +63,20 @@ along with this program. If not, see . /* clear interrupt flag */ \ EIFR = (1<. */ #include "stdint.h" +#include "serial.h" #include "led.h" void led_set(uint8_t usb_led) { - // not supported now + uint8_t sun_led = 0; + if (usb_led & (1<>= 1; +#else + mask <<= 1; +#endif + } + + /* stop bit */ + SERIAL_TXD_ON(); + _delay_us(WAIT_US); +} + +/* detect edge of start bit */ ISR(SERIAL_RXD_VECT) { SERIAL_RXD_INT_ENTER() uint8_t data = 0; #ifdef SERIAL_BIT_ORDER_MSB - uint8_t pos = 0x80; + uint8_t mask = 0x80; #else - uint8_t pos = 0x01; + uint8_t mask = 0x01; #endif - // to center of start bit + /* to center of start bit */ _delay_us(WAIT_US/2); do { - // to center of next bit + /* to center of next bit */ _delay_us(WAIT_US); - if (SERIAL_RXD_PIN&(1<>= 1; + mask >>= 1; #else - pos <<= 1; + mask <<= 1; #endif - } while (pos); - // to center of stop bit + } while (mask); + /* 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] = data; From f291c2279eb9f656ed2a2e3152bab155470c4ef9 Mon Sep 17 00:00:00 2001 From: tmk Date: Sun, 21 Oct 2012 22:36:44 +0900 Subject: [PATCH 2/2] Add extra commands Bell/Click to Sun converter --- converter/sun_usb/Makefile | 1 + converter/sun_usb/command_extra.c | 43 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 converter/sun_usb/command_extra.c diff --git a/converter/sun_usb/Makefile b/converter/sun_usb/Makefile index 4c79a8d2..c6e8390c 100644 --- a/converter/sun_usb/Makefile +++ b/converter/sun_usb/Makefile @@ -11,6 +11,7 @@ TARGET_DIR = . SRC = keymap.c \ matrix.c \ led.c \ + command_extra.c \ protocol/serial_soft.c CONFIG_H = config.h diff --git a/converter/sun_usb/command_extra.c b/converter/sun_usb/command_extra.c new file mode 100644 index 00000000..50389467 --- /dev/null +++ b/converter/sun_usb/command_extra.c @@ -0,0 +1,43 @@ +#include "stdbool.h" +#include "stdint.h" +#include "keycode.h" +#include "serial.h" +#include "print.h" +#include "command.h" + +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"); + return false; + 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); + break; + case KC_NUMLOCK: + print("layout\n"); + serial_send(0x0F); + break; + default: + return false; + } + return true; +}