1 /**
2   ******************************************************************************
3   * @file    rtl8721dhp_usi_i2c.c
4   * @author
5   * @version V1.0.0
6   * @date    2017-12-18
7   * @brief   This file contains all the functions prototypes for the I2C firmware
8   *          library, including the following functionalities of theIntel-Integrated
9   *             Circuit (I2C) peripheral:
10   *           - Initialization
11   *           - I2C Speed Setting
12   *           - I2C Slave Address Updating
13   *           - Receive/Send Data Interface
14   *           - I2C Peripheral Control (disable/enable)
15   *           - I2C SleepMode Control
16   *           - Output pin Configuration
17   *           - Interrupts and flags management
18   *
19   ******************************************************************************
20   * @attention
21   *
22   * This module is a confidential and proprietary property of RealTek and
23   * possession or use of this module requires written permission of RealTek.
24   *
25   * Copyright(c) 2017, Realtek Semiconductor Corporation. All rights reserved.
26   ******************************************************************************
27   */
28 
29 #include "ameba_soc.h"
30 #include "rtl8721d_usi_i2c.h"
31 
32 u32 USI_I2C_SLAVEWRITE_PATCH;
33 u32 USI_IC_FS_SCL_HCNT_TRIM;
34 u32 USI_IC_FS_SCL_LCNT_TRIM;
35 
36 /**
37   * @brief  Fills each USI_I2C_StructInit member with its default value.
38   * @param  USI_I2C_StructInit: pointer to an USI_I2C_InitTypeDef structure which will be initialized.
39   * @retval None
40   */
USI_I2C_StructInit(USI_I2C_InitTypeDef * USI_I2C_InitStruct)41 void USI_I2C_StructInit(USI_I2C_InitTypeDef* USI_I2C_InitStruct)
42 {
43 	/* Load HAL initial data structure default value */
44 	USI_I2C_InitStruct->USI_I2CMaster     = USI_I2C_MASTER_MODE;
45 	USI_I2C_InitStruct->USI_I2CAddrMod    = USI_I2C_ADDR_7BIT;
46 	USI_I2C_InitStruct->USI_I2CSpdMod     = USI_I2C_SS_MODE;
47 	USI_I2C_InitStruct->USI_I2CClk        = 100;
48 	USI_I2C_InitStruct->USI_I2CIPClk      = 50000000;
49 	USI_I2C_InitStruct->USI_I2CAckAddr    = 0x11;
50 	USI_I2C_InitStruct->USI_I2CSdaHd      = 1;
51 	USI_I2C_InitStruct->USI_I2CSlvSetup   = 0x3;
52 	USI_I2C_InitStruct->USI_I2CRXTL       = 0x01;
53 	USI_I2C_InitStruct->USI_I2CTXTL       = 0x10;
54 	USI_I2C_InitStruct->USI_I2CMstReSTR   = DISABLE;
55 	USI_I2C_InitStruct->USI_I2CMstGC      = DISABLE;
56 	USI_I2C_InitStruct->USI_I2CMstStartB  = DISABLE;
57 	USI_I2C_InitStruct->USI_I2CSlvNoAck   = DISABLE;
58 	USI_I2C_InitStruct->USI_I2CFilter     = 0x11;
59 	USI_I2C_InitStruct->USI_I2CTxDMARqLv  = 0x09;
60 	USI_I2C_InitStruct->USI_I2CRxDMARqLv  = 0x04;
61 }
62 
63 /**
64   * @brief  Initializes the USIx peripheral according to the specified
65   *			parameters in the USI_I2C_InitStruct.
66   * @param  USIx: where USIx can be USI0_DEV.
67   * @param  USI_I2C_InitStruct: pointer to a USI_I2C_InitTypeDef structure that contains
68   * 		the configuration information for the specified I2C peripheral.
69   * @retval None
70   */
USI_I2C_Init(USI_TypeDef * USIx,USI_I2C_InitTypeDef * USI_I2C_InitStruct)71 void USI_I2C_Init(USI_TypeDef *USIx, USI_I2C_InitTypeDef* USI_I2C_InitStruct)
72 {
73 	u8  Specical;
74 
75 	/* Check the parameters */
76 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
77 	assert_param(IS_USI_I2C_ADDR_MODE(USI_I2C_InitStruct->USI_I2CAddrMod));
78 	assert_param(IS_USI_I2C_SPEED_MODE(USI_I2C_InitStruct->USI_I2CSpdMod));
79 
80 	/* Disable the IC first */
81 	USIx->I2C_ENABLE &= ~USI_I2C_ENABLE;
82 
83 	/*reset USI all logic, this step will clear tx/rx fifo*/
84 	USIx->SW_RESET &=(~USI_SW_RESET_RSTB);
85 	USIx->SW_RESET = 0x1f;
86 
87 	/*disable USI all mode, configure USI with I2C mode*/
88 	USIx->USI_MODE_CTRL &= (~USI_SERIAL_MODE);
89 	USIx->USI_MODE_CTRL |= USI_SERIAL_I2C_MODE;
90 
91 	/* Master case*/
92 	if (USI_I2C_InitStruct->USI_I2CMaster) {
93 		/*RESTART MUST be set in these condition in Master mode.
94 		But it might be NOT compatible in old slaves.*/
95 		if ((USI_I2C_InitStruct->USI_I2CAddrMod == USI_I2C_ADDR_10BIT) || (USI_I2C_InitStruct->USI_I2CSpdMod == USI_I2C_HS_MODE) || (USI_I2C_InitStruct->USI_I2CMstStartB != 0))
96 			USI_I2C_InitStruct->USI_I2CMstReSTR = ENABLE;
97 
98 		USIx->I2C_CTRL = (USI_I2C_SLV_DISABLE |
99 			(USI_I2C_InitStruct->USI_I2CSpdMod << 2) |
100 			(USI_I2C_InitStruct->USI_I2CMstReSTR << 1) |
101 			(USI_I2C_InitStruct->USI_I2CMaster));
102 
103 		/* To set target addr.*/
104 		Specical = 0;
105 		if ((USI_I2C_InitStruct->USI_I2CMstGC != 0) || (USI_I2C_InitStruct->USI_I2CMstStartB != 0))
106 			Specical = 1;
107 
108 		USIx->I2C_TAR = ((USI_I2C_InitStruct->USI_I2CAddrMod << 12) |
109 			(Specical << 11)           |
110 			(USI_I2C_InitStruct->USI_I2CMstStartB << 10)      |
111 			(USI_I2C_InitStruct->USI_I2CAckAddr & USI_I2C_IC_TAR));
112 
113 		/* To Set I2C clock*/
114 		USI_I2C_SetSpeed(USIx, USI_I2C_InitStruct->USI_I2CSpdMod, USI_I2C_InitStruct->USI_I2CClk, USI_I2C_InitStruct->USI_I2CIPClk);
115 	}    /*if (Master)*/
116 	else {
117 		USIx->I2C_CTRL = (((USI_I2C_InitStruct->USI_I2CAckAddr <<12) & USI_I2C_SAR) |
118 			(USI_I2C_InitStruct->USI_I2CAddrMod << 9) |
119 			(USI_I2C_InitStruct->USI_I2CMaster << 8) |
120 			(USI_I2C_InitStruct->USI_I2CSpdMod << 2) |
121 			(USI_I2C_InitStruct->USI_I2CMaster));
122 
123 		/* To set slave no ack and ack general call*/
124 		USIx->I2C_SLV_ACK_CTRL = USI_I2C_InitStruct->USI_I2CSlvNoAck |(USI_I2C_InitStruct->USI_I2CSlvAckGC << 1);
125 		/* to set SDA setup time */
126 		USIx->I2C_SDA_TIMING = (USI_I2C_InitStruct->USI_I2CSlvSetup & USI_I2C_SDA_SETUP);
127 	}
128 	/* To set SDA hold time */
129 	USIx->I2C_SDA_TIMING = (((USI_I2C_InitStruct->USI_I2CSdaHd << 16) & USI_I2C_SDA_HOLD) | (USIx->I2C_SDA_TIMING & USI_I2C_SDA_SETUP));
130 
131 	/* To set TX almost empty Level */
132 	USIx->TX_FIFO_CTRL= USI_I2C_InitStruct->USI_I2CTXTL;
133 
134 	/* To set RX almost full Level */
135 	USIx->RX_FIFO_CTRL = USI_I2C_InitStruct->USI_I2CRXTL;
136 
137 	/* To set IC_FILTER */
138 	USIx->I2C_DIG_FILTER= USI_I2C_InitStruct->USI_I2CFilter;
139 
140 	/* To set DMA TX/RX level */
141 	USIx->DMA_REQ_SIZE &= (~(USI_TX_DMA_BURST_SIZE | USI_RX_DMA_BURST_SIZE));
142 	USIx->DMA_REQ_SIZE |= (USI_I2C_InitStruct->USI_I2CTxDMARqLv | (USI_I2C_InitStruct->USI_I2CRxDMARqLv << 16));
143 
144 	/*I2C Clear all interrupts first*/
145 	USI_I2C_ClearAllINT(USIx);
146 
147 	/*I2C Disable all interrupts first*/
148 	USI_I2C_INTConfig(USIx, 0xFFFFFFFF, DISABLE);
149 }
150 
151 /**
152   * @brief  Master sets I2C Speed Mode.
153   * @param  USIx: where USIx can be USI0_DEV.
154   * @param  SpdMd: I2C Speed Mode.
155   *   This parameter can be one of the following values:
156   *     @arg USI_I2C_SS_MODE:
157   *     @arg USI_I2C_FS_MODE:
158   *     @arg USI_I2C_HS_MODE:
159   * @param  I2Clk: I2C Bus Clock, unit is KHz.
160   *   This parameter can be one of the following values:
161   *     @arg 50:
162   *     @arg 100:
163   *     @arg 400:
164   *     @arg 1000:
165   *     @arg 3000:
166   * @param  IPClk: I2C IP Clock, unit is Hz.
167   * @retval None
168   */
USI_I2C_SetSpeed(USI_TypeDef * USIx,u32 SpdMd,u32 I2Clk,u32 I2CIPClk)169 void USI_I2C_SetSpeed(USI_TypeDef *USIx, u32 SpdMd, u32 I2Clk, u32 I2CIPClk)
170 {
171 	u32 ICHLcnt;
172 	u32 ICHtime;
173 	u32 ICLtime;
174 	u32 IPClkM = I2CIPClk /1000000;
175 
176 	/* Check the parameters */
177 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
178 
179 	switch (SpdMd)
180 	{
181 		case USI_I2C_SS_MODE:
182 		{
183 			ICHtime = ((1000000/I2Clk)*USI_I2C_SS_MIN_SCL_HTIME)/(USI_I2C_SS_MIN_SCL_HTIME+USI_I2C_SS_MIN_SCL_LTIME);
184 			ICLtime = ((1000000/I2Clk)*USI_I2C_SS_MIN_SCL_LTIME)/(USI_I2C_SS_MIN_SCL_HTIME+USI_I2C_SS_MIN_SCL_LTIME);
185 
186 			ICHLcnt = (ICHtime * IPClkM)/1000;
187 			USIx->I2C_SS_SCL_CNT = (ICHLcnt & USI_I2C_SS_SCL_HCNT) + 1;
188 			ICHLcnt = (ICLtime * IPClkM)/1000;
189 			USIx->I2C_SS_SCL_CNT |= (ICHLcnt << 16) & USI_I2C_SS_SCL_LCNT;
190 
191 			break;
192 		}
193 
194 		case USI_I2C_FS_MODE:
195 		{
196 			ICHtime = ((1000000/I2Clk)*USI_I2C_FS_MIN_SCL_HTIME)/(USI_I2C_FS_MIN_SCL_HTIME+USI_I2C_FS_MIN_SCL_LTIME);
197 			ICLtime = ((1000000/I2Clk)*USI_I2C_FS_MIN_SCL_LTIME)/(USI_I2C_FS_MIN_SCL_HTIME+USI_I2C_FS_MIN_SCL_LTIME);
198 
199 			ICHLcnt = (ICHtime * IPClkM)/1000;
200 			if (ICHLcnt > IC_FS_SCL_HCNT_TRIM)/*this part is according to the fine-tune result*/
201 				ICHLcnt -= IC_FS_SCL_HCNT_TRIM;
202 			USIx->I2C_FS_SCL_CNT = (ICHLcnt & USI_I2C_FS_SCL_HCNT) + 1;
203 
204 			ICHLcnt = (ICLtime * IPClkM)/1000;
205 			if (ICHLcnt > IC_FS_SCL_LCNT_TRIM)/*this part is according to the fine-tune result*/
206 				ICHLcnt -= IC_FS_SCL_LCNT_TRIM;
207 			USIx->I2C_FS_SCL_CNT |= (ICHLcnt << 16) & USI_I2C_FS_SCL_LCNT;
208 
209 			break;
210 		}
211 
212 		case USI_I2C_HS_MODE:
213 		{
214 			/*set Fast mode count for Master code*/
215 			ICHtime = ((1000000/400)*USI_I2C_FS_MIN_SCL_HTIME)/(USI_I2C_FS_MIN_SCL_HTIME+USI_I2C_FS_MIN_SCL_LTIME);
216 			ICLtime = ((1000000/400)*USI_I2C_FS_MIN_SCL_LTIME)/(USI_I2C_FS_MIN_SCL_HTIME+USI_I2C_FS_MIN_SCL_LTIME);
217 
218 			ICHLcnt = (ICHtime * IPClkM)/1000;
219 			USIx->I2C_FS_SCL_CNT = ICHLcnt & USI_I2C_FS_SCL_HCNT;
220 
221 			ICHLcnt = (ICLtime * IPClkM)/1000;
222 			USIx->I2C_FS_SCL_CNT |= (ICHLcnt << 16) & USI_I2C_FS_SCL_LCNT;
223 
224 			ICHtime = ((1000000/I2Clk)*USI_I2C_HS_MIN_SCL_HTIME_100)/(USI_I2C_HS_MIN_SCL_HTIME_100+USI_I2C_HS_MIN_SCL_LTIME_100);
225 			ICLtime = ((1000000/I2Clk)*USI_I2C_HS_MIN_SCL_LTIME_100)/(USI_I2C_HS_MIN_SCL_HTIME_100+USI_I2C_HS_MIN_SCL_LTIME_100);
226 
227 			ICHLcnt = (ICHtime * IPClkM)/1000;
228 			//if (ICHLcnt>8)/*this part is according to the fine-tune result*/
229 			//	ICHLcnt -= 3;
230 			USIx->I2C_HS_SCL_CNT = (ICHLcnt & USI_I2C_HS_SCL_HCNT)+1;
231 
232 			ICHLcnt = (ICLtime * IPClkM)/1000;
233 			//if (ICHLcnt>6)/*this part is according to the fine-tune result*/
234 			//	ICHLcnt -= 6;
235 			USIx->I2C_HS_SCL_CNT |= (ICHLcnt << 16) & USI_I2C_HS_SCL_LCNT;
236 
237 			break;
238 		}
239 
240 		default:
241 		break;
242 	}
243 }
244 
245 /**
246   * @brief  Master transmits the address byte to select the slave device.
247   * @param  USIx: where USIx can be USI0_DEV.
248   * @param  Address: specifies the slave address which will be transmitted
249   * @retval None.
250   */
USI_I2C_SetSlaveAddress(USI_TypeDef * USIx,u16 Address)251 void USI_I2C_SetSlaveAddress(USI_TypeDef *USIx, u16 Address)
252 {
253 	u32 tar = USIx->I2C_TAR & ~(USI_I2C_IC_TAR);
254 
255 	/* Check the parameters */
256 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
257 
258 	/*set target address to generate start signal*/
259 	USIx->I2C_TAR = (Address & USI_I2C_IC_TAR) | tar;
260 }
261 
262 /**
263   * @brief  Checks whether the specified I2C flag is set or not.
264   * @param  USIx: where USIx can be USI0_DEV.
265   * @param  USI_I2C_FLAG: specifies the flag to check.
266   *   This parameter can be one of the following values:
267   *     @arg USI_I2C_BUS_ACTIVITY: BUS FSM Activity Status.
268   *     @arg USI_I2C_SLV_ACTIVITY: Slave FSM Activity Status.
269   *     @arg USI_I2C_MST_ACTIVITY: Master FSM Activity Status.
270   *     @arg USI_I2C_ACTIVITY_COMB: I2C Activity Status, combine Master and Slave.
271   *     @arg USI_I2C_ENABLE_COPY: i2c_enable copy to here
272   * @retval The new state of USI_I2C_FLAG:
273   *          - 1: the specified I2C flag is set
274   *          - 0: the specified I2C flag is not set
275   */
USI_I2C_CheckFlagState(USI_TypeDef * USIx,u32 USI_I2C_FLAG)276 u8 USI_I2C_CheckFlagState(USI_TypeDef *USIx, u32 USI_I2C_FLAG)
277 {
278 	u8 bit_status = 0;
279 
280 	/* Check the parameters */
281 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
282 
283 	if((USIx->I2C_STATUS & USI_I2C_FLAG) != 0)
284 	{
285 		/* USI_I2C_FLAG is set */
286 		bit_status = 1;
287 	}
288 
289 	/* Return the USI_I2C_FLAG status */
290 	return  bit_status;
291 }
292 
293 /**
294   * @brief  Checks whether the specified I2C TXFIFO flag is set or not.
295   * @param  USIx: where USIx can be USI0_DEV.
296   * @param  USI_I2C_TXFIFO_FLAG: specifies the flag to check.
297   *   This parameter can be one of the following values:
298   *     @arg USI_TXFIFO_ALMOST_EMPTY_COPY: TX FIFO ALMOST EMPTY status
299   *     @arg USI_TXFIFO_EMPTY: TX FIFO EMPTY status
300   *     @arg USI_TXFIFO_FULL: TX FIFO FULL status
301   * @retval The new state of USI_I2C_TXFIFO_FLAG:
302   *          - 1: the specified I2C flag is set
303   *          - 0: the specified I2C flag is not set
304   */
USI_I2C_CheckTXFIFOState(USI_TypeDef * USIx,u32 USI_I2C_TXFIFO_FLAG)305 u8 USI_I2C_CheckTXFIFOState(USI_TypeDef *USIx, u32 USI_I2C_TXFIFO_FLAG)
306 {
307 	u8 bit_status = 0;
308 
309 	/* Check the parameters */
310 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
311 
312 	if((USIx->TX_FIFO_STATUS & USI_I2C_TXFIFO_FLAG) != 0)
313 	{
314 		/* USI_I2C_TXFIFO_FLAG is set */
315 		bit_status = 1;
316 	}
317 
318 	/* Return the USI_I2C_TXFIFO_FLAG status */
319 	return  bit_status;
320 }
321 
322 /**
323   * @brief  Checks whether the specified I2C RXFIFO flag is set or not.
324   * @param  USIx: where USIx can be USI0_DEV.
325   * @param  USI_I2C_RXFIFO_FLAG: specifies the flag to check.
326   *   This parameter can be one of the following values:
327   *     @arg USI_RXFIFO_ALMOST_FULL_COPY: RX FIFO ALMOST EMPTY status
328   *     @arg USI_RXFIFO_EMPTY: RX FIFO EMPTY status
329   *     @arg USI_RXFIFO_FULL: RX FIFO FULL status
330   * @retval The new state of USI_I2C_RXFIFO_FLAG:
331   *          - 1: the specified I2C flag is set
332   *          - 0: the specified I2C flag is not set
333   */
USI_I2C_CheckRXFIFOState(USI_TypeDef * USIx,u32 USI_I2C_RXFIFO_FLAG)334 u8 USI_I2C_CheckRXFIFOState(USI_TypeDef *USIx, u32 USI_I2C_RXFIFO_FLAG)
335 {
336 	u8 bit_status = 0;
337 
338 	/* Check the parameters */
339 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
340 
341 	if((USIx->RX_FIFO_STATUS & USI_I2C_RXFIFO_FLAG) != 0)
342 	{
343 		/* USI_I2C_RXFIFO_FLAG is set */
344 		bit_status = 1;
345 	}
346 
347 	/* Return the USI_I2C_RXFIFO_FLAG status */
348 	return  bit_status;
349 }
350 /**
351   * @brief  ENABLE/DISABLE  the I2C's interrupt bits..
352   * @param  USIx: where USIx can be USI0_DEV.
353   * @param  USI_I2C_IT: specifies the USIx interrupt sources to be enabled or disabled.
354   *          This parameter can be one or combinations of the following values:
355   *            @arg USI_I2C_DMA_DONE_INTER_EN: I2C DMA Done Interrupt
356   *            @arg USI_I2C_LP_WAKE_INTER_EN: I2C Low power wakeup Interrupt
357   *            @arg USI_I2C_GEN_CALL_INTER_EN: General Call Interrupt
358   *            @arg USI_I2C_START_DET_INTER_EN: Start or Restart Condition Interrupt
359   *            @arg USI_I2C_STOP_DET_INTER_EN: Stop Condition Interrupt
360   *            @arg USI_I2C_ACTIVITY_INTER_EN: I2C Activity Interrupt
361   *            @arg USI_I2C_RX_DONE_INTER_EN: Slave Transmitter RX Done Interrupt
362   *            @arg USI_I2C_TX_ABRT_INTER_EN: Transmit Abort Interrupt
363   *            @arg USI_I2C_RD_REQ_INTER_EN: Read Request Interrupt
364   *            @arg USI_RXFIFO_UNDERFLOW_INTR_EN: RX FIFO underflow Interrupt
365   *            @arg USI_RXFIFO_OVERFLOW_INTR_EN: RX FIFO overflow Interrupt
366   *            @arg USI_RXFIFO_ALMOST_FULL_INTR_EN: RX FIFO almost Full Interrupt
367   *            @arg USI_TXFIFO_OVERFLOW_INTR_EN: TX FIFO overflow Interrupt
368   *            @arg USI_TXFIFO_ALMOST_EMTY_INTR_EN: TX FIFO almost Empty Interrupt
369   * @param  NewState: specifies the state of the interrupt.
370   *   This parameter can be: ENABLE or DISABLE.
371   * @retval None
372   */
USI_I2C_INTConfig(USI_TypeDef * USIx,u32 USI_I2C_IT,u32 NewState)373 void USI_I2C_INTConfig(USI_TypeDef *USIx, u32 USI_I2C_IT, u32 NewState)
374 {
375 	u32 TempVal = USIx->INTERRUPT_ENABLE;
376 
377 	/* Check the parameters */
378 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
379 
380 	if (NewState == ENABLE) {
381 		TempVal |= USI_I2C_IT;
382 	} else {
383 		TempVal &= ~USI_I2C_IT;
384 	}
385 
386 	USIx->INTERRUPT_ENABLE = TempVal;
387 }
388 
389 /**
390   * @brief  Clears the specified I2C interrupt pending bit.
391   * @param  USIx: where USIx can be USI0_DEV.
392   * @param  INTrBit: specifies the interrupt to be cleared.
393   *          This parameter can be one of the following values:
394   *            @arg USI_I2C_DMA_DONE_CLR: clear I2C DMA Done interrupt
395   *            @arg USI_I2C_LP_WAKE_CLR: clear I2C Low Power wakeup Interrupt
396   *            @arg USI_I2C_GEN_CALL_CLR: clear General Call Interrupt
397   *            @arg USI_I2C_START_DET_CLR: clear Start or Restart Condition Interrupt
398   *            @arg USI_I2C_STOP_DET_CLR: clear Stop Condition Interrupt
399   *            @arg USI_I2C_ACTIVITY_CLR: clear I2C Activity Interrupt
400   *            @arg USI_I2C_RX_DONE_CLR: clear Slave Transmitter RX Done Interrupt
401   *            @arg USI_I2C_TX_ABRT_CLR: clear Transmit Abort Interrupt
402   *            @arg USI_I2C_RD_REQ_CLR: clear Read Request Interrupt
403   *            @arg USI_RXFIFO_UNDERFLOW_CLR: clear RX FIFO underflow Interrupt
404   *            @arg USI_RXFIFO_OVERFLOW_CLR: clear RX FIFO overflow Interrupt
405   *            @arg USI_TXFIFO_OVERFLOW_CLR: clear TX FIFO overflow Interrupt
406   * @note   USI_TXFIFO_ALMOST_EMTY_INTS is automatically cleared by hardware when the buffer
407   *         level goes above the TX_FIFO_CTRL threshold.
408   *         USI_RXFIFO_ALMOST_FULL_INTS is automatically cleared by hardware when the buffer
409   *         level goes below the RX_FIFO_CTRL threshold.
410   * @retval None
411   */
USI_I2C_ClearINT(USI_TypeDef * USIx,u32 INTrBit)412 void USI_I2C_ClearINT(USI_TypeDef *USIx, u32 INTrBit)
413 {
414 	/* Check the parameters */
415 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
416 
417 	/*write 1 to clear all interrupts*/
418 	USIx->INTERRUPT_STATUS_CLR =  INTrBit;
419 }
420 
421 /**
422   * @brief  Clears all of the I2C interrupt pending bit.
423   * @param  USIx: where USIx can be USI0_DEV.
424   * @retval None
425   */
USI_I2C_ClearAllINT(USI_TypeDef * USIx)426 void USI_I2C_ClearAllINT(USI_TypeDef *USIx)
427 {
428 	/* Check the parameters */
429 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
430 
431 	/*write 1 to clear all interrupts*/
432 	USIx->INTERRUPT_ALL_CLR = USI_INT_ALL_CLEAR;
433 }
434 
435 /**
436   * @brief  Get I2C Raw Interrupt Status.
437   * @param  USIx: where USIx can be USI0_DEV.
438   * @retval raw interrupt status
439   */
USI_I2C_GetRawINT(USI_TypeDef * USIx)440 u32 USI_I2C_GetRawINT(USI_TypeDef *USIx)
441 {
442 	/* Check the parameters */
443 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
444 
445 	return USIx->RAW_INTERRUPT_STATUS;
446 }
447 
448 /**
449   * @brief  Get I2C interrupt status.
450   * @param  USIx: where USIx can be USI0_DEV.
451   * @retval interrupt status
452   */
USI_I2C_GetINT(USI_TypeDef * USIx)453 u32 USI_I2C_GetINT(USI_TypeDef *USIx)
454 {
455 	/* Check the parameters */
456 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
457 
458 	return USIx->INTERRUPT_STATUS;
459 }
460 
461 /**
462   * @brief  Master sends single byte through the USIx peripheral according to the set of the upper layer.
463   * @param  USIx: where USIx can be USI0_DEV.
464   * @param  pBuf: point to the data that to be write.
465   * @param  I2CCmd: specifies whether a read from FIFO or a write to FIFO is performed.
466   * @param  I2CStop: specifies whether a STOP is issued after the byte is sent or received.
467   * @param  I2CReSTR: specifies whether a RESTART is issued after the byte is sent or received.
468   * @retval None
469 */
USI_I2C_MasterSendNullData(USI_TypeDef * USIx,u8 * pBuf,u8 I2CCmd,u8 I2CStop,u8 I2CReSTR)470 void USI_I2C_MasterSendNullData(USI_TypeDef *USIx, u8* pBuf, u8  I2CCmd, u8  I2CStop, u8  I2CReSTR)
471 {
472 	/* Check the parameters */
473 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
474 
475 	USIx->TX_FIFO_WRITE = *(pBuf) |
476 		(1 << 11) |
477 		(I2CReSTR << 10) |
478 		(I2CCmd << 8) |
479 		(I2CStop << 9);
480 }
481 
482 /**
483   * @brief  Master sends single byte through the USIx peripheral according to the set of the upper layer.
484   * @param  USIx: where USIx can be USI0_DEV.
485   * @param  pBuf: point to the data that to be write.
486   * @param  I2CCmd: specifies whether a read from FIFO or a write to FIFO is performed.
487   * @param  I2CStop: specifies whether a STOP is issued after the byte is sent or received.
488   * @param  I2CReSTR: specifies whether a RESTART is issued after the byte is sent or received.
489   * @retval None
490 */
USI_I2C_MasterSend(USI_TypeDef * USIx,u8 * pBuf,u8 I2CCmd,u8 I2CStop,u8 I2CReSTR)491 void USI_I2C_MasterSend(USI_TypeDef *USIx, u8* pBuf, u8  I2CCmd, u8  I2CStop, u8  I2CReSTR)
492 {
493 	/* Check the parameters */
494 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
495 
496 	USIx->TX_FIFO_WRITE = *(pBuf) |
497 		(I2CReSTR << 10) |
498 		(I2CCmd << 8) |
499 		(I2CStop << 9);
500 }
501 
502 /**
503   * @brief  Slave sends single byte through the USIx peripheral after receiving read request of Master.
504   * @param  USIx: where USIx can be USI0_DEV.
505   * @param  Data: data to be transmitted.
506   * @param  StopState: specifies whether a STOP is issued after the byte is sent.
507   * @retval None
508   */
USI_I2C_SlaveSend(USI_TypeDef * USIx,u8 Data)509 void USI_I2C_SlaveSend(USI_TypeDef *USIx, u8 Data)
510 {
511 	/* Check the parameters */
512 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
513 
514 	USIx->TX_FIFO_WRITE = Data;
515 }
516 
517 /**
518   * @brief  Returns the most recent received data by the USIx peripheral.
519   * @param  USIx: where USIx can be USI0_DEV.
520   * @retval The value of the received data.
521   */
USI_I2C_ReceiveData(USI_TypeDef * USIx)522 u8 USI_I2C_ReceiveData(USI_TypeDef *USIx)
523 {
524 	/* Check the parameters */
525 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
526 
527 	/* Return the data in the DR register */
528 	return (u8)USIx->RX_FIFO_READ;
529 }
530 
531 /**
532   * @brief  Send data with special length in master mode through the USIx peripheral.
533   * @param  USIx: where USIx can be USI0_DEV.
534   * @param  pBuf: point to the data to be transmitted.
535   * @param	len: the length of data that to be transmitted.
536   * @note  deal with condition that master send address or data while slave no ack
537   * @retval The length of data that have been sent to tx fifo
538   */
USI_I2C_MasterWrite(USI_TypeDef * USIx,u8 * pBuf,u8 len)539 u8 USI_I2C_MasterWrite(USI_TypeDef *USIx, u8* pBuf, u8 len)
540 {
541 	u8 cnt = 0;
542 
543 	/* Check the parameters */
544 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
545 
546 	/* Write in the DR register the data to be sent */
547 	for(cnt = 0; cnt < len; cnt++)
548 	{
549 		while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_ALMOST_EMPTY_COPY)) == 0);
550 
551 		if(cnt >= len - 1)
552 		{
553 			/*generate stop signal*/
554 			USIx->TX_FIFO_WRITE = (*pBuf++) | (1 << 9);
555 		}
556 		else
557 		{
558 			USIx->TX_FIFO_WRITE = (*pBuf++);
559 		}
560 
561 		while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_EMPTY)) == 0) {
562 			if(USI_I2C_GetRawINT(USIx) & USI_I2C_TX_ABRT_RSTS) {
563 				USI_I2C_ClearAllINT(USIx);
564 				return cnt;
565 			}
566 		}
567 	}
568 
569 	return cnt;
570 }
571 
572 /**
573   * @brief  Read data with special length in master mode through the USIx peripheral under in-house IP.
574   * @param  USIx: where USIx can be USI0_DEV.
575   * @param  pBuf: point to the buffer to hold the received data.
576   * @param	len: the length of data that to be received.
577   * @retval The length of data that have received from rx fifo
578   */
USI_I2C_MasterRead(USI_TypeDef * USIx,u8 * pBuf,u8 len)579 u8 USI_I2C_MasterRead(USI_TypeDef *USIx, u8* pBuf, u8 len)
580 {
581 	u8 cnt = 0;
582 
583 	/* Check the parameters */
584 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
585 
586 	/* read in the DR register the data to be received */
587 	for(cnt = 0; cnt < len; cnt++)
588 	{
589 		if(cnt >= len - 1)
590 		{
591 			/* generate stop singal */
592 			USIx->TX_FIFO_WRITE = 0x0003 << 8;
593 		}
594 		else
595 		{
596 			USIx->TX_FIFO_WRITE = 0x0001 << 8;
597 		}
598 
599 		/* wait for USI_I2C_FLAG_RFNE flag */
600 		while((USI_I2C_CheckRXFIFOState(USIx, USI_RXFIFO_EMPTY)) == 1) {
601 			if(USI_I2C_GetRawINT(USIx) & USI_I2C_TX_ABRT_RSTS) {
602 				USI_I2C_ClearAllINT(USIx);
603 				return cnt;
604 			}
605 		}
606 		*pBuf++ = (u8)USIx->RX_FIFO_READ;
607 	}
608 
609 	return cnt;
610 }
611 
612 /**
613   * @brief  Send data with special length in slave mode through the USIx peripheral.
614   * @param  USIx: where USIx can be USI0_DEV.
615   * @param  pBuf: point to the data to be transmitted.
616   * @param	len: the length of data that to be transmitted.
617   * @retval None
618   */
USI_I2C_SlaveWrite(USI_TypeDef * USIx,u8 * pBuf,u8 len)619 void USI_I2C_SlaveWrite(USI_TypeDef *USIx, u8* pBuf, u8 len)
620 {
621 	u8 cnt = 0;
622 
623 	/* Check the parameters */
624 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
625 
626 	for(cnt = 0; cnt < len; cnt++) {
627 		/* Check I2C RD Request flag */
628 		while((USI_I2C_GetRawINT(USIx) & USI_I2C_RD_REQ_RSTS) == 0);
629 
630 		if (USI_I2C_SLAVEWRITE_PATCH) {
631 			USIx->INTERRUPT_STATUS_CLR =  USI_I2C_RD_REQ_CLR;
632 		}
633 		/* Check I2C TX FIFO status */
634 		while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_ALMOST_EMPTY_COPY)) == 0);
635 
636 		USIx->TX_FIFO_WRITE = (*pBuf++);
637 	}
638 	while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_EMPTY)) == 0);
639 }
640 
641 /**
642   * @brief  Read data with special length in slave mode through the USIx peripheral.
643   * @param  USIx: where USIx can be USI0_DEV.
644   * @param  pBuf: point to the buffer to hold the received data.
645   * @param	len: the length of data that to be received.
646   * @retval None
647   */
USI_I2C_SlaveRead(USI_TypeDef * USIx,u8 * pBuf,u8 len)648 void USI_I2C_SlaveRead(USI_TypeDef *USIx, u8* pBuf, u8 len)
649 {
650 	u8 cnt = 0;
651 
652 	/* Check the parameters */
653 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
654 
655 	for(cnt = 0; cnt < len; cnt++) {
656 		/* Check I2C RX FIFO status */
657 		while((USI_I2C_CheckRXFIFOState(USIx, USI_RXFIFO_EMPTY)) == 1);
658 
659 		*pBuf++ = (u8)USIx->RX_FIFO_READ;
660 	}
661 }
662 /**
663   * @brief  Sends data and read data in master mode through the USIx peripheral.
664   * @param  USIx: where USIx can be USI0_DEV to select the I2C peripheral.
665   * @param  pWriteBuf: Byte to be transmitted.
666   * @param  Writelen: Byte number to be transmitted (the length should less then buffer depth for A CUT).
667   * @param  pReadBuf: Byte to be received.
668   * @param  Readlen: Byte number to be received.
669   * @retval None
670   */
USI_I2C_MasterRepeatRead(USI_TypeDef * USIx,u8 * pWriteBuf,u8 Writelen,u8 * pReadBuf,u8 Readlen)671 void USI_I2C_MasterRepeatRead(USI_TypeDef* USIx, u8* pWriteBuf, u8 Writelen, u8* pReadBuf, u8 Readlen)
672 {
673 
674 	u8 cnt = 0;
675 
676 	/* Check the parameters */
677 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
678 
679 	/* write in the DR register the data to be sent */
680 	for(cnt = 0; cnt < Writelen; cnt++)
681 	{
682 		while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_ALMOST_EMPTY_COPY)) == 0);
683 
684 		if(cnt >= Writelen - 1)
685 		{
686 			/*generate restart signal*/
687 			USIx->TX_FIFO_WRITE = (*pWriteBuf++) | (1 << 10);
688 		}
689 		else
690 		{
691 			USIx->TX_FIFO_WRITE = (*pWriteBuf++);
692 		}
693 	}
694 
695 	/*Wait I2C TX FIFO not full*/
696 	while((USI_I2C_CheckTXFIFOState(USIx, USI_TXFIFO_ALMOST_EMPTY_COPY)) == 0);
697 
698 	USI_I2C_MasterRead(USIx, pReadBuf, Readlen);
699 }
700 
701 /**
702   * @brief  Enables or disables the specified I2C peripheral, this is one bit register.
703   * @param  USIx: where USIx can be USI0_DEV.
704   * @param  NewState: new state of the USIx peripheral.
705   *   This parameter can be: ENABLE or DISABLE.
706   * @retval None
707   */
USI_I2C_Cmd(USI_TypeDef * USIx,u8 NewState)708 void USI_I2C_Cmd(USI_TypeDef *USIx, u8 NewState)
709 {
710 	/* Check the parameters */
711 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
712 
713 	if (NewState != DISABLE)
714 	{
715 		/* Enable the selected I2C peripheral */
716 		USIx->I2C_ENABLE |= USI_I2C_ENABLE;
717 	}
718 	else
719 	{
720 		/* Disable the selected I2C peripheral */
721 		USIx->I2C_ENABLE &= ~USI_I2C_ENABLE;
722 	}
723 }
724 
725 /**
726   * @brief  Enable I2C Tx or Rx DMA.
727   * @param  USIx: where USIx can be USI0_DEV.
728   * @param  DmaCtrl: control Transmit DMA Enable or Receive DMA Enable
729   *   This parameter can be one of the following values:
730   *     @arg USI_TX_DMA_ENABLE:
731   *     @arg USI_RX_DMA_ENABLE:
732   * @param  NewState: the new state of the DMA function.
733   *   This parameter can be: ENABLE or DISABLE.
734   * @retval None
735   */
USI_I2C_DMAControl(USI_TypeDef * USIx,u32 DmaCtrl,u8 NewState)736 void USI_I2C_DMAControl(USI_TypeDef *USIx, u32 DmaCtrl, u8 NewState)
737 {
738 	u32  I2CDMAEn = USIx->DMA_ENABLE;
739 
740 	/* Check the parameters */
741 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
742 
743 	if (NewState == ENABLE)
744 		I2CDMAEn |= DmaCtrl;
745 	else
746 		I2CDMAEn &= ~DmaCtrl;
747 
748 	USIx->DMA_ENABLE = I2CDMAEn;
749 }
750 
751 /**
752   * @brief  Initializes the USIx Control Register DMA mode.
753   * @param  USIx: where USIx can be USI0_DEV.
754   * @param  USI_I2C_DmaCmd: Command to control the read or write operation and
755   *         the action after the last data transferred.
756   *          This parameter can be one or combinations of the following values:
757   *            @arg USI_I2C_DMODE_RESTART
758   *            @arg USI_I2C_DMODE_STOP
759   *            @arg USI_I2C_DMODE_WRITE_CMD
760   *            @arg USI_I2C_DMODE_READ_CMD
761   *            @arg USI_I2C_DMODE_ENABLE
762   * @param  USI_I2C_DmaBLen: length of data.
763   * 		This parameter must be set to a value in the 0-0xFFFF range.
764   * @retval None
765   */
USI_I2C_DmaRegModeConfig(USI_TypeDef * USIx,u32 USI_I2C_DmaCmd,u32 USI_I2C_DmaBLen)766 void USI_I2C_DmaRegModeConfig(USI_TypeDef *USIx, u32 USI_I2C_DmaCmd, u32 USI_I2C_DmaBLen)
767 {
768 	/* Check the parameters */
769 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
770 	assert_param(IS_USI_I2C_DMA_DATA_LEN(USI_I2C_DmaBLen));
771 
772 	USIx->I2C_DMA_CMD = ((USI_I2C_DmaBLen << 16) | USI_I2C_DMA_CTRL_REG_MODE | USI_I2C_DmaCmd);
773 }
774 
775 /**
776   * @brief    Init and Enable I2C TX GDMA.
777   * @param  Index: 0 .
778   * @param  GDMA_InitStruct: pointer to a GDMA_InitTypeDef structure that contains
779   *         the configuration information for the GDMA peripheral.
780   * @param  CallbackData: GDMA callback data.
781   * @param  CallbackFunc: GDMA callback function.
782   * @param  pTxBuf: Tx Buffer.
783   * @param  TxCount: Tx Count.
784   * @retval   TRUE/FLASE
785   * @note can not support legacy DMA mode
786   */
USI_I2C_TXGDMA_Init(u8 Index,GDMA_InitTypeDef * GDMA_InitStruct,void * CallbackData,IRQ_FUN CallbackFunc,u8 * pTxBuf,int TxCount)787 BOOL USI_I2C_TXGDMA_Init(
788 	u8 Index,
789 	GDMA_InitTypeDef *GDMA_InitStruct,
790 	void *CallbackData,
791 	IRQ_FUN CallbackFunc,
792 	u8 *pTxBuf,
793 	int TxCount
794 	)
795 {
796 	u8 GdmaChnl;
797 
798 	assert_param(GDMA_InitStruct != NULL);
799 
800 	GdmaChnl = GDMA_ChnlAlloc(0, (IRQ_FUN)CallbackFunc, (u32)CallbackData, 12);
801 	if (GdmaChnl == 0xFF) {
802 		/*  No Available DMA channel */
803 		return _FALSE;
804 	}
805 
806 	_memset((void *)GDMA_InitStruct, 0, sizeof(GDMA_InitTypeDef));
807 
808 	GDMA_InitStruct->MuliBlockCunt     = 0;
809 	GDMA_InitStruct->MaxMuliBlock      = 1;
810 
811 	GDMA_InitStruct->GDMA_DIR      = TTFCMemToPeri;
812 	GDMA_InitStruct->GDMA_DstHandshakeInterface = USI_DEV_TABLE[Index].Tx_HandshakeInterface;
813 	GDMA_InitStruct->GDMA_DstAddr = (u32)&USI_DEV_TABLE[Index].USIx->TX_FIFO_WRITE;
814 	GDMA_InitStruct->GDMA_Index   = 0;
815 	GDMA_InitStruct->GDMA_ChNum       = GdmaChnl;
816 	GDMA_InitStruct->GDMA_IsrType = (BlockType|TransferType|ErrType);
817 
818 	GDMA_InitStruct->GDMA_DstMsize = MsizeFour;
819 	GDMA_InitStruct->GDMA_DstDataWidth = TrWidthOneByte;
820 	GDMA_InitStruct->GDMA_DstInc = NoChange;
821 	GDMA_InitStruct->GDMA_SrcInc = IncType;
822 
823 	if (((TxCount & 0x03)==0) && (((u32)(pTxBuf) & 0x03)==0)) {
824 		/* 4-bytes aligned, move 4 bytes each transfer */
825 		GDMA_InitStruct->GDMA_SrcMsize   = MsizeOne;
826 		GDMA_InitStruct->GDMA_SrcDataWidth = TrWidthFourBytes;
827 		GDMA_InitStruct->GDMA_BlockSize = TxCount >> 2;
828 	} else {
829 		/* move 1 byte each transfer */
830 		GDMA_InitStruct->GDMA_SrcMsize   = MsizeFour;
831 		GDMA_InitStruct->GDMA_SrcDataWidth = TrWidthOneByte;
832 		GDMA_InitStruct->GDMA_BlockSize = TxCount;
833 	}
834 
835 	assert_param(GDMA_InitStruct->GDMA_BlockSize <= 4096);
836 
837 	GDMA_InitStruct->GDMA_SrcAddr = (u32)(pTxBuf);
838 
839 	GDMA_Init(GDMA_InitStruct->GDMA_Index, GDMA_InitStruct->GDMA_ChNum, GDMA_InitStruct);
840 	GDMA_Cmd(GDMA_InitStruct->GDMA_Index, GDMA_InitStruct->GDMA_ChNum, ENABLE);
841 
842 	return _TRUE;
843 }
844 
845 /**
846   * @brief    Init and Enable I2C RX GDMA.
847   * @param  I2C: 0.
848   * @param  GDMA_InitStruct: pointer to a GDMA_InitTypeDef structure that contains
849   *         the configuration information for the GDMA peripheral.
850   * @param  CallbackData: GDMA callback data.
851   * @param  CallbackFunc: GDMA callback function.
852   * @param  pRxBuf: Rx Buffer.
853   * @param  RxCount: Rx Count.
854   * @retval   TRUE/FLASE
855   * @note support Master or Slave RXDMA
856   */
USI_I2C_RXGDMA_Init(u8 Index,GDMA_InitTypeDef * GDMA_InitStruct,void * CallbackData,IRQ_FUN CallbackFunc,u8 * pRxBuf,int RxCount)857 BOOL USI_I2C_RXGDMA_Init(
858 	u8 Index,
859 	GDMA_InitTypeDef *GDMA_InitStruct,
860 	void *CallbackData,
861 	IRQ_FUN CallbackFunc,
862 	u8 *pRxBuf,
863 	int RxCount
864 	)
865 {
866 	u8 GdmaChnl;
867 
868 	assert_param(GDMA_InitStruct != NULL);
869 
870 	GdmaChnl = GDMA_ChnlAlloc(0, (IRQ_FUN)CallbackFunc, (u32)CallbackData, 12);
871 	if (GdmaChnl == 0xFF) {
872 		/* No Available DMA channel */
873 		return _FALSE;
874 	}
875 
876 	_memset((void *)GDMA_InitStruct, 0, sizeof(GDMA_InitTypeDef));
877 
878 	GDMA_InitStruct->GDMA_DIR      = TTFCPeriToMem;
879 	GDMA_InitStruct->GDMA_ReloadSrc = 0;
880 	GDMA_InitStruct->GDMA_SrcHandshakeInterface  = USI_DEV_TABLE[Index].Rx_HandshakeInterface;
881 	GDMA_InitStruct->GDMA_SrcAddr = (u32)&USI_DEV_TABLE[Index].USIx->RX_FIFO_READ;
882 	GDMA_InitStruct->GDMA_Index = 0;
883 	GDMA_InitStruct->GDMA_ChNum       = GdmaChnl;
884 	GDMA_InitStruct->GDMA_IsrType = (BlockType|TransferType|ErrType);
885 	GDMA_InitStruct->GDMA_SrcMsize = MsizeFour;
886 	GDMA_InitStruct->GDMA_SrcDataWidth = TrWidthOneByte;
887 	GDMA_InitStruct->GDMA_DstInc = IncType;
888 	GDMA_InitStruct->GDMA_SrcInc = NoChange;
889 
890 	if (((u32)(pRxBuf) & 0x03)==0) {
891 		/*	4-bytes aligned, move 4 bytes each DMA transaction */
892 		GDMA_InitStruct->GDMA_DstMsize	 = MsizeOne;
893 		GDMA_InitStruct->GDMA_DstDataWidth = TrWidthFourBytes;
894 	} else {
895 		/*	move 1 byte each DMA transaction */
896 		GDMA_InitStruct->GDMA_DstMsize	 = MsizeFour;
897 		GDMA_InitStruct->GDMA_DstDataWidth = TrWidthOneByte;
898 	}
899 
900 	GDMA_InitStruct->GDMA_BlockSize = RxCount;
901 	GDMA_InitStruct->GDMA_DstAddr = (u32)(pRxBuf);
902 
903 	assert_param(GDMA_InitStruct->GDMA_BlockSize <= 4096);
904 
905 	/* multi block close */
906 	GDMA_InitStruct->MuliBlockCunt     = 0;
907 	GDMA_InitStruct->GDMA_ReloadSrc = 0;
908 	GDMA_InitStruct->MaxMuliBlock = 1;
909 
910 	GDMA_Init(GDMA_InitStruct->GDMA_Index, GDMA_InitStruct->GDMA_ChNum, GDMA_InitStruct);
911 	GDMA_Cmd(GDMA_InitStruct->GDMA_Index, GDMA_InitStruct->GDMA_ChNum, ENABLE);
912 
913 	return _TRUE;
914 }
915 
916 /**
917   * @brief  Clock-gated I2C clock domain for address matching interrupts wake up.
918   * @param  USIx: where USIx can be USI0_DEV.
919   * @param  NewState: the new state of the Rx Path.
920   *              This parameter can be: ENABLE or DISABLE.
921   * @retval None
922   */
USI_I2C_Sleep_Cmd(USI_TypeDef * USIx,u32 NewStatus)923 void USI_I2C_Sleep_Cmd(USI_TypeDef *USIx, u32 NewStatus)
924 {
925 	/* Check the parameters */
926 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
927 
928 	if (NewStatus != DISABLE) {
929 		USI_I2C_INTConfig(USIx, USI_I2C_LP_WAKE_INTER_EN, ENABLE);
930 
931 		USIx->I2C_DIG_FILTER &= ~ USI_I2C_DIG_FLTR_SEL;
932 		USIx->I2C_CTRL &= ~(USI_I2C_SLV_DISABLE);
933 		USIx->I2C_ENABLE |= USI_I2C_SLEEP;
934 	} else {
935 		USI_I2C_INTConfig(USIx, USI_I2C_LP_WAKE_INTER_EN, DISABLE);
936 
937 		USIx->I2C_DIG_FILTER |=  USI_I2C_DIG_FLTR_SEL;
938 		USIx->I2C_ENABLE &= ~USI_I2C_SLEEP;
939 	}
940 }
941 
942 /**
943   * @brief  Wake up clock domain of Clock-gated I2C after address matching interrupts.
944   * @param  USIx: where USIx can be USI0_DEV.
945   * @retval None
946   */
USI_I2C_WakeUp(USI_TypeDef * USIx)947 void USI_I2C_WakeUp(USI_TypeDef *USIx)
948 {
949 	/* Check the parameters */
950 	assert_param(IS_USI_I2C_ALL_PERIPH(USIx));
951 
952 	USI_I2C_ClearINT(USIx, USI_I2C_LP_WAKE_CLR);
953 
954 	USI_I2C_Sleep_Cmd(USIx, DISABLE);
955 }
956 
957 /******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/
958 
959