piSmasher Configuration Libraries
piSmasher peripheral device configuration libraries
tda1997x.c File Reference

TDA1997x HDMI Receiver FreeBSD. More...

#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include "tda1997x.h"

Data Structures

struct  tda1997x_info_any
 
struct  tda1997x_info_vs
 
struct  tda1997x_info_avi
 
struct  tda1997x_info_spd
 
struct  tda1997x_info_aud
 
struct  tda1997x_info_mps
 
union  tda1997x_infoframe
 

Macros

#define DEBUG_PRINT(__format__, ...)   printf("[DEBUG] %s() %s %d: " __format__ "\r\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
 
#define TDA1997X_HDCP_DDC_ADDR   (0x74U)
 
#define PAGE_ADDR(__PAGE__, __ADDR__)   (((__PAGE__) << 8) | ((__ADDR__) & 0xFFU))
 
#define PAGE_OF(__REG__)   ((uint8_t)(((__REG__) >> 8) & 0xFFU))
 
#define EDID_BLOCK_LENGTH   (127)
 
#define COLOR_CONV_MATRIX_LENGTH   (15)
 
#define MAN_SUS_HDMI_DIS_OUT_BUF   (1 << 7)
 
#define MAN_SUS_HDMI_ANA_PATH   (1 << 6)
 
#define MAN_SUS_HDMI_DIS_HDCP   (1 << 5)
 
#define MAN_SUS_HDMI_DIS_TMDS_ENC   (1 << 4)
 
#define MAN_SUS_HDMI_DIS_TMDS_FLOW   (1 << 3)
 
#define MAN_SUS_HDMI_RST_HDCP   (1 << 2)
 
#define MAN_SUS_HDMI_TMDS_ENC   (1 << 1)
 
#define MAN_SUS_HDMI_TMDS_FLOW   (1 << 0)
 
#define HDMI_SOFT_RESET_DC   (1 << 7)
 
#define INFO_RST_NACK_HDCP   (1 << 7)
 
#define INFO_RST_AUDIO_FIFO_CTRL   (1 << 5)
 
#define INFO_RST_AUDIO_FIFO   (1 << 4)
 
#define INFO_RST_AUDIO_FIFO_MASK   (0x30U)
 
#define INFO_RST_GAMUT   (1 << 3)
 
#define INFO_RST_AI   (1 << 2)
 
#define INFO_RST_INFOFRAME   (1 << 1)
 
#define INFO_RST_AUDIO   (1 << 0)
 
#define RATE_CTRL_REFTIM_ENABLE   (1 << 0)
 
#define SUS_ENABLE   RATE_CTRL_REFTIM_ENABLE
 
#define HDCP_CTRL_DECRYPTKEY_ON   (1 << 1)
 
#define HDCP_CTRL_ENABLE   (1 << 0)
 
#define HDCP_BCAPS_DEFAULT   (1 << 7)
 
#define HDCP_BCAPS_FAST_REAUTH   (1 << 0)
 
#define FILTERS_CTRL_PREFIL_MASK   (0x03U)
 
#define OF_CTRL_OUTPUT_ACTIVE   (1 << 7)
 
#define OF_CTRL_VIDEO_HIZ   (1 << 6)
 
#define OF_CTRL_BIT_5   (1 << 5)
 
#define OF_CTRL_BLANKING_INSERT   (1 << 4)
 
#define OF_CTRL_TIMINGREF_INSERT   (1 << 3)
 
#define OF_CTRL_FORMAT_MASK   (0x03U)
 
#define CLKOUT_CLK_DELAY_MASK   (0x70U)
 
#define CLKOUT_CTRL_TOGGLE_ON   (1 << 2)
 
#define CLKOUT_CLK_SEL_MASK   (0x03U)
 
#define VDP_CTRL_COMPDEL_BYPASS   (1 << 5)
 
#define VDP_CTRL_FORMATTER_BYPASS   (1 << 4)
 
#define VDP_CTRL_PREFILTER_BYPASS   (1 << 1)
 
#define VDP_CTRL_MATRIX_BYPASS   (1 << 0)
 
#define DE_FREF_SEL_DELAY_MASK   (0xF0U)
 
#define DE_FREF_SEL_PIX_QUAL   (1 << 3)
 
#define DE_FREF_SEL_POL_INV   (1 << 2)
 
#define DE_FREF_SEL_OUT_MASK   (0x03U)
 
#define HS_HREF_SEL_DELAY_MASK   (0xF0U)
 
#define HS_HREF_SEL_PIX_QUAL   (1 << 3)
 
#define HS_HREF_SEL_POL_INV   (1 << 2)
 
#define HS_HREF_SEL_OUT_MASK   (0x03U)
 
#define VS_VREF_SEL_DELAY_MASK   (0xF0U)
 
#define VS_VREF_SEL_PIX_QUAL   (1 << 3)
 
#define VS_VREF_SEL_POL_INV   (1 << 2)
 
#define VS_VREF_SEL_OUT_MASK   (0x03U)
 
#define INPUT_SEL_FORMAT_RESET   (1 << 7)
 
#define INPUT_SEL_HDMIOUT   (1 << 1)
 
#define INPUT_SEL_DIG_INPUT   (1 << 0)
 
#define INPUT_SEL_VDPR_FMT_MASK   (0x85U)
 
#define AUDIO_PATH_SP_FLAG_USED_BY_FIFO   (1 << 2)
 
#define AUDIO_PATH_LAYOUT_FORCED   (1 << 1)
 
#define AUDIO_PATH_LAYOUT_FORCED_1   (1 << 0)
 
#define AUDIO_SEL_ACLKINV   (1 << 7)
 
#define AUDIO_SEL_TESTTONE   (1 << 6)
 
#define AUDIO_SEL_SPDIF   (1 << 5)
 
#define AUDIO_SEL_I2S32   (1 << 4)
 
#define AUDIO_SEL_AUTOMUTE   (1 << 3)
 
#define AUDIO_SEL_HBR_DEMUX   (1 << 2)
 
#define AUDIO_SEL_MODE_MASK   (0x03U)
 
#define AUDIO_LAYOUT_SP_FLAG   (1 << 2)
 
#define AUDIO_LAYOUT_MANUAL   (1 << 1)
 
#define AUDIO_LAYOUT_LAYOUT_1   (1 << 0)
 
#define AUDIO_OUT_ENABLE_ACLK   (1 << 5)
 
#define AUDIO_OUT_ENABLE_WS   (1 << 4)
 
#define AUDIO_OUT_ENABLE_AP3   (1 << 3)
 
#define AUDIO_OUT_ENABLE_AP2   (1 << 2)
 
#define AUDIO_OUT_ENABLE_AP1   (1 << 1)
 
#define AUDIO_OUT_ENABLE_AP0   (1 << 0)
 
#define AUDIO_CLOCK_POWER_OFF   (1 << 7)
 
#define AUDIO_CLOCK_REF_TMDS   (1 << 6)
 
#define AUDIO_CLOCK_REF_FREQ_MASK   (0x03U << 4)
 
#define AUDIO_CLOCK_MODE_MASK   (0x07U)
 
#define AUDIO_FLAGS_HWMUTE   (1 << 7)
 
#define AUDIO_FLAGS_PACKET_MASK   (0x0FU)
 
#define IRQ_TOP_SUS   (1 << 0)
 
#define IRQ_TOP_DDC   (1 << 1)
 
#define IRQ_TOP_RATE   (1 << 2)
 
#define IRQ_TOP_MODE   (1 << 3)
 
#define IRQ_TOP_INFO   (1 << 4)
 
#define IRQ_TOP_AUDIO   (1 << 5)
 
#define IRQ_TOP_HDCP   (1 << 6)
 
#define IRQ_TOP_AFE   (1 << 7)
 
#define NIRQ_TOP_FLAGS   (8)
 
#define NIRQ_SOURCE_FLAGS   (8)
 
#define IRQ_SUS_MTP   (1 << 7)
 
#define IRQ_SUS_FORMAT   (1 << 5)
 
#define IRQ_SUS_RT_PULSE   (1 << 4)
 
#define IRQ_SUS_END   (1 << 3)
 
#define IRQ_SUS_ACTIVITY   (1 << 2)
 
#define IRQ_SUS_INPUT   (1 << 1)
 
#define IRQ_SUS_STATE   (1 << 0)
 
#define IRQ_DDC_EDID_MTP   (1 << 7)
 
#define IRQ_DDC_ERROR   (1 << 6)
 
#define IRQ_DDC_CMD_DONE   (1 << 5)
 
#define IRQ_DDC_READ_DONE   (1 << 4)
 
#define IRQ_DDC_RX_SW   (1 << 3)
 
#define IRQ_DDC_HDCP_SW   (1 << 2)
 
#define IRQ_DDC_PULSE_END   (1 << 1)
 
#define IRQ_DDC_DET_5V   (1 << 0)
 
#define IRQ_RATE_RXDB   (1 << 6)
 
#define IRQ_RATE_RXDA   (1 << 2)
 
#define IRQ_MODE_FLAGS   (1 << 7)
 
#define IRQ_MODE_GAMUT   (1 << 6)
 
#define IRQ_MODE_ISRC2   (1 << 5)
 
#define IRQ_MODE_ISRC1   (1 << 4)
 
#define IRQ_MODE_ACP   (1 << 3)
 
#define IRQ_MODE_DC_CHANGE   (1 << 0)
 
#define IRQ_INFO_MPS   (1 << 6)
 
#define IRQ_INFO_AUD   (1 << 5)
 
#define IRQ_INFO_SPD   (1 << 4)
 
#define IRQ_INFO_AVI   (1 << 3)
 
#define IRQ_INFO_VS_OTHER_BK2   (1 << 2)
 
#define IRQ_INFO_VS_OTHER_BK1   (1 << 1)
 
#define IRQ_INFO_VS   (1 << 0)
 
#define IRQ_AUDIO_FREQ_CHANGE   (1 << 5)
 
#define IRQ_AUDIO_FLAGS   (1 << 4)
 
#define IRQ_AUDIO_MUTE   (1 << 3)
 
#define IRQ_AUDIO_CHAN_STATUS   (1 << 2)
 
#define IRQ_AUDIO_FIFO_UNMUTE   (1 << 1)
 
#define IRQ_AUDIO_FIFO_ERROR   (1 << 0)
 
#define IRQ_HDCP_MTP   (1 << 7)
 
#define IRQ_HDCP_DLMTP   (1 << 4)
 
#define IRQ_HDCP_STATE_C5   (1 << 1)
 
#define IRQ_AFE_WDL_UNLOCKED   (1 << 7)
 
#define IRQ_AFE_GAIN_DONE   (1 << 6)
 
#define IRQ_AFE_OFFSET_DONE   (1 << 5)
 
#define IRQ_AFE_ACTIVITY_DET   (1 << 4)
 
#define IRQ_AFE_PLL_LOCK   (1 << 3)
 
#define IRQ_AFE_TRMCAL_DONE   (1 << 2)
 
#define IRQ_AFE_ASU_STATE   (1 << 1)
 
#define IRQ_AFE_ASU_READY   (1 << 0)
 
#define SUS_STATUS_STATE_MASK   (0x1FU)
 
#define SUS_STATUS_STATE   (1 << 4)
 
#define SUS_STATUS_CLK_STABLE   (1 << 2)
 
#define SUS_STATUS_CLK_ACTIVE   (1 << 1)
 
#define SUS_STATUS_LAST_STATE   (SUS_STATUS_STATE | (1 << 3) | SUS_STATUS_CLK_ACTIVE | (1 << 0))
 
#define VP_CTRL_LOZ   (0x00U)
 
#define VP_CTRL_HIZ   (0x40U)
 
#define VP_CTRL_A_LSB   (0xC0U)
 
#define VP_CTRL_A_ISB   (0xC1U)
 
#define VP_CTRL_A_MSB   (0xC2U)
 
#define VP_CTRL_B_LSB   (0xC3U)
 
#define VP_CTRL_B_ISB   (0xC4U)
 
#define VP_CTRL_B_MSB   (0xC5U)
 
#define VP_CTRL_C_LSB   (0xC6U)
 
#define VP_CTRL_C_ISB   (0xC7U)
 
#define VP_CTRL_C_MSB   (0xC8U)
 
#define VP_CTRL_RED_LSB   VP_CTRL_A_LSB
 
#define VP_CTRL_RED_ISB   VP_CTRL_A_ISB
 
#define VP_CTRL_RED_MSB   VP_CTRL_A_MSB
 
#define VP_CTRL_BLUE_LSB   VP_CTRL_B_LSB
 
#define VP_CTRL_BLUE_ISB   VP_CTRL_B_ISB
 
#define VP_CTRL_BLUE_MSB   VP_CTRL_B_MSB
 
#define VP_CTRL_GREEN_LSB   VP_CTRL_C_LSB
 
#define VP_CTRL_GREEN_ISB   VP_CTRL_C_ISB
 
#define VP_CTRL_GREEN_MSB   VP_CTRL_C_MSB
 
#define VP_CTRL_CBCR_LSB   VP_CTRL_A_LSB
 
#define VP_CTRL_CBCR_ISB   VP_CTRL_A_ISB
 
#define VP_CTRL_CBCR_MSB   VP_CTRL_A_MSB
 
#define VP_CTRL_CB_LSB   VP_CTRL_B_LSB
 
#define VP_CTRL_CB_ISB   VP_CTRL_B_ISB
 
#define VP_CTRL_CB_MSB   VP_CTRL_B_MSB
 
#define VP_CTRL_Y_LSB   VP_CTRL_C_LSB
 
#define VP_CTRL_Y_ISB   VP_CTRL_C_ISB
 
#define VP_CTRL_Y_MSB   VP_CTRL_C_MSB
 
#define PIX_REPEAT_UP_SEL_MASK   (0x30U)
 
#define PIX_REPEAT_PIX_REP_MASK   (0x0FU)
 
#define HPD_POWER_BYPASS_MASK   (0x0CU)
 
#define HPD_POWER_EDID_ONLY   (1 << 1)
 
#define HPD_AUTO_READ_EDID   (1 << 7)
 
#define HPD_AUTO_F3TECH   (1 << 5)
 
#define HPD_AUTO_OTHER   (1 << 4)
 
#define HPD_AUTO_UNSEL   (1 << 3)
 
#define HPD_AUTO_ALL_CHAN   (1 << 2)
 
#define HPD_AUTO_PREV_CHAN   (1 << 1)
 
#define HPD_AUTO_NEW_CHAN   (1 << 0)
 
#define HPD_MAN_GAIN_MASK   (0x03U)
 
#define HDMI_FLAGS_AUDIO   (1 << 7)
 
#define HDMI_FLAGS_HDMI   (1 << 6)
 
#define HDMI_FLAGS_EESS   (1 << 5)
 
#define HDMI_FLAGS_HDCP   (1 << 4)
 
#define HDMI_FLAGS_AVMUTE   (1 << 3)
 
#define HDMI_FLAGS_AUD_LAYOUT   (1 << 2)
 
#define HDMI_FLAGS_AUD_FIFO_OVR   (1 << 1)
 
#define HDMI_FLAGS_AUD_FIFO_LOW   (1 << 0)
 
#define HDMI_CTRL_MUTE_MASK   (0x0CU)
 
#define HMTP_CNTRL_DL_ALL   (1 << 0)
 
#define HDMI_CTRL_HDCP_MASK   (0x03U)
 
#define INFO_AUD_CODE_TYPE_MASK   (0xF0U)
 
#define INFO_AUD_CH_COUNT_MASK   (0x07U)
 
#define INFO_AUD_SAMPLE_FREQ_MASK   (0x1CU)
 
#define INFO_AUD_SAMPLE_SIZE_MASK   (0x03U)
 
#define INFO_AUD_CODE_EXT_MASK   (0x1FU)
 
#define INFO_AUD_DM_INHIBIT   (1 << 7)
 
#define INFO_AUD_LVL_SHIFT_MASK   (0x78U)
 
#define INFO_AUD_LFE_PB_MASK   (0x03U)
 
#define TDA1997X_SEED_TABLE_LEN   (10)
 

Enumerations

enum  clkout_clk_sel { CLKOUT_CLK_SEL_PCLK = 0x00, CLKOUT_CLK_SEL_PCLK_X2 = 0x01, CLKOUT_CLK_SEL_PCLK_DIV2 = 0x02, CLKOUT_CLK_SEL_PCLK_DIV4 = 0x03 }
 
enum  de_fref_sel { DE_FREF_SEL_OUT_DE_VHREF = 0x00, DE_FREF_SEL_OUT_FREF_VHREF = 0x01, DE_FREF_SEL_OUT_FREF_HDMI = 0x02 }
 
enum  hs_href_sel { HS_HREF_SEL_OUT_HS_VHREF = 0x00, HS_HREF_SEL_OUT_HREF_VHREF = 0x01, HS_HREF_SEL_OUT_HREF_HDMI = 0x02, HS_HREF_SEL_OUT_NOT_GENERATED = 0x03 }
 
enum  vs_vref_sel { VS_VREF_SEL_OUT_VS_VHREF = 0x00, VS_VREF_SEL_OUT_VREF_VHREF = 0x01, VS_VREF_SEL_OUT_VREF_HDMI = 0x02, VS_VREF_SEL_OUT_NOT_GENERATED = 0x03 }
 
enum  audio_clock_ref_freq { AUDIO_CLOCK_REF_FREQ_13_5MHz = 0x00, AUDIO_CLOCK_REF_FREQ_27MHz = 0x10, AUDIO_CLOCK_REF_FREQ_54MHz = 0x20 }
 
enum  audio_clock_mode {
  AUDIO_CLOCK_MODE_16FS = 0x00, AUDIO_CLOCK_MODE_32FS = 0x01, AUDIO_CLOCK_MODE_64FS = 0x02, AUDIO_CLOCK_MODE_128FS = 0x03,
  AUDIO_CLOCK_MODE_256FS = 0x04, AUDIO_CLOCK_MODE_512FS = 0x05
}
 
enum  audio_flags_packet {
  AUDIO_FLAGS_PACKET_NONE = 0x00, AUDIO_FLAGS_PACKET_SAMPLE = 0x01, AUDIO_FLAGS_PACKET_HBR = 0x02, AUDIO_FLAGS_PACKET_OBA = 0x04,
  AUDIO_FLAGS_PACKET_DST = 0x08
}
 
enum  pix_repeat_up_sel { PIX_REPEAT_UP_SEL_BYPASS = 0x00, PIX_REPEAT_UP_SEL_REPEATCHROMA = 0x10, PIX_REPEAT_UP_SEL_INTERPOLATE = 0x20 }
 
enum  hdmi_ctrl_mute { HDMI_CTRL_MUTE_AUTO = 0x00, HDMI_CTRL_MUTE_OFF = 0x04, HDMI_CTRL_MUTE_ON = 0x08 }
 
enum  hdmi_ctrl_hdcp { HDMI_CTRL_HDCP_AUTO = 0x00, HDMI_CTRL_HDCP_OESS = 0x01, HDMI_CTRL_HDCP_EESS = 0x02 }
 
enum  page {
  PAGE_CTRL = 0x00, PAGE_HDMI = 0x01, PAGE_AVI = 0x02, PAGE_TMDSA = 0x12,
  PAGE_TMDSB = 0x13, PAGE_14 = 0x14, PAGE_EDIDA = 0x20, PAGE_EDIDB = 0x21,
  PAGE_CMTP = 0x30, PAGE_MTPA = 0x40, PAGE_MTPB = 0x41, PAGE_MTPC = 0x42,
  PAGE_INVALID = 0xFF
}
 
enum  hdmi_reg {
  VERSION = PAGE_ADDR(PAGE_CTRL, 0x00), INPUT_SEL = PAGE_ADDR(PAGE_CTRL, 0x01), SERVICE_MODE = PAGE_ADDR(PAGE_CTRL, 0x02), HPD_MAN_CTRL = PAGE_ADDR(PAGE_CTRL, 0x03),
  RT_MAN_CTRL = PAGE_ADDR(PAGE_CTRL, 0x04), MANUAL_PD_DDC = PAGE_ADDR(PAGE_CTRL, 0x05), MANUAL_PD_TMDS = PAGE_ADDR(PAGE_CTRL, 0x06), MANUAL_PD_VDP = PAGE_ADDR(PAGE_CTRL, 0x07),
  MANUAL_PD_ADP = PAGE_ADDR(PAGE_CTRL, 0x08), DDC_SOFT_RST = PAGE_ADDR(PAGE_CTRL, 0x09), STANDBY_SOFT_RST = PAGE_ADDR(PAGE_CTRL, 0x0A), HDMI_SOFT_RST = PAGE_ADDR(PAGE_CTRL, 0x0B),
  HDMI_INFO_RST = PAGE_ADDR(PAGE_CTRL, 0x0C), IRQ_FLG_CLR_TOP = PAGE_ADDR(PAGE_CTRL, 0x0E), IRQ_FLG_CLR_SUS = PAGE_ADDR(PAGE_CTRL, 0x0F), IRQ_FLG_CLR_DDC = PAGE_ADDR(PAGE_CTRL, 0x10),
  IRQ_FLG_CLR_RATE = PAGE_ADDR(PAGE_CTRL, 0x11), IRQ_FLG_CLR_MODE = PAGE_ADDR(PAGE_CTRL, 0x12), IRQ_FLG_CLR_INFO = PAGE_ADDR(PAGE_CTRL, 0x13), IRQ_FLG_CLR_AUDIO = PAGE_ADDR(PAGE_CTRL, 0x14),
  IRQ_FLG_CLR_HDCP = PAGE_ADDR(PAGE_CTRL, 0x15), IRQ_FLG_CLR_AFE = PAGE_ADDR(PAGE_CTRL, 0x16), IRQ_MASK_TOP = PAGE_ADDR(PAGE_CTRL, 0x17), IRQ_MASK_SUS = PAGE_ADDR(PAGE_CTRL, 0x18),
  IRQ_MASK_DDC = PAGE_ADDR(PAGE_CTRL, 0x19), IRQ_MASK_RATE = PAGE_ADDR(PAGE_CTRL, 0x1A), IRQ_MASK_MODE = PAGE_ADDR(PAGE_CTRL, 0x1B), IRQ_MASK_INFO = PAGE_ADDR(PAGE_CTRL, 0x1C),
  IRQ_MASK_AUDIO = PAGE_ADDR(PAGE_CTRL, 0x1D), IRQ_MASK_HDCP = PAGE_ADDR(PAGE_CTRL, 0x1E), IRQ_MASK_AFE = PAGE_ADDR(PAGE_CTRL, 0x1F), DETECT_5V_HPD = PAGE_ADDR(PAGE_CTRL, 0x20),
  SUS_STATUS = PAGE_ADDR(PAGE_CTRL, 0x21), V_PER_MSB = PAGE_ADDR(PAGE_CTRL, 0x22), V_PER_ISB = PAGE_ADDR(PAGE_CTRL, 0x23), V_PER_LSB = PAGE_ADDR(PAGE_CTRL, 0x24),
  H_PER_MSB = PAGE_ADDR(PAGE_CTRL, 0x25), H_PER_LSB = PAGE_ADDR(PAGE_CTRL, 0x26), HS_WIDTH_MSB = PAGE_ADDR(PAGE_CTRL, 0x27), HS_WIDTH_LSB = PAGE_ADDR(PAGE_CTRL, 0x28),
  FMT_H_TOT_MSB = PAGE_ADDR(PAGE_CTRL, 0x29), FMT_H_TOT_LSB = PAGE_ADDR(PAGE_CTRL, 0x2A), FMT_H_ACT_MSB = PAGE_ADDR(PAGE_CTRL, 0x2B), FMT_H_ACT_LSB = PAGE_ADDR(PAGE_CTRL, 0x2C),
  FMT_H_FRONT_MSB = PAGE_ADDR(PAGE_CTRL, 0x2D), FMT_H_FRONT_LSB = PAGE_ADDR(PAGE_CTRL, 0x2E), FMT_H_SYNC_MSB = PAGE_ADDR(PAGE_CTRL, 0x2F), FMT_H_SYNC_LSB = PAGE_ADDR(PAGE_CTRL, 0x30),
  FMT_H_BACK_MSB = PAGE_ADDR(PAGE_CTRL, 0x31), FMT_H_BACK_LSB = PAGE_ADDR(PAGE_CTRL, 0x32), FMT_V_TOT_MSB = PAGE_ADDR(PAGE_CTRL, 0x33), FMT_V_TOT_LSB = PAGE_ADDR(PAGE_CTRL, 0x34),
  FMT_V_ACT_MSB = PAGE_ADDR(PAGE_CTRL, 0x35), FMT_V_ACT_LSB = PAGE_ADDR(PAGE_CTRL, 0x36), FMT_V_FRONT_F1 = PAGE_ADDR(PAGE_CTRL, 0x37), FMT_V_FRONT_F2 = PAGE_ADDR(PAGE_CTRL, 0x38),
  FMT_V_SYNC = PAGE_ADDR(PAGE_CTRL, 0x39), FMT_V_BACK_F1 = PAGE_ADDR(PAGE_CTRL, 0x3A), FMT_V_BACK_F2 = PAGE_ADDR(PAGE_CTRL, 0x3B), FMT_DE_ACT = PAGE_ADDR(PAGE_CTRL, 0x3C),
  EQ_STATUS0 = PAGE_ADDR(PAGE_CTRL, 0x3E), EQ_STATUS1 = PAGE_ADDR(PAGE_CTRL, 0x3F), RATE_CTRL = PAGE_ADDR(PAGE_CTRL, 0x40), RATE_DELTA = PAGE_ADDR(PAGE_CTRL, 0x41),
  RATE_STABLE_CNT = PAGE_ADDR(PAGE_CTRL, 0x42), CLK_MIN_RATE_MSB = PAGE_ADDR(PAGE_CTRL, 0x43), CLK_MIN_RATE_ISB = PAGE_ADDR(PAGE_CTRL, 0x44), CLK_MIN_RATE_LSB = PAGE_ADDR(PAGE_CTRL, 0x45),
  CLK_MAX_RATE_MSB = PAGE_ADDR(PAGE_CTRL, 0x46), CLK_MAX_RATE_ISB = PAGE_ADDR(PAGE_CTRL, 0x47), CLK_MAX_RATE_LSB = PAGE_ADDR(PAGE_CTRL, 0x48), CLK_A_STATUS = PAGE_ADDR(PAGE_CTRL, 0x49),
  CLK_A_RATE_MSB = PAGE_ADDR(PAGE_CTRL, 0x4A), CLK_A_RATE_ISB = PAGE_ADDR(PAGE_CTRL, 0x4B), CLK_A_RATE_LSB = PAGE_ADDR(PAGE_CTRL, 0x4C), DRIFT_CLK_A_REG = PAGE_ADDR(PAGE_CTRL, 0x4D),
  CLK_B_STATUS = PAGE_ADDR(PAGE_CTRL, 0x4E), CLK_B_RATE_MSB = PAGE_ADDR(PAGE_CTRL, 0x4F), CLK_B_RATE_ISB = PAGE_ADDR(PAGE_CTRL, 0x50), CLK_B_RATE_LSB = PAGE_ADDR(PAGE_CTRL, 0x51),
  DRIFT_CLK_B_REG = PAGE_ADDR(PAGE_CTRL, 0x52), HDCP_CTRL = PAGE_ADDR(PAGE_CTRL, 0x60), HDCP_KDS_MSB = PAGE_ADDR(PAGE_CTRL, 0x61), HDCP_KDS_LSB = PAGE_ADDR(PAGE_CTRL, 0x62),
  HDCP_BCAPS = PAGE_ADDR(PAGE_CTRL, 0x63), HDCP_KEY_CTRL = PAGE_ADDR(PAGE_CTRL, 0x64), HDCP_BSTATUS_MSB = PAGE_ADDR(PAGE_CTRL, 0x65), HDCP_BSTATUS_LSB = PAGE_ADDR(PAGE_CTRL, 0x66),
  FIFO_KSV_IDX = PAGE_ADDR(PAGE_CTRL, 0x67), FIFO_KSV4 = PAGE_ADDR(PAGE_CTRL, 0x68), FIFO_KSV3 = PAGE_ADDR(PAGE_CTRL, 0x69), FIFO_KSV2 = PAGE_ADDR(PAGE_CTRL, 0x6A),
  FIFO_KSV1 = PAGE_ADDR(PAGE_CTRL, 0x6B), FIFO_KSV0 = PAGE_ADDR(PAGE_CTRL, 0x6C), HDCP_RPT_CTRL = PAGE_ADDR(PAGE_CTRL, 0x6D), INFO_CTRL = PAGE_ADDR(PAGE_CTRL, 0x76),
  INFO_EXCEED = PAGE_ADDR(PAGE_CTRL, 0x77), ACP_TIMEOUT = PAGE_ADDR(PAGE_CTRL, 0x78), PACKET_TYPE_SCAN = PAGE_ADDR(PAGE_CTRL, 0x79), PIX_REPEAT = PAGE_ADDR(PAGE_CTRL, 0x7B),
  AUDIO_PATH = PAGE_ADDR(PAGE_CTRL, 0x7C), AUDIO_SEL = PAGE_ADDR(PAGE_CTRL, 0x7D), AUDIO_OUT_ENABLE = PAGE_ADDR(PAGE_CTRL, 0x7E), AUDIO_OUT_LOW_HIZ = PAGE_ADDR(PAGE_CTRL, 0x7F),
  VDP_CTRL = PAGE_ADDR(PAGE_CTRL, 0x80), MAT_OI1_MSB = PAGE_ADDR(PAGE_CTRL, 0x81), MAT_OI1_LSB = PAGE_ADDR(PAGE_CTRL, 0x82), MAT_OI2_MSB = PAGE_ADDR(PAGE_CTRL, 0x83),
  MAT_OI2_LSB = PAGE_ADDR(PAGE_CTRL, 0x84), MAT_OI3_MSB = PAGE_ADDR(PAGE_CTRL, 0x85), MAT_OI3_LSB = PAGE_ADDR(PAGE_CTRL, 0x86), MAT_P11_MSB = PAGE_ADDR(PAGE_CTRL, 0x87),
  MAT_P11_LSB = PAGE_ADDR(PAGE_CTRL, 0x88), MAT_P12_MSB = PAGE_ADDR(PAGE_CTRL, 0x89), MAT_P12_LSB = PAGE_ADDR(PAGE_CTRL, 0x8A), MAT_P13_MSB = PAGE_ADDR(PAGE_CTRL, 0x8B),
  MAT_P13_LSB = PAGE_ADDR(PAGE_CTRL, 0x8C), MAT_P21_MSB = PAGE_ADDR(PAGE_CTRL, 0x8D), MAT_P21_LSB = PAGE_ADDR(PAGE_CTRL, 0x8E), MAT_P22_MSB = PAGE_ADDR(PAGE_CTRL, 0x8F),
  MAT_P22_LSB = PAGE_ADDR(PAGE_CTRL, 0x90), MAT_P23_MSB = PAGE_ADDR(PAGE_CTRL, 0x91), MAT_P23_LSB = PAGE_ADDR(PAGE_CTRL, 0x92), MAT_P31_MSB = PAGE_ADDR(PAGE_CTRL, 0x93),
  MAT_P31_LSB = PAGE_ADDR(PAGE_CTRL, 0x94), MAT_P32_MSB = PAGE_ADDR(PAGE_CTRL, 0x95), MAT_P32_LSB = PAGE_ADDR(PAGE_CTRL, 0x96), MAT_P33_MSB = PAGE_ADDR(PAGE_CTRL, 0x97),
  MAT_P33_LSB = PAGE_ADDR(PAGE_CTRL, 0x98), MAT_OO1_MSB = PAGE_ADDR(PAGE_CTRL, 0x99), MAT_OO1_LSB = PAGE_ADDR(PAGE_CTRL, 0x9A), MAT_OO2_MSB = PAGE_ADDR(PAGE_CTRL, 0x9B),
  MAT_OO2_LSB = PAGE_ADDR(PAGE_CTRL, 0x9C), MAT_OO3_MSB = PAGE_ADDR(PAGE_CTRL, 0x9D), MAT_OO3_LSB = PAGE_ADDR(PAGE_CTRL, 0x9E), VHREF_CTRL = PAGE_ADDR(PAGE_CTRL, 0xA0),
  PXCNT_PR_MSB = PAGE_ADDR(PAGE_CTRL, 0xA2), PXCNT_PR_LSB = PAGE_ADDR(PAGE_CTRL, 0xA3), PXCNT_NPIX_MSB = PAGE_ADDR(PAGE_CTRL, 0xA4), PXCNT_NPIX_LSB = PAGE_ADDR(PAGE_CTRL, 0xA5),
  LCNT_PR_MSB = PAGE_ADDR(PAGE_CTRL, 0xA6), LCNT_PR_LSB = PAGE_ADDR(PAGE_CTRL, 0xA7), LCNT_NLIN_MSB = PAGE_ADDR(PAGE_CTRL, 0xA8), LCNT_NLIN_LSB = PAGE_ADDR(PAGE_CTRL, 0xA9),
  HREF_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xAA), HREF_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xAB), HREF_E_MSB = PAGE_ADDR(PAGE_CTRL, 0xAC), HREF_E_LSB = PAGE_ADDR(PAGE_CTRL, 0xAD),
  HS_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xAE), HS_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xAF), HS_E_MSB = PAGE_ADDR(PAGE_CTRL, 0xB0), HS_E_LSB = PAGE_ADDR(PAGE_CTRL, 0xB1),
  VREF_F1_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xB2), VREF_F1_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xB3), VREF_F1_WIDTH = PAGE_ADDR(PAGE_CTRL, 0xB4), VREF_F2_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xB5),
  VREF_F2_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xB6), VREF_F2_WIDTH = PAGE_ADDR(PAGE_CTRL, 0xB7), VS_F1_LINE_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xB8), VS_F1_LINE_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xB9),
  VS_F1_LINE_WIDTH = PAGE_ADDR(PAGE_CTRL, 0xBA), VS_F2_LINE_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xBB), VS_F2_LINE_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xBC), VS_F2_LINE_WIDTH = PAGE_ADDR(PAGE_CTRL, 0xBD),
  VS_F1_PIX_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xBE), VS_F1_PIX_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xBF), VS_F1_PIX_E_MSB = PAGE_ADDR(PAGE_CTRL, 0xC0), VS_F1_PIX_E_LSB = PAGE_ADDR(PAGE_CTRL, 0xC1),
  VS_F2_PIX_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xC2), VS_F2_PIX_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xC3), VS_F2_PIX_E_MSB = PAGE_ADDR(PAGE_CTRL, 0xC4), VS_F2_PIX_E_LSB = PAGE_ADDR(PAGE_CTRL, 0xC5),
  FREF_F1_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xC6), FREF_F1_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xC7), FREF_F2_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xC8), FREF_F2_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xC9),
  FDW_S_MSB = PAGE_ADDR(PAGE_CTRL, 0xCA), FDW_S_LSB = PAGE_ADDR(PAGE_CTRL, 0xCB), FDW_E_MSB = PAGE_ADDR(PAGE_CTRL, 0xCC), FDW_E_LSB = PAGE_ADDR(PAGE_CTRL, 0xCD),
  MEASLIN_MSB = PAGE_ADDR(PAGE_CTRL, 0xCE), MEASLIN_LSB = PAGE_ADDR(PAGE_CTRL, 0xCF), MEASPIX_MSB = PAGE_ADDR(PAGE_CTRL, 0xD0), MEASPIX_LSB = PAGE_ADDR(PAGE_CTRL, 0xD1),
  ASD_MEASLIN_MSB = PAGE_ADDR(PAGE_CTRL, 0xD2), BLK_GY_MSB = PAGE_ADDR(PAGE_CTRL, 0xDA), BLK_GY_LSB = PAGE_ADDR(PAGE_CTRL, 0xDB), BLK_BU_MSB = PAGE_ADDR(PAGE_CTRL, 0xDC),
  BLK_BU_LSB = PAGE_ADDR(PAGE_CTRL, 0xDD), BLK_RV_MSB = PAGE_ADDR(PAGE_CTRL, 0xDE), BLK_RV_LSB = PAGE_ADDR(PAGE_CTRL, 0xDF), FILTERS_CTRL = PAGE_ADDR(PAGE_CTRL, 0xE0),
  C_CEIL_MSB = PAGE_ADDR(PAGE_CTRL, 0xE1), C_CEIL_LSB = PAGE_ADDR(PAGE_CTRL, 0xE2), C_FLOOR_MSB = PAGE_ADDR(PAGE_CTRL, 0xE3), C_FLOOR_LSB = PAGE_ADDR(PAGE_CTRL, 0xE4),
  Y_CEIL_MSB = PAGE_ADDR(PAGE_CTRL, 0xE5), Y_CEIL_LSB = PAGE_ADDR(PAGE_CTRL, 0xE6), Y_FLOOR_MSB = PAGE_ADDR(PAGE_CTRL, 0xE7), Y_FLOOR_LSB = PAGE_ADDR(PAGE_CTRL, 0xE8),
  DITHERING_CTRL = PAGE_ADDR(PAGE_CTRL, 0xE9), OF_CTRL = PAGE_ADDR(PAGE_CTRL, 0xEA), CLKOUT_CTRL = PAGE_ADDR(PAGE_CTRL, 0xEB), HS_HREF_SEL = PAGE_ADDR(PAGE_CTRL, 0xEC),
  VS_VREF_SEL = PAGE_ADDR(PAGE_CTRL, 0xED), DE_FREF_SEL = PAGE_ADDR(PAGE_CTRL, 0xEE), VP35_32_CTRL = PAGE_ADDR(PAGE_CTRL, 0xEF), VP31_28_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF0),
  VP27_24_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF1), VP23_20_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF2), VP19_16_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF3), VP15_12_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF4),
  VP11_8_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF5), VP7_4_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF6), VP3_0_CTRL = PAGE_ADDR(PAGE_CTRL, 0xF7), EMTP_CTRL = PAGE_ADDR(PAGE_CTRL, 0xFA),
  EMTP_ADDRESS = PAGE_ADDR(PAGE_CTRL, 0xFB), CMTP_CTRL = PAGE_ADDR(PAGE_CTRL, 0xFC), CMTP_ADDRESS = PAGE_ADDR(PAGE_CTRL, 0xFD), ECC_CHECK = PAGE_ADDR(PAGE_CTRL, 0xFE),
  HDMI_FLAGS = PAGE_ADDR(PAGE_HDMI, 0x00), DEEP_COLOR_MODE = PAGE_ADDR(PAGE_HDMI, 0x01), ERR_FR_MSB = PAGE_ADDR(PAGE_HDMI, 0x02), ERR_FR_LSB = PAGE_ADDR(PAGE_HDMI, 0x03),
  FR_ERR_MSB = PAGE_ADDR(PAGE_HDMI, 0x04), FR_ERR_LSB = PAGE_ADDR(PAGE_HDMI, 0x05), AUDIO_FLAGS = PAGE_ADDR(PAGE_HDMI, 0x08), AUDIO_FREQ = PAGE_ADDR(PAGE_HDMI, 0x09),
  ACRP_CTS_MSB = PAGE_ADDR(PAGE_HDMI, 0x0A), ACRP_CTS_ISB = PAGE_ADDR(PAGE_HDMI, 0x0B), ACRP_CTS_LSB = PAGE_ADDR(PAGE_HDMI, 0x0C), ACRP_N_MSB = PAGE_ADDR(PAGE_HDMI, 0x0D),
  ACRP_N_ISB = PAGE_ADDR(PAGE_HDMI, 0x0E), ACRP_N_LSB = PAGE_ADDR(PAGE_HDMI, 0x0F), CH_STAT_BYTE0 = PAGE_ADDR(PAGE_HDMI, 0x10), CH_STAT_BYTE1 = PAGE_ADDR(PAGE_HDMI, 0x11),
  CH_STAT_BYTE3 = PAGE_ADDR(PAGE_HDMI, 0x12), CH_STAT_BYTE4 = PAGE_ADDR(PAGE_HDMI, 0x13), CH_STAT_BYTE2_AP0_L = PAGE_ADDR(PAGE_HDMI, 0x14), CH_STAT_BYTE2_AP0_R = PAGE_ADDR(PAGE_HDMI, 0x15),
  CH_STAT_BYTE2_AP1_L = PAGE_ADDR(PAGE_HDMI, 0x16), CH_STAT_BYTE2_AP1_R = PAGE_ADDR(PAGE_HDMI, 0x17), CH_STAT_BYTE2_AP2_L = PAGE_ADDR(PAGE_HDMI, 0x18), CH_STAT_BYTE2_AP2_R = PAGE_ADDR(PAGE_HDMI, 0x19),
  CH_STAT_BYTE2_AP3_L = PAGE_ADDR(PAGE_HDMI, 0x1A), CH_STAT_BYTE2_AP3_R = PAGE_ADDR(PAGE_HDMI, 0x1B), GCP_PACKET_TYPE = PAGE_ADDR(PAGE_HDMI, 0x21), GCP_HEADER1 = PAGE_ADDR(PAGE_HDMI, 0x22),
  GCP_HEADER2 = PAGE_ADDR(PAGE_HDMI, 0x23), GCP_BYTE0 = PAGE_ADDR(PAGE_HDMI, 0x24), GCP_BYTE1 = PAGE_ADDR(PAGE_HDMI, 0x25), GCP_BYTE2 = PAGE_ADDR(PAGE_HDMI, 0x26),
  GCP_BYTE3 = PAGE_ADDR(PAGE_HDMI, 0x27), GCP_BYTE4 = PAGE_ADDR(PAGE_HDMI, 0x28), GCP_BYTE5 = PAGE_ADDR(PAGE_HDMI, 0x29), GCP_BYTE6 = PAGE_ADDR(PAGE_HDMI, 0x2A),
  ACP_UPDATE = PAGE_ADDR(PAGE_HDMI, 0x40), ACP_PACKET_TYPE = PAGE_ADDR(PAGE_HDMI, 0x41), ACP_TYPE = PAGE_ADDR(PAGE_HDMI, 0x42), ACP_RSVD = PAGE_ADDR(PAGE_HDMI, 0x43),
  ACP_BYTE0 = PAGE_ADDR(PAGE_HDMI, 0x44), ACP_BYTE1 = PAGE_ADDR(PAGE_HDMI, 0x45), ACP_BYTE2 = PAGE_ADDR(PAGE_HDMI, 0x46), ACP_BYTE3 = PAGE_ADDR(PAGE_HDMI, 0x47),
  ACP_BYTE4 = PAGE_ADDR(PAGE_HDMI, 0x48), ACP_BYTE5 = PAGE_ADDR(PAGE_HDMI, 0x49), ACP_BYTE6 = PAGE_ADDR(PAGE_HDMI, 0x4A), ACP_BYTE7 = PAGE_ADDR(PAGE_HDMI, 0x4B),
  ACP_BYTE8 = PAGE_ADDR(PAGE_HDMI, 0x4C), ACP_BYTE9 = PAGE_ADDR(PAGE_HDMI, 0x4D), ACP_BYTE10 = PAGE_ADDR(PAGE_HDMI, 0x4E), ACP_BYTE11 = PAGE_ADDR(PAGE_HDMI, 0x4F),
  ACP_BYTE12 = PAGE_ADDR(PAGE_HDMI, 0x50), ACP_BYTE13 = PAGE_ADDR(PAGE_HDMI, 0x51), ACP_BYTE14 = PAGE_ADDR(PAGE_HDMI, 0x52), ACP_BYTE15 = PAGE_ADDR(PAGE_HDMI, 0x53),
  ISRC1_PACKET_TYPE = PAGE_ADDR(PAGE_HDMI, 0x61), ISRC1_CTRL = PAGE_ADDR(PAGE_HDMI, 0x62), ISRC1_RSVD = PAGE_ADDR(PAGE_HDMI, 0x63), UPC_EAN_ISRC0 = PAGE_ADDR(PAGE_HDMI, 0x64),
  UPC_EAN_ISRC1 = PAGE_ADDR(PAGE_HDMI, 0x65), UPC_EAN_ISRC2 = PAGE_ADDR(PAGE_HDMI, 0x66), UPC_EAN_ISRC3 = PAGE_ADDR(PAGE_HDMI, 0x67), UPC_EAN_ISRC4 = PAGE_ADDR(PAGE_HDMI, 0x68),
  UPC_EAN_ISRC5 = PAGE_ADDR(PAGE_HDMI, 0x69), UPC_EAN_ISRC6 = PAGE_ADDR(PAGE_HDMI, 0x6A), UPC_EAN_ISRC7 = PAGE_ADDR(PAGE_HDMI, 0x6B), UPC_EAN_ISRC8 = PAGE_ADDR(PAGE_HDMI, 0x6C),
  UPC_EAN_ISRC9 = PAGE_ADDR(PAGE_HDMI, 0x6D), UPC_EAN_ISRC10 = PAGE_ADDR(PAGE_HDMI, 0x6E), UPC_EAN_ISRC11 = PAGE_ADDR(PAGE_HDMI, 0x6F), UPC_EAN_ISRC12 = PAGE_ADDR(PAGE_HDMI, 0x70),
  UPC_EAN_ISRC13 = PAGE_ADDR(PAGE_HDMI, 0x71), UPC_EAN_ISRC14 = PAGE_ADDR(PAGE_HDMI, 0x72), UPC_EAN_ISRC15 = PAGE_ADDR(PAGE_HDMI, 0x73), ISRC2_PACKET_TYPE = PAGE_ADDR(PAGE_HDMI, 0x81),
  ISRC2_RSVD1 = PAGE_ADDR(PAGE_HDMI, 0x82), ISRC2_RSVD2 = PAGE_ADDR(PAGE_HDMI, 0x83), UPC_EAN_ISRC16 = PAGE_ADDR(PAGE_HDMI, 0x84), UPC_EAN_ISRC17 = PAGE_ADDR(PAGE_HDMI, 0x85),
  UPC_EAN_ISRC18 = PAGE_ADDR(PAGE_HDMI, 0x86), UPC_EAN_ISRC19 = PAGE_ADDR(PAGE_HDMI, 0x87), UPC_EAN_ISRC20 = PAGE_ADDR(PAGE_HDMI, 0x88), UPC_EAN_ISRC21 = PAGE_ADDR(PAGE_HDMI, 0x89),
  UPC_EAN_ISRC22 = PAGE_ADDR(PAGE_HDMI, 0x8A), UPC_EAN_ISRC23 = PAGE_ADDR(PAGE_HDMI, 0x8B), UPC_EAN_ISRC24 = PAGE_ADDR(PAGE_HDMI, 0x8C), UPC_EAN_ISRC25 = PAGE_ADDR(PAGE_HDMI, 0x8D),
  UPC_EAN_ISRC26 = PAGE_ADDR(PAGE_HDMI, 0x8E), UPC_EAN_ISRC27 = PAGE_ADDR(PAGE_HDMI, 0x8F), UPC_EAN_ISRC28 = PAGE_ADDR(PAGE_HDMI, 0x90), UPC_EAN_ISRC29 = PAGE_ADDR(PAGE_HDMI, 0x91),
  UPC_EAN_ISRC30 = PAGE_ADDR(PAGE_HDMI, 0x92), UPC_EAN_ISRC31 = PAGE_ADDR(PAGE_HDMI, 0x93), GBD_UPDATE = PAGE_ADDR(PAGE_HDMI, 0xA0), GBD_PACKET_TYPE = PAGE_ADDR(PAGE_HDMI, 0xA1),
  GBD_HEADER1 = PAGE_ADDR(PAGE_HDMI, 0xA2), GBD_HEADER2 = PAGE_ADDR(PAGE_HDMI, 0xA3), GBD_BYTE0 = PAGE_ADDR(PAGE_HDMI, 0xA4), GBD_BYTE1 = PAGE_ADDR(PAGE_HDMI, 0xA5),
  GBD_BYTE2 = PAGE_ADDR(PAGE_HDMI, 0xA6), GBD_BYTE3 = PAGE_ADDR(PAGE_HDMI, 0xA7), GBD_BYTE4 = PAGE_ADDR(PAGE_HDMI, 0xA8), GBD_BYTE5 = PAGE_ADDR(PAGE_HDMI, 0xA9),
  GBD_BYTE6 = PAGE_ADDR(PAGE_HDMI, 0xAA), GBD_BYTE7 = PAGE_ADDR(PAGE_HDMI, 0xAB), GBD_BYTE8 = PAGE_ADDR(PAGE_HDMI, 0xAC), GBD_BYTE9 = PAGE_ADDR(PAGE_HDMI, 0xAD),
  GBD_BYTE10 = PAGE_ADDR(PAGE_HDMI, 0xAE), GBD_BYTE11 = PAGE_ADDR(PAGE_HDMI, 0xAF), GBD_BYTE12 = PAGE_ADDR(PAGE_HDMI, 0xB0), GBD_BYTE13 = PAGE_ADDR(PAGE_HDMI, 0xB1),
  GBD_BYTE14 = PAGE_ADDR(PAGE_HDMI, 0xB2), GBD_BYTE15 = PAGE_ADDR(PAGE_HDMI, 0xB3), GBD_BYTE16 = PAGE_ADDR(PAGE_HDMI, 0xB4), GBD_BYTE17 = PAGE_ADDR(PAGE_HDMI, 0xB5),
  GBD_BYTE18 = PAGE_ADDR(PAGE_HDMI, 0xB6), GBD_BYTE19 = PAGE_ADDR(PAGE_HDMI, 0xB7), GBD_BYTE20 = PAGE_ADDR(PAGE_HDMI, 0xB8), GBD_BYTE21 = PAGE_ADDR(PAGE_HDMI, 0xB9),
  GBD_BYTE22 = PAGE_ADDR(PAGE_HDMI, 0xBA), GBD_BYTE23 = PAGE_ADDR(PAGE_HDMI, 0xBB), GBD_BYTE24 = PAGE_ADDR(PAGE_HDMI, 0xBC), GBD_BYTE25 = PAGE_ADDR(PAGE_HDMI, 0xBD),
  GBD_BYTE26 = PAGE_ADDR(PAGE_HDMI, 0xBE), GBD_BYTE27 = PAGE_ADDR(PAGE_HDMI, 0xBF), HDCP_RI_MSB = PAGE_ADDR(PAGE_HDMI, 0xE0), HDCP_RI_LSB = PAGE_ADDR(PAGE_HDMI, 0xE1),
  HDCP_PJ = PAGE_ADDR(PAGE_HDMI, 0xE2), HDCP_AKSV4 = PAGE_ADDR(PAGE_HDMI, 0xE3), HDCP_AKSV3 = PAGE_ADDR(PAGE_HDMI, 0xE4), HDCP_AKSV2 = PAGE_ADDR(PAGE_HDMI, 0xE5),
  HDCP_AKSV1 = PAGE_ADDR(PAGE_HDMI, 0xE6), HDCP_AKSV0 = PAGE_ADDR(PAGE_HDMI, 0xE7), HDCP_AN7 = PAGE_ADDR(PAGE_HDMI, 0xE8), HDCP_AN6 = PAGE_ADDR(PAGE_HDMI, 0xE9),
  HDCP_AN5 = PAGE_ADDR(PAGE_HDMI, 0xEA), HDCP_AN4 = PAGE_ADDR(PAGE_HDMI, 0xEB), HDCP_AN3 = PAGE_ADDR(PAGE_HDMI, 0xEC), HDCP_AN2 = PAGE_ADDR(PAGE_HDMI, 0xED),
  HDCP_AN1 = PAGE_ADDR(PAGE_HDMI, 0xEE), HDCP_AN0 = PAGE_ADDR(PAGE_HDMI, 0xEF), HDCP_AINFO = PAGE_ADDR(PAGE_HDMI, 0xF0), HDCP_FSM_STATE = PAGE_ADDR(PAGE_HDMI, 0xF1),
  VS_IF_HDMI_UPDATE = PAGE_ADDR(PAGE_AVI, 0x00), VS_IF_HDMI_TYPE = PAGE_ADDR(PAGE_AVI, 0x01), VS_IF_HDMI_VERSION = PAGE_ADDR(PAGE_AVI, 0x02), VS_IF_HDMI_LENGTH = PAGE_ADDR(PAGE_AVI, 0x03),
  VS_IF_HDMI_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0x04), VS_IF_HDMI_BYTE1 = PAGE_ADDR(PAGE_AVI, 0x05), VS_IF_HDMI_BYTE27 = PAGE_ADDR(PAGE_AVI, 0x1F), VS_IF_OTHER_BK1_UPDATE = PAGE_ADDR(PAGE_AVI, 0x20),
  VS_IF_OTHER_BK1_TYPE = PAGE_ADDR(PAGE_AVI, 0x21), VS_IF_OTHER_BK1_VERSION = PAGE_ADDR(PAGE_AVI, 0x22), VS_IF_OTHER_BK1_LENGTH = PAGE_ADDR(PAGE_AVI, 0x23), VS_IF_OTHER_BK1_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0x24),
  VS_IF_OTHER_BK1_BYTE1 = PAGE_ADDR(PAGE_AVI, 0x25), VS_IF_OTHER_BK1_BYTE27 = PAGE_ADDR(PAGE_AVI, 0x3F), VS_IF_OTHER_BK2_UPDATE = PAGE_ADDR(PAGE_AVI, 0x40), VS_IF_OTHER_BK2_TYPE = PAGE_ADDR(PAGE_AVI, 0x41),
  VS_IF_OTHER_BK2_VERSION = PAGE_ADDR(PAGE_AVI, 0x42), VS_IF_OTHER_BK2_LENGTH = PAGE_ADDR(PAGE_AVI, 0x43), VS_IF_OTHER_BK2_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0x44), VS_IF_OTHER_BK2_BYTE1 = PAGE_ADDR(PAGE_AVI, 0x45),
  VS_IF_OTHER_BK2_BYTE27 = PAGE_ADDR(PAGE_AVI, 0x5F), AVI_IF_UPDATE = PAGE_ADDR(PAGE_AVI, 0x60), AVI_IF_TYPE = PAGE_ADDR(PAGE_AVI, 0x61), AVI_IF_VERSION = PAGE_ADDR(PAGE_AVI, 0x62),
  AVI_IF_LENGTH = PAGE_ADDR(PAGE_AVI, 0x63), AVI_IF_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0x64), AVI_IF_BYTE1 = PAGE_ADDR(PAGE_AVI, 0x65), AVI_IF_BYTE13 = PAGE_ADDR(PAGE_AVI, 0x71),
  SPD_IF_UPDATE = PAGE_ADDR(PAGE_AVI, 0x80), SPD_IF_TYPE = PAGE_ADDR(PAGE_AVI, 0x81), SPD_IF_VERSION = PAGE_ADDR(PAGE_AVI, 0x82), SPD_IF_LENGTH = PAGE_ADDR(PAGE_AVI, 0x83),
  SPD_IF_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0x84), SPD_IF_BYTE1 = PAGE_ADDR(PAGE_AVI, 0x85), SPD_IF_BYTE27 = PAGE_ADDR(PAGE_AVI, 0x9F), AUD_IF_UPDATE = PAGE_ADDR(PAGE_AVI, 0xA0),
  AUD_IF_TYPE = PAGE_ADDR(PAGE_AVI, 0xA1), AUD_IF_VERSION = PAGE_ADDR(PAGE_AVI, 0xA2), AUD_IF_LENGTH = PAGE_ADDR(PAGE_AVI, 0xA3), AUD_IF_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0xA4),
  AUD_IF_BYTE1 = PAGE_ADDR(PAGE_AVI, 0xA5), AUD_IF_BYTE10 = PAGE_ADDR(PAGE_AVI, 0xAE), MPS_IF_UPDATE = PAGE_ADDR(PAGE_AVI, 0xC0), MPS_IF_TYPE = PAGE_ADDR(PAGE_AVI, 0xC1),
  MPS_IF_VERSION = PAGE_ADDR(PAGE_AVI, 0xC2), MPS_IF_LENGTH = PAGE_ADDR(PAGE_AVI, 0xC3), MPS_IF_CHECKSUM = PAGE_ADDR(PAGE_AVI, 0xC4), MPS_IF_BYTE1 = PAGE_ADDR(PAGE_AVI, 0xC5),
  MPS_IF_BYTE10 = PAGE_ADDR(PAGE_AVI, 0xCE), CHECKSUM_VS_IF_HDMI = PAGE_ADDR(PAGE_AVI, 0xE0), CHECKSUM_VS_IF_OTHER_BK1 = PAGE_ADDR(PAGE_AVI, 0xE1), CHECKSUM_VS_IF_OTHER_BK2 = PAGE_ADDR(PAGE_AVI, 0xE2),
  CHECKSUM_AVI_IF = PAGE_ADDR(PAGE_AVI, 0xE3), CHECKSUM_SPD_IF = PAGE_ADDR(PAGE_AVI, 0xE4), CHECKSUM_AUD_IF = PAGE_ADDR(PAGE_AVI, 0xE5), CHECKSUM_MPS_IF = PAGE_ADDR(PAGE_AVI, 0xE6),
  CLK_CFG = PAGE_ADDR(PAGE_TMDSA, 0x00), CLK_OUT_CFG = PAGE_ADDR(PAGE_TMDSA, 0x01), CFG1 = PAGE_ADDR(PAGE_TMDSA, 0x02), CFG2 = PAGE_ADDR(PAGE_TMDSA, 0x03),
  PHS_CONF = PAGE_ADDR(PAGE_TMDSA, 0x05), PHS_AVERAGINGK = PAGE_ADDR(PAGE_TMDSA, 0x06), PHS_CH0_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x07), PHS_CH1_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x08),
  PHS_CH2_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x09), PHS_CH0_USED = PAGE_ADDR(PAGE_TMDSA, 0x0A), PHS_CH1_USED = PAGE_ADDR(PAGE_TMDSA, 0x0B), PHS_CH2_USED = PAGE_ADDR(PAGE_TMDSA, 0x0C),
  WDL_CFG = PAGE_ADDR(PAGE_TMDSA, 0x10), WDL_FROZEN = PAGE_ADDR(PAGE_TMDSA, 0x11), DELOCK_DELAY = PAGE_ADDR(PAGE_TMDSA, 0x12), SWAP_PN = PAGE_ADDR(PAGE_TMDSA, 0x13),
  OFFSET_CH0_SELPHS = PAGE_ADDR(PAGE_TMDSA, 0x18), OFFSET_CH1_SELPHS = PAGE_ADDR(PAGE_TMDSA, 0x19), OFFSET_CH2_SELPHS = PAGE_ADDR(PAGE_TMDSA, 0x1A), OFFSET_OSM_OVR = PAGE_ADDR(PAGE_TMDSA, 0x1B),
  OFFSET_CH0_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x1C), OFFSET_CH1_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x1D), OFFSET_CH2_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x1E), OFFSET_CH0 = PAGE_ADDR(PAGE_TMDSA, 0x1F),
  OFFSET_CH1 = PAGE_ADDR(PAGE_TMDSA, 0x20), OFFSET_CH2 = PAGE_ADDR(PAGE_TMDSA, 0x21), SW_OFFSETCAL_EN = PAGE_ADDR(PAGE_TMDSA, 0x22), OFFSETCAL_RES = PAGE_ADDR(PAGE_TMDSA, 0x23),
  GAIN_CFG1 = PAGE_ADDR(PAGE_TMDSA, 0x28), GAIN_CFG2 = PAGE_ADDR(PAGE_TMDSA, 0x29), GAIN_CFG3 = PAGE_ADDR(PAGE_TMDSA, 0x2A), GAIN_CH0 = PAGE_ADDR(PAGE_TMDSA, 0x2B),
  GAIN_CH1 = PAGE_ADDR(PAGE_TMDSA, 0x2C), GAIN_CH2 = PAGE_ADDR(PAGE_TMDSA, 0x2D), ACTIVITY = PAGE_ADDR(PAGE_TMDSA, 0x2E), GAIN_TEMPKICK = PAGE_ADDR(PAGE_TMDSA, 0x2F),
  GAIN_OVR_EN = PAGE_ADDR(PAGE_TMDSA, 0x30), GAIN_CH0_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x31), GAIN_CH1_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x32), GAIN_CH2_OVRD = PAGE_ADDR(PAGE_TMDSA, 0x33),
  SW_GAINCAL_EN = PAGE_ADDR(PAGE_TMDSA, 0x34), GAINCAL_RES = PAGE_ADDR(PAGE_TMDSA, 0x35), PLL_RSV = PAGE_ADDR(PAGE_TMDSA, 0x38), PLL_PFD_OVR = PAGE_ADDR(PAGE_TMDSA, 0x39),
  PLL_LOCKFILTER = PAGE_ADDR(PAGE_TMDSA, 0x3A), PLL_IPCP = PAGE_ADDR(PAGE_TMDSA, 0x3B), PLL_TMDS_CTRL = PAGE_ADDR(PAGE_TMDSA, 0x3C), PLL_SEL_PHS = PAGE_ADDR(PAGE_TMDSA, 0x3D),
  PLL_STATUS = PAGE_ADDR(PAGE_TMDSA, 0x3E), ASU_STATE_CTRL = PAGE_ADDR(PAGE_TMDSA, 0x40), ASU_STATE_READ = PAGE_ADDR(PAGE_TMDSA, 0x41), ASU_EQ_CALTIME = PAGE_ADDR(PAGE_TMDSA, 0x42),
  ASU_NO_WAIT_ACT = PAGE_ADDR(PAGE_TMDSA, 0x43), ASU_USE_PLL = PAGE_ADDR(PAGE_TMDSA, 0x44), EQ_REFTIM_SLOWx4 = PAGE_ADDR(PAGE_TMDSA, 0x45), EQ_REFTIM_MSB = PAGE_ADDR(PAGE_TMDSA, 0x46),
  EQ_REFTIM_LSB = PAGE_ADDR(PAGE_TMDSA, 0x47), MODE_TX_EN = PAGE_ADDR(PAGE_TMDSA, 0x5A), FREEZE_EN = PAGE_ADDR(PAGE_TMDSA, 0x5B), MODE_DIG_EN = PAGE_ADDR(PAGE_TMDSA, 0x5C),
  TRM_INV_CMP = PAGE_ADDR(PAGE_TMDSA, 0x60), TRM_OVR = PAGE_ADDR(PAGE_TMDSA, 0x61), TRM_SW_CAL_EN = PAGE_ADDR(PAGE_TMDSA, 0x62), TRM_STATUS = PAGE_ADDR(PAGE_TMDSA, 0x63),
  CAL_RES_SEL_CH = PAGE_ADDR(PAGE_TMDSA, 0x68), RESULT_OFFSETCNT_MSB = PAGE_ADDR(PAGE_TMDSA, 0x69), RESULT_OFFSETCNT_LSB = PAGE_ADDR(PAGE_TMDSA, 0x6A), RESULT_STDDEV_MSB = PAGE_ADDR(PAGE_TMDSA, 0x6B),
  RESULT_STDDEV_LSB = PAGE_ADDR(PAGE_TMDSA, 0x6C), RESULT_EDGECOUNT_PH0_MSB = PAGE_ADDR(PAGE_TMDSA, 0x6D), RESULT_EDGECOUNT_PH0_LSB = PAGE_ADDR(PAGE_TMDSA, 0x6E), RESULT_EDGECOUNT_PH1_MSB = PAGE_ADDR(PAGE_TMDSA, 0x6F),
  RESULT_EDGECOUNT_PH1_LSB = PAGE_ADDR(PAGE_TMDSA, 0x70), RESULT_EDGECOUNT_PH2_MSB = PAGE_ADDR(PAGE_TMDSA, 0x71), RESULT_EDGECOUNT_PH2_LSB = PAGE_ADDR(PAGE_TMDSA, 0x72), RESULT_EDGECOUNT_PH3_MSB = PAGE_ADDR(PAGE_TMDSA, 0x73),
  RESULT_EDGECOUNT_PH3_LSB = PAGE_ADDR(PAGE_TMDSA, 0x74), RESULT_EDGECOUNT_PH4_MSB = PAGE_ADDR(PAGE_TMDSA, 0x75), RESULT_EDGECOUNT_PH4_LSB = PAGE_ADDR(PAGE_TMDSA, 0x76), RESULT_EDGECOUNT_PH5_MSB = PAGE_ADDR(PAGE_TMDSA, 0x77),
  RESULT_EDGECOUNT_PH5_LSB = PAGE_ADDR(PAGE_TMDSA, 0x78), RESULT_HISTOGRAM0_MSB = PAGE_ADDR(PAGE_TMDSA, 0x79), RESULT_HISTOGRAM0_LSB = PAGE_ADDR(PAGE_TMDSA, 0x7A), RESULT_HISTOGRAM1_MSB = PAGE_ADDR(PAGE_TMDSA, 0x7B),
  RESULT_HISTOGRAM1_LSB = PAGE_ADDR(PAGE_TMDSA, 0x7C), RESULT_HISTOGRAM2_MSB = PAGE_ADDR(PAGE_TMDSA, 0x7D), RESULT_HISTOGRAM2_LSB = PAGE_ADDR(PAGE_TMDSA, 0x7E), RESULT_HISTOGRAM3_MSB = PAGE_ADDR(PAGE_TMDSA, 0x7F),
  RESULT_HISTOGRAM3_LSB = PAGE_ADDR(PAGE_TMDSA, 0x80), RESULT_HISTOGRAM4_MSB = PAGE_ADDR(PAGE_TMDSA, 0x81), RESULT_HISTOGRAM4_LSB = PAGE_ADDR(PAGE_TMDSA, 0x82), RESULT_HISTOGRAM5_MSB = PAGE_ADDR(PAGE_TMDSA, 0x83),
  RESULT_HISTOGRAM5_LSB = PAGE_ADDR(PAGE_TMDSA, 0x84), RESULT_HISTOGRAM6_MSB = PAGE_ADDR(PAGE_TMDSA, 0x85), RESULT_HISTOGRAM6_LSB = PAGE_ADDR(PAGE_TMDSA, 0x86), RESULT_HISTOGRAM7_MSB = PAGE_ADDR(PAGE_TMDSA, 0x87),
  RESULT_HISTOGRAM7_LSB = PAGE_ADDR(PAGE_TMDSA, 0x88), DEBUG_TYPE = PAGE_ADDR(PAGE_TMDSA, 0x90), DEBUG_CTRL = PAGE_ADDR(PAGE_TMDSA, 0x91), DEBUG_NB_WORD = PAGE_ADDR(PAGE_TMDSA, 0x92),
  DEBUG_TMDS_CLK_MSB = PAGE_ADDR(PAGE_TMDSA, 0x93), DEBUG_TMDS_CLK_LSB = PAGE_ADDR(PAGE_TMDSA, 0x94), DEBUG_TMDS_WORD_MSB = PAGE_ADDR(PAGE_TMDSA, 0x95), DEBUG_TMDS_LSB_MSB = PAGE_ADDR(PAGE_TMDSA, 0x96),
  DEBUG_MUX_SW_ENA = PAGE_ADDR(PAGE_TMDSA, 0x97), PON_OVR_EN = PAGE_ADDR(PAGE_TMDSA, 0xA0), PON_CBIAS = PAGE_ADDR(PAGE_TMDSA, 0xA1), PON_RESCAL = PAGE_ADDR(PAGE_TMDSA, 0xA2),
  PON_RES = PAGE_ADDR(PAGE_TMDSA, 0xA3), PON_CLK = PAGE_ADDR(PAGE_TMDSA, 0xA4), PON_PLL = PAGE_ADDR(PAGE_TMDSA, 0xA5), PON_EQ = PAGE_ADDR(PAGE_TMDSA, 0xA6),
  PON_DES = PAGE_ADDR(PAGE_TMDSA, 0xA7), PON_OUT = PAGE_ADDR(PAGE_TMDSA, 0xA8), PON_MUX = PAGE_ADDR(PAGE_TMDSA, 0xA9), EQ_CALIBRATION = PAGE_ADDR(PAGE_TMDSA, 0xAA),
  BIST_CTRL1 = PAGE_ADDR(PAGE_TMDSA, 0xB0), BIST_CTRL2 = PAGE_ADDR(PAGE_TMDSA, 0xB1), BIST_CTRL3 = PAGE_ADDR(PAGE_TMDSA, 0xB2), BIST_TCB_REG_TIMOUT = PAGE_ADDR(PAGE_TMDSA, 0xB3),
  BIST_CORREL_RESULT_MSB = PAGE_ADDR(PAGE_TMDSA, 0xB4), BIST_CORREL_RESULT_LSB = PAGE_ADDR(PAGE_TMDSA, 0xB5), BIST_CORREL_LENGTH3 = PAGE_ADDR(PAGE_TMDSA, 0xB6), BIST_CORREL_LENGTH2 = PAGE_ADDR(PAGE_TMDSA, 0xB7),
  BIST_CORREL_LENGTH1 = PAGE_ADDR(PAGE_TMDSA, 0xB8), BIST_CORREL_LENGTH0 = PAGE_ADDR(PAGE_TMDSA, 0xB9), BIST_GAIN_CH0 = PAGE_ADDR(PAGE_TMDSA, 0xBA), BIST_GAIN_CH1 = PAGE_ADDR(PAGE_TMDSA, 0xBB),
  BIST_GAIN_CH2 = PAGE_ADDR(PAGE_TMDSA, 0xBC), BIST_STATUS = PAGE_ADDR(PAGE_TMDSA, 0xBD), IRQ_SET_TOP = PAGE_ADDR(PAGE_TMDSA, 0xC0), IRQ_SET_SUS = PAGE_ADDR(PAGE_TMDSA, 0xC1),
  IRQ_SET_DDC = PAGE_ADDR(PAGE_TMDSA, 0xC2), IRQ_SET_RATE = PAGE_ADDR(PAGE_TMDSA, 0xC3), IRQ_SET_MODE = PAGE_ADDR(PAGE_TMDSA, 0xC4), IRQ_SET_INFO = PAGE_ADDR(PAGE_TMDSA, 0xC5),
  IRQ_SET_AUDIO = PAGE_ADDR(PAGE_TMDSA, 0xC6), IRQ_SET_HDCP = PAGE_ADDR(PAGE_TMDSA, 0xC7), IRQ_SET_AFE = PAGE_ADDR(PAGE_TMDSA, 0xC8), AUDIO_LAYOUT = PAGE_ADDR(PAGE_TMDSA, 0xD0),
  SEL_RD_VAL = PAGE_ADDR(PAGE_TMDSA, 0xD1), FRAME_START_WIDTH = PAGE_ADDR(PAGE_TMDSA, 0xD2), DELTA_WR_RD_PNTR = PAGE_ADDR(PAGE_TMDSA, 0xD3), BCH_DECODER = PAGE_ADDR(PAGE_TMDSA, 0xD4),
  TX_BUFFER_CFG = PAGE_ADDR(PAGE_TMDSA, 0xF6), MODE_RECOVER_CFG1 = PAGE_ADDR(PAGE_TMDSA, 0xF8), MODE_RECOVER_CFG2 = PAGE_ADDR(PAGE_TMDSA, 0xF9), MODE_RECOVER_STATUS = PAGE_ADDR(PAGE_TMDSA, 0xFA),
  DEEP_COLOR_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x00), DEEP_COLOR_MAN = PAGE_ADDR(PAGE_TMDSB, 0x01), DEEP_COLOR_GCP = PAGE_ADDR(PAGE_TMDSB, 0x02), IVS_SEL = PAGE_ADDR(PAGE_TMDSB, 0x03),
  CGU_DEBUG_INV = PAGE_ADDR(PAGE_TMDSB, 0x04), CGU_DEBUG_SEL = PAGE_ADDR(PAGE_TMDSB, 0x05), X_OUTPUTS = PAGE_ADDR(PAGE_TMDSB, 0x06), VP_DEBUG = PAGE_ADDR(PAGE_TMDSB, 0x07),
  DEEP_COLOR_CLK_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x08), DC_PAT0_MSB = PAGE_ADDR(PAGE_TMDSB, 0x09), DC_PAT1_MSB = PAGE_ADDR(PAGE_TMDSB, 0x0A), DC_PAT2_MSB = PAGE_ADDR(PAGE_TMDSB, 0x0B),
  DC_PAT3_MSB = PAGE_ADDR(PAGE_TMDSB, 0x0C), DC_PAT4_MSB = PAGE_ADDR(PAGE_TMDSB, 0x0D), DC_PAT3210_LSB = PAGE_ADDR(PAGE_TMDSB, 0x0E), DEEP_COLOR_PAT_MAN = PAGE_ADDR(PAGE_TMDSB, 0x0F),
  HDCP_DDC_ADDR = PAGE_ADDR(PAGE_TMDSB, 0x10), HDCP_BKSV4 = PAGE_ADDR(PAGE_TMDSB, 0x11), HDCP_BKSV3 = PAGE_ADDR(PAGE_TMDSB, 0x12), HDCP_BKSV2 = PAGE_ADDR(PAGE_TMDSB, 0x13),
  HDCP_BKSV1 = PAGE_ADDR(PAGE_TMDSB, 0x14), HDCP_BKSV0 = PAGE_ADDR(PAGE_TMDSB, 0x15), HDCP_KIDX = PAGE_ADDR(PAGE_TMDSB, 0x16), HDCP_KEY6 = PAGE_ADDR(PAGE_TMDSB, 0x17),
  HDCP_KEY5 = PAGE_ADDR(PAGE_TMDSB, 0x18), HDCP_KEY4 = PAGE_ADDR(PAGE_TMDSB, 0x19), HDCP_KEY3 = PAGE_ADDR(PAGE_TMDSB, 0x1A), HDCP_KEY2 = PAGE_ADDR(PAGE_TMDSB, 0x1B),
  HDCP_KEY1 = PAGE_ADDR(PAGE_TMDSB, 0x1C), HDCP_KEY0 = PAGE_ADDR(PAGE_TMDSB, 0x1D), HMTP_T_RESET = PAGE_ADDR(PAGE_TMDSB, 0x60), HMTP_T_ADDRESS_SETUP = PAGE_ADDR(PAGE_TMDSB, 0x61),
  HMTP_T_ADDRESS_HOLD = PAGE_ADDR(PAGE_TMDSB, 0x62), HMTP_T_READ_ENABLE = PAGE_ADDR(PAGE_TMDSB, 0x63), HMTP_T_WRITE_ENABLE = PAGE_ADDR(PAGE_TMDSB, 0x64), HMTP_T_INITIALIZATION = PAGE_ADDR(PAGE_TMDSB, 0x65),
  HMTP_T_ERASE_PRG_PROGRESS = PAGE_ADDR(PAGE_TMDSB, 0x66), HMTP_T_DISCHARGE = PAGE_ADDR(PAGE_TMDSB, 0x67), HDCP_SRAM_REGS = PAGE_ADDR(PAGE_TMDSB, 0x68), HDCP_DMA_CONF = PAGE_ADDR(PAGE_TMDSB, 0x69),
  HMTP_ECC_REGISTERS = PAGE_ADDR(PAGE_TMDSB, 0x6A), HMTP_ERR_ADDR = PAGE_ADDR(PAGE_TMDSB, 0x6B), HDCP_MTP_TEST = PAGE_ADDR(PAGE_TMDSB, 0x6C), HMTP_PARAM = PAGE_ADDR(PAGE_TMDSB, 0x6D),
  HDCP_DE_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x70), HDCP_EP_FILT_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x71), HDCP_EP_REM_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x72), HDCP_EP_READ = PAGE_ADDR(PAGE_TMDSB, 0x73),
  HDCP_PA_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x74), HDCP_PA_READ = PAGE_ADDR(PAGE_TMDSB, 0x75), HDCP_MISC = PAGE_ADDR(PAGE_TMDSB, 0x76), HDMI_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x77),
  HDMI_POL = PAGE_ADDR(PAGE_TMDSB, 0x78), HDCP_MODE_RECOVERY = PAGE_ADDR(PAGE_TMDSB, 0x79), HMTP_CTRL = PAGE_ADDR(PAGE_TMDSB, 0x7A), HMTP_ADDRESS = PAGE_ADDR(PAGE_TMDSB, 0x7B),
  EMTP_T_RESET = PAGE_ADDR(PAGE_TMDSB, 0x80), EMTP_T_ADDRESS_SETUP = PAGE_ADDR(PAGE_TMDSB, 0x81), EMTP_T_ADDRESS_HOLD = PAGE_ADDR(PAGE_TMDSB, 0x82), EMTP_T_READ_ENABLE = PAGE_ADDR(PAGE_TMDSB, 0x83),
  EMTP_T_WRITE_ENABLE = PAGE_ADDR(PAGE_TMDSB, 0x84), EMTP_T_INITIALIZATION = PAGE_ADDR(PAGE_TMDSB, 0x85), EMTP_T_ERASE_PRG_PROG = PAGE_ADDR(PAGE_TMDSB, 0x86), EMTP_T_DISCHARGE = PAGE_ADDR(PAGE_TMDSB, 0x87),
  DDC_HIDDEN0_REGISTER = PAGE_ADDR(PAGE_TMDSB, 0x90), DDC_HIDDEN1_REGISTER = PAGE_ADDR(PAGE_TMDSB, 0x91), DDC_DMA_CONF = PAGE_ADDR(PAGE_TMDSB, 0x92), EMTP_ECC_CONF = PAGE_ADDR(PAGE_TMDSB, 0x93),
  EMTP_ERR_ADDR = PAGE_ADDR(PAGE_TMDSB, 0x94), HDCP_ACK_TIMER = PAGE_ADDR(PAGE_TMDSB, 0x96), HDCP_NOACK_TIMER = PAGE_ADDR(PAGE_TMDSB, 0x97), EMTP_PARAM = PAGE_ADDR(PAGE_TMDSB, 0x98),
  DDC_MTP_VANALOG = PAGE_ADDR(PAGE_TMDSB, 0x99), DDC_MTP_TEST = PAGE_ADDR(PAGE_TMDSB, 0x9A), DDC_MST_CTRL = PAGE_ADDR(PAGE_TMDSB, 0xA0), DDC_MST_CLK_DIV = PAGE_ADDR(PAGE_TMDSB, 0xA1),
  DDC_MST_CLK_DIV_FOR_MST = PAGE_ADDR(PAGE_TMDSB, 0xA2), DDC_LINK_SEL = PAGE_ADDR(PAGE_TMDSB, 0xA3), DDC_STATUS = PAGE_ADDR(PAGE_TMDSB, 0xA4), CLOCK_CTRL = PAGE_ADDR(PAGE_TMDSB, 0xA5),
  MONITOR_OFFSET_CH0_AB = PAGE_ADDR(PAGE_TMDSB, 0xC0), MONITOR_OFFSET_CH1_AB = PAGE_ADDR(PAGE_TMDSB, 0xC1), MONITOR_OFFSET_CH2_AB = PAGE_ADDR(PAGE_TMDSB, 0xC2), MONITOR_GAIN_CH0_AB = PAGE_ADDR(PAGE_TMDSB, 0xC3),
  MONITOR_GAIN_CH1_AB = PAGE_ADDR(PAGE_TMDSB, 0xC4), MONITOR_GAIN_CH2_AB = PAGE_ADDR(PAGE_TMDSB, 0xC5), SUS_CTRL = PAGE_ADDR(PAGE_TMDSB, 0xC6), SUS_CTRL2 = PAGE_ADDR(PAGE_TMDSB, 0xC7),
  RESET_REFTIM_MSB = PAGE_ADDR(PAGE_TMDSB, 0xC8), RESET_REFTIM_LSB = PAGE_ADDR(PAGE_TMDSB, 0xC9), TIMER_RT = PAGE_ADDR(PAGE_TMDSB, 0xCA), TIMER_A_MSB = PAGE_ADDR(PAGE_TMDSB, 0xCB),
  TIMER_B_MSB = PAGE_ADDR(PAGE_TMDSB, 0xCC), TIMER_C_MSB = PAGE_ADDR(PAGE_TMDSB, 0xCD), TIMER_ABC_LSB = PAGE_ADDR(PAGE_TMDSB, 0xCE), TIMER_D = PAGE_ADDR(PAGE_TMDSB, 0xCF),
  SUS_SET_CAL0 = PAGE_ADDR(PAGE_TMDSB, 0xD0), SUS_SET_CAL1 = PAGE_ADDR(PAGE_TMDSB, 0xD1), SUS_SET_CAL2 = PAGE_ADDR(PAGE_TMDSB, 0xD2), SUS_SET_CAL3 = PAGE_ADDR(PAGE_TMDSB, 0xD3),
  SUS_SET_CAL4 = PAGE_ADDR(PAGE_TMDSB, 0xD4), SUS_SET_CAL5 = PAGE_ADDR(PAGE_TMDSB, 0xD5), SUS_SET_CAL6 = PAGE_ADDR(PAGE_TMDSB, 0xD6), SUS_SET_CAL7 = PAGE_ADDR(PAGE_TMDSB, 0xD7),
  SUS_SET_CAL8 = PAGE_ADDR(PAGE_TMDSB, 0xD8), SUS_SET_HDMI0 = PAGE_ADDR(PAGE_TMDSB, 0xD9), SUS_SET_HDMI1 = PAGE_ADDR(PAGE_TMDSB, 0xDA), SUS_SET_HDMI2 = PAGE_ADDR(PAGE_TMDSB, 0xDB),
  SUS_SET_HDMI3 = PAGE_ADDR(PAGE_TMDSB, 0xDC), SUS_SET_HDMI4 = PAGE_ADDR(PAGE_TMDSB, 0xDD), SUS_SET_HDMI5 = PAGE_ADDR(PAGE_TMDSB, 0xDE), SUS_SET_HDMI6 = PAGE_ADDR(PAGE_TMDSB, 0xDF),
  SUS_SET_HDMI7 = PAGE_ADDR(PAGE_TMDSB, 0xE0), SUS_SET_RGB0 = PAGE_ADDR(PAGE_TMDSB, 0xE1), SUS_SET_RGB1 = PAGE_ADDR(PAGE_TMDSB, 0xE2), SUS_SET_RGB2 = PAGE_ADDR(PAGE_TMDSB, 0xE3),
  SUS_SET_RGB3 = PAGE_ADDR(PAGE_TMDSB, 0xE4), SUS_SET_RGB4 = PAGE_ADDR(PAGE_TMDSB, 0xE5), MAN_SUS_CAL_SEL = PAGE_ADDR(PAGE_TMDSB, 0xE6), MAN_CAL_SET = PAGE_ADDR(PAGE_TMDSB, 0xE7),
  MAN_SUS_HDMI_SEL = PAGE_ADDR(PAGE_TMDSB, 0xE8), MAN_HDMI_SET = PAGE_ADDR(PAGE_TMDSB, 0xE9), MAN_SUS_RGB_SEL = PAGE_ADDR(PAGE_TMDSB, 0xEA), MAN_RGB_SET = PAGE_ADDR(PAGE_TMDSB, 0xEB),
  TIMER_ENCODED = PAGE_ADDR(PAGE_TMDSB, 0xEC), RATE_REFTIM_MSB = PAGE_ADDR(PAGE_TMDSB, 0xED), RATE_REFTIM_LSB = PAGE_ADDR(PAGE_TMDSB, 0xEE), SUS_CLOCK_GOOD = PAGE_ADDR(PAGE_TMDSB, 0xEF),
  SUS_FREQ_DIGITAL_MSB = PAGE_ADDR(PAGE_TMDSB, 0xF0), SUS_FREQ_DIGITAL_ISB = PAGE_ADDR(PAGE_TMDSB, 0xF1), SUS_FREQ_DIGITAL_LSB = PAGE_ADDR(PAGE_TMDSB, 0xF2), SUS_GAIN_LIM = PAGE_ADDR(PAGE_TMDSB, 0xF3),
  SOFT_AFC_CTRL = PAGE_ADDR(PAGE_14, 0x00), SOFT_AFC_LSB = PAGE_ADDR(PAGE_14, 0x01), FIFO_LATENCY_CTRL = PAGE_ADDR(PAGE_14, 0x02), FIFO_LATENCY_VALUE = PAGE_ADDR(PAGE_14, 0x03),
  FIFO_CTRL_COEFF0 = PAGE_ADDR(PAGE_14, 0x04), FIFO_CTRL_COEFF1 = PAGE_ADDR(PAGE_14, 0x05), FIFO_CTRL_COEFF2 = PAGE_ADDR(PAGE_14, 0x06), AFC_ODPRX_MSB = PAGE_ADDR(PAGE_14, 0x07),
  AFC_ODPRX_LSB = PAGE_ADDR(PAGE_14, 0x08), DPRX_MIN = PAGE_ADDR(PAGE_14, 0x09), DPRX_MAX = PAGE_ADDR(PAGE_14, 0x0A), DPRX_LSB_MIN_MAX = PAGE_ADDR(PAGE_14, 0x0B),
  FIFO_LATENCY_VALUE_RD = PAGE_ADDR(PAGE_14, 0x0C), FIFO_CTRL_COEFF0_RD = PAGE_ADDR(PAGE_14, 0x0D), FIFO_CTRL_COEFF1_RD = PAGE_ADDR(PAGE_14, 0x0E), FIFO_CTRL_COEFF2_RD = PAGE_ADDR(PAGE_14, 0x0F),
  AUDIO_PWR_CTRL = PAGE_ADDR(PAGE_14, 0x10), AUDIO_CLOCK_MODE = PAGE_ADDR(PAGE_14, 0x11), AUDIO_HSPLL_CTRL = PAGE_ADDR(PAGE_14, 0x12), TEST_NCTS_CTRL = PAGE_ADDR(PAGE_14, 0x15),
  TEST_CTS_CHECKED_MSB = PAGE_ADDR(PAGE_14, 0x1A), TEST_CTS_CHECKED_ISB = PAGE_ADDR(PAGE_14, 0x1B), TEST_CTS_CHECKED_LSB = PAGE_ADDR(PAGE_14, 0x1C), TEST_N_CHECKED_MSB = PAGE_ADDR(PAGE_14, 0x1D),
  TEST_N_CHECKED_ISB = PAGE_ADDR(PAGE_14, 0x1E), TEST_N_CHECKED_LSB = PAGE_ADDR(PAGE_14, 0x1F), TEST_NCTS_CHECKED_VALID = PAGE_ADDR(PAGE_14, 0x20), TEST_FDET_QUOTIENT_MSB = PAGE_ADDR(PAGE_14, 0x24),
  TEST_FDET_QUOTIENT_LSB = PAGE_ADDR(PAGE_14, 0x25), TEST_AUDIO_FREQ = PAGE_ADDR(PAGE_14, 0x26), TEST_Q_DIV_SYNC = PAGE_ADDR(PAGE_14, 0x2C), TEST_R_DIV_SYNC_MSB = PAGE_ADDR(PAGE_14, 0x2D),
  TEST_R_DIV_SYNC_NSB = PAGE_ADDR(PAGE_14, 0x2E), TEST_R_DIV_SYNC_ISB = PAGE_ADDR(PAGE_14, 0x2F), TEST_R_DIV_SYNC_LSB = PAGE_ADDR(PAGE_14, 0x30), TEST_N_DIV_SYNC_MSB = PAGE_ADDR(PAGE_14, 0x31),
  TEST_N_DIV_SYNC_NSB = PAGE_ADDR(PAGE_14, 0x32), TEST_N_DIV_SYNC_ISB = PAGE_ADDR(PAGE_14, 0x33), TEST_N_DIV_SYNC_LSB = PAGE_ADDR(PAGE_14, 0x34), TEST_MODE = PAGE_ADDR(PAGE_14, 0x37),
  NCTS_CHECKED_VALID_OUT = PAGE_ADDR(PAGE_14, 0x3D), CTS_CHECKED_MSB_OUT = PAGE_ADDR(PAGE_14, 0x3E), CTS_CHECKED_ISB_OUT = PAGE_ADDR(PAGE_14, 0x3F), CTS_CHECKED_LSB_OUT = PAGE_ADDR(PAGE_14, 0x40),
  N_CHECKED_MSB_OUT = PAGE_ADDR(PAGE_14, 0x41), N_CHECKED_ISB_OUT = PAGE_ADDR(PAGE_14, 0x42), N_CHECKED_LSB_OUT = PAGE_ADDR(PAGE_14, 0x43), FDET_QUOTIENT_MSB_OUT = PAGE_ADDR(PAGE_14, 0x47),
  FDET_QUOTIENT_LSB_OUT = PAGE_ADDR(PAGE_14, 0x48), FDET_REMAIN_MSB_OUT = PAGE_ADDR(PAGE_14, 0x4A), FDET_REMAIN_ISB_OUT = PAGE_ADDR(PAGE_14, 0x4B), FDET_REMAIN_LSB_OUT = PAGE_ADDR(PAGE_14, 0x4C),
  AUDIO_STATUS = PAGE_ADDR(PAGE_14, 0x4D), Q_DIV_SYNC_OUT = PAGE_ADDR(PAGE_14, 0x51), R_DIV_SYNC_MSB = PAGE_ADDR(PAGE_14, 0x52), R_DIV_SYNC_NSB = PAGE_ADDR(PAGE_14, 0x53),
  R_DIV_SYNC_ISB = PAGE_ADDR(PAGE_14, 0x54), R_DIV_SYNC_LSB = PAGE_ADDR(PAGE_14, 0x55), N_DIV_SYNC_MSB = PAGE_ADDR(PAGE_14, 0x56), N_DIV_SYNC_NSB = PAGE_ADDR(PAGE_14, 0x57),
  N_DIV_SYNC_ISB = PAGE_ADDR(PAGE_14, 0x58), N_DIV_SYNC_LSB = PAGE_ADDR(PAGE_14, 0x59), AUDIO_PLL_STATUS = PAGE_ADDR(PAGE_14, 0x5A), CTS_MSB = PAGE_ADDR(PAGE_14, 0x5F),
  CTS_ISB = PAGE_ADDR(PAGE_14, 0x60), CTS_LSB = PAGE_ADDR(PAGE_14, 0x61), N_MSB = PAGE_ADDR(PAGE_14, 0x62), N_ISB = PAGE_ADDR(PAGE_14, 0x63),
  N_LSB = PAGE_ADDR(PAGE_14, 0x64), EDID_IN_BYTE0 = PAGE_ADDR(PAGE_EDIDA, 0x00), EDID_IN_CHECKSUM0 = PAGE_ADDR(PAGE_EDIDA, 0x7F), EDID_IN_VERSION = PAGE_ADDR(PAGE_EDIDA, 0x80),
  EDID_ENABLE = PAGE_ADDR(PAGE_EDIDA, 0x81), EDID_BLOCK_SELECT = PAGE_ADDR(PAGE_EDIDA, 0x82), HPD_POWER = PAGE_ADDR(PAGE_EDIDA, 0x84), HPD_AUTO_CTRL = PAGE_ADDR(PAGE_EDIDA, 0x85),
  HPD_DURATION = PAGE_ADDR(PAGE_EDIDA, 0x86), RX_HPD_HEAC = PAGE_ADDR(PAGE_EDIDA, 0x87), EDID_BLOCK0_TEST1 = PAGE_ADDR(PAGE_EDIDA, 0x8D), EDID_BLOCK0_TEST2 = PAGE_ADDR(PAGE_EDIDA, 0x8E),
  EDID_BLOCK0_TEST3 = PAGE_ADDR(PAGE_EDIDA, 0x8F), EDID_IN_BYTE128 = PAGE_ADDR(PAGE_EDIDB, 0x00), EDID_IN_CHECKSUM1 = PAGE_ADDR(PAGE_EDIDB, 0x7F), EDID_IN_SPA_SUB = PAGE_ADDR(PAGE_EDIDB, 0x80),
  EDID_IN_SPA_AB_A = PAGE_ADDR(PAGE_EDIDB, 0x81), EDID_IN_SPA_CD_A = PAGE_ADDR(PAGE_EDIDB, 0x82), EDID_IN_CHECKSUM_A = PAGE_ADDR(PAGE_EDIDB, 0x83), EDID_IN_SPA_AB_B = PAGE_ADDR(PAGE_EDIDB, 0x84),
  EDID_IN_SPA_CD_B = PAGE_ADDR(PAGE_EDIDB, 0x85), EDID_IN_CHECKSUM_B = PAGE_ADDR(PAGE_EDIDB, 0x86), EDID_BLOCK1_TEST1 = PAGE_ADDR(PAGE_EDIDB, 0x8D), EDID_BLOCK1_TEST2 = PAGE_ADDR(PAGE_EDIDB, 0x8E),
  EDID_BLOCK1_TEST3 = PAGE_ADDR(PAGE_EDIDB, 0x8F), RT_AUTO_CTRL = PAGE_ADDR(PAGE_CMTP, 0x00), EQ_MAN_CTRL0 = PAGE_ADDR(PAGE_CMTP, 0x01), EQ_MAN_CTRL1 = PAGE_ADDR(PAGE_CMTP, 0x02),
  OUTPUT_CFG = PAGE_ADDR(PAGE_CMTP, 0x03), MUTE_CTRL = PAGE_ADDR(PAGE_CMTP, 0x04), SLAVE_ADDR = PAGE_ADDR(PAGE_CMTP, 0x05), CMTP_REG6 = PAGE_ADDR(PAGE_CMTP, 0x06),
  CMTP_REG2F = PAGE_ADDR(PAGE_CMTP, 0x2F), CMTP_RESET = PAGE_ADDR(PAGE_CMTP, 0x33), CMTP_ADDRESS_SETUP = PAGE_ADDR(PAGE_CMTP, 0x34), CMTP_ADDRESS_HOLD = PAGE_ADDR(PAGE_CMTP, 0x35),
  CMTP_READ_ENABLE = PAGE_ADDR(PAGE_CMTP, 0x36), CMTP_WRITE_ENABLE = PAGE_ADDR(PAGE_CMTP, 0x37), CMTP_INITIALIZATION = PAGE_ADDR(PAGE_CMTP, 0x38), CMTP_ERASE_PGM_PROGRESS = PAGE_ADDR(PAGE_CMTP, 0x39),
  CMTP_DISCHARGE = PAGE_ADDR(PAGE_CMTP, 0x3A), CMTP_VANALOG = PAGE_ADDR(PAGE_CMTP, 0x3B), CMTP_TEST = PAGE_ADDR(PAGE_CMTP, 0x3C), CMTP_MEM_REGS = PAGE_ADDR(PAGE_CMTP, 0x40),
  CMTP_DMA_CONF = PAGE_ADDR(PAGE_CMTP, 0x41), CMTP_ECC_REGISTERS = PAGE_ADDR(PAGE_CMTP, 0x42), CMTP_ERR_ADDR = PAGE_ADDR(PAGE_CMTP, 0x43), CMTP_PARAM = PAGE_ADDR(PAGE_CMTP, 0x44),
  MTP_SEED_INDEX = PAGE_ADDR(PAGE_MTPA, 0x00), MTP_KEY_SPARE = PAGE_ADDR(PAGE_MTPA, 0x01), MTP_KEY39_LSB = PAGE_ADDR(PAGE_MTPA, 0x02), MTP_BKSV4 = PAGE_ADDR(PAGE_MTPA, 0x03),
  MTP_BKSV3 = PAGE_ADDR(PAGE_MTPA, 0x04), MTP_BKSV2 = PAGE_ADDR(PAGE_MTPA, 0x05), MTP_BKSV1 = PAGE_ADDR(PAGE_MTPA, 0x06), MTP_BKSV0 = PAGE_ADDR(PAGE_MTPA, 0x07),
  MTP_KEY0_MSB = PAGE_ADDR(PAGE_MTPA, 0x08), MTP_KEY0_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x09), MTP_KEY0_LSB = PAGE_ADDR(PAGE_MTPA, 0x0E), MTP_KEY1_MSB = PAGE_ADDR(PAGE_MTPA, 0x0F),
  MTP_KEY1_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x10), MTP_KEY1_LSB = PAGE_ADDR(PAGE_MTPA, 0x15), MTP_KEY2_MSB = PAGE_ADDR(PAGE_MTPA, 0x16), MTP_KEY2_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x17),
  MTP_KEY2_LSB = PAGE_ADDR(PAGE_MTPA, 0x1C), MTP_KEY3_MSB = PAGE_ADDR(PAGE_MTPA, 0x1D), MTP_KEY3_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x1E), MTP_KEY3_LSB = PAGE_ADDR(PAGE_MTPA, 0x23),
  MTP_KEY4_MSB = PAGE_ADDR(PAGE_MTPA, 0x24), MTP_KEY4_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x25), MTP_KEY4_LSB = PAGE_ADDR(PAGE_MTPA, 0x2A), MTP_KEY5_MSB = PAGE_ADDR(PAGE_MTPA, 0x2B),
  MTP_KEY5_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x2C), MTP_KEY5_LSB = PAGE_ADDR(PAGE_MTPA, 0x31), MTP_KEY6_MSB = PAGE_ADDR(PAGE_MTPA, 0x32), MTP_KEY6_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x33),
  MTP_KEY6_LSB = PAGE_ADDR(PAGE_MTPA, 0x38), MTP_KEY7_MSB = PAGE_ADDR(PAGE_MTPA, 0x39), MTP_KEY7_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x3A), MTP_KEY7_LSB = PAGE_ADDR(PAGE_MTPA, 0x3F),
  MTP_KEY8_MSB = PAGE_ADDR(PAGE_MTPA, 0x40), MTP_KEY8_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x41), MTP_KEY8_LSB = PAGE_ADDR(PAGE_MTPA, 0x46), MTP_KEY9_MSB = PAGE_ADDR(PAGE_MTPA, 0x47),
  MTP_KEY9_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x48), MTP_KEY9_LSB = PAGE_ADDR(PAGE_MTPA, 0x4D), MTP_KEY10_MSB = PAGE_ADDR(PAGE_MTPA, 0x4E), MTP_KEY10_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x4F),
  MTP_KEY10_LSB = PAGE_ADDR(PAGE_MTPA, 0x54), MTP_KEY11_MSB = PAGE_ADDR(PAGE_MTPA, 0x55), MTP_KEY11_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x56), MTP_KEY11_LSB = PAGE_ADDR(PAGE_MTPA, 0x5B),
  MTP_KEY12_MSB = PAGE_ADDR(PAGE_MTPA, 0x5C), MTP_KEY12_ISB1 = PAGE_ADDR(PAGE_MTPA, 0x5D), MTP_KEY12_LSB = PAGE_ADDR(PAGE_MTPB, 0x02), MTP_KEY13_MSB = PAGE_ADDR(PAGE_MTPB, 0x03),
  MTP_KEY13_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x04), MTP_KEY13_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x05), MTP_KEY13_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x06), MTP_KEY13_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x07),
  MTP_KEY13_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x08), MTP_KEY13_LSB = PAGE_ADDR(PAGE_MTPB, 0x09), MTP_KEY14_MSB = PAGE_ADDR(PAGE_MTPB, 0x0A), MTP_KEY14_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x0B),
  MTP_KEY14_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x0C), MTP_KEY14_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x0D), MTP_KEY14_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x0E), MTP_KEY14_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x0F),
  MTP_KEY14_LSB = PAGE_ADDR(PAGE_MTPB, 0x10), MTP_KEY15_MSB = PAGE_ADDR(PAGE_MTPB, 0x11), MTP_KEY15_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x12), MTP_KEY15_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x13),
  MTP_KEY15_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x14), MTP_KEY15_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x15), MTP_KEY15_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x16), MTP_KEY15_LSB = PAGE_ADDR(PAGE_MTPB, 0x17),
  MTP_KEY16_MSB = PAGE_ADDR(PAGE_MTPB, 0x18), MTP_KEY16_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x19), MTP_KEY16_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x1A), MTP_KEY16_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x1B),
  MTP_KEY16_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x1C), MTP_KEY16_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x1D), MTP_KEY16_LSB = PAGE_ADDR(PAGE_MTPB, 0x1E), MTP_KEY17_MSB = PAGE_ADDR(PAGE_MTPB, 0x1F),
  MTP_KEY17_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x20), MTP_KEY17_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x21), MTP_KEY17_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x22), MTP_KEY17_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x23),
  MTP_KEY17_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x24), MTP_KEY17_LSB = PAGE_ADDR(PAGE_MTPB, 0x25), MTP_KEY18_MSB = PAGE_ADDR(PAGE_MTPB, 0x26), MTP_KEY18_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x27),
  MTP_KEY18_ISB2 = PAGE_ADDR(PAGE_MTPB, 0x28), MTP_KEY18_ISB3 = PAGE_ADDR(PAGE_MTPB, 0x29), MTP_KEY18_ISB4 = PAGE_ADDR(PAGE_MTPB, 0x2A), MTP_KEY18_ISB5 = PAGE_ADDR(PAGE_MTPB, 0x2B),
  MTP_KEY18_LSB = PAGE_ADDR(PAGE_MTPB, 0x2C), MTP_KEY19_MSB = PAGE_ADDR(PAGE_MTPB, 0x2D), MTP_KEY19_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x2E), MTP_KEY19_LSB = PAGE_ADDR(PAGE_MTPB, 0x33),
  MTP_KEY20_MSB = PAGE_ADDR(PAGE_MTPB, 0x34), MTP_KEY20_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x35), MTP_KEY20_LSB = PAGE_ADDR(PAGE_MTPB, 0x3A), MTP_KEY21_MSB = PAGE_ADDR(PAGE_MTPB, 0x3B),
  MTP_KEY21_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x3C), MTP_KEY21_LSB = PAGE_ADDR(PAGE_MTPB, 0x41), MTP_KEY22_MSB = PAGE_ADDR(PAGE_MTPB, 0x42), MTP_KEY22_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x43),
  MTP_KEY22_LSB = PAGE_ADDR(PAGE_MTPB, 0x48), MTP_KEY23_MSB = PAGE_ADDR(PAGE_MTPB, 0x49), MTP_KEY23_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x4A), MTP_KEY23_LSB = PAGE_ADDR(PAGE_MTPB, 0x4F),
  MTP_KEY24_MSB = PAGE_ADDR(PAGE_MTPB, 0x50), MTP_KEY24_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x51), MTP_KEY24_LSB = PAGE_ADDR(PAGE_MTPB, 0x56), MTP_KEY25_MSB = PAGE_ADDR(PAGE_MTPB, 0x57),
  MTP_KEY25_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x58), MTP_KEY25_LSB = PAGE_ADDR(PAGE_MTPB, 0x5D), MTP_KEY26_MSB = PAGE_ADDR(PAGE_MTPB, 0x5E), MTP_KEY26_ISB1 = PAGE_ADDR(PAGE_MTPB, 0x5F),
  MTP_KEY26_LSB = PAGE_ADDR(PAGE_MTPC, 0x04), MTP_KEY27_MSB = PAGE_ADDR(PAGE_MTPC, 0x05), MTP_KEY27_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x06), MTP_KEY27_ISB2 = PAGE_ADDR(PAGE_MTPC, 0x07),
  MTP_KEY27_ISB3 = PAGE_ADDR(PAGE_MTPC, 0x08), MTP_KEY27_ISB4 = PAGE_ADDR(PAGE_MTPC, 0x09), MTP_KEY27_ISB5 = PAGE_ADDR(PAGE_MTPC, 0x0A), MTP_KEY27_LSB = PAGE_ADDR(PAGE_MTPC, 0x0B),
  MTP_KEY28_MSB = PAGE_ADDR(PAGE_MTPC, 0x0C), MTP_KEY28_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x0D), MTP_KEY28_ISB2 = PAGE_ADDR(PAGE_MTPC, 0x0E), MTP_KEY28_ISB3 = PAGE_ADDR(PAGE_MTPC, 0x0F),
  MTP_KEY28_ISB4 = PAGE_ADDR(PAGE_MTPC, 0x10), MTP_KEY28_ISB5 = PAGE_ADDR(PAGE_MTPC, 0x11), MTP_KEY28_LSB = PAGE_ADDR(PAGE_MTPC, 0x12), MTP_KEY29_MSB = PAGE_ADDR(PAGE_MTPC, 0x13),
  MTP_KEY29_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x14), MTP_KEY29_ISB2 = PAGE_ADDR(PAGE_MTPC, 0x15), MTP_KEY29_ISB3 = PAGE_ADDR(PAGE_MTPC, 0x16), MTP_KEY29_ISB4 = PAGE_ADDR(PAGE_MTPC, 0x17),
  MTP_KEY29_ISB5 = PAGE_ADDR(PAGE_MTPC, 0x18), MTP_KEY29_LSB = PAGE_ADDR(PAGE_MTPC, 0x19), MTP_KEY30_MSB = PAGE_ADDR(PAGE_MTPC, 0x1A), MTP_KEY30_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x1B),
  MTP_KEY30_LSB = PAGE_ADDR(PAGE_MTPC, 0x20), MTP_KEY31_MSB = PAGE_ADDR(PAGE_MTPC, 0x21), MTP_KEY31_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x22), MTP_KEY31_LSB = PAGE_ADDR(PAGE_MTPC, 0x27),
  MTP_KEY32_MSB = PAGE_ADDR(PAGE_MTPC, 0x28), MTP_KEY32_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x29), MTP_KEY32_LSB = PAGE_ADDR(PAGE_MTPC, 0x2E), MTP_KEY33_MSB = PAGE_ADDR(PAGE_MTPC, 0x2F),
  MTP_KEY33_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x30), MTP_KEY33_LSB = PAGE_ADDR(PAGE_MTPC, 0x35), MTP_KEY34_MSB = PAGE_ADDR(PAGE_MTPC, 0x36), MTP_KEY34_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x37),
  MTP_KEY34_LSB = PAGE_ADDR(PAGE_MTPC, 0x3C), MTP_KEY35_MSB = PAGE_ADDR(PAGE_MTPC, 0x3D), MTP_KEY35_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x3E), MTP_KEY35_LSB = PAGE_ADDR(PAGE_MTPC, 0x43),
  MTP_KEY36_MSB = PAGE_ADDR(PAGE_MTPC, 0x44), MTP_KEY36_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x45), MTP_KEY36_LSB = PAGE_ADDR(PAGE_MTPC, 0x4A), MTP_KEY37_MSB = PAGE_ADDR(PAGE_MTPC, 0x4B),
  MTP_KEY37_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x4C), MTP_KEY37_LSB = PAGE_ADDR(PAGE_MTPC, 0x51), MTP_KEY38_MSB = PAGE_ADDR(PAGE_MTPC, 0x52), MTP_KEY38_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x53),
  MTP_KEY38_LSB = PAGE_ADDR(PAGE_MTPC, 0x58), MTP_KEY39_MSB = PAGE_ADDR(PAGE_MTPC, 0x59), MTP_KEY39_ISB1 = PAGE_ADDR(PAGE_MTPC, 0x5A), MTP_PRIVATE_AREA = PAGE_ADDR(PAGE_MTPC, 0x5F),
  CURPAGE = PAGE_ADDR(PAGE_INVALID, 0xFF)
}
 
enum  cec_reg {
  APRCSR = 0x00, CER = 0x01, CVR = 0x02, CCR = 0x03,
  ACKH = 0x04, ACKL = 0x05, CCONR = 0x06, CDR0 = 0x07,
  CDR1 = 0x08, CDR2 = 0x09, CDR3 = 0x0A, CDR4 = 0x0B,
  CDR5 = 0x0C, CDR6 = 0x0D, CDR7 = 0x0E, CDR8 = 0x0F,
  CDR9 = 0x10, CDR10 = 0x11, CDR11 = 0x12, CDR12 = 0x13,
  CDR13 = 0x14, CDR14 = 0x15, CDR15 = 0x16, CDR16 = 0x17,
  CDR17 = 0x18, CDR18 = 0x19, I2C_HIGH_SPEED = 0xF0, XTAL_CTRL = 0xF1,
  RESET_CTRL = 0xF2, CFG_CLK_CTRL = 0xF3, PWR_CONTROL = 0xF4, OSC_DIVIDER = 0xF5,
  OSC_PERIOD_LSB = 0xF6, OSC_PERIOD_MSB = 0xF7, EN_OSC_PERIOD_LSB = 0xF8, EN_OSC_PERIOD_MSB = 0xF9,
  STATUS_RX_SENSE = 0xFA, INTERRUPT = 0xFC, ENABLE_INTERRUPT = 0xFD, EN_RX_SENSE = 0xFE,
  CONTROL = 0xFF
}
 
enum  info_type {
  INFOFRAME_TYPE_NONE = 0x00, INFOFRAME_TYPE_VENDOR = 0x81, INFOFRAME_TYPE_AVI = 0x82, INFOFRAME_TYPE_SPD = 0x83,
  INFOFRAME_TYPE_AUDIO = 0x84, INFOFRAME_TYPE_MPS = 0x85
}
 
enum  info_spd_src {
  INFOFRAME_SPD_UNKNOWN = 0x00, INFOFRAME_SPD_DIGSTB = 0x01, INFOFRAME_SPD_DVD = 0x02, INFOFRAME_SPD_DVHS = 0x03,
  INFOFRAME_SPD_HDDVR = 0x04, INFOFRAME_SPD_DVC = 0x05, INFOFRAME_SPD_DSC = 0x06, INFOFRAME_SPD_VIDEOCD = 0x07,
  INFOFRAME_SPD_GAME = 0x08, INFOFRAME_SPD_PC = 0x09, INFOFRAME_SPD_BLURAY = 0x0A, INFOFRAME_SPD_SACD = 0x0B,
  INFOFRAME_SPD_HDDVD = 0x0C, INFOFRAME_SPD_PMP = 0x0D
}
 

Functions

static int tda1997x_write (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t len, uint8_t *data)
 Write Data. More...
 
static int tda1997x_read (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t len, uint8_t *data)
 Read Data. More...
 
static int read_reg (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t *data)
 Read Register. More...
 
static int write_reg (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t data)
 Write Register. More...
 
static int write_reg_mask (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t mask, uint8_t val)
 Register Mask Write Write a specified value with specified mask bits to a register. More...
 
static int tda1997x_cec_write (struct tda1997x_dev *dev, enum cec_reg reg, uint8_t len, uint8_t *data)
 CEC Write Data. More...
 
static int tda1997x_cec_read (struct tda1997x_dev *dev, enum cec_reg reg, uint8_t len, uint8_t *data)
 CEC Read Data. More...
 
static int cec_write_reg (struct tda1997x_dev *dev, enum cec_reg reg, uint8_t data)
 CEC Write Register. More...
 
static int cec_read_reg (struct tda1997x_dev *dev, enum cec_reg reg, uint8_t *data)
 CEC Read Register. More...
 
static int cec_write_reg_mask (struct tda1997x_dev *dev, enum cec_reg reg, uint8_t mask, uint8_t val)
 CEC Register Mask Write Write a specified value with specified mask bits to a register. More...
 
static int tda1997x_clear_irq (struct tda1997x_dev *dev, enum hdmi_reg reg, uint8_t *val)
 Clear Interrupt Register. More...
 
static int tda1997x_soft_rst (struct tda1997x_dev *dev, uint8_t rst)
 Software Reset. More...
 
static int tda1997x_info_rst (struct tda1997x_dev *dev, uint8_t rst)
 Infoframe Reset. More...
 
static int tda1997x_sus_en (struct tda1997x_dev *dev, uint8_t en)
 Enable Startup Sequence. More...
 
int tda1997x_cfg_vp (struct tda1997x_dev *dev, uint8_t *vp_conf)
 Configure Video Port. More...
 
int tda1997x_cfg_conv (struct tda1997x_dev *dev, int16_t *mtx)
 Configure Colorspace Conversion. More...
 
int tda1997x_cfg_vid_out (struct tda1997x_dev *dev)
 Configure Video Output Format. More...
 
int tda1997x_cfg_prefilter (struct tda1997x_dev *dev, enum tda1997x_filters_ctrl_prefil bu, enum tda1997x_filters_ctrl_prefil rv)
 Configure Prefilter. More...
 
int tda1997x_cfg_audio_fmt (struct tda1997x_dev *dev)
 Configure Audio Format. More...
 
int tda1997x_cfg_audio_mode (struct tda1997x_dev *dev, enum tda1997x_audio_sel_mode mode)
 Configure Audio Selection. More...
 
int tda1997x_get_audio_flags (struct tda1997x_dev *dev, uint8_t *status)
 Get Audio Status. More...
 
int tda1997x_get_audio_freq (struct tda1997x_dev *dev, enum tda1997x_audio_freq *freq)
 Get Audio Frequency. More...
 
int tda1997x_get_chan_status (struct tda1997x_dev *dev)
 Get Audio Channel Status. More...
 
static int tda1997x_audio_fifo_rst (struct tda1997x_dev *dev)
 Reset Audio FIFO. More...
 
static int tda1997x_edid_cksum (struct tda1997x_dev *dev, uint8_t *edid, uint8_t *cksum)
 Calculate EDID Block Checksum. More...
 
int tda1997x_cfg_edid (struct tda1997x_dev *dev, uint8_t *edid, uint8_t *edid_ext)
 Configure EDID. More...
 
static int tda1997x_cfg_spa (struct tda1997x_dev *dev, uint8_t *edid1, uint8_t offset, uint16_t *spa)
 Configure Source Physical Address. More...
 
static int tda1997x_read_infoframe (struct tda1997x_dev *dev, enum hdmi_reg reg, union tda1997x_infoframe *info)
 Read Infoframe. More...
 
int tda1997x_parse_infoframe (struct tda1997x_dev *dev, union tda1997x_infoframe *info)
 Parse Infoframe. More...
 
int tda1997x_parse_aud_infoframe (struct tda1997x_dev *dev, struct tda1997x_info_aud *info)
 Parse Audio Infoframe. More...
 
int tda1997x_print_infoframe (struct tda1997x_dev *dev)
 Print Infoframe. More...
 
int tda1997x_get_timing (struct tda1997x_dev *dev, uint8_t *data)
 Get Timing Values Sets an data memory block to the video timing register values. More...
 
int tda1997x_init (struct tda1997x_dev *dev, struct tda1997x_cfg *cfg, uint8_t *edid_block, uint8_t *edid_ext)
 Initialize TDA1997x HDMI Receiver. More...
 
static int tda1997x_sus_irq (struct tda1997x_dev *dev, uint8_t flags)
 Startup Sequence Interrupt Handler. More...
 
static int tda1997x_infoframe_irq (struct tda1997x_dev *dev, uint8_t flags)
 Parse Infoframe. More...
 
int tda1997x_audio_irq (struct tda1997x_dev *dev, uint8_t flags)
 Audio Interrupt Handler. More...
 
int tda1997x_afe_irq (struct tda1997x_dev *dev, uint8_t flags)
 AFE Interrupt Handler. More...
 
int tda1997x_handle_irq (struct tda1997x_dev *dev)
 Handle TDA1997x Interrupt. More...
 
int tda1997x_interrupt (struct tda1997x_dev *dev, struct tda1997x_irq_source *tab)
 

Variables

static uint8_t vp_conf444 [9]
 
static uint8_t vp_conf_mute [9]
 
static const uint8_t blank_rgb [6]
 
static const uint8_t blank_yuv [6]
 
static const int16_t color_conv444 [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t yuv709_rgb_full [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t yuv601_rgb_full [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t rgb_lim_rgb_full [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t rgb_lim_itu601 [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t rgb_lim_itu709 [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t rgb_full_itu601 [COLOR_CONV_MATRIX_LENGTH]
 
static const int16_t rgb_full_itu709 [COLOR_CONV_MATRIX_LENGTH]
 
static const uint8_t clk_rate [6]
 
const struct tda1997x_mtp_seed hdcp_seed_tab [TDA1997X_SEED_TABLE_LEN]
 
static uint8_t ddc_config [8]
 
static uint8_t rt_config [6]
 
static uint16_t spa_edid [2]
 

Detailed Description

TDA1997x HDMI Receiver FreeBSD.

Author
R. Bush bush@.nosp@m.krtk.nosp@m.l.com
Version
v1.0
Date
2017 September 14 Copyright (c) 2017, krtkl inc. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of the FreeBSD Project.