~ruther/qmk_firmware

6b0c939d72c11e404f84c926cf82f9501f8511ff — tmk 14 years ago 7272c65
add a build option: USB_EXTRA_ENABLE
7 files changed, 121 insertions(+), 35 deletions(-)

M Makefile.common
M hhkb/Makefile
M key_process.c
M macway/Makefile
M macway/config.h
M usb.c
M usb_extra.h
M Makefile.common => Makefile.common +30 -10
@@ 53,15 53,18 @@ SRC =	tmk.c \
	layer.c \
	key_process.c \
	usb_keyboard.c \
	usb_mouse.c \
	usb_debug.c \
	usb_extra.c \
	usb.c \
	jump_bootloader.c \
	print.c \
	timer.c \
	util.c
SRC +=	$(TARGET_SRC)

# Option modules
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
    SRC += usb_mouse.c
endif
ifdef MOUSEKEY_ENABLE
    SRC += mousekey.c
endif


@@ 69,6 72,17 @@ ifdef PS2_MOUSE_ENABLE
    SRC += ps2.c \
	   ps2_mouse.c
endif
ifdef USB_EXTRA_ENABLE
    SRC += usb_extra.c
endif

ALL_SRC = $(SRC)
ALL_SRC += usb_mouse.c \
	   mousekey.c \
	   ps2.c \
	   ps2_mouse.c \
	   usb_extra.c


# C source file search path
VPATH = $(TARGET_DIR):$(COMMON_DIR)


@@ 127,15 141,21 @@ CSTANDARD = -std=gnu99


OPT_DEFS =
ifdef USB_NKRO_ENABLE
    OPT_DEFS += -DUSB_NKRO_ENABLE
endif
ifdef MOUSEKEY_ENABLE
    OPT_DEFS += -DMOUSEKEY_ENABLE
endif
ifdef PS2_MOUSE_ENABLE
    OPT_DEFS += -DPS2_MOUSE_ENABLE
endif
ifdef USB_EXTRA_ENABLE
    OPT_DEFS += -DUSB_EXTRA_ENABLE
endif
ifdef USB_NKRO_ENABLE
    OPT_DEFS += -DUSB_NKRO_ENABLE
endif
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
    OPT_DEFS += -DUSB_MOUSE_ENABLE
endif

# Place -D or -U options here for C sources
CDEFS = -DF_CPU=$(F_CPU)UL


@@ 622,11 642,11 @@ clean_list :
	$(REMOVE) $(TARGET).map
	$(REMOVE) $(TARGET).sym
	$(REMOVE) $(TARGET).lss
	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
	$(REMOVE) $(SRC:.c=.s)
	$(REMOVE) $(SRC:.c=.d)
	$(REMOVE) $(SRC:.c=.i)
	$(REMOVE) $(ALL_SRC:%.c=$(OBJDIR)/%.o)
	$(REMOVE) $(ALL_SRC:%.c=$(OBJDIR)/%.lst)
	$(REMOVE) $(ALL_SRC:.c=.s)
	$(REMOVE) $(ALL_SRC:.c=.d)
	$(REMOVE) $(ALL_SRC:.c=.i)
	$(REMOVEDIR) .dep



M hhkb/Makefile => hhkb/Makefile +7 -5
@@ 69,10 69,12 @@ MCU = at90usb1286      # Teensy++ 2.0
F_CPU = 16000000


# Options
#     comment out to disable
USB_NKRO_ENABLE = yes
MOUSEKEY_ENABLE = yes
#PS2_MOUSE_ENABLE = yes
# Build Options
#   comment out to disable the options.
MOUSEKEY_ENABLE = yes	# Mouse keys
#PS2_MOUSE_ENABLE = yes	# PS/2 mouse(TrackPoint) support
USB_EXTRA_ENABLE = yes	# Enhanced feature for Windows(Audio control and System control)
USB_NKRO_ENABLE = yes	# USB Nkey Rollover


include $(COMMON_DIR)/Makefile.common

M key_process.c => key_process.c +16 -3
@@ 8,8 8,6 @@
#include "util.h"
#include "jump_bootloader.h"
#include "usb_keyboard.h"
#include "usb_mouse.h"
#include "usb_extra.h"
#include "usb_keycodes.h"
#include "usb.h"
#include "layer.h"


@@ 22,6 20,12 @@
#ifdef PS2_MOUSE_ENABLE
#   include "ps2_mouse.h"
#endif
#ifdef USB_EXTRA_ENABLE
#   include "usb_extra.h"
#endif
#ifdef USB_MOUSE_ENABLE
#   include "usb_mouse.h"
#endif


// TODO: refactoring


@@ 67,6 71,7 @@ void proc_matrix(void) {
#endif
            }

#ifdef USB_EXTRA_ENABLE
            // audio control & system control
            else if (code == KB_MUTE) {
                usb_extra_audio_send(AUDIO_MUTE);


@@ 88,6 93,7 @@ void proc_matrix(void) {
                }
                _delay_ms(1000);
            }
#endif

            // normal keys
            else {


@@ 259,7 265,9 @@ void proc_matrix(void) {
                print("usb_keyboard_protocol:"); phex(usb_keyboard_protocol); print("\n");
                print("usb_keyboard_idle_config:"); phex(usb_keyboard_idle_config); print("\n");
                print("usb_keyboard_idle_count:"); phex(usb_keyboard_idle_count); print("\n");
#ifdef USB_MOUSE_ENABLE
                print("usb_mouse_protocol:"); phex(usb_mouse_protocol); print("\n");
#endif
                if (usb_keyboard_nkro) print("USB_NKRO: enabled\n"); else print("USB_NKRO: disabled\n");
                _delay_ms(500);
                break;


@@ 267,13 275,16 @@ void proc_matrix(void) {
                usb_keyboard_clear_report();
                usb_keyboard_send();
                usb_keyboard_protocol = !usb_keyboard_protocol;
                usb_mouse_protocol = !usb_mouse_protocol;
                print("keyboard protcol: ");
                if (usb_keyboard_protocol) print("report"); else print("boot");
                print("\n");

#ifdef USB_MOUSE_ENABLE
                usb_mouse_protocol = !usb_mouse_protocol;
                print("mouse protcol: ");
                if (usb_mouse_protocol) print("report"); else print("boot");
                print("\n");
#endif
                _delay_ms(1000);
                break;
#ifdef USB_NKRO_ENABLE


@@ 285,6 296,7 @@ void proc_matrix(void) {
                _delay_ms(1000);
                break;
#endif
#ifdef USB_EXTRA_ENABLE
            case KB_ESC:
                usb_keyboard_clear_report();
                usb_keyboard_send();


@@ 295,6 307,7 @@ void proc_matrix(void) {
                }
                _delay_ms(1000);
                break;
#endif
        }
    }


M macway/Makefile => macway/Makefile +8 -5
@@ 69,10 69,13 @@ MCU = atmega32u4       # Teensy 2.0
F_CPU = 16000000


# Options
#     comment out to disable
#USB_NKRO_ENABLE = yes
MOUSEKEY_ENABLE = yes
PS2_MOUSE_ENABLE = yes
# Build Options
#   comment out to disable the options.
#
MOUSEKEY_ENABLE = yes	# Mouse keys
PS2_MOUSE_ENABLE = yes	# PS/2 mouse(TrackPoint) support
USB_EXTRA_ENABLE = yes	# Enhanced feature for Windows(Audio control and System control)
#USB_NKRO_ENABLE = yes	# USB Nkey Rollover


include $(COMMON_DIR)/Makefile.common

M macway/config.h => macway/config.h +1 -1
@@ 2,7 2,7 @@
#define CONFIG_H

#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0xBEEF
#define PRODUCT_ID      0xBEE0
#define MANUFACTURER    t.m.k.
#define PRODUCT         Macway mod
#define DESCRIPTION     t.m.k. keyboard firmware for Macway mod

M usb.c => usb.c +50 -10
@@ 91,15 91,23 @@ bool suspend = false;
static const uint8_t PROGMEM endpoint_config_table[] = {
	// enable, UECFG0X(type, direction), UECFG1X(size, bank, allocation)
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(KBD_SIZE)      | KBD_BUFFER,      // 1
#ifdef USB_MOUSE_ENABLE
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(MOUSE_SIZE)    | MOUSE_BUFFER,    // 2
#else
        0,                                                                  // 2
#endif
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(DEBUG_TX_SIZE) | DEBUG_TX_BUFFER, // 3
#ifdef USB_EXTRA_ENABLE
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(EXTRA_SIZE)    | EXTRA_BUFFER,    // 4
#else
        0,                                                                  // 4
#endif
#ifdef USB_NKRO_ENABLE
	1, EP_TYPE_INTERRUPT_IN,  EP_SIZE(KBD2_SIZE)     | KBD2_BUFFER,     // 5
#else
        0, // 5
        0,                                                                  // 5
#endif
        0, // 6
        0,                                                                  // 6
};




@@ 205,6 213,7 @@ static uint8_t PROGMEM keyboard2_hid_report_desc[] = {
};
#endif

#ifdef USB_MOUSE_ENABLE
// Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension
// http://www.microchip.com/forums/tm.aspx?high=&m=391435&mpage=1#391521
// http://www.keil.com/forum/15671/


@@ 281,6 290,7 @@ static uint8_t PROGMEM mouse_hid_report_desc[] = {
    0xc0,              //   END_COLLECTION
    0xc0               // END_COLLECTION
};
#endif

static uint8_t PROGMEM debug_hid_report_desc[] = {
	0x06, 0x31, 0xFF,			// Usage Page 0xFF31 (vendor defined)


@@ 295,6 305,7 @@ static uint8_t PROGMEM debug_hid_report_desc[] = {
	0xC0					// end collection
};

#ifdef USB_EXTRA_ENABLE
// audio controls & system controls
// http://www.microsoft.com/whdc/archive/w2kbd.mspx
static uint8_t PROGMEM extra_hid_report_desc[] = {


@@ 331,18 342,37 @@ static uint8_t PROGMEM extra_hid_report_desc[] = {
    0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)
    0xc0                           // END_COLLECTION
};
#endif

#define KBD_HID_DESC_NUM                0
#define KBD_HID_DESC_OFFSET             (9+(9+9+7)*KBD_HID_DESC_NUM+9)

#ifdef USB_MOUSE_ENABLE
#   define MOUSE_HID_DESC_NUM           (KBD_HID_DESC_NUM + 1)
#   define MOUSE_HID_DESC_OFFSET        (9+(9+9+7)*MOUSE_HID_DESC_NUM+9)
#else
#   define MOUSE_HID_DESC_NUM           (KBD_HID_DESC_NUM + 0)
#endif

#define DEBUG_HID_DESC_NUM              (MOUSE_HID_DESC_NUM + 1)
#define DEBUG_HID_DESC_OFFSET           (9+(9+9+7)*DEBUG_HID_DESC_NUM+9)

#ifdef USB_EXTRA_ENABLE
#   define EXTRA_HID_DESC_NUM           (DEBUG_HID_DESC_NUM + 1)
#   define EXTRA_HID_DESC_OFFSET        (9+(9+9+7)*EXTRA_HID_DESC_NUM+9)
#else
#   define EXTRA_HID_DESC_NUM           (DEBUG_HID_DESC_NUM + 0)
#endif

#define KBD_HID_DESC_OFFSET	(9+(9+9+7)*0+9)
#define MOUSE_HID_DESC_OFFSET	(9+(9+9+7)*1+9)
#define DEBUG_HID_DESC_OFFSET	(9+(9+9+7)*2+9)
#define EXTRA_HID_DESC_OFFSET	(9+(9+9+7)*3+9)
#ifdef USB_NKRO_ENABLE
#   define NUM_INTERFACES	5
#   define KBD2_HID_DESC_OFFSET	(9+(9+9+7)*4+9)
#   define KBD2_HID_DESC_NUM            (EXTRA_HID_DESC_NUM + 1)
#   define KBD2_HID_DESC_OFFSET         (9+(9+9+7)*EXTRA_HID_DESC_NUM+9)
#else
#   define NUM_INTERFACES	4
#   define KBD2_HID_DESC_NUM            (EXTRA_HID_DESC_NUM + 0)
#endif
#define CONFIG1_DESC_SIZE	(9+(9+9+7)*NUM_INTERFACES)

#define NUM_INTERFACES                  (KBD2_HID_DESC_NUM + 1)
#define CONFIG1_DESC_SIZE               (9+(9+9+7)*NUM_INTERFACES)
static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
	// configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10
	9, 					// bLength;


@@ 382,6 412,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
	KBD_SIZE, 0,				// wMaxPacketSize
	10,					// bInterval

#ifdef USB_MOUSE_ENABLE
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
	9,					// bLength
	4,					// bDescriptorType


@@ 413,6 444,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
	0x03,					// bmAttributes (0x03=intr)
	MOUSE_SIZE, 0,				// wMaxPacketSize
	1,					// bInterval
#endif

	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
	9,					// bLength


@@ 441,6 473,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
	DEBUG_TX_SIZE, 0,			// wMaxPacketSize
	1,					// bInterval

#ifdef USB_EXTRA_ENABLE
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12
	9,					// bLength
	4,					// bDescriptorType


@@ 467,6 500,7 @@ static uint8_t PROGMEM config1_descriptor[CONFIG1_DESC_SIZE] = {
	0x03,					// bmAttributes (0x03=intr)
	EXTRA_SIZE, 0,				// wMaxPacketSize
	10,					// bInterval
#endif

#ifdef USB_NKRO_ENABLE
	// interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12


@@ 537,12 571,16 @@ static struct descriptor_list_struct {
        // HID/REPORT descriptors
	{0x2100, KBD_INTERFACE, config1_descriptor+KBD_HID_DESC_OFFSET, 9},
	{0x2200, KBD_INTERFACE, keyboard_hid_report_desc, sizeof(keyboard_hid_report_desc)},
#ifdef USB_MOUSE_ENABLE
	{0x2100, MOUSE_INTERFACE, config1_descriptor+MOUSE_HID_DESC_OFFSET, 9},
	{0x2200, MOUSE_INTERFACE, mouse_hid_report_desc, sizeof(mouse_hid_report_desc)},
#endif
	{0x2100, DEBUG_INTERFACE, config1_descriptor+DEBUG_HID_DESC_OFFSET, 9},
	{0x2200, DEBUG_INTERFACE, debug_hid_report_desc, sizeof(debug_hid_report_desc)},
#ifdef USB_EXTRA_ENABLE
	{0x2100, EXTRA_INTERFACE, config1_descriptor+EXTRA_HID_DESC_OFFSET, 9},
	{0x2200, EXTRA_INTERFACE, extra_hid_report_desc, sizeof(extra_hid_report_desc)},
#endif
#ifdef USB_NKRO_ENABLE
	{0x2100, KBD2_INTERFACE, config1_descriptor+KBD2_HID_DESC_OFFSET, 9},
	{0x2200, KBD2_INTERFACE, keyboard2_hid_report_desc, sizeof(keyboard2_hid_report_desc)},


@@ 879,6 917,7 @@ ISR(USB_COM_vect)
				}
			}
		}
#ifdef USB_MOUSE_ENABLE
		if (wIndex == MOUSE_INTERFACE) {
			if (bmRequestType == 0xA1) {
				if (bRequest == HID_GET_REPORT) {


@@ 913,6 952,7 @@ ISR(USB_COM_vect)
				}
			}
		}
#endif
		if (wIndex == DEBUG_INTERFACE) {
			if (bRequest == HID_GET_REPORT && bmRequestType == 0xA1) {
				len = wLength;

M usb_extra.h => usb_extra.h +9 -1
@@ 1,5 1,11 @@
#ifndef USB_EXTRA_H
#define  USB_EXTRA_H 1
/*
 * Enhanced keyboard features for Windows:
 * Audio control and System control
 *
 * http://www.microsoft.com/whdc/archive/w2kbd.mspx
 */

#include <stdint.h>
#include "usb.h"


@@ 10,11 16,13 @@
#define EXTRA_SIZE		2
#define EXTRA_BUFFER		EP_DOUBLE_BUFFER

// http://www.microsoft.com/whdc/archive/w2kbd.mspx

// Consumer Page(0x0C) Consumer Control(0x01)
#define AUDIO_VOL_UP		(1<<0)
#define AUDIO_VOL_DOWN		(1<<1)
#define AUDIO_MUTE		(1<<2)

// Generic Desktop Page(0x01) System Control(0x80)
#define SYSTEM_POWER_DOWN	(1<<0)
#define SYSTEM_SLEEP		(1<<1)
#define SYSTEM_WAKE_UP		(1<<2)