static void MhlTxDrvProcessConnection ( void ) { TX_DEBUG_PRINT (("MHL Cable Connected. CBUS:0x0A = %02X\n", (int) SiiRegRead(REG_CBUS_BUS_STATUS))); if( POWER_STATE_D0_MHL == fwPowerState ) { return; } #ifdef __KERNEL__ //HalGpioSetPin(GPIO_M2U_VBUS_CTRL,0); #else pinM2uVbusCtrlM = 0; #endif #if (SYSTEM_BOARD == SB_EPV5_MARK_II) pinMhlConn = 0; pinUsbConn = 1; #elif (SYSTEM_BOARD == SB_STARTER_KIT_X01) #ifdef __KERNEL__ //HalGpioSetPin(GPIO_MHL_USB,0); #else pinMhlUsb = 0; #endif #endif SiiRegWrite(REG_MHLTX_CTL1, 0x10); fwPowerState = POWER_STATE_D0_MHL; // change TMDS termination to 50 ohm termination(default) //bits 1:0 set to 00 SiiRegWrite(TX_PAGE_2|0x0001, 0x00); ENABLE_DISCOVERY; SiiMhlTxNotifyConnection(true); }
/////////////////////////////////////////////////////////////////////////// // // MhlTxDrvProcessConnection // /////////////////////////////////////////////////////////////////////////// static void MhlTxDrvProcessConnection (void) { TX_DEBUG_PRINT (("Drv: MHL Cable Connected. CBUS:0x0A = %02X\n", (int) SiiRegRead(TX_PAGE_CBUS | 0x000A))); if( POWER_STATE_D0_MHL == fwPowerState ) { return; } // VBUS control gpio //pinM2uVbusCtrlM = 0; //pinMhlConn = 0; //pinUsbConn = 1; // // Discovery over-ride: reg_disc_ovride // SiiRegWrite(REG_MHLTX_CTL1, 0x10); fwPowerState = POWER_STATE_D0_MHL; // // Increase DDC translation layer timer (uint8_t mode) // Setting DDC Byte Mode // SiiRegWrite(REG_CBUS_COMMON_CONFIG, 0xF2); // Enable segment pointer safety //SET_BIT(0x0C44, 1); // Un-force HPD (it was kept low, now propagate to source //CLR_BIT(REG_INT_CTRL, 4); // Enable TMDS //SiiMhlTxDrvTmdsControl( true ); // Change TMDS termination to 50 ohm termination (default) // Bits 1:0 set to 00 SiiRegWrite(TX_PAGE_2 | 0x0001, 0x00); // Keep the discovery enabled. Need RGND interrupt ENABLE_DISCOVERY // Wait T_SRC_RXSENSE_CHK ms to allow connection/disconnection to be stable (MHL 1.0 specs) // TX_DEBUG_PRINT (("[%d] Drv: Wait T_SRC_RXSENSE_CHK (%d ms) before checking RSEN\n", // (int) (HalTimerElapsed( ELAPSED_TIMER ) * MONITORING_PERIOD), // (int) T_SRC_RXSENSE_CHK) ); // // Ignore RSEN interrupt for T_SRC_RXSENSE_CHK duration. // Get the timer started // // HalTimerSet(TIMER_TO_DO_RSEN_CHK, T_SRC_RXSENSE_CHK); // Notify upper layer of cable connection SiiMhlTxNotifyConnection(mhlConnected = true); }
static void MhlTxDrvProcessDisconnection ( void ) { TX_DEBUG_PRINT(("MhlTxDrvProcessDisconnection\n")); SiiRegWrite(REG_INTR4, SiiRegRead(REG_INTR4)); dsHpdStatus &= ~BIT6; SiiRegWrite(REG_MSC_REQ_ABORT_REASON, dsHpdStatus); SiiMhlTxNotifyDsHpdChange(0); if( POWER_STATE_D0_MHL == fwPowerState ) { SiiMhlTxNotifyConnection(false); } SwitchToD3(); }
/////////////////////////////////////////////////////////////////////////// // // MhlTxDrvProcessDisconnection // /////////////////////////////////////////////////////////////////////////// static void MhlTxDrvProcessDisconnection (void) { TX_DEBUG_PRINT(("Drv: MhlTxDrvProcessDisconnection\n")); // clear all interrupts SiiRegWrite(REG_INTR4, SiiRegRead(REG_INTR4)); SiiRegWrite(REG_MHLTX_CTL1, 0xD0); dsHpdStatus &= ~BIT6; //cable disconnect implies downstream HPD low SiiRegWrite(REG_PRI_XFR_ABORT_REASON, dsHpdStatus); SiiMhlTxNotifyDsHpdChange(0); if( POWER_STATE_D0_MHL == fwPowerState ) { // Notify upper layer of cable removal SiiMhlTxNotifyConnection(false); } // Now put chip in sleep mode SwitchToD3(); }