~ruther/qmk_firmware

7dde35d4f7cc3cc1569a31e752ea4043133b1a72 — Robin Haberkorn 11 years ago 388fe60
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
M converter/ps2_usb/Makefile => converter/ps2_usb/Makefile +13 -0
@@ 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

M converter/ps2_usb/config.h => converter/ps2_usb/config.h +38 -0
@@ 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

M protocol.mk => protocol.mk +20 -0
@@ 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

M protocol/lufa/lufa.c => protocol/lufa/lufa.c +12 -0
@@ 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

M protocol/serial_mouse_mousesystems.c => protocol/serial_mouse_mousesystems.c +1 -1
@@ 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);