diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-07-27 17:07:26 +0200 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2014-07-27 17:38:31 +0200 |
commit | 7dde35d4f7cc3cc1569a31e752ea4043133b1a72 (patch) | |
tree | 9c91ff60feb667492d76ecfe086849e6fba18b68 | |
parent | 388fe60c67dbc4232a979d3de3b3b161a67871e2 (diff) | |
download | qmk_firmware-7dde35d4f7cc3cc1569a31e752ea4043133b1a72.tar.gz qmk_firmware-7dde35d4f7cc3cc1569a31e752ea4043133b1a72.zip |
integrated serial mouse drivers as a feature into the firmware architecture
* can be enabled by defining Makefile macro SERIAL_MOUSE_MICROSOFT_ENABLE or
SERIAL_MOUSE_MOUSESYSTEMS_ENABLE.
* Serial implementation can be chosen via SERIAL_MOUSE_USE_SOFT and
SERIAL_MOUSE_USE_UART macros
* UART configuration still has to be done in config.h: I added working clauses
for both mouse protocols to ps2_usb's config.h
-rw-r--r-- | converter/ps2_usb/Makefile | 13 | ||||
-rw-r--r-- | converter/ps2_usb/config.h | 38 | ||||
-rw-r--r-- | protocol.mk | 20 | ||||
-rw-r--r-- | protocol/lufa/lufa.c | 12 | ||||
-rw-r--r-- | protocol/serial_mouse_mousesystems.c | 2 |
5 files changed, 84 insertions, 1 deletions
diff --git a/converter/ps2_usb/Makefile b/converter/ps2_usb/Makefile index 1dd23c157e..f20039c6f0 100644 --- a/converter/ps2_usb/Makefile +++ b/converter/ps2_usb/Makefile @@ -91,6 +91,19 @@ PS2_USE_USART = yes # uses hardware USART engine for PS/2 signal receive(recomen #PS2_USE_INT = yes # uses external interrupt for falling edge of PS/2 clock pin #PS2_USE_BUSYWAIT = yes # uses primitive reference code +# Serial Mouse Options +# You can choose a mouse protocol and the implementation of +# the underlying serial connection. +# +#SERIAL_MOUSE_MICROSOFT_ENABLE = yes # Enable support for Microsoft-compatible mice +#SERIAL_MOUSE_MOUSESYSTEMS_ENABLE = yes # Enable support for Mousesystems-compatible mice +#SERIAL_MOUSE_USE_UART = yes # use hardware UART for serial connection +#SERIAL_MOUSE_USE_SOFT = yes # use software serial implementation + +# Optional serial mouse driver features +# Support scrolling while holding the middle mouse button +# (currently only supported for Mousesystems mice): +#OPT_DEFS += -DSERIAL_MOUSE_CENTER_SCROLL # Optimize size but this may cause error "relocation truncated to fit" #EXTRALDFLAGS = -Wl,--relax diff --git a/converter/ps2_usb/config.h b/converter/ps2_usb/config.h index 889f0c38eb..5b644002dc 100644 --- a/converter/ps2_usb/config.h +++ b/converter/ps2_usb/config.h @@ -170,4 +170,42 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #endif #endif +#ifdef SERIAL_MOUSE_MICROSOFT + /* + * Serial(USART) configuration (for Microsoft serial mice) + * asynchronous, positive logic, 1200baud, bit order: LSB first + * 1-start bit, 7-data bit, no parity, 1-stop bit + */ + #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 */ \ + UCSR1C = (1<<UCSZ11) | (0<<UCSZ10); /* no parity, 1 stop bit, 7-bit characters */ \ + sei(); \ + } while(0) +#elif defined(SERIAL_MOUSE_MOUSESYSTEMS) + /* + * Serial(USART) configuration (for Mousesystems serial mice) + * asynchronous, positive logic, 1200baud, bit order: LSB first + * 1-start bit, 8-data bit, no parity, 1-stop bit + */ + #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 */ \ + UCSR1C = (1<<UCSZ11) | (1<<UCSZ10); /* no parity, 1 stop bit, 8-bit characters */ \ + sei(); \ + } while(0) +#endif + #endif diff --git a/protocol.mk b/protocol.mk index 7f561e62d6..de7014e866 100644 --- a/protocol.mk +++ b/protocol.mk @@ -23,5 +23,25 @@ ifdef PS2_USE_USART endif +ifdef SERIAL_MOUSE_MICROSOFT_ENABLE + SRC += $(PROTOCOL_DIR)/serial_mouse_microsoft.c + OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MICROSOFT \ + -DMOUSE_ENABLE +endif + +ifdef SERIAL_MOUSE_MOUSESYSTEMS_ENABLE + SRC += $(PROTOCOL_DIR)/serial_mouse_mousesystems.c + OPT_DEFS += -DSERIAL_MOUSE_ENABLE -DSERIAL_MOUSE_MOUSESYSTEMS \ + -DMOUSE_ENABLE +endif + +ifdef SERIAL_MOUSE_USE_SOFT + SRC += $(PROTOCOL_DIR)/serial_soft.c +endif + +ifdef SERIAL_MOUSE_USE_UART + SRC += $(PROTOCOL_DIR)/serial_uart.c +endif + # Search Path VPATH += $(TOP_DIR)/protocol diff --git a/protocol/lufa/lufa.c b/protocol/lufa/lufa.c index 16a602df13..58201e5c98 100644 --- a/protocol/lufa/lufa.c +++ b/protocol/lufa/lufa.c @@ -49,6 +49,10 @@ #endif #include "suspend.h" +#ifdef SERIAL_MOUSE_ENABLE +#include "serial_mouse.h" +#endif + #include "descriptor.h" #include "lufa.h" @@ -571,6 +575,10 @@ int main(void) sleep_led_init(); #endif +#ifdef SERIAL_MOUSE_ENABLE + serial_mouse_init(); +#endif + print("Keyboard start.\n"); while (1) { while (USB_DeviceState == DEVICE_STATE_Suspended) { @@ -582,6 +590,10 @@ int main(void) keyboard_task(); +#ifdef SERIAL_MOUSE_ENABLE + serial_mouse_task(); +#endif + #if !defined(INTERRUPT_CONTROL_ENDPOINT) USB_USBTask(); #endif diff --git a/protocol/serial_mouse_mousesystems.c b/protocol/serial_mouse_mousesystems.c index ec708c911f..68b2b5b359 100644 --- a/protocol/serial_mouse_mousesystems.c +++ b/protocol/serial_mouse_mousesystems.c @@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "print.h" #include "debug.h" -#define SERIAL_MOUSE_CENTER_SCROLL +//#define SERIAL_MOUSE_CENTER_SCROLL static void print_usb_data(const report_mouse_t *report); |