TARGET_DIR = . | TARGET_DIR = . | ||||
# keyboard dependent files | # keyboard dependent files | ||||
SRC = keymap.c \ | |||||
SRC = keymap_common.c \ | |||||
matrix.c \ | matrix.c \ | ||||
led.c | led.c | ||||
ifdef KEYMAP | |||||
SRC := keymap_$(KEYMAP).c $(SRC) | |||||
else | |||||
SRC := keymap_plain.c $(SRC) | |||||
endif | |||||
# Use USART for PS/2. With V-USB INT and BUSYWAIT code is not useful. | # Use USART for PS/2. With V-USB INT and BUSYWAIT code is not useful. | ||||
SRC += protocol/ps2_usart.c | SRC += protocol/ps2_usart.c | ||||
OPT_DEFS += -DPS2_USE_USART | OPT_DEFS += -DPS2_USE_USART | ||||
VPATH += $(TOP_DIR) | VPATH += $(TOP_DIR) | ||||
include $(TOP_DIR)/protocol/vusb.mk | |||||
include $(TOP_DIR)/protocol.mk | include $(TOP_DIR)/protocol.mk | ||||
include $(TOP_DIR)/common.mk | include $(TOP_DIR)/common.mk | ||||
include $(TOP_DIR)/protocol/vusb.mk | |||||
include $(TOP_DIR)/rules.mk | include $(TOP_DIR)/rules.mk |
#if USB_CFG_DESCR_PROPS_STRING_0 == 0 | #if USB_CFG_DESCR_PROPS_STRING_0 == 0 | ||||
#undef USB_CFG_DESCR_PROPS_STRING_0 | #undef USB_CFG_DESCR_PROPS_STRING_0 | ||||
#define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0) | #define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0) | ||||
PROGMEM char usbDescriptorString0[] = { /* language descriptor */ | |||||
const PROGMEM char usbDescriptorString0[] = { /* language descriptor */ | |||||
4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */ | 4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */ | ||||
3, /* descriptor type */ | 3, /* descriptor type */ | ||||
0x09, 0x04, /* language index (0x0409 = US-English) */ | 0x09, 0x04, /* language index (0x0409 = US-English) */ | ||||
#if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN | #if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN | ||||
#undef USB_CFG_DESCR_PROPS_STRING_VENDOR | #undef USB_CFG_DESCR_PROPS_STRING_VENDOR | ||||
#define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor) | #define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor) | ||||
PROGMEM int usbDescriptorStringVendor[] = { | |||||
const PROGMEM int usbDescriptorStringVendor[] = { | |||||
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN), | USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN), | ||||
USB_CFG_VENDOR_NAME | USB_CFG_VENDOR_NAME | ||||
}; | }; | ||||
#if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN | #if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN | ||||
#undef USB_CFG_DESCR_PROPS_STRING_PRODUCT | #undef USB_CFG_DESCR_PROPS_STRING_PRODUCT | ||||
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice) | #define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice) | ||||
PROGMEM int usbDescriptorStringDevice[] = { | |||||
const PROGMEM int usbDescriptorStringDevice[] = { | |||||
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN), | USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN), | ||||
USB_CFG_DEVICE_NAME | USB_CFG_DEVICE_NAME | ||||
}; | }; | ||||
#if USB_CFG_DESCR_PROPS_DEVICE == 0 | #if USB_CFG_DESCR_PROPS_DEVICE == 0 | ||||
#undef USB_CFG_DESCR_PROPS_DEVICE | #undef USB_CFG_DESCR_PROPS_DEVICE | ||||
#define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice) | #define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice) | ||||
PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */ | |||||
const PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */ | |||||
18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */ | 18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */ | ||||
USBDESCR_DEVICE, /* descriptor type */ | USBDESCR_DEVICE, /* descriptor type */ | ||||
0x10, 0x01, /* USB version supported */ | 0x10, 0x01, /* USB version supported */ |
#if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
char usbDescriptorDevice[]; | |||||
const char usbDescriptorDevice[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
char usbDescriptorConfiguration[]; | |||||
const char usbDescriptorConfiguration[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
char usbDescriptorHidReport[]; | |||||
const char usbDescriptorHidReport[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
char usbDescriptorString0[]; | |||||
const char usbDescriptorString0[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
int usbDescriptorStringVendor[]; | |||||
const int usbDescriptorStringVendor[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
int usbDescriptorStringDevice[]; | |||||
const int usbDescriptorStringDevice[]; | |||||
extern | extern | ||||
#if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM) | #if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM) | ||||
PROGMEM | PROGMEM | ||||
#endif | #endif | ||||
int usbDescriptorStringSerialNumber[]; | |||||
const int usbDescriptorStringSerialNumber[]; | |||||
#endif /* __ASSEMBLER__ */ | #endif /* __ASSEMBLER__ */ | ||||
static uint8_t kbuf_head = 0; | static uint8_t kbuf_head = 0; | ||||
static uint8_t kbuf_tail = 0; | static uint8_t kbuf_tail = 0; | ||||
typedef struct { | |||||
uint8_t modifier; | |||||
uint8_t reserved; | |||||
uint8_t keycode[6]; | |||||
} keyboard_report_t; | |||||
static keyboard_report_t keyboard_report; // sent to PC | |||||
/* transfer keyboard report from buffer */ | /* transfer keyboard report from buffer */ | ||||
void vusb_transfer_keyboard(void) | void vusb_transfer_keyboard(void) | ||||
if(rq->bRequest == USBRQ_HID_GET_REPORT){ | if(rq->bRequest == USBRQ_HID_GET_REPORT){ | ||||
debug("GET_REPORT:"); | debug("GET_REPORT:"); | ||||
/* we only have one report type, so don't look at wValue */ | /* we only have one report type, so don't look at wValue */ | ||||
usbMsgPtr = (void *)keyboard_report; | |||||
return sizeof(*keyboard_report); | |||||
usbMsgPtr = (void *)&keyboard_report; | |||||
return sizeof(keyboard_report); | |||||
}else if(rq->bRequest == USBRQ_HID_GET_IDLE){ | }else if(rq->bRequest == USBRQ_HID_GET_IDLE){ | ||||
debug("GET_IDLE: "); | debug("GET_IDLE: "); | ||||
//debug_hex(vusb_idle_rate); | //debug_hex(vusb_idle_rate); | ||||
* | * | ||||
* from an example in HID spec appendix | * from an example in HID spec appendix | ||||
*/ | */ | ||||
PROGMEM uchar keyboard_hid_report[] = { | |||||
const PROGMEM uchar keyboard_hid_report[] = { | |||||
0x05, 0x01, // Usage Page (Generic Desktop), | 0x05, 0x01, // Usage Page (Generic Desktop), | ||||
0x09, 0x06, // Usage (Keyboard), | 0x09, 0x06, // Usage (Keyboard), | ||||
0xA1, 0x01, // Collection (Application), | 0xA1, 0x01, // Collection (Application), | ||||
* http://www.keil.com/forum/15671/ | * http://www.keil.com/forum/15671/ | ||||
* http://www.microsoft.com/whdc/device/input/wheel.mspx | * http://www.microsoft.com/whdc/device/input/wheel.mspx | ||||
*/ | */ | ||||
PROGMEM uchar mouse_hid_report[] = { | |||||
const PROGMEM uchar mouse_hid_report[] = { | |||||
/* mouse */ | /* mouse */ | ||||
0x05, 0x01, // USAGE_PAGE (Generic Desktop) | 0x05, 0x01, // USAGE_PAGE (Generic Desktop) | ||||
0x09, 0x02, // USAGE (Mouse) | 0x09, 0x02, // USAGE (Mouse) | ||||
* contains: device, interface, HID and endpoint descriptors | * contains: device, interface, HID and endpoint descriptors | ||||
*/ | */ | ||||
#if USB_CFG_DESCR_PROPS_CONFIGURATION | #if USB_CFG_DESCR_PROPS_CONFIGURATION | ||||
PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */ | |||||
const PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */ | |||||
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */ | 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */ | ||||
USBDESCR_CONFIG, /* descriptor type */ | USBDESCR_CONFIG, /* descriptor type */ | ||||
9 + (9 + 9 + 7) + (9 + 9 + 7), 0, | 9 + (9 + 9 + 7) + (9 + 9 + 7), 0, |