/************************************************************************* $Archive: /PACS/OnBoard/m_smcstr.c $ $Revision: 1.10 $ $Date: 2009/04/23 13:51:12 $ $Author: amazy $ $Log: m_smcstr.c,v $ Revision 1.10 2009/04/23 13:51:12 amazy 6.029 * * 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_smcstr * 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 the transmission/reception 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_hwmap.h" #include "l_errcod.h" #include "m_smcsge.h" #include "m_smcstr.h" /***************************************************************************** PRIVATE CONSTANTS *****************************************************************************/ /***************************************************************************** PRIVATE TYPES *****************************************************************************/ /***************************************************************************** PRIVATE VARIABLES *****************************************************************************/ /***************************************************************************** DECLARATION OF PRIVATE FUNCTIONS *****************************************************************************/ /***************************************************************************** IMPLEMENTATION OF FUNCTIONS *****************************************************************************/ /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_StartChannelAsMaster * * DESCRIPTION * Start selected channel as master * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine addresses for specified channel of CHx_DSM_CMDR and CHx_DSM_STAR * Start sending NULL tokens through specified channel * Clear CHx_DSM_STAR by reading it (this is done to ensure that state read later * is the actual current state) * Check if NULLs received (connection established), if so then * return OK (=connected) * else * return error (NOT_CONNECTED) *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_StartChannelAsMaster(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; T_UNSIGNED_32 CHx_DSM_STARDummyValue; /* 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); /* Start sending NULL tokens */ DSMCS_WriteBitInSMCSReg(CHx_DSM_CMDRRegisterAddress, K_BPOS_CHx_DSM_CMDR_STARTTXNODE,K_HIGH); /* Clear CHx_DSM_STAR by reading it */ DSMCS_ReadSMCSReg(CHx_DSM_STARRegisterAddress,&CHx_DSM_STARDummyValue); /* Check if NULLs have been received */ IsNULLReceived=DSMCS_CheckBitInSMCSReg(CHx_DSM_STARRegisterAddress, K_BPOS_CHx_DSM_STAR_NULLRECEIVED); if (IsNULLReceived!=K_TRUE) { StatusReturn=K_SR_ERROR_SMCS_LINKNOTCONNECTED; } return(StatusReturn); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_StartChannelAsSlave * * DESCRIPTION * Start selected channel as slave * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * StatusReturn = OK * Determine addresses for specified channel of CHx_DSM_CMDR and CHx_DSM_STAR * Clear CHx_DSM_STAR by reading it (this is done to ensure that state read later * is the actual current state) * Read status of Nulls received in CHx_DSM_STAR * Check if NULL tokens have been received, if so then * Start sending NULL tokens through specified channel * else * StatusReturn = error (NOT_CONNECTED) * return StatusReturn *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_StartChannelAsSlave(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; T_UNSIGNED_32 CHx_DSM_STARDummyValue; /* 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); /* Clear CHx_DSM_STAR by reading it */ DSMCS_ReadSMCSReg(CHx_DSM_STARRegisterAddress,&CHx_DSM_STARDummyValue); /* Check if NULLs have been received */ IsNULLReceived=DSMCS_CheckBitInSMCSReg(CHx_DSM_STARRegisterAddress, K_BPOS_CHx_DSM_STAR_NULLRECEIVED); if (IsNULLReceived==K_TRUE) { /* Start sending NULL tokens */ DSMCS_WriteBitInSMCSReg(CHx_DSM_CMDRRegisterAddress, K_BPOS_CHx_DSM_CMDR_STARTTXNODE,K_HIGH); } else { /* NULLs not received */ StatusReturn=K_SR_ERROR_SMCS_LINKNOTCONNECTED; } return(StatusReturn); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_TransmitBuffer * * DESCRIPTION * Transmit buffer through selected channel, specifying End of Packet type * * INPUT ARGUMENTS: * Channel * End of Packet (EOP) type to be attached by SMCS to the end of the packet * Start address of buffer to be transmitted * Length of buffer * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine addresses for specified channel of CHx_COMICFG, CHx_TX_SAR, * and CHx_TX_EAR Registers * Calculate packet end address * Select the specified EOP in CHx_COMICFG * Write Start address into CHx_TX_SAR * Write End address into CHx_TX_EAR * Return OK * * Note: CHx_TX_SAR and CHx_TX_EAR are 16bit wide, so only the * "offset" within the comm memory will be written into the register, * although the start address parameter is a full 32bit address. *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_TransmitBuffer(T_UNSIGNED_32 Channel, T_UNSIGNED_32 EndOfPacketType, T_UNSIGNED_32 PacketStartAddress, T_UNSIGNED_32 PacketLength) { T_UNSIGNED_32 CHx_COMICFGRegisterAddress=0; T_UNSIGNED_32 CHx_TX_SARRegisterAddress=0; T_UNSIGNED_32 CHx_TX_EARRegisterAddress=0; T_UNSIGNED_32 PacketEndAddress; /* Determine register addresses depending on selected channel */ CHx_COMICFGRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_COMICFG); CHx_TX_SARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_TX_SAR); CHx_TX_EARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_TX_EAR); /* Calculate packet end address */ PacketEndAddress=PacketStartAddress+(PacketLength-1); /* Select the EOP to be sent in COMICFG register */ if(EndOfPacketType==K_EOP1) { DSMCS_WriteBitInSMCSReg(CHx_COMICFGRegisterAddress, K_BPOS_CHx_COMICFG_EOPID,K_LOW); } else { /* EOP2 */ DSMCS_WriteBitInSMCSReg(CHx_COMICFGRegisterAddress, K_BPOS_CHx_COMICFG_EOPID,K_HIGH); } /* Send Packet */ DSMCS_WriteSMCSReg(CHx_TX_SARRegisterAddress,PacketStartAddress); DSMCS_WriteSMCSReg(CHx_TX_EARRegisterAddress,PacketEndAddress); return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_ReceiveBuffer * * DESCRIPTION * Command SMCS to receive buffer through selected channel, in specified address * * INPUT ARGUMENTS: * Channel * Start address where buffer is to be stored * Length of buffer * * OUTPUT ARGUMENTS: * None * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine addresses for specified channel of CHx_RX_SAR and CHx_RX_EAR * Calculate packet end address * Write Start address into CHx_RX_SAR * Write End address into CHx_RX_EAR * Return OK * * Note: CHx_RX_SAR and CHx_RX_EAR are 16bit wide, so only the * "offset" within the comm memory will be written into the register, * although the start address parameter is a full 32bit address. *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_ReceiveBuffer(T_UNSIGNED_32 Channel, T_UNSIGNED_32 PacketStartAddress, T_UNSIGNED_32 PacketLength) { T_UNSIGNED_32 CHx_RX_SARRegisterAddress=0; T_UNSIGNED_32 CHx_RX_EARRegisterAddress=0; T_UNSIGNED_32 PacketEndAddress; /* Determine register addresses depending on selected channel */ CHx_RX_SARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_RX_SAR); CHx_RX_EARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_RX_EAR); /* Calculate packet end address */ PacketEndAddress=PacketStartAddress+(PacketLength-1); /* Receive Packet */ DSMCS_WriteSMCSReg(CHx_RX_SARRegisterAddress,PacketStartAddress); DSMCS_WriteSMCSReg(CHx_RX_EARRegisterAddress,PacketEndAddress); return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_GetCurrentTxAddress * * DESCRIPTION * Get current value of Tx addres generator for selected channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * Tx current address * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_TX_CAR * Determine base address of SMCS comm memory, depending on channel * Read CHx_TX_CAR and add value to SMCS comm memory base address, to * obtain a full 32bit address * Return OK * * Note: CHx_TX_CAR is 16bit wide, so when it is read, only the * "offset" within the comm memory will be retrieved. *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_GetCurrentTxAddress(T_UNSIGNED_32 Channel, T_UNSIGNED_32 *TxCurrentAddress) { T_UNSIGNED_32 CHx_TX_CARRegisterAddress=0; T_UNSIGNED_32 CHx_TX_CARRegisterValue=0; T_UNSIGNED_32 SMCSCommMemoryBaseAddress=0; /* Determine register address depending on selected channel */ CHx_TX_CARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_TX_CAR); /* Determine base address of comm memory */ if ((Channel==K_SMCSCHANNEL_1)||(Channel==K_SMCSCHANNEL_2) ||(Channel==K_SMCSCHANNEL_3)) { /* SMCS chip is 1 */ SMCSCommMemoryBaseAddress=K_DMADDR_BASE_SMCS1DPRAM; } else { /* SMCS chip is 2 */ SMCSCommMemoryBaseAddress=K_DMADDR_BASE_SMCS2DPRAM; } /* Read CHx_TX_CAR Register and OR with SMCS comm memory base address */ DSMCS_ReadSMCSReg(CHx_TX_CARRegisterAddress,&CHx_TX_CARRegisterValue); (*TxCurrentAddress)=CHx_TX_CARRegisterValue + SMCSCommMemoryBaseAddress; return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_GetCurrentRxAddress * * DESCRIPTION * Get current value of Rx addres generator for selected channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * Rx current address * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_RX_CAR * Determine base address of SMCS comm memory, depending on channel * Read CHx_RX_CAR and add value to SMCS comm memory base address, to * obtain a full 32bit address * Return OK * * Note: CHx_RX_CAR is 16bit wide, so when it is read, only the * "offset" within the comm memory will be retrieved. *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_GetCurrentRxAddress(T_UNSIGNED_32 Channel, T_UNSIGNED_32 *RxCurrentAddress) { T_UNSIGNED_32 CHx_RX_CARRegisterAddress=0; T_UNSIGNED_32 CHx_RX_CARRegisterValue=0; T_UNSIGNED_32 SMCSCommMemoryBaseAddress=0; /* Determine register address depending on selected channel */ CHx_RX_CARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_RX_CAR); /* Determine base address of comm memory */ if ((Channel==K_SMCSCHANNEL_1)||(Channel==K_SMCSCHANNEL_2) ||(Channel==K_SMCSCHANNEL_3)) { /* SMCS chip is 1 */ SMCSCommMemoryBaseAddress=K_DMADDR_BASE_SMCS1DPRAM; } else { /* SMCS chip is 2 */ SMCSCommMemoryBaseAddress=K_DMADDR_BASE_SMCS2DPRAM; } /* Read CHx_TX_CAR Register and OR with SMCS comm memory base address */ DSMCS_ReadSMCSReg(CHx_RX_CARRegisterAddress,&CHx_RX_CARRegisterValue); (*RxCurrentAddress)=CHx_RX_CARRegisterValue + SMCSCommMemoryBaseAddress; return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_GetChannelStatus * * DESCRIPTION * Read value of CHx_DSM_STAR register for selected channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * CHx_DSM_STAR register value * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_DSM_STAR * Read CHx_DSM_STAR and store value in output argument * Return OK *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_GetChannelStatus(T_UNSIGNED_32 Channel, T_UNSIGNED_32 *CHx_DSM_STARRegisterValue) { T_UNSIGNED_32 CHx_DSM_STARRegisterAddress=0; /* Determine register address depending on selected channel */ CHx_DSM_STARRegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_DSM_STAR); /* Read CHx_DSM_STAR */ DSMCS_ReadSMCSReg(CHx_DSM_STARRegisterAddress,CHx_DSM_STARRegisterValue); return(K_SR_OK); } /* #$# ----------------------------------------------------------------------- * FUNCTION NAME: DSMCS_GetSMCSErrorSourceReg1 * * DESCRIPTION * Read value of CHx_ESR1 register for selected channel * * INPUT ARGUMENTS: * Channel * * OUTPUT ARGUMENTS: * CHx_ESR1 register value * * RETURNED VALUE: * Status return * * PSEUDOCODE * Determine address for specified channel of CHx_ESR1 * Read CHx_ESR1 and store value in output argument * Return OK *---------------------------------------------------------------------- $#$ */ T_SR DSMCS_GetSMCSErrorSourceReg1(T_UNSIGNED_32 Channel, T_UNSIGNED_32 *CHx_ESR1RegisterValue) { T_UNSIGNED_32 CHx_ESR1RegisterAddress=0; /* Determine register address depending on selected channel */ CHx_ESR1RegisterAddress=DSMCS_GetRegAddressForChannel(Channel, K_DMADD_SMCS1_CH1_ESR1); /* Read CHx_DSM_STAR */ DSMCS_ReadSMCSReg(CHx_ESR1RegisterAddress,CHx_ESR1RegisterValue); return(K_SR_OK); }