mhl_rcp_inputdev.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*
  2. SiI8348 Linux Driver
  3. Copyright (C) 2013 Silicon Image, Inc.
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License as
  6. published by the Free Software Foundation version 2.
  7. This program is distributed AS-IS WITHOUT ANY WARRANTY of any
  8. kind, whether express or implied; INCLUDING without the implied warranty
  9. of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE or NON-INFRINGEMENT. See
  10. the GNU General Public License for more details at http://www.gnu.org/licenses/gpl-2.0.html.
  11. */
  12. /**
  13. @file mhl_rcp_inputdev.c
  14. */
  15. #include "sii_hal.h"
  16. #ifdef RCP_INPUTDEV_SUPPORT
  17. #include <linux/input.h>
  18. #include <linux/cdev.h>
  19. #include <linux/hrtimer.h>
  20. #include "si_fw_macros.h"
  21. #include "si_mhl_defs.h"
  22. #include "si_infoframe.h"
  23. #include "si_edid.h"
  24. #include "si_mhl2_edid_3d_api.h"
  25. #include "si_mhl_tx_hw_drv_api.h"
  26. #ifdef MEDIA_DATA_TUNNEL_SUPPORT
  27. #include "si_mdt_inputdev.h"
  28. #endif
  29. #include "mhl_linux_tx.h"
  30. #include "platform.h"
  31. static u16 rcp_def_keymap[] = {
  32. KEY_OK,
  33. KEY_UP,
  34. KEY_DOWN,
  35. KEY_LEFT,
  36. KEY_RIGHT,
  37. KEY_UNKNOWN, /* right-up */
  38. KEY_UNKNOWN, /* right-down */
  39. KEY_UNKNOWN, /* left-up */
  40. KEY_UNKNOWN, /* left-down */
  41. KEY_MENU,
  42. KEY_UNKNOWN, /* setup */
  43. KEY_UNKNOWN, /* contents */
  44. KEY_UNKNOWN, /* favorite */
  45. KEY_BACK,
  46. KEY_RESERVED, /* 0x0e */
  47. KEY_RESERVED,
  48. KEY_RESERVED,
  49. KEY_RESERVED,
  50. KEY_RESERVED,
  51. KEY_RESERVED,
  52. KEY_RESERVED,
  53. KEY_RESERVED,
  54. KEY_RESERVED,
  55. KEY_RESERVED,
  56. KEY_RESERVED,
  57. KEY_RESERVED,
  58. KEY_RESERVED,
  59. KEY_RESERVED,
  60. KEY_RESERVED,
  61. KEY_RESERVED,
  62. KEY_RESERVED,
  63. KEY_RESERVED, /* 0x1F */
  64. KEY_0,
  65. KEY_1,
  66. KEY_2,
  67. KEY_3,
  68. KEY_4,
  69. KEY_5,
  70. KEY_6,
  71. KEY_7,
  72. KEY_8,
  73. KEY_9,
  74. KEY_DOT,
  75. KEY_ENTER,
  76. KEY_CLEAR,
  77. KEY_RESERVED, /* 0x2D */
  78. KEY_RESERVED,
  79. KEY_RESERVED, /* 0x2F */
  80. KEY_UNKNOWN, /* channel up */
  81. KEY_UNKNOWN, /* channel down */
  82. KEY_UNKNOWN, /* previous channel */
  83. KEY_SOUND, /* sound select */
  84. KEY_UNKNOWN, /* input select */
  85. KEY_UNKNOWN, /* show information */
  86. KEY_UNKNOWN, /* help */
  87. KEY_UNKNOWN, /* page up */
  88. KEY_UNKNOWN, /* page down */
  89. KEY_RESERVED, /* 0x39 */
  90. KEY_RESERVED,
  91. KEY_RESERVED,
  92. KEY_RESERVED,
  93. KEY_RESERVED,
  94. KEY_RESERVED,
  95. KEY_RESERVED, /* 0x3F */
  96. KEY_RESERVED, /* 0x40 */
  97. KEY_UNKNOWN, /* volume up */
  98. KEY_UNKNOWN, /* volume down */
  99. KEY_UNKNOWN, /* mute */
  100. KEY_PLAY,
  101. KEY_STOP,
  102. KEY_PAUSECD,
  103. KEY_UNKNOWN, /* record */
  104. KEY_REWIND,
  105. KEY_FASTFORWARD,
  106. KEY_EJECTCD, /* eject */
  107. KEY_NEXTSONG,
  108. KEY_PREVIOUSSONG,
  109. KEY_RESERVED, /* 0x4D */
  110. KEY_RESERVED,
  111. KEY_RESERVED, /* 0x4F */
  112. KEY_UNKNOWN, /* angle */
  113. KEY_UNKNOWN, /* subtitle */
  114. KEY_RESERVED, /* 0x52 */
  115. KEY_RESERVED,
  116. KEY_RESERVED,
  117. KEY_RESERVED,
  118. KEY_RESERVED,
  119. KEY_RESERVED,
  120. KEY_RESERVED,
  121. KEY_RESERVED,
  122. KEY_RESERVED,
  123. KEY_RESERVED,
  124. KEY_RESERVED,
  125. KEY_RESERVED,
  126. KEY_RESERVED,
  127. KEY_RESERVED, /* 0x5F */
  128. KEY_PLAY,
  129. KEY_PAUSE,
  130. KEY_UNKNOWN, /* record_function */
  131. KEY_UNKNOWN, /* pause_record_function */
  132. KEY_STOP,
  133. KEY_UNKNOWN, /* mute_function */
  134. KEY_UNKNOWN, /* restore_volume_function */
  135. KEY_UNKNOWN, /* tune_function */
  136. KEY_UNKNOWN, /* select_media_function */
  137. KEY_RESERVED, /* 0x69 */
  138. KEY_RESERVED,
  139. KEY_RESERVED,
  140. KEY_RESERVED,
  141. KEY_RESERVED,
  142. KEY_RESERVED,
  143. KEY_RESERVED,
  144. KEY_RESERVED, /* 0x70 */
  145. KEY_F1, /* F1 */
  146. KEY_F2, /* F2 */
  147. KEY_F3, /* F3 */
  148. KEY_F4, /* F4 */
  149. KEY_F5, /* F5 */
  150. KEY_RESERVED, /* 0x76 */
  151. KEY_RESERVED,
  152. KEY_RESERVED,
  153. KEY_RESERVED,
  154. KEY_RESERVED,
  155. KEY_RESERVED,
  156. KEY_RESERVED,
  157. KEY_RESERVED, /* 0x7D */
  158. KEY_VENDOR,
  159. KEY_RESERVED, /* 0x7F */
  160. };
  161. int generate_rcp_input_event(struct mhl_dev_context *dev_context,
  162. uint8_t rcp_keycode)
  163. {
  164. int status = -EINVAL;
  165. if (dev_context->rcp_input_dev == NULL)
  166. {
  167. MHL_TX_DBG_ERR(dev_context, "RCP input device not exists!\n");
  168. goto exit;
  169. }
  170. if (rcp_keycode < ARRAY_SIZE(rcp_def_keymap) &&
  171. rcp_def_keymap[rcp_keycode] != KEY_UNKNOWN &&
  172. rcp_def_keymap[rcp_keycode] != KEY_RESERVED) {
  173. input_report_key(dev_context->rcp_input_dev, rcp_def_keymap[rcp_keycode], 1);
  174. input_report_key(dev_context->rcp_input_dev, rcp_def_keymap[rcp_keycode], 0);
  175. input_sync(dev_context->rcp_input_dev);
  176. status = 0;
  177. }
  178. exit:
  179. return status;
  180. }
  181. uint8_t init_rcp_input_dev(struct mhl_dev_context *dev_context)
  182. {
  183. int i;
  184. uint8_t error;
  185. struct input_dev *rcp_input_dev;
  186. if (dev_context->rcp_input_dev != NULL) {
  187. MHL_TX_DBG_INFO(dev_context, "RCP input device already exists!\n");
  188. return 0;
  189. }
  190. rcp_input_dev = input_allocate_device();
  191. if (!rcp_input_dev) {
  192. MHL_TX_DBG_ERR(dev_context, "Failed to allocate RCP input device\n");
  193. return -ENOMEM;
  194. }
  195. set_bit(EV_KEY, rcp_input_dev->evbit);
  196. // rcp_input_dev->phys = "mdt_kbd/input0";
  197. rcp_input_dev->name = "MHL Remote Control";
  198. rcp_input_dev->keycode = rcp_def_keymap;
  199. rcp_input_dev->keycodesize = sizeof(u16);
  200. rcp_input_dev->keycodemax = ARRAY_SIZE(rcp_def_keymap);
  201. for (i = 1; i < ARRAY_SIZE(rcp_def_keymap); i++) {
  202. u16 keycode = rcp_def_keymap[i];
  203. if (keycode != KEY_UNKNOWN && keycode != KEY_RESERVED)
  204. set_bit(keycode, rcp_input_dev->keybit);
  205. }
  206. rcp_input_dev->id.bustype = BUS_VIRTUAL;
  207. // rcp_input_dev->id.vendor = 0x1095;
  208. // rcp_input_dev->id.product = 0x8348;
  209. error = input_register_device(rcp_input_dev);
  210. if (error) {
  211. MHL_TX_DBG_ERR(dev_context, "Failed to register device\n");
  212. input_free_device(rcp_input_dev);
  213. return error;
  214. }
  215. MHL_TX_DBG_INFO(dev_context, "device created\n");
  216. dev_context->rcp_input_dev = rcp_input_dev;
  217. return 0;
  218. }
  219. void destroy_rcp_input_dev(struct mhl_dev_context *dev_context)
  220. {
  221. if (dev_context->rcp_input_dev) {
  222. input_unregister_device(dev_context->rcp_input_dev);
  223. dev_context->rcp_input_dev = NULL;
  224. }
  225. }
  226. #endif /* #ifdef RCP_INPUTDEV_SUPPORT */