- add LUFA boot mouse feature - remove report_id from mouse report - fix LUFA descriptortags/v1.9
@@ -82,15 +82,14 @@ typedef struct { | |||
uint8_t mods; | |||
uint8_t rserved; | |||
uint8_t keys[REPORT_KEYS]; | |||
} report_keyboard_t; | |||
} __attribute__ ((packed)) report_keyboard_t; | |||
typedef struct { | |||
uint8_t report_id; | |||
uint8_t buttons; | |||
int8_t x; | |||
int8_t y; | |||
int8_t v; | |||
int8_t h; | |||
} report_mouse_t; | |||
} __attribute__ ((packed)) report_mouse_t; | |||
#endif |
@@ -132,6 +132,14 @@ SRC += keymap.c \ | |||
CONFIG_H = config.h | |||
# Build Options | |||
# comment out to disable the options. | |||
# | |||
MOUSEKEY_ENABLE = yes # Mouse keys | |||
#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support | |||
#EXTRAKEY_ENABLE = yes # Audio control and System control | |||
#NKRO_ENABLE = yes # USB Nkey Rollover | |||
# LUFA library compile-time options and predefined tokens | |||
LUFA_OPTS = -D USB_DEVICE_ONLY |
@@ -111,7 +111,7 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = | |||
HID_RI_END_COLLECTION(0), | |||
}; | |||
const USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] = | |||
const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = | |||
{ | |||
HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */ | |||
HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */ | |||
@@ -180,7 +180,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
/* | |||
* Keyboard | |||
*/ | |||
.HID0_KeyboardInterface = | |||
.Keyboard_Interface = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |||
@@ -196,7 +196,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.InterfaceStrIndex = NO_DESCRIPTOR | |||
}, | |||
.HID0_KeyboardHID = | |||
.Keyboard_HID = | |||
{ | |||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |||
@@ -207,7 +207,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.HIDReportLength = sizeof(KeyboardReport) | |||
}, | |||
.HID0_ReportINEndpoint = | |||
.Keyboard_INEndpoint = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |||
@@ -220,7 +220,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
/* | |||
* Mouse | |||
*/ | |||
.HID1_MouseInterface = | |||
.Mouse_Interface = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |||
@@ -236,7 +236,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.InterfaceStrIndex = NO_DESCRIPTOR | |||
}, | |||
.HID1_MouseHID = | |||
.Mouse_HID = | |||
{ | |||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |||
@@ -247,7 +247,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.HIDReportLength = sizeof(MouseReport) | |||
}, | |||
.HID1_ReportINEndpoint = | |||
.Mouse_INEndpoint = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |||
@@ -258,9 +258,9 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
}, | |||
/* | |||
* Generic | |||
* Console | |||
*/ | |||
.HID2_GenericInterface = | |||
.Console_Interface = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | |||
@@ -276,7 +276,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.InterfaceStrIndex = NO_DESCRIPTOR | |||
}, | |||
.HID2_GenericHID = | |||
.Console_HID = | |||
{ | |||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | |||
@@ -284,10 +284,10 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.CountryCode = 0x00, | |||
.TotalReportDescriptors = 1, | |||
.HIDReportType = HID_DTYPE_Report, | |||
.HIDReportLength = sizeof(GenericReport) | |||
.HIDReportLength = sizeof(ConsoleReport) | |||
}, | |||
.HID2_ReportINEndpoint = | |||
.Console_INEndpoint = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |||
@@ -297,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = | |||
.PollingIntervalMS = 0x01 | |||
}, | |||
.HID2_ReportOUTEndpoint = | |||
.Console_OUTEndpoint = | |||
{ | |||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | |||
@@ -380,15 +380,15 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | |||
case HID_DTYPE_HID: | |||
switch (wIndex) { | |||
case KEYBOARD_INTERFACE: | |||
Address = &ConfigurationDescriptor.HID0_KeyboardHID; | |||
Address = &ConfigurationDescriptor.Keyboard_HID; | |||
Size = sizeof(USB_HID_Descriptor_HID_t); | |||
break; | |||
case MOUSE_INTERFACE: | |||
Address = &ConfigurationDescriptor.HID1_MouseHID; | |||
Address = &ConfigurationDescriptor.Mouse_HID; | |||
Size = sizeof(USB_HID_Descriptor_HID_t); | |||
break; | |||
case GENERIC_INTERFACE: | |||
Address = &ConfigurationDescriptor.HID2_GenericHID; | |||
Address = &ConfigurationDescriptor.Console_HID; | |||
Size = sizeof(USB_HID_Descriptor_HID_t); | |||
break; | |||
} | |||
@@ -404,8 +404,8 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | |||
Size = sizeof(MouseReport); | |||
break; | |||
case GENERIC_INTERFACE: | |||
Address = &GenericReport; | |||
Size = sizeof(GenericReport); | |||
Address = &ConsoleReport; | |||
Size = sizeof(ConsoleReport); | |||
break; | |||
} | |||
break; |
@@ -46,20 +46,20 @@ typedef struct | |||
USB_Descriptor_Configuration_Header_t Config; | |||
// Keyboard HID Interface | |||
USB_Descriptor_Interface_t HID0_KeyboardInterface; | |||
USB_HID_Descriptor_HID_t HID0_KeyboardHID; | |||
USB_Descriptor_Endpoint_t HID0_ReportINEndpoint; | |||
USB_Descriptor_Interface_t Keyboard_Interface; | |||
USB_HID_Descriptor_HID_t Keyboard_HID; | |||
USB_Descriptor_Endpoint_t Keyboard_INEndpoint; | |||
// Mouse HID Interface | |||
USB_Descriptor_Interface_t HID1_MouseInterface; | |||
USB_HID_Descriptor_HID_t HID1_MouseHID; | |||
USB_Descriptor_Endpoint_t HID1_ReportINEndpoint; | |||
// Generic HID Interface | |||
USB_Descriptor_Interface_t HID2_GenericInterface; | |||
USB_HID_Descriptor_HID_t HID2_GenericHID; | |||
USB_Descriptor_Endpoint_t HID2_ReportINEndpoint; | |||
USB_Descriptor_Endpoint_t HID2_ReportOUTEndpoint; | |||
USB_Descriptor_Interface_t Mouse_Interface; | |||
USB_HID_Descriptor_HID_t Mouse_HID; | |||
USB_Descriptor_Endpoint_t Mouse_INEndpoint; | |||
// Console HID Interface | |||
USB_Descriptor_Interface_t Console_Interface; | |||
USB_HID_Descriptor_HID_t Console_HID; | |||
USB_Descriptor_Endpoint_t Console_INEndpoint; | |||
USB_Descriptor_Endpoint_t Console_OUTEndpoint; | |||
} USB_Descriptor_Configuration_t; | |||
@@ -68,7 +68,7 @@ static host_driver_t lufa_driver = { | |||
static void SetupHardware(void); | |||
static void Generic_HID_Task(void); | |||
static void Console_HID_Task(void); | |||
int main(void) | |||
{ | |||
@@ -93,7 +93,7 @@ int main(void) | |||
while (1) { | |||
keyboard_proc(); | |||
Generic_HID_Task(); | |||
Console_HID_Task(); | |||
USB_USBTask(); | |||
} | |||
} | |||
@@ -110,7 +110,7 @@ void SetupHardware(void) | |||
USB_Init(); | |||
} | |||
static void Generic_HID_Task(void) | |||
static void Console_HID_Task(void) | |||
{ | |||
/* Device must be connected and configured for the task to run */ | |||
if (USB_DeviceState != DEVICE_STATE_Configured) | |||
@@ -126,13 +126,13 @@ static void Generic_HID_Task(void) | |||
if (Endpoint_IsReadWriteAllowed()) | |||
{ | |||
/* Create a temporary buffer to hold the read in report from the host */ | |||
uint8_t GenericData[GENERIC_REPORT_SIZE]; | |||
uint8_t ConsoleData[GENERIC_REPORT_SIZE]; | |||
/* Read Generic Report Data */ | |||
Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL); | |||
/* Read Console Report Data */ | |||
Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL); | |||
/* Process Generic Report Data */ | |||
//ProcessGenericHIDReport(GenericData); | |||
/* Process Console Report Data */ | |||
//ProcessConsoleHIDReport(ConsoleData); | |||
} | |||
/* Finalize the stream transfer to send the last packet */ | |||
@@ -175,13 +175,26 @@ void EVENT_USB_Device_ConfigurationChanged(void) | |||
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | |||
HID_EPSIZE, ENDPOINT_BANK_SINGLE); | |||
/* Setup Generic HID Report Endpoints */ | |||
/* Setup Console HID Report Endpoints */ | |||
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | |||
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); | |||
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, | |||
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); | |||
} | |||
/* | |||
Appendix G: HID Request Support Requirements | |||
The following table enumerates the requests that need to be supported by various types of HID class devices. | |||
Device type GetReport SetReport GetIdle SetIdle GetProtocol SetProtocol | |||
------------------------------------------------------------------------------------------ | |||
Boot Mouse Required Optional Optional Optional Required Required | |||
Non-Boot Mouse Required Optional Optional Optional Optional Optional | |||
Boot Keyboard Required Optional Required Required Required Required | |||
Non-Boot Keybrd Required Optional Required Required Optional Optional | |||
Other Device Required Optional Optional Optional Optional Optional | |||
*/ | |||
/** Event handler for the USB_ControlRequest event. | |||
* This is fired before passing along unhandled control requests to the library for processing internally. | |||
*/ | |||
@@ -288,7 +301,12 @@ static void send_mouse(report_mouse_t *report) | |||
if (Endpoint_IsReadWriteAllowed()) | |||
{ | |||
/* Write Mouse Report Data */ | |||
Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL); | |||
/* Mouse report data structure | |||
* LUFA: { buttons, x, y } | |||
* tmk: { buttons, x, y, v, h } | |||
*/ | |||
//Endpoint_Write_Stream_LE((uint8_t *)report+1, 3, NULL); | |||
Endpoint_Write_Stream_LE(report, 3, NULL); | |||
/* Finalize the stream transfer to send the last packet */ | |||
Endpoint_ClearIN(); |
@@ -62,6 +62,11 @@ int main(void) | |||
debug("initForUsbConnectivity()\n"); | |||
initForUsbConnectivity(); | |||
int i; | |||
while(--i){ /* To configured */ | |||
usbPoll(); | |||
_delay_ms(1); | |||
} | |||
debug("main loop\n"); | |||
while (1) { | |||
@@ -90,10 +95,15 @@ int main(void) | |||
} | |||
} | |||
#endif | |||
if (!suspended) | |||
if (!suspended) { | |||
usbPoll(); | |||
keyboard_proc(); | |||
if (!suspended) | |||
// TODO: configuration process is incosistent. it sometime fails. | |||
// To prevent failing to configure NOT scan keyboard during configuration | |||
if (usbConfiguration && usbInterruptIsReady()) { | |||
keyboard_proc(); | |||
} | |||
vusb_transfer_keyboard(); | |||
} | |||
} | |||
} |
@@ -91,23 +91,48 @@ static void send_keyboard(report_keyboard_t *report) | |||
} | |||
typedef struct { | |||
uint8_t report_id; | |||
report_mouse_t report; | |||
} __attribute__ ((packed)) vusb_mouse_report_t; | |||
static void send_mouse(report_mouse_t *report) | |||
{ | |||
report->report_id = REPORT_ID_MOUSE; | |||
vusb_mouse_report_t r = { | |||
.report_id = REPORT_ID_MOUSE, | |||
.report = *report | |||
}; | |||
if (usbInterruptIsReady3()) { | |||
usbSetInterrupt3((void *)report, sizeof(*report)); | |||
usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t)); | |||
} | |||
} | |||
/* | |||
typedef struct { | |||
uint8_t report_id; | |||
uint8_t data0; | |||
uint8_t data1; | |||
} __attribute__ ((packed)) vusb_system_report_t; | |||
*/ | |||
static void send_system(uint16_t data) | |||
{ | |||
/* | |||
// Not need static? | |||
static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 }; | |||
report[1] = data&0xFF; | |||
report[2] = (data>>8)&0xFF; | |||
*/ | |||
/* | |||
vusb_system_report_t r = { | |||
.report_id = REPORT_ID_SYSTEM, | |||
.data0 = data&0xFF, | |||
.data1 = (data>>8)&0xFF | |||
}; | |||
if (usbInterruptIsReady3()) { | |||
usbSetInterrupt3((void *)&report, sizeof(report)); | |||
usbSetInterrupt3((void *)&r, sizeof(vusb_system_report_t)); | |||
} | |||
*/ | |||
} | |||
static void send_consumer(uint16_t data) |