hid-logitech-dj.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987
  1. /*
  2. * HID driver for Logitech Unifying receivers
  3. *
  4. * Copyright (c) 2011 Logitech
  5. */
  6. /*
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. *
  20. */
  21. #include <linux/device.h>
  22. #include <linux/hid.h>
  23. #include <linux/module.h>
  24. #include <linux/usb.h>
  25. #include <asm/unaligned.h>
  26. #include "usbhid/usbhid.h"
  27. #include "hid-ids.h"
  28. #include "hid-logitech-dj.h"
  29. /* Keyboard descriptor (1) */
  30. static const char kbd_descriptor[] = {
  31. 0x05, 0x01, /* USAGE_PAGE (generic Desktop) */
  32. 0x09, 0x06, /* USAGE (Keyboard) */
  33. 0xA1, 0x01, /* COLLECTION (Application) */
  34. 0x85, 0x01, /* REPORT_ID (1) */
  35. 0x95, 0x08, /* REPORT_COUNT (8) */
  36. 0x75, 0x01, /* REPORT_SIZE (1) */
  37. 0x15, 0x00, /* LOGICAL_MINIMUM (0) */
  38. 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
  39. 0x05, 0x07, /* USAGE_PAGE (Keyboard) */
  40. 0x19, 0xE0, /* USAGE_MINIMUM (Left Control) */
  41. 0x29, 0xE7, /* USAGE_MAXIMUM (Right GUI) */
  42. 0x81, 0x02, /* INPUT (Data,Var,Abs) */
  43. 0x95, 0x05, /* REPORT COUNT (5) */
  44. 0x05, 0x08, /* USAGE PAGE (LED page) */
  45. 0x19, 0x01, /* USAGE MINIMUM (1) */
  46. 0x29, 0x05, /* USAGE MAXIMUM (5) */
  47. 0x91, 0x02, /* OUTPUT (Data, Variable, Absolute) */
  48. 0x95, 0x01, /* REPORT COUNT (1) */
  49. 0x75, 0x03, /* REPORT SIZE (3) */
  50. 0x91, 0x01, /* OUTPUT (Constant) */
  51. 0x95, 0x06, /* REPORT_COUNT (6) */
  52. 0x75, 0x08, /* REPORT_SIZE (8) */
  53. 0x15, 0x00, /* LOGICAL_MINIMUM (0) */
  54. 0x26, 0xFF, 0x00, /* LOGICAL_MAXIMUM (255) */
  55. 0x05, 0x07, /* USAGE_PAGE (Keyboard) */
  56. 0x19, 0x00, /* USAGE_MINIMUM (no event) */
  57. 0x2A, 0xFF, 0x00, /* USAGE_MAXIMUM (reserved) */
  58. 0x81, 0x00, /* INPUT (Data,Ary,Abs) */
  59. 0xC0
  60. };
  61. /* Mouse descriptor (2) */
  62. static const char mse_descriptor[] = {
  63. 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
  64. 0x09, 0x02, /* USAGE (Mouse) */
  65. 0xA1, 0x01, /* COLLECTION (Application) */
  66. 0x85, 0x02, /* REPORT_ID = 2 */
  67. 0x09, 0x01, /* USAGE (pointer) */
  68. 0xA1, 0x00, /* COLLECTION (physical) */
  69. 0x05, 0x09, /* USAGE_PAGE (buttons) */
  70. 0x19, 0x01, /* USAGE_MIN (1) */
  71. 0x29, 0x10, /* USAGE_MAX (16) */
  72. 0x15, 0x00, /* LOGICAL_MIN (0) */
  73. 0x25, 0x01, /* LOGICAL_MAX (1) */
  74. 0x95, 0x10, /* REPORT_COUNT (16) */
  75. 0x75, 0x01, /* REPORT_SIZE (1) */
  76. 0x81, 0x02, /* INPUT (data var abs) */
  77. 0x05, 0x01, /* USAGE_PAGE (generic desktop) */
  78. 0x16, 0x01, 0xF8, /* LOGICAL_MIN (-2047) */
  79. 0x26, 0xFF, 0x07, /* LOGICAL_MAX (2047) */
  80. 0x75, 0x0C, /* REPORT_SIZE (12) */
  81. 0x95, 0x02, /* REPORT_COUNT (2) */
  82. 0x09, 0x30, /* USAGE (X) */
  83. 0x09, 0x31, /* USAGE (Y) */
  84. 0x81, 0x06, /* INPUT */
  85. 0x15, 0x81, /* LOGICAL_MIN (-127) */
  86. 0x25, 0x7F, /* LOGICAL_MAX (127) */
  87. 0x75, 0x08, /* REPORT_SIZE (8) */
  88. 0x95, 0x01, /* REPORT_COUNT (1) */
  89. 0x09, 0x38, /* USAGE (wheel) */
  90. 0x81, 0x06, /* INPUT */
  91. 0x05, 0x0C, /* USAGE_PAGE(consumer) */
  92. 0x0A, 0x38, 0x02, /* USAGE(AC Pan) */
  93. 0x95, 0x01, /* REPORT_COUNT (1) */
  94. 0x81, 0x06, /* INPUT */
  95. 0xC0, /* END_COLLECTION */
  96. 0xC0, /* END_COLLECTION */
  97. };
  98. /* Consumer Control descriptor (3) */
  99. static const char consumer_descriptor[] = {
  100. 0x05, 0x0C, /* USAGE_PAGE (Consumer Devices) */
  101. 0x09, 0x01, /* USAGE (Consumer Control) */
  102. 0xA1, 0x01, /* COLLECTION (Application) */
  103. 0x85, 0x03, /* REPORT_ID = 3 */
  104. 0x75, 0x10, /* REPORT_SIZE (16) */
  105. 0x95, 0x02, /* REPORT_COUNT (2) */
  106. 0x15, 0x01, /* LOGICAL_MIN (1) */
  107. 0x26, 0x8C, 0x02, /* LOGICAL_MAX (652) */
  108. 0x19, 0x01, /* USAGE_MIN (1) */
  109. 0x2A, 0x8C, 0x02, /* USAGE_MAX (652) */
  110. 0x81, 0x00, /* INPUT (Data Ary Abs) */
  111. 0xC0, /* END_COLLECTION */
  112. }; /* */
  113. /* System control descriptor (4) */
  114. static const char syscontrol_descriptor[] = {
  115. 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
  116. 0x09, 0x80, /* USAGE (System Control) */
  117. 0xA1, 0x01, /* COLLECTION (Application) */
  118. 0x85, 0x04, /* REPORT_ID = 4 */
  119. 0x75, 0x02, /* REPORT_SIZE (2) */
  120. 0x95, 0x01, /* REPORT_COUNT (1) */
  121. 0x15, 0x01, /* LOGICAL_MIN (1) */
  122. 0x25, 0x03, /* LOGICAL_MAX (3) */
  123. 0x09, 0x82, /* USAGE (System Sleep) */
  124. 0x09, 0x81, /* USAGE (System Power Down) */
  125. 0x09, 0x83, /* USAGE (System Wake Up) */
  126. 0x81, 0x60, /* INPUT (Data Ary Abs NPrf Null) */
  127. 0x75, 0x06, /* REPORT_SIZE (6) */
  128. 0x81, 0x03, /* INPUT (Cnst Var Abs) */
  129. 0xC0, /* END_COLLECTION */
  130. };
  131. /* Media descriptor (8) */
  132. static const char media_descriptor[] = {
  133. 0x06, 0xbc, 0xff, /* Usage Page 0xffbc */
  134. 0x09, 0x88, /* Usage 0x0088 */
  135. 0xa1, 0x01, /* BeginCollection */
  136. 0x85, 0x08, /* Report ID 8 */
  137. 0x19, 0x01, /* Usage Min 0x0001 */
  138. 0x29, 0xff, /* Usage Max 0x00ff */
  139. 0x15, 0x01, /* Logical Min 1 */
  140. 0x26, 0xff, 0x00, /* Logical Max 255 */
  141. 0x75, 0x08, /* Report Size 8 */
  142. 0x95, 0x01, /* Report Count 1 */
  143. 0x81, 0x00, /* Input */
  144. 0xc0, /* EndCollection */
  145. }; /* */
  146. /* Maximum size of all defined hid reports in bytes (including report id) */
  147. #define MAX_REPORT_SIZE 8
  148. /* Number of possible hid report types that can be created by this driver.
  149. *
  150. * Right now, RF report types have the same report types (or report id's)
  151. * than the hid report created from those RF reports. In the future
  152. * this doesnt have to be true.
  153. *
  154. * For instance, RF report type 0x01 which has a size of 8 bytes, corresponds
  155. * to hid report id 0x01, this is standard keyboard. Same thing applies to mice
  156. * reports and consumer control, etc. If a new RF report is created, it doesn't
  157. * has to have the same report id as its corresponding hid report, so an
  158. * translation may have to take place for future report types.
  159. */
  160. #define NUMBER_OF_HID_REPORTS 32
  161. static const u8 hid_reportid_size_map[NUMBER_OF_HID_REPORTS] = {
  162. [1] = 8, /* Standard keyboard */
  163. [2] = 8, /* Standard mouse */
  164. [3] = 5, /* Consumer control */
  165. [4] = 2, /* System control */
  166. [8] = 2, /* Media Center */
  167. };
  168. #define LOGITECH_DJ_INTERFACE_NUMBER 0x02
  169. static struct hid_ll_driver logi_dj_ll_driver;
  170. static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
  171. size_t count,
  172. unsigned char report_type);
  173. static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev);
  174. static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev,
  175. struct dj_report *dj_report)
  176. {
  177. /* Called in delayed work context */
  178. struct dj_device *dj_dev;
  179. unsigned long flags;
  180. spin_lock_irqsave(&djrcv_dev->lock, flags);
  181. dj_dev = djrcv_dev->paired_dj_devices[dj_report->device_index];
  182. djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
  183. spin_unlock_irqrestore(&djrcv_dev->lock, flags);
  184. if (dj_dev != NULL) {
  185. hid_destroy_device(dj_dev->hdev);
  186. kfree(dj_dev);
  187. } else {
  188. dev_err(&djrcv_dev->hdev->dev, "%s: can't destroy a NULL device\n",
  189. __func__);
  190. }
  191. }
  192. static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev,
  193. struct dj_report *dj_report)
  194. {
  195. /* Called in delayed work context */
  196. struct hid_device *djrcv_hdev = djrcv_dev->hdev;
  197. struct usb_interface *intf = to_usb_interface(djrcv_hdev->dev.parent);
  198. struct usb_device *usbdev = interface_to_usbdev(intf);
  199. struct hid_device *dj_hiddev;
  200. struct dj_device *dj_dev;
  201. /* Device index goes from 1 to 6, we need 3 bytes to store the
  202. * semicolon, the index, and a null terminator
  203. */
  204. unsigned char tmpstr[3];
  205. if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] &
  206. SPFUNCTION_DEVICE_LIST_EMPTY) {
  207. dbg_hid("%s: device list is empty\n", __func__);
  208. djrcv_dev->querying_devices = false;
  209. return;
  210. }
  211. if (djrcv_dev->paired_dj_devices[dj_report->device_index]) {
  212. /* The device is already known. No need to reallocate it. */
  213. dbg_hid("%s: device is already known\n", __func__);
  214. return;
  215. }
  216. dj_hiddev = hid_allocate_device();
  217. if (IS_ERR(dj_hiddev)) {
  218. dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n",
  219. __func__);
  220. return;
  221. }
  222. dj_hiddev->ll_driver = &logi_dj_ll_driver;
  223. dj_hiddev->hid_output_raw_report = logi_dj_output_hidraw_report;
  224. dj_hiddev->dev.parent = &djrcv_hdev->dev;
  225. dj_hiddev->bus = BUS_USB;
  226. dj_hiddev->vendor = le16_to_cpu(usbdev->descriptor.idVendor);
  227. dj_hiddev->product = le16_to_cpu(usbdev->descriptor.idProduct);
  228. snprintf(dj_hiddev->name, sizeof(dj_hiddev->name),
  229. "Logitech Unifying Device. Wireless PID:%02x%02x",
  230. dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_MSB],
  231. dj_report->report_params[DEVICE_PAIRED_PARAM_EQUAD_ID_LSB]);
  232. usb_make_path(usbdev, dj_hiddev->phys, sizeof(dj_hiddev->phys));
  233. snprintf(tmpstr, sizeof(tmpstr), ":%d", dj_report->device_index);
  234. strlcat(dj_hiddev->phys, tmpstr, sizeof(dj_hiddev->phys));
  235. dj_dev = kzalloc(sizeof(struct dj_device), GFP_KERNEL);
  236. if (!dj_dev) {
  237. dev_err(&djrcv_hdev->dev, "%s: failed allocating dj_device\n",
  238. __func__);
  239. goto dj_device_allocate_fail;
  240. }
  241. dj_dev->reports_supported = get_unaligned_le32(
  242. dj_report->report_params + DEVICE_PAIRED_RF_REPORT_TYPE);
  243. dj_dev->hdev = dj_hiddev;
  244. dj_dev->dj_receiver_dev = djrcv_dev;
  245. dj_dev->device_index = dj_report->device_index;
  246. dj_hiddev->driver_data = dj_dev;
  247. djrcv_dev->paired_dj_devices[dj_report->device_index] = dj_dev;
  248. if (hid_add_device(dj_hiddev)) {
  249. dev_err(&djrcv_hdev->dev, "%s: failed adding dj_device\n",
  250. __func__);
  251. goto hid_add_device_fail;
  252. }
  253. return;
  254. hid_add_device_fail:
  255. djrcv_dev->paired_dj_devices[dj_report->device_index] = NULL;
  256. kfree(dj_dev);
  257. dj_device_allocate_fail:
  258. hid_destroy_device(dj_hiddev);
  259. }
  260. static void delayedwork_callback(struct work_struct *work)
  261. {
  262. struct dj_receiver_dev *djrcv_dev =
  263. container_of(work, struct dj_receiver_dev, work);
  264. struct dj_report dj_report;
  265. unsigned long flags;
  266. int count;
  267. int retval;
  268. dbg_hid("%s\n", __func__);
  269. spin_lock_irqsave(&djrcv_dev->lock, flags);
  270. count = kfifo_out(&djrcv_dev->notif_fifo, &dj_report,
  271. sizeof(struct dj_report));
  272. if (count != sizeof(struct dj_report)) {
  273. dev_err(&djrcv_dev->hdev->dev, "%s: workitem triggered without "
  274. "notifications available\n", __func__);
  275. spin_unlock_irqrestore(&djrcv_dev->lock, flags);
  276. return;
  277. }
  278. if (!kfifo_is_empty(&djrcv_dev->notif_fifo)) {
  279. if (schedule_work(&djrcv_dev->work) == 0) {
  280. dbg_hid("%s: did not schedule the work item, was "
  281. "already queued\n", __func__);
  282. }
  283. }
  284. spin_unlock_irqrestore(&djrcv_dev->lock, flags);
  285. switch (dj_report.report_type) {
  286. case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
  287. logi_dj_recv_add_djhid_device(djrcv_dev, &dj_report);
  288. break;
  289. case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
  290. logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report);
  291. break;
  292. default:
  293. /* A normal report (i. e. not belonging to a pair/unpair notification)
  294. * arriving here, means that the report arrived but we did not have a
  295. * paired dj_device associated to the report's device_index, this
  296. * means that the original "device paired" notification corresponding
  297. * to this dj_device never arrived to this driver. The reason is that
  298. * hid-core discards all packets coming from a device while probe() is
  299. * executing. */
  300. if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) {
  301. /* ok, we don't know the device, just re-ask the
  302. * receiver for the list of connected devices. */
  303. retval = logi_dj_recv_query_paired_devices(djrcv_dev);
  304. if (!retval) {
  305. /* everything went fine, so just leave */
  306. break;
  307. }
  308. dev_err(&djrcv_dev->hdev->dev,
  309. "%s:logi_dj_recv_query_paired_devices "
  310. "error:%d\n", __func__, retval);
  311. }
  312. dbg_hid("%s: unexpected report type\n", __func__);
  313. }
  314. }
  315. static void logi_dj_recv_queue_notification(struct dj_receiver_dev *djrcv_dev,
  316. struct dj_report *dj_report)
  317. {
  318. /* We are called from atomic context (tasklet && djrcv->lock held) */
  319. kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
  320. if (schedule_work(&djrcv_dev->work) == 0) {
  321. dbg_hid("%s: did not schedule the work item, was already "
  322. "queued\n", __func__);
  323. }
  324. }
  325. static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev,
  326. struct dj_report *dj_report)
  327. {
  328. /* We are called from atomic context (tasklet && djrcv->lock held) */
  329. unsigned int i;
  330. u8 reportbuffer[MAX_REPORT_SIZE];
  331. struct dj_device *djdev;
  332. djdev = djrcv_dev->paired_dj_devices[dj_report->device_index];
  333. if (!djdev) {
  334. dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
  335. " is NULL, index %d\n", dj_report->device_index);
  336. kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
  337. if (schedule_work(&djrcv_dev->work) == 0) {
  338. dbg_hid("%s: did not schedule the work item, was already "
  339. "queued\n", __func__);
  340. }
  341. return;
  342. }
  343. memset(reportbuffer, 0, sizeof(reportbuffer));
  344. for (i = 0; i < NUMBER_OF_HID_REPORTS; i++) {
  345. if (djdev->reports_supported & (1 << i)) {
  346. reportbuffer[0] = i;
  347. if (hid_input_report(djdev->hdev,
  348. HID_INPUT_REPORT,
  349. reportbuffer,
  350. hid_reportid_size_map[i], 1)) {
  351. dbg_hid("hid_input_report error sending null "
  352. "report\n");
  353. }
  354. }
  355. }
  356. }
  357. static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev,
  358. struct dj_report *dj_report)
  359. {
  360. /* We are called from atomic context (tasklet && djrcv->lock held) */
  361. struct dj_device *dj_device;
  362. dj_device = djrcv_dev->paired_dj_devices[dj_report->device_index];
  363. if (dj_device == NULL) {
  364. dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]"
  365. " is NULL, index %d\n", dj_report->device_index);
  366. kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report));
  367. if (schedule_work(&djrcv_dev->work) == 0) {
  368. dbg_hid("%s: did not schedule the work item, was already "
  369. "queued\n", __func__);
  370. }
  371. return;
  372. }
  373. if ((dj_report->report_type > ARRAY_SIZE(hid_reportid_size_map) - 1) ||
  374. (hid_reportid_size_map[dj_report->report_type] == 0)) {
  375. dbg_hid("invalid report type:%x\n", dj_report->report_type);
  376. return;
  377. }
  378. if (hid_input_report(dj_device->hdev,
  379. HID_INPUT_REPORT, &dj_report->report_type,
  380. hid_reportid_size_map[dj_report->report_type], 1)) {
  381. dbg_hid("hid_input_report error\n");
  382. }
  383. }
  384. static int logi_dj_recv_send_report(struct dj_receiver_dev *djrcv_dev,
  385. struct dj_report *dj_report)
  386. {
  387. struct hid_device *hdev = djrcv_dev->hdev;
  388. struct hid_report *report;
  389. struct hid_report_enum *output_report_enum;
  390. u8 *data = (u8 *)(&dj_report->device_index);
  391. unsigned int i;
  392. output_report_enum = &hdev->report_enum[HID_OUTPUT_REPORT];
  393. report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
  394. if (!report) {
  395. dev_err(&hdev->dev, "%s: unable to find dj report\n", __func__);
  396. return -ENODEV;
  397. }
  398. for (i = 0; i < DJREPORT_SHORT_LENGTH - 1; i++)
  399. report->field[0]->value[i] = data[i];
  400. usbhid_submit_report(hdev, report, USB_DIR_OUT);
  401. return 0;
  402. }
  403. static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
  404. {
  405. struct dj_report *dj_report;
  406. int retval;
  407. dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
  408. if (!dj_report)
  409. return -ENOMEM;
  410. dj_report->report_id = REPORT_ID_DJ_SHORT;
  411. dj_report->device_index = 0xFF;
  412. dj_report->report_type = REPORT_TYPE_CMD_GET_PAIRED_DEVICES;
  413. retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
  414. kfree(dj_report);
  415. return retval;
  416. }
  417. static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
  418. unsigned timeout)
  419. {
  420. struct dj_report *dj_report;
  421. int retval;
  422. dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
  423. if (!dj_report)
  424. return -ENOMEM;
  425. dj_report->report_id = REPORT_ID_DJ_SHORT;
  426. dj_report->device_index = 0xFF;
  427. dj_report->report_type = REPORT_TYPE_CMD_SWITCH;
  428. dj_report->report_params[CMD_SWITCH_PARAM_DEVBITFIELD] = 0x3F;
  429. dj_report->report_params[CMD_SWITCH_PARAM_TIMEOUT_SECONDS] = (u8)timeout;
  430. retval = logi_dj_recv_send_report(djrcv_dev, dj_report);
  431. kfree(dj_report);
  432. return retval;
  433. }
  434. static int logi_dj_ll_open(struct hid_device *hid)
  435. {
  436. dbg_hid("%s:%s\n", __func__, hid->phys);
  437. return 0;
  438. }
  439. static void logi_dj_ll_close(struct hid_device *hid)
  440. {
  441. dbg_hid("%s:%s\n", __func__, hid->phys);
  442. }
  443. static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf,
  444. size_t count,
  445. unsigned char report_type)
  446. {
  447. /* Called by hid raw to send data */
  448. dbg_hid("%s\n", __func__);
  449. return 0;
  450. }
  451. static int logi_dj_ll_parse(struct hid_device *hid)
  452. {
  453. struct dj_device *djdev = hid->driver_data;
  454. int retval;
  455. dbg_hid("%s\n", __func__);
  456. djdev->hdev->version = 0x0111;
  457. djdev->hdev->country = 0x00;
  458. if (djdev->reports_supported & STD_KEYBOARD) {
  459. dbg_hid("%s: sending a kbd descriptor, reports_supported: %x\n",
  460. __func__, djdev->reports_supported);
  461. retval = hid_parse_report(hid,
  462. (u8 *) kbd_descriptor,
  463. sizeof(kbd_descriptor));
  464. if (retval) {
  465. dbg_hid("%s: sending a kbd descriptor, hid_parse failed"
  466. " error: %d\n", __func__, retval);
  467. return retval;
  468. }
  469. }
  470. if (djdev->reports_supported & STD_MOUSE) {
  471. dbg_hid("%s: sending a mouse descriptor, reports_supported: "
  472. "%x\n", __func__, djdev->reports_supported);
  473. retval = hid_parse_report(hid,
  474. (u8 *) mse_descriptor,
  475. sizeof(mse_descriptor));
  476. if (retval) {
  477. dbg_hid("%s: sending a mouse descriptor, hid_parse "
  478. "failed error: %d\n", __func__, retval);
  479. return retval;
  480. }
  481. }
  482. if (djdev->reports_supported & MULTIMEDIA) {
  483. dbg_hid("%s: sending a multimedia report descriptor: %x\n",
  484. __func__, djdev->reports_supported);
  485. retval = hid_parse_report(hid,
  486. (u8 *) consumer_descriptor,
  487. sizeof(consumer_descriptor));
  488. if (retval) {
  489. dbg_hid("%s: sending a consumer_descriptor, hid_parse "
  490. "failed error: %d\n", __func__, retval);
  491. return retval;
  492. }
  493. }
  494. if (djdev->reports_supported & POWER_KEYS) {
  495. dbg_hid("%s: sending a power keys report descriptor: %x\n",
  496. __func__, djdev->reports_supported);
  497. retval = hid_parse_report(hid,
  498. (u8 *) syscontrol_descriptor,
  499. sizeof(syscontrol_descriptor));
  500. if (retval) {
  501. dbg_hid("%s: sending a syscontrol_descriptor, "
  502. "hid_parse failed error: %d\n",
  503. __func__, retval);
  504. return retval;
  505. }
  506. }
  507. if (djdev->reports_supported & MEDIA_CENTER) {
  508. dbg_hid("%s: sending a media center report descriptor: %x\n",
  509. __func__, djdev->reports_supported);
  510. retval = hid_parse_report(hid,
  511. (u8 *) media_descriptor,
  512. sizeof(media_descriptor));
  513. if (retval) {
  514. dbg_hid("%s: sending a media_descriptor, hid_parse "
  515. "failed error: %d\n", __func__, retval);
  516. return retval;
  517. }
  518. }
  519. if (djdev->reports_supported & KBD_LEDS) {
  520. dbg_hid("%s: need to send kbd leds report descriptor: %x\n",
  521. __func__, djdev->reports_supported);
  522. }
  523. return 0;
  524. }
  525. static int logi_dj_ll_input_event(struct input_dev *dev, unsigned int type,
  526. unsigned int code, int value)
  527. {
  528. /* Sent by the input layer to handle leds and Force Feedback */
  529. struct hid_device *dj_hiddev = input_get_drvdata(dev);
  530. struct dj_device *dj_dev = dj_hiddev->driver_data;
  531. struct dj_receiver_dev *djrcv_dev =
  532. dev_get_drvdata(dj_hiddev->dev.parent);
  533. struct hid_device *dj_rcv_hiddev = djrcv_dev->hdev;
  534. struct hid_report_enum *output_report_enum;
  535. struct hid_field *field;
  536. struct hid_report *report;
  537. unsigned char data[8];
  538. int offset;
  539. dbg_hid("%s: %s, type:%d | code:%d | value:%d\n",
  540. __func__, dev->phys, type, code, value);
  541. if (type != EV_LED)
  542. return -1;
  543. offset = hidinput_find_field(dj_hiddev, type, code, &field);
  544. if (offset == -1) {
  545. dev_warn(&dev->dev, "event field not found\n");
  546. return -1;
  547. }
  548. hid_set_field(field, offset, value);
  549. hid_output_report(field->report, &data[0]);
  550. output_report_enum = &dj_rcv_hiddev->report_enum[HID_OUTPUT_REPORT];
  551. report = output_report_enum->report_id_hash[REPORT_ID_DJ_SHORT];
  552. hid_set_field(report->field[0], 0, dj_dev->device_index);
  553. hid_set_field(report->field[0], 1, REPORT_TYPE_LEDS);
  554. hid_set_field(report->field[0], 2, data[1]);
  555. usbhid_submit_report(dj_rcv_hiddev, report, USB_DIR_OUT);
  556. return 0;
  557. }
  558. static int logi_dj_ll_start(struct hid_device *hid)
  559. {
  560. dbg_hid("%s\n", __func__);
  561. return 0;
  562. }
  563. static void logi_dj_ll_stop(struct hid_device *hid)
  564. {
  565. dbg_hid("%s\n", __func__);
  566. }
  567. static struct hid_ll_driver logi_dj_ll_driver = {
  568. .parse = logi_dj_ll_parse,
  569. .start = logi_dj_ll_start,
  570. .stop = logi_dj_ll_stop,
  571. .open = logi_dj_ll_open,
  572. .close = logi_dj_ll_close,
  573. .hidinput_input_event = logi_dj_ll_input_event,
  574. };
  575. static int logi_dj_raw_event(struct hid_device *hdev,
  576. struct hid_report *report, u8 *data,
  577. int size)
  578. {
  579. struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
  580. struct dj_report *dj_report = (struct dj_report *) data;
  581. unsigned long flags;
  582. dbg_hid("%s, size:%d\n", __func__, size);
  583. /* Here we receive all data coming from iface 2, there are 4 cases:
  584. *
  585. * 1) Data should continue its normal processing i.e. data does not
  586. * come from the DJ collection, in which case we do nothing and
  587. * return 0, so hid-core can continue normal processing (will forward
  588. * to associated hidraw device)
  589. *
  590. * 2) Data is from DJ collection, and is intended for this driver i. e.
  591. * data contains arrival, departure, etc notifications, in which case
  592. * we queue them for delayed processing by the work queue. We return 1
  593. * to hid-core as no further processing is required from it.
  594. *
  595. * 3) Data is from DJ collection, and informs a connection change,
  596. * if the change means rf link loss, then we must send a null report
  597. * to the upper layer to discard potentially pressed keys that may be
  598. * repeated forever by the input layer. Return 1 to hid-core as no
  599. * further processing is required.
  600. *
  601. * 4) Data is from DJ collection and is an actual input event from
  602. * a paired DJ device in which case we forward it to the correct hid
  603. * device (via hid_input_report() ) and return 1 so hid-core does not do
  604. * anything else with it.
  605. */
  606. /* case 1) */
  607. if (data[0] != REPORT_ID_DJ_SHORT)
  608. return false;
  609. if ((dj_report->device_index < DJ_DEVICE_INDEX_MIN) ||
  610. (dj_report->device_index > DJ_DEVICE_INDEX_MAX)) {
  611. dev_err(&hdev->dev, "%s: invalid device index:%d\n",
  612. __func__, dj_report->device_index);
  613. return false;
  614. }
  615. spin_lock_irqsave(&djrcv_dev->lock, flags);
  616. switch (dj_report->report_type) {
  617. case REPORT_TYPE_NOTIF_DEVICE_PAIRED:
  618. case REPORT_TYPE_NOTIF_DEVICE_UNPAIRED:
  619. logi_dj_recv_queue_notification(djrcv_dev, dj_report);
  620. break;
  621. case REPORT_TYPE_NOTIF_CONNECTION_STATUS:
  622. if (dj_report->report_params[CONNECTION_STATUS_PARAM_STATUS] ==
  623. STATUS_LINKLOSS) {
  624. logi_dj_recv_forward_null_report(djrcv_dev, dj_report);
  625. }
  626. break;
  627. default:
  628. logi_dj_recv_forward_report(djrcv_dev, dj_report);
  629. }
  630. spin_unlock_irqrestore(&djrcv_dev->lock, flags);
  631. return true;
  632. }
  633. static int logi_dj_probe(struct hid_device *hdev,
  634. const struct hid_device_id *id)
  635. {
  636. struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
  637. struct dj_receiver_dev *djrcv_dev;
  638. int retval;
  639. if (is_dj_device((struct dj_device *)hdev->driver_data))
  640. return -ENODEV;
  641. dbg_hid("%s called for ifnum %d\n", __func__,
  642. intf->cur_altsetting->desc.bInterfaceNumber);
  643. /* Ignore interfaces 0 and 1, they will not carry any data, dont create
  644. * any hid_device for them */
  645. if (intf->cur_altsetting->desc.bInterfaceNumber !=
  646. LOGITECH_DJ_INTERFACE_NUMBER) {
  647. dbg_hid("%s: ignoring ifnum %d\n", __func__,
  648. intf->cur_altsetting->desc.bInterfaceNumber);
  649. return -ENODEV;
  650. }
  651. /* Treat interface 2 */
  652. djrcv_dev = kzalloc(sizeof(struct dj_receiver_dev), GFP_KERNEL);
  653. if (!djrcv_dev) {
  654. dev_err(&hdev->dev,
  655. "%s:failed allocating dj_receiver_dev\n", __func__);
  656. return -ENOMEM;
  657. }
  658. djrcv_dev->hdev = hdev;
  659. INIT_WORK(&djrcv_dev->work, delayedwork_callback);
  660. spin_lock_init(&djrcv_dev->lock);
  661. if (kfifo_alloc(&djrcv_dev->notif_fifo,
  662. DJ_MAX_NUMBER_NOTIFICATIONS * sizeof(struct dj_report),
  663. GFP_KERNEL)) {
  664. dev_err(&hdev->dev,
  665. "%s:failed allocating notif_fifo\n", __func__);
  666. kfree(djrcv_dev);
  667. return -ENOMEM;
  668. }
  669. hid_set_drvdata(hdev, djrcv_dev);
  670. /* Call to usbhid to fetch the HID descriptors of interface 2 and
  671. * subsequently call to the hid/hid-core to parse the fetched
  672. * descriptors, this will in turn create the hidraw and hiddev nodes
  673. * for interface 2 of the receiver */
  674. retval = hid_parse(hdev);
  675. if (retval) {
  676. dev_err(&hdev->dev,
  677. "%s:parse of interface 2 failed\n", __func__);
  678. goto hid_parse_fail;
  679. }
  680. if (!hid_validate_values(hdev, HID_OUTPUT_REPORT, REPORT_ID_DJ_SHORT,
  681. 0, DJREPORT_SHORT_LENGTH - 1)) {
  682. retval = -ENODEV;
  683. goto hid_parse_fail;
  684. }
  685. /* Starts the usb device and connects to upper interfaces hiddev and
  686. * hidraw */
  687. retval = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
  688. if (retval) {
  689. dev_err(&hdev->dev,
  690. "%s:hid_hw_start returned error\n", __func__);
  691. goto hid_hw_start_fail;
  692. }
  693. retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
  694. if (retval < 0) {
  695. dev_err(&hdev->dev,
  696. "%s:logi_dj_recv_switch_to_dj_mode returned error:%d\n",
  697. __func__, retval);
  698. goto switch_to_dj_mode_fail;
  699. }
  700. /* This is enabling the polling urb on the IN endpoint */
  701. retval = hdev->ll_driver->open(hdev);
  702. if (retval < 0) {
  703. dev_err(&hdev->dev, "%s:hdev->ll_driver->open returned "
  704. "error:%d\n", __func__, retval);
  705. goto llopen_failed;
  706. }
  707. retval = logi_dj_recv_query_paired_devices(djrcv_dev);
  708. if (retval < 0) {
  709. dev_err(&hdev->dev, "%s:logi_dj_recv_query_paired_devices "
  710. "error:%d\n", __func__, retval);
  711. goto logi_dj_recv_query_paired_devices_failed;
  712. }
  713. return retval;
  714. logi_dj_recv_query_paired_devices_failed:
  715. hdev->ll_driver->close(hdev);
  716. llopen_failed:
  717. switch_to_dj_mode_fail:
  718. hid_hw_stop(hdev);
  719. hid_hw_start_fail:
  720. hid_parse_fail:
  721. kfifo_free(&djrcv_dev->notif_fifo);
  722. kfree(djrcv_dev);
  723. hid_set_drvdata(hdev, NULL);
  724. return retval;
  725. }
  726. #ifdef CONFIG_PM
  727. static int logi_dj_reset_resume(struct hid_device *hdev)
  728. {
  729. int retval;
  730. struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
  731. retval = logi_dj_recv_switch_to_dj_mode(djrcv_dev, 0);
  732. if (retval < 0) {
  733. dev_err(&hdev->dev,
  734. "%s:logi_dj_recv_switch_to_dj_mode returned error:%d\n",
  735. __func__, retval);
  736. }
  737. return 0;
  738. }
  739. #endif
  740. static void logi_dj_remove(struct hid_device *hdev)
  741. {
  742. struct dj_receiver_dev *djrcv_dev = hid_get_drvdata(hdev);
  743. struct dj_device *dj_dev;
  744. int i;
  745. dbg_hid("%s\n", __func__);
  746. cancel_work_sync(&djrcv_dev->work);
  747. hdev->ll_driver->close(hdev);
  748. hid_hw_stop(hdev);
  749. /* I suppose that at this point the only context that can access
  750. * the djrecv_data is this thread as the work item is guaranteed to
  751. * have finished and no more raw_event callbacks should arrive after
  752. * the remove callback was triggered so no locks are put around the
  753. * code below */
  754. for (i = 0; i < (DJ_MAX_PAIRED_DEVICES + DJ_DEVICE_INDEX_MIN); i++) {
  755. dj_dev = djrcv_dev->paired_dj_devices[i];
  756. if (dj_dev != NULL) {
  757. hid_destroy_device(dj_dev->hdev);
  758. kfree(dj_dev);
  759. djrcv_dev->paired_dj_devices[i] = NULL;
  760. }
  761. }
  762. kfifo_free(&djrcv_dev->notif_fifo);
  763. kfree(djrcv_dev);
  764. hid_set_drvdata(hdev, NULL);
  765. }
  766. static int logi_djdevice_probe(struct hid_device *hdev,
  767. const struct hid_device_id *id)
  768. {
  769. int ret;
  770. struct dj_device *dj_dev = hdev->driver_data;
  771. if (!is_dj_device(dj_dev))
  772. return -ENODEV;
  773. ret = hid_parse(hdev);
  774. if (!ret)
  775. ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
  776. return ret;
  777. }
  778. static const struct hid_device_id logi_dj_receivers[] = {
  779. {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
  780. USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER)},
  781. {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
  782. USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2)},
  783. {}
  784. };
  785. MODULE_DEVICE_TABLE(hid, logi_dj_receivers);
  786. static struct hid_driver logi_djreceiver_driver = {
  787. .name = "logitech-djreceiver",
  788. .id_table = logi_dj_receivers,
  789. .probe = logi_dj_probe,
  790. .remove = logi_dj_remove,
  791. .raw_event = logi_dj_raw_event,
  792. #ifdef CONFIG_PM
  793. .reset_resume = logi_dj_reset_resume,
  794. #endif
  795. };
  796. static const struct hid_device_id logi_dj_devices[] = {
  797. {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
  798. USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER)},
  799. {HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH,
  800. USB_DEVICE_ID_LOGITECH_UNIFYING_RECEIVER_2)},
  801. {}
  802. };
  803. static struct hid_driver logi_djdevice_driver = {
  804. .name = "logitech-djdevice",
  805. .id_table = logi_dj_devices,
  806. .probe = logi_djdevice_probe,
  807. };
  808. static int __init logi_dj_init(void)
  809. {
  810. int retval;
  811. dbg_hid("Logitech-DJ:%s\n", __func__);
  812. retval = hid_register_driver(&logi_djreceiver_driver);
  813. if (retval)
  814. return retval;
  815. retval = hid_register_driver(&logi_djdevice_driver);
  816. if (retval)
  817. hid_unregister_driver(&logi_djreceiver_driver);
  818. return retval;
  819. }
  820. static void __exit logi_dj_exit(void)
  821. {
  822. dbg_hid("Logitech-DJ:%s\n", __func__);
  823. hid_unregister_driver(&logi_djdevice_driver);
  824. hid_unregister_driver(&logi_djreceiver_driver);
  825. }
  826. module_init(logi_dj_init);
  827. module_exit(logi_dj_exit);
  828. MODULE_LICENSE("GPL");
  829. MODULE_AUTHOR("Logitech");
  830. MODULE_AUTHOR("Nestor Lopez Casado");
  831. MODULE_AUTHOR("nlopezcasad@logitech.com");