board_hdmi.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /*
  2. * Copyright (c) 2012, Freescale Semiconductor, Inc.
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. * of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. * list of conditions and the following disclaimer in the documentation and/or
  13. * other materials provided with the distribution.
  14. *
  15. * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
  16. * contributors may be used to endorse or promote products derived from this
  17. * software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. #include "sdk.h"
  31. #include "registers/regsccm.h"
  32. #include "registers/regsccmanalog.h"
  33. #include "registers/regsiomuxc.h"
  34. ////////////////////////////////////////////////////////////////////////////////
  35. // Code
  36. ////////////////////////////////////////////////////////////////////////////////
  37. /*!
  38. * config instance hdmi_tx of Module HDMI_TX to Protocol CEC
  39. * port including CEC_LINE
  40. */
  41. void hdmi_tx_cec_pgm_iomux(void)
  42. {
  43. // config EIM_A25 pad for hdmi_tx instance CEC_LINE port
  44. HW_IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR25_WR(
  45. BF_IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR25_SION_V(DISABLED) |
  46. BF_IOMUXC_SW_MUX_CTL_PAD_EIM_ADDR25_MUX_MODE_V(ALT6));
  47. // Pad EIM_A25 is involved in Daisy Chain.
  48. HW_IOMUXC_HDMI_ICECIN_SELECT_INPUT_WR(
  49. BF_IOMUXC_HDMI_ICECIN_SELECT_INPUT_DAISY_V(EIM_ADDR25_ALT6));
  50. HW_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_WR(
  51. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_HYS_V(ENABLED) |
  52. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_PUS_V(22K_OHM_PU) |
  53. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_PUE_V(PULL) |
  54. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_PKE_V(ENABLED) |
  55. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_ODE_V(ENABLED) |
  56. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_SPEED_V(100MHZ) |
  57. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_DSE_V(40_OHM) |
  58. BF_IOMUXC_SW_PAD_CTL_PAD_EIM_ADDR25_SRE_V(SLOW));
  59. }
  60. /*!
  61. * config instance hdmi_tx of Module HDMI_TX to Protocol DDC
  62. * ports including DDC_SCL, DDC_SDA.
  63. */
  64. void hdmi_tx_ddc_pgm_iomux(void)
  65. {
  66. // config KEY_COL3 pad for hdmi_tx instance DDC_SCL port
  67. HW_IOMUXC_SW_MUX_CTL_PAD_KEY_COL3_WR(
  68. BF_IOMUXC_SW_MUX_CTL_PAD_KEY_COL3_SION_V(DISABLED) |
  69. BF_IOMUXC_SW_MUX_CTL_PAD_KEY_COL3_MUX_MODE_V(ALT2));
  70. // Pad KEY_COL3 is involved in Daisy Chain.
  71. HW_IOMUXC_HDMI_II2C_CLKIN_SELECT_INPUT_WR(
  72. BF_IOMUXC_HDMI_II2C_CLKIN_SELECT_INPUT_DAISY_V(KEY_COL3_ALT2));
  73. HW_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_WR(
  74. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_HYS_V(ENABLED) |
  75. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_PUS_V(22K_OHM_PU) |
  76. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_PUE_V(PULL) |
  77. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_PKE_V(ENABLED) |
  78. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_ODE_V(ENABLED) |
  79. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_SPEED_V(100MHZ) |
  80. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_DSE_V(40_OHM) |
  81. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_COL3_SRE_V(SLOW));
  82. // config KEY_ROW3 pad for hdmi_tx instance DDC_SDA port
  83. HW_IOMUXC_SW_MUX_CTL_PAD_KEY_ROW3_WR(
  84. BF_IOMUXC_SW_MUX_CTL_PAD_KEY_ROW3_SION_V(DISABLED) |
  85. BF_IOMUXC_SW_MUX_CTL_PAD_KEY_ROW3_MUX_MODE_V(ALT2));
  86. // Pad KEY_ROW3 is involved in Daisy Chain.
  87. HW_IOMUXC_HDMI_II2C_DATAIN_SELECT_INPUT_WR(
  88. BF_IOMUXC_HDMI_II2C_DATAIN_SELECT_INPUT_DAISY_V(KEY_ROW3_ALT2));
  89. HW_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_WR(
  90. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_HYS_V(ENABLED) |
  91. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_PUS_V(22K_OHM_PU) |
  92. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_PUE_V(PULL) |
  93. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_PKE_V(ENABLED) |
  94. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_ODE_V(ENABLED) |
  95. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_SPEED_V(100MHZ) |
  96. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_DSE_V(40_OHM) |
  97. BF_IOMUXC_SW_PAD_CTL_PAD_KEY_ROW3_SRE_V(SLOW));
  98. }
  99. /*!
  100. * config instance hdmi_tx of Module HDMI_TX to Protocol PHYDTB
  101. * ports including {OPHYDTB[1]}, {OPHYDTB[0]}
  102. */
  103. void hdmi_tx_phydtb_pgm_iomux(void)
  104. {
  105. // config SD1_DAT1 pad for hdmi_tx instance OPHYDTB[0] port
  106. HW_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA1_WR(
  107. BF_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA1_SION_V(DISABLED) |
  108. BF_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA1_MUX_MODE(6/*ALT6*/));
  109. HW_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_WR(
  110. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_HYS_V(DISABLED) |
  111. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_PUS_V(100K_OHM_PD) |
  112. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_PUE_V(KEEP) |
  113. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_PKE_V(DISABLED) |
  114. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_ODE_V(DISABLED) |
  115. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_SPEED_V(100MHZ) |
  116. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_DSE_V(40_OHM) |
  117. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA1_SRE_V(FAST));
  118. // config SD1_DAT0 pad for hdmi_tx instance OPHYDTB[1] port
  119. HW_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA0_WR(
  120. BF_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA0_SION_V(DISABLED) |
  121. BF_IOMUXC_SW_MUX_CTL_PAD_SD1_DATA0_MUX_MODE(6/*ALT6*/));
  122. HW_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_WR(
  123. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_HYS_V(DISABLED) |
  124. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_PUS_V(100K_OHM_PD) |
  125. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_PUE_V(KEEP) |
  126. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_PKE_V(DISABLED) |
  127. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_ODE_V(DISABLED) |
  128. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_SPEED_V(100MHZ) |
  129. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_DSE_V(40_OHM) |
  130. BF_IOMUXC_SW_PAD_CTL_PAD_SD1_DATA0_SRE_V(FAST));
  131. }
  132. /*!
  133. * HDMI pin mux and internal connection mux
  134. * be noted that the HDMI is drivern by the IPU1 di0 here
  135. */
  136. void hdmi_pgm_iomux(void)
  137. {
  138. ipu1_iomux_config();
  139. hdmi_tx_cec_pgm_iomux();
  140. hdmi_tx_ddc_pgm_iomux();
  141. hdmi_tx_phydtb_pgm_iomux();
  142. }
  143. /*!
  144. * HDMI power up
  145. */
  146. void ext_hdmi_transmitter_power_on(void)
  147. {
  148. /*3.3V for core, default is on */
  149. /*5V for IO, default is on */
  150. }
  151. void hdmi_clock_set(int ipu_index, uint32_t pclk)
  152. {
  153. switch (pclk) {
  154. case 74250000:
  155. case 148500000:
  156. if (ipu_index == 1) {
  157. //clk output from 540M PFD1 of PLL3
  158. HW_CCM_CHSCCDR.B.IPU1_DI0_CLK_SEL = 0; // derive clock from divided pre-muxed ipu1 di0 clock
  159. HW_CCM_CHSCCDR.B.IPU1_DI0_PODF = 5; // div by 6
  160. HW_CCM_CHSCCDR.B.IPU1_DI0_PRE_CLK_SEL = 5; // derive clock from 540M PFD
  161. }
  162. #if CHIP_MX6DQ
  163. else {
  164. //clk output from 540M PFD1 of PLL3
  165. HW_CCM_CSCDR2.B.IPU2_DI0_CLK_SEL = 0; // derive clock from divided pre-muxed ipu1 di0 clock
  166. HW_CCM_CSCDR2.B.IPU2_DI0_PODF = 5; // div by 6
  167. HW_CCM_CSCDR2.B.IPU2_DI0_PRE_CLK_SEL = 5; // derive clock from 540M PFD
  168. }
  169. #endif // CHIP_MX6DQ
  170. //config PFD1 of PLL3 to be 445MHz
  171. BW_CCM_ANALOG_PFD_480_PFD1_FRAC(0x13);
  172. break;
  173. default:
  174. printf("the hdmi pixel clock is not supported!\n");
  175. }
  176. }
  177. ////////////////////////////////////////////////////////////////////////////////
  178. // EOF
  179. ////////////////////////////////////////////////////////////////////////////////