diff --git a/common/report.h b/common/report.h index b85b86c5..45f5c0b8 100644 --- a/common/report.h +++ b/common/report.h @@ -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 diff --git a/protocol/vusb/main.c b/protocol/vusb/main.c index 1bf9035b..1ba40a27 100644 --- a/protocol/vusb/main.c +++ b/protocol/vusb/main.c @@ -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(); + } } } diff --git a/protocol/vusb/vusb.c b/protocol/vusb/vusb.c index 0bfe21e9..1dff5dea 100644 --- a/protocol/vusb/vusb.c +++ b/protocol/vusb/vusb.c @@ -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)