1
0

Add hardware serial support for sun_usb converter

Tested with a Sun Type 5c keyboard and a 7404 inverter.
This commit is contained in:
John Hickey 2016-05-09 22:56:33 -07:00
parent e9a54995bd
commit d3332d32da
3 changed files with 95 additions and 55 deletions

View File

@ -11,8 +11,8 @@ TARGET_DIR = .
SRC = keymap.c \ SRC = keymap.c \
matrix.c \ matrix.c \
led.c \ led.c \
command_extra.c \ command_extra.c
protocol/serial_soft.c
CONFIG_H = config.h CONFIG_H = config.h
@ -64,8 +64,15 @@ MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration 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 #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 # Boot Section Size in bytes
# Teensy halfKay 512 # Teensy halfKay 512

View File

@ -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. 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. 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 Commands From System To Keyboard

View File

@ -39,8 +39,38 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* legacy keymap support */ /* legacy keymap support */
#define USE_LEGACY_KEYMAP #define USE_LEGACY_KEYMAP
/* 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.
*/
#if defined(HARDWARE_SERIAL)
/* Serial(USART) configuration /* Hardware Serial (USART) configuration
* asynchronous, negative logic, 1200baud, no flow control
* 1-start bit, 8-data bit, non parity, 1-stop bit
*
*/
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega32U2__)
#define SERIAL_UART_BAUD 1200
#define SERIAL_UART_DATA UDR1
#define SERIAL_UART_UBRR ((F_CPU/(16UL*SERIAL_UART_BAUD))-1)
#define SERIAL_UART_RXD_VECT USART1_RX_vect
#define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
#define SERIAL_UART_INIT() do { \
UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
UBRR1H = (uint8_t) (SERIAL_UART_UBRR>>8); /* baud rate */ \
UCSR1B = (1<<RXCIE1) | (1<<RXEN1) | /* RX: interrupt, RX: enable */ \
(1<<TXEN1); /* TX: enable */ \
UCSR1C = (0<<UPM11) | (0<<UPM10) | /* parity: none(00), even(01), odd(11) */ \
(0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* data-8bit(011) */ \
sei(); \
} while(0)
#else
# error "USART configuration is needed."
#endif
#else
/* Software Serial configuration
* 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
*/ */
@ -92,4 +122,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
SERIAL_SOFT_TXD_ON(); \ SERIAL_SOFT_TXD_ON(); \
} while (0) } while (0)
#endif #endif //hardware serial
#endif //config.h