Răsfoiți Sursa

Add LED support to x68k

tmk 12 ani în urmă
părinte
comite
42c962412b

+ 16 - 4
converter/x68k_usb/Makefile

@@ -16,7 +16,8 @@ TARGET_DIR = .
 SRC =	keymap.c \
 	matrix.c \
 	led.c \
-	x68k.c
+	protocol/x68k.c
+#	protocol/serial_uart.c
 
 CONFIG_H = config_pjrc.h
 
@@ -37,12 +38,23 @@ MCU = atmega32u4       # Teensy 2.0
 F_CPU = 16000000
 
 
+# Boot Section Size in bytes
+#   Teensy halfKay   512
+#   Atmel DFU loader 4096
+#   LUFA bootloader  4096
+OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
 # Build Options
 #   *Comment out* to disable the options.
 #
-MOUSEKEY_ENABLE = yes	# Mouse keys
-EXTRAKEY_ENABLE = yes	# Audio control and System control
-NKRO_ENABLE = yes	# USB Nkey Rollover
+BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes	# Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)
+CONSOLE_ENABLE = yes	# Console for debug(+400)
+COMMAND_ENABLE = yes    # Commands for debug and configuration
+#SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
+#NKRO_ENABLE = yes	# USB Nkey Rollover - not yet supported in LUFA
 
 
 

+ 17 - 6
converter/x68k_usb/config_pjrc.h

@@ -40,11 +40,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 /* legacy keymap support */
 #define USE_LEGACY_KEYMAP
 
-/* mouse keys */
-#ifdef MOUSEKEY_ENABLE
-#   define MOUSEKEY_DELAY_TIME 255
-#endif
-
 
 /* USART configuration
  *     asynchronous, 2400baud, 8-data bit, non parity, 1-stop bit, no flow control
@@ -57,7 +52,23 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #   define KBD_RX_INIT()      do { \
         UBRR1L = (uint8_t) KBD_RX_UBBR; \
         UBRR1H = (uint8_t) (KBD_RX_UBBR>>8); \
-        UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); \
+        UCSR1B |= (1<<RXCIE1) | (1<<RXEN1) | (1<<TXEN1); \
+    } while(0)
+
+
+    #define SERIAL_UART_BAUD       2400
+    #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 = (1<<UPM11) | (1<<UPM10) | /* parity: none(00), even(01), odd(11) */ \
+                 (0<<UCSZ12) | (1<<UCSZ11) | (1<<UCSZ10); /* 8bit-data(011) */ \
+        sei(); \
     } while(0)
 #else
 #   error "USART configuration is needed."

+ 22 - 2
converter/x68k_usb/led.c

@@ -16,11 +16,31 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "stdint.h"
-#include "x68k.h"
+#include "serial.h"
 #include "led.h"
+#include "debug.h"
+#include "x68k.h"
 
 
 void led_set(uint8_t usb_led)
 {
-    // not supported now
+    /* X68000 LED bits 0: on, 1: off
+     * bit 7   1(fixed)
+     * bit 6   全角
+     * bit 5   ひらがな
+     * bit 4   INS
+     * bit 3   CAPS
+     * bit 2   コード入力
+     * bit 1   ローマ字
+     * bit 0   かな
+     */
+    uint8_t led = 0xFF;
+    xprintf("usb_led: %02X\n", usb_led);
+    if (usb_led&(1<<USB_LED_NUM_LOCK))      led &= ~(1<<2);
+    if (usb_led&(1<<USB_LED_CAPS_LOCK))     led &= ~(1<<3);
+    if (usb_led&(1<<USB_LED_SCROLL_LOCK))   led &= ~(1<<1);
+    if (usb_led&(1<<USB_LED_COMPOSE))       led &= ~(1<<4);
+    if (usb_led&(1<<USB_LED_KANA))          led &= ~(1<<0);
+    xprintf("led: %02X\n", led);
+    x68k_send(led);
 }

+ 6 - 0
protocol/x68k.c

@@ -64,6 +64,12 @@ uint8_t x68k_recv(void)
     return data;
 }
 
+void x68k_send(uint8_t d)
+{
+    while (!(UCSR1A&(1<<UDRE1)));
+    UDR1 = d;
+}
+
 // USART RX complete interrupt
 ISR(KBD_RX_VECT)
 {

+ 1 - 0
protocol/x68k.h

@@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
 /* host role */
 void x68k_init(void);
 uint8_t x68k_recv(void);
+void x68k_send(uint8_t d);
 
 /* device role */