#include <stdio.h>
#include "drivers/fpga_ip/CoreGPIO/core_gpio.h"
#include "../boards/polarfire-video-kit/miv-rv32-design/fpga_design_config/fpga_design_config.h"
#include "drivers/CoreAXI4-Lite/AXI4-Lite.h"
#include "drivers/fpga_ip/CoreUARTapb/core_uart_apb.h"
#include "drivers/fpga_ip/hdmi_config/HDMI_GLOBALS.h"
#include "drivers/fpga_ip/hdmi_config/hdmi_types.h"

gpio_instance_t g_gpio_out;
UART_instance_t g_uart;

#define LED1 GPIO_2
#define LED2 GPIO_3
#define LED3 GPIO_4
#define LED4 GPIO_5

uint32_t data_rate=0;
uint32_t scram_status=0;
uint8_t color_depth=0;
int32_t prev_hpd_tx_detect;   /* global variable */

/* Forward declarations */
void hdmi2p0tx_i2c_fun(void);
void hdmi2p0_scambler_disable(void);
void hdmi2p0_scambler_en(void);
void bridge_avi_rx_to_tx_custom(void);
uint8_t bridge_gcp_rx_to_tx(void);
void bridge_drm_rx_to_tx(void);
void hdmi_rx_debug_decode(uint32_t dbg, hdmi_rx_debug_t *d);
void bridge_avi_monitor(void);
void bridge_drm_monitor(void);
uint8_t bridge_gcp_monitor(uint8_t *color_depth);
uint32_t timer_call_function(void);
uint8_t wait_for_rx_pll_lock(void);
uint8_t wait_for_hdmi_rx_aux_ready(void);
uint8_t wait_for_hdmi_rx_video_ready(void);
uint8_t wait_for_ccc_pll_lock(void);
uint32_t wait_for_pll_lock(void);

void update_hdmi_xcvr_speed(double datarate)
{
    GPIO_set_output(&g_gpio_out,GPIO_1,0);//sync polarity normal
    double buffer = 20.0;
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110104C)=0x33;//DES_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101078)=0x3; //SER_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110204C)=0x33;//DES_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102078)=0x3; //SER_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110404C)=0x33;//DES_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104078)=0x3; //SER_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110804C)=0x33;//DES_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108078)=0x3; //SER_RSTPD
#if 1

    if (datarate >= (5940 - buffer) && datarate <= (5940 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x0000002A;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004024F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x0000002A;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000002;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000002;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00000228;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x0000002A;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004024F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x0000002A;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000002;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000002;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00000228;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x0000002A;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004024F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x0000002A;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000002;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000002;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00000228;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x0000002A;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004024F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x0000002A;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000002;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000002;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00000228;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00140008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x01000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0064;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00040320;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x08CF0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x11CA899E;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x01000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111B85;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180014;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00000000;//SPARE
    }
    else if(datarate >= (4455 - buffer) && datarate <= (4455 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x0000021E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x0000021E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x0000021E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x0000021E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x001E0008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0064;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00040320;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x099B0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0xD197CD3B;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x1E01060A;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111101;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x0018001E;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE

    }
    else if(datarate >= (2970 - buffer) && datarate <= (2970 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x15;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200c ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x15;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x1;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00002214;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x15;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100c ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x15;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x1;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00002214;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x15;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800c ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x15;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x1;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00002214;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x15;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400c ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x15;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x1;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00002214;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00140008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x01000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0032;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x08CF0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x11CA899E;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x01000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111B85;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180014;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003c ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE
        //

    }
    else if(datarate >= (3712 - buffer) && datarate <= (3712 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00000219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00000219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00000219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00000219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000070;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00190008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0064;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00040320;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x09820019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x2BFDABC5;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x00000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07110C93;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180019;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE

    }
    else if(datarate >= (2227 - buffer) && datarate <= (2227 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x0000241E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x0000241E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x0000241E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x0000241E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x001E0008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0032;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x099B0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0xD197CD3B;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x1E01060A;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111101;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x0018001E;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE

    }
    else if(datarate >= (1856 - buffer) && datarate <= (1856 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01001000;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00002219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00002219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00002219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00002219;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000071;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101491D;//DES_DFE_CAL_CTRL_1

        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00190008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0032;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x000007D0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x09820019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x2BFDABC5;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x00000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07110C93;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180019;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE
    }
    else if(datarate >= (1113 - buffer) && datarate <= (1113 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01001000;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x0000441E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x0000441E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x0000441E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x0000441E;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x001E0008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0019;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x00000FA0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x099B0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0xD197CD3B;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x1E01060A;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111101;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x0018001E;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE
    }
    else if(datarate >= (1485 - buffer) && datarate <= (1485 + buffer))
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00004414;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00004414;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00004414;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00004414;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00140008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x01000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0019;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x00000FA0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x08CF0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x11CA899E;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x01000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07111B85;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180014;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE

    }
    else if(datarate >= (928 - buffer) && datarate <= (928 + buffer))//not tested
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000003;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01001000;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x1B955701;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x0000451F;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x0000451F;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x0000451F;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x0000451F;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000073;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00190008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x02000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x00FA0019;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x00000FA0;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x09820019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x2BFDABC5;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x00000608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x07110C93;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180019;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE
    }
    else if(datarate >= (742 - buffer) && datarate <= (742 + buffer))//not tested
    {
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000100;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000800;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000020;//SSCG_REG_2
        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x00006814;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x00006814;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x00006814;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x00006814;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1
        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x00140008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x01000000;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x0104000D;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x00001F40;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x08CF0019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x1163899B;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x01010608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x0711BDC6;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x00000000;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x00180014;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE

    }

    else if(datarate >= (540 - buffer) && datarate <= (540 + buffer))//not tested
    {
        GPIO_set_output(&g_gpio_out,GPIO_1,1);//sync polarity invert
        //ccc for cdr ref clk - PLL_SW_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400008 ) = 0x00000B00;//PLL_REF_FB
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840000C ) = 0x00000000;//PLL_FRACN
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400010 ) = 0x01000900;//PLL_DIV_0_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8400024 ) = 0x00000001;//SSCG_REG_0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x840002C ) = 0x00000168;//SSCG_REG_2

        //pma lane 0
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110100C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110102C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101040 ) = 0x0000E810;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11010D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110800C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110802C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108040 ) = 0x0000E810;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11080D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110200C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110202C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102040 ) = 0x0000E810;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11020D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //pma lane 2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104008 ) = 0x00000015;//DES_CDR_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110400C ) = 0x0004014F;//DES_CDR_CTRL_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104010 ) = 0x00000015;//DES_DFEEM_CTRL_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104024 ) = 0x04000001;//DES_DFE_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110402C ) = 0x00000001;//DES_EM_CTRL_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104040 ) = 0x0000E810;//DES_RXPLL_DIV
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104074 ) = 0x00000075;//SER_CLK_CTRL
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x11040D4 ) = 0x0101481D;//DES_DFE_CAL_CTRL_1

        //Tx pll
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110010 ) = 0x001D0008;//TXPLL_DIV_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110014 ) = 0x021745D1;//TXPLL_DIV_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110018 ) = 0x0104000D;//TXPLL_JA_1
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111001c ) = 0x00001F40;//TXPLL_JA_2
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110020 ) = 0x00020190;//TXPLL_JA_3
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110024 ) = 0x09960019;//TXPLL_JA_4
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110028 ) = 0x198FC7E1;//TXPLL_JA_5
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111002c ) = 0x01010608;//TXPLL_JA_6
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110030 ) = 0x0711CD9A;//TXPLL_JA_7
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110034 ) = 0x001745D1;//TXPLL_JA_8
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1110038 ) = 0x0018001D;//TXPLL_JA_9
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x111003C ) = 0x00000000;//TXPLL_JA_10
        //
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x2110190 ) = 0x00F00000;//SPARE
    }

#endif

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1101078)=0x1;//SER_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110104C)=0x30;//DES_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1102078)=0x1;//SER_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110204C)=0x30;//DES_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1104078)=0x1;//SER_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110404C)=0x30;//DES_RSTPD

    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x1108078)=0x1;//SER_RSTPD
    *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110804C)=0x30;//DES_RSTPD

}
void update_ccc_rx_tx(uint8_t color_depth)
{
    if (color_depth == HDMI_COLOR_DEPTH_10BIT)
    {
        /* 10-bit color depth */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8040010) = 0x01000A00; /* CCC TX PLL_DIV_0_1 */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8080010) = 0x01000A00; /* CCC RX PLL_DIV_0_1 */
    }
    else if (color_depth == HDMI_COLOR_DEPTH_12BIT)
    {
        /* 12-bit color depth */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8040010) = 0x01000C00; /* CCC TX PLL_DIV_0_1 */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8080010) = 0x01000C00; /* CCC RX PLL_DIV_0_1 */
    }
    else if (color_depth == HDMI_COLOR_DEPTH_16BIT)
    {
        /* 16-bit color depth */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8040010) = 0x01001000; /* CCC TX PLL_DIV_0_1 */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8080010) = 0x01001000; /* CCC RX PLL_DIV_0_1 */
    }
    else
    {
        /* 8-bit color depth (default) */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8040010) = 0x01000800; /* CCC TX PLL_DIV_0_1 */
        *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8080010) = 0x01000800; /* CCC RX PLL_DIV_0_1 */
    }
}
void delay()
{
    for(uint32_t i=0; i<50; i++)
    {
        for(uint32_t j=0; j<50000; j++);
    }
}
void hdmi_xcvr_config(double datarate)
{
    //axi4litewrite(HDMI_RESET, 0x1);
    //delay();
    update_hdmi_xcvr_speed(datarate);
    delay();
    axi4litewrite(HDMI_RX_RESET, 0x1);
    //delay();
    //axi4litewrite(HPD_CONTROL, 0x01);
}
void GCP_Monitor()
{
    uint8_t color_depth;
   if (bridge_gcp_monitor(&color_depth))
   {
       //UART_polled_tx_string(&g_uart,
                                  //(const uint8_t *)"\r\nColor Depth is changed\r\n");
       const char *depth_str;

           switch (color_depth)
           {
               case HDMI_COLOR_DEPTH_8BIT:
                   depth_str = "8-bit";
                   break;
               case 4:  /* Also 8-bit per HDMI spec */
                   depth_str = "8-bit";
                   break;
               case HDMI_COLOR_DEPTH_10BIT:
                   depth_str = "10-bit";
                   break;
               case HDMI_COLOR_DEPTH_12BIT:
                   depth_str = "12-bit";
                   break;
               case HDMI_COLOR_DEPTH_16BIT:
                   depth_str = "16-bit";
                   break;
               default:
                   depth_str = "Unknown";
                   break;
           }

           char msg[64];
           snprintf(msg, sizeof(msg),
                    "Color Depth is %s\r\n",
                    depth_str);

       UART_polled_tx_string(&g_uart, (const uint8_t *)msg);
       update_ccc_rx_tx(color_depth);
       if (!wait_for_ccc_pll_lock())
       {
        return;
       }
       if (!wait_for_hdmi_rx_video_ready())
       {
           return;
       }
       axi4litewrite(HDMI_TX_RESET, 0x1);
       UART_polled_tx_string(&g_uart,
                       (const uint8_t *)"\r\nHDMI Tx reset released\r\n");
       delay();
   }
}
void hdmi_configuration()
{
    GPIO_set_output(&g_gpio_out, GPIO_0, 0); //HDMI_RESET
    //repeat:
    data_rate = (uint32_t)axi4literead(DATA_RATE);//data rate read from the hardware double data_rate_r;
    double data_rate_r = (double)data_rate / 10000.0; // keeps decimals with this create a function
    if(data_rate_r==0)// False data rate on power cycle
    {
       return;
    }
    scram_status    = (uint32_t)axi4literead(SCRAM_STATUS);//data rate read from the hardware
    double final_data_rate;
    uint32_t final_rate_print;
    if (scram_status == 1U)
    {
        final_data_rate = data_rate_r * 40.0;
        final_rate_print = (uint32_t)(data_rate_r * 40);

        char msg_buf[64];
        snprintf(msg_buf, sizeof(msg_buf),
                 "Datarate: %u, Scrambler Enabled by source\r\n",
                 final_rate_print);
        UART_polled_tx_string(&g_uart, (const uint8_t *)msg_buf);
    }
    else
    {
        final_data_rate = data_rate_r * 10.0;
        final_rate_print = (uint32_t)(data_rate_r * 10);

        char msg_buf[64];
        snprintf(msg_buf, sizeof(msg_buf),
                 "Datarate: %u, Scrambler Disabled by source\r\n",
                 final_rate_print);
        UART_polled_tx_string(&g_uart, (const uint8_t *)msg_buf);
    }
    hdmi_xcvr_config(final_data_rate);
#if 1
    if (!wait_for_rx_pll_lock())
    {
        //goto repeat;
        UART_polled_tx_string(&g_uart,
                               (const uint8_t *)"\r\nRx PLL is not locked\r\n");
        return;
    }
#endif
#if 1
    if (!wait_for_hdmi_rx_aux_ready())
    {
        //goto repeat;
        UART_polled_tx_string(&g_uart,
                                       (const uint8_t *)"\r\nHDMI AUX data is not ready\r\n");
        return ;
    }
#endif
    color_depth = 0;
    color_depth=bridge_gcp_rx_to_tx();
    const char *depth_str;

    switch (color_depth)
    {
        case HDMI_COLOR_DEPTH_8BIT:
            depth_str = "8-bit";
            break;
        case 4:  /* Also 8-bit per HDMI spec */
            depth_str = "8-bit";
            break;
        case HDMI_COLOR_DEPTH_10BIT:
            depth_str = "10-bit";
            break;
        case HDMI_COLOR_DEPTH_12BIT:
            depth_str = "12-bit";
            break;
        case HDMI_COLOR_DEPTH_16BIT:
            depth_str = "16-bit";
            break;
        default:
            depth_str = "Unknown";
            break;
    }

    char msg[64];
    snprintf(msg, sizeof(msg),
             "\r\nColor Depth: %s\r\n",
             depth_str);

    UART_polled_tx_string(&g_uart, (const uint8_t *) msg);
    g_last_color_depth = color_depth;
    update_ccc_rx_tx(color_depth);
    bridge_avi_rx_to_tx_custom();
    bridge_gcp_rx_to_tx();
    bridge_drm_rx_to_tx();
    if (!wait_for_ccc_pll_lock())
    {
        //goto repeat;
        UART_polled_tx_string(&g_uart,
                                      (const uint8_t *)"\r\nCCC is not Locked \r\n");
        return;
    }
    if (!wait_for_hdmi_rx_video_ready())
    {
        //goto repeat;
        UART_polled_tx_string(&g_uart,
                                               (const uint8_t *)"\r\nHDMI Video data is not ready\r\n");
        return;
    }

    if (!wait_for_pll_lock())
    {
        //goto repeat;
        UART_polled_tx_string(&g_uart,
                                               (const uint8_t *)"\r\nTX PLL is locked\r\n");
        return;
    }

    axi4litewrite(HDMI_TX_RESET, 0x1);
    UART_polled_tx_string(&g_uart,
                    (const uint8_t *)"\r\nHDMI Tx reset released\r\n");
    GPIO_set_output(&g_gpio_out, GPIO_0, 1); //HDMI RESET RELEASED
    scram_status    = (uint32_t)axi4literead(SCRAM_STATUS);//data rate read from the hardware
    if (scram_status == 1U)
    {
        hdmi2p0_scambler_en();
    }
    else
    {
        hdmi2p0_scambler_disable();
    }

}
uint32_t wait_for_pll_lock()
{
    uint32_t pll_lock_lane_0 = 0;
    uint32_t pll_lock_lane_1 = 0;
    uint32_t pll_lock_lane_2 = 0;
    uint32_t pll_lock_lane_3 = 0;
    uint32_t reg_val_0  = 0;
    uint32_t reg_val_1  = 0;
    uint32_t reg_val_2  = 0;
    uint32_t reg_val_3  = 0;
    while (1)
        {
          reg_val_0 = *(volatile uint32_t *)(HDMI_XCVR_BASE + 0x00081088); // PMA_CTRL_R0
          pll_lock_lane_0 = reg_val_0 && 0x100000000;
          reg_val_1 = *(volatile uint32_t *)(HDMI_XCVR_BASE +0x00082088); // PMA_CTRL_R0
          pll_lock_lane_1 = reg_val_1 && 0x100000000;
          reg_val_2 = *(volatile uint32_t *)(HDMI_XCVR_BASE + 0x00084088); // PMA_CTRL_R0
          pll_lock_lane_2 = reg_val_2 && 0x100000000;
          //reg_val_3 = *(volatile uint32_t *)(HDMI_XCVR_BASE + 0x108088 ); // PMA_CTRL_R0
          //pll_lock_lane_3 = reg_val_3 && 0x100000000;
        if (pll_lock_lane_0 && pll_lock_lane_1 && pll_lock_lane_2)
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nTX PLL is Locked\r\n");
            return 1;
        }
        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nTX PLL is not Locked: Timed out\r\n");
            g_ext_irq=1;
            return 0;
        }
        if(g_ext_irq==1)
        {
            return 0;
        }
        }
}
void hdmi_tx_i2c_function()
{
    static uint32_t tick_counter = 0;

    tick_counter++;
    if (tick_counter >= 1500000) // 5 sec at 50 MHz
    {
        tick_counter = 0;
        uint32_t scrambler_status       = (uint32_t)axi4literead(SCRAM_STATUS);//data rate read from the hardware
       if(scrambler_status==1u)
          {
           hdmi2p0tx_i2c_fun();
          }
    }
}
uint32_t timer_call_function(void)
{
    static uint32_t tick_timer_counter = 0;

    if (++tick_timer_counter >= 300000)
    {
        tick_timer_counter = 0;
        return 1;
    }
    return 0;
}

uint8_t wait_for_rx_pll_lock(void)
{
    while (1)
    {
        uint32_t lane0 = *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110103C);
        uint32_t lane1 = *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110203C);
        uint32_t lane2 = *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x110403C);

        uint32_t lock0 = (lane0 >> 22) & 0x1;
        uint32_t lock1 = (lane1 >> 22) & 0x1;
        uint32_t lock2 = (lane2 >> 22) & 0x1;

        //delay();

        if (lock0 && lock1 && lock2)
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nXcvr Configured: RX PLL Locked\r\n");
            return 1;
            if (timer_call_function())
            {
                UART_polled_tx_string(&g_uart,
                    (const uint8_t *)"\r\nRX PLL not locked: Timeout reached\r\n");
                g_ext_irq=1;
                return 0;
            }
        }
#if 0
        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nRX PLL not locked: Timeout reached\r\n");
            g_ext_irq=1;
            return 0;
        }
#endif
        if(g_ext_irq==1)
        {
            return 0;
        }
    }
}
uint8_t wait_for_ccc_pll_lock(void)
{
    while (1)
    {
        uint32_t CCC_TX = *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8040004);
        uint32_t CCC_RX = *(volatile unsigned int *)(HDMI_XCVR_BASE + 0x8080004);

        uint32_t ccc_tx_pll_lock = (CCC_TX >> 0) & 0x1;
        uint32_t ccc_rx_pll_lock = (CCC_RX >> 0) & 0x1;

        delay();

        if (ccc_tx_pll_lock && ccc_rx_pll_lock)
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nCCC TX, CCC RX Configured: CCC PLL Locked\r\n");
            return 1;
        }

        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nCCC PLL not locked: Timeout reached\r\n");
            g_ext_irq=1;
            return 0;
        }
        if(g_ext_irq==1)
        {
            return 0;
        }
    }
}
uint8_t wait_for_hdmi_rx_aux_ready(void)
{
    hdmi_rx_debug_t dbg;

    while (1)
    {
        uint32_t dbg_raw = axi4literead(HDMI_RX_DEBUG);
        hdmi_rx_debug_decode(dbg_raw, &dbg);

        if (dbg.hdmi_rx_aux_ready == 1)
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nHDMI Rx Aux Data is ready\r\n");
            return 1;
        }

        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nHDMI Rx Aux Data is not ready: Timed out\r\n");
            g_ext_irq=1;
            return 0;
        }
        if(g_ext_irq==1)
        {
            return 0;
        }
    }
}
uint8_t wait_for_hdmi_rx_video_ready(void)
{
    hdmi_rx_debug_t dbg;

    while (1)
    {
        uint32_t dbg_raw = axi4literead(HDMI_RX_DEBUG);
        hdmi_rx_debug_decode(dbg_raw, &dbg);
        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nHDMI Rx video is not ready: Timed out\r\n");
            g_ext_irq=1;
            return 0;
        }
        if (dbg.hdmi_rx_ready == 1)
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nHDMI Rx Video is ready\r\n");
            return 1;

        }

        delay();
#if 0
        if (timer_call_function())
        {
            UART_polled_tx_string(&g_uart,
                (const uint8_t *)"\r\nHDMI Rx video is not ready: Timed out\r\n");
            g_ext_irq=1;
            return 0;
        }
#endif
        if(g_ext_irq==1)
        {
            return 0;
        }
    }
}
void error_detection(void)
{
    hdmi_rx_debug_t dbg;
    uint32_t dbg_raw = axi4literead(HDMI_RX_DEBUG);
    hdmi_rx_debug_decode(dbg_raw, &dbg);
    if(g_ext_irq==1)
    {
        return;
    }
    if (dbg.hdmi_rx_error == 1)
    {
        UART_polled_tx_string(&g_uart,
            (const uint8_t *)"\r\nValid error Detected\r\n");
        return;
    }
}
void hpd_detection(void)
{
    uint32_t hpd_tx_detect;
    uint32_t scram_status;

    hpd_tx_detect = (uint32_t)axi4literead(HPD_TX);
    scram_status = (uint32_t)axi4literead(SCRAM_STATUS);

    /* Check if HPD status changed */
    if (hpd_tx_detect != prev_hpd_tx_detect)
    {
        prev_hpd_tx_detect = hpd_tx_detect;

        if (hpd_tx_detect == 0)
        {
            UART_polled_tx_string(&g_uart,
                    (const uint8_t *)"\r\nHDMI Tx is connected to Monitor(Sink)\r\n");
            if (scram_status == 1U)
            {
                hdmi2p0_scambler_en();
            }
            else
            {
                hdmi2p0_scambler_disable();
            }
        }
        else
        {
            UART_polled_tx_string(&g_uart,
                    (const uint8_t *)"\r\nHDMI Tx is NOT connected to Monitor\r\n");
        }
    }
}
void hdmi_monitor_tasks(void)
{
    if(timer_call_function())
    {

        GCP_Monitor();
        bridge_avi_monitor();
        bridge_drm_monitor();
        error_detection();
        hpd_detection();
    }
}

