2 * Copyright (C) 2013 Realtek Semiconductor Corp.
5 * Unless you and Realtek execute a separate written software license
6 * agreement governing use of this software, this software is licensed
7 * to you under the terms of the GNU General Public License version 2,
8 * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
11 * $Date: 2016-02-27 14:32:56 +0800 (ε¨δΈ, 17 εζ 2016) $
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : I2C related functions
19 #include <rtl8367c_asicdrv_i2c.h>
20 #include <rtk_error.h>
21 #include <rtk_types.h>
26 * rtl8367c_setAsicI2C_checkBusIdle
28 * Check i2c bus status idle or not
35 * RT_ERR_BUSYWAIT_TIMEOUT - i2c bus is busy
37 * This API can check i2c bus status.
39 ret_t
rtl8367c_setAsicI2C_checkBusIdle(void)
44 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_M_I2C_BUS_IDLE_OFFSET
, ®Data
)) != RT_ERR_OK
)
48 return RT_ERR_OK
; /*i2c is idle*/
50 return RT_ERR_BUSYWAIT_TIMEOUT
; /*i2c is busy*/
55 * rtl8367c_setAsicI2CStartCmd
57 * Set I2C start command
65 * This API can set i2c start command ,start a i2c traffic .
67 ret_t
rtl8367c_setAsicI2CStartCmd(void)
72 /* Bits [4-1] = 0b0000, Start Command; Bit [0] = 1, Trigger the Command */
73 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
78 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
81 /* wait for command finished */
83 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
85 }while( regData
!= 0x0);
91 * rtl8367c_setAsicI2CStopCmd
93 * Set I2C stop command
101 * This API can set i2c stop command ,stop a i2c traffic.
103 ret_t
rtl8367c_setAsicI2CStopCmd(void)
109 /* Bits [4-1] = 0b0001, Stop Command; Bit [0] = 1, Trigger the Command */
110 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
115 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
119 /* wait for command finished */
121 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
123 }while( regData
!= 0x0);
129 * rtl8367c_setAsicI2CTxOneCharCmd
131 * Set I2C Tx a char command, with a 8-bit data
133 * oneChar - 8-bit data
137 * RT_ERR_OK - Success
139 * This API can set i2c Tx command and with a 8-bit data.
141 ret_t
rtl8367c_setAsicI2CTxOneCharCmd(rtk_uint8 oneChar
)
146 /* Bits [4-1] = 0b0010, tx one char; Bit [0] = 1, Trigger the Command */
147 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
153 regData
|= (rtk_uint16
) (oneChar
<< 8);
155 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
159 /* wait for command finished */
161 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
163 }while( regData
!= 0x0);
170 * rtl8367c_setAsicI2CcheckRxAck
178 * RT_ERR_OK - Success
180 * This API can check if rx an ack from i2c slave.
182 ret_t
rtl8367c_setAsicI2CcheckRxAck(void)
186 rtk_uint32 count
= 0;
190 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_SLV_ACK_FLAG_OFFSET
, ®Data
)) != RT_ERR_OK
)
192 }while( (regData
!= 0x1) && (count
< TIMEROUT_FOR_MICROSEMI
) );
195 return RT_ERR_FAILED
;
202 * rtl8367c_setAsicI2CRxOneCharCmd
204 * Set I2C Rx command and get 8-bit data
210 * RT_ERR_OK - Success
212 * This API can set I2C Rx command and get 8-bit data.
214 ret_t
rtl8367c_setAsicI2CRxOneCharCmd(rtk_uint8
*pValue
)
219 /* Bits [4-1] = 0b0011, Rx one char; Bit [0] = 1, Trigger the Command */
220 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
224 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
227 /* wait for command finished */
229 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
231 }while( (regData
& 0x1) != 0x0);
233 *pValue
= (rtk_uint8
)(regData
>> 8);
239 * rtl8367c_setAsicI2CTxAckCmd
241 * Set I2C Tx ACK command
247 * RT_ERR_OK - Success
249 * This API can set I2C Tx ack command.
251 ret_t
rtl8367c_setAsicI2CTxAckCmd(void)
256 /* Bits [4-1] = 0b0100, tx ACK Command; Bit [0] = 1, Trigger the Command */
257 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
261 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
264 /* wait for command finished */
266 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
268 }while( regData
!= 0x0);
276 * rtl8367c_setAsicI2CTxNoAckCmd
278 * Set I2C master Tx noACK command
284 * RT_ERR_OK - Success
286 * This API can set I2C master Tx noACK command.
288 ret_t
rtl8367c_setAsicI2CTxNoAckCmd(void)
293 /* Bits [4-1] = 0b0101, tx noACK Command; Bit [0] = 1, Trigger the Command */
294 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
298 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
301 /* wait for command finished */
303 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
305 }while( regData
!= 0x0);
312 * rtl8367c_setAsicI2CSoftRSTseqCmd
314 * set I2C master tx soft reset command
320 * RT_ERR_OK - Success
322 * This API can set I2C master tx soft reset command.
324 ret_t
rtl8367c_setAsicI2CSoftRSTseqCmd(void)
330 /*Bits [4-1] = 0b0110, tx soft reset Command; Bit [0] = 1, Trigger the Command */
331 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, ®Data
)) != RT_ERR_OK
)
336 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_CTL_STA_REG
, regData
)) != RT_ERR_OK
)
340 /* wait for command finished */
342 if ((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_M_I2C_CTL_STA_REG
, RTL8367C_I2C_CMD_EXEC_OFFSET
, ®Data
)) != RT_ERR_OK
)
344 }while( regData
!= 0x0);
351 * rtl8367c_setAsicI2CGpioPinGroup
353 * set I2C function used gpio pins
355 * pinGroup_ID - gpio pins group
359 * RT_ERR_OK - Success
360 * RT_ERR_INPUT _ Invalid input parameter
362 * This API can set I2C function used gpio pins.
363 * There are three group gpio pins
365 ret_t
rtl8367c_setAsicI2CGpioPinGroup(rtk_uint32 pinGroup_ID
)
370 if ((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, ®Data
)) != RT_ERR_OK
)
377 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, regData
)) != RT_ERR_OK
)
381 else if( pinGroup_ID
==1 )
386 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, regData
)) != RT_ERR_OK
)
390 else if( pinGroup_ID
==2 )
395 if ((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, regData
)) != RT_ERR_OK
)
406 * rtl8367c_setAsicI2CGpioPinGroup
408 * set I2C function used gpio pins
410 * pinGroup_ID - gpio pins group
414 * RT_ERR_OK - Success
415 * RT_ERR_INPUT _ Invalid input parameter
417 * This API can set I2C function used gpio pins.
418 * There are three group gpio pins
420 ret_t
rtl8367c_getAsicI2CGpioPinGroup(rtk_uint32
* pPinGroup_ID
)
425 if( (retVal
= rtl8367c_getAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, ®Data
)) != RT_ERR_OK
)
428 regData
= (regData
>> 12);
432 else if(regData
== 0xA)
434 else if(regData
== 0xF)
437 return RT_ERR_FAILED
;