Changeset 90993 in vbox
- Timestamp:
- Aug 30, 2021 10:39:02 AM (3 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Input/UsbMouse.cpp (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Input/UsbMouse.cpp
r82968 r90993 300 300 uint16_t y; 301 301 } USBHIDMT_REPORT_POINTER; 302 303 typedef union USBHIDALL_REPORT 304 { 305 USBHIDM_REPORT m; 306 USBHIDT_REPORT t; 307 USBHIDMT_REPORT mt; 308 USBHIDMT_REPORT_POINTER mp; 309 } USBHIDALL_REPORT, *PUSBHIDALL_REPORT; 310 302 311 #pragma pack() 303 312 … … 1135 1144 1136 1145 /** 1137 * Completes the URB with a OK state.1138 * /1139 static int usbHidCompleteOk(PUSBHID pThis, PVUSBURB pUrb, size_t cbData) 1140 { 1141 LogRelFlow(("usbHidCompleteOk/#%u: pUrb=%p:%s cbData=%#zx\n", 1142 pThis->pUsbIns->iInstance, pUrb, pUrb->pszDesc, cbData));1146 * Completes the URB after device successfully processed it. Optionally copies data 1147 * into the URB. May still generate an error if the URB is not big enough. 1148 */ 1149 static int usbHidCompleteOk(PUSBHID pThis, PVUSBURB pUrb, const void *pSrc, size_t cbSrc) 1150 { 1151 Log(("usbHidCompleteOk/#%u: pUrb=%p:%s (cbData=%#x) cbSrc=%#zx\n", pThis->pUsbIns->iInstance, pUrb, pUrb->pszDesc, pUrb->cbData, cbSrc)); 1143 1152 1144 1153 pUrb->enmStatus = VUSBSTATUS_OK; 1145 pUrb->cbData = (uint32_t)cbData; 1154 size_t cbCopy = 0; 1155 size_t cbSetup = 0; 1156 1157 if (pSrc) /* Can be NULL if not copying anything. */ 1158 { 1159 Assert(cbSrc); 1160 uint8_t *pDst = pUrb->abData; 1161 1162 /* Returned data is written after the setup message in control URBs. */ 1163 if (pUrb->enmType == VUSBXFERTYPE_MSG) 1164 cbSetup = sizeof(VUSBSETUP); 1165 1166 Assert(pUrb->cbData >= cbSetup); /* Only triggers if URB is corrupted. */ 1167 1168 if (pUrb->cbData > cbSetup) 1169 { 1170 /* There is at least one byte of room in the URB. */ 1171 cbCopy = RT_MIN(pUrb->cbData - cbSetup, cbSrc); 1172 memcpy(pDst + cbSetup, pSrc, cbCopy); 1173 pUrb->cbData = (uint32_t)(cbCopy + cbSetup); 1174 Log(("Copied %zu bytes to pUrb->abData[%zu], source had %zu bytes\n", cbCopy, cbSetup, cbSrc)); 1175 } 1176 1177 /* Need to check length differences. If cbSrc is less than what 1178 * the URB has space for, it'll be resolved as a short packet. But 1179 * if cbSrc is bigger, there is a real problem and the host needs 1180 * to see an overrun/babble error. 1181 */ 1182 if (RT_UNLIKELY(cbSrc > cbCopy)) 1183 pUrb->enmStatus = VUSBSTATUS_DATA_OVERRUN; 1184 } 1185 else 1186 Assert(cbSrc == 0); /* Make up your mind, caller! */ 1146 1187 1147 1188 usbHidLinkDone(pThis, pUrb); … … 1193 1234 1194 1235 if (pUrb) 1195 return usbHidCompleteOk(pThis, pUrb, 0);1236 return usbHidCompleteOk(pThis, pUrb, NULL, 0); 1196 1237 return VINF_SUCCESS; 1197 1238 } … … 1341 1382 1342 1383 /* Report current state. */ 1343 USBHIDMT_REPORT *p = (USBHIDMT_REPORT *)&pUrb->abData[0]; 1384 USBHIDMT_REPORT r; 1385 USBHIDMT_REPORT *p = &r; 1344 1386 RT_ZERO(*p); 1345 1387 … … 1399 1441 1400 1442 LogRel3(("usbHid: reporting touch contact:\n%.*Rhxd\n", sizeof(USBHIDMT_REPORT), p)); 1401 return usbHidCompleteOk(pThis, pUrb, sizeof(USBHIDMT_REPORT));1443 return usbHidCompleteOk(pThis, pUrb, p, sizeof(USBHIDMT_REPORT)); 1402 1444 } 1403 1445 … … 1419 1461 if (pUrb) 1420 1462 { 1421 PUSBHIDTM_REPORT pReport = (PUSBHIDTM_REPORT)&pUrb->abData[0]; 1463 USBHIDTM_REPORT report; 1464 PUSBHIDTM_REPORT pReport = &report; 1422 1465 size_t cbCopy; 1423 1466 1424 1467 cbCopy = usbHidFillReport(pReport, &pThis->PtrDelta, pThis->enmMode); 1425 1468 pThis->fHasPendingChanges = false; 1426 return usbHidCompleteOk(pThis, pUrb, cbCopy);1469 return usbHidCompleteOk(pThis, pUrb, pReport, cbCopy); 1427 1470 } 1428 1471 else … … 1764 1807 AssertFailed(); 1765 1808 LogRelFlow(("usbHidHandleIntrDevToHost: Entering STATUS\n")); 1766 return usbHidCompleteOk(pThis, pUrb, 0);1809 return usbHidCompleteOk(pThis, pUrb, NULL, 0); 1767 1810 } 1768 1811 … … 1775 1818 LogRelFlow(("usbHidHandleIntrDevToHost: Entering READY\n")); 1776 1819 pThis->enmState = USBHIDREQSTATE_READY; 1777 return usbHidCompleteOk(pThis, pUrb, 0);1820 return usbHidCompleteOk(pThis, pUrb, NULL, 0); 1778 1821 } 1779 1822 … … 1804 1847 #define SET_PROTOCOL 0x0B 1805 1848 1806 static uint8_t const g_abQASampleBlob[256] = 1807 { 1849 static uint8_t const g_abQASampleBlob[256 + 1] = 1850 { 1851 REPORTID_TOUCH_QABLOB, /* Report Id. */ 1808 1852 0xfc, 0x28, 0xfe, 0x84, 0x40, 0xcb, 0x9a, 0x87, 1809 1853 0x0d, 0xbe, 0x57, 0x3c, 0xb6, 0x70, 0x09, 0x88, … … 1867 1911 if (pSetup->bRequest == GET_REPORT) 1868 1912 { 1869 uint32_t cbData = 0; /* 0 means that the report is unsupported. */ 1913 uint8_t abData[sizeof(USBHIDALL_REPORT)]; 1914 uint8_t *pData = (uint8_t *)&abData; 1915 uint32_t cbData = 0; /* 0 means that the report is unsupported. */ 1870 1916 1871 1917 if (u8ReportType == 1 && u8ReportID == REPORTID_TOUCH_POINTER) 1872 1918 { 1873 USBHIDMT_REPORT_POINTER *p = (USBHIDMT_REPORT_POINTER *)& pUrb->abData[sizeof(VUSBSETUP)];1919 USBHIDMT_REPORT_POINTER *p = (USBHIDMT_REPORT_POINTER *)&abData; 1874 1920 /* The actual state should be reported here. */ 1875 1921 p->idReport = REPORTID_TOUCH_POINTER; … … 1881 1927 else if (u8ReportType == 1 && u8ReportID == REPORTID_TOUCH_EVENT) 1882 1928 { 1883 USBHIDMT_REPORT *p = (USBHIDMT_REPORT *)& pUrb->abData[sizeof(VUSBSETUP)];1929 USBHIDMT_REPORT *p = (USBHIDMT_REPORT *)&abData; 1884 1930 /* The actual state should be reported here. */ 1885 1931 RT_ZERO(*p); … … 1889 1935 else if (u8ReportType == 3 && u8ReportID == REPORTID_TOUCH_MAX_COUNT) 1890 1936 { 1891 pUrb->abData[sizeof(VUSBSETUP) +0] = REPORTID_TOUCH_MAX_COUNT;1892 pUrb->abData[sizeof(VUSBSETUP) + 1] = MT_CONTACT_MAX_COUNT;/* Contact count maximum. */1893 pUrb->abData[sizeof(VUSBSETUP) + 2] = 0;/* Device identifier */1937 abData[0] = REPORTID_TOUCH_MAX_COUNT; 1938 abData[1] = MT_CONTACT_MAX_COUNT; /* Contact count maximum. */ 1939 abData[2] = 0; /* Device identifier */ 1894 1940 cbData = 3; 1895 1941 } 1896 1942 else if (u8ReportType == 3 && u8ReportID == REPORTID_TOUCH_QABLOB) 1897 1943 { 1898 pUrb->abData[sizeof(VUSBSETUP) + 0] = REPORTID_TOUCH_QABLOB; /* Report Id. */ 1899 memcpy(&pUrb->abData[sizeof(VUSBSETUP) + 1], 1900 g_abQASampleBlob, sizeof(g_abQASampleBlob)); 1901 cbData = sizeof(g_abQASampleBlob) + 1; 1944 pData = (uint8_t *)&g_abQASampleBlob; 1945 cbData = sizeof(g_abQASampleBlob); 1902 1946 } 1903 1947 else if (u8ReportType == 3 && u8ReportID == REPORTID_TOUCH_DEVCONFIG) 1904 1948 { 1905 pUrb->abData[sizeof(VUSBSETUP) +0] = REPORTID_TOUCH_DEVCONFIG;1906 pUrb->abData[sizeof(VUSBSETUP) +1] = 2; /* Device mode:1907 * "HID touch device supporting contact1908 * identifier and contact count maximum."1909 */1910 pUrb->abData[sizeof(VUSBSETUP) +2] = 0; /* Device identifier */1949 abData[0] = REPORTID_TOUCH_DEVCONFIG; 1950 abData[1] = 2; /* Device mode: 1951 * "HID touch device supporting contact 1952 * identifier and contact count maximum." 1953 */ 1954 abData[2] = 0; /* Device identifier */ 1911 1955 cbData = 3; 1912 1956 } … … 1914 1958 if (cbData > 0) 1915 1959 { 1916 rc = usbHidCompleteOk(pThis, pUrb, sizeof(VUSBSETUP) +cbData);1960 rc = usbHidCompleteOk(pThis, pUrb, pData, cbData); 1917 1961 } 1918 1962 else … … 1924 1968 { 1925 1969 /* SET_REPORT */ 1926 rc = usbHidCompleteOk(pThis, pUrb, pUrb->cbData);1970 rc = usbHidCompleteOk(pThis, pUrb, NULL, 0); 1927 1971 } 1928 1972 } break; … … 2001 2045 } 2002 2046 /* Returned data is written after the setup message. */ 2003 cbCopy = pUrb->cbData - sizeof(*pSetup); 2004 cbCopy = RT_MIN(cbCopy, cbDesc); 2047 cbCopy = RT_MIN(pSetup->wValue, cbDesc); 2005 2048 LogRelFlow(("usbHidMouse: GET_DESCRIPTOR DT_IF_HID_DESCRIPTOR wValue=%#x wIndex=%#x cbCopy=%#x\n", 2006 2049 pSetup->wValue, pSetup->wIndex, 2007 2050 cbCopy)); 2008 memcpy(&pUrb->abData[sizeof(*pSetup)], pDesc, cbCopy); 2009 return usbHidCompleteOk(pThis, pUrb, cbCopy + sizeof(*pSetup)); 2051 return usbHidCompleteOk(pThis, pUrb, pDesc, cbCopy); 2010 2052 } 2011 2053 … … 2032 2074 } 2033 2075 /* Returned data is written after the setup message. */ 2034 cbCopy = pUrb->cbData - sizeof(*pSetup); 2035 cbCopy = RT_MIN(cbCopy, cbDesc); 2076 cbCopy = RT_MIN(pSetup->wLength, cbDesc); 2036 2077 LogRelFlow(("usbHid: GET_DESCRIPTOR DT_IF_HID_REPORT wValue=%#x wIndex=%#x cbCopy=%#x\n", 2037 2078 pSetup->wValue, pSetup->wIndex, 2038 2079 cbCopy)); 2039 memcpy(&pUrb->abData[sizeof(*pSetup)], pDesc, cbCopy); 2040 return usbHidCompleteOk(pThis, pUrb, cbCopy + sizeof(*pSetup)); 2080 return usbHidCompleteOk(pThis, pUrb, pDesc, cbCopy); 2041 2081 } 2042 2082 … … 2075 2115 LogRelFlow(("usbHid: GET_STATUS (device)\n")); 2076 2116 wRet = 0; /* Not self-powered, no remote wakeup. */ 2077 memcpy(&pUrb->abData[sizeof(*pSetup)], &wRet, sizeof(wRet)); 2078 return usbHidCompleteOk(pThis, pUrb, sizeof(wRet) + sizeof(*pSetup)); 2117 return usbHidCompleteOk(pThis, pUrb, &wRet, sizeof(wRet)); 2079 2118 } 2080 2119 … … 2083 2122 if (pSetup->wIndex == 0) 2084 2123 { 2085 memcpy(&pUrb->abData[sizeof(*pSetup)], &wRet, sizeof(wRet)); 2086 return usbHidCompleteOk(pThis, pUrb, sizeof(wRet) + sizeof(*pSetup)); 2124 return usbHidCompleteOk(pThis, pUrb, &wRet, sizeof(wRet)); 2087 2125 } 2088 2126 LogRelFlow(("usbHid: GET_STATUS (interface) invalid, wIndex=%#x\n", pSetup->wIndex)); … … 2095 2133 { 2096 2134 wRet = pThis->aEps[pSetup->wIndex].fHalted ? 1 : 0; 2097 memcpy(&pUrb->abData[sizeof(*pSetup)], &wRet, sizeof(wRet)); 2098 return usbHidCompleteOk(pThis, pUrb, sizeof(wRet) + sizeof(*pSetup)); 2135 return usbHidCompleteOk(pThis, pUrb, &wRet, sizeof(wRet)); 2099 2136 } 2100 2137 LogRelFlow(("usbHid: GET_STATUS (endpoint) invalid, wIndex=%#x\n", pSetup->wIndex));
Note:
See TracChangeset
for help on using the changeset viewer.

