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: 2015-12-08 14:06:29 +0800 (周二, 08 十二月 2015) $
13 * Purpose : RTK switch high-level API for RTL8367/RTL8367C
14 * Feature : Here is a list of all functions and variables in i2c module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
22 #include <rtl8367c_reg.h>
24 #include <rtl8367c_asicdrv_i2c.h>
25 #include <rtk_switch.h>
26 #include <rtl8367c_asicdrv.h>
27 #include <rtk_types.h>
31 static rtk_I2C_16bit_mode_t rtk_i2c_mode
= I2C_LSB_16BIT_MODE
;
37 * I2C smart function initialization.
44 * RT_ERR_FAILED - Failed
46 * This API is used to initialize EEE status.
50 rtk_api_ret_t
rtk_i2c_init(void)
55 if((retVal
= rtk_switch_probe(&ChipID
)) != RT_ERR_OK
)
58 if( ChipID
== CHIP_RTL8370B
)
60 /*set GPIO8, GPIO9, OpenDrain as I2C, clock = 252KHZ */
61 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_M_I2C_SYS_CTL
, 0x5c3f)) != RT_ERR_OK
)
73 * Set I2C data byte-order.
75 * i2cmode - byte-order mode
80 * RT_ERR_FAILED - Failed
81 * RT_ERR_INPUT - Invalid input parameter.
83 * This API can set I2c traffic's byte-order .
85 rtk_api_ret_t
rtk_i2c_mode_set( rtk_I2C_16bit_mode_t i2cmode
)
87 if(i2cmode
>= I2C_Mode_END
)
91 else if(i2cmode
== I2C_70B_LSB_16BIT_MODE
)
93 rtk_i2c_mode
= I2C_70B_LSB_16BIT_MODE
;
97 else if( i2cmode
== I2C_LSB_16BIT_MODE
)
99 rtk_i2c_mode
= I2C_LSB_16BIT_MODE
;
103 return RT_ERR_FAILED
;
112 * Get i2c traffic byte-order setting.
116 * pI2cMode - i2c byte-order
119 * RT_ERR_FAILED - Failed
120 * RT_ERR_NULL_POINTER - input parameter is null pointer
122 * The API can get i2c traffic byte-order setting.
124 rtk_api_ret_t
rtk_i2c_mode_get( rtk_I2C_16bit_mode_t
* pI2cMode
)
126 /* Check initialization state */
127 RTK_CHK_INIT_STATE();
129 return RT_ERR_NULL_POINTER
;
130 if(rtk_i2c_mode
== I2C_70B_LSB_16BIT_MODE
)
132 else if ((rtk_i2c_mode
== I2C_LSB_16BIT_MODE
))
135 return RT_ERR_FAILED
;
141 * rtk_i2c_gpioPinGroup_set
143 * Set i2c SDA & SCL used GPIO pins group.
145 * pins_group - GPIO pins group
150 * RT_ERR_FAILED - Failed
151 * RT_ERR_INPUT - Invalid input parameter.
153 * The API can set i2c used gpio pins group.
154 * There are three group pins could be used
156 rtk_api_ret_t
rtk_i2c_gpioPinGroup_set( rtk_I2C_gpio_pin_t pins_group
)
161 if( ( pins_group
> I2C_GPIO_PIN_END
)|| ( pins_group
< I2C_GPIO_PIN_8_9
) )
164 if( (retVal
= rtl8367c_setAsicI2CGpioPinGroup(pins_group
) ) != RT_ERR_OK
)
171 * rtk_i2c_gpioPinGroup_get
173 * Get i2c SDA & SCL used GPIO pins group.
177 * pPins_group - GPIO pins group
180 * RT_ERR_NULL_POINTER - input parameter is null pointer
182 * The API can get i2c used gpio pins group.
183 * There are three group pins could be used
185 rtk_api_ret_t
rtk_i2c_gpioPinGroup_get( rtk_I2C_gpio_pin_t
* pPins_group
)
188 /* Check initialization state */
189 RTK_CHK_INIT_STATE();
191 if(NULL
== pPins_group
)
192 return RT_ERR_NULL_POINTER
;
193 if( (retVal
= rtl8367c_getAsicI2CGpioPinGroup(pPins_group
) ) != RT_ERR_OK
)
202 * read i2c slave device register.
204 * deviceAddr - access Slave device address
205 * slaveRegAddr - access Slave register address
207 * pRegData - read data
210 * RT_ERR_NULL_POINTER - input parameter is null pointer
212 * The API can access i2c slave and read i2c slave device register.
214 rtk_api_ret_t
rtk_i2c_data_read(rtk_uint8 deviceAddr
, rtk_uint32 slaveRegAddr
, rtk_uint32
*pRegData
)
216 rtk_uint32 retVal
, counter
=0;
217 rtk_uint8 controlByte_W
, controlByte_R
;
218 rtk_uint8 slaveRegAddr_L
, slaveRegAddr_H
= 0x0, temp
;
219 rtk_uint8 regData_L
, regData_H
;
221 /* control byte :deviceAddress + W, deviceAddress + R */
222 controlByte_W
= (rtk_uint8
)(deviceAddr
<< 1) ;
223 controlByte_R
= (rtk_uint8
)(controlByte_W
| 0x1);
225 slaveRegAddr_L
= (rtk_uint8
) (slaveRegAddr
& 0x00FF) ;
226 slaveRegAddr_H
= (rtk_uint8
) (slaveRegAddr
>>8) ;
228 if( rtk_i2c_mode
== I2C_70B_LSB_16BIT_MODE
)
230 temp
= slaveRegAddr_L
;
231 slaveRegAddr_L
= slaveRegAddr_H
;
232 slaveRegAddr_H
= temp
;
236 /*check bus state: idle*/
237 for(counter
= 3000; counter
>0; counter
--)
239 if ( (retVal
= rtl8367c_setAsicI2C_checkBusIdle() ) == RT_ERR_OK
)
243 return retVal
; /*i2c is busy*/
246 if( (retVal
= rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK
)
251 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(controlByte_W
))!= RT_ERR_OK
)
255 /*check if RX ack from slave*/
256 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
259 /* tx slave buffer address low 8 bits */
260 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_L
))!= RT_ERR_OK
)
263 /*check if RX ack from slave*/
264 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
269 /* tx slave buffer address high 8 bits */
270 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_H
))!= RT_ERR_OK
)
274 /*check if RX ack from slave*/
275 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
280 if( (retVal
= rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK
)
284 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(controlByte_R
))!= RT_ERR_OK
)
288 /*check if RX ack from slave*/
289 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
293 /* rx low 8bit data*/
294 if( ( retVal
= rtl8367c_setAsicI2CRxOneCharCmd( ®Data_L
) ) != RT_ERR_OK
)
299 /* tx ack to slave, keep receive */
300 if( (retVal
= rtl8367c_setAsicI2CTxAckCmd()) != RT_ERR_OK
)
303 /* rx high 8bit data*/
304 if( ( retVal
= rtl8367c_setAsicI2CRxOneCharCmd( ®Data_H
) ) != RT_ERR_OK
)
309 /* tx Noack to slave, Stop receive */
310 if( (retVal
= rtl8367c_setAsicI2CTxNoAckCmd()) != RT_ERR_OK
)
315 if( (retVal
= rtl8367c_setAsicI2CStopCmd()) != RT_ERR_OK
)
318 *pRegData
= (regData_H
<< 8) | regData_L
;
326 * write data to i2c slave device register
328 * deviceAddr - access Slave device address
329 * slaveRegAddr - access Slave register address
330 * regData - data to set
336 * The API can access i2c slave and setting i2c slave device register.
338 rtk_api_ret_t
rtk_i2c_data_write(rtk_uint8 deviceAddr
, rtk_uint32 slaveRegAddr
, rtk_uint32 regData
)
340 rtk_uint32 retVal
,counter
;
341 rtk_uint8 controlByte_W
;
342 rtk_uint8 slaveRegAddr_L
, slaveRegAddr_H
= 0x0, temp
;
343 rtk_uint8 regData_L
, regData_H
;
345 /* control byte :deviceAddress + W */
346 controlByte_W
= (rtk_uint8
)(deviceAddr
<< 1) ;
348 slaveRegAddr_L
= (rtk_uint8
) (slaveRegAddr
& 0x00FF) ;
349 slaveRegAddr_H
= (rtk_uint8
) (slaveRegAddr
>>8) ;
351 regData_H
= (rtk_uint8
) (regData
>> 8);
352 regData_L
= (rtk_uint8
) (regData
& 0x00FF);
354 if( rtk_i2c_mode
== I2C_70B_LSB_16BIT_MODE
)
356 temp
= slaveRegAddr_L
;
357 slaveRegAddr_L
= slaveRegAddr_H
;
358 slaveRegAddr_H
= temp
;
362 /*check bus state: idle*/
363 for(counter
= 3000; counter
>0; counter
--)
365 if ( (retVal
= rtl8367c_setAsicI2C_checkBusIdle() ) == RT_ERR_OK
)
370 return retVal
; /*i2c is busy*/
374 if( (retVal
= rtl8367c_setAsicI2CStartCmd() ) != RT_ERR_OK
)
379 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(controlByte_W
))!= RT_ERR_OK
)
383 /*check if RX ack from slave*/
384 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
388 /* tx slave buffer address low 8 bits */
389 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_L
))!= RT_ERR_OK
)
393 /*check if RX ack from slave*/
394 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
398 /* tx slave buffer address high 8 bits */
399 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(slaveRegAddr_H
))!= RT_ERR_OK
)
403 /*check if RX ack from slave*/
404 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
409 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(regData_L
))!= RT_ERR_OK
)
413 /*check if RX ack from slave*/
414 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
419 if( (retVal
= rtl8367c_setAsicI2CTxOneCharCmd(regData_H
))!= RT_ERR_OK
)
423 /*check if RX ack from slave*/
424 if( (retVal
= rtl8367c_setAsicI2CcheckRxAck()) != RT_ERR_OK
)
429 if( (retVal
= rtl8367c_setAsicI2CStopCmd()) != RT_ERR_OK
)