gamepad_id_list.cc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/gamepad/gamepad_id_list.h"
  5. #include <algorithm>
  6. #include <iterator>
  7. namespace device {
  8. namespace {
  9. static base::LazyInstance<GamepadIdList>::Leaky g_singleton =
  10. LAZY_INSTANCE_INITIALIZER;
  11. // Information about all game input devices known to Chrome, including
  12. // unsupported devices. Must be sorted by vendor and product ID.
  13. //
  14. // When recording metrics for connected gamepads, vendor and product IDs will
  15. // only be recorded for devices that are in kGamepadInfo.
  16. constexpr struct GamepadInfo {
  17. uint16_t vendor;
  18. uint16_t product;
  19. XInputType xtype;
  20. } kGamepadInfo[] = {
  21. {0x0010, 0x0082, kXInputTypeNone},
  22. // DragonRise Inc.
  23. {0x0079, 0x0006, kXInputTypeNone},
  24. {0x0079, 0x0011, kXInputTypeNone},
  25. {0x0079, 0x1800, kXInputTypeNone},
  26. {0x0079, 0x181b, kXInputTypeNone},
  27. {0x0079, 0x1843, kXInputTypeNone},
  28. {0x0079, 0x1844, kXInputTypeNone},
  29. // Steelseries ApS (Bluetooth)
  30. {0x0111, 0x1417, kXInputTypeNone},
  31. {0x0111, 0x1419, kXInputTypeNone},
  32. {0x0111, 0x1420, kXInputTypeNone},
  33. {0x0111, 0x1431, kXInputTypeNone},
  34. {0x0111, 0x1434, kXInputTypeNone},
  35. {0x0113, 0xf900, kXInputTypeNone},
  36. // Creative Technology, Ltd
  37. {0x041e, 0x1003, kXInputTypeNone},
  38. {0x041e, 0x1050, kXInputTypeNone},
  39. // Advanced Gravis Computer Tech, Ltd
  40. {0x0428, 0x4001, kXInputTypeNone},
  41. // Alps Electric Co., Ltd
  42. {0x0433, 0x1101, kXInputTypeNone},
  43. // ThrustMaster, Inc.
  44. {0x044f, 0x0f00, kXInputTypeXbox},
  45. {0x044f, 0x0f03, kXInputTypeXbox},
  46. {0x044f, 0x0f07, kXInputTypeXbox},
  47. {0x044f, 0x0f10, kXInputTypeXbox},
  48. {0x044f, 0xa0a3, kXInputTypeNone},
  49. {0x044f, 0xb300, kXInputTypeNone},
  50. {0x044f, 0xb304, kXInputTypeNone},
  51. {0x044f, 0xb312, kXInputTypeNone},
  52. {0x044f, 0xb315, kXInputTypeNone},
  53. {0x044f, 0xb320, kXInputTypeNone},
  54. {0x044f, 0xb323, kXInputTypeNone},
  55. {0x044f, 0xb326, kXInputTypeXbox},
  56. {0x044f, 0xb653, kXInputTypeNone},
  57. {0x044f, 0xb677, kXInputTypeNone},
  58. {0x044f, 0xd003, kXInputTypeNone},
  59. {0x044f, 0xd008, kXInputTypeNone},
  60. {0x044f, 0xd009, kXInputTypeNone},
  61. // Microsoft Corp.
  62. {0x045e, 0x0026, kXInputTypeNone},
  63. {0x045e, 0x0027, kXInputTypeNone},
  64. {0x045e, 0x0202, kXInputTypeXbox},
  65. {0x045e, 0x0285, kXInputTypeXbox},
  66. {0x045e, 0x0287, kXInputTypeXbox},
  67. {0x045e, 0x0288, kXInputTypeXbox},
  68. {0x045e, 0x0289, kXInputTypeXbox},
  69. {0x045e, 0x028e, kXInputTypeXbox360},
  70. {0x045e, 0x028f, kXInputTypeNone},
  71. {0x045e, 0x0291, kXInputTypeXbox360},
  72. {0x045e, 0x02a0, kXInputTypeXbox360},
  73. {0x045e, 0x02a1, kXInputTypeXbox360},
  74. {0x045e, 0x02d1, kXInputTypeXboxOne},
  75. {0x045e, 0x02dd, kXInputTypeXboxOne},
  76. {0x045e, 0x02e0, kXInputTypeNone},
  77. {0x045e, 0x02e3, kXInputTypeXboxOne},
  78. {0x045e, 0x02e6, kXInputTypeXbox360},
  79. {0x045e, 0x02ea, kXInputTypeXboxOne},
  80. {0x045e, 0x02fd, kXInputTypeNone},
  81. {0x045e, 0x02ff, kXInputTypeXboxOne},
  82. {0x045e, 0x0719, kXInputTypeXbox360},
  83. {0x045e, 0x0b00, kXInputTypeXboxOne},
  84. {0x045e, 0x0b05, kXInputTypeNone},
  85. {0x045e, 0x0b0a, kXInputTypeXboxOne},
  86. {0x045e, 0x0b0c, kXInputTypeNone},
  87. {0x045e, 0x0b12, kXInputTypeXboxOne},
  88. {0x045e, 0x0b13, kXInputTypeNone},
  89. {0x045e, 0x0b20, kXInputTypeNone},
  90. {0x045e, 0x0b21, kXInputTypeNone},
  91. {0x045e, 0x0b22, kXInputTypeNone},
  92. // Logitech, Inc.
  93. {0x046d, 0xc208, kXInputTypeNone},
  94. {0x046d, 0xc209, kXInputTypeNone},
  95. {0x046d, 0xc211, kXInputTypeNone},
  96. {0x046d, 0xc215, kXInputTypeNone},
  97. {0x046d, 0xc216, kXInputTypeNone},
  98. {0x046d, 0xc218, kXInputTypeNone},
  99. {0x046d, 0xc219, kXInputTypeNone},
  100. {0x046d, 0xc21a, kXInputTypeNone},
  101. {0x046d, 0xc21d, kXInputTypeXbox360},
  102. {0x046d, 0xc21e, kXInputTypeXbox360},
  103. {0x046d, 0xc21f, kXInputTypeXbox360},
  104. {0x046d, 0xc242, kXInputTypeXbox360},
  105. {0x046d, 0xc24f, kXInputTypeNone},
  106. {0x046d, 0xc260, kXInputTypeNone},
  107. {0x046d, 0xc261, kXInputTypeNone},
  108. {0x046d, 0xc262, kXInputTypeNone},
  109. {0x046d, 0xc298, kXInputTypeNone},
  110. {0x046d, 0xc299, kXInputTypeNone},
  111. {0x046d, 0xc29a, kXInputTypeNone},
  112. {0x046d, 0xc29b, kXInputTypeNone},
  113. {0x046d, 0xca84, kXInputTypeXbox},
  114. {0x046d, 0xca88, kXInputTypeXbox},
  115. {0x046d, 0xca8a, kXInputTypeXbox},
  116. {0x046d, 0xcaa3, kXInputTypeXbox360},
  117. // Kensington
  118. {0x047d, 0x4003, kXInputTypeNone},
  119. {0x047d, 0x4005, kXInputTypeNone},
  120. // Cypress Semiconductor Corp.
  121. {0x04b4, 0x010a, kXInputTypeNone},
  122. {0x04b4, 0xd5d5, kXInputTypeNone},
  123. // Holtek Semiconductor, Inc.
  124. {0x04d9, 0x0002, kXInputTypeNone},
  125. // Samsung Electronics Co., Ltd
  126. {0x04e8, 0xa000, kXInputTypeNone},
  127. // Siam United Hi-Tech
  128. {0x0500, 0x9b28, kXInputTypeNone},
  129. // Belkin Components
  130. {0x050d, 0x0802, kXInputTypeNone},
  131. {0x050d, 0x0803, kXInputTypeNone},
  132. {0x050d, 0x0805, kXInputTypeNone},
  133. // Sony Corp.
  134. {0x054c, 0x0268, kXInputTypeNone},
  135. {0x054c, 0x0306, kXInputTypeNone},
  136. {0x054c, 0x042f, kXInputTypeNone},
  137. {0x054c, 0x05c4, kXInputTypeNone},
  138. {0x054c, 0x05c5, kXInputTypeNone},
  139. {0x054c, 0x09cc, kXInputTypeNone},
  140. {0x054c, 0x0ba0, kXInputTypeNone},
  141. {0x054c, 0x0ce6, kXInputTypeNone},
  142. // Elecom Co., Ltd
  143. {0x056e, 0x2003, kXInputTypeNone},
  144. {0x056e, 0x2004, kXInputTypeXbox360},
  145. {0x056e, 0x200f, kXInputTypeNone},
  146. {0x056e, 0x2010, kXInputTypeNone},
  147. {0x056e, 0x2013, kXInputTypeXbox360},
  148. // Nintendo Co., Ltd
  149. {0x057e, 0x0306, kXInputTypeNone},
  150. {0x057e, 0x0330, kXInputTypeNone},
  151. {0x057e, 0x0337, kXInputTypeNone},
  152. {0x057e, 0x2006, kXInputTypeNone},
  153. {0x057e, 0x2007, kXInputTypeNone},
  154. {0x057e, 0x2009, kXInputTypeNone},
  155. {0x057e, 0x200e, kXInputTypeNone},
  156. // Padix Co., Ltd (Rockfire)
  157. {0x0583, 0x2060, kXInputTypeNone},
  158. {0x0583, 0x206f, kXInputTypeNone},
  159. {0x0583, 0x3050, kXInputTypeNone},
  160. {0x0583, 0xa000, kXInputTypeNone},
  161. {0x0583, 0xa024, kXInputTypeNone},
  162. {0x0583, 0xa025, kXInputTypeNone},
  163. {0x0583, 0xa130, kXInputTypeNone},
  164. {0x0583, 0xa133, kXInputTypeNone},
  165. {0x0583, 0xb031, kXInputTypeNone},
  166. // Vetronix Corp.
  167. {0x05a0, 0x3232, kXInputTypeNone},
  168. // Genesys Logic, Inc.
  169. {0x05e3, 0x0596, kXInputTypeNone},
  170. // InterAct, Inc.
  171. {0x05fd, 0x1007, kXInputTypeXbox},
  172. {0x05fd, 0x107a, kXInputTypeXbox},
  173. {0x05fd, 0x3000, kXInputTypeNone},
  174. // Chic Technology Corp.
  175. {0x05fe, 0x0014, kXInputTypeNone},
  176. {0x05fe, 0x3030, kXInputTypeXbox},
  177. {0x05fe, 0x3031, kXInputTypeXbox},
  178. // MosArt Semiconductor Corp.
  179. {0x062a, 0x0020, kXInputTypeXbox},
  180. {0x062a, 0x0033, kXInputTypeXbox},
  181. {0x062a, 0x2410, kXInputTypeNone},
  182. // Saitek PLC
  183. {0x06a3, 0x0109, kXInputTypeNone},
  184. {0x06a3, 0x0200, kXInputTypeXbox},
  185. {0x06a3, 0x0201, kXInputTypeXbox},
  186. {0x06a3, 0x0241, kXInputTypeNone},
  187. {0x06a3, 0x040b, kXInputTypeNone},
  188. {0x06a3, 0x040c, kXInputTypeNone},
  189. {0x06a3, 0x052d, kXInputTypeNone},
  190. {0x06a3, 0x3509, kXInputTypeNone},
  191. {0x06a3, 0xf518, kXInputTypeNone},
  192. {0x06a3, 0xf51a, kXInputTypeXbox360},
  193. {0x06a3, 0xf622, kXInputTypeNone},
  194. {0x06a3, 0xf623, kXInputTypeNone},
  195. {0x06a3, 0xff0c, kXInputTypeNone},
  196. // Aashima Technology B.V.
  197. {0x06d6, 0x0025, kXInputTypeNone},
  198. {0x06d6, 0x0026, kXInputTypeNone},
  199. // Guillemot Corp.
  200. {0x06f8, 0xa300, kXInputTypeNone},
  201. // Mad Catz, Inc.
  202. {0x0738, 0x3250, kXInputTypeNone},
  203. {0x0738, 0x3285, kXInputTypeNone},
  204. {0x0738, 0x3384, kXInputTypeNone},
  205. {0x0738, 0x3480, kXInputTypeNone},
  206. {0x0738, 0x3481, kXInputTypeNone},
  207. {0x0738, 0x4506, kXInputTypeXbox},
  208. {0x0738, 0x4516, kXInputTypeXbox},
  209. {0x0738, 0x4520, kXInputTypeXbox},
  210. {0x0738, 0x4522, kXInputTypeXbox},
  211. {0x0738, 0x4526, kXInputTypeXbox},
  212. {0x0738, 0x4530, kXInputTypeXbox},
  213. {0x0738, 0x4536, kXInputTypeXbox},
  214. {0x0738, 0x4540, kXInputTypeXbox},
  215. {0x0738, 0x4556, kXInputTypeXbox},
  216. {0x0738, 0x4586, kXInputTypeXbox},
  217. {0x0738, 0x4588, kXInputTypeXbox},
  218. {0x0738, 0x45ff, kXInputTypeXbox},
  219. {0x0738, 0x4716, kXInputTypeXbox360},
  220. {0x0738, 0x4718, kXInputTypeXbox360},
  221. {0x0738, 0x4726, kXInputTypeXbox360},
  222. {0x0738, 0x4728, kXInputTypeXbox360},
  223. {0x0738, 0x4736, kXInputTypeXbox360},
  224. {0x0738, 0x4738, kXInputTypeXbox360},
  225. {0x0738, 0x4740, kXInputTypeXbox360},
  226. {0x0738, 0x4743, kXInputTypeXbox},
  227. {0x0738, 0x4758, kXInputTypeXbox360},
  228. {0x0738, 0x4a01, kXInputTypeXboxOne},
  229. {0x0738, 0x5266, kXInputTypeNone},
  230. {0x0738, 0x6040, kXInputTypeXbox},
  231. {0x0738, 0x8180, kXInputTypeNone},
  232. {0x0738, 0x8250, kXInputTypeNone},
  233. {0x0738, 0x8384, kXInputTypeNone},
  234. {0x0738, 0x8480, kXInputTypeNone},
  235. {0x0738, 0x8481, kXInputTypeNone},
  236. {0x0738, 0x8818, kXInputTypeNone},
  237. {0x0738, 0x8838, kXInputTypeNone},
  238. {0x0738, 0x9871, kXInputTypeXbox360},
  239. {0x0738, 0xb726, kXInputTypeXbox360},
  240. {0x0738, 0xb738, kXInputTypeXbox360},
  241. {0x0738, 0xbeef, kXInputTypeXbox360},
  242. {0x0738, 0xcb02, kXInputTypeXbox360},
  243. {0x0738, 0xcb03, kXInputTypeXbox360},
  244. {0x0738, 0xcb29, kXInputTypeXbox360},
  245. {0x0738, 0xf401, kXInputTypeNone},
  246. {0x0738, 0xf738, kXInputTypeXbox360},
  247. {0x07b5, 0x0213, kXInputTypeNone},
  248. {0x07b5, 0x0312, kXInputTypeNone},
  249. {0x07b5, 0x0314, kXInputTypeNone},
  250. {0x07b5, 0x0315, kXInputTypeNone},
  251. {0x07b5, 0x9902, kXInputTypeNone},
  252. {0x07ff, 0xffff, kXInputTypeXbox360},
  253. // Personal Communication Systems, Inc.
  254. {0x0810, 0x0001, kXInputTypeNone},
  255. {0x0810, 0x0003, kXInputTypeNone},
  256. {0x0810, 0x1e01, kXInputTypeNone},
  257. {0x0810, 0xe501, kXInputTypeNone},
  258. // Lakeview Research
  259. {0x0925, 0x0005, kXInputTypeNone},
  260. {0x0925, 0x03e8, kXInputTypeNone},
  261. {0x0925, 0x1700, kXInputTypeNone},
  262. {0x0925, 0x2801, kXInputTypeNone},
  263. {0x0925, 0x8866, kXInputTypeNone},
  264. {0x0926, 0x2526, kXInputTypeNone},
  265. {0x0926, 0x8888, kXInputTypeNone},
  266. // NVIDIA Corp.
  267. {0x0955, 0x7210, kXInputTypeNone},
  268. {0x0955, 0x7214, kXInputTypeNone},
  269. // Broadcom Corp.
  270. {0x0a5c, 0x8502, kXInputTypeNone},
  271. // ASUSTek Computer, Inc.
  272. {0x0b05, 0x4500, kXInputTypeNone},
  273. // Play.com, Inc.
  274. {0x0b43, 0x0005, kXInputTypeNone},
  275. // Zeroplus
  276. {0x0c12, 0x0005, kXInputTypeXbox},
  277. {0x0c12, 0x0e10, kXInputTypeNone},
  278. {0x0c12, 0x0ef6, kXInputTypeNone},
  279. {0x0c12, 0x1cf6, kXInputTypeNone},
  280. {0x0c12, 0x8801, kXInputTypeXbox},
  281. {0x0c12, 0x8802, kXInputTypeXbox},
  282. {0x0c12, 0x8809, kXInputTypeXbox},
  283. {0x0c12, 0x880a, kXInputTypeXbox},
  284. {0x0c12, 0x8810, kXInputTypeXbox},
  285. {0x0c12, 0x9902, kXInputTypeXbox},
  286. // Microdia
  287. {0x0c45, 0x4320, kXInputTypeNone},
  288. {0x0d2f, 0x0002, kXInputTypeXbox},
  289. // Radica Games, Ltd
  290. {0x0e4c, 0x1097, kXInputTypeXbox},
  291. {0x0e4c, 0x1103, kXInputTypeXbox},
  292. {0x0e4c, 0x2390, kXInputTypeXbox},
  293. {0x0e4c, 0x3510, kXInputTypeXbox},
  294. // Logic3
  295. {0x0e6f, 0x0003, kXInputTypeXbox},
  296. {0x0e6f, 0x0005, kXInputTypeXbox},
  297. {0x0e6f, 0x0006, kXInputTypeXbox},
  298. {0x0e6f, 0x0008, kXInputTypeXbox},
  299. {0x0e6f, 0x0105, kXInputTypeXbox360},
  300. {0x0e6f, 0x0113, kXInputTypeXbox360},
  301. {0x0e6f, 0x011e, kXInputTypeNone},
  302. {0x0e6f, 0x011f, kXInputTypeXbox360},
  303. {0x0e6f, 0x0124, kXInputTypeNone},
  304. {0x0e6f, 0x0130, kXInputTypeNone},
  305. {0x0e6f, 0x0131, kXInputTypeXbox360},
  306. {0x0e6f, 0x0133, kXInputTypeXbox360},
  307. {0x0e6f, 0x0139, kXInputTypeXboxOne},
  308. {0x0e6f, 0x013a, kXInputTypeXboxOne},
  309. {0x0e6f, 0x0146, kXInputTypeXboxOne},
  310. {0x0e6f, 0x0147, kXInputTypeXboxOne},
  311. {0x0e6f, 0x0158, kXInputTypeNone},
  312. {0x0e6f, 0x015c, kXInputTypeXboxOne},
  313. {0x0e6f, 0x0161, kXInputTypeXboxOne},
  314. {0x0e6f, 0x0162, kXInputTypeXboxOne},
  315. {0x0e6f, 0x0163, kXInputTypeXboxOne},
  316. {0x0e6f, 0x0164, kXInputTypeXboxOne},
  317. {0x0e6f, 0x0165, kXInputTypeXboxOne},
  318. {0x0e6f, 0x0201, kXInputTypeXbox360},
  319. {0x0e6f, 0x0213, kXInputTypeXbox360},
  320. {0x0e6f, 0x021f, kXInputTypeXbox360},
  321. {0x0e6f, 0x0246, kXInputTypeXboxOne},
  322. {0x0e6f, 0x02a0, kXInputTypeNone},
  323. {0x0e6f, 0x02ab, kXInputTypeNone},
  324. {0x0e6f, 0x0301, kXInputTypeXbox360},
  325. {0x0e6f, 0x0346, kXInputTypeXboxOne},
  326. {0x0e6f, 0x0401, kXInputTypeXbox360},
  327. {0x0e6f, 0x0413, kXInputTypeXbox360},
  328. {0x0e6f, 0x0501, kXInputTypeXbox360},
  329. {0x0e6f, 0xf501, kXInputTypeNone},
  330. {0x0e6f, 0xf701, kXInputTypeNone},
  331. {0x0e6f, 0xf900, kXInputTypeXbox360},
  332. // GreenAsia Inc.
  333. {0x0e8f, 0x0003, kXInputTypeNone},
  334. {0x0e8f, 0x0008, kXInputTypeNone},
  335. {0x0e8f, 0x0012, kXInputTypeNone},
  336. {0x0e8f, 0x0201, kXInputTypeXbox},
  337. {0x0e8f, 0x1006, kXInputTypeNone},
  338. {0x0e8f, 0x3008, kXInputTypeXbox},
  339. {0x0e8f, 0x3010, kXInputTypeNone},
  340. {0x0e8f, 0x3013, kXInputTypeNone},
  341. {0x0e8f, 0x3075, kXInputTypeNone},
  342. {0x0e8f, 0x310d, kXInputTypeNone},
  343. // Hori Co., Ltd
  344. {0x0f0d, 0x000a, kXInputTypeXbox360},
  345. {0x0f0d, 0x000c, kXInputTypeXbox360},
  346. {0x0f0d, 0x000d, kXInputTypeXbox360},
  347. {0x0f0d, 0x0010, kXInputTypeNone},
  348. {0x0f0d, 0x0011, kXInputTypeNone},
  349. {0x0f0d, 0x0016, kXInputTypeXbox360},
  350. {0x0f0d, 0x001b, kXInputTypeXbox360},
  351. {0x0f0d, 0x0022, kXInputTypeNone},
  352. {0x0f0d, 0x0027, kXInputTypeNone},
  353. {0x0f0d, 0x003d, kXInputTypeNone},
  354. {0x0f0d, 0x0040, kXInputTypeNone},
  355. {0x0f0d, 0x0049, kXInputTypeNone},
  356. {0x0f0d, 0x004d, kXInputTypeNone},
  357. {0x0f0d, 0x0055, kXInputTypeNone},
  358. {0x0f0d, 0x005b, kXInputTypeNone},
  359. {0x0f0d, 0x005c, kXInputTypeNone},
  360. {0x0f0d, 0x005e, kXInputTypeNone},
  361. {0x0f0d, 0x005f, kXInputTypeNone},
  362. {0x0f0d, 0x0063, kXInputTypeXboxOne},
  363. {0x0f0d, 0x0066, kXInputTypeNone},
  364. {0x0f0d, 0x0067, kXInputTypeXboxOne},
  365. {0x0f0d, 0x006a, kXInputTypeNone},
  366. {0x0f0d, 0x006b, kXInputTypeNone},
  367. {0x0f0d, 0x006e, kXInputTypeNone},
  368. {0x0f0d, 0x0070, kXInputTypeNone},
  369. {0x0f0d, 0x0078, kXInputTypeXboxOne},
  370. {0x0f0d, 0x0084, kXInputTypeNone},
  371. {0x0f0d, 0x0085, kXInputTypeNone},
  372. {0x0f0d, 0x0087, kXInputTypeNone},
  373. {0x0f0d, 0x0088, kXInputTypeNone},
  374. {0x0f0d, 0x008a, kXInputTypeNone},
  375. {0x0f0d, 0x008b, kXInputTypeNone},
  376. {0x0f0d, 0x0090, kXInputTypeNone},
  377. {0x0f0d, 0x00c1, kXInputTypeNone},
  378. {0x0f0d, 0x00ee, kXInputTypeNone},
  379. // Jess Technology Co., Ltd
  380. {0x0f30, 0x010b, kXInputTypeXbox},
  381. {0x0f30, 0x0110, kXInputTypeNone},
  382. {0x0f30, 0x0111, kXInputTypeNone},
  383. {0x0f30, 0x0112, kXInputTypeNone},
  384. {0x0f30, 0x0202, kXInputTypeXbox},
  385. {0x0f30, 0x0208, kXInputTypeNone},
  386. {0x0f30, 0x1012, kXInputTypeNone},
  387. {0x0f30, 0x1100, kXInputTypeNone},
  388. {0x0f30, 0x1112, kXInputTypeNone},
  389. {0x0f30, 0x1116, kXInputTypeNone},
  390. {0x0f30, 0x8888, kXInputTypeXbox},
  391. // Etoms Electronics Corp.
  392. {0x102c, 0xff0c, kXInputTypeXbox},
  393. // SteelSeries ApS (USB)
  394. {0x1038, 0x1412, kXInputTypeNone},
  395. {0x1038, 0x1418, kXInputTypeNone},
  396. {0x1038, 0x1420, kXInputTypeNone},
  397. {0x1038, 0x1430, kXInputTypeXbox360},
  398. {0x1038, 0x1431, kXInputTypeXbox360},
  399. {0x1038, 0x1434, kXInputTypeXbox360},
  400. {0x1080, 0x0009, kXInputTypeNone},
  401. // Betop
  402. {0x11c0, 0x5213, kXInputTypeNone},
  403. {0x11c0, 0x5506, kXInputTypeNone},
  404. {0x11c9, 0x55f0, kXInputTypeXbox360},
  405. {0x11ff, 0x3331, kXInputTypeNone},
  406. {0x11ff, 0x3341, kXInputTypeNone},
  407. // Focusrite-Novation
  408. {0x1235, 0xab21, kXInputTypeNone},
  409. // Nyko (Honey Bee)
  410. {0x124b, 0x4d01, kXInputTypeNone},
  411. // Honey Bee Electronic International Ltd.
  412. {0x12ab, 0x0004, kXInputTypeXbox360},
  413. {0x12ab, 0x0006, kXInputTypeNone},
  414. {0x12ab, 0x0301, kXInputTypeXbox360},
  415. {0x12ab, 0x0302, kXInputTypeNone},
  416. {0x12ab, 0x0303, kXInputTypeXbox360},
  417. {0x12ab, 0x0e6f, kXInputTypeNone},
  418. {0x12ab, 0x8809, kXInputTypeXbox},
  419. // Gembird
  420. {0x12bd, 0xd012, kXInputTypeNone},
  421. {0x12bd, 0xd015, kXInputTypeNone},
  422. // Sino Lite Technology Corp.
  423. {0x1345, 0x1000, kXInputTypeNone},
  424. {0x1345, 0x3008, kXInputTypeNone},
  425. // RedOctane
  426. {0x1430, 0x02a0, kXInputTypeNone},
  427. {0x1430, 0x4734, kXInputTypeNone},
  428. {0x1430, 0x4748, kXInputTypeXbox360},
  429. {0x1430, 0x474c, kXInputTypeNone},
  430. {0x1430, 0x8888, kXInputTypeXbox},
  431. {0x1430, 0xf801, kXInputTypeXbox360},
  432. {0x146b, 0x0601, kXInputTypeXbox360},
  433. {0x146b, 0x0d01, kXInputTypeNone},
  434. {0x146b, 0x5500, kXInputTypeNone},
  435. // JAMER INDUSTRIES CO., LTD.
  436. {0x14d8, 0x6208, kXInputTypeNone},
  437. {0x14d8, 0xcd07, kXInputTypeNone},
  438. {0x14d8, 0xcfce, kXInputTypeNone},
  439. // Razer USA, Ltd
  440. {0x1532, 0x0037, kXInputTypeXbox360},
  441. {0x1532, 0x0300, kXInputTypeNone},
  442. {0x1532, 0x0401, kXInputTypeNone},
  443. {0x1532, 0x0900, kXInputTypeNone},
  444. {0x1532, 0x0a00, kXInputTypeXboxOne},
  445. {0x1532, 0x0a03, kXInputTypeXboxOne},
  446. {0x1532, 0x1000, kXInputTypeNone},
  447. {0x15e4, 0x3f00, kXInputTypeXbox360},
  448. {0x15e4, 0x3f0a, kXInputTypeXbox360},
  449. {0x15e4, 0x3f10, kXInputTypeXbox360},
  450. {0x162e, 0xbeef, kXInputTypeXbox360},
  451. // Razer USA, Ltd
  452. {0x1689, 0x0001, kXInputTypeNone},
  453. {0x1689, 0xfd00, kXInputTypeXbox360},
  454. {0x1689, 0xfd01, kXInputTypeXbox360},
  455. {0x1689, 0xfe00, kXInputTypeXbox360},
  456. // Askey Computer Corp.
  457. {0x1690, 0x0001, kXInputTypeNone},
  458. // Van Ooijen Technische Informatica
  459. {0x16c0, 0x0487, kXInputTypeNone},
  460. {0x16c0, 0x05e1, kXInputTypeNone},
  461. {0x1781, 0x057e, kXInputTypeNone},
  462. // Google Inc.
  463. {0x18d1, 0x2c40, kXInputTypeNone},
  464. {0x18d1, 0x502e, kXInputTypeNone},
  465. {0x18d1, 0x9400, kXInputTypeNone},
  466. // Lab126, Inc.
  467. {0x1949, 0x0402, kXInputTypeNone},
  468. {0x1949, 0x041a, kXInputTypeXbox360},
  469. // Gampaq Co.Ltd
  470. {0x19fa, 0x0607, kXInputTypeNone},
  471. // ACRUX
  472. {0x1a34, 0x0203, kXInputTypeNone},
  473. {0x1a34, 0x0401, kXInputTypeNone},
  474. {0x1a34, 0x0801, kXInputTypeNone},
  475. {0x1a34, 0x0802, kXInputTypeNone},
  476. {0x1a34, 0x0836, kXInputTypeNone},
  477. {0x1a34, 0xf705, kXInputTypeNone},
  478. // Harmonix Music
  479. {0x1bad, 0x0002, kXInputTypeXbox360},
  480. {0x1bad, 0x0003, kXInputTypeXbox360},
  481. {0x1bad, 0x0130, kXInputTypeXbox360},
  482. {0x1bad, 0x028e, kXInputTypeNone},
  483. {0x1bad, 0x0301, kXInputTypeNone},
  484. {0x1bad, 0x5500, kXInputTypeNone},
  485. {0x1bad, 0xf016, kXInputTypeXbox360},
  486. {0x1bad, 0xf018, kXInputTypeXbox360},
  487. {0x1bad, 0xf019, kXInputTypeXbox360},
  488. {0x1bad, 0xf021, kXInputTypeXbox360},
  489. {0x1bad, 0xf023, kXInputTypeXbox360},
  490. {0x1bad, 0xf025, kXInputTypeXbox360},
  491. {0x1bad, 0xf027, kXInputTypeXbox360},
  492. {0x1bad, 0xf028, kXInputTypeXbox360},
  493. {0x1bad, 0xf02d, kXInputTypeNone},
  494. {0x1bad, 0xf02e, kXInputTypeXbox360},
  495. {0x1bad, 0xf030, kXInputTypeXbox360},
  496. {0x1bad, 0xf036, kXInputTypeXbox360},
  497. {0x1bad, 0xf038, kXInputTypeXbox360},
  498. {0x1bad, 0xf039, kXInputTypeXbox360},
  499. {0x1bad, 0xf03a, kXInputTypeXbox360},
  500. {0x1bad, 0xf03d, kXInputTypeXbox360},
  501. {0x1bad, 0xf03e, kXInputTypeXbox360},
  502. {0x1bad, 0xf03f, kXInputTypeXbox360},
  503. {0x1bad, 0xf042, kXInputTypeXbox360},
  504. {0x1bad, 0xf080, kXInputTypeXbox360},
  505. {0x1bad, 0xf0ca, kXInputTypeNone},
  506. {0x1bad, 0xf501, kXInputTypeXbox360},
  507. {0x1bad, 0xf502, kXInputTypeXbox360},
  508. {0x1bad, 0xf503, kXInputTypeXbox360},
  509. {0x1bad, 0xf504, kXInputTypeXbox360},
  510. {0x1bad, 0xf505, kXInputTypeXbox360},
  511. {0x1bad, 0xf506, kXInputTypeXbox360},
  512. {0x1bad, 0xf900, kXInputTypeXbox360},
  513. {0x1bad, 0xf901, kXInputTypeXbox360},
  514. {0x1bad, 0xf902, kXInputTypeNone},
  515. {0x1bad, 0xf903, kXInputTypeXbox360},
  516. {0x1bad, 0xf904, kXInputTypeXbox360},
  517. {0x1bad, 0xf906, kXInputTypeXbox360},
  518. {0x1bad, 0xf907, kXInputTypeNone},
  519. {0x1bad, 0xfa01, kXInputTypeXbox360},
  520. {0x1bad, 0xfd00, kXInputTypeXbox360},
  521. {0x1bad, 0xfd01, kXInputTypeXbox360},
  522. // OpenMoko, Inc.
  523. {0x1d50, 0x6053, kXInputTypeNone},
  524. {0x1d79, 0x0301, kXInputTypeNone},
  525. {0x1dd8, 0x000b, kXInputTypeNone},
  526. {0x1dd8, 0x000f, kXInputTypeNone},
  527. {0x1dd8, 0x0010, kXInputTypeNone},
  528. // DAP Technologies
  529. {0x2002, 0x9000, kXInputTypeNone},
  530. {0x20d6, 0x0dad, kXInputTypeNone},
  531. {0x20d6, 0x6271, kXInputTypeNone},
  532. {0x20d6, 0x89e5, kXInputTypeNone},
  533. {0x20d6, 0xca6d, kXInputTypeNone},
  534. {0x20e8, 0x5860, kXInputTypeNone},
  535. // MacAlly
  536. {0x2222, 0x0060, kXInputTypeNone},
  537. {0x2222, 0x4010, kXInputTypeNone},
  538. {0x22ba, 0x1020, kXInputTypeNone},
  539. {0x2378, 0x1008, kXInputTypeNone},
  540. {0x2378, 0x100a, kXInputTypeNone},
  541. {0x24c6, 0x5000, kXInputTypeXbox360},
  542. {0x24c6, 0x5300, kXInputTypeXbox360},
  543. {0x24c6, 0x5303, kXInputTypeXbox360},
  544. {0x24c6, 0x530a, kXInputTypeXbox360},
  545. {0x24c6, 0x531a, kXInputTypeXbox360},
  546. {0x24c6, 0x5397, kXInputTypeXbox360},
  547. {0x24c6, 0x541a, kXInputTypeXboxOne},
  548. {0x24c6, 0x542a, kXInputTypeXboxOne},
  549. {0x24c6, 0x543a, kXInputTypeXboxOne},
  550. {0x24c6, 0x5500, kXInputTypeXbox360},
  551. {0x24c6, 0x5501, kXInputTypeXbox360},
  552. {0x24c6, 0x5502, kXInputTypeXbox360},
  553. {0x24c6, 0x5503, kXInputTypeXbox360},
  554. {0x24c6, 0x5506, kXInputTypeXbox360},
  555. {0x24c6, 0x550d, kXInputTypeXbox360},
  556. {0x24c6, 0x550e, kXInputTypeXbox360},
  557. {0x24c6, 0x551a, kXInputTypeXboxOne},
  558. {0x24c6, 0x561a, kXInputTypeXboxOne},
  559. {0x24c6, 0x5b00, kXInputTypeXbox360},
  560. {0x24c6, 0x5b02, kXInputTypeXbox360},
  561. {0x24c6, 0x5b03, kXInputTypeXbox360},
  562. {0x24c6, 0x5d04, kXInputTypeXbox360},
  563. {0x24c6, 0xfafb, kXInputTypeNone},
  564. {0x24c6, 0xfafc, kXInputTypeNone},
  565. {0x24c6, 0xfafd, kXInputTypeNone},
  566. {0x24c6, 0xfafe, kXInputTypeXbox360},
  567. {0x2563, 0x0523, kXInputTypeNone},
  568. {0x25f0, 0x83c1, kXInputTypeNone},
  569. {0x25f0, 0xc121, kXInputTypeNone},
  570. {0x2717, 0x3144, kXInputTypeNone},
  571. {0x2810, 0x0009, kXInputTypeNone},
  572. {0x2836, 0x0001, kXInputTypeNone},
  573. // Dracal/Raphnet technologies
  574. {0x289b, 0x0003, kXInputTypeNone},
  575. {0x289b, 0x0005, kXInputTypeNone},
  576. // Valve Software
  577. {0x28de, 0x1002, kXInputTypeNone},
  578. {0x28de, 0x1042, kXInputTypeNone},
  579. {0x28de, 0x1052, kXInputTypeNone},
  580. {0x28de, 0x1071, kXInputTypeNone},
  581. {0x28de, 0x1101, kXInputTypeNone},
  582. {0x28de, 0x1102, kXInputTypeNone},
  583. {0x28de, 0x1105, kXInputTypeNone},
  584. {0x28de, 0x1106, kXInputTypeNone},
  585. {0x28de, 0x1142, kXInputTypeNone},
  586. {0x28de, 0x11fc, kXInputTypeNone},
  587. {0x28de, 0x11ff, kXInputTypeXbox360},
  588. {0x28de, 0x1201, kXInputTypeNone},
  589. {0x28de, 0x1202, kXInputTypeNone},
  590. {0x2c22, 0x2000, kXInputTypeNone},
  591. {0x2c22, 0x2300, kXInputTypeNone},
  592. {0x2c22, 0x2302, kXInputTypeNone},
  593. {0x2dc8, 0x1003, kXInputTypeNone},
  594. {0x2dc8, 0x1080, kXInputTypeNone},
  595. {0x2dc8, 0x2830, kXInputTypeNone},
  596. {0x2dc8, 0x3000, kXInputTypeNone},
  597. {0x2dc8, 0x3001, kXInputTypeNone},
  598. {0x2dc8, 0x3820, kXInputTypeNone},
  599. {0x2dc8, 0x9001, kXInputTypeNone},
  600. {0x2dfa, 0x0001, kXInputTypeNone},
  601. {0x2e95, 0x7725, kXInputTypeNone},
  602. {0x3767, 0x0101, kXInputTypeXbox},
  603. {0x3820, 0x0009, kXInputTypeNone},
  604. {0x4c50, 0x5453, kXInputTypeNone},
  605. {0x5347, 0x6d61, kXInputTypeNone},
  606. {0x6469, 0x6469, kXInputTypeNone},
  607. // Prototype product Vendor ID
  608. {0x6666, 0x0667, kXInputTypeNone},
  609. {0x6666, 0x8804, kXInputTypeNone},
  610. {0x6666, 0x9401, kXInputTypeNone},
  611. {0x6957, 0x746f, kXInputTypeNone},
  612. {0x6978, 0x706e, kXInputTypeNone},
  613. {0x8000, 0x1002, kXInputTypeNone},
  614. {0x8888, 0x0308, kXInputTypeNone},
  615. {0xf000, 0x0003, kXInputTypeNone},
  616. {0xf000, 0x00f1, kXInputTypeNone},
  617. // Hama
  618. {0xf766, 0x0001, kXInputTypeNone},
  619. {0xf766, 0x0005, kXInputTypeNone},
  620. };
  621. constexpr size_t kGamepadInfoLength = std::size(kGamepadInfo);
  622. bool CompareEntry(const GamepadInfo& a, const GamepadInfo& b) {
  623. return std::tie(a.vendor, a.product) < std::tie(b.vendor, b.product);
  624. }
  625. const GamepadInfo* GetGamepadInfo(uint16_t vendor, uint16_t product) {
  626. const GamepadInfo* begin = std::begin(kGamepadInfo);
  627. const GamepadInfo* end = std::end(kGamepadInfo);
  628. GamepadInfo target_entry = {vendor, product, kXInputTypeNone};
  629. const GamepadInfo* it =
  630. std::lower_bound(begin, end, target_entry, CompareEntry);
  631. if (it == end || it->vendor != vendor || it->product != product)
  632. return nullptr;
  633. return it;
  634. }
  635. } // namespace
  636. // static
  637. GamepadIdList& GamepadIdList::Get() {
  638. return g_singleton.Get();
  639. }
  640. GamepadIdList::GamepadIdList() {
  641. DCHECK(std::is_sorted(std::begin(kGamepadInfo), std::end(kGamepadInfo),
  642. CompareEntry));
  643. }
  644. XInputType GamepadIdList::GetXInputType(uint16_t vendor_id,
  645. uint16_t product_id) const {
  646. const auto* entry = GetGamepadInfo(vendor_id, product_id);
  647. return entry ? entry->xtype : kXInputTypeNone;
  648. }
  649. GamepadId GamepadIdList::GetGamepadId(base::StringPiece product_name,
  650. uint16_t vendor_id,
  651. uint16_t product_id) const {
  652. const auto* entry = GetGamepadInfo(vendor_id, product_id);
  653. if (entry) {
  654. // The ID value combines the vendor and product IDs.
  655. return static_cast<GamepadId>((vendor_id << 16) | product_id);
  656. }
  657. // Special cases for devices which don't report a valid vendor ID.
  658. if (vendor_id == 0x0 && product_id == 0x0 &&
  659. product_name == "Lic Pro Controller") {
  660. return GamepadId::kPowerALicPro;
  661. }
  662. return GamepadId::kUnknownGamepad;
  663. }
  664. std::pair<uint16_t, uint16_t> GamepadIdList::GetDeviceIdsFromGamepadId(
  665. GamepadId gamepad_id) const {
  666. // For most devices, the vendor/product ID pair is unique to a single gamepad
  667. // model. The GamepadId for these devices contains the 16-bit vendor and
  668. // product IDs packed into a 32-bit value. Some devices use duplicate or
  669. // invalid vendor and product IDs and are assigned "fake" GamepadIds that are
  670. // not derived from the vendor and product IDs.
  671. // Handle devices that have been assigned fake GamepadId values.
  672. if (gamepad_id == GamepadId::kPowerALicPro)
  673. return {0, 0};
  674. // Handle devices that use packed vendor/product GamepadId values.
  675. auto vendor_and_product = static_cast<uint32_t>(gamepad_id);
  676. const uint16_t vendor_id = vendor_and_product >> 16;
  677. const uint16_t product_id = vendor_and_product & 0xffff;
  678. DCHECK(GetGamepadInfo(vendor_id, product_id));
  679. return {vendor_id, product_id};
  680. }
  681. std::vector<std::tuple<uint16_t, uint16_t, XInputType>>
  682. GamepadIdList::GetGamepadListForTesting() const {
  683. std::vector<std::tuple<uint16_t, uint16_t, XInputType>> gamepads;
  684. for (size_t i = 0; i < kGamepadInfoLength; ++i) {
  685. const auto& item = kGamepadInfo[i];
  686. gamepads.push_back(std::make_tuple(item.vendor, item.product, item.xtype));
  687. }
  688. return gamepads;
  689. }
  690. } // namespace device