si_mhl_defs.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  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 si_mhl_defs.h
  14. */
  15. //
  16. // This file contains MHL Specs related definitions.
  17. //
  18. /*
  19. * DEVCAP offsets
  20. */
  21. typedef enum
  22. {
  23. DEVCAP_OFFSET_DEV_STATE = 0x00
  24. ,DEVCAP_OFFSET_MHL_VERSION = 0x01
  25. ,DEVCAP_OFFSET_DEV_CAT = 0x02
  26. ,DEVCAP_OFFSET_ADOPTER_ID_H = 0x03
  27. ,DEVCAP_OFFSET_ADOPTER_ID_L = 0x04
  28. ,DEVCAP_OFFSET_VID_LINK_MODE = 0x05
  29. ,DEVCAP_OFFSET_AUD_LINK_MODE = 0x06
  30. ,DEVCAP_OFFSET_VIDEO_TYPE = 0x07
  31. ,DEVCAP_OFFSET_LOG_DEV_MAP = 0x08
  32. ,DEVCAP_OFFSET_BANDWIDTH = 0x09
  33. ,DEVCAP_OFFSET_FEATURE_FLAG = 0x0A
  34. ,DEVCAP_OFFSET_DEVICE_ID_H = 0x0B
  35. ,DEVCAP_OFFSET_DEVICE_ID_L = 0x0C
  36. ,DEVCAP_OFFSET_SCRATCHPAD_SIZE = 0x0D
  37. ,DEVCAP_OFFSET_INT_STAT_SIZE = 0x0E
  38. ,DEVCAP_OFFSET_RESERVED = 0x0F
  39. /* this one must be last */
  40. ,DEVCAP_SIZE
  41. }DevCapOffset_e;
  42. SI_PUSH_STRUCT_PACKING //(
  43. typedef struct SI_PACK_THIS_STRUCT _MHLDevCap_t
  44. {
  45. uint8_t state;
  46. uint8_t mhl_version;
  47. uint8_t deviceCategory;
  48. uint8_t adopterIdHigh;
  49. uint8_t adopterIdLow;
  50. uint8_t vid_link_mode;
  51. uint8_t audLinkMode;
  52. uint8_t videoType;
  53. uint8_t logicalDeviceMap;
  54. uint8_t bandWidth;
  55. uint8_t featureFlag;
  56. uint8_t deviceIdHigh;
  57. uint8_t deviceIdLow;
  58. uint8_t scratchPadSize;
  59. uint8_t int_state_size;
  60. uint8_t reserved;
  61. }MHLDevCap_t,*PMHLDevCap_t;
  62. typedef union
  63. {
  64. MHLDevCap_t mdc;
  65. uint8_t devcap_cache[DEVCAP_SIZE];
  66. }MHLDevCap_u,*PMHLDevCap_u;
  67. SI_POP_STRUCT_PACKING //)
  68. // Device Power State
  69. #define MHL_DEV_UNPOWERED 0x00
  70. #define MHL_DEV_INACTIVE 0x01
  71. #define MHL_DEV_QUIET 0x03
  72. #define MHL_DEV_ACTIVE 0x04
  73. // Version that this chip supports
  74. #define MHL_VER_MAJOR (0x02 << 4) // bits 4..7
  75. #define MHL_VER_MINOR 0x00 // bits 0..3
  76. #define MHL_VERSION (MHL_VER_MAJOR | MHL_VER_MINOR)
  77. //Device Category
  78. #define MHL_DEV_CATEGORY_OFFSET DEVCAP_OFFSET_DEV_CAT
  79. #define MHL_DEV_CATEGORY_POW_BIT 0x10
  80. #define MHL_DEV_CAT_SINK 0x01
  81. #define MHL_DEV_CAT_SOURCE 0x02
  82. #define MHL_DEV_CAT_DONGLE 0x03
  83. #define MHL_DEV_CAT_SELF_POWERED_DONGLE 0x13
  84. //Video Link Mode
  85. #define MHL_DEV_VID_LINK_SUPPRGB444 0x01
  86. #define MHL_DEV_VID_LINK_SUPPYCBCR444 0x02
  87. #define MHL_DEV_VID_LINK_SUPPYCBCR422 0x04
  88. #define MHL_DEV_VID_LINK_SUPP_PPIXEL 0x08
  89. #define MHL_DEV_VID_LINK_SUPP_ISLANDS 0x10
  90. //Audio Link Mode Support
  91. #define MHL_DEV_AUD_LINK_2CH 0x01
  92. #define MHL_DEV_AUD_LINK_8CH 0x02
  93. //Feature Flag in the devcap
  94. #define MHL_DEV_FEATURE_FLAG_OFFSET DEVCAP_OFFSET_FEATURE_FLAG
  95. #define MHL_FEATURE_RCP_SUPPORT 0x01
  96. #define MHL_FEATURE_RAP_SUPPORT 0x02
  97. #define MHL_FEATURE_SP_SUPPORT 0x04
  98. #define MHL_FEATURE_UCP_SEND_SUPPORT 0x08
  99. #define MHL_FEATURE_UCP_RECV_SUPPORT 0x10
  100. // VIDEO TYPES
  101. #define MHL_VT_GRAPHICS 0x00
  102. #define MHL_VT_PHOTO 0x02
  103. #define MHL_VT_CINEMA 0x04
  104. #define MHL_VT_GAMES 0x08
  105. #define MHL_SUPP_VT 0x80
  106. //Logical Dev Map
  107. #define MHL_DEV_LD_DISPLAY (0x01 << 0)
  108. #define MHL_DEV_LD_VIDEO (0x01 << 1)
  109. #define MHL_DEV_LD_AUDIO (0x01 << 2)
  110. #define MHL_DEV_LD_MEDIA (0x01 << 3)
  111. #define MHL_DEV_LD_TUNER (0x01 << 4)
  112. #define MHL_DEV_LD_RECORD (0x01 << 5)
  113. #define MHL_DEV_LD_SPEAKER (0x01 << 6)
  114. #define MHL_DEV_LD_GUI (0x01 << 7)
  115. //Bandwidth
  116. #define MHL_BANDWIDTH_LIMIT 22 // 225 MHz
  117. #define MHL_STATUS_REG_CONNECTED_RDY 0x30
  118. #define MHL_STATUS_REG_LINK_MODE 0x31
  119. #define MHL_STATUS_DCAP_RDY 0x01
  120. #define MHL_STATUS_CLK_MODE_MASK 0x07
  121. #define MHL_STATUS_CLK_MODE_PACKED_PIXEL 0x02
  122. #define MHL_STATUS_CLK_MODE_NORMAL 0x03
  123. #define MHL_STATUS_PATH_EN_MASK 0x08
  124. #define MHL_STATUS_PATH_ENABLED 0x08
  125. #define MHL_STATUS_PATH_DISABLED 0x00
  126. #define MHL_STATUS_MUTED_MASK 0x10
  127. #define MHL_RCHANGE_INT 0x20
  128. #define MHL_DCHANGE_INT 0x21
  129. #define MHL_INT_DCAP_CHG 0x01
  130. #define MHL_INT_DSCR_CHG 0x02
  131. #define MHL_INT_REQ_WRT 0x04
  132. #define MHL_INT_GRT_WRT 0x08
  133. #define MHL2_INT_3D_REQ 0x10
  134. // On INTR_1 the EDID_CHG is located at BIT 0
  135. #define MHL_INT_EDID_CHG 0x02
  136. #define MHL_INT_AND_STATUS_SIZE 0x33 // This contains one nibble each - max offset
  137. #define MHL_SCRATCHPAD_SIZE 16
  138. #define MHL_MAX_BUFFER_SIZE MHL_SCRATCHPAD_SIZE // manually define highest number
  139. #define SILICON_IMAGE_ADOPTER_ID 322
  140. typedef enum
  141. {
  142. MHL_TEST_ADOPTER_ID = 0
  143. ,burst_id_3D_VIC = 0x0010
  144. ,burst_id_3D_DTD = 0x0011
  145. ,LOCAL_ADOPTER_ID = SILICON_IMAGE_ADOPTER_ID
  146. // add new burst ID's above here
  147. /* Burst ID's are a 16-bit big-endian quantity.
  148. In order for the BURST_ID macro below to allow detection of
  149. out-of-range values with KEIL 8051 compiler
  150. we must have at least one enumerated value
  151. that has one of the bits in the high order byte set.
  152. Experimentally, we have found that the KEIL 8051 compiler
  153. treats 0xFFFF as a special case (-1 perhaps...),
  154. so we use a different value that has some upper bits set
  155. */
  156. ,burst_id_16_BITS_REQUIRED = 0x8000
  157. }BurstId_e;
  158. typedef struct _MHL2_high_low_t
  159. {
  160. uint8_t high;
  161. uint8_t low;
  162. }MHL2_high_low_t,*PMHL2_high_low_t;
  163. #define BURST_ID(bid) (BurstId_e)(( ((uint16_t)(bid.high))<<8 )|((uint16_t)(bid.low)))
  164. // see MHL2.0 spec section 5.9.1.2
  165. typedef struct _MHL2_video_descriptor_t
  166. {
  167. uint8_t reserved_high;
  168. unsigned char frame_sequential:1; //FB_SUPP
  169. unsigned char top_bottom:1; //TB_SUPP
  170. unsigned char left_right:1; //LR_SUPP
  171. unsigned char reserved_low:5;
  172. }MHL2_video_descriptor_t,*PMHL2_video_descriptor_t;
  173. typedef struct _MHL2_video_format_data_t
  174. {
  175. MHL2_high_low_t burst_id;
  176. uint8_t checksum;
  177. uint8_t total_entries;
  178. uint8_t sequence_index;
  179. uint8_t num_entries_this_burst;
  180. MHL2_video_descriptor_t video_descriptors[5];
  181. }MHL2_video_format_data_t,*PMHL2_video_format_data_t;
  182. enum
  183. {
  184. MHL_MSC_MSG_RCP = 0x10, /* RCP sub-command */
  185. MHL_MSC_MSG_RCPK = 0x11, /* RCP Acknowledge sub-command */
  186. MHL_MSC_MSG_RCPE = 0x12, /* RCP Error sub-command */
  187. MHL_MSC_MSG_RAP = 0x20, /* Mode Change Warning sub-command */
  188. MHL_MSC_MSG_RAPK = 0x21, /* MCW Acknowledge sub-command */
  189. MHL_MSC_MSG_UCP = 0x30, /* UCP sub-command */
  190. MHL_MSC_MSG_UCPK = 0x31, /* UCP Acknowledge sub-command */
  191. MHL_MSC_MSG_UCPE = 0x32 /* UCP Error sub-command */
  192. };
  193. #define RCPE_NO_ERROR 0x00
  194. #define RCPE_INEEFECTIVE_KEY_CODE 0x01
  195. #define RCPE_BUSY 0x02
  196. //
  197. // MHL spec related defines
  198. //
  199. enum
  200. {
  201. MHL_ACK = 0x33, // Command or Data byte acknowledge
  202. MHL_NACK = 0x34, // Command or Data byte not acknowledge
  203. MHL_ABORT = 0x35, // Transaction abort
  204. MHL_WRITE_STAT = 0x60 | 0x80, // 0xE0 - Write one status register strip top bit
  205. MHL_SET_INT = 0x60, // Write one interrupt register
  206. MHL_READ_DEVCAP = 0x61, // Read one register
  207. MHL_GET_STATE = 0x62, // Read CBUS revision level from follower
  208. MHL_GET_VENDOR_ID = 0x63, // Read vendor ID value from follower.
  209. MHL_SET_HPD = 0x64, // Set Hot Plug Detect in follower
  210. MHL_CLR_HPD = 0x65, // Clear Hot Plug Detect in follower
  211. MHL_SET_CAP_ID = 0x66, // Set Capture ID for downstream device.
  212. MHL_GET_CAP_ID = 0x67, // Get Capture ID from downstream device.
  213. MHL_MSC_MSG = 0x68, // VS command to send RCP sub-commands
  214. MHL_GET_SC1_ERRORCODE = 0x69, // Get Vendor-Specific command error code.
  215. MHL_GET_DDC_ERRORCODE = 0x6A, // Get DDC channel command error code.
  216. MHL_GET_MSC_ERRORCODE = 0x6B, // Get MSC command error code.
  217. MHL_WRITE_BURST = 0x6C, // Write 1-16 bytes to responder's scratchpad.
  218. MHL_GET_SC3_ERRORCODE = 0x6D, // Get channel 3 command error code.
  219. MHL_READ_EDID_BLOCK /* let this one float, it has no specific value */
  220. };
  221. /* RAP action codes */
  222. #define MHL_RAP_POLL 0x00 // Just do an ack
  223. #define MHL_RAP_CONTENT_ON 0x10 // Turn content streaming ON.
  224. #define MHL_RAP_CONTENT_OFF 0x11 // Turn content streaming OFF.
  225. /* RAPK status codes */
  226. #define MHL_RAPK_NO_ERR 0x00 /* RAP action recognized & supported */
  227. #define MHL_RAPK_UNRECOGNIZED 0x01 /* Unknown RAP action code received */
  228. #define MHL_RAPK_UNSUPPORTED 0x02 /* Received RAP action code is not supported */
  229. #define MHL_RAPK_BUSY 0x03 /* Responder too busy to respond */
  230. /*
  231. * Error status codes for RCPE messages
  232. */
  233. /* No error. (Not allowed in RCPE messages) */
  234. #define MHL_RCPE_STATUS_NO_ERROR 0x00
  235. /* Unsupported/unrecognized key code */
  236. #define MHL_RCPE_STATUS_INEEFECTIVE_KEY_CODE 0x01
  237. /* Responder busy. Initiator may retry message */
  238. #define MHL_RCPE_STATUS_BUSY 0x02
  239. ///////////////////////////////////////////////////////////////////////////////
  240. //
  241. // MHL Timings applicable to this driver.
  242. //
  243. //
  244. #define T_SRC_VBUS_CBUS_TO_STABLE (200) // 100 - 1000 milliseconds. Per MHL 1.0 Specs
  245. #define T_SRC_WAKE_PULSE_WIDTH_1 (20) // 20 milliseconds. Per MHL 1.0 Specs
  246. #define T_SRC_WAKE_PULSE_WIDTH_2 (60) // 60 milliseconds. Per MHL 1.0 Specs
  247. #define T_SRC_WAKE_TO_DISCOVER (200) // 100 - 1000 milliseconds. Per MHL 1.0 Specs
  248. #define T_SRC_VBUS_CBUS_T0_STABLE (500)
  249. // Allow RSEN to stay low this much before reacting.
  250. // Per specs between 100 to 200 ms
  251. #define T_SRC_RSEN_DEGLITCH (100) // (150)
  252. // Wait this much after connection before reacting to RSEN (300-500ms)
  253. // Per specs between 300 to 500 ms
  254. #define T_SRC_RXSENSE_CHK (400)