forked from mirrors/qmk_userspace
		
	add mouse function.
This commit is contained in:
		
					parent
					
						
							
								e7c6839d2d
							
						
					
				
			
			
				commit
				
					
						d3b1af9572
					
				
			
		
					 14 changed files with 281 additions and 123 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -7,3 +7,4 @@
 | 
				
			||||||
*.lst
 | 
					*.lst
 | 
				
			||||||
*.map
 | 
					*.map
 | 
				
			||||||
*.sym
 | 
					*.sym
 | 
				
			||||||
 | 
					tags
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -46,13 +46,14 @@ TARGET = mykey
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List C source files here. (C dependencies are automatically generated.)
 | 
					# List C source files here. (C dependencies are automatically generated.)
 | 
				
			||||||
SRC =	$(TARGET).c \
 | 
					SRC =	$(TARGET).c \
 | 
				
			||||||
 | 
						usb.c \
 | 
				
			||||||
 | 
						usb_keyboard.c \
 | 
				
			||||||
 | 
						usb_mouse.c \
 | 
				
			||||||
 | 
						usb_debug.c \
 | 
				
			||||||
	keymap.c \
 | 
						keymap.c \
 | 
				
			||||||
	matrix.c \
 | 
						matrix.c \
 | 
				
			||||||
	usb_device.c \
 | 
						jump_bootloader.c \
 | 
				
			||||||
	usb_keyboard.c \
 | 
						print.c
 | 
				
			||||||
	usb_debug.c \
 | 
					 | 
				
			||||||
	print.c \
 | 
					 | 
				
			||||||
	jump_bootloader.c
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# MCU name, you MUST set this to match the board you are using
 | 
					# MCU name, you MUST set this to match the board you are using
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								keymap.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								keymap.h
									
										
									
									
									
								
							| 
						 | 
					@ -2,7 +2,7 @@
 | 
				
			||||||
#define KEYMAP_H 1
 | 
					#define KEYMAP_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "usbkeycodes.h"
 | 
					#include "usb_keycodes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int get_layer(void);
 | 
					int get_layer(void);
 | 
				
			||||||
uint8_t get_keycode(int layer, int row, int col);
 | 
					uint8_t get_keycode(int layer, int row, int col);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5
									
								
								matrix.h
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								matrix.h
									
										
									
									
									
								
							| 
						 | 
					@ -1,3 +1,6 @@
 | 
				
			||||||
 | 
					#ifndef MATRIX_H
 | 
				
			||||||
 | 
					#define  MATRIX_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern uint8_t *matrix;
 | 
					extern uint8_t *matrix;
 | 
				
			||||||
| 
						 | 
					@ -8,3 +11,5 @@ uint8_t matrix_scan(void);
 | 
				
			||||||
bool matrix_is_modified(void);
 | 
					bool matrix_is_modified(void);
 | 
				
			||||||
bool matrix_has_ghost(void);
 | 
					bool matrix_has_ghost(void);
 | 
				
			||||||
bool matrix_has_ghost_in_row(uint8_t row);
 | 
					bool matrix_has_ghost_in_row(uint8_t row);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										87
									
								
								mykey.c
									
										
									
									
									
								
							
							
						
						
									
										87
									
								
								mykey.c
									
										
									
									
									
								
							| 
						 | 
					@ -30,7 +30,9 @@
 | 
				
			||||||
#include <avr/interrupt.h>
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
#include <util/delay.h>
 | 
					#include <util/delay.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "usb_device.h"
 | 
					#include "usb.h"
 | 
				
			||||||
 | 
					#include "usb_keyboard.h"
 | 
				
			||||||
 | 
					#include "usb_mouse.h"
 | 
				
			||||||
#include "print.h"
 | 
					#include "print.h"
 | 
				
			||||||
#include "matrix.h"
 | 
					#include "matrix.h"
 | 
				
			||||||
#include "keymap.h"
 | 
					#include "keymap.h"
 | 
				
			||||||
| 
						 | 
					@ -50,16 +52,9 @@ uint16_t idle_count=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void)
 | 
					int main(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    bool modified = false;
 | 
					 | 
				
			||||||
    bool has_ghost = false;
 | 
					 | 
				
			||||||
    uint8_t key_index = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // set for 16 MHz clock
 | 
					    // set for 16 MHz clock
 | 
				
			||||||
    CPU_PRESCALE(0);
 | 
					    CPU_PRESCALE(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    matrix_init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Initialize the USB, and then wait for the host to set configuration.
 | 
					    // Initialize the USB, and then wait for the host to set configuration.
 | 
				
			||||||
    // If the Teensy is powered without a PC connected to the USB port,
 | 
					    // If the Teensy is powered without a PC connected to the USB port,
 | 
				
			||||||
    // this will wait forever.
 | 
					    // this will wait forever.
 | 
				
			||||||
| 
						 | 
					@ -78,24 +73,34 @@ int main(void)
 | 
				
			||||||
    TCCR0B = 0x05;
 | 
					    TCCR0B = 0x05;
 | 
				
			||||||
    TIMSK0 = (1<<TOIE0);
 | 
					    TIMSK0 = (1<<TOIE0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    matrix_init();
 | 
				
			||||||
    print("firmware 0.2 for t.m.k.\n");
 | 
					    print("firmware 0.2 for t.m.k.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool modified = false;
 | 
				
			||||||
 | 
					    bool has_ghost = false;
 | 
				
			||||||
 | 
					    int key_index = 0;
 | 
				
			||||||
    int loop_count = 0;
 | 
					    int loop_count = 0;
 | 
				
			||||||
    while (1) {
 | 
					 | 
				
			||||||
    int layer = 0;
 | 
					    int layer = 0;
 | 
				
			||||||
 | 
					    while (1) {
 | 
				
			||||||
        matrix_scan();
 | 
					        matrix_scan();
 | 
				
			||||||
        layer = get_layer();
 | 
					        layer = get_layer();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        modified = matrix_is_modified();
 | 
					        modified = matrix_is_modified();
 | 
				
			||||||
        has_ghost = matrix_has_ghost();
 | 
					        has_ghost = matrix_has_ghost();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // doesnt send keys during ghost occurs
 | 
					        // print matrix state for debug
 | 
				
			||||||
        if (modified && !has_ghost) {
 | 
					        if (modified) {
 | 
				
			||||||
 | 
					            print_matrix();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // LED flush
 | 
				
			||||||
 | 
					            DDRD |= 1<<PD6;
 | 
				
			||||||
 | 
					            PORTD |= 1<<PD6;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // set matrix state to keyboard_keys, keyboard_modifier_keys
 | 
				
			||||||
        key_index = 0;
 | 
					        key_index = 0;
 | 
				
			||||||
        keyboard_modifier_keys = 0;
 | 
					        keyboard_modifier_keys = 0;
 | 
				
			||||||
        for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
 | 
					        for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (int row = 0; row < MATRIX_ROWS; row++) {
 | 
					        for (int row = 0; row < MATRIX_ROWS; row++) {
 | 
				
			||||||
            for (int col = 0; col < MATRIX_COLS; col++) {
 | 
					            for (int col = 0; col < MATRIX_COLS; col++) {
 | 
				
			||||||
                if (matrix[row] & 1<<col) continue;
 | 
					                if (matrix[row] & 1<<col) continue;
 | 
				
			||||||
| 
						 | 
					@ -114,63 +119,39 @@ int main(void)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // run bootloader when 4 left modifier keys down
 | 
					        if (!has_ghost)  {
 | 
				
			||||||
 | 
					            // when 4 left modifier keys down
 | 
				
			||||||
            if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
 | 
					            if (keyboard_modifier_keys == (MOD_LCTRL | MOD_LSHIFT | MOD_LALT | MOD_LGUI)) {
 | 
				
			||||||
                // cancel all keys
 | 
					                // cancel all keys
 | 
				
			||||||
                keyboard_modifier_keys = 0;
 | 
					                keyboard_modifier_keys = 0;
 | 
				
			||||||
                for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
 | 
					                for (int i = 0; i < 6; i++) keyboard_keys[i] = KB_NO;
 | 
				
			||||||
                usb_keyboard_send();
 | 
					                usb_keyboard_send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                /*
 | 
				
			||||||
                print("jump to bootloader...\n");
 | 
					                print("jump to bootloader...\n");
 | 
				
			||||||
                _delay_ms(1000);
 | 
					                _delay_ms(1000);
 | 
				
			||||||
                jump_bootloader();
 | 
					                jump_bootloader();
 | 
				
			||||||
 | 
					                */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // mouse
 | 
				
			||||||
 | 
					                print("usb_mouse_move\n");
 | 
				
			||||||
 | 
					                usb_mouse_move(10, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                _delay_ms(100);
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // send keys to host
 | 
				
			||||||
 | 
					            if (modified) {
 | 
				
			||||||
                if (key_index > 6) {
 | 
					                if (key_index > 6) {
 | 
				
			||||||
                    //Rollover
 | 
					                    //Rollover
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					 | 
				
			||||||
                usb_keyboard_send();
 | 
					                usb_keyboard_send();
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // variables shared with interrupt routines must be
 | 
					 | 
				
			||||||
            // accessed carefully so the interrupt routine doesn't
 | 
					 | 
				
			||||||
            // try to use the variable in the middle of our access
 | 
					 | 
				
			||||||
            cli();
 | 
					 | 
				
			||||||
            //idle_count = 0;
 | 
					 | 
				
			||||||
            sei();
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					 | 
				
			||||||
        // print matrix state for debug
 | 
					 | 
				
			||||||
        if (modified) {
 | 
					 | 
				
			||||||
            print_matrix();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // LED flush
 | 
					 | 
				
			||||||
            DDRD |= 1<<PD6;
 | 
					 | 
				
			||||||
            PORTD |= 1<<PD6;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
        // print counts for debug
 | 
					 | 
				
			||||||
        if ((loop_count % 0x1000) == 0) {
 | 
					 | 
				
			||||||
            //print(".");
 | 
					 | 
				
			||||||
            print("idle_count: "); phex((idle_count & 0xFF00) >> 8); phex(idle_count & 0xFF); print("\n");
 | 
					 | 
				
			||||||
            print("loop_count: "); phex((loop_count & 0xFF00) >> 8); phex(loop_count & 0xFF); print("\n");
 | 
					 | 
				
			||||||
            print_matrix();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // teensy LED flush for debug
 | 
					 | 
				
			||||||
        if ((loop_count & 0x100) == 0) {
 | 
					 | 
				
			||||||
            DDRD |= 1<<PD6;
 | 
					 | 
				
			||||||
            PORTD |= 1<<PD6;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // now the current pins will be the previous, and
 | 
					 | 
				
			||||||
        // wait a short delay so we're not highly sensitive
 | 
					 | 
				
			||||||
        // to mechanical "bounce".
 | 
					 | 
				
			||||||
        _delay_ms(2);
 | 
					 | 
				
			||||||
        loop_count++;
 | 
					        loop_count++;
 | 
				
			||||||
 | 
					        _delay_ms(2);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								print.c
									
										
									
									
									
								
							
							
						
						
									
										1
									
								
								print.c
									
										
									
									
									
								
							| 
						 | 
					@ -25,7 +25,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <avr/io.h>
 | 
					#include <avr/io.h>
 | 
				
			||||||
#include <avr/pgmspace.h>
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "print.h"
 | 
					#include "print.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void print_P(const char *s)
 | 
					void print_P(const char *s)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								print.h
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								print.h
									
										
									
									
									
								
							| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
#ifndef print_h__
 | 
					#ifndef PRINT_H__
 | 
				
			||||||
#define print_h__
 | 
					#define PRINT_H__ 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <avr/pgmspace.h>
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
#include "usb_debug.h"
 | 
					#include "usb_debug.h"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,10 +21,12 @@
 | 
				
			||||||
 * THE SOFTWARE.
 | 
					 * THE SOFTWARE.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <avr/io.h>
 | 
				
			||||||
#include <avr/pgmspace.h>
 | 
					#include <avr/pgmspace.h>
 | 
				
			||||||
#include <avr/interrupt.h>
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
#include "usb_device.h"
 | 
					#include "usb.h"
 | 
				
			||||||
#include "usb_keyboard.h"
 | 
					#include "usb_keyboard.h"
 | 
				
			||||||
 | 
					#include "usb_mouse.h"
 | 
				
			||||||
#include "usb_debug.h"
 | 
					#include "usb_debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,11 +66,15 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ENDPOINT0_SIZE		32
 | 
					#define ENDPOINT0_SIZE		32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 0:control endpoint is enabled automatically by controller.
 | 
				
			||||||
static const uint8_t PROGMEM endpoint_config_table[] = {
 | 
					static const uint8_t PROGMEM endpoint_config_table[] = {
 | 
				
			||||||
	0,
 | 
						// enable, UECFG0X(type, direction), UECFG1X(size, bank, allocation)
 | 
				
			||||||
	0,
 | 
						1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(KEYBOARD_SIZE) | KEYBOARD_BUFFER, // 1
 | 
				
			||||||
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(KEYBOARD_SIZE) | KEYBOARD_BUFFER,
 | 
						1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(MOUSE_SIZE)    | MOUSE_BUFFER,    // 2
 | 
				
			||||||
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER
 | 
						1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER, // 3
 | 
				
			||||||
 | 
					        0, // 4
 | 
				
			||||||
 | 
					        0, // 5
 | 
				
			||||||
 | 
					        0, // 6
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -138,6 +144,36 @@ static uint8_t PROGMEM keyboard_hid_report_desc[] = {
 | 
				
			||||||
        0xc0                 // End Collection
 | 
					        0xc0                 // End Collection
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension
 | 
				
			||||||
 | 
					static uint8_t PROGMEM mouse_hid_report_desc[] = {
 | 
				
			||||||
 | 
						0x05, 0x01,			// Usage Page (Generic Desktop)
 | 
				
			||||||
 | 
						0x09, 0x02,			// Usage (Mouse)
 | 
				
			||||||
 | 
						0xA1, 0x01,			// Collection (Application)
 | 
				
			||||||
 | 
						0x05, 0x09,			//   Usage Page (Button)
 | 
				
			||||||
 | 
						0x19, 0x01,			//   Usage Minimum (Button #1)
 | 
				
			||||||
 | 
						0x29, 0x03,			//   Usage Maximum (Button #3)
 | 
				
			||||||
 | 
						0x15, 0x00,			//   Logical Minimum (0)
 | 
				
			||||||
 | 
						0x25, 0x01,			//   Logical Maximum (1)
 | 
				
			||||||
 | 
						0x95, 0x03,			//   Report Count (3)
 | 
				
			||||||
 | 
						0x75, 0x01,			//   Report Size (1)
 | 
				
			||||||
 | 
						0x81, 0x02,			//   Input (Data, Variable, Absolute)
 | 
				
			||||||
 | 
						0x95, 0x01,			//   Report Count (1)
 | 
				
			||||||
 | 
						0x75, 0x05,			//   Report Size (5)
 | 
				
			||||||
 | 
						0x81, 0x03,			//   Input (Constant)
 | 
				
			||||||
 | 
						0x05, 0x01,			//   Usage Page (Generic Desktop)
 | 
				
			||||||
 | 
						0x09, 0x30,			//   Usage (X)
 | 
				
			||||||
 | 
						0x09, 0x31,			//   Usage (Y)
 | 
				
			||||||
 | 
						0x15, 0x81,			//   Logical Minimum (-127)
 | 
				
			||||||
 | 
						0x25, 0x7F,			//   Logical Maximum (127)
 | 
				
			||||||
 | 
						0x75, 0x08,			//   Report Size (8),
 | 
				
			||||||
 | 
						0x95, 0x02,			//   Report Count (2),
 | 
				
			||||||
 | 
						0x81, 0x06,			//   Input (Data, Variable, Relative)
 | 
				
			||||||
 | 
						0x09, 0x38,			//   Usage (Wheel)
 | 
				
			||||||
 | 
						0x95, 0x01,			//   Report Count (1),
 | 
				
			||||||
 | 
						0x81, 0x06,			//   Input (Data, Variable, Relative)
 | 
				
			||||||
 | 
						0xC0				// End Collection
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint8_t PROGMEM debug_hid_report_desc[] = {
 | 
					static uint8_t PROGMEM debug_hid_report_desc[] = {
 | 
				
			||||||
	0x06, 0x31, 0xFF,			// Usage Page 0xFF31 (vendor defined)
 | 
						0x06, 0x31, 0xFF,			// Usage Page 0xFF31 (vendor defined)
 | 
				
			||||||
	0x09, 0x74,				// Usage 0x74
 | 
						0x09, 0x74,				// Usage 0x74
 | 
				
			||||||
| 
						 | 
					@ -151,20 +187,22 @@ static uint8_t PROGMEM debug_hid_report_desc[] = {
 | 
				
			||||||
	0xC0					// end collection
 | 
						0xC0					// end collection
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONFIG1_DESC_SIZE        (9+9+9+7+9+9+7)
 | 
					#define CONFIG1_DESC_SIZE        (9+(9+9+7)+(9+9+7)+(9+9+7))
 | 
				
			||||||
#define KEYBOARD_HID_DESC_OFFSET (9+9)
 | 
					#define KEYBOARD_HID_DESC_OFFSET (9+9)
 | 
				
			||||||
#define DEBUG_HID_DESC_OFFSET    (9+9+9+7+9)
 | 
					#define MOUSE_HID_DESC_OFFSET    (9+(9+9+7)+9)
 | 
				
			||||||
 | 
					#define DEBUG_HID_DESC_OFFSET    (9+(9+9+7)+(9+9+7)+9)
 | 
				
			||||||
static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
 | 
					static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
 | 
				
			||||||
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
 | 
						// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
 | 
				
			||||||
	9, 					// bLength;
 | 
						9, 					// bLength;
 | 
				
			||||||
	2,					// bDescriptorType;
 | 
						2,					// bDescriptorType;
 | 
				
			||||||
	LSB(CONFIG1_DESC_SIZE),			// wTotalLength
 | 
						LSB(CONFIG1_DESC_SIZE),			// wTotalLength
 | 
				
			||||||
	MSB(CONFIG1_DESC_SIZE),
 | 
						MSB(CONFIG1_DESC_SIZE),
 | 
				
			||||||
	2,					// bNumInterfaces
 | 
						3,					// bNumInterfaces
 | 
				
			||||||
	1,					// bConfigurationValue
 | 
						1,					// bConfigurationValue
 | 
				
			||||||
	0,					// iConfiguration
 | 
						0,					// iConfiguration
 | 
				
			||||||
	0xC0,					// bmAttributes
 | 
						0xC0,					// bmAttributes
 | 
				
			||||||
	50,					// bMaxPower
 | 
						50,					// bMaxPower
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
 | 
						// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
 | 
				
			||||||
	9,					// bLength
 | 
						9,					// bLength
 | 
				
			||||||
	4,					// bDescriptorType
 | 
						4,					// bDescriptorType
 | 
				
			||||||
| 
						 | 
					@ -175,7 +213,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
 | 
				
			||||||
	0x01,					// bInterfaceSubClass (0x01 = Boot)
 | 
						0x01,					// bInterfaceSubClass (0x01 = Boot)
 | 
				
			||||||
	0x01,					// bInterfaceProtocol (0x01 = Keyboard)
 | 
						0x01,					// bInterfaceProtocol (0x01 = Keyboard)
 | 
				
			||||||
	0,					// iInterface
 | 
						0,					// iInterface
 | 
				
			||||||
	// HID interface descriptor, HID 1.11 spec, section 6.2.1
 | 
						// HID descriptor, HID 1.11 spec, section 6.2.1
 | 
				
			||||||
	9,					// bLength
 | 
						9,					// bLength
 | 
				
			||||||
	0x21,					// bDescriptorType
 | 
						0x21,					// bDescriptorType
 | 
				
			||||||
	0x11, 0x01,				// bcdHID
 | 
						0x11, 0x01,				// bcdHID
 | 
				
			||||||
| 
						 | 
					@ -191,6 +229,34 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
 | 
				
			||||||
	0x03,					// bmAttributes (0x03=intr)
 | 
						0x03,					// bmAttributes (0x03=intr)
 | 
				
			||||||
	KEYBOARD_SIZE, 0,			// wMaxPacketSize
 | 
						KEYBOARD_SIZE, 0,			// wMaxPacketSize
 | 
				
			||||||
	1,					// bInterval
 | 
						1,					// bInterval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
 | 
				
			||||||
 | 
						9,					// bLength
 | 
				
			||||||
 | 
						4,					// bDescriptorType
 | 
				
			||||||
 | 
						MOUSE_INTERFACE,			// bInterfaceNumber
 | 
				
			||||||
 | 
						0,					// bAlternateSetting
 | 
				
			||||||
 | 
						1,					// bNumEndpoints
 | 
				
			||||||
 | 
						0x03,					// bInterfaceClass (0x03 = HID)
 | 
				
			||||||
 | 
						0x01,					// bInterfaceSubClass (0x01 = Boot)
 | 
				
			||||||
 | 
						0x02,					// bInterfaceProtocol (0x02 = Mouse)
 | 
				
			||||||
 | 
						0,					// iInterface
 | 
				
			||||||
 | 
						// HID descriptor, HID 1.11 spec, section 6.2.1
 | 
				
			||||||
 | 
						9,					// bLength
 | 
				
			||||||
 | 
						0x21,					// bDescriptorType
 | 
				
			||||||
 | 
						0x11, 0x01,				// bcdHID
 | 
				
			||||||
 | 
						0,					// bCountryCode
 | 
				
			||||||
 | 
						1,					// bNumDescriptors
 | 
				
			||||||
 | 
						0x22,					// bDescriptorType
 | 
				
			||||||
 | 
						sizeof(mouse_hid_report_desc),		// wDescriptorLength
 | 
				
			||||||
 | 
						0,
 | 
				
			||||||
 | 
						// endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13
 | 
				
			||||||
 | 
						7,					// bLength
 | 
				
			||||||
 | 
						5,					// bDescriptorType
 | 
				
			||||||
 | 
						MOUSE_ENDPOINT | 0x80,			// bEndpointAddress
 | 
				
			||||||
 | 
						0x03,					// bmAttributes (0x03=intr)
 | 
				
			||||||
 | 
						4, 0,					// wMaxPacketSize
 | 
				
			||||||
 | 
						1,					// bInterval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
 | 
						// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
 | 
				
			||||||
	9,					// bLength
 | 
						9,					// bLength
 | 
				
			||||||
	4,					// bDescriptorType
 | 
						4,					// bDescriptorType
 | 
				
			||||||
| 
						 | 
					@ -201,7 +267,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
 | 
				
			||||||
	0x00,					// bInterfaceSubClass
 | 
						0x00,					// bInterfaceSubClass
 | 
				
			||||||
	0x00,					// bInterfaceProtocol
 | 
						0x00,					// bInterfaceProtocol
 | 
				
			||||||
	0,					// iInterface
 | 
						0,					// iInterface
 | 
				
			||||||
	// HID interface descriptor, HID 1.11 spec, section 6.2.1
 | 
						// HID descriptor, HID 1.11 spec, section 6.2.1
 | 
				
			||||||
	9,					// bLength
 | 
						9,					// bLength
 | 
				
			||||||
	0x21,					// bDescriptorType
 | 
						0x21,					// bDescriptorType
 | 
				
			||||||
	0x11, 0x01,				// bcdHID
 | 
						0x11, 0x01,				// bcdHID
 | 
				
			||||||
| 
						 | 
					@ -259,6 +325,9 @@ static struct descriptor_list_struct {
 | 
				
			||||||
	{0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
 | 
						{0x2200, KEYBOARD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
 | 
				
			||||||
	{0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
 | 
						{0x2100, KEYBOARD_INTERFACE, config1_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},
 | 
				
			||||||
        // HID REPORT
 | 
					        // HID REPORT
 | 
				
			||||||
 | 
						{0x2200, MOUSE_INTERFACE, mouse_hid_report_desc, sizeof(mouse_hid_report_desc)},
 | 
				
			||||||
 | 
						{0x2100, MOUSE_INTERFACE, config1_descriptor+MOUSE_HID_DESC_OFFSET, 9},
 | 
				
			||||||
 | 
					        // HID REPORT
 | 
				
			||||||
	{0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
 | 
						{0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
 | 
				
			||||||
	{0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
 | 
						{0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
 | 
				
			||||||
        // STRING descriptor
 | 
					        // STRING descriptor
 | 
				
			||||||
| 
						 | 
					@ -470,7 +539,7 @@ ISR(USB_COM_vect)
 | 
				
			||||||
			usb_configuration = wValue;
 | 
								usb_configuration = wValue;
 | 
				
			||||||
			usb_send_in();
 | 
								usb_send_in();
 | 
				
			||||||
			cfg = endpoint_config_table;
 | 
								cfg = endpoint_config_table;
 | 
				
			||||||
			for (i=1; i<5; i++) {
 | 
								for (i=1; i<=6; i++) {
 | 
				
			||||||
				UENUM = i;
 | 
									UENUM = i;
 | 
				
			||||||
				en = pgm_read_byte(cfg++);
 | 
									en = pgm_read_byte(cfg++);
 | 
				
			||||||
				UECONX = en;
 | 
									UECONX = en;
 | 
				
			||||||
| 
						 | 
					@ -479,7 +548,7 @@ ISR(USB_COM_vect)
 | 
				
			||||||
					UECFG1X = pgm_read_byte(cfg++);
 | 
										UECFG1X = pgm_read_byte(cfg++);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
        		UERST = 0x1E;
 | 
					        		UERST = 0x7E;
 | 
				
			||||||
        		UERST = 0;
 | 
					        		UERST = 0;
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -571,6 +640,32 @@ ISR(USB_COM_vect)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (wIndex == MOUSE_INTERFACE) {
 | 
				
			||||||
 | 
								if (bmRequestType == 0xA1) {
 | 
				
			||||||
 | 
									if (bRequest == HID_GET_REPORT) {
 | 
				
			||||||
 | 
										usb_wait_in_ready();
 | 
				
			||||||
 | 
										UEDATX = mouse_buttons;
 | 
				
			||||||
 | 
										UEDATX = 0;
 | 
				
			||||||
 | 
										UEDATX = 0;
 | 
				
			||||||
 | 
										UEDATX = 0;
 | 
				
			||||||
 | 
										usb_send_in();
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (bRequest == HID_GET_PROTOCOL) {
 | 
				
			||||||
 | 
										usb_wait_in_ready();
 | 
				
			||||||
 | 
										UEDATX = mouse_protocol;
 | 
				
			||||||
 | 
										usb_send_in();
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (bmRequestType == 0x21) {
 | 
				
			||||||
 | 
									if (bRequest == HID_SET_PROTOCOL) {
 | 
				
			||||||
 | 
										mouse_protocol = wValue;
 | 
				
			||||||
 | 
										usb_send_in();
 | 
				
			||||||
 | 
										return;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		if (wIndex == DEBUG_INTERFACE) {
 | 
							if (wIndex == DEBUG_INTERFACE) {
 | 
				
			||||||
			if (bRequest == HID_GET_REPORT && bmRequestType == 0xA1) {
 | 
								if (bRequest == HID_GET_REPORT && bmRequestType == 0xA1) {
 | 
				
			||||||
				len = wLength;
 | 
									len = wLength;
 | 
				
			||||||
| 
						 | 
					@ -1,10 +1,8 @@
 | 
				
			||||||
#ifndef USB_DEVICE_H
 | 
					#ifndef USB_H
 | 
				
			||||||
#define  USB_DEVICE_H 1
 | 
					#define  USB_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include <avr/io.h>
 | 
					#include <avr/io.h>
 | 
				
			||||||
#include "usb_keyboard.h"
 | 
					 | 
				
			||||||
#include "usb_debug.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void usb_init(void);			// initialize everything
 | 
					void usb_init(void);			// initialize everything
 | 
				
			||||||
| 
						 | 
					@ -2,11 +2,11 @@
 | 
				
			||||||
#define  USB_DEBUG_H 1
 | 
					#define  USB_DEBUG_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "usb_device.h"
 | 
					#include "usb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEBUG_INTERFACE		1
 | 
					#define DEBUG_INTERFACE		2
 | 
				
			||||||
#define DEBUG_TX_ENDPOINT	4
 | 
					#define DEBUG_TX_ENDPOINT	3
 | 
				
			||||||
#define DEBUG_TX_SIZE		32
 | 
					#define DEBUG_TX_SIZE		32
 | 
				
			||||||
#define DEBUG_TX_BUFFER		EP_DOUBLE_BUFFER
 | 
					#define DEBUG_TX_BUFFER		EP_DOUBLE_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,11 +2,11 @@
 | 
				
			||||||
#define  USB_KEYBOARD_H 1
 | 
					#define  USB_KEYBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
#include "usb_device.h"
 | 
					#include "usb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KEYBOARD_INTERFACE	0
 | 
					#define KEYBOARD_INTERFACE	0
 | 
				
			||||||
#define KEYBOARD_ENDPOINT	3
 | 
					#define KEYBOARD_ENDPOINT	1
 | 
				
			||||||
#define KEYBOARD_SIZE		8
 | 
					#define KEYBOARD_SIZE		8
 | 
				
			||||||
#define KEYBOARD_BUFFER		EP_DOUBLE_BUFFER
 | 
					#define KEYBOARD_BUFFER		EP_DOUBLE_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,8 @@
 | 
				
			||||||
/* Some modified from Keyboard Upgrade 0.3.0
 | 
					/* 
 | 
				
			||||||
 * 2010/08/22
 | 
					 * Key codes from HID Keyboard/Keypad Page
 | 
				
			||||||
 | 
					 * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Based on Keyboard Upgrade v0.3.0 http://github.com/rhomann/kbupgrade
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Keyboard Upgrade -- Firmware for homebrew computer keyboard controllers.
 | 
					 * Keyboard Upgrade -- Firmware for homebrew computer keyboard controllers.
 | 
				
			||||||
| 
						 | 
					@ -30,17 +33,10 @@
 | 
				
			||||||
 * MA  02110-1301  USA
 | 
					 * MA  02110-1301  USA
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef USBKEYCODES_H
 | 
					#ifndef USB_KEYCODES_H
 | 
				
			||||||
#define USBKEYCODES_H
 | 
					#define USB_KEYCODES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * The USB keycodes are enumerated here - the first part is simply
 | 
					 | 
				
			||||||
 * an enumeration of the allowed scan-codes used for USB HID devices.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * see 10 Keyboard/Keypad Page(0x07)
 | 
					 | 
				
			||||||
 * http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
enum keycodes {
 | 
					enum keycodes {
 | 
				
			||||||
    KB_NO = 0,
 | 
					    KB_NO = 0,
 | 
				
			||||||
    KB_ROLL_OVER,
 | 
					    KB_ROLL_OVER,
 | 
				
			||||||
| 
						 | 
					@ -265,11 +261,11 @@ enum keycodes {
 | 
				
			||||||
    KB_RALT,            /* 0x40 */
 | 
					    KB_RALT,            /* 0x40 */
 | 
				
			||||||
    KB_RGUI,            /* 0x80 */
 | 
					    KB_RGUI,            /* 0x80 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* function keys */
 | 
					    /* extensions for internal use */
 | 
				
			||||||
    FN_0 = 0xF0,
 | 
					    FN_0 = 0xF0,
 | 
				
			||||||
    FN_1,
 | 
					    FN_1,
 | 
				
			||||||
    FN_2,
 | 
					    FN_2,
 | 
				
			||||||
    FN_3,
 | 
					    FN_3,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* USBKEYCODES_H */
 | 
					#endif /* USB_KEYCODES_H */
 | 
				
			||||||
							
								
								
									
										62
									
								
								usb_mouse.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								usb_mouse.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					#include <avr/interrupt.h>
 | 
				
			||||||
 | 
					#include <util/delay.h>
 | 
				
			||||||
 | 
					#include "usb_mouse.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// which buttons are currently pressed
 | 
				
			||||||
 | 
					uint8_t mouse_buttons=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// protocol setting from the host.  We use exactly the same report
 | 
				
			||||||
 | 
					// either way, so this variable only stores the setting since we
 | 
				
			||||||
 | 
					// are required to be able to report which setting is in use.
 | 
				
			||||||
 | 
					uint8_t mouse_protocol=1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Set the mouse buttons.  To create a "click", 2 calls are needed,
 | 
				
			||||||
 | 
					// one to push the button down and the second to release it
 | 
				
			||||||
 | 
					int8_t usb_mouse_buttons(uint8_t left, uint8_t middle, uint8_t right)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t mask=0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (left) mask |= 1;
 | 
				
			||||||
 | 
						if (middle) mask |= 4;
 | 
				
			||||||
 | 
						if (right) mask |= 2;
 | 
				
			||||||
 | 
						mouse_buttons = mask;
 | 
				
			||||||
 | 
						return usb_mouse_move(0, 0, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Move the mouse.  x, y and wheel are -127 to 127.  Use 0 for no movement.
 | 
				
			||||||
 | 
					int8_t usb_mouse_move(int8_t x, int8_t y, int8_t wheel)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint8_t intr_state, timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
						if (x == -128) x = -127;
 | 
				
			||||||
 | 
						if (y == -128) y = -127;
 | 
				
			||||||
 | 
						if (wheel == -128) wheel = -127;
 | 
				
			||||||
 | 
						intr_state = SREG;
 | 
				
			||||||
 | 
						cli();
 | 
				
			||||||
 | 
						UENUM = MOUSE_ENDPOINT;
 | 
				
			||||||
 | 
						timeout = UDFNUML + 50;
 | 
				
			||||||
 | 
						while (1) {
 | 
				
			||||||
 | 
							// are we ready to transmit?
 | 
				
			||||||
 | 
							if (UEINTX & (1<<RWAL)) break;
 | 
				
			||||||
 | 
							SREG = intr_state;
 | 
				
			||||||
 | 
							// has the USB gone offline?
 | 
				
			||||||
 | 
							if (!usb_configured()) return -1;
 | 
				
			||||||
 | 
							// have we waited too long?
 | 
				
			||||||
 | 
							if (UDFNUML == timeout) return -1;
 | 
				
			||||||
 | 
							// get ready to try checking again
 | 
				
			||||||
 | 
							intr_state = SREG;
 | 
				
			||||||
 | 
							cli();
 | 
				
			||||||
 | 
							UENUM = MOUSE_ENDPOINT;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						UEDATX = mouse_buttons;
 | 
				
			||||||
 | 
						UEDATX = x;
 | 
				
			||||||
 | 
						UEDATX = y;
 | 
				
			||||||
 | 
						UEDATX = wheel;
 | 
				
			||||||
 | 
						UEINTX = 0x3A;
 | 
				
			||||||
 | 
						SREG = intr_state;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										20
									
								
								usb_mouse.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								usb_mouse.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					#ifndef USB_MOUSE_H
 | 
				
			||||||
 | 
					#define  USB_MOUSE_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "usb.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MOUSE_INTERFACE		1
 | 
				
			||||||
 | 
					#define MOUSE_ENDPOINT		2
 | 
				
			||||||
 | 
					#define MOUSE_SIZE		8
 | 
				
			||||||
 | 
					#define MOUSE_BUFFER		EP_DOUBLE_BUFFER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern uint8_t mouse_buttons;
 | 
				
			||||||
 | 
					extern uint8_t mouse_protocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int8_t usb_mouse_buttons(uint8_t left, uint8_t middle, uint8_t right);
 | 
				
			||||||
 | 
					int8_t usb_mouse_move(int8_t x, int8_t y, int8_t wheel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue