hdmi_mapping.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "drv_types.h"
  2. #include "hdmi.h"
  3. #include "hdmi_dbg.h"
  4. #include "hdmi_mapping.h"
  5. /*
  6. Check the following config for hdmi port mapping
  7. CONFIG_HDMI_NUM - hdmi source number
  8. SISCONFIG_HDMI_SWITCH - hdmi switch location
  9. SISCONFIG_HDMI_PORT_MAP - hw and source mapping
  10. */
  11. #define SWITCH_FOR_PORTA ((CONFIG_HDMI_SWITCH&0xF))
  12. #define SWITCH_FOR_PORTB ((CONFIG_HDMI_SWITCH>>4)&0xF)
  13. #define SWITCH_FOR_PORTC ((CONFIG_HDMI_SWITCH>>8)&0xF)
  14. #define SWITCH_FOR_PORTD ((CONFIG_HDMI_SWITCH>>12)&0xF)
  15. #if (SWITCH_FOR_PORTA > 0)
  16. #define A_PORT_NUM SWITCH_FOR_PORTA
  17. #else
  18. #define A_PORT_NUM 1
  19. #endif
  20. #if (SWITCH_FOR_PORTB > 0)
  21. #define B_PORT_NUM SWITCH_FOR_PORTB
  22. #else
  23. #define B_PORT_NUM 1
  24. #endif
  25. #if (SWITCH_FOR_PORTC > 0)
  26. #define C_PORT_NUM SWITCH_FOR_PORTC
  27. #else
  28. #define C_PORT_NUM 1
  29. #endif
  30. #if (SWITCH_FOR_PORTD > 0)
  31. #define D_PORT_NUM SWITCH_FOR_PORTD
  32. #else
  33. #define D_PORT_NUM 1
  34. #endif
  35. #define HDMI_CONNECTOR_NUM (A_PORT_NUM + B_PORT_NUM + C_PORT_NUM + D_PORT_NUM)
  36. #if (SWITCH_FOR_PORTA > 0 || SWITCH_FOR_PORTB > 0 || SWITCH_FOR_PORTC > 0 || SWITCH_FOR_PORTD > 0)
  37. #define HDMI_SWITCH_EXIST
  38. #endif
  39. static HDMI_PORT_T hw_map[HDMI_CONNECTOR_NUM];
  40. static SWITCH_PORT_T sw_map[HDMI_CONNECTOR_NUM];
  41. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  42. static void hdmi_mapping_info(void)
  43. {
  44. INT32 i = 0;
  45. HDMI_SRC_T src;
  46. HDMI_PORT_T hw_port;
  47. SWITCH_PORT_T sw_port;
  48. hdmidbg("CONFIG_HDMI_NUM %d\n", CONFIG_HDMI_NUM);
  49. hdmidbg("SISCONFIG_HDMI_SWITCH 0x%x\n", CONFIG_HDMI_SWITCH);
  50. hdmidbg("SISCONFIG_HDMI_PORT_MAP 0x%x\n", CONFIG_HDMI_PORT_MAP);
  51. for (i = 0; i < CONFIG_HDMI_NUM; i++)
  52. {
  53. hw_port = hdmi_hw_port(i);
  54. sw_port = hdmi_sw_port(i);
  55. if (sw_port == SWITCH_PORT_NULL)
  56. {
  57. /* hdmi source is hw port */
  58. hdmidbg("HDMI %d is hw port %s\n", i + 1,
  59. hw_port == HDMI_PORT_A ? "A" :
  60. hw_port == HDMI_PORT_B ? "B" :
  61. hw_port == HDMI_PORT_C ? "C" :
  62. hw_port == HDMI_PORT_D ? "D" :
  63. hw_port == HDMI_PORT_NULL ? "Null" : "Error"
  64. );
  65. }
  66. else
  67. {
  68. /* hdmi source is switch port */
  69. hdmidbg("HDMI %d is switch port %s from hw port %s\n", i + 1,
  70. sw_port == SWITCH_PORT_A ? "A" :
  71. sw_port == SWITCH_PORT_B ? "B" :
  72. sw_port == SWITCH_PORT_C ? "C" :
  73. sw_port == SWITCH_PORT_D ? "D" :
  74. sw_port == SWITCH_PORT_NULL ? "Null" : "Error",
  75. hw_port == HDMI_PORT_A ? "A" :
  76. hw_port == HDMI_PORT_B ? "B" :
  77. hw_port == HDMI_PORT_C ? "C" :
  78. hw_port == HDMI_PORT_D ? "D" :
  79. hw_port == HDMI_PORT_NULL ? "Null" : "Error"
  80. );
  81. }
  82. }
  83. for (i = 0; i < HDMI_PORT_NUM; i++)
  84. {
  85. src = hdmi_get_channel_at_hw_port(i);
  86. if (src < 0)
  87. {
  88. hdmidbg("Hw port %s is not connected\n",
  89. i == HDMI_PORT_A ? "A" :
  90. i == HDMI_PORT_B ? "B" :
  91. i == HDMI_PORT_C ? "C" :
  92. i == HDMI_PORT_D ? "D" :
  93. i == HDMI_PORT_NULL ? "Null" : "Error");
  94. }
  95. else
  96. {
  97. hdmidbg("Hw port %s is HDMI %d\n",
  98. i == HDMI_PORT_A ? "A" :
  99. i == HDMI_PORT_B ? "B" :
  100. i == HDMI_PORT_C ? "C" :
  101. i == HDMI_PORT_D ? "D" :
  102. i == HDMI_PORT_NULL ? "Null" : "Error", src + 1);
  103. }
  104. }
  105. for (i = 0; i < SWITCH_PORT_NUM; i++)
  106. {
  107. src = hdmi_get_channel_at_switch_port(i);
  108. if (src < 0)
  109. {
  110. hdmidbg("Switch port %s is not connected\n",
  111. i == SWITCH_PORT_A ? "A" :
  112. i == SWITCH_PORT_B ? "B" :
  113. i == SWITCH_PORT_C ? "C" :
  114. i == SWITCH_PORT_D ? "D" :
  115. i == SWITCH_PORT_NULL ? "Null" : "Error");
  116. }
  117. else
  118. {
  119. hdmidbg("Switch port %s is HDMI %d\n",
  120. i == SWITCH_PORT_A ? "A" :
  121. i == SWITCH_PORT_B ? "B" :
  122. i == SWITCH_PORT_C ? "C" :
  123. i == SWITCH_PORT_D ? "D" :
  124. i == SWITCH_PORT_NULL ? "Null" : "Error", src + 1);
  125. }
  126. }
  127. }
  128. #endif
  129. HDMI_PORT_T hdmi_hw_port(HDMI_SRC_T src)
  130. {
  131. if (src >= HDMI_SRC_1 && src < HDMI_SRC_NUM &&
  132. src < CONFIG_HDMI_NUM && src < HDMI_CONNECTOR_NUM)
  133. {
  134. return hw_map[src];
  135. }
  136. return HDMI_PORT_NULL;
  137. }
  138. SWITCH_PORT_T hdmi_sw_port(HDMI_SRC_T src)
  139. {
  140. if (src >= HDMI_SRC_1 && src < HDMI_SRC_NUM &&
  141. src < CONFIG_HDMI_NUM && src < HDMI_CONNECTOR_NUM)
  142. {
  143. return sw_map[src];
  144. }
  145. return SWITCH_PORT_NULL;
  146. }
  147. HDMI_SRC_T hdmi_get_channel_at_hw_port(HDMI_PORT_T hw_port)
  148. {
  149. HDMI_SRC_T src;
  150. for (src = HDMI_SRC_1; src < HDMI_CONNECTOR_NUM; src++)
  151. {
  152. if (hdmi_sw_port(src) == SWITCH_PORT_NULL && hdmi_hw_port(src) == hw_port)
  153. {
  154. return src;
  155. }
  156. }
  157. return HDMI_SRC_NULL;
  158. }
  159. HDMI_SRC_T hdmi_get_channel_at_switch_port(SWITCH_PORT_T sw_port)
  160. {
  161. HDMI_SRC_T src;
  162. for (src = HDMI_SRC_1; src < HDMI_CONNECTOR_NUM; src++)
  163. {
  164. if (hdmi_sw_port(src) == sw_port)
  165. {
  166. return src;
  167. }
  168. }
  169. return HDMI_SRC_NULL;
  170. }
  171. void hdmi_mapping_init(void)
  172. {
  173. INT32 i = 0, sw = 0;
  174. memset(hw_map, -1, sizeof(hw_map));
  175. memset(sw_map, -1, sizeof(sw_map));
  176. for (i = 0; i < HDMI_CONNECTOR_NUM; i++)
  177. {
  178. INT32 idx = (((CONFIG_HDMI_PORT_MAP >> (i * 4)) & 0xF) - 1)%HDMI_CONNECTOR_NUM;
  179. if (i < A_PORT_NUM)
  180. {
  181. sw = i;
  182. hw_map[idx] = 0;
  183. sw_map[idx] = (SWITCH_FOR_PORTA) ? (sw) : (-1);
  184. }
  185. else if ((i - A_PORT_NUM) < B_PORT_NUM)
  186. {
  187. sw = i - A_PORT_NUM;
  188. hw_map[idx] = 1;
  189. sw_map[idx] = (SWITCH_FOR_PORTB) ? (sw) : (-1);
  190. }
  191. else if ((i - A_PORT_NUM - B_PORT_NUM) < C_PORT_NUM)
  192. {
  193. sw = i - A_PORT_NUM - B_PORT_NUM;
  194. hw_map[idx] = 2;
  195. sw_map[idx] = (SWITCH_FOR_PORTC) ? (sw) : (-1);
  196. }
  197. else if ((i - A_PORT_NUM - B_PORT_NUM - C_PORT_NUM) < D_PORT_NUM)
  198. {
  199. sw = i - A_PORT_NUM - B_PORT_NUM - C_PORT_NUM;
  200. hw_map[idx] = 3;
  201. sw_map[idx] = (SWITCH_FOR_PORTD) ? (sw) : (-1);
  202. }
  203. }
  204. #ifdef CONFIG_SUPPORT_DEBUG_MESSAGE
  205. /* Debug print */
  206. hdmi_mapping_info();
  207. #endif
  208. }