void keyboard_task(void) | void keyboard_task(void) | ||||
{ | { | ||||
static matrix_row_t matrix_prev[MATRIX_ROWS]; | static matrix_row_t matrix_prev[MATRIX_ROWS]; | ||||
static uint8_t led_status = 0; | |||||
matrix_row_t matrix_row = 0; | matrix_row_t matrix_row = 0; | ||||
matrix_row_t matrix_change = 0; | matrix_row_t matrix_change = 0; | ||||
} | } | ||||
} | } | ||||
// update LED | |||||
if (led_status != host_keyboard_leds()) { | |||||
led_status = host_keyboard_leds(); | |||||
keyboard_set_leds(led_status); | |||||
} | |||||
return; | return; | ||||
} | } | ||||
SRC = keymap.c \ | SRC = keymap.c \ | ||||
matrix.c \ | matrix.c \ | ||||
led.c \ | led.c \ | ||||
command_extra.c \ | |||||
protocol/serial_soft.c | protocol/serial_soft.c | ||||
CONFIG_H = config.h | CONFIG_H = config.h |
#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; | |||||
} |
* asynchronous, negative logic, 1200baud, no flow control | * asynchronous, negative logic, 1200baud, no flow control | ||||
* 1-start bit, 8-data bit, non parity, 1-stop bit | * 1-start bit, 8-data bit, non parity, 1-stop bit | ||||
*/ | */ | ||||
#define SERIAL_NEGATIVE_LOGIC | |||||
#define SERIAL_BAUD 1200 | #define SERIAL_BAUD 1200 | ||||
#define SERIAL_RXD_DDR DDRD | #define SERIAL_RXD_DDR DDRD | ||||
#define SERIAL_RXD_PORT PORTD | #define SERIAL_RXD_PORT PORTD | ||||
#define SERIAL_RXD_PIN PIND | #define SERIAL_RXD_PIN PIND | ||||
/* clear interrupt flag */ \ | /* clear interrupt flag */ \ | ||||
EIFR = (1<<INTF2); \ | EIFR = (1<<INTF2); \ | ||||
} while (0) | } while (0) | ||||
#define SERIAL_RXD_READ() (~SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) | |||||
#define SERIAL_TXD_DDR DDRD | |||||
#define SERIAL_TXD_PORT PORTD | |||||
#define SERIAL_TXD_PIN PIND | |||||
#define SERIAL_TXD_BIT 3 | |||||
/* negative logic */ | |||||
#define SERIAL_TXD_ON() do { SERIAL_TXD_PORT &= ~(1<<SERIAL_TXD_BIT); } while (0) | |||||
#define SERIAL_TXD_OFF() do { SERIAL_TXD_PORT |= (1<<SERIAL_TXD_BIT); } while (0) | |||||
#define SERIAL_TXD_INIT() do { \ | |||||
/* pin configuration: output */ \ | |||||
SERIAL_TXD_DDR |= (1<<SERIAL_TXD_BIT); \ | |||||
/* idle */ \ | |||||
SERIAL_TXD_ON(); \ | |||||
} while (0) | |||||
#endif | #endif |
*/ | */ | ||||
#include "stdint.h" | #include "stdint.h" | ||||
#include "serial.h" | |||||
#include "led.h" | #include "led.h" | ||||
void led_set(uint8_t usb_led) | void led_set(uint8_t usb_led) | ||||
{ | { | ||||
// not supported now | |||||
uint8_t sun_led = 0; | |||||
if (usb_led & (1<<USB_LED_NUM_LOCK)) sun_led |= (1<<0); | |||||
if (usb_led & (1<<USB_LED_COMPOSE)) sun_led |= (1<<1); | |||||
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) sun_led |= (1<<2); | |||||
if (usb_led & (1<<USB_LED_CAPS_LOCK)) sun_led |= (1<<3); | |||||
serial_send(0x0E); | |||||
serial_send(sun_led); | |||||
} | } |
/* host role */ | /* host role */ | ||||
void serial_init(void); | void serial_init(void); | ||||
uint8_t serial_recv(void); | uint8_t serial_recv(void); | ||||
void serial_send(uint8_t data); | |||||
#endif | #endif |
void serial_init(void) | void serial_init(void) | ||||
{ | { | ||||
SERIAL_RXD_INIT(); | SERIAL_RXD_INIT(); | ||||
SERIAL_TXD_INIT(); | |||||
} | } | ||||
// RX ring buffer | |||||
/* RX ring buffer */ | |||||
#define RBUF_SIZE 8 | #define RBUF_SIZE 8 | ||||
static uint8_t rbuf[RBUF_SIZE]; | static uint8_t rbuf[RBUF_SIZE]; | ||||
static uint8_t rbuf_head = 0; | static uint8_t rbuf_head = 0; | ||||
return data; | return data; | ||||
} | } | ||||
//ISR(INT2_vect) | |||||
void serial_send(uint8_t data) | |||||
{ | |||||
/* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ | |||||
/* start bit */ | |||||
SERIAL_TXD_OFF(); | |||||
_delay_us(WAIT_US); | |||||
#ifdef SERIAL_BIT_ORDER_MSB | |||||
uint8_t mask = 0x80; | |||||
#else | |||||
uint8_t mask = 0x01; | |||||
#endif | |||||
while (mask) { | |||||
if (data&mask) { SERIAL_TXD_ON(); } else { SERIAL_TXD_OFF(); } | |||||
_delay_us(WAIT_US); | |||||
#ifdef SERIAL_BIT_ORDER_MSB | |||||
mask >>= 1; | |||||
#else | |||||
mask <<= 1; | |||||
#endif | |||||
} | |||||
/* stop bit */ | |||||
SERIAL_TXD_ON(); | |||||
_delay_us(WAIT_US); | |||||
} | |||||
/* detect edge of start bit */ | |||||
ISR(SERIAL_RXD_VECT) | ISR(SERIAL_RXD_VECT) | ||||
{ | { | ||||
SERIAL_RXD_INT_ENTER() | SERIAL_RXD_INT_ENTER() | ||||
uint8_t data = 0; | uint8_t data = 0; | ||||
#ifdef SERIAL_BIT_ORDER_MSB | #ifdef SERIAL_BIT_ORDER_MSB | ||||
uint8_t pos = 0x80; | |||||
uint8_t mask = 0x80; | |||||
#else | #else | ||||
uint8_t pos = 0x01; | |||||
uint8_t mask = 0x01; | |||||
#endif | #endif | ||||
// to center of start bit | |||||
/* to center of start bit */ | |||||
_delay_us(WAIT_US/2); | _delay_us(WAIT_US/2); | ||||
do { | do { | ||||
// to center of next bit | |||||
/* to center of next bit */ | |||||
_delay_us(WAIT_US); | _delay_us(WAIT_US); | ||||
if (SERIAL_RXD_PIN&(1<<SERIAL_RXD_BIT)) { | |||||
data |= pos; | |||||
if (SERIAL_RXD_READ()) { | |||||
data |= mask; | |||||
} | } | ||||
#ifdef SERIAL_BIT_ORDER_MSB | #ifdef SERIAL_BIT_ORDER_MSB | ||||
pos >>= 1; | |||||
mask >>= 1; | |||||
#else | #else | ||||
pos <<= 1; | |||||
mask <<= 1; | |||||
#endif | #endif | ||||
} while (pos); | |||||
// to center of stop bit | |||||
} while (mask); | |||||
/* to center of stop bit */ | |||||
_delay_us(WAIT_US); | _delay_us(WAIT_US); | ||||
#ifdef SERIAL_NEGATIVE_LOGIC | |||||
data = ~data; | |||||
#endif | |||||
uint8_t next = (rbuf_head + 1) % RBUF_SIZE; | uint8_t next = (rbuf_head + 1) % RBUF_SIZE; | ||||
if (next != rbuf_tail) { | if (next != rbuf_tail) { | ||||
rbuf[rbuf_head] = data; | rbuf[rbuf_head] = data; |