Commit c21c583a1de9c1033252ef51929398ddc237a7c0

Authored by balrog
1 parent 0266f2c7

Fix USB and HID report descriptors for mouse and tablet.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4253 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 17 additions and 18 deletions
hw/usb-hid.c
@@ -134,14 +134,14 @@ static const uint8_t qemu_mouse_config_descriptor[] = { @@ -134,14 +134,14 @@ static const uint8_t qemu_mouse_config_descriptor[] = {
134 0x00, /* u8 country_code */ 134 0x00, /* u8 country_code */
135 0x01, /* u8 num_descriptors */ 135 0x01, /* u8 num_descriptors */
136 0x22, /* u8 type; Report */ 136 0x22, /* u8 type; Report */
137 - 50, 0, /* u16 len */ 137 + 52, 0, /* u16 len */
138 138
139 /* one endpoint (status change endpoint) */ 139 /* one endpoint (status change endpoint) */
140 0x07, /* u8 ep_bLength; */ 140 0x07, /* u8 ep_bLength; */
141 0x05, /* u8 ep_bDescriptorType; Endpoint */ 141 0x05, /* u8 ep_bDescriptorType; Endpoint */
142 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */ 142 0x81, /* u8 ep_bEndpointAddress; IN Endpoint 1 */
143 0x03, /* u8 ep_bmAttributes; Interrupt */ 143 0x03, /* u8 ep_bmAttributes; Interrupt */
144 - 0x03, 0x00, /* u16 ep_wMaxPacketSize; */ 144 + 0x04, 0x00, /* u16 ep_wMaxPacketSize; */
145 0x0a, /* u8 ep_bInterval; (255ms -- usb 2.0 spec) */ 145 0x0a, /* u8 ep_bInterval; (255ms -- usb 2.0 spec) */
146 }; 146 };
147 147
@@ -260,16 +260,14 @@ static const uint8_t qemu_mouse_hid_report_descriptor[] = { @@ -260,16 +260,14 @@ static const uint8_t qemu_mouse_hid_report_descriptor[] = {
260 0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 260 0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03,
261 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 261 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01,
262 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x01, 262 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x01,
263 - 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x15, 0x81,  
264 - 0x25, 0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x06,  
265 - 0x05, 0x01, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F,  
266 - 0x35, 0x00, 0x45, 0x00, 0x75, 0x08, 0x95, 0x01,  
267 - 0x81, 0x02, 0xC0, 0xC0, 263 + 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x09, 0x38,
  264 + 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x03,
  265 + 0x81, 0x06, 0xC0, 0xC0,
268 }; 266 };
269 267
270 static const uint8_t qemu_tablet_hid_report_descriptor[] = { 268 static const uint8_t qemu_tablet_hid_report_descriptor[] = {
271 0x05, 0x01, /* Usage Page Generic Desktop */ 269 0x05, 0x01, /* Usage Page Generic Desktop */
272 - 0x09, 0x01, /* Usage Mouse */ 270 + 0x09, 0x01, /* Usage Pointer */
273 0xA1, 0x01, /* Collection Application */ 271 0xA1, 0x01, /* Collection Application */
274 0x09, 0x01, /* Usage Pointer */ 272 0x09, 0x01, /* Usage Pointer */
275 0xA1, 0x00, /* Collection Physical */ 273 0xA1, 0x00, /* Collection Physical */
@@ -283,7 +281,7 @@ static const uint8_t qemu_tablet_hid_report_descriptor[] = { @@ -283,7 +281,7 @@ static const uint8_t qemu_tablet_hid_report_descriptor[] = {
283 0x81, 0x02, /* Input (Data, Var, Abs) */ 281 0x81, 0x02, /* Input (Data, Var, Abs) */
284 0x95, 0x01, /* Report Count 1 */ 282 0x95, 0x01, /* Report Count 1 */
285 0x75, 0x05, /* Report Size 5 */ 283 0x75, 0x05, /* Report Size 5 */
286 - 0x81, 0x01, /* Input (Cnst, Var, Abs) */ 284 + 0x81, 0x01, /* Input (Cnst, Array, Abs) */
287 0x05, 0x01, /* Usage Page Generic Desktop */ 285 0x05, 0x01, /* Usage Page Generic Desktop */
288 0x09, 0x30, /* Usage X */ 286 0x09, 0x30, /* Usage X */
289 0x09, 0x31, /* Usage Y */ 287 0x09, 0x31, /* Usage Y */
@@ -302,7 +300,7 @@ static const uint8_t qemu_tablet_hid_report_descriptor[] = { @@ -302,7 +300,7 @@ static const uint8_t qemu_tablet_hid_report_descriptor[] = {
302 0x45, 0x00, /* Physical Maximum 0 (same as logical) */ 300 0x45, 0x00, /* Physical Maximum 0 (same as logical) */
303 0x75, 0x08, /* Report Size 8 */ 301 0x75, 0x08, /* Report Size 8 */
304 0x95, 0x01, /* Report Count 1 */ 302 0x95, 0x01, /* Report Count 1 */
305 - 0x81, 0x02, /* Input (Data, Var, Rel) */ 303 + 0x81, 0x06, /* Input (Data, Var, Rel) */
306 0xC0, /* End Collection */ 304 0xC0, /* End Collection */
307 0xC0, /* End Collection */ 305 0xC0, /* End Collection */
308 }; 306 };
@@ -495,14 +493,15 @@ static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len) @@ -495,14 +493,15 @@ static int usb_mouse_poll(USBHIDState *hs, uint8_t *buf, int len)
495 if (s->buttons_state & MOUSE_EVENT_MBUTTON) 493 if (s->buttons_state & MOUSE_EVENT_MBUTTON)
496 b |= 0x04; 494 b |= 0x04;
497 495
498 - buf[0] = b;  
499 - buf[1] = dx;  
500 - buf[2] = dy;  
501 - l = 3;  
502 - if (len >= 4) {  
503 - buf[3] = dz;  
504 - l = 4;  
505 - } 496 + l = 0;
  497 + if (len > l)
  498 + buf[l ++] = b;
  499 + if (len > l)
  500 + buf[l ++] = dx;
  501 + if (len > l)
  502 + buf[l ++] = dy;
  503 + if (len > l)
  504 + buf[l ++] = dz;
506 return l; 505 return l;
507 } 506 }
508 507