1*53ee8cc1Swenshuai.xi #include <linux/kernel.h>
2*53ee8cc1Swenshuai.xi #include <linux/string.h>
3*53ee8cc1Swenshuai.xi #include <linux/slab.h>
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi #include <linux/uaccess.h>
6*53ee8cc1Swenshuai.xi #include <linux/compat.h>
7*53ee8cc1Swenshuai.xi #include "MsTypes.h"
8*53ee8cc1Swenshuai.xi #include "utopia.h"
9*53ee8cc1Swenshuai.xi #include "drvHWI2C.h"
10*53ee8cc1Swenshuai.xi #include "drvHWI2C_v2.h"
11*53ee8cc1Swenshuai.xi #include "HWI2C_adp.h"
12*53ee8cc1Swenshuai.xi #include "utopia_adp.h"
13*53ee8cc1Swenshuai.xi #include "drvHWI2C_private.h"
14*53ee8cc1Swenshuai.xi
15*53ee8cc1Swenshuai.xi // no pointer member
16*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(MS_U8);
17*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_Status);
18*53ee8cc1Swenshuai.xi extern void* spt_MS_U8;
19*53ee8cc1Swenshuai.xi
20*53ee8cc1Swenshuai.xi //#define CONFIG_COMPAT
21*53ee8cc1Swenshuai.xi #define MSOS_TYPE_LINUX_KERNEL
22*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
23*53ee8cc1Swenshuai.xi // Global Variables
24*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
25*53ee8cc1Swenshuai.xi
26*53ee8cc1Swenshuai.xi #ifdef CONFIG_COMPAT
27*53ee8cc1Swenshuai.xi typedef struct DLL_PACKED
28*53ee8cc1Swenshuai.xi {
29*53ee8cc1Swenshuai.xi MS_U16 u16SlaveCfg;
30*53ee8cc1Swenshuai.xi MS_U32 uAddrCnt;
31*53ee8cc1Swenshuai.xi compat_uptr_t pRegAddr;
32*53ee8cc1Swenshuai.xi MS_U32 uSize;
33*53ee8cc1Swenshuai.xi compat_uptr_t pData;
34*53ee8cc1Swenshuai.xi MS_BOOL bReturn;
35*53ee8cc1Swenshuai.xi } _compat_stHWI2C_PRIVATE_PARAM_WriteBytes;
36*53ee8cc1Swenshuai.xi
37*53ee8cc1Swenshuai.xi typedef struct DLL_PACKED
38*53ee8cc1Swenshuai.xi {
39*53ee8cc1Swenshuai.xi MS_U16 u16SlaveCfg;
40*53ee8cc1Swenshuai.xi MS_U32 uAddrCnt;
41*53ee8cc1Swenshuai.xi compat_uptr_t pRegAddr;
42*53ee8cc1Swenshuai.xi MS_U32 uSize;
43*53ee8cc1Swenshuai.xi compat_uptr_t pData;
44*53ee8cc1Swenshuai.xi MS_BOOL bReturn;
45*53ee8cc1Swenshuai.xi } _compat_stHWI2C_PRIVATE_PARAM_ReadBytes;
46*53ee8cc1Swenshuai.xi #endif
47*53ee8cc1Swenshuai.xi
48*53ee8cc1Swenshuai.xi
49*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
50*53ee8cc1Swenshuai.xi // Local Defines
51*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
52*53ee8cc1Swenshuai.xi
53*53ee8cc1Swenshuai.xi
54*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
55*53ee8cc1Swenshuai.xi // Local Defines
56*53ee8cc1Swenshuai.xi //------------------------------------------------------------------------------
57*53ee8cc1Swenshuai.xi
58*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
59*53ee8cc1Swenshuai.xi #define CPY_FROM_USER(a,b,c) if(copy_from_user(a,b,c) != 0) { break; }
60*53ee8cc1Swenshuai.xi #define CPY_to_USER(a,b,c) if(copy_to_user(a,b,c) != 0) { break; }
61*53ee8cc1Swenshuai.xi #else
62*53ee8cc1Swenshuai.xi #define CPY_FROM_USER memcpy
63*53ee8cc1Swenshuai.xi #define CPY_to_USER memcpy
64*53ee8cc1Swenshuai.xi #endif //MSOS_TYPE_LINUX_KERNEL
65*53ee8cc1Swenshuai.xi
66*53ee8cc1Swenshuai.xi #if (defined(MSOS_TYPE_LINUX_KERNEL) && defined(CONFIG_COMPAT))
67*53ee8cc1Swenshuai.xi #define COMPAT_PTR(a) compat_ptr(a)
68*53ee8cc1Swenshuai.xi #define COMPAT_NEXT_PTR(a) (*((MS_U32*)compat_ptr((unsigned long)a)))
69*53ee8cc1Swenshuai.xi #define IS_CMP_TASK() is_compat_task()
70*53ee8cc1Swenshuai.xi
71*53ee8cc1Swenshuai.xi #define CMP_CPY_FROM_USER(a,b,c) if(copy_from_user(a, compat_ptr((unsigned long)b), c) != 0) { break; }
72*53ee8cc1Swenshuai.xi #define CMP_CPY_TO_USER(a,b,c) if(copy_to_user(compat_ptr((unsigned long)a), b, c) != 0) { break; }
73*53ee8cc1Swenshuai.xi
74*53ee8cc1Swenshuai.xi #else
75*53ee8cc1Swenshuai.xi #define COMPAT_PTR(a) (a)
76*53ee8cc1Swenshuai.xi #define COMPAT_NEXT_PTR(a) (*((MS_U32*)a))
77*53ee8cc1Swenshuai.xi #define IS_CMP_TASK() (FALSE)
78*53ee8cc1Swenshuai.xi #define CMP_CPY_FROM_USER CPY_FROM_USER
79*53ee8cc1Swenshuai.xi #define CMP_CPY_TO_USER CPY_to_USER
80*53ee8cc1Swenshuai.xi #endif //CONFIG_COMPAT
81*53ee8cc1Swenshuai.xi
82*53ee8cc1Swenshuai.xi
83*53ee8cc1Swenshuai.xi UADP_SPT_0NXT_DEF(HWI2C_UnitCfg);
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi
86*53ee8cc1Swenshuai.xi UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SelectPort);
87*53ee8cc1Swenshuai.xi UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SetClk);
88*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SetReadMode);
89*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_WriteByte);
90*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SelectPort1);
91*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SetClkP1);
92*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SetReadModeP1);
93*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_WriteByteP1);
94*53ee8cc1Swenshuai.xi //UADP_SPT_0NXT_DEF(HWI2C_PRIVATE_PARAM_SetDbgLevel);
95*53ee8cc1Swenshuai.xi // one pointer member
96*53ee8cc1Swenshuai.xi
97*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_Init);
98*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_GetPortIndex);
99*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_ReadByte);
100*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_ReadByteP1);
101*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_GetLibVer);
102*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT_DEF(HWI2C_PRIVATE_PARAM_GetStatus);
103*53ee8cc1Swenshuai.xi // two pointer member
104*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT_DEF(HWI2C_PRIVATE_PARAM_WriteBytes);
105*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT_DEF(HWI2C_PRIVATE_PARAM_ReadBytes);
106*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT_DEF(HWI2C_PRIVATE_PARAM_WriteBytesP1);
107*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT_DEF(HWI2C_PRIVATE_PARAM_ReadBytesP1);
108*53ee8cc1Swenshuai.xi
109*53ee8cc1Swenshuai.xi UADP_SDT_0_DEF(IIC_CFG_INIT);
110*53ee8cc1Swenshuai.xi UADP_SDT_1_DEF(HWIIC_PRIVATE_INIT);
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi
HWI2C_adp_Init(FUtopiaIOctl * pIoctl)113*53ee8cc1Swenshuai.xi MS_U32 HWI2C_adp_Init(FUtopiaIOctl* pIoctl)
114*53ee8cc1Swenshuai.xi {
115*53ee8cc1Swenshuai.xi //member of struct
116*53ee8cc1Swenshuai.xi UADP_SPT_0NXT(HWI2C_UnitCfg);
117*53ee8cc1Swenshuai.xi //set table
118*53ee8cc1Swenshuai.xi UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SelectPort);
119*53ee8cc1Swenshuai.xi UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SetClk);
120*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SetReadMode);
121*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_WriteByte);
122*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SelectPort1);
123*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SetClkP1);
124*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SetReadModeP1);
125*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_WriteByteP1);
126*53ee8cc1Swenshuai.xi // UADP_SPT_0NXT(HWI2C_PRIVATE_PARAM_SetDbgLevel);
127*53ee8cc1Swenshuai.xi
128*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_Init, psCfg, HWI2C_UnitCfg);
129*53ee8cc1Swenshuai.xi // UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_GetPortIndex, pu8Port, MS_U8);
130*53ee8cc1Swenshuai.xi // UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_ReadByte, pData, MS_U8);
131*53ee8cc1Swenshuai.xi // UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_ReadByteP1, pData, MS_U8);
132*53ee8cc1Swenshuai.xi //UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_GetLibVer, ppVersion, MSIF_Version);
133*53ee8cc1Swenshuai.xi // UADP_SPT_1NXT(HWI2C_PRIVATE_PARAM_GetStatus, pStatus, HWI2C_Status);
134*53ee8cc1Swenshuai.xi
135*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT(HWI2C_PRIVATE_PARAM_WriteBytes, pRegAddr, MS_U8, pData, MS_U8);
136*53ee8cc1Swenshuai.xi //UADP_SPT_2NXT(HWI2C_PRIVATE_PARAM_ReadBytes, pRegAddr, MS_U8, pData, MS_U8);
137*53ee8cc1Swenshuai.xi // UADP_SPT_2NXT(HWI2C_PRIVATE_PARAM_WriteBytesP1, pRegAddr, MS_U8, pData, MS_U8);
138*53ee8cc1Swenshuai.xi // UADP_SPT_2NXT(HWI2C_PRIVATE_PARAM_ReadBytesP1, pRegAddr, MS_U8, pData, MS_U8);
139*53ee8cc1Swenshuai.xi //set table
140*53ee8cc1Swenshuai.xi
141*53ee8cc1Swenshuai.xi UADP_SDT_NAME0(IIC_CFG_INIT,HWI2C_UnitCfg);
142*53ee8cc1Swenshuai.xi UADP_SDT_NAME1(HWIIC_PRIVATE_INIT,HWI2C_PRIVATE_PARAM_Init,UADP_SDT_P2N,psCfg,IIC_CFG_INIT);
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi *pIoctl= (FUtopiaIOctl)HWI2C_adp_Ioctl;
145*53ee8cc1Swenshuai.xi return 0;
146*53ee8cc1Swenshuai.xi }
147*53ee8cc1Swenshuai.xi
HWI2C_adp_Ioctl(void * pInstanceTmp,MS_U32 u32Cmd,void * const pArgs)148*53ee8cc1Swenshuai.xi MS_U32 HWI2C_adp_Ioctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
149*53ee8cc1Swenshuai.xi {
150*53ee8cc1Swenshuai.xi MS_U32 u32Ret=0;
151*53ee8cc1Swenshuai.xi char buffer_arg[128];
152*53ee8cc1Swenshuai.xi
153*53ee8cc1Swenshuai.xi switch(u32Cmd)
154*53ee8cc1Swenshuai.xi {
155*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_Init :
156*53ee8cc1Swenshuai.xi //u32Ret=UADPBypassIoctl(pInstanceTmp,u32Cmd,pArgs,spt_HWI2C_PRIVATE_PARAM_Init, NULL,buffer_arg,sizeof(buffer_arg));
157*53ee8cc1Swenshuai.xi u32Ret=UADPBypassIoctl(pInstanceTmp,u32Cmd,pArgs,spt_HWIIC_PRIVATE_INIT, spt_HWIIC_PRIVATE_INIT,buffer_arg,sizeof(buffer_arg));
158*53ee8cc1Swenshuai.xi break;
159*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_Start:
160*53ee8cc1Swenshuai.xi u32Ret=UtopiaIoctl(pInstanceTmp,u32Cmd,pArgs);
161*53ee8cc1Swenshuai.xi break;
162*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_Stop:
163*53ee8cc1Swenshuai.xi u32Ret=UtopiaIoctl(pInstanceTmp,u32Cmd,pArgs);
164*53ee8cc1Swenshuai.xi break;
165*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_SelectPort:
166*53ee8cc1Swenshuai.xi u32Ret=UADPBypassIoctl(pInstanceTmp,u32Cmd,pArgs,spt_HWI2C_PRIVATE_PARAM_SelectPort, NULL,buffer_arg,sizeof(buffer_arg));
167*53ee8cc1Swenshuai.xi break;
168*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_SetClk:
169*53ee8cc1Swenshuai.xi u32Ret=UADPBypassIoctl(pInstanceTmp,u32Cmd,pArgs,spt_HWI2C_PRIVATE_PARAM_SetClk, NULL,buffer_arg,sizeof(buffer_arg));
170*53ee8cc1Swenshuai.xi break;
171*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_WriteBytes:
172*53ee8cc1Swenshuai.xi {
173*53ee8cc1Swenshuai.xi #ifdef CONFIG_COMPAT
174*53ee8cc1Swenshuai.xi if(IS_CMP_TASK())
175*53ee8cc1Swenshuai.xi {
176*53ee8cc1Swenshuai.xi HWI2C_PRIVATE_PARAM_WriteBytes tmp;
177*53ee8cc1Swenshuai.xi _compat_stHWI2C_PRIVATE_PARAM_WriteBytes tmp_compat;
178*53ee8cc1Swenshuai.xi CMP_CPY_FROM_USER(&tmp_compat, pArgs, sizeof(_compat_stHWI2C_PRIVATE_PARAM_WriteBytes));
179*53ee8cc1Swenshuai.xi tmp.pRegAddr = kmalloc(sizeof(MS_U8)*tmp_compat.uAddrCnt,GFP_KERNEL);
180*53ee8cc1Swenshuai.xi tmp.pData = kmalloc(sizeof(MS_U8)*tmp_compat.uSize,GFP_KERNEL);
181*53ee8cc1Swenshuai.xi CMP_CPY_FROM_USER(tmp.pRegAddr, tmp_compat.pRegAddr, sizeof(MS_U8)*tmp_compat.uAddrCnt);
182*53ee8cc1Swenshuai.xi CMP_CPY_FROM_USER(tmp.pData, tmp_compat.pData, sizeof(MS_U8)*tmp_compat.uSize);
183*53ee8cc1Swenshuai.xi tmp.u16SlaveCfg=tmp_compat.u16SlaveCfg;
184*53ee8cc1Swenshuai.xi tmp.uAddrCnt=tmp_compat.uAddrCnt;
185*53ee8cc1Swenshuai.xi tmp.uSize=tmp_compat.uSize;
186*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pInstanceTmp,u32Cmd,&tmp);
187*53ee8cc1Swenshuai.xi tmp_compat.bReturn = tmp.bReturn;
188*53ee8cc1Swenshuai.xi CMP_CPY_TO_USER(pArgs,&tmp_compat,sizeof(_compat_stHWI2C_PRIVATE_PARAM_WriteBytes));
189*53ee8cc1Swenshuai.xi kfree(tmp.pRegAddr);
190*53ee8cc1Swenshuai.xi kfree(tmp.pData);
191*53ee8cc1Swenshuai.xi }
192*53ee8cc1Swenshuai.xi else
193*53ee8cc1Swenshuai.xi #endif
194*53ee8cc1Swenshuai.xi {
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi HWI2C_PRIVATE_PARAM_WriteBytes paramW;
197*53ee8cc1Swenshuai.xi CPY_FROM_USER(¶mW,pArgs,sizeof(HWI2C_PRIVATE_PARAM_WriteBytes));
198*53ee8cc1Swenshuai.xi MS_U8 u8AddLen = (paramW.uAddrCnt>0?paramW.uAddrCnt:1);
199*53ee8cc1Swenshuai.xi MS_U8 u8DataLen = (paramW.uSize>0?paramW.uSize:1);
200*53ee8cc1Swenshuai.xi MS_U8 u8Addr[u8AddLen];
201*53ee8cc1Swenshuai.xi MS_U8 u8Data[u8DataLen];
202*53ee8cc1Swenshuai.xi
203*53ee8cc1Swenshuai.xi if (paramW.uAddrCnt > 0)
204*53ee8cc1Swenshuai.xi CPY_FROM_USER(u8Addr, paramW.pRegAddr,paramW.uAddrCnt);
205*53ee8cc1Swenshuai.xi if (paramW.uSize > 0)
206*53ee8cc1Swenshuai.xi CPY_FROM_USER(u8Data, paramW.pData, paramW.uSize);
207*53ee8cc1Swenshuai.xi paramW.pData = u8Data;
208*53ee8cc1Swenshuai.xi paramW.pRegAddr = u8Addr;
209*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pInstanceTmp,u32Cmd,¶mW);
210*53ee8cc1Swenshuai.xi CPY_to_USER(&((HWI2C_PRIVATE_PARAM_WriteBytes *)pArgs)->bReturn , ¶mW.bReturn, sizeof(MS_BOOL));
211*53ee8cc1Swenshuai.xi }
212*53ee8cc1Swenshuai.xi break;
213*53ee8cc1Swenshuai.xi }
214*53ee8cc1Swenshuai.xi case MDrv_CMD_HWI2C_ReadBytes:
215*53ee8cc1Swenshuai.xi {
216*53ee8cc1Swenshuai.xi #ifdef CONFIG_COMPAT
217*53ee8cc1Swenshuai.xi if(IS_CMP_TASK())
218*53ee8cc1Swenshuai.xi {
219*53ee8cc1Swenshuai.xi HWI2C_PRIVATE_PARAM_ReadBytes tmpr;
220*53ee8cc1Swenshuai.xi _compat_stHWI2C_PRIVATE_PARAM_ReadBytes tmpr_compat;
221*53ee8cc1Swenshuai.xi CMP_CPY_FROM_USER(&tmpr_compat, pArgs, sizeof(_compat_stHWI2C_PRIVATE_PARAM_ReadBytes));
222*53ee8cc1Swenshuai.xi tmpr.pRegAddr = kmalloc(sizeof(MS_U8)*tmpr_compat.uAddrCnt,GFP_KERNEL);
223*53ee8cc1Swenshuai.xi tmpr.pData = kmalloc(sizeof(MS_U8)*tmpr_compat.uSize,GFP_KERNEL);
224*53ee8cc1Swenshuai.xi CMP_CPY_FROM_USER(tmpr.pRegAddr, tmpr_compat.pRegAddr, sizeof(MS_U8)*tmpr_compat.uAddrCnt);
225*53ee8cc1Swenshuai.xi tmpr.u16SlaveCfg=tmpr_compat.u16SlaveCfg;
226*53ee8cc1Swenshuai.xi tmpr.uAddrCnt=tmpr_compat.uAddrCnt;
227*53ee8cc1Swenshuai.xi tmpr.uSize=tmpr_compat.uSize;
228*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pInstanceTmp,u32Cmd,&tmpr);
229*53ee8cc1Swenshuai.xi tmpr_compat.bReturn = tmpr.bReturn;
230*53ee8cc1Swenshuai.xi CMP_CPY_TO_USER(tmpr_compat.pData,tmpr.pData,sizeof(MS_U8)*tmpr_compat.uSize);
231*53ee8cc1Swenshuai.xi CMP_CPY_TO_USER(pArgs,&tmpr_compat,sizeof(_compat_stHWI2C_PRIVATE_PARAM_ReadBytes));
232*53ee8cc1Swenshuai.xi kfree(tmpr.pRegAddr);
233*53ee8cc1Swenshuai.xi kfree(tmpr.pData);
234*53ee8cc1Swenshuai.xi }
235*53ee8cc1Swenshuai.xi else
236*53ee8cc1Swenshuai.xi #endif
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi
239*53ee8cc1Swenshuai.xi HWI2C_PRIVATE_PARAM_ReadBytes paramR;
240*53ee8cc1Swenshuai.xi CPY_FROM_USER(¶mR,pArgs,sizeof(HWI2C_PRIVATE_PARAM_ReadBytes));
241*53ee8cc1Swenshuai.xi MS_U8 u8AddLen = (paramR.uAddrCnt>0?paramR.uAddrCnt:1);
242*53ee8cc1Swenshuai.xi MS_U8 u8DataLen = (paramR.uSize>0?paramR.uSize:1);
243*53ee8cc1Swenshuai.xi MS_U8 u8Addr[u8AddLen];
244*53ee8cc1Swenshuai.xi MS_U8 u8Data[u8DataLen];
245*53ee8cc1Swenshuai.xi if (paramR.uAddrCnt > 0)
246*53ee8cc1Swenshuai.xi CPY_FROM_USER(u8Addr, paramR.pRegAddr,paramR.uAddrCnt);
247*53ee8cc1Swenshuai.xi paramR.pRegAddr = u8Addr;
248*53ee8cc1Swenshuai.xi paramR.pData = u8Data;
249*53ee8cc1Swenshuai.xi u32Ret = UtopiaIoctl(pInstanceTmp,u32Cmd,¶mR);
250*53ee8cc1Swenshuai.xi if (paramR.uSize > 0)
251*53ee8cc1Swenshuai.xi CPY_to_USER(((HWI2C_PRIVATE_PARAM_WriteBytes *)pArgs)->pData, u8Data, paramR.uSize);
252*53ee8cc1Swenshuai.xi CPY_to_USER(&((HWI2C_PRIVATE_PARAM_WriteBytes *)pArgs)->bReturn , ¶mR.bReturn, sizeof(MS_BOOL));
253*53ee8cc1Swenshuai.xi }
254*53ee8cc1Swenshuai.xi
255*53ee8cc1Swenshuai.xi break;
256*53ee8cc1Swenshuai.xi }
257*53ee8cc1Swenshuai.xi default:
258*53ee8cc1Swenshuai.xi break;
259*53ee8cc1Swenshuai.xi }
260*53ee8cc1Swenshuai.xi return u32Ret;
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi
264*53ee8cc1Swenshuai.xi
265*53ee8cc1Swenshuai.xi
266