diff options
Diffstat (limited to 'target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/twsi/mvTwsi.c')
-rw-r--r-- | target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/twsi/mvTwsi.c | 1023 |
1 files changed, 0 insertions, 1023 deletions
diff --git a/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/twsi/mvTwsi.c b/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/twsi/mvTwsi.c deleted file mode 100644 index 0bf8b75..0000000 --- a/target/linux/generic/files/crypto/ocf/kirkwood/mvHal/mv_hal/twsi/mvTwsi.c +++ /dev/null @@ -1,1023 +0,0 @@ -/******************************************************************************* -Copyright (C) Marvell International Ltd. and its affiliates - -This software file (the "File") is owned and distributed by Marvell -International Ltd. and/or its affiliates ("Marvell") under the following -alternative licensing terms. Once you have made an election to distribute the -File under one of the following license alternatives, please (i) delete this -introductory statement regarding license alternatives, (ii) delete the two -license alternatives that you have not elected to use and (iii) preserve the -Marvell copyright notice above. - -******************************************************************************** -Marvell Commercial License Option - -If you received this File from Marvell and you have entered into a commercial -license agreement (a "Commercial License") with Marvell, the File is licensed -to you under the terms of the applicable Commercial License. - -******************************************************************************** -Marvell GPL License Option - -If you received this File from Marvell, you may opt to use, redistribute and/or -modify this File in accordance with the terms and conditions of the General -Public License Version 2, June 1991 (the "GPL License"), a copy of which is -available along with the File in the license.txt file or by writing to the Free -Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or -on the worldwide web at http://www.gnu.org/licenses/gpl.txt. - -THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED -WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY -DISCLAIMED. The GPL License provides additional details about this warranty -disclaimer. -******************************************************************************** -Marvell BSD License Option - -If you received this File from Marvell, you may opt to use, redistribute and/or -modify this File under the following licensing terms. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of Marvell nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*******************************************************************************/ - - -#include "mvTwsi.h" -#include "mvTwsiSpec.h" -#include "cpu/mvCpu.h" - - -/*#define MV_DEBUG*/ -#ifdef MV_DEBUG -#define DB(x) x -#else -#define DB(x) -#endif - -static MV_VOID twsiIntFlgClr(MV_U8 chanNum); -static MV_BOOL twsiMainIntGet(MV_U8 chanNum); -static MV_VOID twsiAckBitSet(MV_U8 chanNum); -static MV_U32 twsiStsGet(MV_U8 chanNum); -static MV_VOID twsiReset(MV_U8 chanNum); -static MV_STATUS twsiAddr7BitSet(MV_U8 chanNum, MV_U32 deviceAddress,MV_TWSI_CMD command); -static MV_STATUS twsiAddr10BitSet(MV_U8 chanNum, MV_U32 deviceAddress,MV_TWSI_CMD command); -static MV_STATUS twsiDataTransmit(MV_U8 chanNum, MV_U8 *pBlock, MV_U32 blockSize); -static MV_STATUS twsiDataReceive(MV_U8 chanNum, MV_U8 *pBlock, MV_U32 blockSize); -static MV_STATUS twsiTargetOffsSet(MV_U8 chanNum, MV_U32 offset,MV_BOOL moreThen256); - - -static MV_BOOL twsiTimeoutChk(MV_U32 timeout, const MV_8 *pString) -{ - if(timeout >= TWSI_TIMEOUT_VALUE) - { - DB(mvOsPrintf("%s",pString)); - return MV_TRUE; - } - return MV_FALSE; - -} -/******************************************************************************* -* mvTwsiStartBitSet - Set start bit on the bus -* -* DESCRIPTION: -* This routine sets the start bit on the TWSI bus. -* The routine first checks for interrupt flag condition, then it sets -* the start bit in the TWSI Control register. -* If the interrupt flag condition check previously was set, the function -* will clear it. -* The function then wait for the start bit to be cleared by the HW. -* Then it waits for the interrupt flag to be set and eventually, the -* TWSI status is checked to be 0x8 or 0x10(repeated start bit). -* -* INPUT: -* chanNum - TWSI channel. -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK is start bit was set successfuly on the bus. -* MV_FAIL if interrupt flag was set before setting start bit. -* -*******************************************************************************/ -MV_STATUS mvTwsiStartBitSet(MV_U8 chanNum) -{ - MV_BOOL isIntFlag = MV_FALSE; - MV_U32 timeout, temp; - - DB(mvOsPrintf("TWSI: mvTwsiStartBitSet \n")); - /* check Int flag */ - if(twsiMainIntGet(chanNum)) - isIntFlag = MV_TRUE; - /* set start Bit */ - temp = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), temp | TWSI_CONTROL_START_BIT); - - /* in case that the int flag was set before i.e. repeated start bit */ - if(isIntFlag){ - DB(mvOsPrintf("TWSI: mvTwsiStartBitSet repeated start Bit\n")); - twsiIntFlgClr(chanNum); - } - - /* wait for interrupt */ - timeout = 0; - while(!twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: mvTwsiStartBitSet ERROR - Start Clear bit TimeOut .\n")) - return MV_TIMEOUT; - - - /* check that start bit went down */ - if((MV_REG_READ(TWSI_CONTROL_REG(chanNum)) & TWSI_CONTROL_START_BIT) != 0) - { - mvOsPrintf("TWSI: mvTwsiStartBitSet ERROR - start bit didn't went down\n"); - return MV_FAIL; - } - - /* check the status */ - temp = twsiStsGet(chanNum); - if(( temp != TWSI_START_CON_TRA ) && ( temp != TWSI_REPEATED_START_CON_TRA )) - { - mvOsPrintf("TWSI: mvTwsiStartBitSet ERROR - status %x after Set Start Bit. \n",temp); - return MV_FAIL; - } - - return MV_OK; - -} - -/******************************************************************************* -* mvTwsiStopBitSet - Set stop bit on the bus -* -* DESCRIPTION: -* This routine set the stop bit on the TWSI bus. -* The function then wait for the stop bit to be cleared by the HW. -* Finally the function checks for status of 0xF8. -* -* INPUT: -* chanNum - TWSI channel -* -* OUTPUT: -* None. -* -* RETURN: -* MV_TRUE is stop bit was set successfuly on the bus. -* -*******************************************************************************/ -MV_STATUS mvTwsiStopBitSet(MV_U8 chanNum) -{ - MV_U32 timeout, temp; - - /* Generate stop bit */ - temp = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), temp | TWSI_CONTROL_STOP_BIT); - - twsiIntFlgClr(chanNum); - - /* wait for stop bit to come down */ - timeout = 0; - while( ((MV_REG_READ(TWSI_CONTROL_REG(chanNum)) & TWSI_CONTROL_STOP_BIT) != 0) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: mvTwsiStopBitSet ERROR - Stop bit TimeOut .\n")) - return MV_TIMEOUT; - - /* check that the stop bit went down */ - if((MV_REG_READ(TWSI_CONTROL_REG(chanNum)) & TWSI_CONTROL_STOP_BIT) != 0) - { - mvOsPrintf("TWSI: mvTwsiStopBitSet ERROR - stop bit didn't went down. \n"); - return MV_FAIL; - } - - /* check the status */ - temp = twsiStsGet(chanNum); - if( temp != TWSI_NO_REL_STS_INT_FLAG_IS_KEPT_0){ - mvOsPrintf("TWSI: mvTwsiStopBitSet ERROR - status %x after Stop Bit. \n", temp); - return MV_FAIL; - } - - return MV_OK; -} - -/******************************************************************************* -* twsiMainIntGet - Get twsi bit from main Interrupt cause. -* -* DESCRIPTION: -* This routine returns the twsi interrupt flag value. -* -* INPUT: -* None. -* -* OUTPUT: -* None. -* -* RETURN: -* MV_TRUE is interrupt flag is set, MV_FALSE otherwise. -* -*******************************************************************************/ -static MV_BOOL twsiMainIntGet(MV_U8 chanNum) -{ - MV_U32 temp; - - /* get the int flag bit */ - - temp = MV_REG_READ(TWSI_CPU_MAIN_INT_CAUSE_REG); - if (temp & (TWSI0_CPU_MAIN_INT_BIT << chanNum)) - return MV_TRUE; - - return MV_FALSE; -} -/******************************************************************************* -* twsiIntFlgClr - Clear Interrupt flag. -* -* DESCRIPTION: -* This routine clears the interrupt flag. It does NOT poll the interrupt -* to make sure the clear. After clearing the interrupt, it waits for at -* least 1 miliseconds. -* -* INPUT: -* chanNum - TWSI channel -* -* OUTPUT: -* None. -* -* RETURN: -* None. -* -*******************************************************************************/ -static MV_VOID twsiIntFlgClr(MV_U8 chanNum) -{ - MV_U32 temp; - - /* wait for 1 mili to prevent TWSI register write after write problems */ - mvOsDelay(1); - /* clear the int flag bit */ - temp = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum),temp & ~(TWSI_CONTROL_INT_FLAG_SET)); - - /* wait for 1 mili sec for the clear to take effect */ - mvOsDelay(1); - - return; -} - - -/******************************************************************************* -* twsiAckBitSet - Set acknowledge bit on the bus -* -* DESCRIPTION: -* This routine set the acknowledge bit on the TWSI bus. -* -* INPUT: -* None. -* -* OUTPUT: -* None. -* -* RETURN: -* None. -* -*******************************************************************************/ -static MV_VOID twsiAckBitSet(MV_U8 chanNum) -{ - MV_U32 temp; - - /*Set the Ack bit */ - temp = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), temp | TWSI_CONTROL_ACK); - - /* Add delay of 1ms */ - mvOsDelay(1); - return; -} - - -/******************************************************************************* -* twsiInit - Initialize TWSI interface -* -* DESCRIPTION: -* This routine: -* -Reset the TWSI. -* -Initialize the TWSI clock baud rate according to given frequancy -* parameter based on Tclk frequancy and enables TWSI slave. -* -Set the ack bit. -* -Assign the TWSI slave address according to the TWSI address Type. -* -* -* INPUT: -* chanNum - TWSI channel -* frequancy - TWSI frequancy in KHz. (up to 100KHZ) -* -* OUTPUT: -* None. -* -* RETURN: -* Actual frequancy. -* -*******************************************************************************/ -MV_U32 mvTwsiInit(MV_U8 chanNum, MV_HZ frequancy, MV_U32 Tclk, MV_TWSI_ADDR *pTwsiAddr, MV_BOOL generalCallEnable) -{ - MV_U32 n,m,freq,margin,minMargin = 0xffffffff; - MV_U32 power; - MV_U32 actualFreq = 0,actualN = 0,actualM = 0,val; - - if(frequancy > 100000) - { - mvOsPrintf("Warning TWSI frequancy is too high, please use up tp 100Khz. \n"); - } - - DB(mvOsPrintf("TWSI: mvTwsiInit - Tclk = %d freq = %d\n",Tclk,frequancy)); - /* Calucalte N and M for the TWSI clock baud rate */ - for(n = 0 ; n < 8 ; n++) - { - for(m = 0 ; m < 16 ; m++) - { - power = 2 << n; /* power = 2^(n+1) */ - freq = Tclk/(10*(m+1)*power); - margin = MV_ABS(frequancy - freq); - if(margin < minMargin) - { - minMargin = margin; - actualFreq = freq; - actualN = n; - actualM = m; - } - } - } - DB(mvOsPrintf("TWSI: mvTwsiInit - actN %d actM %d actFreq %d\n",actualN , actualM, actualFreq)); - /* Reset the TWSI logic */ - twsiReset(chanNum); - - /* Set the baud rate */ - val = ((actualM<< TWSI_BAUD_RATE_M_OFFS) | actualN << TWSI_BAUD_RATE_N_OFFS); - MV_REG_WRITE(TWSI_STATUS_BAUDE_RATE_REG(chanNum),val); - - /* Enable the TWSI and slave */ - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), TWSI_CONTROL_ENA | TWSI_CONTROL_ACK); - - /* set the TWSI slave address */ - if( pTwsiAddr->type == ADDR10_BIT )/* 10 Bit deviceAddress */ - { - /* writing the 2 most significant bits of the 10 bit address*/ - val = ((pTwsiAddr->address & TWSI_SLAVE_ADDR_10BIT_MASK) >> TWSI_SLAVE_ADDR_10BIT_OFFS ); - /* bits 7:3 must be 0x11110 */ - val |= TWSI_SLAVE_ADDR_10BIT_CONST; - /* set GCE bit */ - if(generalCallEnable) - val |= TWSI_SLAVE_ADDR_GCE_ENA; - /* write slave address */ - MV_REG_WRITE(TWSI_SLAVE_ADDR_REG(chanNum),val); - - /* writing the 8 least significant bits of the 10 bit address*/ - val = (pTwsiAddr->address << TWSI_EXTENDED_SLAVE_OFFS) & TWSI_EXTENDED_SLAVE_MASK; - MV_REG_WRITE(TWSI_EXTENDED_SLAVE_ADDR_REG(chanNum), val); - } - else /*7 bit address*/ - { - /* set the 7 Bits address */ - MV_REG_WRITE(TWSI_EXTENDED_SLAVE_ADDR_REG(chanNum),0x0); - val = (pTwsiAddr->address << TWSI_SLAVE_ADDR_7BIT_OFFS) & TWSI_SLAVE_ADDR_7BIT_MASK; - MV_REG_WRITE(TWSI_SLAVE_ADDR_REG(chanNum), val); - } - - /* unmask twsi int */ - val = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), val | TWSI_CONTROL_INT_ENA); - /* Add delay of 1ms */ - mvOsDelay(1); - - return actualFreq; -} - - -/******************************************************************************* -* twsiStsGet - Get the TWSI status value. -* -* DESCRIPTION: -* This routine returns the TWSI status value. -* -* INPUT: -* chanNum - TWSI channel -* -* OUTPUT: -* None. -* -* RETURN: -* MV_U32 - the TWSI status. -* -*******************************************************************************/ -static MV_U32 twsiStsGet(MV_U8 chanNum) -{ - return MV_REG_READ(TWSI_STATUS_BAUDE_RATE_REG(chanNum)); - -} - -/******************************************************************************* -* twsiReset - Reset the TWSI. -* -* DESCRIPTION: -* Resets the TWSI logic and sets all TWSI registers to their reset values. -* -* INPUT: -* chanNum - TWSI channel -* -* OUTPUT: -* None. -* -* RETURN: -* None -* -*******************************************************************************/ -static MV_VOID twsiReset(MV_U8 chanNum) -{ - /* Reset the TWSI logic */ - MV_REG_WRITE(TWSI_SOFT_RESET_REG(chanNum),0); - - /* wait for 2 mili sec */ - mvOsDelay(2); - - return; -} - - - - -/******************************* POLICY ****************************************/ - - - -/******************************************************************************* -* mvTwsiAddrSet - Set address on TWSI bus. -* -* DESCRIPTION: -* This function Set address (7 or 10 Bit address) on the Twsi Bus. -* -* INPUT: -* chanNum - TWSI channel -* pTwsiAddr - twsi address. -* command - read / write . -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK - if setting the address completed succesfully. -* MV_FAIL otherwmise. -* -*******************************************************************************/ -MV_STATUS mvTwsiAddrSet(MV_U8 chanNum, MV_TWSI_ADDR *pTwsiAddr, MV_TWSI_CMD command) -{ - DB(mvOsPrintf("TWSI: mvTwsiAddr7BitSet addr %x , type %d, cmd is %s\n",pTwsiAddr->address,\ - pTwsiAddr->type, ((command==MV_TWSI_WRITE)?"Write":"Read") )); - /* 10 Bit address */ - if(pTwsiAddr->type == ADDR10_BIT) - { - return twsiAddr10BitSet(chanNum, pTwsiAddr->address,command); - } - /* 7 Bit address */ - else - { - return twsiAddr7BitSet(chanNum, pTwsiAddr->address,command); - } - -} - -/******************************************************************************* -* twsiAddr10BitSet - Set 10 Bit address on TWSI bus. -* -* DESCRIPTION: -* There are two address phases: -* 1) Write '11110' to data register bits [7:3] and 10-bit address MSB -* (bits [9:8]) to data register bits [2:1] plus a write(0) or read(1) bit -* to the Data register. Then it clears interrupt flag which drive -* the address on the TWSI bus. The function then waits for interrupt -* flag to be active and status 0x18 (write) or 0x40 (read) to be set. -* 2) write the rest of 10-bit address to data register and clears -* interrupt flag which drive the address on the TWSI bus. The -* function then waits for interrupt flag to be active and status -* 0xD0 (write) or 0xE0 (read) to be set. -* -* INPUT: -* chanNum - TWSI channel -* deviceAddress - twsi address. -* command - read / write . -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK - if setting the address completed succesfully. -* MV_FAIL otherwmise. -* -*******************************************************************************/ -static MV_STATUS twsiAddr10BitSet(MV_U8 chanNum, MV_U32 deviceAddress,MV_TWSI_CMD command) -{ - MV_U32 val,timeout; - - /* writing the 2 most significant bits of the 10 bit address*/ - val = ((deviceAddress & TWSI_DATA_ADDR_10BIT_MASK) >> TWSI_DATA_ADDR_10BIT_OFFS ); - /* bits 7:3 must be 0x11110 */ - val |= TWSI_DATA_ADDR_10BIT_CONST; - /* set command */ - val |= command; - MV_REG_WRITE(TWSI_DATA_REG(chanNum), val); - /* WA add a delay */ - mvOsDelay(1); - - /* clear Int flag */ - twsiIntFlgClr(chanNum); - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiAddr10BitSet ERROR - 1st addr (10Bit) Int TimeOut.\n")) - return MV_TIMEOUT; - - /* check the status */ - val = twsiStsGet(chanNum); - if(( (val != TWSI_AD_PLS_RD_BIT_TRA_ACK_REC) && (command == MV_TWSI_READ ) ) || - ( (val != TWSI_AD_PLS_WR_BIT_TRA_ACK_REC) && (command == MV_TWSI_WRITE) )) - { - mvOsPrintf("TWSI: twsiAddr10BitSet ERROR - status %x 1st addr (10 Bit) in %s mode.\n"\ - ,val, ((command==MV_TWSI_WRITE)?"Write":"Read") ); - return MV_FAIL; - } - - /* set 8 LSB of the address */ - val = (deviceAddress << TWSI_DATA_ADDR_7BIT_OFFS) & TWSI_DATA_ADDR_7BIT_MASK; - MV_REG_WRITE(TWSI_DATA_REG(chanNum), val); - - /* clear Int flag */ - twsiIntFlgClr(chanNum); - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiAddr10BitSet ERROR - 2nd (10 Bit) Int TimOut.\n")) - return MV_TIMEOUT; - - /* check the status */ - val = twsiStsGet(chanNum); - if(( (val != TWSI_SEC_AD_PLS_RD_BIT_TRA_ACK_REC) && (command == MV_TWSI_READ ) ) || - ( (val != TWSI_SEC_AD_PLS_WR_BIT_TRA_ACK_REC) && (command == MV_TWSI_WRITE) )) - { - mvOsPrintf("TWSI: twsiAddr10BitSet ERROR - status %x 2nd addr(10 Bit) in %s mode.\n"\ - ,val, ((command==MV_TWSI_WRITE)?"Write":"Read") ); - return MV_FAIL; - } - - return MV_OK; -} - -/******************************************************************************* -* twsiAddr7BitSet - Set 7 Bit address on TWSI bus. -* -* DESCRIPTION: -* This function writes 7 bit address plus a write or read bit to the -* Data register. Then it clears interrupt flag which drive the address on -* the TWSI bus. The function then waits for interrupt flag to be active -* and status 0x18 (write) or 0x40 (read) to be set. -* -* INPUT: -* chanNum - TWSI channel -* deviceAddress - twsi address. -* command - read / write . -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK - if setting the address completed succesfully. -* MV_FAIL otherwmise. -* -*******************************************************************************/ -static MV_STATUS twsiAddr7BitSet(MV_U8 chanNum, MV_U32 deviceAddress,MV_TWSI_CMD command) -{ - MV_U32 val,timeout; - - /* set the address */ - val = (deviceAddress << TWSI_DATA_ADDR_7BIT_OFFS) & TWSI_DATA_ADDR_7BIT_MASK; - /* set command */ - val |= command; - MV_REG_WRITE(TWSI_DATA_REG(chanNum), val); - /* WA add a delay */ - mvOsDelay(1); - - /* clear Int flag */ - twsiIntFlgClr(chanNum); - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiAddr7BitSet ERROR - Addr (7 Bit) int TimeOut.\n")) - return MV_TIMEOUT; - - /* check the status */ - val = twsiStsGet(chanNum); - if(( (val != TWSI_AD_PLS_RD_BIT_TRA_ACK_REC) && (command == MV_TWSI_READ ) ) || - ( (val != TWSI_AD_PLS_WR_BIT_TRA_ACK_REC) && (command == MV_TWSI_WRITE) )) - { - /* only in debug, since in boot we try to read the SPD of both DRAM, and we don't - want error messeges in case DIMM doesn't exist. */ - DB(mvOsPrintf("TWSI: twsiAddr7BitSet ERROR - status %x addr (7 Bit) in %s mode.\n"\ - ,val,((command==MV_TWSI_WRITE)?"Write":"Read") )); - return MV_FAIL; - } - - return MV_OK; -} - -/******************************************************************************* -* twsiDataWrite - Trnasmit a data block over TWSI bus. -* -* DESCRIPTION: -* This function writes a given data block to TWSI bus in 8 bit granularity. -* first The function waits for interrupt flag to be active then -* For each 8-bit data: -* The function writes data to data register. It then clears -* interrupt flag which drives the data on the TWSI bus. -* The function then waits for interrupt flag to be active and status -* 0x28 to be set. -* -* -* INPUT: -* chanNum - TWSI channel -* pBlock - Data block. -* blockSize - number of chars in pBlock. -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK - if transmiting the block completed succesfully, -* MV_BAD_PARAM - if pBlock is NULL, -* MV_FAIL otherwmise. -* -*******************************************************************************/ -static MV_STATUS twsiDataTransmit(MV_U8 chanNum, MV_U8 *pBlock, MV_U32 blockSize) -{ - MV_U32 timeout, temp, blockSizeWr = blockSize; - - if(NULL == pBlock) - return MV_BAD_PARAM; - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiDataTransmit ERROR - Read Data Int TimeOut.\n")) - return MV_TIMEOUT; - - while(blockSizeWr) - { - /* write the data*/ - MV_REG_WRITE(TWSI_DATA_REG(chanNum),(MV_U32)*pBlock); - DB(mvOsPrintf("TWSI: twsiDataTransmit place = %d write %x \n",\ - blockSize - blockSizeWr, *pBlock)); - pBlock++; - blockSizeWr--; - - twsiIntFlgClr(chanNum); - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiDataTransmit ERROR - Read Data Int TimeOut.\n")) - return MV_TIMEOUT; - - /* check the status */ - temp = twsiStsGet(chanNum); - if(temp != TWSI_M_TRAN_DATA_BYTE_ACK_REC) - { - mvOsPrintf("TWSI: twsiDataTransmit ERROR - status %x in write trans\n",temp); - return MV_FAIL; - } - - } - - return MV_OK; -} - -/******************************************************************************* -* twsiDataReceive - Receive data block from TWSI bus. -* -* DESCRIPTION: -* This function receive data block from TWSI bus in 8bit granularity -* into pBlock buffer. -* first The function waits for interrupt flag to be active then -* For each 8-bit data: -* It clears the interrupt flag which allows the next data to be -* received from TWSI bus. -* The function waits for interrupt flag to be active, -* and status reg is 0x50. -* Then the function reads data from data register, and copies it to -* the given buffer. -* -* INPUT: -* chanNum - TWSI channel -* blockSize - number of bytes to read. -* -* OUTPUT: -* pBlock - Data block. -* -* RETURN: -* MV_OK - if receive transaction completed succesfully, -* MV_BAD_PARAM - if pBlock is NULL, -* MV_FAIL otherwmise. -* -*******************************************************************************/ -static MV_STATUS twsiDataReceive(MV_U8 chanNum, MV_U8 *pBlock, MV_U32 blockSize) -{ - MV_U32 timeout, temp, blockSizeRd = blockSize; - if(NULL == pBlock) - return MV_BAD_PARAM; - - /* wait for Int to be Set */ - timeout = 0; - while( !twsiMainIntGet(chanNum) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiDataReceive ERROR - Read Data int Time out .\n")) - return MV_TIMEOUT; - - while(blockSizeRd) - { - if(blockSizeRd == 1) - { - /* clear ack and Int flag */ - temp = MV_REG_READ(TWSI_CONTROL_REG(chanNum)); - temp &= ~(TWSI_CONTROL_ACK); - MV_REG_WRITE(TWSI_CONTROL_REG(chanNum), temp); - } - twsiIntFlgClr(chanNum); - /* wait for Int to be Set */ - timeout = 0; - while( (!twsiMainIntGet(chanNum)) && (timeout++ < TWSI_TIMEOUT_VALUE)); - - /* check for timeout */ - if(MV_TRUE == twsiTimeoutChk(timeout,"TWSI: twsiDataReceive ERROR - Read Data Int Time out .\n")) - return MV_TIMEOUT; - - /* check the status */ - temp = twsiStsGet(chanNum); - if((temp != TWSI_M_REC_RD_DATA_ACK_TRA) && (blockSizeRd !=1)) - { - mvOsPrintf("TWSI: twsiDataReceive ERROR - status %x in read trans \n",temp); - return MV_FAIL; - } - else if((temp != TWSI_M_REC_RD_DATA_ACK_NOT_TRA) && (blockSizeRd ==1)) - { - mvOsPrintf("TWSI: twsiDataReceive ERROR - status %x in Rd Terminate\n",temp); - return MV_FAIL; - } - - /* read the data*/ - *pBlock = (MV_U8)MV_REG_READ(TWSI_DATA_REG(chanNum)); - DB(mvOsPrintf("TWSI: twsiDataReceive place %d read %x \n",\ - blockSize - blockSizeRd,*pBlock)); - pBlock++; - blockSizeRd--; - } - - return MV_OK; -} - - - -/******************************************************************************* -* twsiTargetOffsSet - Set TWST target offset on TWSI bus. -* -* DESCRIPTION: -* The function support TWSI targets that have inside address space (for -* example EEPROMs). The function: -* 1) Convert the given offset into pBlock and size. -* in case the offset should be set to a TWSI slave which support -* more then 256 bytes offset, the offset setting will be done -* in 2 transactions. -* 2) Use twsiDataTransmit to place those on the bus. -* -* INPUT: -* chanNum - TWSI channel -* offset - offset to be set on the EEPROM device. -* moreThen256 - whether the EEPROM device support more then 256 byte offset. -* -* OUTPUT: -* None. -* -* RETURN: -* MV_OK - if setting the offset completed succesfully. -* MV_FAIL otherwmise. -* -*******************************************************************************/ -static MV_STATUS twsiTargetOffsSet(MV_U8 chanNum, MV_U32 offset, MV_BOOL moreThen256) -{ - MV_U8 offBlock[2]; - MV_U32 offSize; - - if(moreThen256 == MV_TRUE) - { - offBlock[0] = (offset >> 8) & 0xff; - offBlock[1] = offset & 0xff; - offSize = 2; - } - else - { - offBlock[0] = offset & 0xff; - offSize = 1; - } - DB(mvOsPrintf("TWSI: twsiTargetOffsSet offSize = %x addr1 = %x addr2 = %x\n",\ - offSize,offBlock[0],offBlock[1])); - return twsiDataTransmit(chanNum, offBlock, offSize); - -} - -/******************************************************************************* -* mvTwsiRead - Read data block from a TWSI Slave. -* -* DESCRIPTION: -* The function calls the following functions: -* -) mvTwsiStartBitSet(); -* if(EEPROM device) -* -) mvTwsiAddrSet(w); -* -) twsiTargetOffsSet(); -* -) mvTwsiStartBitSet(); -* -) mvTwsiAddrSet(r); -* -) twsiDataReceive(); -* -) mvTwsiStopBitSet(); -* -* INPUT: -* chanNum - TWSI channel -* pTwsiSlave - Twsi Slave structure. -* blockSize - number of bytes to read. -* -* OUTPUT: -* pBlock - Data block. -* -* RETURN: -* MV_OK - if EEPROM read transaction completed succesfully, -* MV_BAD_PARAM - if pBlock is NULL, -* MV_FAIL otherwmise. -* -*******************************************************************************/ -MV_STATUS mvTwsiRead(MV_U8 chanNum, MV_TWSI_SLAVE *pTwsiSlave, MV_U8 *pBlock, MV_U32 blockSize) -{ - if((NULL == pBlock) || (NULL == pTwsiSlave)) - return MV_BAD_PARAM; - if(MV_OK != mvTwsiStartBitSet(chanNum)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after mvTwsiStartBitSet\n")); - - /* in case offset exsist (i.e. eeprom ) */ - if(MV_TRUE == pTwsiSlave->validOffset) - { - if(MV_OK != mvTwsiAddrSet(chanNum, &(pTwsiSlave->slaveAddr), MV_TWSI_WRITE)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after mvTwsiAddrSet\n")); - if(MV_OK != twsiTargetOffsSet(chanNum, pTwsiSlave->offset, pTwsiSlave->moreThen256)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after twsiTargetOffsSet\n")); - if(MV_OK != mvTwsiStartBitSet(chanNum)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after mvTwsiStartBitSet\n")); - } - if(MV_OK != mvTwsiAddrSet(chanNum, &(pTwsiSlave->slaveAddr), MV_TWSI_READ)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after mvTwsiAddrSet\n")); - if(MV_OK != twsiDataReceive(chanNum, pBlock, blockSize)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after twsiDataReceive\n")); - - if(MV_OK != mvTwsiStopBitSet(chanNum)) - { - return MV_FAIL; - } - - twsiAckBitSet(chanNum); - - DB(mvOsPrintf("TWSI: mvTwsiEepromRead after mvTwsiStopBitSet\n")); - - return MV_OK; -} - -/******************************************************************************* -* mvTwsiWrite - Write data block to a TWSI Slave. -* -* DESCRIPTION: -* The function calls the following functions: -* -) mvTwsiStartBitSet(); -* -) mvTwsiAddrSet(); -* -)if(EEPROM device) -* -) twsiTargetOffsSet(); -* -) twsiDataTransmit(); -* -) mvTwsiStopBitSet(); -* -* INPUT: -* chanNum - TWSI channel -* eepromAddress - eeprom address. -* blockSize - number of bytes to write. -* pBlock - Data block. -* -* OUTPUT: -* None -* -* RETURN: -* MV_OK - if EEPROM read transaction completed succesfully. -* MV_BAD_PARAM - if pBlock is NULL, -* MV_FAIL otherwmise. -* -* NOTE: Part of the EEPROM, required that the offset will be aligned to the -* max write burst supported. -*******************************************************************************/ -MV_STATUS mvTwsiWrite(MV_U8 chanNum, MV_TWSI_SLAVE *pTwsiSlave, MV_U8 *pBlock, MV_U32 blockSize) -{ - if((NULL == pBlock) || (NULL == pTwsiSlave)) - return MV_BAD_PARAM; - - if(MV_OK != mvTwsiStartBitSet(chanNum)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - - DB(mvOsPrintf("TWSI: mvTwsiEepromWrite after mvTwsiStartBitSet\n")); - if(MV_OK != mvTwsiAddrSet(chanNum, &(pTwsiSlave->slaveAddr), MV_TWSI_WRITE)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI :mvTwsiEepromWrite after mvTwsiAddrSet\n")); - - /* in case offset exsist (i.e. eeprom ) */ - if(MV_TRUE == pTwsiSlave->validOffset) - { - if(MV_OK != twsiTargetOffsSet(chanNum, pTwsiSlave->offset, pTwsiSlave->moreThen256)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromWrite after twsiTargetOffsSet\n")); - } - if(MV_OK != twsiDataTransmit(chanNum, pBlock, blockSize)) - { - mvTwsiStopBitSet(chanNum); - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromWrite after twsiDataTransmit\n")); - if(MV_OK != mvTwsiStopBitSet(chanNum)) - { - return MV_FAIL; - } - DB(mvOsPrintf("TWSI: mvTwsiEepromWrite after mvTwsiStopBitSet\n")); - - return MV_OK; -} |