1 /* 2 * Copyright (c) 2022 ITE. 3 * Copyright 2022 NXP 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 8 #ifndef _FSL_IT6161_H_ 9 #define _FSL_IT6161_H_ 10 11 #include "fsl_video_common.h" 12 #include "fsl_video_i2c.h" 13 #include "fsl_display.h" 14 #include "fsl_common.h" 15 #include "mipi_rx.h" 16 #include "hdmi_tx.h" 17 18 /******************************************************************************* 19 * Definitions 20 ******************************************************************************/ 21 #define F_AUDIO_ON (1U << 7U) 22 #define F_AUDIO_HBR (1U << 6U) 23 #define F_AUDIO_DSD (1U << 5U) 24 #define F_AUDIO_NLPCM (1U << 4U) 25 #define F_AUDIO_LAYOUT_1 (1U << 3U) 26 #define F_AUDIO_LAYOUT_0 (0U << 3U) 27 // HBR - 1100 28 // DSD - 1010 29 // NLPCM - 1001 30 // LPCM - 1000 31 #define T_AUDIO_MASK (0xF0) 32 #define T_AUDIO_OFF (0U) 33 #define T_AUDIO_HBR (F_AUDIO_ON | F_AUDIO_HBR) 34 #define T_AUDIO_DSD (F_AUDIO_ON | F_AUDIO_DSD) 35 #define T_AUDIO_NLPCM (F_AUDIO_ON | F_AUDIO_NLPCM) 36 #define T_AUDIO_LPCM (F_AUDIO_ON) 37 38 /* Video Data Type */ 39 #define F_MODE_RGB444 (0x00U) 40 #define F_MODE_YUV422 (0x01U) 41 #define F_MODE_YUV444 (0x02U) 42 #define F_MODE_CLRMOD_MASK (0x03U) 43 44 #define F_VIDMODE_ITU709 (1U << 4U) 45 #define F_VIDMODE_ITU601 (0U) 46 47 #define F_VIDMODE_0_255 (0U) 48 #define F_VIDMODE_16_235 (1U << 5U) 49 50 #define F_VIDMODE_EN_UDFILT (1U << 6U) 51 #define F_VIDMODE_EN_DITHER (1U << 7U) 52 53 /* sample clock */ 54 #define AUDFS_22p05KHz (0x04U) 55 #define AUDFS_44p1KHz (0x00U) 56 #define AUDFS_88p2KHz (0x08U) 57 #define AUDFS_176p4KHz (0x0CU) 58 #define AUDFS_24KHz (0x06U) 59 #define AUDFS_48KHz (0x02U) 60 #define AUDFS_96KHz (0x0AU) 61 #define AUDFS_192KHz (0x0EU) 62 #define AUDFS_768KHz (0x09U) 63 #define AUDFS_32KHz (0x03U) 64 #define AUDFS_OTHER (0x01U) 65 66 #ifndef BIT 67 #define BIT(nr) ((0x01U) << (nr)) 68 #endif 69 70 #define DEMO_HDMI_RESOLUSION (HDMI_480p60_16x9) 71 #define DEMO_HDMI_COLOR_MODE (HDMI_RGB444) 72 73 #define delay1ms(x) SDK_DelayAtLeastUs((x) * 1000, SystemCoreClock) 74 75 #define MIPIRX_LANE_NUM (4) /* 1~4 */ 76 77 /* I2C Address */ 78 #define HDMI_TX_ADDR (0x4C) 79 #define HDMI_TX_CEC_ADDR (0x4E) 80 #define HDMI_TX_CEC_I2C_SLAVE_ADDR (0x9C) 81 #define MIPI_RX_ADDR (0x6C) 82 83 #define IT6161_I2C_ModifyReg(handle, addr, reg, mask, value) \ 84 VIDEO_I2C_ModifyReg(addr, kVIDEO_RegAddr8Bit, (reg), kVIDEO_RegWidth8Bit, mask, (value), \ 85 ((const it6161_resource_t *)((handle)->resource))->i2cReceiveFunc, \ 86 ((const it6161_resource_t *)((handle)->resource))->i2cSendFunc) 87 88 #define IT6161_I2C_WriteReg(handle, addr, reg, value) \ 89 VIDEO_I2C_WriteReg(addr, kVIDEO_RegAddr8Bit, (reg), kVIDEO_RegWidth8Bit, (value), \ 90 ((const it6161_resource_t *)((handle)->resource))->i2cSendFunc) 91 92 #define IT6161_I2C_WriteRegs(handle, addr, reg, value, len) \ 93 VIDEO_I2C_WriteReg(addr, kVIDEO_RegAddr8Bit, reg, (video_reg_width_t)len, value, \ 94 ((const it6161_resource_t *)((handle)->resource))->i2cSendFunc) 95 96 #define IT6161_I2C_ReadRegs(handle, addr, reg, value, len) \ 97 VIDEO_I2C_ReadReg(addr, kVIDEO_RegAddr8Bit, reg, (video_reg_width_t)len, (value), \ 98 ((const it6161_resource_t *)((handle)->resource))->i2cReceiveFunc) 99 100 #define HDMITX_ReadI2C_Byte(handle, RegAddr, pValue) IT6161_I2C_ReadRegs(handle, HDMI_TX_ADDR, RegAddr, pValue, 1) 101 #define HDMITX_WriteI2C_Byte(handle, RegAddr, value) IT6161_I2C_WriteReg(handle, HDMI_TX_ADDR, RegAddr, value) 102 #define HDMITX_ReadI2C_Bytes(handle, RegAddr, pValue, num) \ 103 IT6161_I2C_ReadRegs(handle, HDMI_TX_ADDR, RegAddr, pValue, num) 104 #define HDMITX_WriteI2C_Bytes(handle, RegAddr, pValue, num) \ 105 IT6161_I2C_WriteRegs(handle, HDMI_TX_ADDR, RegAddr, pValue, num) 106 #define HDMITX_SetI2C_Byte(handle, RegAddr, Mask, Value) \ 107 IT6161_I2C_ModifyReg(handle, HDMI_TX_ADDR, RegAddr, Mask, Value) 108 109 #define HDMITX_CEC_ReadI2C_Byte(handle, RegAddr, pValue) \ 110 IT6161_I2C_ReadRegs(handle, HDMI_TX_CEC_ADDR, RegAddr, pValue, 1) 111 #define HDMITX_CEC_WriteI2C_Byte(handle, RegAddr, value) IT6161_I2C_WriteReg(handle, HDMI_TX_CEC_ADDR, RegAddr, value) 112 #define HDMITX_CEC_ReadI2C_Bytes(handle, RegAddr, pValue, num) \ 113 IT6161_I2C_ReadRegs(handle, HDMI_TX_CEC_ADDR, RegAddr, pValue, num) 114 #define HDMITX_CEC_WriteI2C_Bytes(handle, RegAddr, pValue, num) \ 115 IT6161_I2C_WriteRegs(handle, HDMI_TX_CEC_ADDR, RegAddr, pValue, num) 116 #define HDMITX_CEC_SetI2C_Byte(handle, RegAddr, Mask, Value) \ 117 IT6161_I2C_ModifyReg(handle, HDMI_TX_CEC_ADDR, RegAddr, Mask, Value) 118 119 #define MIPIRX_ReadI2C_Byte(handle, RegAddr, pValue) IT6161_I2C_ReadRegs(handle, MIPI_RX_ADDR, RegAddr, pValue, 1) 120 #define MIPIRX_WriteI2C_Byte(handle, RegAddr, value) IT6161_I2C_WriteReg(handle, MIPI_RX_ADDR, RegAddr, value) 121 #define MIPIRX_ReadI2C_Bytes(handle, RegAddr, pValue, num) \ 122 IT6161_I2C_ReadRegs(handle, MIPI_RX_ADDR, RegAddr, pValue, num) 123 #define MIPIRX_SetI2C_Byte(handle, RegAddr, Mask, Value) \ 124 IT6161_I2C_ModifyReg(handle, MIPI_RX_ADDR, RegAddr, Mask, Value) 125 126 /*! 127 * @brief IT6161 resource. 128 * 129 * The I2C instance should be initialized before calling @ref IT6161_Init. 130 */ 131 132 /* ported from linu kernel: include/drm/drm_modes.h(struct drm_display_mode) */ 133 typedef struct display_mode 134 { 135 uint16_t hdisplay; /* horizontal display size */ 136 uint16_t hsync_start; /* horizontal sync start */ 137 uint16_t hsync_end; /* horizontal sync end */ 138 uint16_t htotal; /* horizontal total size */ 139 uint16_t vdisplay; /* vertical display size */ 140 uint16_t vsync_start; /* vertical sync start */ 141 uint16_t vsync_end; /* vertical sync end */ 142 uint16_t vtotal; /* vertical total size */ 143 } display_mode_t; 144 145 typedef struct it6161_hdmi_tx_cfg 146 { 147 uint8_t hdmitx_bypass_mode; 148 uint8_t tx_clk_stable; 149 uint8_t tx_vid_stable; 150 uint8_t de_generation_enable; 151 uint8_t vertical_sync_polarity; 152 uint8_t horizontal_sync_polarity; 153 uint8_t de_only_in; 154 uint32_t rclk; 155 uint32_t pclk; 156 uint8_t input_color_space; 157 uint8_t output_color_space; 158 uint8_t support_audio; 159 uint8_t input_audio_type; 160 uint8_t input_audio_interface; 161 uint32_t input_audio_sample_freq; 162 uint8_t output_channel; 163 uint8_t hdmi_mode; 164 uint8_t bAudioChannelEnable; 165 bool pclk_div2; /* Input Data Format Register 0x70, Reg_PCLKDiv2, 0: IO latch clock = TxCLK, 1: IO latch clock = 1/2 * TxCLK */ 166 display_mode_t mode; 167 } it6161_hdmi_tx_cfg_t; 168 169 typedef struct it6161_mipi_rx_cfg 170 { 171 uint8_t lanes; 172 uint8_t mipirx_lane_swap; 173 uint8_t mipirx_dpdn_swap; 174 uint8_t inverse_mclk; 175 uint8_t inverse_pclk; 176 uint8_t enable_standby_mode; 177 uint8_t enable_standby_to_reset; 178 uint8_t enable_iddq_mode; 179 uint8_t pd_ref_clk; /* when PDREFCLK=TRUE, 0:div2, 1:div4, 2:div8, 3:div16 */ 180 uint8_t pd_ref_cnt; 181 uint8_t hs_settle_num; 182 uint8_t hs_trailing_skip_stage; 183 uint8_t enable_sync_bit_error_tolerance; 184 uint8_t enable_multi_lane_deskew; 185 uint8_t force_continuous_clock_mode; 186 uint8_t ppi_debug_selection; 187 uint8_t ignore_null_packet; 188 uint8_t ignore_blank_packet; 189 uint8_t enable_dummy_ecc_error; 190 uint8_t sel_eotp; 191 uint8_t lm_debug_selection; 192 uint8_t auto_sync_falling; 193 uint8_t interlaced_mode; 194 uint8_t user_define_timming; 195 uint8_t prec_update; 196 uint8_t mrec_update; 197 uint8_t v_timing_resync_selction; /* 0:Div2, 1:Div4, 2:Div8, 3:Div16, 4:Div32 */ 198 uint8_t enable_v_timing_resync_enhance_mode; 199 uint8_t enable_frame_resync; 200 uint16_t pps_fifo_read_start_point; 201 uint8_t enable_h_timing_resync; 202 uint8_t enable_v_timing_resync; 203 uint8_t enable_fifo_auto_reset; 204 uint8_t enable_overflow_auto_reset; 205 uint8_t enable_mclk_horizontal_average; 206 uint8_t allowable_mclk_horizontal_shift_value; 207 uint8_t allowable_pclk_horizontal_shift_value; 208 uint8_t enable_external_pclk; 209 uint8_t bypass_through_mode; 210 uint8_t enable_ttl_tx_crc; 211 uint8_t crc_frame_number; 212 uint32_t rclk; 213 uint32_t pclk; 214 } it6161_mipi_rx_cfg_t; 215 216 enum it6161_active_level 217 { 218 LOW_LVL, 219 HIGH_LVL, 220 }; 221 222 enum hdmi_packet_type 223 { 224 HDMI_PACKET_TYPE_NULL = 0x00, 225 HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN = 0x01, 226 HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02, 227 HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03, 228 HDMI_PACKET_TYPE_ACP = 0x04, 229 HDMI_PACKET_TYPE_ISRC1 = 0x05, 230 HDMI_PACKET_TYPE_ISRC2 = 0x06, 231 HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07, 232 HDMI_PACKET_TYPE_DST_AUDIO = 0x08, 233 HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09, 234 HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a, 235 /* + enum hdmi_infoframe_type */ 236 }; 237 238 enum hdmi_infoframe_type 239 { 240 HDMI_INFOFRAME_TYPE_VENDOR = 0x81, 241 HDMI_INFOFRAME_TYPE_AVI = 0x82, 242 HDMI_INFOFRAME_TYPE_SPD = 0x83, 243 HDMI_INFOFRAME_TYPE_AUDIO = 0x84, 244 HDMI_INFOFRAME_TYPE_DRM = 0x87, 245 }; 246 247 #define HDMI_IEEE_OUI 0x000c03 248 #define HDMI_FORUM_IEEE_OUI 0xc45dd8 249 #define HDMI_INFOFRAME_HEADER_SIZE 4U 250 #define HDMI_AVI_INFOFRAME_SIZE 13U 251 #define HDMI_SPD_INFOFRAME_SIZE 25 252 #define HDMI_AUDIO_INFOFRAME_SIZE 10U 253 #define HDMI_DRM_INFOFRAME_SIZE 26 254 #define HDMI_VENDOR_INFOFRAME_SIZE 4 255 256 #define HDMI_INFOFRAME_SIZE(type) (HDMI_INFOFRAME_HEADER_SIZE + HDMI_##type##_INFOFRAME_SIZE) 257 258 struct hdmi_any_infoframe 259 { 260 enum hdmi_infoframe_type type; 261 uint8_t version; 262 uint8_t length; 263 }; 264 265 enum hdmi_colorspace 266 { 267 HDMI_COLORSPACE_RGB, 268 HDMI_COLORSPACE_YUV422, 269 HDMI_COLORSPACE_YUV444, 270 HDMI_COLORSPACE_YUV420, 271 HDMI_COLORSPACE_RESERVED4, 272 HDMI_COLORSPACE_RESERVED5, 273 HDMI_COLORSPACE_RESERVED6, 274 HDMI_COLORSPACE_IDO_DEFINED, 275 }; 276 277 enum hdmi_scan_mode 278 { 279 HDMI_SCAN_MODE_NONE, 280 HDMI_SCAN_MODE_OVERSCAN, 281 HDMI_SCAN_MODE_UNDERSCAN, 282 HDMI_SCAN_MODE_RESERVED, 283 }; 284 285 enum hdmi_colorimetry 286 { 287 HDMI_COLORIMETRY_NONE, 288 HDMI_COLORIMETRY_ITU_601, 289 HDMI_COLORIMETRY_ITU_709, 290 HDMI_COLORIMETRY_EXTENDED, 291 }; 292 293 enum hdmi_picture_aspect 294 { 295 HDMI_PICTURE_ASPECT_NONE, 296 HDMI_PICTURE_ASPECT_4_3, 297 HDMI_PICTURE_ASPECT_16_9, 298 HDMI_PICTURE_ASPECT_64_27, 299 HDMI_PICTURE_ASPECT_256_135, 300 HDMI_PICTURE_ASPECT_RESERVED, 301 }; 302 303 enum hdmi_active_aspect 304 { 305 HDMI_ACTIVE_ASPECT_16_9_TOP = 2, 306 HDMI_ACTIVE_ASPECT_14_9_TOP = 3, 307 HDMI_ACTIVE_ASPECT_16_9_CENTER = 4, 308 HDMI_ACTIVE_ASPECT_PICTURE = 8, 309 HDMI_ACTIVE_ASPECT_4_3 = 9, 310 HDMI_ACTIVE_ASPECT_16_9 = 10, 311 HDMI_ACTIVE_ASPECT_14_9 = 11, 312 HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13, 313 HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14, 314 HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15, 315 }; 316 317 enum hdmi_extended_colorimetry 318 { 319 HDMI_EXTENDED_COLORIMETRY_XV_YCC_601, 320 HDMI_EXTENDED_COLORIMETRY_XV_YCC_709, 321 HDMI_EXTENDED_COLORIMETRY_S_YCC_601, 322 HDMI_EXTENDED_COLORIMETRY_OPYCC_601, 323 HDMI_EXTENDED_COLORIMETRY_OPRGB, 324 325 /* The following EC values are only defined in CEA-861-F. */ 326 HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM, 327 HDMI_EXTENDED_COLORIMETRY_BT2020, 328 HDMI_EXTENDED_COLORIMETRY_RESERVED, 329 }; 330 331 enum hdmi_quantization_range 332 { 333 HDMI_QUANTIZATION_RANGE_DEFAULT, 334 HDMI_QUANTIZATION_RANGE_LIMITED, 335 HDMI_QUANTIZATION_RANGE_FULL, 336 HDMI_QUANTIZATION_RANGE_RESERVED, 337 }; 338 339 /* non-uniform picture scaling */ 340 enum hdmi_nups 341 { 342 HDMI_NUPS_UNKNOWN, 343 HDMI_NUPS_HORIZONTAL, 344 HDMI_NUPS_VERTICAL, 345 HDMI_NUPS_BOTH, 346 }; 347 348 enum hdmi_ycc_quantization_range 349 { 350 HDMI_YCC_QUANTIZATION_RANGE_LIMITED, 351 HDMI_YCC_QUANTIZATION_RANGE_FULL, 352 }; 353 354 enum hdmi_content_type 355 { 356 HDMI_CONTENT_TYPE_GRAPHICS, 357 HDMI_CONTENT_TYPE_PHOTO, 358 HDMI_CONTENT_TYPE_CINEMA, 359 HDMI_CONTENT_TYPE_GAME, 360 }; 361 362 enum hdmi_metadata_type 363 { 364 HDMI_STATIC_METADATA_TYPE1 = 1, 365 }; 366 367 enum hdmi_eotf 368 { 369 HDMI_EOTF_TRADITIONAL_GAMMA_SDR, 370 HDMI_EOTF_TRADITIONAL_GAMMA_HDR, 371 HDMI_EOTF_SMPTE_ST2084, 372 HDMI_EOTF_BT_2100_HLG, 373 }; 374 375 enum hdmi_audio_coding_type 376 { 377 HDMI_AUDIO_CODING_TYPE_STREAM, 378 HDMI_AUDIO_CODING_TYPE_PCM, 379 HDMI_AUDIO_CODING_TYPE_AC3, 380 HDMI_AUDIO_CODING_TYPE_MPEG1, 381 HDMI_AUDIO_CODING_TYPE_MP3, 382 HDMI_AUDIO_CODING_TYPE_MPEG2, 383 HDMI_AUDIO_CODING_TYPE_AAC_LC, 384 HDMI_AUDIO_CODING_TYPE_DTS, 385 HDMI_AUDIO_CODING_TYPE_ATRAC, 386 HDMI_AUDIO_CODING_TYPE_DSD, 387 HDMI_AUDIO_CODING_TYPE_EAC3, 388 HDMI_AUDIO_CODING_TYPE_DTS_HD, 389 HDMI_AUDIO_CODING_TYPE_MLP, 390 HDMI_AUDIO_CODING_TYPE_DST, 391 HDMI_AUDIO_CODING_TYPE_WMA_PRO, 392 HDMI_AUDIO_CODING_TYPE_CXT, 393 }; 394 395 enum hdmi_audio_sample_size 396 { 397 HDMI_AUDIO_SAMPLE_SIZE_STREAM, 398 HDMI_AUDIO_SAMPLE_SIZE_16, 399 HDMI_AUDIO_SAMPLE_SIZE_20, 400 HDMI_AUDIO_SAMPLE_SIZE_24, 401 }; 402 403 enum hdmi_audio_sample_frequency 404 { 405 HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM, 406 HDMI_AUDIO_SAMPLE_FREQUENCY_32000, 407 HDMI_AUDIO_SAMPLE_FREQUENCY_44100, 408 HDMI_AUDIO_SAMPLE_FREQUENCY_48000, 409 HDMI_AUDIO_SAMPLE_FREQUENCY_88200, 410 HDMI_AUDIO_SAMPLE_FREQUENCY_96000, 411 HDMI_AUDIO_SAMPLE_FREQUENCY_176400, 412 HDMI_AUDIO_SAMPLE_FREQUENCY_192000, 413 }; 414 415 enum hdmi_audio_coding_type_ext 416 { 417 /* Refer to Audio Coding Type (CT) field in Data Byte 1 */ 418 HDMI_AUDIO_CODING_TYPE_EXT_CT, 419 420 /* 421 * The next three CXT values are defined in CEA-861-E only. 422 * They do not exist in older versions, and in CEA-861-F they are 423 * defined as 'Not in use'. 424 */ 425 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC, 426 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2, 427 HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND, 428 429 /* The following CXT values are only defined in CEA-861-F. */ 430 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC, 431 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2, 432 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC, 433 HDMI_AUDIO_CODING_TYPE_EXT_DRA, 434 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND, 435 HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10, 436 }; 437 438 struct hdmi_avi_infoframe 439 { 440 enum hdmi_infoframe_type type; 441 uint8_t version; 442 uint8_t length; 443 enum hdmi_colorspace colorspace; 444 enum hdmi_scan_mode scan_mode; 445 enum hdmi_colorimetry colorimetry; 446 enum hdmi_picture_aspect picture_aspect; 447 enum hdmi_active_aspect active_aspect; 448 bool itc; 449 enum hdmi_extended_colorimetry extended_colorimetry; 450 enum hdmi_quantization_range quantization_range; 451 enum hdmi_nups nups; 452 uint8_t video_code; 453 enum hdmi_ycc_quantization_range ycc_quantization_range; 454 enum hdmi_content_type content_type; 455 uint8_t pixel_repeat; 456 uint32_t top_bar; 457 uint32_t bottom_bar; 458 uint32_t left_bar; 459 uint32_t right_bar; 460 }; 461 462 struct hdmi_audio_infoframe 463 { 464 enum hdmi_infoframe_type type; 465 uint8_t version; 466 uint8_t length; 467 uint8_t channels; 468 enum hdmi_audio_coding_type coding_type; 469 enum hdmi_audio_sample_frequency sample_frequency; 470 enum hdmi_audio_sample_size sample_size; 471 enum hdmi_audio_coding_type_ext coding_type_ext; 472 uint8_t channel_allocation; 473 uint8_t level_shift_value; 474 bool downmix_inhibit; 475 }; 476 477 typedef struct it6161_cfg 478 { 479 it6161_mipi_rx_cfg_t mipi_rx; 480 it6161_hdmi_tx_cfg_t hdmi_tx; 481 display_mode_t mode; 482 struct hdmi_avi_infoframe source_avi_infoframe; 483 } it6161_cfg_t; 484 485 typedef struct _it6161_resource 486 { 487 video_i2c_send_func_t i2cSendFunc; /* I2C send function. */ 488 video_i2c_receive_func_t i2cReceiveFunc; /* I2C receive function. */ 489 void (*pullResetPin)(bool pullUp); /* Function to pull reset pin high or low. */ 490 uint8_t i2cAddr; /* I2C address, 0x4C or 0x6C. */ 491 } it6161_resource_t; 492 493 extern it6161_cfg_t it6161; 494 extern const display_operations_t it6161_ops; 495 496 /* default configurations */ 497 /* define EN_MIPIRX_BYPASS_MODE to 0x01 when want to debug input signals(MIPI_DSI) */ 498 #if 0 499 #define EN_MIPIRX_BYPASS_MODE (0x01U) 500 #else 501 #define EN_MIPIRX_BYPASS_MODE (0x00U) 502 #endif 503 504 #if (EN_MIPIRX_BYPASS_MODE == 0x01U) 505 #define EN_HDMITX_BYPASS_MODE (0x01U) 506 #else 507 #define EN_HDMITX_BYPASS_MODE (0x00U) 508 #endif 509 510 #if (EN_MIPIRX_BYPASS_MODE == 0x01U) 511 #define PREC_UPDATE (0x01U) 512 #define MREC_UPDATE (0x01U) 513 #else 514 #define PREC_UPDATE (0x00U) 515 #define MREC_UPDATE (0x00U) 516 #endif 517 518 #ifndef HDMI_TX_SUPPORT_AUDIO 519 #define HDMI_TX_SUPPORT_AUDIO (false) 520 #endif 521 #ifndef HDMI_TX_OUTPUT_CHANNEL 522 #define HDMI_TX_OUTPUT_CHANNEL (0x02U) /* 2,3,4,5,6,7,8 */ 523 #endif 524 #ifndef HDMI_TX_INPUT_AUDIO_TYPE 525 #define HDMI_TX_INPUT_AUDIO_TYPE (T_AUDIO_LPCM) 526 #endif 527 #ifndef HDMI_TX_INPUT_AUDIO_INTERFACE 528 #define HDMI_TX_INPUT_AUDIO_INTERFACE (AUDIO_IF_I2S) 529 #endif 530 #ifndef HDMI_TX_INPUT_AUDIO_SAMPLE_FREQ 531 #define HDMI_TX_INPUT_AUDIO_SAMPLE_FREQ (AUDFS_48KHz) 532 #endif 533 #ifndef HDMI_TX_PCLK_DIV2 534 #define HDMI_TX_PCLK_DIV2 (false) 535 #endif 536 #define NRTXRCLK (0x01U) /* true:set TRCLK by self */ 537 #define FORCE_TXCLK_STABLE (0x01U) 538 #define STABLE_LINEPIEXELCNT_SENSITIVITY (0x01U) 539 #define RCLK_FREQ_SEL (0x01U) /* false: 10MHz(div1); true: 20 MHz(OSSDIV2) */ 540 #define FORCE_TX_CLK_STABLE (0x01U) 541 #define FORCE_TX_VID_STABLE (0x01U) 542 #define V_SYNC_POL (0x00U) /* 0: active low; 1: active high */ 543 #define H_SYNC_POL (0x00U) /* 0: active low; 1: active high */ 544 #if (EN_MIPIRX_BYPASS_MODE == 0x01U) 545 #define EN_HDMITX_BYPASS_MODE (0x01U) 546 #else 547 #define EN_HDMITX_BYPASS_MODE (0x00U) 548 #endif 549 550 /* DEBUG MACROS */ 551 #ifndef DEBUG_DUMP_HDMITX_REGISTER 552 #define DEBUG_DUMP_HDMITX_REGISTER (0x00U) 553 #endif 554 #ifndef DEBUG_DUMP_MIPIRX_REGISTER 555 #define DEBUG_DUMP_MIPIRX_REGISTER (0x00U) 556 #endif 557 558 #if 1 559 #define MIPIRX_DEBUG_PRINTF(...) 560 #else 561 #define MIPIRX_DEBUG_PRINTF PRINTF 562 #endif 563 #if 1 564 #define HDMITX_DEBUG_PRINTF(...) 565 #else 566 #define HDMITX_DEBUG_PRINTF PRINTF 567 #endif 568 569 /******************************************************************************* 570 * API 571 ******************************************************************************/ 572 573 #if defined(__cplusplus) 574 extern "C" { 575 #endif 576 577 status_t IT6161_Init(display_handle_t *handle, const display_config_t *config); 578 579 status_t IT6161_Deinit(display_handle_t *handle); 580 581 status_t IT6161_Start(display_handle_t *handle); 582 583 status_t IT6161_Stop(display_handle_t *handle); 584 585 void IT6161_Interrupt(display_handle_t *handle); 586 #if defined(__cplusplus) 587 } 588 #endif 589 590 void HDMITX_RegEE_Process(display_handle_t *handle, uint8_t RegEE); 591 592 void HDMITX_Reg06_Process(display_handle_t *handle, uint8_t Reg06); 593 594 void HDMITX_Reg08_Process(display_handle_t *handle, uint8_t Reg08); 595 596 void HDMI_InfoframeSetChecksum(void *buffer, int32_t size); 597 598 void HDMI_AviInfoframeInit(struct hdmi_avi_infoframe *frame); 599 600 int32_t HDMITX_CalcPclk(display_handle_t *handle); 601 602 uint8_t HDMI_InfoframeChecksum(void *buffer, int32_t size); 603 604 int32_t HDMI_AviInfoframePack(struct hdmi_avi_infoframe *frame, void *buffer, int32_t size); 605 606 int32_t HDMI_AudioInfoframePack(struct hdmi_audio_infoframe *frame, void *buffer, int32_t size); 607 608 void it6161_SetIntActiveLevel(display_handle_t *handle, enum it6161_active_level level); 609 610 void it6161_IntMaskEnable(display_handle_t *handle); 611 612 void it6161_HDMITX_Init(display_handle_t *handle); 613 614 #endif /* _FSL_IT6161_H_ */ 615