1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
93*53ee8cc1Swenshuai.xi #define _HAL_HWI2C_C
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi /// @file halHWI2C.c
97*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
98*53ee8cc1Swenshuai.xi /// @brief DRAM byte DMA control driver
99*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
102*53ee8cc1Swenshuai.xi // Header Files
103*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
104*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
105*53ee8cc1Swenshuai.xi #include <linux/string.h>
106*53ee8cc1Swenshuai.xi #else
107*53ee8cc1Swenshuai.xi #include <string.h>
108*53ee8cc1Swenshuai.xi #endif
109*53ee8cc1Swenshuai.xi #include "MsCommon.h"
110*53ee8cc1Swenshuai.xi #include "MsTypes.h"
111*53ee8cc1Swenshuai.xi #include "halHWI2C.h"
112*53ee8cc1Swenshuai.xi #include "halCHIP.h"
113*53ee8cc1Swenshuai.xi #include "regHWI2C.h"
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
116*53ee8cc1Swenshuai.xi // Define & data type
117*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
118*53ee8cc1Swenshuai.xi #define HWI2C_HAL_RETRY_TIMES (3)
119*53ee8cc1Swenshuai.xi #define HWI2C_HAL_WAIT_TIMEOUT 30000//(1500)
120*53ee8cc1Swenshuai.xi #define HWI2C_HAL_FUNC() //{printf("%s\n", __FUNCTION__);}
121*53ee8cc1Swenshuai.xi #define HWI2C_HAL_INFO(x, args...) //{printf(x, ##args);}
122*53ee8cc1Swenshuai.xi #define HWI2C_HAL_ERR(x, args...) //{printf(x, ##args);}
123*53ee8cc1Swenshuai.xi #ifndef UNUSED
124*53ee8cc1Swenshuai.xi #define UNUSED(x) ((x)=(x))
125*53ee8cc1Swenshuai.xi #endif
126*53ee8cc1Swenshuai.xi
127*53ee8cc1Swenshuai.xi #define HWI2C_DMA_CMD_DATA_LEN 7
128*53ee8cc1Swenshuai.xi #define HWI2C_DMA_WAIT_TIMEOUT (30000)
129*53ee8cc1Swenshuai.xi #define HWI2C_DMA_WRITE 0
130*53ee8cc1Swenshuai.xi #define HWI2C_DMA_READ 1
131*53ee8cc1Swenshuai.xi #define _PA2VA(x) (MS_VIRT)MsOS_PA2KSEG1((x))
132*53ee8cc1Swenshuai.xi #define _VA2PA(x) (MS_VIRT)MsOS_VA2PA((x))
133*53ee8cc1Swenshuai.xi
134*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
135*53ee8cc1Swenshuai.xi // Local variable
136*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
137*53ee8cc1Swenshuai.xi static MS_VIRT _gMIO_MapBase = 0;
138*53ee8cc1Swenshuai.xi static MS_BOOL g_bLastByte[HAL_HWI2C_PORTS];
139*53ee8cc1Swenshuai.xi static MS_VIRT g_u32DmaPhyAddr[HAL_HWI2C_PORTS];
140*53ee8cc1Swenshuai.xi static HAL_HWI2C_PortCfg g_stPortCfg[HAL_HWI2C_PORTS];
141*53ee8cc1Swenshuai.xi static MS_U16 g_u16DmaDelayFactor[HAL_HWI2C_PORTS];
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
145*53ee8cc1Swenshuai.xi // Extern Function
146*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
149*53ee8cc1Swenshuai.xi // Function Declaration
150*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
153*53ee8cc1Swenshuai.xi // Local Function
154*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
155*53ee8cc1Swenshuai.xi
156*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
157*53ee8cc1Swenshuai.xi // Global Function
158*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_ExtraDelay(MS_U32 u32Us)159*53ee8cc1Swenshuai.xi void HAL_HWI2C_ExtraDelay(MS_U32 u32Us)
160*53ee8cc1Swenshuai.xi {
161*53ee8cc1Swenshuai.xi // volatile is necessary to avoid optimization
162*53ee8cc1Swenshuai.xi MS_U32 volatile u32Dummy = 0;
163*53ee8cc1Swenshuai.xi //MS_U32 u32Loop;
164*53ee8cc1Swenshuai.xi MS_U32 volatile u32Loop;
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi u32Loop = (MS_U32)(50 * u32Us);
167*53ee8cc1Swenshuai.xi while (u32Loop--)
168*53ee8cc1Swenshuai.xi {
169*53ee8cc1Swenshuai.xi u32Dummy++;
170*53ee8cc1Swenshuai.xi }
171*53ee8cc1Swenshuai.xi }
172*53ee8cc1Swenshuai.xi
173*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
174*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_SetIOMapBase
175*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Dump bdma all register
176*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
177*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
178*53ee8cc1Swenshuai.xi /// @param <RET> \b None :
179*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_SetIOMapBase(MS_VIRT u32Base)180*53ee8cc1Swenshuai.xi void HAL_HWI2C_SetIOMapBase(MS_VIRT u32Base)
181*53ee8cc1Swenshuai.xi {
182*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
183*53ee8cc1Swenshuai.xi
184*53ee8cc1Swenshuai.xi _gMIO_MapBase = u32Base;
185*53ee8cc1Swenshuai.xi HWI2C_HAL_INFO("HWI2C IOMap base:%8lx Reg offset:%4x\n", u32Base, (MS_U16)HWI2C_REG_BASE);
186*53ee8cc1Swenshuai.xi }
187*53ee8cc1Swenshuai.xi
188*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
189*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_ReadByte
190*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: read 1 Byte data
191*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
192*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
193*53ee8cc1Swenshuai.xi /// @param <RET> \b MS_U8
194*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_ReadByte(MS_VIRT u32RegAddr)195*53ee8cc1Swenshuai.xi MS_U8 HAL_HWI2C_ReadByte(MS_VIRT u32RegAddr)
196*53ee8cc1Swenshuai.xi {
197*53ee8cc1Swenshuai.xi return ((volatile MS_U8*)(_gMIO_MapBase))[(u32RegAddr << 1) - (u32RegAddr & 1)];
198*53ee8cc1Swenshuai.xi }
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
201*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Read4Byte
202*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: read 2 Byte data
203*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
204*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
205*53ee8cc1Swenshuai.xi /// @param <RET> \b MS_U16
206*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Read2Byte(MS_U32 u32RegAddr)207*53ee8cc1Swenshuai.xi MS_U16 HAL_HWI2C_Read2Byte(MS_U32 u32RegAddr)
208*53ee8cc1Swenshuai.xi {
209*53ee8cc1Swenshuai.xi return ((volatile MS_U16*)(_gMIO_MapBase))[u32RegAddr];
210*53ee8cc1Swenshuai.xi }
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
213*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Read4Byte
214*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: read 4 Byte data
215*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
216*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
217*53ee8cc1Swenshuai.xi /// @param <RET> \b MS_U32
218*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Read4Byte(MS_U32 u32RegAddr)219*53ee8cc1Swenshuai.xi MS_U32 HAL_HWI2C_Read4Byte(MS_U32 u32RegAddr)
220*53ee8cc1Swenshuai.xi {
221*53ee8cc1Swenshuai.xi return (HAL_HWI2C_Read2Byte(u32RegAddr) | HAL_HWI2C_Read2Byte(u32RegAddr+2) << 16);
222*53ee8cc1Swenshuai.xi }
223*53ee8cc1Swenshuai.xi
224*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
225*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_WriteByte
226*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: write 1 Byte data
227*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
228*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Val : 1 byte data
229*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
230*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
231*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_WriteByte(MS_U32 u32RegAddr,MS_U8 u8Val)232*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_WriteByte(MS_U32 u32RegAddr, MS_U8 u8Val)
233*53ee8cc1Swenshuai.xi {
234*53ee8cc1Swenshuai.xi if (!u32RegAddr)
235*53ee8cc1Swenshuai.xi {
236*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("%s reg error!\n", __FUNCTION__);
237*53ee8cc1Swenshuai.xi return FALSE;
238*53ee8cc1Swenshuai.xi }
239*53ee8cc1Swenshuai.xi
240*53ee8cc1Swenshuai.xi ((volatile MS_U8*)(_gMIO_MapBase))[(u32RegAddr << 1) - (u32RegAddr & 1)] = u8Val;
241*53ee8cc1Swenshuai.xi return TRUE;
242*53ee8cc1Swenshuai.xi }
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
245*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Write2Byte
246*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: write 2 Byte data
247*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
248*53ee8cc1Swenshuai.xi /// @param <IN> \b u16Val : 2 byte data
249*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
250*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
251*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Write2Byte(MS_U32 u32RegAddr,MS_U16 u16Val)252*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Write2Byte(MS_U32 u32RegAddr, MS_U16 u16Val)
253*53ee8cc1Swenshuai.xi {
254*53ee8cc1Swenshuai.xi if (!u32RegAddr)
255*53ee8cc1Swenshuai.xi {
256*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("%s reg error!\n", __FUNCTION__);
257*53ee8cc1Swenshuai.xi return FALSE;
258*53ee8cc1Swenshuai.xi }
259*53ee8cc1Swenshuai.xi
260*53ee8cc1Swenshuai.xi ((volatile MS_U16*)(_gMIO_MapBase))[u32RegAddr] = u16Val;
261*53ee8cc1Swenshuai.xi return TRUE;
262*53ee8cc1Swenshuai.xi }
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
265*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Write4Byte
266*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: write 4 Byte data
267*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
268*53ee8cc1Swenshuai.xi /// @param <IN> \b u32Val : 4 byte data
269*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
270*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
271*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Write4Byte(MS_U32 u32RegAddr,MS_U32 u32Val)272*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Write4Byte(MS_U32 u32RegAddr, MS_U32 u32Val)
273*53ee8cc1Swenshuai.xi {
274*53ee8cc1Swenshuai.xi if (!u32RegAddr)
275*53ee8cc1Swenshuai.xi {
276*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("%s reg error!\n", __FUNCTION__);
277*53ee8cc1Swenshuai.xi return FALSE;
278*53ee8cc1Swenshuai.xi }
279*53ee8cc1Swenshuai.xi
280*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(u32RegAddr, u32Val & 0x0000FFFF);
281*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(u32RegAddr+2, u32Val >> 16);
282*53ee8cc1Swenshuai.xi return TRUE;
283*53ee8cc1Swenshuai.xi }
284*53ee8cc1Swenshuai.xi
285*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
286*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_WriteRegBit
287*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: write 1 Byte data
288*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
289*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Val : 1 byte data
290*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
291*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
292*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_WriteRegBit(MS_U32 u32RegAddr,MS_U8 u8Mask,MS_BOOL bEnable)293*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_WriteRegBit(MS_U32 u32RegAddr, MS_U8 u8Mask, MS_BOOL bEnable)
294*53ee8cc1Swenshuai.xi {
295*53ee8cc1Swenshuai.xi MS_U8 u8Val = 0;
296*53ee8cc1Swenshuai.xi
297*53ee8cc1Swenshuai.xi if (!u32RegAddr)
298*53ee8cc1Swenshuai.xi {
299*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("%s reg error!\n", __FUNCTION__);
300*53ee8cc1Swenshuai.xi return FALSE;
301*53ee8cc1Swenshuai.xi }
302*53ee8cc1Swenshuai.xi
303*53ee8cc1Swenshuai.xi u8Val = HAL_HWI2C_ReadByte(u32RegAddr);
304*53ee8cc1Swenshuai.xi u8Val = (bEnable) ? (u8Val | u8Mask) : (u8Val & ~u8Mask);
305*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByte(u32RegAddr, u8Val);
306*53ee8cc1Swenshuai.xi return TRUE;
307*53ee8cc1Swenshuai.xi }
308*53ee8cc1Swenshuai.xi
309*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_WriteByteMask
311*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: write data with mask bits
312*53ee8cc1Swenshuai.xi /// @param <IN> \b u32RegAddr: register address
313*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Val : 1 byte data
314*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Mask : mask bits
315*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
316*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
317*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_WriteByteMask(MS_U32 u32RegAddr,MS_U8 u8Val,MS_U8 u8Mask)318*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_WriteByteMask(MS_U32 u32RegAddr, MS_U8 u8Val, MS_U8 u8Mask)
319*53ee8cc1Swenshuai.xi {
320*53ee8cc1Swenshuai.xi if (!u32RegAddr)
321*53ee8cc1Swenshuai.xi {
322*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("%s reg error!\n", __FUNCTION__);
323*53ee8cc1Swenshuai.xi return FALSE;
324*53ee8cc1Swenshuai.xi }
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi u8Val = (HAL_HWI2C_ReadByte(u32RegAddr) & ~u8Mask) | (u8Val & u8Mask);
327*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByte(u32RegAddr, u8Val);
328*53ee8cc1Swenshuai.xi return TRUE;
329*53ee8cc1Swenshuai.xi }
330*53ee8cc1Swenshuai.xi
331*53ee8cc1Swenshuai.xi //#####################
332*53ee8cc1Swenshuai.xi //
333*53ee8cc1Swenshuai.xi // MIIC STD Related Functions
334*53ee8cc1Swenshuai.xi // Static or Internal use
335*53ee8cc1Swenshuai.xi //
336*53ee8cc1Swenshuai.xi //#####################
337*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
338*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnINT
339*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable Interrupt
340*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
341*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
342*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
343*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_EnINT(MS_U32 u32PortOffset,MS_BOOL bEnable)344*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnINT(MS_U32 u32PortOffset, MS_BOOL bEnable)
345*53ee8cc1Swenshuai.xi {
346*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
347*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_INT, bEnable);
348*53ee8cc1Swenshuai.xi }
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
351*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnDMA
352*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable DMA
353*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
354*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
355*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
356*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_EnDMA(MS_U32 u32PortOffset,MS_BOOL bEnable)357*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnDMA(MS_U32 u32PortOffset, MS_BOOL bEnable)
358*53ee8cc1Swenshuai.xi {
359*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
360*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_DMA, bEnable);
361*53ee8cc1Swenshuai.xi }
362*53ee8cc1Swenshuai.xi
363*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
364*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnClkStretch
365*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable Clock Stretch
366*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
367*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
368*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
369*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_EnClkStretch(MS_U32 u32PortOffset,MS_BOOL bEnable)370*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnClkStretch(MS_U32 u32PortOffset, MS_BOOL bEnable)
371*53ee8cc1Swenshuai.xi {
372*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
373*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_CLKSTR, bEnable);
374*53ee8cc1Swenshuai.xi }
375*53ee8cc1Swenshuai.xi
376*53ee8cc1Swenshuai.xi #if 0//RFU
377*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
378*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnTimeoutINT
379*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable Timeout Interrupt
380*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
381*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
382*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
383*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
384*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnTimeoutINT(MS_U32 u32PortOffset, MS_BOOL bEnable)
385*53ee8cc1Swenshuai.xi {
386*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
387*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_TMTINT, bEnable);
388*53ee8cc1Swenshuai.xi }
389*53ee8cc1Swenshuai.xi #endif
390*53ee8cc1Swenshuai.xi
391*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
392*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnFilter
393*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable Filter
394*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
395*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
396*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
397*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_EnFilter(MS_U32 u32PortOffset,MS_BOOL bEnable)398*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnFilter(MS_U32 u32PortOffset, MS_BOOL bEnable)
399*53ee8cc1Swenshuai.xi {
400*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
401*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_FILTER, bEnable);
402*53ee8cc1Swenshuai.xi }
403*53ee8cc1Swenshuai.xi
404*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
405*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_EnPushSda
406*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable push current for SDA
407*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: Enable, FALSE: Disable
408*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
409*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
410*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_EnPushSda(MS_U32 u32PortOffset,MS_BOOL bEnable)411*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_EnPushSda(MS_U32 u32PortOffset, MS_BOOL bEnable)
412*53ee8cc1Swenshuai.xi {
413*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
414*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_EN_PUSH1T, bEnable);
415*53ee8cc1Swenshuai.xi }
416*53ee8cc1Swenshuai.xi
417*53ee8cc1Swenshuai.xi //#####################
418*53ee8cc1Swenshuai.xi //
419*53ee8cc1Swenshuai.xi // MIIC DMA Related Functions
420*53ee8cc1Swenshuai.xi // Static or Internal use
421*53ee8cc1Swenshuai.xi //
422*53ee8cc1Swenshuai.xi //#####################
423*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
424*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetINT
425*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Initialize HWI2C DMA
426*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: enable INT, FALSE: disable INT
427*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
428*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
429*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetINT(MS_U32 u32PortOffset,MS_BOOL bEnable)430*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetINT(MS_U32 u32PortOffset, MS_BOOL bEnable)
431*53ee8cc1Swenshuai.xi {
432*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
433*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CFG+u32PortOffset, _DMA_CFG_INTEN, bEnable);
434*53ee8cc1Swenshuai.xi }
435*53ee8cc1Swenshuai.xi
436*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
437*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_Reset
438*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Reset HWI2C DMA
439*53ee8cc1Swenshuai.xi /// @param <IN> \b bReset : TRUE: Not Reset FALSE: Reset
440*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
441*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
442*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_Reset(MS_U32 u32PortOffset,MS_BOOL bReset)443*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_Reset(MS_U32 u32PortOffset, MS_BOOL bReset)
444*53ee8cc1Swenshuai.xi {
445*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
446*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CFG+u32PortOffset, _DMA_CFG_RESET, bReset);
447*53ee8cc1Swenshuai.xi }
448*53ee8cc1Swenshuai.xi
449*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
450*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_MiuReset
451*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Reset HWI2C DMA MIU
452*53ee8cc1Swenshuai.xi /// @param <IN> \b bReset : TRUE: Not Reset FALSE: Reset
453*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
454*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
455*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_MiuReset(MS_U32 u32PortOffset,MS_BOOL bReset)456*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_MiuReset(MS_U32 u32PortOffset, MS_BOOL bReset)
457*53ee8cc1Swenshuai.xi {
458*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
459*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CFG+u32PortOffset, _DMA_CFG_MIURST, bReset);
460*53ee8cc1Swenshuai.xi }
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
463*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetMiuPri
464*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set HWI2C DMA MIU Priority
465*53ee8cc1Swenshuai.xi /// @param <IN> \b eMiuPri : E_HAL_HWI2C_DMA_PRI_LOW, E_HAL_HWI2C_DMA_PRI_HIGH
466*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
467*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
468*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetMiuPri(MS_U32 u32PortOffset,HAL_HWI2C_DMA_MIUPRI eMiuPri)469*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetMiuPri(MS_U32 u32PortOffset, HAL_HWI2C_DMA_MIUPRI eMiuPri)
470*53ee8cc1Swenshuai.xi {
471*53ee8cc1Swenshuai.xi MS_BOOL bHighPri;
472*53ee8cc1Swenshuai.xi
473*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
474*53ee8cc1Swenshuai.xi if(eMiuPri>=E_HAL_HWI2C_DMA_PRI_MAX)
475*53ee8cc1Swenshuai.xi return FALSE;
476*53ee8cc1Swenshuai.xi bHighPri = (eMiuPri==E_HAL_HWI2C_DMA_PRI_HIGH)? TRUE : FALSE;
477*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CFG+u32PortOffset, _DMA_CFG_MIUPRI, bHighPri);
478*53ee8cc1Swenshuai.xi }
479*53ee8cc1Swenshuai.xi
480*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
481*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetMiuAddr
482*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set HWI2C DMA MIU Address
483*53ee8cc1Swenshuai.xi /// @param <IN> \b u32MiuAddr : MIU Address
484*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
485*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
486*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetMiuAddr(MS_U32 u32PortOffset,MS_U32 u32MiuAddr)487*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetMiuAddr(MS_U32 u32PortOffset, MS_U32 u32MiuAddr)
488*53ee8cc1Swenshuai.xi {
489*53ee8cc1Swenshuai.xi MS_U8 u8Port;
490*53ee8cc1Swenshuai.xi MS_U32 u32StartOffset;
491*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
492*53ee8cc1Swenshuai.xi
493*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
494*53ee8cc1Swenshuai.xi
495*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
496*53ee8cc1Swenshuai.xi return FALSE;
497*53ee8cc1Swenshuai.xi g_u32DmaPhyAddr[u8Port] = u32MiuAddr;
498*53ee8cc1Swenshuai.xi
499*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32StartOffset, u32MiuAddr);
500*53ee8cc1Swenshuai.xi
501*53ee8cc1Swenshuai.xi return HAL_HWI2C_Write4Byte(REG_HWI2C_DMA_MIU_ADR+u32PortOffset, u32StartOffset);
502*53ee8cc1Swenshuai.xi }
503*53ee8cc1Swenshuai.xi
504*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
505*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_Trigger
506*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Trigger HWI2C DMA
507*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
508*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
509*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
510*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_Trigger(MS_U32 u32PortOffset)511*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_Trigger(MS_U32 u32PortOffset)
512*53ee8cc1Swenshuai.xi {
513*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
514*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CTL_TRIG+u32PortOffset, _DMA_CTL_TRIG, TRUE);
515*53ee8cc1Swenshuai.xi }
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi #if 0 //will be used later
518*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
519*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_ReTrigger
520*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Re-Trigger HWI2C DMA
521*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
522*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
523*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
524*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
525*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_ReTrigger(MS_U32 u32PortOffset)
526*53ee8cc1Swenshuai.xi {
527*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
528*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CTL+u32PortOffset, _DMA_CTL_RETRIG, TRUE);
529*53ee8cc1Swenshuai.xi }
530*53ee8cc1Swenshuai.xi #endif
531*53ee8cc1Swenshuai.xi
532*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
533*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetTxfrStop
534*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Control HWI2C DMA Transfer Format with or w/o STOP
535*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: with STOP, FALSE: without STOP
536*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
537*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
538*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetTxfrStop(MS_U32 u32PortOffset,MS_BOOL bEnable)539*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetTxfrStop(MS_U32 u32PortOffset, MS_BOOL bEnable)
540*53ee8cc1Swenshuai.xi {
541*53ee8cc1Swenshuai.xi MS_BOOL bTxNoStop;
542*53ee8cc1Swenshuai.xi
543*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
544*53ee8cc1Swenshuai.xi bTxNoStop = (bEnable)? FALSE : TRUE;
545*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CTL+u32PortOffset, _DMA_CTL_TXNOSTOP, bTxNoStop);
546*53ee8cc1Swenshuai.xi }
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
549*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetReadMode
550*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Control HWI2C DMA Transfer Format with or w/o STOP
551*53ee8cc1Swenshuai.xi /// @param <IN> \b eReadMode : E_HAL_HWI2C_DMA_READ_NOSTOP, E_HAL_HWI2C_DMA_READ_STOP
552*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
553*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
554*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetReadMode(MS_U32 u32PortOffset,HAL_HWI2C_ReadMode eReadMode)555*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetReadMode(MS_U32 u32PortOffset, HAL_HWI2C_ReadMode eReadMode)
556*53ee8cc1Swenshuai.xi {
557*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
558*53ee8cc1Swenshuai.xi if(eReadMode>=E_HAL_HWI2C_READ_MODE_MAX)
559*53ee8cc1Swenshuai.xi return FALSE;
560*53ee8cc1Swenshuai.xi if(eReadMode==E_HAL_HWI2C_READ_MODE_DIRECTION_CHANGE)
561*53ee8cc1Swenshuai.xi return HAL_HWI2C_DMA_SetTxfrStop(u32PortOffset, FALSE);
562*53ee8cc1Swenshuai.xi else
563*53ee8cc1Swenshuai.xi if(eReadMode==E_HAL_HWI2C_READ_MODE_DIRECTION_CHANGE_STOP_START)
564*53ee8cc1Swenshuai.xi return HAL_HWI2C_DMA_SetTxfrStop(u32PortOffset, TRUE);
565*53ee8cc1Swenshuai.xi else
566*53ee8cc1Swenshuai.xi return FALSE;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi
569*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
570*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetRdWrt
571*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Control HWI2C DMA Read or Write
572*53ee8cc1Swenshuai.xi /// @param <IN> \b bRdWrt : TRUE: read ,FALSE: write
573*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
574*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
575*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetRdWrt(MS_U32 u32PortOffset,MS_BOOL bRdWrt)576*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetRdWrt(MS_U32 u32PortOffset, MS_BOOL bRdWrt)
577*53ee8cc1Swenshuai.xi {
578*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
579*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CTL+u32PortOffset, _DMA_CTL_RDWTCMD, bRdWrt);
580*53ee8cc1Swenshuai.xi }
581*53ee8cc1Swenshuai.xi
582*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
583*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetMiuChannel
584*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Control HWI2C DMA MIU channel
585*53ee8cc1Swenshuai.xi /// @param <IN> \b u8MiuCh : E_HAL_HWI2C_DMA_MIU_CH0 , E_HAL_HWI2C_DMA_MIU_CH1
586*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
587*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
588*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetMiuChannel(MS_U32 u32PortOffset,HAL_HWI2C_DMA_MIUCH eMiuCh)589*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetMiuChannel(MS_U32 u32PortOffset, HAL_HWI2C_DMA_MIUCH eMiuCh)
590*53ee8cc1Swenshuai.xi {
591*53ee8cc1Swenshuai.xi MS_BOOL bMiuCh1;
592*53ee8cc1Swenshuai.xi
593*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
594*53ee8cc1Swenshuai.xi if(eMiuCh>=E_HAL_HWI2C_DMA_MIU_MAX)
595*53ee8cc1Swenshuai.xi return FALSE;
596*53ee8cc1Swenshuai.xi bMiuCh1 = (eMiuCh==E_HAL_HWI2C_DMA_MIU_CH1)? TRUE : FALSE;
597*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_CTL+u32PortOffset, _DMA_CTL_MIUCHSEL, bMiuCh1);
598*53ee8cc1Swenshuai.xi }
599*53ee8cc1Swenshuai.xi
600*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
601*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_TxfrDone
602*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable interrupt for HWI2C
603*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
604*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
605*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
606*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_TxfrDone(MS_U32 u32PortOffset)607*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_TxfrDone(MS_U32 u32PortOffset)
608*53ee8cc1Swenshuai.xi {
609*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
610*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_TXR+u32PortOffset, _DMA_TXR_DONE, TRUE);
611*53ee8cc1Swenshuai.xi }
612*53ee8cc1Swenshuai.xi
613*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
614*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_IsTxfrDone
615*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check HWI2C DMA Tx done or not
616*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
617*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
618*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: DMA TX Done, FALSE: DMA TX Not Done
619*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_IsTxfrDone(MS_U32 u32PortOffset,MS_U8 u8Port)620*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_IsTxfrDone(MS_U32 u32PortOffset, MS_U8 u8Port)
621*53ee8cc1Swenshuai.xi {
622*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
623*53ee8cc1Swenshuai.xi //##########################
624*53ee8cc1Swenshuai.xi //
625*53ee8cc1Swenshuai.xi // [Note] : IMPORTANT !!!
626*53ee8cc1Swenshuai.xi // Need to put some delay here,
627*53ee8cc1Swenshuai.xi // Otherwise, reading data will fail
628*53ee8cc1Swenshuai.xi //
629*53ee8cc1Swenshuai.xi //##########################
630*53ee8cc1Swenshuai.xi if(u8Port>=HAL_HWI2C_PORTS)
631*53ee8cc1Swenshuai.xi return FALSE;
632*53ee8cc1Swenshuai.xi HAL_HWI2C_ExtraDelay(g_u16DmaDelayFactor[u8Port]);
633*53ee8cc1Swenshuai.xi return (HAL_HWI2C_ReadByte(REG_HWI2C_DMA_TXR+u32PortOffset) & _DMA_TXR_DONE) ? TRUE : FALSE;
634*53ee8cc1Swenshuai.xi }
635*53ee8cc1Swenshuai.xi
636*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
637*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetTxfrCmd
638*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set Transfer HWI2C DMA Command & Length
639*53ee8cc1Swenshuai.xi /// @param <IN> \b pu8CmdBuf : data pointer
640*53ee8cc1Swenshuai.xi /// @param <IN> \b u8CmdLen : command length
641*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
642*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: cmd len in range, FALSE: cmd len out of range
643*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetTxfrCmd(MS_U32 u32PortOffset,MS_U8 u8CmdLen,MS_U8 * pu8CmdBuf)644*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetTxfrCmd(MS_U32 u32PortOffset, MS_U8 u8CmdLen, MS_U8* pu8CmdBuf)
645*53ee8cc1Swenshuai.xi {
646*53ee8cc1Swenshuai.xi MS_U8 k,u8CmdData;
647*53ee8cc1Swenshuai.xi MS_U32 u32RegAdr;
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
650*53ee8cc1Swenshuai.xi if(u8CmdLen>HWI2C_DMA_CMD_DATA_LEN)
651*53ee8cc1Swenshuai.xi return FALSE;
652*53ee8cc1Swenshuai.xi for( k=0 ; (k<u8CmdLen)&&(k<HWI2C_DMA_CMD_DATA_LEN); k++ )
653*53ee8cc1Swenshuai.xi {
654*53ee8cc1Swenshuai.xi u32RegAdr = REG_HWI2C_DMA_CMDDAT0 + k;
655*53ee8cc1Swenshuai.xi u8CmdData = *(pu8CmdBuf + k);
656*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByte(u32RegAdr+u32PortOffset, u8CmdData);
657*53ee8cc1Swenshuai.xi }
658*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByte(REG_HWI2C_DMA_CMDLEN+u32PortOffset, u8CmdLen&_DMA_CMDLEN_MSK);
659*53ee8cc1Swenshuai.xi return TRUE;
660*53ee8cc1Swenshuai.xi }
661*53ee8cc1Swenshuai.xi
662*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
663*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetCmdLen
664*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set HWI2C DMA MIU command length
665*53ee8cc1Swenshuai.xi /// @param <IN> \b u8CmdLen : command length
666*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
667*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
668*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetCmdLen(MS_U32 u32PortOffset,MS_U8 u8CmdLen)669*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetCmdLen(MS_U32 u32PortOffset, MS_U8 u8CmdLen)
670*53ee8cc1Swenshuai.xi {
671*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
672*53ee8cc1Swenshuai.xi if(u8CmdLen>HWI2C_DMA_CMD_DATA_LEN)
673*53ee8cc1Swenshuai.xi return FALSE;
674*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByte(REG_HWI2C_DMA_CMDLEN+u32PortOffset, u8CmdLen&_DMA_CMDLEN_MSK);
675*53ee8cc1Swenshuai.xi return TRUE;
676*53ee8cc1Swenshuai.xi }
677*53ee8cc1Swenshuai.xi
678*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
679*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetDataLen
680*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set HWI2C DMA data length
681*53ee8cc1Swenshuai.xi /// @param <IN> \b u32DataLen : data length
682*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
683*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
684*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetDataLen(MS_U32 u32PortOffset,MS_U32 u32DataLen)685*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetDataLen(MS_U32 u32PortOffset, MS_U32 u32DataLen)
686*53ee8cc1Swenshuai.xi {
687*53ee8cc1Swenshuai.xi MS_U32 u32DataLenSet;
688*53ee8cc1Swenshuai.xi
689*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
690*53ee8cc1Swenshuai.xi u32DataLenSet = u32DataLen;
691*53ee8cc1Swenshuai.xi return HAL_HWI2C_Write4Byte(REG_HWI2C_DMA_DATLEN+u32PortOffset, u32DataLenSet);
692*53ee8cc1Swenshuai.xi }
693*53ee8cc1Swenshuai.xi
694*53ee8cc1Swenshuai.xi #if 0 //will be used later
695*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
696*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_GetTxfrCnt
697*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get MIIC DMA Transfer Count
698*53ee8cc1Swenshuai.xi /// @param <IN> \b u32TxfrCnt : transfer count
699*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
700*53ee8cc1Swenshuai.xi /// @param <RET> \b None :
701*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
702*53ee8cc1Swenshuai.xi static MS_U32 HAL_HWI2C_DMA_GetTxfrCnt(MS_U32 u32PortOffset)
703*53ee8cc1Swenshuai.xi {
704*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
705*53ee8cc1Swenshuai.xi return HAL_HWI2C_Read4Byte(REG_HWI2C_DMA_TXFRCNT+u32PortOffset);
706*53ee8cc1Swenshuai.xi }
707*53ee8cc1Swenshuai.xi #endif
708*53ee8cc1Swenshuai.xi
709*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
710*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_GetAddrMode
711*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set MIIC DMA Slave Device Address length mode
712*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
713*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
714*53ee8cc1Swenshuai.xi /// @param <RET> \b E_HAL_HWI2C_DMA_ADDR_10BIT(10 bits mode),
715*53ee8cc1Swenshuai.xi /// \b E_HAL_HWI2C_DMA_ADDR_NORMAL(7 bits mode)
716*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_GetAddrMode(MS_U32 u32PortOffset)717*53ee8cc1Swenshuai.xi static HAL_HWI2C_DMA_ADDRMODE HAL_HWI2C_DMA_GetAddrMode(MS_U32 u32PortOffset)
718*53ee8cc1Swenshuai.xi {
719*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_ADDRMODE eAddrMode;
720*53ee8cc1Swenshuai.xi
721*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
722*53ee8cc1Swenshuai.xi if(HAL_HWI2C_ReadByte(REG_HWI2C_DMA_SLVCFG+u32PortOffset) & _DMA_10BIT_MODE)
723*53ee8cc1Swenshuai.xi eAddrMode = E_HAL_HWI2C_DMA_ADDR_10BIT;
724*53ee8cc1Swenshuai.xi else
725*53ee8cc1Swenshuai.xi eAddrMode = E_HAL_HWI2C_DMA_ADDR_NORMAL;
726*53ee8cc1Swenshuai.xi return eAddrMode;
727*53ee8cc1Swenshuai.xi }
728*53ee8cc1Swenshuai.xi
729*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
730*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetSlaveAddr
731*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set MIIC DMA Slave Device Address
732*53ee8cc1Swenshuai.xi /// @param <IN> \b u32TxfrCnt : slave device address
733*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
734*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
735*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetSlaveAddr(MS_U32 u32PortOffset,MS_U16 u16SlaveAddr)736*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetSlaveAddr(MS_U32 u32PortOffset, MS_U16 u16SlaveAddr)
737*53ee8cc1Swenshuai.xi {
738*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
739*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_GetAddrMode(u32PortOffset)==E_HAL_HWI2C_DMA_ADDR_10BIT)
740*53ee8cc1Swenshuai.xi return HAL_HWI2C_Write2Byte(REG_HWI2C_DMA_SLVADR+u32PortOffset, u16SlaveAddr&_DMA_SLVADR_10BIT_MSK);
741*53ee8cc1Swenshuai.xi else
742*53ee8cc1Swenshuai.xi return HAL_HWI2C_Write2Byte(REG_HWI2C_DMA_SLVADR+u32PortOffset, u16SlaveAddr&_DMA_SLVADR_NORML_MSK);
743*53ee8cc1Swenshuai.xi }
744*53ee8cc1Swenshuai.xi
745*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
746*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_SetAddrMode
747*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set MIIC DMA Slave Device Address length mode
748*53ee8cc1Swenshuai.xi /// @param <IN> \b eAddrMode : E_HAL_HWI2C_DMA_ADDR_NORMAL, E_HAL_HWI2C_DMA_ADDR_10BIT
749*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
750*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
751*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_SetAddrMode(MS_U32 u32PortOffset,HAL_HWI2C_DMA_ADDRMODE eAddrMode)752*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetAddrMode(MS_U32 u32PortOffset, HAL_HWI2C_DMA_ADDRMODE eAddrMode)
753*53ee8cc1Swenshuai.xi {
754*53ee8cc1Swenshuai.xi MS_BOOL b10BitMode;
755*53ee8cc1Swenshuai.xi
756*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
757*53ee8cc1Swenshuai.xi if(eAddrMode>=E_HAL_HWI2C_DMA_ADDR_MAX)
758*53ee8cc1Swenshuai.xi return FALSE;
759*53ee8cc1Swenshuai.xi b10BitMode = (eAddrMode==E_HAL_HWI2C_DMA_ADDR_10BIT)? TRUE : FALSE;
760*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_DMA_SLVCFG+u32PortOffset, _DMA_10BIT_MODE, b10BitMode);
761*53ee8cc1Swenshuai.xi }
762*53ee8cc1Swenshuai.xi
HAL_HWI2C_DMA_SetMiuData(MS_U32 u32PortOffset,MS_U32 u32Length,MS_U8 * pu8SrcData)763*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetMiuData(MS_U32 u32PortOffset, MS_U32 u32Length, MS_U8* pu8SrcData)
764*53ee8cc1Swenshuai.xi {
765*53ee8cc1Swenshuai.xi MS_U32 u32PhyAddr = 0;
766*53ee8cc1Swenshuai.xi MS_VIRT *pMiuData = 0;
767*53ee8cc1Swenshuai.xi MS_U8 u8Port;
768*53ee8cc1Swenshuai.xi
769*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
770*53ee8cc1Swenshuai.xi
771*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
772*53ee8cc1Swenshuai.xi return FALSE;
773*53ee8cc1Swenshuai.xi u32PhyAddr =(MS_U32) g_u32DmaPhyAddr[u8Port];
774*53ee8cc1Swenshuai.xi pMiuData = (MS_VIRT*)_PA2VA((MS_VIRT)u32PhyAddr);
775*53ee8cc1Swenshuai.xi memcpy((void*)pMiuData,(void*)pu8SrcData,u32Length);
776*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetDataLen(u32PortOffset,u32Length);
777*53ee8cc1Swenshuai.xi return TRUE;
778*53ee8cc1Swenshuai.xi }
779*53ee8cc1Swenshuai.xi
HAL_HWI2C_DMA_GetMiuData(MS_U32 u32PortOffset,MS_U32 u32Length,MS_U8 * pu8DstData)780*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_GetMiuData(MS_U32 u32PortOffset, MS_U32 u32Length, MS_U8* pu8DstData)
781*53ee8cc1Swenshuai.xi {
782*53ee8cc1Swenshuai.xi MS_U32 u32PhyAddr = 0;
783*53ee8cc1Swenshuai.xi MS_U8 *pMiuData = 0;
784*53ee8cc1Swenshuai.xi MS_U8 u8Port;
785*53ee8cc1Swenshuai.xi
786*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
787*53ee8cc1Swenshuai.xi
788*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
789*53ee8cc1Swenshuai.xi return FALSE;
790*53ee8cc1Swenshuai.xi u32PhyAddr = (MS_U32) g_u32DmaPhyAddr[u8Port];
791*53ee8cc1Swenshuai.xi pMiuData = (MS_U8*)_PA2VA((MS_VIRT)u32PhyAddr);
792*53ee8cc1Swenshuai.xi memcpy((void*)pu8DstData,(void*)pMiuData,u32Length);
793*53ee8cc1Swenshuai.xi return TRUE;
794*53ee8cc1Swenshuai.xi }
795*53ee8cc1Swenshuai.xi
HAL_HWI2C_DMA_WaitDone(MS_U32 u32PortOffset,MS_U8 u8ReadWrite)796*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_WaitDone(MS_U32 u32PortOffset, MS_U8 u8ReadWrite)
797*53ee8cc1Swenshuai.xi {
798*53ee8cc1Swenshuai.xi MS_U16 volatile u16Timeout = HWI2C_DMA_WAIT_TIMEOUT;
799*53ee8cc1Swenshuai.xi MS_U8 u8Port;
800*53ee8cc1Swenshuai.xi
801*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
802*53ee8cc1Swenshuai.xi
803*53ee8cc1Swenshuai.xi //################
804*53ee8cc1Swenshuai.xi //
805*53ee8cc1Swenshuai.xi // IMPORTANT HERE !!!
806*53ee8cc1Swenshuai.xi //
807*53ee8cc1Swenshuai.xi //################
808*53ee8cc1Swenshuai.xi MsOS_FlushMemory();
809*53ee8cc1Swenshuai.xi //(2-1) reset DMA engine
810*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_Reset(u32PortOffset,TRUE);
811*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_Reset(u32PortOffset,FALSE);
812*53ee8cc1Swenshuai.xi //(2-2) reset MIU module in DMA engine
813*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_MiuReset(u32PortOffset,TRUE);
814*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_MiuReset(u32PortOffset,FALSE);
815*53ee8cc1Swenshuai.xi
816*53ee8cc1Swenshuai.xi
817*53ee8cc1Swenshuai.xi //get port index for delay factor
818*53ee8cc1Swenshuai.xi HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port);
819*53ee8cc1Swenshuai.xi //clear transfer dine first for savfty
820*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_TxfrDone(u32PortOffset);
821*53ee8cc1Swenshuai.xi //set command : 0 for Write, 1 for Read
822*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetRdWrt(u32PortOffset,u8ReadWrite);
823*53ee8cc1Swenshuai.xi //issue write trigger
824*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_Trigger(u32PortOffset);
825*53ee8cc1Swenshuai.xi //check transfer done
826*53ee8cc1Swenshuai.xi while(u16Timeout--)
827*53ee8cc1Swenshuai.xi {
828*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_IsTxfrDone(u32PortOffset,u8Port))
829*53ee8cc1Swenshuai.xi {
830*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_TxfrDone(u32PortOffset);
831*53ee8cc1Swenshuai.xi HWI2C_HAL_INFO("[DMA]: Transfer DONE!\n");
832*53ee8cc1Swenshuai.xi return TRUE;
833*53ee8cc1Swenshuai.xi }
834*53ee8cc1Swenshuai.xi }
835*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA]: Transfer NOT Completely!\n");
836*53ee8cc1Swenshuai.xi return FALSE;
837*53ee8cc1Swenshuai.xi }
838*53ee8cc1Swenshuai.xi
HAL_HWI2C_DMA_SetDelayFactor(MS_U32 u32PortOffset,HAL_HWI2C_CLKSEL eClkSel)839*53ee8cc1Swenshuai.xi static MS_BOOL HAL_HWI2C_DMA_SetDelayFactor(MS_U32 u32PortOffset, HAL_HWI2C_CLKSEL eClkSel)
840*53ee8cc1Swenshuai.xi {
841*53ee8cc1Swenshuai.xi MS_U8 u8Port;
842*53ee8cc1Swenshuai.xi
843*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
844*53ee8cc1Swenshuai.xi
845*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
846*53ee8cc1Swenshuai.xi {
847*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=5;
848*53ee8cc1Swenshuai.xi return FALSE;
849*53ee8cc1Swenshuai.xi }
850*53ee8cc1Swenshuai.xi switch(eClkSel)//use Xtal = 24M Hz
851*53ee8cc1Swenshuai.xi {
852*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_HIGH: // 400 KHz
853*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=1; break;
854*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_NORMAL: //300 KHz
855*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=1; break;
856*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_SLOW: //200 KHz
857*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=1; break;
858*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_VSLOW: //100 KHz
859*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=2; break;
860*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_USLOW: //50 KHz
861*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=3; break;
862*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_UVSLOW: //25 KHz
863*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=3; break;
864*53ee8cc1Swenshuai.xi default:
865*53ee8cc1Swenshuai.xi g_u16DmaDelayFactor[u8Port]=5;
866*53ee8cc1Swenshuai.xi return FALSE;
867*53ee8cc1Swenshuai.xi }
868*53ee8cc1Swenshuai.xi return TRUE;
869*53ee8cc1Swenshuai.xi }
870*53ee8cc1Swenshuai.xi
871*53ee8cc1Swenshuai.xi //#####################
872*53ee8cc1Swenshuai.xi //
873*53ee8cc1Swenshuai.xi // MIIC STD Related Functions
874*53ee8cc1Swenshuai.xi // External
875*53ee8cc1Swenshuai.xi //
876*53ee8cc1Swenshuai.xi //#####################
877*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
878*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Init_Chip
879*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Init HWI2C chip
880*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
881*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
882*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
883*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Init_Chip(void)884*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Init_Chip(void)
885*53ee8cc1Swenshuai.xi {
886*53ee8cc1Swenshuai.xi MS_BOOL bRet = TRUE;
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
889*53ee8cc1Swenshuai.xi //not set all pads (except SPI) as input
890*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_WriteRegBit(CHIP_REG_ALLPADIN, CHIP_ALLPAD_IN, FALSE);
891*53ee8cc1Swenshuai.xi return bRet;
892*53ee8cc1Swenshuai.xi }
893*53ee8cc1Swenshuai.xi
894*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
895*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_IsMaster
896*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check if Master I2C
897*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
898*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
899*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Master, FALSE: Slave
900*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_IsMaster(void)901*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_IsMaster(void)
902*53ee8cc1Swenshuai.xi {
903*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
904*53ee8cc1Swenshuai.xi return TRUE;
905*53ee8cc1Swenshuai.xi }
906*53ee8cc1Swenshuai.xi
907*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
908*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Master_Enable
909*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Master I2C enable
910*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
911*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
912*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
913*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Master_Enable(MS_U32 u32PortOffset)914*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Master_Enable(MS_U32 u32PortOffset)
915*53ee8cc1Swenshuai.xi {
916*53ee8cc1Swenshuai.xi MS_U8 u8Port;
917*53ee8cc1Swenshuai.xi MS_BOOL bRet;
918*53ee8cc1Swenshuai.xi
919*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
920*53ee8cc1Swenshuai.xi
921*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
922*53ee8cc1Swenshuai.xi return FALSE;
923*53ee8cc1Swenshuai.xi g_bLastByte[u8Port] = FALSE;
924*53ee8cc1Swenshuai.xi
925*53ee8cc1Swenshuai.xi //(1) clear interrupt
926*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
927*53ee8cc1Swenshuai.xi //(2) reset standard master iic
928*53ee8cc1Swenshuai.xi HAL_HWI2C_Reset(u32PortOffset,TRUE);
929*53ee8cc1Swenshuai.xi HAL_HWI2C_Reset(u32PortOffset,FALSE);
930*53ee8cc1Swenshuai.xi //(3) configuration
931*53ee8cc1Swenshuai.xi HAL_HWI2C_EnINT(u32PortOffset,TRUE);
932*53ee8cc1Swenshuai.xi HAL_HWI2C_EnClkStretch(u32PortOffset,TRUE);
933*53ee8cc1Swenshuai.xi HAL_HWI2C_EnFilter(u32PortOffset,TRUE);
934*53ee8cc1Swenshuai.xi HAL_HWI2C_EnPushSda(u32PortOffset,TRUE);
935*53ee8cc1Swenshuai.xi #if 0
936*53ee8cc1Swenshuai.xi HAL_HWI2C_EnTimeoutINT(u32PortOffset,TRUE);
937*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_TMT_CNT+u32PortOffset, 0x100);
938*53ee8cc1Swenshuai.xi #endif
939*53ee8cc1Swenshuai.xi //(4) Disable DMA
940*53ee8cc1Swenshuai.xi bRet = HAL_HWI2C_DMA_Enable(u32PortOffset,FALSE);
941*53ee8cc1Swenshuai.xi
942*53ee8cc1Swenshuai.xi return bRet;
943*53ee8cc1Swenshuai.xi }
944*53ee8cc1Swenshuai.xi
945*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
946*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_SetPortRegOffset
947*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set HWI2C port register offset
948*53ee8cc1Swenshuai.xi /// @param <IN> \b ePort : HWI2C port number
949*53ee8cc1Swenshuai.xi /// @param <OUT> \b pu32PortOffset : port register offset
950*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
951*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_SetPortRegOffset(HAL_HWI2C_PORT ePort,MS_U32 * pu32PortOffset)952*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_SetPortRegOffset(HAL_HWI2C_PORT ePort, MS_U32* pu32PortOffset)
953*53ee8cc1Swenshuai.xi {
954*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
955*53ee8cc1Swenshuai.xi
956*53ee8cc1Swenshuai.xi if((ePort>=E_HAL_HWI2C_PORT0_0)&&(ePort<=E_HAL_HWI2C_PORT0_7))
957*53ee8cc1Swenshuai.xi {//port 0 : bank register address 0x111800
958*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x00;
959*53ee8cc1Swenshuai.xi }
960*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT1_0)&&(ePort<=E_HAL_HWI2C_PORT1_7))
961*53ee8cc1Swenshuai.xi {//port 1 : bank register address 0x111900
962*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x100;
963*53ee8cc1Swenshuai.xi }
964*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT2_0)&&(ePort<=E_HAL_HWI2C_PORT2_7))
965*53ee8cc1Swenshuai.xi {//port 2 : bank register address 0x111A00
966*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x200;
967*53ee8cc1Swenshuai.xi }
968*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT3_0)&&(ePort<=E_HAL_HWI2C_PORT3_7))
969*53ee8cc1Swenshuai.xi {//port 3 : bank register address 0x111B00
970*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x300;
971*53ee8cc1Swenshuai.xi }
972*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT4_0)&&(ePort<=E_HAL_HWI2C_PORT4_7))
973*53ee8cc1Swenshuai.xi {//port 4 : bank register address 0x121C00
974*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x10400;
975*53ee8cc1Swenshuai.xi }
976*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT5_0)&&(ePort<=E_HAL_HWI2C_PORT5_7))
977*53ee8cc1Swenshuai.xi {//port 5 : bank register address 0x122C00
978*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x10500;
979*53ee8cc1Swenshuai.xi }
980*53ee8cc1Swenshuai.xi else
981*53ee8cc1Swenshuai.xi {
982*53ee8cc1Swenshuai.xi *pu32PortOffset = (MS_U32)0x00;
983*53ee8cc1Swenshuai.xi return FALSE;
984*53ee8cc1Swenshuai.xi }
985*53ee8cc1Swenshuai.xi return TRUE;
986*53ee8cc1Swenshuai.xi }
987*53ee8cc1Swenshuai.xi
988*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
989*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_GetPortIdxByRegOffset
990*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get HWI2C port index by register offset
991*53ee8cc1Swenshuai.xi /// @param <IN> \b u16Offset : port register offset
992*53ee8cc1Swenshuai.xi /// @param <OUT> \b pu8Port : port index
993*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
994*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_GetPortIdxByOffset(MS_U32 u32PortOffset,MS_U8 * pu8Port)995*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_GetPortIdxByOffset(MS_U32 u32PortOffset, MS_U8* pu8Port)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
998*53ee8cc1Swenshuai.xi
999*53ee8cc1Swenshuai.xi if(u32PortOffset==(MS_U32)0x00)
1000*53ee8cc1Swenshuai.xi {//port 0 : bank register address 0x11800
1001*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT0;
1002*53ee8cc1Swenshuai.xi }
1003*53ee8cc1Swenshuai.xi else if(u32PortOffset==(MS_U32)0x100)
1004*53ee8cc1Swenshuai.xi {//port 1 : bank register address 0x11900
1005*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT1;
1006*53ee8cc1Swenshuai.xi }
1007*53ee8cc1Swenshuai.xi else if(u32PortOffset==(MS_U32)0x200)
1008*53ee8cc1Swenshuai.xi {//port 2 : bank register address 0x11A00
1009*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT2;
1010*53ee8cc1Swenshuai.xi }
1011*53ee8cc1Swenshuai.xi else if(u32PortOffset==(MS_U32)0x300)
1012*53ee8cc1Swenshuai.xi {//port 3 : bank register address 0x11B00
1013*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT3;
1014*53ee8cc1Swenshuai.xi }
1015*53ee8cc1Swenshuai.xi else if(u32PortOffset==(MS_U32)0x10400)
1016*53ee8cc1Swenshuai.xi {//port 3 : bank register address 0x121C00
1017*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT4;
1018*53ee8cc1Swenshuai.xi }
1019*53ee8cc1Swenshuai.xi else if(u32PortOffset==(MS_U32)0x10500)
1020*53ee8cc1Swenshuai.xi {//port 3 : bank register address 0x122C00
1021*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT5;
1022*53ee8cc1Swenshuai.xi }
1023*53ee8cc1Swenshuai.xi else
1024*53ee8cc1Swenshuai.xi {
1025*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT0;
1026*53ee8cc1Swenshuai.xi return FALSE;
1027*53ee8cc1Swenshuai.xi }
1028*53ee8cc1Swenshuai.xi return TRUE;
1029*53ee8cc1Swenshuai.xi }
1030*53ee8cc1Swenshuai.xi
1031*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1032*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_GetPortIdxByPort
1033*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get HWI2C port index by port number
1034*53ee8cc1Swenshuai.xi /// @param <IN> \b ePort : port number
1035*53ee8cc1Swenshuai.xi /// @param <OUT> \b pu8Port : port index
1036*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1037*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_GetPortIdxByPort(HAL_HWI2C_PORT ePort,MS_U8 * pu8Port)1038*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_GetPortIdxByPort(HAL_HWI2C_PORT ePort, MS_U8* pu8Port)
1039*53ee8cc1Swenshuai.xi {
1040*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1041*53ee8cc1Swenshuai.xi
1042*53ee8cc1Swenshuai.xi if((ePort>=E_HAL_HWI2C_PORT0_0)&&(ePort<=E_HAL_HWI2C_PORT0_7))
1043*53ee8cc1Swenshuai.xi {
1044*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT0;
1045*53ee8cc1Swenshuai.xi }
1046*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT1_0)&&(ePort<=E_HAL_HWI2C_PORT1_7))
1047*53ee8cc1Swenshuai.xi {
1048*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT1;
1049*53ee8cc1Swenshuai.xi }
1050*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT2_0)&&(ePort<=E_HAL_HWI2C_PORT2_7))
1051*53ee8cc1Swenshuai.xi {
1052*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT2;
1053*53ee8cc1Swenshuai.xi }
1054*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT3_0)&&(ePort<=E_HAL_HWI2C_PORT3_7))
1055*53ee8cc1Swenshuai.xi {
1056*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT3;
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT4_0)&&(ePort<=E_HAL_HWI2C_PORT4_7))
1059*53ee8cc1Swenshuai.xi {
1060*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT4;
1061*53ee8cc1Swenshuai.xi }
1062*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT5_0)&&(ePort<=E_HAL_HWI2C_PORT5_7))
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT5;
1065*53ee8cc1Swenshuai.xi }
1066*53ee8cc1Swenshuai.xi else
1067*53ee8cc1Swenshuai.xi {
1068*53ee8cc1Swenshuai.xi *pu8Port = HAL_HWI2C_PORT0;
1069*53ee8cc1Swenshuai.xi return FALSE;
1070*53ee8cc1Swenshuai.xi }
1071*53ee8cc1Swenshuai.xi return TRUE;
1072*53ee8cc1Swenshuai.xi }
1073*53ee8cc1Swenshuai.xi
1074*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1075*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_SelectPort
1076*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Select HWI2C port
1077*53ee8cc1Swenshuai.xi /// @param <IN> \b None : HWI2C port
1078*53ee8cc1Swenshuai.xi /// @param param \b None :
1079*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1080*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_SelectPort(HAL_HWI2C_PORT ePort)1081*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_SelectPort(HAL_HWI2C_PORT ePort)
1082*53ee8cc1Swenshuai.xi {
1083*53ee8cc1Swenshuai.xi MS_U8 u8Value1=0;
1084*53ee8cc1Swenshuai.xi
1085*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1086*53ee8cc1Swenshuai.xi
1087*53ee8cc1Swenshuai.xi //decide port mask
1088*53ee8cc1Swenshuai.xi if((ePort>=E_HAL_HWI2C_PORT0_0)&&(ePort<=E_HAL_HWI2C_PORT0_7))//port 0
1089*53ee8cc1Swenshuai.xi {
1090*53ee8cc1Swenshuai.xi switch(ePort)
1091*53ee8cc1Swenshuai.xi {
1092*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT0_0: //miic0 disable
1093*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC0, CHIP_MIIC0_PAD_0, CHIP_MIIC0_PAD_MSK);
1094*53ee8cc1Swenshuai.xi break;
1095*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT0_1: //miic0 using PAD_GPIO28/PAD_GPIO29
1096*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC0, CHIP_MIIC0_PAD_1, CHIP_MIIC0_PAD_MSK);
1097*53ee8cc1Swenshuai.xi break;
1098*53ee8cc1Swenshuai.xi default:
1099*53ee8cc1Swenshuai.xi return FALSE;
1100*53ee8cc1Swenshuai.xi }
1101*53ee8cc1Swenshuai.xi }
1102*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT1_0)&&(ePort<=E_HAL_HWI2C_PORT1_7))//port 1
1103*53ee8cc1Swenshuai.xi {
1104*53ee8cc1Swenshuai.xi switch(ePort)
1105*53ee8cc1Swenshuai.xi {
1106*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT1_0: //miic1 disable
1107*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC1_PAD_0;
1108*53ee8cc1Swenshuai.xi break;
1109*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT1_1: //miic1 using PAD_TGPIO2/PAD_TGPIO3
1110*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC1_PAD_1;
1111*53ee8cc1Swenshuai.xi break;
1112*53ee8cc1Swenshuai.xi default:
1113*53ee8cc1Swenshuai.xi return FALSE;
1114*53ee8cc1Swenshuai.xi }
1115*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC1, u8Value1, CHIP_MIIC1_PAD_MSK);
1116*53ee8cc1Swenshuai.xi }
1117*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT2_0)&&(ePort<=E_HAL_HWI2C_PORT2_7))//port 2
1118*53ee8cc1Swenshuai.xi {
1119*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC2, CHIP_MIIC2_PAD_0, CHIP_MIIC2_PAD_MSK);
1120*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC3, CHIP_MIIC3_PAD_0, CHIP_MIIC3_PAD_MSK);
1121*53ee8cc1Swenshuai.xi switch(ePort)
1122*53ee8cc1Swenshuai.xi {
1123*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT2_0: //miic2 disable
1124*53ee8cc1Swenshuai.xi break;
1125*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT2_1: //miic2 using PAD_I2S_IN_BCK/PAD_I2S_IN_SD
1126*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC2, CHIP_MIIC2_PAD_1, CHIP_MIIC2_PAD_MSK);
1127*53ee8cc1Swenshuai.xi break;
1128*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT2_2: //miic3 using PAD_GPIO36/PAD_GPIO37
1129*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC3, CHIP_MIIC3_PAD_1, CHIP_MIIC3_PAD_MSK);
1130*53ee8cc1Swenshuai.xi break;
1131*53ee8cc1Swenshuai.xi default:
1132*53ee8cc1Swenshuai.xi return FALSE;
1133*53ee8cc1Swenshuai.xi }
1134*53ee8cc1Swenshuai.xi }
1135*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT3_0)&&(ePort<=E_HAL_HWI2C_PORT3_7))//port 3
1136*53ee8cc1Swenshuai.xi {
1137*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_DDCR, CHIP_DDCR_PAD_0, CHIP_DDCR_PAD_MSK);
1138*53ee8cc1Swenshuai.xi switch(ePort)
1139*53ee8cc1Swenshuai.xi {
1140*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT3_0: //ddcr_miic disable
1141*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_DDCR, CHIP_DDCR_PAD_0, CHIP_DDCR_PAD_MSK);
1142*53ee8cc1Swenshuai.xi break;
1143*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT3_1: //ddcr_miic using PAD_DDCR_CK/PAD_DDCR_DA
1144*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_DDCR, CHIP_DDCR_PAD_1, CHIP_DDCR_PAD_MSK);
1145*53ee8cc1Swenshuai.xi break;
1146*53ee8cc1Swenshuai.xi default:
1147*53ee8cc1Swenshuai.xi return FALSE;
1148*53ee8cc1Swenshuai.xi }
1149*53ee8cc1Swenshuai.xi }
1150*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT4_0)&&(ePort<=E_HAL_HWI2C_PORT4_7))//port 4
1151*53ee8cc1Swenshuai.xi {
1152*53ee8cc1Swenshuai.xi switch(ePort)
1153*53ee8cc1Swenshuai.xi {
1154*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT4_0: //miic2 disable
1155*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC4_PAD_0;
1156*53ee8cc1Swenshuai.xi break;
1157*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT4_1: //miic2 using PAD_GPIO30/PAD_GPIO31
1158*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC4_PAD_1;
1159*53ee8cc1Swenshuai.xi break;
1160*53ee8cc1Swenshuai.xi default:
1161*53ee8cc1Swenshuai.xi return FALSE;
1162*53ee8cc1Swenshuai.xi }
1163*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC4, u8Value1, CHIP_MIIC4_PAD_MSK);
1164*53ee8cc1Swenshuai.xi }
1165*53ee8cc1Swenshuai.xi else if((ePort>=E_HAL_HWI2C_PORT5_0)&&(ePort<=E_HAL_HWI2C_PORT5_7))//port 5
1166*53ee8cc1Swenshuai.xi {
1167*53ee8cc1Swenshuai.xi switch(ePort)
1168*53ee8cc1Swenshuai.xi {
1169*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT5_0: //miic2 disable
1170*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC5_PAD_0;
1171*53ee8cc1Swenshuai.xi break;
1172*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_PORT5_1: //miic2 using PAD_GPIO32/PAD_GPIO33
1173*53ee8cc1Swenshuai.xi u8Value1 = CHIP_MIIC5_PAD_1;
1174*53ee8cc1Swenshuai.xi break;
1175*53ee8cc1Swenshuai.xi default:
1176*53ee8cc1Swenshuai.xi return FALSE;
1177*53ee8cc1Swenshuai.xi }
1178*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteByteMask(CHIP_REG_HWI2C_MIIC5, u8Value1, CHIP_MIIC5_PAD_MSK);
1179*53ee8cc1Swenshuai.xi }
1180*53ee8cc1Swenshuai.xi else
1181*53ee8cc1Swenshuai.xi {
1182*53ee8cc1Swenshuai.xi return FALSE;
1183*53ee8cc1Swenshuai.xi }
1184*53ee8cc1Swenshuai.xi return TRUE;
1185*53ee8cc1Swenshuai.xi }
1186*53ee8cc1Swenshuai.xi
1187*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1188*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_SetClk
1189*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Set I2C clock
1190*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Clk: clock rate
1191*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1192*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1193*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_SetClk(MS_U32 u32PortOffset,HAL_HWI2C_CLKSEL eClkSel)1194*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_SetClk(MS_U32 u32PortOffset, HAL_HWI2C_CLKSEL eClkSel)
1195*53ee8cc1Swenshuai.xi {
1196*53ee8cc1Swenshuai.xi MS_U16 u16ClkHCnt=0,u16ClkLCnt=0;
1197*53ee8cc1Swenshuai.xi MS_U16 u16StpCnt=0,u16SdaCnt=0,u16SttCnt=0,u16LchCnt=0;
1198*53ee8cc1Swenshuai.xi
1199*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1200*53ee8cc1Swenshuai.xi
1201*53ee8cc1Swenshuai.xi if(eClkSel>=E_HAL_HWI2C_CLKSEL_NOSUP)
1202*53ee8cc1Swenshuai.xi return FALSE;
1203*53ee8cc1Swenshuai.xi
1204*53ee8cc1Swenshuai.xi switch(eClkSel)//use Xtal = 12M Hz
1205*53ee8cc1Swenshuai.xi {
1206*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_HIGH: // 400 KHz
1207*53ee8cc1Swenshuai.xi u16ClkHCnt = 9; u16ClkLCnt = 13; break;
1208*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_NORMAL: //300 KHz
1209*53ee8cc1Swenshuai.xi u16ClkHCnt = 15; u16ClkLCnt = 17; break;
1210*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_SLOW: //200 KHz
1211*53ee8cc1Swenshuai.xi u16ClkHCnt = 25; u16ClkLCnt = 27; break;
1212*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_VSLOW: //100 KHz
1213*53ee8cc1Swenshuai.xi u16ClkHCnt = 55; u16ClkLCnt = 57; break;
1214*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_USLOW: //50 KHz
1215*53ee8cc1Swenshuai.xi u16ClkHCnt = 115; u16ClkLCnt = 117; break;
1216*53ee8cc1Swenshuai.xi case E_HAL_HWI2C_CLKSEL_UVSLOW: //25 KHz
1217*53ee8cc1Swenshuai.xi u16ClkHCnt = 235; u16ClkLCnt = 237; break;
1218*53ee8cc1Swenshuai.xi default:
1219*53ee8cc1Swenshuai.xi u16ClkHCnt = 15; u16ClkLCnt = 17; break;
1220*53ee8cc1Swenshuai.xi }
1221*53ee8cc1Swenshuai.xi u16SttCnt=8; u16StpCnt=8; u16SdaCnt=5; u16LchCnt=5;
1222*53ee8cc1Swenshuai.xi
1223*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_CKH_CNT+u32PortOffset, u16ClkHCnt);
1224*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_CKL_CNT+u32PortOffset, u16ClkLCnt);
1225*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_STP_CNT+u32PortOffset, u16StpCnt);
1226*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_SDA_CNT+u32PortOffset, u16SdaCnt);
1227*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_STT_CNT+u32PortOffset, u16SttCnt);
1228*53ee8cc1Swenshuai.xi HAL_HWI2C_Write2Byte(REG_HWI2C_LTH_CNT+u32PortOffset, u16LchCnt);
1229*53ee8cc1Swenshuai.xi //HAL_HWI2C_Write2Byte(REG_HWI2C_TMT_CNT+u32PortOffset, 0x0000);
1230*53ee8cc1Swenshuai.xi return TRUE;
1231*53ee8cc1Swenshuai.xi }
1232*53ee8cc1Swenshuai.xi
1233*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1234*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Start
1235*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Send start condition
1236*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1237*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1238*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1239*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Start(MS_U32 u32PortOffset)1240*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Start(MS_U32 u32PortOffset)
1241*53ee8cc1Swenshuai.xi {
1242*53ee8cc1Swenshuai.xi MS_U16 u16Count = HWI2C_HAL_WAIT_TIMEOUT;
1243*53ee8cc1Swenshuai.xi
1244*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1245*53ee8cc1Swenshuai.xi
1246*53ee8cc1Swenshuai.xi //reset I2C
1247*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteRegBit(REG_HWI2C_CMD_START+u32PortOffset, _CMD_START, TRUE);
1248*53ee8cc1Swenshuai.xi while((!HAL_HWI2C_Is_INT(u32PortOffset))&&(u16Count > 0))
1249*53ee8cc1Swenshuai.xi u16Count--;
1250*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1251*53ee8cc1Swenshuai.xi return (u16Count)? TRUE:FALSE;
1252*53ee8cc1Swenshuai.xi }
1253*53ee8cc1Swenshuai.xi
1254*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1255*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Stop
1256*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Send Stop condition
1257*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1258*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1259*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1260*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Stop(MS_U32 u32PortOffset)1261*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Stop(MS_U32 u32PortOffset)
1262*53ee8cc1Swenshuai.xi {
1263*53ee8cc1Swenshuai.xi MS_U16 u16Count = HWI2C_HAL_WAIT_TIMEOUT;
1264*53ee8cc1Swenshuai.xi
1265*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1266*53ee8cc1Swenshuai.xi
1267*53ee8cc1Swenshuai.xi HAL_HWI2C_WriteRegBit(REG_HWI2C_CMD_STOP+u32PortOffset, _CMD_STOP, TRUE);
1268*53ee8cc1Swenshuai.xi while((!HAL_HWI2C_Is_Idle(u32PortOffset))&&(!HAL_HWI2C_Is_INT(u32PortOffset))&&(u16Count > 0))
1269*53ee8cc1Swenshuai.xi u16Count--;
1270*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1271*53ee8cc1Swenshuai.xi return (u16Count)? TRUE:FALSE;
1272*53ee8cc1Swenshuai.xi }
1273*53ee8cc1Swenshuai.xi
1274*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1275*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_ReadRdy
1276*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Start byte reading
1277*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1278*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1279*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1280*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_ReadRdy(MS_U32 u32PortOffset)1281*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_ReadRdy(MS_U32 u32PortOffset)
1282*53ee8cc1Swenshuai.xi {
1283*53ee8cc1Swenshuai.xi MS_U8 u8Value=0;
1284*53ee8cc1Swenshuai.xi MS_U8 u8Port;
1285*53ee8cc1Swenshuai.xi
1286*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1287*53ee8cc1Swenshuai.xi
1288*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
1289*53ee8cc1Swenshuai.xi return FALSE;
1290*53ee8cc1Swenshuai.xi u8Value = (g_bLastByte[u8Port])? (_RDATA_CFG_TRIG|_RDATA_CFG_ACKBIT) : (_RDATA_CFG_TRIG);
1291*53ee8cc1Swenshuai.xi g_bLastByte[u8Port] = FALSE;
1292*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteByte(REG_HWI2C_RDATA_CFG+u32PortOffset, u8Value);
1293*53ee8cc1Swenshuai.xi }
1294*53ee8cc1Swenshuai.xi
1295*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1296*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_SendData
1297*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Send 1 byte data to SDA
1298*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1299*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1300*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1301*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_SendData(MS_U32 u32PortOffset,MS_U8 u8Data)1302*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_SendData(MS_U32 u32PortOffset, MS_U8 u8Data)
1303*53ee8cc1Swenshuai.xi {
1304*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1305*53ee8cc1Swenshuai.xi
1306*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteByte(REG_HWI2C_WDATA+u32PortOffset, u8Data);
1307*53ee8cc1Swenshuai.xi }
1308*53ee8cc1Swenshuai.xi
1309*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1310*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_RecvData
1311*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Receive 1 byte data from SDA
1312*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1313*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1314*53ee8cc1Swenshuai.xi /// @param <RET> \b MS_U8 :
1315*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_RecvData(MS_U32 u32PortOffset)1316*53ee8cc1Swenshuai.xi MS_U8 HAL_HWI2C_RecvData(MS_U32 u32PortOffset)
1317*53ee8cc1Swenshuai.xi {
1318*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1319*53ee8cc1Swenshuai.xi
1320*53ee8cc1Swenshuai.xi return HAL_HWI2C_ReadByte(REG_HWI2C_RDATA+u32PortOffset);
1321*53ee8cc1Swenshuai.xi }
1322*53ee8cc1Swenshuai.xi
1323*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1324*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Get_SendAck
1325*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get ack after sending data
1326*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1327*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1328*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Valid ack, FALSE: No ack
1329*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Get_SendAck(MS_U32 u32PortOffset)1330*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Get_SendAck(MS_U32 u32PortOffset)
1331*53ee8cc1Swenshuai.xi {
1332*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1333*53ee8cc1Swenshuai.xi
1334*53ee8cc1Swenshuai.xi return (HAL_HWI2C_ReadByte(REG_HWI2C_WDATA_GET+u32PortOffset) & _WDATA_GET_ACKBIT) ? FALSE : TRUE;
1335*53ee8cc1Swenshuai.xi }
1336*53ee8cc1Swenshuai.xi
1337*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1338*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_NoAck
1339*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: generate no ack pulse
1340*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1341*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1342*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1343*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_NoAck(MS_U32 u32PortOffset)1344*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_NoAck(MS_U32 u32PortOffset)
1345*53ee8cc1Swenshuai.xi {
1346*53ee8cc1Swenshuai.xi MS_U8 u8Port;
1347*53ee8cc1Swenshuai.xi
1348*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1349*53ee8cc1Swenshuai.xi
1350*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
1351*53ee8cc1Swenshuai.xi return FALSE;
1352*53ee8cc1Swenshuai.xi g_bLastByte[u8Port] = TRUE;
1353*53ee8cc1Swenshuai.xi return TRUE;
1354*53ee8cc1Swenshuai.xi }
1355*53ee8cc1Swenshuai.xi
1356*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1357*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Ack
1358*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: generate ack pulse
1359*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1360*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1361*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1362*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Ack(MS_U32 u32PortOffset)1363*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Ack(MS_U32 u32PortOffset)
1364*53ee8cc1Swenshuai.xi {
1365*53ee8cc1Swenshuai.xi MS_U8 u8Port;
1366*53ee8cc1Swenshuai.xi
1367*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1368*53ee8cc1Swenshuai.xi
1369*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port)==FALSE)
1370*53ee8cc1Swenshuai.xi return FALSE;
1371*53ee8cc1Swenshuai.xi g_bLastByte[u8Port] = FALSE;
1372*53ee8cc1Swenshuai.xi return TRUE;
1373*53ee8cc1Swenshuai.xi }
1374*53ee8cc1Swenshuai.xi
1375*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1376*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_GetStae
1377*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Get i2c Current State
1378*53ee8cc1Swenshuai.xi /// @param <IN> \b u32PortOffset: HWI2C Port Offset
1379*53ee8cc1Swenshuai.xi /// @param <OUT> \b None
1380*53ee8cc1Swenshuai.xi /// @param <RET> \b HWI2C current status
1381*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_GetState(MS_U32 u32PortOffset)1382*53ee8cc1Swenshuai.xi MS_U8 HAL_HWI2C_GetState(MS_U32 u32PortOffset)
1383*53ee8cc1Swenshuai.xi {
1384*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1385*53ee8cc1Swenshuai.xi
1386*53ee8cc1Swenshuai.xi MS_U8 cur_state = HAL_HWI2C_ReadByte(REG_HWI2C_CUR_STATE+u32PortOffset) & _CUR_STATE_MSK;
1387*53ee8cc1Swenshuai.xi
1388*53ee8cc1Swenshuai.xi if (cur_state <= 0) // 0: idle
1389*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_IDEL;
1390*53ee8cc1Swenshuai.xi else if (cur_state <= 2) // 1~2:start
1391*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_START;
1392*53ee8cc1Swenshuai.xi else if (cur_state <= 6) // 3~6:write
1393*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_WRITE;
1394*53ee8cc1Swenshuai.xi else if (cur_state <= 10) // 7~10:read
1395*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_READ;
1396*53ee8cc1Swenshuai.xi else if (cur_state <= 11) // 11:interrupt
1397*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_INT;
1398*53ee8cc1Swenshuai.xi else if (cur_state <= 12) // 12:wait
1399*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_WAIT;
1400*53ee8cc1Swenshuai.xi else // 13~15:stop
1401*53ee8cc1Swenshuai.xi return E_HAL_HWI2C_STATE_STOP;
1402*53ee8cc1Swenshuai.xi }
1403*53ee8cc1Swenshuai.xi
1404*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1405*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Is_Idle
1406*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check if i2c is idle
1407*53ee8cc1Swenshuai.xi /// @param <IN> \b u32PortOffset: HWI2C Port Offset
1408*53ee8cc1Swenshuai.xi /// @param <OUT> \b None
1409*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : idle, FALSE : not idle
1410*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Is_Idle(MS_U32 u32PortOffset)1411*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Is_Idle(MS_U32 u32PortOffset)
1412*53ee8cc1Swenshuai.xi {
1413*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1414*53ee8cc1Swenshuai.xi
1415*53ee8cc1Swenshuai.xi return ((HAL_HWI2C_GetState(u32PortOffset)==E_HAL_HWI2C_STATE_IDEL) ? TRUE : FALSE);
1416*53ee8cc1Swenshuai.xi }
1417*53ee8cc1Swenshuai.xi
1418*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1419*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Is_INT
1420*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Check if i2c is interrupted
1421*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Status : queried status
1422*53ee8cc1Swenshuai.xi /// @param <IN> \b u8Ch: Channel 0/1
1423*53ee8cc1Swenshuai.xi /// @param <OUT> \b None
1424*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1425*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Is_INT(MS_U32 u32PortOffset)1426*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Is_INT(MS_U32 u32PortOffset)
1427*53ee8cc1Swenshuai.xi {
1428*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1429*53ee8cc1Swenshuai.xi
1430*53ee8cc1Swenshuai.xi return (HAL_HWI2C_ReadByte(REG_HWI2C_INT_CTL+u32PortOffset) & _INT_CTL) ? TRUE : FALSE;
1431*53ee8cc1Swenshuai.xi }
1432*53ee8cc1Swenshuai.xi
1433*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1434*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Clear_INT
1435*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable interrupt for HWI2C
1436*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1437*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1438*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1439*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Clear_INT(MS_U32 u32PortOffset)1440*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Clear_INT(MS_U32 u32PortOffset)
1441*53ee8cc1Swenshuai.xi {
1442*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1443*53ee8cc1Swenshuai.xi
1444*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_INT_CTL+u32PortOffset, _INT_CTL, TRUE);
1445*53ee8cc1Swenshuai.xi }
1446*53ee8cc1Swenshuai.xi
1447*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1448*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Reset
1449*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Reset HWI2C state machine
1450*53ee8cc1Swenshuai.xi /// @param <IN> \b bReset : TRUE: Reset FALSE: Not reset
1451*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1452*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE: Ok, FALSE: Fail
1453*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Reset(MS_U32 u32PortOffset,MS_BOOL bReset)1454*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Reset(MS_U32 u32PortOffset, MS_BOOL bReset)
1455*53ee8cc1Swenshuai.xi {
1456*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1457*53ee8cc1Swenshuai.xi
1458*53ee8cc1Swenshuai.xi return HAL_HWI2C_WriteRegBit(REG_HWI2C_MIIC_CFG+u32PortOffset, _MIIC_CFG_RESET, bReset);
1459*53ee8cc1Swenshuai.xi }
1460*53ee8cc1Swenshuai.xi
1461*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1462*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Send_Byte
1463*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Send one byte
1464*53ee8cc1Swenshuai.xi /// @param u8Data \b IN: 1 byte data
1465*53ee8cc1Swenshuai.xi /// @return \b TRUE: Success FALSE: Fail
1466*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Send_Byte(MS_U32 u32PortOffset,MS_U8 u8Data)1467*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Send_Byte(MS_U32 u32PortOffset, MS_U8 u8Data)
1468*53ee8cc1Swenshuai.xi {
1469*53ee8cc1Swenshuai.xi MS_U8 u8Retry = HWI2C_HAL_RETRY_TIMES;
1470*53ee8cc1Swenshuai.xi MS_U16 u16Count = HWI2C_HAL_WAIT_TIMEOUT;
1471*53ee8cc1Swenshuai.xi
1472*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1473*53ee8cc1Swenshuai.xi
1474*53ee8cc1Swenshuai.xi while(u8Retry--)
1475*53ee8cc1Swenshuai.xi {
1476*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1477*53ee8cc1Swenshuai.xi if (HAL_HWI2C_SendData(u32PortOffset,u8Data))
1478*53ee8cc1Swenshuai.xi {
1479*53ee8cc1Swenshuai.xi u16Count = HWI2C_HAL_WAIT_TIMEOUT;
1480*53ee8cc1Swenshuai.xi while(u16Count--)
1481*53ee8cc1Swenshuai.xi {
1482*53ee8cc1Swenshuai.xi if (HAL_HWI2C_Is_INT(u32PortOffset))
1483*53ee8cc1Swenshuai.xi {
1484*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1485*53ee8cc1Swenshuai.xi if (HAL_HWI2C_Get_SendAck(u32PortOffset))
1486*53ee8cc1Swenshuai.xi {
1487*53ee8cc1Swenshuai.xi #if 1
1488*53ee8cc1Swenshuai.xi HAL_HWI2C_ExtraDelay(1);
1489*53ee8cc1Swenshuai.xi #else
1490*53ee8cc1Swenshuai.xi MsOS_DelayTaskUs(1);
1491*53ee8cc1Swenshuai.xi #endif
1492*53ee8cc1Swenshuai.xi return TRUE;
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi break;
1495*53ee8cc1Swenshuai.xi }
1496*53ee8cc1Swenshuai.xi }
1497*53ee8cc1Swenshuai.xi }
1498*53ee8cc1Swenshuai.xi }
1499*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("Send byte 0x%X fail!\n", u8Data);
1500*53ee8cc1Swenshuai.xi return FALSE;
1501*53ee8cc1Swenshuai.xi }
1502*53ee8cc1Swenshuai.xi
1503*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1504*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Recv_Byte
1505*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Init HWI2C driver and auto generate ACK
1506*53ee8cc1Swenshuai.xi /// @param *pData \b Out: received data
1507*53ee8cc1Swenshuai.xi /// @return \b TRUE: Success FALSE: Fail
1508*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Recv_Byte(MS_U32 u32PortOffset,MS_U8 * pData)1509*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_Recv_Byte(MS_U32 u32PortOffset, MS_U8 *pData)
1510*53ee8cc1Swenshuai.xi {
1511*53ee8cc1Swenshuai.xi MS_U16 u16Count = HWI2C_HAL_WAIT_TIMEOUT;
1512*53ee8cc1Swenshuai.xi
1513*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1514*53ee8cc1Swenshuai.xi
1515*53ee8cc1Swenshuai.xi if (!pData)
1516*53ee8cc1Swenshuai.xi return FALSE;
1517*53ee8cc1Swenshuai.xi
1518*53ee8cc1Swenshuai.xi HAL_HWI2C_ReadRdy(u32PortOffset);
1519*53ee8cc1Swenshuai.xi while((!HAL_HWI2C_Is_INT(u32PortOffset))&&(u16Count > 0))
1520*53ee8cc1Swenshuai.xi u16Count--;
1521*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1522*53ee8cc1Swenshuai.xi if (u16Count)
1523*53ee8cc1Swenshuai.xi {
1524*53ee8cc1Swenshuai.xi //get data before clear int and stop
1525*53ee8cc1Swenshuai.xi *pData = HAL_HWI2C_RecvData(u32PortOffset);
1526*53ee8cc1Swenshuai.xi //clear interrupt
1527*53ee8cc1Swenshuai.xi HAL_HWI2C_Clear_INT(u32PortOffset);
1528*53ee8cc1Swenshuai.xi #if 1
1529*53ee8cc1Swenshuai.xi HAL_HWI2C_ExtraDelay(1);
1530*53ee8cc1Swenshuai.xi #else
1531*53ee8cc1Swenshuai.xi MsOS_DelayTaskUs(1);
1532*53ee8cc1Swenshuai.xi #endif
1533*53ee8cc1Swenshuai.xi return TRUE;
1534*53ee8cc1Swenshuai.xi }
1535*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("Recv byte fail!\n");
1536*53ee8cc1Swenshuai.xi return FALSE;
1537*53ee8cc1Swenshuai.xi }
1538*53ee8cc1Swenshuai.xi
1539*53ee8cc1Swenshuai.xi //#####################
1540*53ee8cc1Swenshuai.xi //
1541*53ee8cc1Swenshuai.xi // MIIC DMA Related Functions
1542*53ee8cc1Swenshuai.xi // External
1543*53ee8cc1Swenshuai.xi //
1544*53ee8cc1Swenshuai.xi //#####################
1545*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1546*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_Enable
1547*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Enable HWI2C DMA
1548*53ee8cc1Swenshuai.xi /// @param <IN> \b bEnable : TRUE: enable DMA, FALSE: disable DMA
1549*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1550*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1551*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_Enable(MS_U32 u32PortOffset,MS_BOOL bEnable)1552*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_DMA_Enable(MS_U32 u32PortOffset, MS_BOOL bEnable)
1553*53ee8cc1Swenshuai.xi {
1554*53ee8cc1Swenshuai.xi MS_BOOL bRet=TRUE;
1555*53ee8cc1Swenshuai.xi
1556*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1557*53ee8cc1Swenshuai.xi
1558*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetINT(u32PortOffset,bEnable);
1559*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_EnDMA(u32PortOffset,bEnable);
1560*53ee8cc1Swenshuai.xi return bRet;
1561*53ee8cc1Swenshuai.xi }
1562*53ee8cc1Swenshuai.xi
1563*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1564*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_Init
1565*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Initialize HWI2C DMA
1566*53ee8cc1Swenshuai.xi /// @param <IN> \b pstCfg : Init structure
1567*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1568*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1569*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_Init(MS_U32 u32PortOffset,HAL_HWI2C_PortCfg * pstPortCfg)1570*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_DMA_Init(MS_U32 u32PortOffset, HAL_HWI2C_PortCfg* pstPortCfg)
1571*53ee8cc1Swenshuai.xi {
1572*53ee8cc1Swenshuai.xi MS_U8 u8Port = 0;
1573*53ee8cc1Swenshuai.xi MS_BOOL bRet=TRUE;
1574*53ee8cc1Swenshuai.xi
1575*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1576*53ee8cc1Swenshuai.xi
1577*53ee8cc1Swenshuai.xi //check pointer
1578*53ee8cc1Swenshuai.xi if(!pstPortCfg)
1579*53ee8cc1Swenshuai.xi {
1580*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("Port cfg null pointer!\n");
1581*53ee8cc1Swenshuai.xi return FALSE;
1582*53ee8cc1Swenshuai.xi }
1583*53ee8cc1Swenshuai.xi //(1) clear interrupt
1584*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_TxfrDone(u32PortOffset);
1585*53ee8cc1Swenshuai.xi //(2) reset DMA
1586*53ee8cc1Swenshuai.xi //(2-1) reset DMA engine
1587*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_Reset(u32PortOffset,TRUE);
1588*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_Reset(u32PortOffset,FALSE);
1589*53ee8cc1Swenshuai.xi //(2-2) reset MIU module in DMA engine
1590*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_MiuReset(u32PortOffset,TRUE);
1591*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_MiuReset(u32PortOffset,FALSE);
1592*53ee8cc1Swenshuai.xi //(3) default configursation
1593*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetAddrMode(u32PortOffset,pstPortCfg->eDmaAddrMode);
1594*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetMiuPri(u32PortOffset,pstPortCfg->eDmaMiuPri);
1595*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetMiuChannel(u32PortOffset,pstPortCfg->eDmaMiuCh);
1596*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetMiuAddr(u32PortOffset,pstPortCfg->u32DmaPhyAddr);
1597*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_Enable(u32PortOffset,pstPortCfg->bDmaEnable);
1598*53ee8cc1Swenshuai.xi bRet &= HAL_HWI2C_DMA_SetDelayFactor(u32PortOffset,pstPortCfg->eSpeed);
1599*53ee8cc1Swenshuai.xi //(4) backup configuration info
1600*53ee8cc1Swenshuai.xi if(HAL_HWI2C_GetPortIdxByOffset(u32PortOffset,&u8Port))
1601*53ee8cc1Swenshuai.xi {
1602*53ee8cc1Swenshuai.xi memcpy(&g_stPortCfg[u8Port], pstPortCfg, sizeof(HAL_HWI2C_PortCfg));
1603*53ee8cc1Swenshuai.xi }
1604*53ee8cc1Swenshuai.xi
1605*53ee8cc1Swenshuai.xi return bRet;
1606*53ee8cc1Swenshuai.xi }
1607*53ee8cc1Swenshuai.xi
1608*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1609*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_WriteBytes
1610*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Initialize HWI2C DMA
1611*53ee8cc1Swenshuai.xi /// @param <IN> \b u16SlaveCfg : slave id
1612*53ee8cc1Swenshuai.xi /// @param <IN> \b uAddrCnt : address size in bytes
1613*53ee8cc1Swenshuai.xi /// @param <IN> \b pRegAddr : address pointer
1614*53ee8cc1Swenshuai.xi /// @param <IN> \b uSize : data size in bytes
1615*53ee8cc1Swenshuai.xi /// @param <IN> \b pData : data pointer
1616*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1617*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1618*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_WriteBytes(MS_U32 u32PortOffset,MS_U16 u16SlaveCfg,MS_U32 uAddrCnt,MS_U8 * pRegAddr,MS_U32 uSize,MS_U8 * pData)1619*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_DMA_WriteBytes(MS_U32 u32PortOffset, MS_U16 u16SlaveCfg, MS_U32 uAddrCnt, MS_U8 *pRegAddr, MS_U32 uSize, MS_U8 *pData)
1620*53ee8cc1Swenshuai.xi {
1621*53ee8cc1Swenshuai.xi MS_U8 u8SlaveAddr = LOW_BYTE(u16SlaveCfg)>>1;
1622*53ee8cc1Swenshuai.xi
1623*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1624*53ee8cc1Swenshuai.xi
1625*53ee8cc1Swenshuai.xi if (!pRegAddr)
1626*53ee8cc1Swenshuai.xi uAddrCnt = 0;
1627*53ee8cc1Swenshuai.xi if (!pData)
1628*53ee8cc1Swenshuai.xi uSize = 0;
1629*53ee8cc1Swenshuai.xi //no meaning operation
1630*53ee8cc1Swenshuai.xi if (!uSize)
1631*53ee8cc1Swenshuai.xi {
1632*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_W]: No data for writing!\n");
1633*53ee8cc1Swenshuai.xi return FALSE;
1634*53ee8cc1Swenshuai.xi }
1635*53ee8cc1Swenshuai.xi
1636*53ee8cc1Swenshuai.xi //set transfer with stop
1637*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetTxfrStop(u32PortOffset,TRUE);
1638*53ee8cc1Swenshuai.xi //set slave address
1639*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetSlaveAddr(u32PortOffset,u8SlaveAddr);
1640*53ee8cc1Swenshuai.xi
1641*53ee8cc1Swenshuai.xi //#################
1642*53ee8cc1Swenshuai.xi // Set WRITE command
1643*53ee8cc1Swenshuai.xi //#################
1644*53ee8cc1Swenshuai.xi //set command buffer
1645*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_SetTxfrCmd(u32PortOffset,(MS_U8)uAddrCnt,pRegAddr)==FALSE)
1646*53ee8cc1Swenshuai.xi {
1647*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_W]: Set command buffer error!\n");
1648*53ee8cc1Swenshuai.xi return FALSE;
1649*53ee8cc1Swenshuai.xi }
1650*53ee8cc1Swenshuai.xi //set data to dram
1651*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_SetMiuData(u32PortOffset,uSize,pData)==FALSE)
1652*53ee8cc1Swenshuai.xi {
1653*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_W]: Set MIU data error!\n");
1654*53ee8cc1Swenshuai.xi return FALSE;
1655*53ee8cc1Swenshuai.xi }
1656*53ee8cc1Swenshuai.xi //##################
1657*53ee8cc1Swenshuai.xi // Trigger to WRITE
1658*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_WaitDone(u32PortOffset,HWI2C_DMA_WRITE)==FALSE)
1659*53ee8cc1Swenshuai.xi {
1660*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_W]: Transfer command error!\n");
1661*53ee8cc1Swenshuai.xi return FALSE;
1662*53ee8cc1Swenshuai.xi }
1663*53ee8cc1Swenshuai.xi
1664*53ee8cc1Swenshuai.xi return TRUE;
1665*53ee8cc1Swenshuai.xi }
1666*53ee8cc1Swenshuai.xi
1667*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1668*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_DMA_ReadBytes
1669*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Initialize HWI2C DMA
1670*53ee8cc1Swenshuai.xi /// @param <IN> \b u16SlaveCfg : slave id
1671*53ee8cc1Swenshuai.xi /// @param <IN> \b uAddrCnt : address size in bytes
1672*53ee8cc1Swenshuai.xi /// @param <IN> \b pRegAddr : address pointer
1673*53ee8cc1Swenshuai.xi /// @param <IN> \b uSize : data size in bytes
1674*53ee8cc1Swenshuai.xi /// @param <IN> \b pData : data pointer
1675*53ee8cc1Swenshuai.xi /// @param <OUT> \b None :
1676*53ee8cc1Swenshuai.xi /// @param <RET> \b TRUE : ok, FALSE : fail
1677*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_DMA_ReadBytes(MS_U32 u32PortOffset,MS_U16 u16SlaveCfg,MS_U32 uAddrCnt,MS_U8 * pRegAddr,MS_U32 uSize,MS_U8 * pData)1678*53ee8cc1Swenshuai.xi MS_BOOL HAL_HWI2C_DMA_ReadBytes(MS_U32 u32PortOffset, MS_U16 u16SlaveCfg, MS_U32 uAddrCnt, MS_U8 *pRegAddr, MS_U32 uSize, MS_U8 *pData)
1679*53ee8cc1Swenshuai.xi {
1680*53ee8cc1Swenshuai.xi MS_U8 u8SlaveAddr = LOW_BYTE(u16SlaveCfg)>>1;
1681*53ee8cc1Swenshuai.xi MS_U8 u8Port = HIGH_BYTE(u16SlaveCfg);
1682*53ee8cc1Swenshuai.xi HAL_HWI2C_ReadMode eReadMode;
1683*53ee8cc1Swenshuai.xi
1684*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1685*53ee8cc1Swenshuai.xi
1686*53ee8cc1Swenshuai.xi if (!pRegAddr)
1687*53ee8cc1Swenshuai.xi uAddrCnt = 0;
1688*53ee8cc1Swenshuai.xi if (!pData)
1689*53ee8cc1Swenshuai.xi uSize = 0;
1690*53ee8cc1Swenshuai.xi //no meaning operation
1691*53ee8cc1Swenshuai.xi if (!uSize)
1692*53ee8cc1Swenshuai.xi {
1693*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R]: No data for reading!\n");
1694*53ee8cc1Swenshuai.xi return FALSE;
1695*53ee8cc1Swenshuai.xi }
1696*53ee8cc1Swenshuai.xi if (u8Port>=HAL_HWI2C_PORTS)
1697*53ee8cc1Swenshuai.xi {
1698*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R]: Port failure!\n");
1699*53ee8cc1Swenshuai.xi return FALSE;
1700*53ee8cc1Swenshuai.xi }
1701*53ee8cc1Swenshuai.xi
1702*53ee8cc1Swenshuai.xi eReadMode = g_stPortCfg[u8Port].eReadMode;
1703*53ee8cc1Swenshuai.xi if(eReadMode>=E_HAL_HWI2C_READ_MODE_MAX)
1704*53ee8cc1Swenshuai.xi {
1705*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R]: Read mode failure!\n");
1706*53ee8cc1Swenshuai.xi return FALSE;
1707*53ee8cc1Swenshuai.xi }
1708*53ee8cc1Swenshuai.xi
1709*53ee8cc1Swenshuai.xi if(eReadMode!=E_HAL_HWI2C_READ_MODE_DIRECT)
1710*53ee8cc1Swenshuai.xi {
1711*53ee8cc1Swenshuai.xi //set transfer read mode
1712*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetReadMode(u32PortOffset,eReadMode);
1713*53ee8cc1Swenshuai.xi //set slave address
1714*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetSlaveAddr(u32PortOffset,u8SlaveAddr);
1715*53ee8cc1Swenshuai.xi
1716*53ee8cc1Swenshuai.xi //#################
1717*53ee8cc1Swenshuai.xi // Set WRITE command
1718*53ee8cc1Swenshuai.xi //#################
1719*53ee8cc1Swenshuai.xi //set command buffer
1720*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_SetTxfrCmd(u32PortOffset,(MS_U8)uAddrCnt,pRegAddr)==FALSE)
1721*53ee8cc1Swenshuai.xi {
1722*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R:W]: Set command buffer error!\n");
1723*53ee8cc1Swenshuai.xi return FALSE;
1724*53ee8cc1Swenshuai.xi }
1725*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetDataLen(u32PortOffset,0);
1726*53ee8cc1Swenshuai.xi
1727*53ee8cc1Swenshuai.xi //##################
1728*53ee8cc1Swenshuai.xi // Trigger to WRITE
1729*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_WaitDone(u32PortOffset,HWI2C_DMA_WRITE)==FALSE)
1730*53ee8cc1Swenshuai.xi {
1731*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R:W]: Transfer command error!\n");
1732*53ee8cc1Swenshuai.xi return FALSE;
1733*53ee8cc1Swenshuai.xi }
1734*53ee8cc1Swenshuai.xi }
1735*53ee8cc1Swenshuai.xi
1736*53ee8cc1Swenshuai.xi
1737*53ee8cc1Swenshuai.xi //#################
1738*53ee8cc1Swenshuai.xi // Set READ command
1739*53ee8cc1Swenshuai.xi //#################
1740*53ee8cc1Swenshuai.xi //set transfer with stop
1741*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetTxfrStop(u32PortOffset,TRUE);
1742*53ee8cc1Swenshuai.xi //set slave address
1743*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetSlaveAddr(u32PortOffset,u8SlaveAddr);
1744*53ee8cc1Swenshuai.xi //set command length to 0
1745*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetCmdLen(u32PortOffset,0);
1746*53ee8cc1Swenshuai.xi //set command length for reading
1747*53ee8cc1Swenshuai.xi HAL_HWI2C_DMA_SetDataLen(u32PortOffset,uSize);
1748*53ee8cc1Swenshuai.xi //##################
1749*53ee8cc1Swenshuai.xi // Trigger to READ
1750*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_WaitDone(u32PortOffset,HWI2C_DMA_READ)==FALSE)
1751*53ee8cc1Swenshuai.xi {
1752*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R:R]: Transfer command error!\n");
1753*53ee8cc1Swenshuai.xi return FALSE;
1754*53ee8cc1Swenshuai.xi }
1755*53ee8cc1Swenshuai.xi //get data to dram
1756*53ee8cc1Swenshuai.xi if(HAL_HWI2C_DMA_GetMiuData(u32PortOffset,uSize,pData)==FALSE)
1757*53ee8cc1Swenshuai.xi {
1758*53ee8cc1Swenshuai.xi HWI2C_HAL_ERR("[DMA_R:R]: Get MIU data error!\n");
1759*53ee8cc1Swenshuai.xi return FALSE;
1760*53ee8cc1Swenshuai.xi }
1761*53ee8cc1Swenshuai.xi
1762*53ee8cc1Swenshuai.xi return TRUE;
1763*53ee8cc1Swenshuai.xi }
1764*53ee8cc1Swenshuai.xi
1765*53ee8cc1Swenshuai.xi //#####################
1766*53ee8cc1Swenshuai.xi //
1767*53ee8cc1Swenshuai.xi // MIIC Miscellaneous Functions
1768*53ee8cc1Swenshuai.xi //
1769*53ee8cc1Swenshuai.xi //#####################
1770*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
1771*53ee8cc1Swenshuai.xi /// @brief \b Function \b Name: HAL_HWI2C_Init_ExtraProc
1772*53ee8cc1Swenshuai.xi /// @brief \b Function \b Description: Do extral procedure after initialization
1773*53ee8cc1Swenshuai.xi /// @param <IN> \b None :
1774*53ee8cc1Swenshuai.xi /// @param param \b None :
1775*53ee8cc1Swenshuai.xi /// @param <RET> \b None :
1776*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
HAL_HWI2C_Init_ExtraProc(void)1777*53ee8cc1Swenshuai.xi void HAL_HWI2C_Init_ExtraProc(void)
1778*53ee8cc1Swenshuai.xi {
1779*53ee8cc1Swenshuai.xi HWI2C_HAL_FUNC();
1780*53ee8cc1Swenshuai.xi //Extra procedure TODO
1781*53ee8cc1Swenshuai.xi }
1782*53ee8cc1Swenshuai.xi
1783*53ee8cc1Swenshuai.xi
1784