/************************************************************************* $Archive: /PACS/OnBoard/m_smcsre.c $ $Revision: 1.10 $ $Date: 2009/04/23 13:51:12 $ $Author: amazy $ $Log: m_smcsre.c,v $ Revision 1.10 2009/04/23 13:51:12 amazy 6.029 * * 6 10/06/03 12:03 Amazy * Back from Garching SMCS chip reset debug session (see logbook for * changes) * * 5 3/25/03 3:16p Pacs Egse * included reset for MOSAIC BOARD * * 4 28/08/02 11:49 Amazy * Added the header with the history log *************************************************************************/ /***************************************************************************** * * Project name: Herschel PACS DEC-MEC * Product name: DM_LLDRV * Object name: m_smcsre * Filename: %M% * Language: C (ADSP-21020) * Compiler: G21K - r3.3 * Company: CRISA * Author: F. Torrero * Version: %I% * Creation date: 25/Mar/2002 * Last Modification date: %G% * * Description =============================================================== * * This module implements reset and stop functions for two SMCS chips * * Change log =============================================================== * * | DATE | NEW VERSION | AUTHOR | REASON FOR CHANGE | * =========================================================================== * * 25/Mar/02 1 F.Torrero Creation * * ****************************************************************************/ /***************************************************************************** INCLUDES *****************************************************************************/ #include "l_gendef.h" #include "l_errcod.h" #include "l_pscgen.h" #include "m_smcsge.h" #include "m_smcsre.h" /***************************************************************************** PRIVATE CONSTANTS *****************************************************************************/ /* Values to be written in CHx_CNTRL2 in order to reset Rx/Tx sections */ #define K_CHx_CNTRL2_RESET_TX_ON 0x1 #define K_CHx_CNTRL2_RESET_TX_OFF 0x0 #define K_CHx_CNTRL2_RESET_RX_ON 0x2 #define K_CHx_CNTRL2_RESET_RX_OFF 0x0 /***************************************************************************** PRIVATE TYPES *****************************************************************************/ /***************************************************************************** PRIVATE VARIABLES *****************************************************************************/ /***************************************************************************** DECLARATION OF PRIVATE FUNCTIONS *****************************************************************************/ /***************************************************************************** IMPLEMENTATION OF FUNCTIONS *****************************************************************************/ /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_ResetChannelTxSection * * DESCRIPTION * Reset Transmission (Tx) section of specified channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_CNTRL2 * Write the Tx section "reset-on" value into CHx_CNTRL2 register * Clear the Tx section "reset-on" value ("reset-off") into CHx_CNTRL2 * Return OK *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_ResetChannelTxSection(T_UNSIGNED_32 Channel) { T_UNSIGNED_32 CHx_CNTRL2RegisterAddress=0; /* Determine register address depending on selected channel */ CHx_CNTRL2RegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_CNTRL2); DSMCS_WriteSMCSReg(CHx_CNTRL2RegisterAddress,K_CHx_CNTRL2_RESET_TX_ON); DSMCS_WriteSMCSReg(CHx_CNTRL2RegisterAddress,K_CHx_CNTRL2_RESET_TX_OFF); return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_ResetChannelRxSection * * DESCRIPTION * Reset Reception (Rx) section of specified channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_CNTRL2 * Write the Rx section "reset-on" value into CHx_CNTRL2 register * Clear the Rx section "reset-on" value ("reset-off") into CHx_CNTRL2 * Return OK *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_ResetChannelRxSection(T_UNSIGNED_32 Channel) { T_UNSIGNED_32 CHx_CNTRL2RegisterAddress=0; /* Determine register address depending on selected channel */ CHx_CNTRL2RegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_CNTRL2); DSMCS_WriteSMCSReg(CHx_CNTRL2RegisterAddress,K_CHx_CNTRL2_RESET_RX_ON); DSMCS_WriteSMCSReg(CHx_CNTRL2RegisterAddress,K_CHx_CNTRL2_RESET_RX_OFF); return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_ResetSMCSChip * * DESCRIPTION * Perforn a HW reset of the specified SMCS chip * * INPUT ARGUMENTS: * SMCSChip * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * If SMCSChip = chip 1 * Disable GPIO line EN1_LVDSIF_SMCS1 * Disable GPIO line EN2_LVDSIF_SMCS1 * Reset SMCS1 chip by doing: * Set SMCS1_reset GPIO output to LOW * Set SMCS1_reset GPIO output to HIGH * Enable GPIO line EN1_LVDSIF_SMCS1 * Enable GPIO line EN2_LVDSIF_SMCS1 * else (SMCSchip is 2) * Disable GPIO line EN_LVDSIF_SMCS2 * Reset SMCS2 chip by doing: * Set SMCS2_reset GPIO output to LOW * Set SMCS2_reset GPIO output to HIGH * Enable GPIO line EN_LVDSIF_SMCS2 * Return OK *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_ResetSMCSChip(T_UNSIGNED_32 SMCSChip) { #ifdef CRISA_BOARD if (SMCSChip == K_SMCS_1) { /* PSC_SetGPOutput(K_GPOUTPUT_EN1LVDSIFSMCS1,K_HIGH); PSC_SetGPOutput(K_GPOUTPUT_EN2LVDSIFSMCS1,K_HIGH);*/ PSC_SetGPOutput(K_GPOUTPUT_SMCS1RESET,K_LOW); //wait 18us __asm("lcntr = 360;"); __asm(" DO wait18us1 UNTIL LCE;"); __asm("wait18us1: nop;"); PSC_SetGPOutput(K_GPOUTPUT_SMCS1RESET,K_HIGH); //wait 18us __asm("lcntr = 360;"); __asm(" DO wait18us2 UNTIL LCE;"); __asm("wait18us2: nop;"); /* PSC_SetGPOutput(K_GPOUTPUT_EN1LVDSIF,K_LOW); PSC_SetGPOutput(K_GPOUTPUT_EN2LVDSIFSMCS1,K_LOW);*/ } else { /* SMCSChip is chip 2 */ // PSC_SetGPOutput(K_GPOUTPUT_ENLVDSIFSMCS2,K_HIGH); PSC_SetGPOutput(K_GPOUTPUT_SMCS2RESET,K_LOW); //wait 18us __asm("lcntr = 360;"); __asm(" DO wait18us3 UNTIL LCE;"); __asm("wait18us3: nop;"); PSC_SetGPOutput(K_GPOUTPUT_SMCS2RESET,K_HIGH); //wait 18us __asm("lcntr = 360;"); __asm(" DO wait18us4 UNTIL LCE;"); __asm("wait18us4: nop;"); // PSC_SetGPOutput(K_GPOUTPUT_ENLVDSIFSMCS2,K_LOW); } #endif //CRISA_BOARD #ifdef MOSAIC_BOARD if (SMCSChip == K_SMCS_1) { __asm("r0 = 0x80000000;"); __asm("pm(0xFFFFFD) = r0;"); __asm("nop;"); __asm("r0 = 0x00000000;"); __asm("pm(0xFFFFFD) = r0;"); __asm("modify(i7, 1);"); } else { /* SMCSChip is chip 2 */ __asm(" dm(i7, m7) = r0;"); __asm("r0 = 0x40000000;"); __asm("pm(0xFFFFFD) = r0;"); __asm("nop;"); __asm("r0 = 0x00000000;"); __asm("pm(0xFFFFFD) = r0;"); __asm("modify(i7, 1);"); } #endif //MOSAIC_BOARD return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_StopChannel * * DESCRIPTION * Stop SMCS channel * * INPUT ARGUMENTS: * None * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * * Determine address for specified channel of CHx_DSM_STAR and CHx_DSM_CMDR * Check if NULLs have been received (CHx_DSM_STAR reg.), if so then * Stop channel setting appropriate bit in CHx_DSM_CMDR * Return OK * Else (NULLs not received) Return error (Null not received) *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_StopChannel(T_UNSIGNED_32 Channel) { T_SR StatusReturn=K_SR_OK; T_UNSIGNED_32 CHx_DSM_CMDRRegisterAddress=0; T_UNSIGNED_32 CHx_DSM_STARRegisterAddress=0; T_BOOLEAN IsNULLReceived=K_FALSE; /* Determine register addresses depending on selected channel */ CHx_DSM_CMDRRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_DSM_CMDR); CHx_DSM_STARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_DSM_STAR); /* Read CHx_DSM_STAR and check if NULL has been received */ IsNULLReceived=DSMCS_CheckBitInSMCSReg(CHx_DSM_STARRegisterAddress, K_BPOS_CHx_DSM_STAR_NULLRECEIVED); if (IsNULLReceived==K_TRUE) { /* Stop link */ DSMCS_WriteBitInSMCSReg(CHx_DSM_CMDRRegisterAddress, K_BPOS_CHx_DSM_CMDR_STOPLINK,K_HIGH); } else { /* NULLs not received */ StatusReturn=K_SR_ERROR_SMCS_NULLNOTRECEIVED; } return(StatusReturn); }