xref: /utopia/UTPA2-700.0.x/modules/hdmi/utopia_adaption/mhl/adpMHL.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ///////////////////////////////////////////////////////////////////////////////////////////////////
79 ///
80 /// file    adpMHL.c
81 /// @author MStar Semiconductor Inc.
82 /// @brief  MHL driver Function
83 ///////////////////////////////////////////////////////////////////////////////////////////////////
84 
85 #ifndef _ADP_MHL_C_
86 #define _ADP_MHL_C_
87 
88 //-------------------------------------------------------------------------------------------------
89 //  Include Files
90 //-------------------------------------------------------------------------------------------------
91 // Common Definition
92 #include "MsCommon.h"
93 #include "MsVersion.h"
94 #include "MsDevice.h"
95 #include <linux/kernel.h>
96 #include <linux/sched.h>
97 
98 #ifdef MSOS_TYPE_LINUX_KERNEL
99 #include <linux/string.h>
100 #else
101 #include <string.h>
102 #endif
103 
104 #include <linux/slab.h>
105 #include <asm/uaccess.h>
106 #include <linux/compat.h>
107 
108 #include "utopia.h"
109 #include "utopia_dapi.h"
110 #include "utopia_adp.h"
111 
112 #include "apiMHL.h"
113 #include "apiMHL_private.h"
114 #include "adpMHL.h"
115 
116 //-------------------------------------------------------------------------------------------------
117 //  Local Defines
118 //-------------------------------------------------------------------------------------------------
119 #if(defined(CONFIG_MLOG))
120 #include "ULog.h"
121 
122 #define MADP_MHL_MSG_INFO(format, args...)      ULOGI("MHL", format, ##args)
123 #define MADP_MHL_MSG_WARNING(format, args...)   ULOGW("MHL", format, ##args)
124 #define MADP_MHL_MSG_DEBUG(format, args...)     ULOGD("MHL", format, ##args)
125 #define MADP_MHL_MSG_ERROR(format, args...)     ULOGE("MHL", format, ##args)
126 #define MADP_MHL_MSG_FATAL(format, args...)     ULOGF("MHL", format, ##args)
127 
128 #else
129 #define MADP_MHL_MSG_INFO(format, args...)      printf(format, ##args)
130 #define MADP_MHL_MSG_WARNING(format, args...)   printf(format, ##args)
131 #define MADP_MHL_MSG_DEBUG(format, args...)     printf(format, ##args)
132 #define MADP_MHL_MSG_ERROR(format, args...)     printf(format, ##args)
133 #define MADP_MHL_MSG_FATAL(format, args...)     printf(format, ##args)
134 
135 #endif
136 
137 #ifdef MSOS_TYPE_LINUX_KERNEL
138 #define CPY_FROM_USER(a,b,c)                    if(copy_from_user(a,b,c) != 0) { break; }
139 #define CPY_TO_USER(a,b,c)                      if(copy_to_user(a,b,c) != 0) { break; }
140 #else
141 #define CPY_FROM_USER                           memcpy
142 #define CPY_TO_USER                             memcpy
143 #endif  //MSOS_TYPE_LINUX_KERNEL
144 
145 #if (defined(MSOS_TYPE_LINUX_KERNEL) && defined(CONFIG_COMPAT))
146 #define COMPAT_PTR(a)                           compat_ptr(a)
147 #define COMPAT_NEXT_PTR(a)                      (*((MS_U32*)compat_ptr((unsigned long)a)))
148 #define IS_CMP_TASK()                           is_compat_task()
149 #define CMP_CPY_FROM_USER(a,b,c)                if(copy_from_user(a, compat_ptr((unsigned long)b), c) != 0)  {  break; }
150 #define CMP_CPY_TO_USER(a,b,c)                  if(copy_to_user(compat_ptr((unsigned long)a), b, c) != 0) { break;  }
151 #define MS_COMPAT_MHL                           compat_uptr_t
152 
153 #else
154 #define COMPAT_PTR(a)                           (a)
155 #define COMPAT_NEXT_PTR(a)                      (*((MS_U32*)a))
156 #define IS_CMP_TASK()                           (FALSE)
157 #define CMP_CPY_FROM_USER                       CPY_FROM_USER
158 #define CMP_CPY_TO_USER                         CPY_TO_USER
159 #define MS_COMPAT_MHL                           MS_U8*
160 
161 #endif //CONFIG_COMPAT
162 
163 //-------------------------------------------------------------------------------------------------
164 //  Local Structures
165 //-------------------------------------------------------------------------------------------------
166 typedef struct DLL_PACKED
167 {
168     MS_U8 ucEDIDSize;
169     MS_COMPAT_MHL ucEDIDTable;
170 } stMHL_READ_EDID_COMPAT, *pstMHL_READ_EDID_COMPAT;
171 
172 typedef struct DLL_PACKED
173 {
174     MS_BOOL bSendFlag;
175     MS_U8 ucAddress;
176     MS_U8 ucLength;
177     MS_COMPAT_MHL ucData;
178 } stMHL_SEND_WRITE_BURST_COMPAT, *pstMHL_SEND_WRITE_BURST_COMPAT;
179 
180 typedef struct DLL_PACKED
181 {
182     MS_BOOL bSendFlag;
183     MS_U8 ucLength;
184     MS_COMPAT_MHL ucData;
185 } stMHL_SEND_USER_WRITE_BURST_COMPAT, *pstMHL_SEND_USER_WRITE_BURST_COMPAT;
186 
187 //-------------------------------------------------------------------------------------------------
188 //  Global Variables
189 //-------------------------------------------------------------------------------------------------
190 
191 //-------------------------------------------------------------------------------------------------
192 //  Local Variables
193 //-------------------------------------------------------------------------------------------------
194 UADP_SPT_NAMEnNXT_DEF(MHL_MS_U8, 0);
195 // MAPI_CMD_MHL_SUPPORT_PATH -- stMHL_SET_SUPPORT_PATH
196 UADP_SPT_NAMEnNXT_DEF(MHL_SET_SUPPORT_PATH, 0);
197 // MAPI_CMD_MHL_INITIAL -- stMHL_INITIAL_SETTING
198 UADP_SPT_NAMEnNXT_DEF(MHL_LOAD_EDID_TABLE, 0);
199 UADP_SPT_NAMEnNXT_DEF(MHL_LOAD_DEVCAP_TABLE, 0);
200 UADP_SPT_NAMEnNXT_DEF(MHL_INITIAL_SETTING, 2);
201 // MAPI_CMD_MHL_HANDLER -- stMHL_POLLING_HANDLER
202 UADP_SPT_NAMEnNXT_DEF(MHL_POLLING_HANDLER, 0);
203 // MAPI_CMD_MHL_AUTO_SWITCH -- stMHL_AUTO_SWITCH_HANDLER
204 UADP_SPT_NAMEnNXT_DEF(MHL_AUTO_SWITCH_HANDLER, 1);
205 // MAPI_CMD_MHL_SET_POWER_STATE -- stMHL_SET_POWER_STATE
206 UADP_SPT_NAMEnNXT_DEF(MHL_SET_POWER_STATE, 0);
207 // MAPI_CMD_MHL_CBUS_CONTROL -- stMHL_CBUS_CONTROL
208 UADP_SPT_NAMEnNXT_DEF(MHL_CBUS_CONTROL, 0);
209 // MAPI_CMD_MHL_LOAD_EDID -- stMHL_LOAD_EDID
210 UADP_SPT_NAMEnNXT_DEF(MHL_LOAD_EDID, 1);
211 // MAPI_CMD_MHL_LOAD_DEVCAP -- stMHL_LOAD_DEVCAP
212 UADP_SPT_NAMEnNXT_DEF(MHL_LOAD_DEVCAP, 1);
213 // MAPI_CMD_MHL_SET_VENDER_ID -- stMHL_SET_VENDER_ID
214 UADP_SPT_NAMEnNXT_DEF(MHL_SET_VENDER_ID, 0);
215 // MAPI_CMD_MHL_SET_CABLE_DETECT_INVERT -- stMHL_SET_CABLE_DETECT_INVERT
216 UADP_SPT_NAMEnNXT_DEF(MHL_SET_CABLE_DETECT_INVERT, 0);
217 // MAPI_CMD_MHL_VBUS_CONFIG_SETTING -- stMHL_VBUS_CONFIG_SETTING
218 UADP_SPT_NAMEnNXT_DEF(MHL_VBUS_CONFIG_SETTING, 0);
219 // MAPI_CMD_MHL_ADJUST_I_CONTROL -- stMHL_ADJUST_I_CONTROL
220 UADP_SPT_NAMEnNXT_DEF(MHL_ADJUST_I_CONTROL, 0);
221 // MAPI_CMD_MHL_ADJUST_IMPEDANCE -- stMHL_ADJUST_IMPEDANCE
222 UADP_SPT_NAMEnNXT_DEF(MHL_ADJUST_IMPEDANCE, 0);
223 // MAPI_CMD_MHL_CABLE_DETECT_FLAG -- stMHL_CABLE_DETECT_FLAG
224 UADP_SPT_NAMEnNXT_DEF(MHL_CABLE_DETECT_FLAG, 0);
225 // MAPI_CMD_MHL_CBUS_CONNECT_FLAG -- stMHL_CBUS_CONNECT_FLAG
226 UADP_SPT_NAMEnNXT_DEF(MHL_CBUS_CONNECT_FLAG, 0);
227 // MAPI_CMD_MHL_CBUS_WAKEUP_INT_FLAG -- stMHL_CBUS_WAKEUP_INT_FLAG
228 UADP_SPT_NAMEnNXT_DEF(MHL_CBUS_WAKEUP_INT_FLAG, 0);
229 // MAPI_CMD_MHL_SOURCE_SUPPORT_RCP -- stMHL_SOURCE_SUPPORT_RCP
230 UADP_SPT_NAMEnNXT_DEF(MHL_SOURCE_SUPPORT_RCP, 0);
231 // MAPI_CMD_MHL_SOURCE_SUPPORT_RAP -- stMHL_SOURCE_SUPPORT_RAP
232 UADP_SPT_NAMEnNXT_DEF(MHL_SOURCE_SUPPORT_RAP, 0);
233 // MAPI_CMD_MHL_GET_STATUS_FLAG -- stMHL_GET_STATUS_FLAG
234 UADP_SPT_NAMEnNXT_DEF(MHL_GET_STATUS_FLAG, 0);
235 // MAPI_CMD_MHL_SEND_RAP_COMMAND -- stMHL_SEND_RAP_COMMAND
236 UADP_SPT_NAMEnNXT_DEF(MHL_SEND_RAP_COMMAND, 0);
237 // MAPI_CMD_MHL_SEND_RCP_COMMAND -- stMHL_SEND_RCP_COMMAND
238 UADP_SPT_NAMEnNXT_DEF(MHL_SEND_RCP_COMMAND, 0);
239 // MAPI_CMD_MHL_SEND_UCP_COMMAND -- stMHL_SEND_UCP_COMMAND
240 UADP_SPT_NAMEnNXT_DEF(MHL_SEND_UCP_COMMAND, 0);
241 // MAPI_CMD_MHL_GET_DEVICE_CAPABILITY -- stMHL_GET_DEVICE_CAPABILITY
242 UADP_SPT_NAMEnNXT_DEF(MHL_GET_DEVCAP_TABLE, 0);
243 UADP_SPT_NAMEnNXT_DEF(MHL_GET_DEVICE_CAPABILITY, 1);
244 // MAPI_CMD_MHL_GET_EXTEND_DEVICE_CAPABILITY -- stMHL_GET_EXTEND_DEVICE_CAPABILITY
245 UADP_SPT_NAMEnNXT_DEF(MHL_GET_XDEVCAP_TABLE, 0);
246 UADP_SPT_NAMEnNXT_DEF(MHL_GET_EXTEND_DEVICE_CAPABILITY, 1);
247 // MAPI_CMD_MHL_GET_VENDER_ID -- stMHL_GET_VENDER_ID
248 UADP_SPT_NAMEnNXT_DEF(MHL_GET_VENDER_ID, 1);
249 // MAPI_CMD_MHL_GET_WRITE_BURST_DATA -- stMHL_GET_WRITE_BURST_DATA
250 UADP_SPT_NAMEnNXT_DEF(MHL_WRITE_BURST_TABLE, 0);
251 UADP_SPT_NAMEnNXT_DEF(MHL_GET_WRITE_BURST_DATA, 1);
252 // MAPI_CMD_MHL_CALL_BACK_FUNCTION -- stMHL_CALL_BACK_FUNCTION
253 UADP_SPT_NAMEnNXT_DEF(MHL_CALL_BACK_FUNCTION, 0);
254 // MAPI_CMD_MHL_RCP_CALL_BACK_FUNCTION -- stMHL_RCP_CALL_BACK_FUNCTION
255 UADP_SPT_NAMEnNXT_DEF(MHL_RCP_CALL_BACK_FUNCTION, 0);
256 // MAPI_CMD_MHL_RAP_CALL_BACK_FUNCTION -- stMHL_RAP_CALL_BACK_FUNCTION
257 UADP_SPT_NAMEnNXT_DEF(MHL_RAP_CALL_BACK_FUNCTION, 0);
258 // MAPI_CMD_MHL_UCP_CALL_BACK_FUNCTION -- stMHL_UCP_CALL_BACK_FUNCTION
259 UADP_SPT_NAMEnNXT_DEF(MHL_UCP_CALL_BACK_FUNCTION, 0);
260 // MAPI_CMD_MHL_ATT_CALL_BACK_FUNCTION -- stMHL_ATT_CALL_BACK_FUNCTION
261 UADP_SPT_NAMEnNXT_DEF(MHL_ATT_CALL_BACK_FUNCTION, 0);
262 // MAPI_CMD_MHL_RBP_CALL_BACK_FUNCTION -- stMHL_RBP_CALL_BACK_FUNCTION
263 UADP_SPT_NAMEnNXT_DEF(MHL_RBP_CALL_BACK_FUNCTION, 0);
264 // MAPI_CMD_MHL_GET_CONFIGURATION -- stMHL_GET_CONFIGURATION
265 UADP_SPT_NAMEnNXT_DEF(MHL_GET_CONFIGURATION, 0);
266 
267 //-------------------------------------------------------------------------------------------------
268 //  Local Functions
269 //-------------------------------------------------------------------------------------------------
270 
271 //-------------------------------------------------------------------------------------------------
272 //  Global Functions
273 //-------------------------------------------------------------------------------------------------
274 
275 //**************************************************************************
276 //  [Function Name]:
277 //                  MHL_adp_Init()
278 //  [Description]
279 //
280 //  [Arguments]:
281 //
282 //  [Return]:
283 //
284 //**************************************************************************
285 MS_U32 MHL_adp_Init(FUtopiaIOctl* pIoctl)
286 {
287     MS_U32 ulDataSize = 0;
288 
289     UADP_SPT_NAME0NXT(MHL_MS_U8, MS_U8);
290     // MAPI_CMD_MHL_SUPPORT_PATH
291     UADP_SPT_NAME0NXT(MHL_SET_SUPPORT_PATH, stMHL_SET_SUPPORT_PATH);
292     // MAPI_CMD_MHL_INITIAL
293     ulDataSize = sizeof(MS_U8) *MHL_EDID_TABLE_SIZE;
294     UADP_SPT_BGN(&spt_MHL_LOAD_EDID_TABLE[0], ulDataSize);
295     UADP_SPT_FIN(&spt_MHL_LOAD_EDID_TABLE[1]);
296     ulDataSize = sizeof(MS_U8) *(MHL_DEVICE_CAPABILITY_SIZE +MHL_XDEVICE_CAPABILITY_SIZE);
297     UADP_SPT_BGN(&spt_MHL_LOAD_DEVCAP_TABLE[0], ulDataSize);
298     UADP_SPT_FIN(&spt_MHL_LOAD_DEVCAP_TABLE[1]);
299     UADP_SPT_NAME2NXT(MHL_INITIAL_SETTING, stMHL_INITIAL_SETTING, ucEDIDTable, MHL_LOAD_EDID_TABLE, ucDevcapTable, MHL_LOAD_DEVCAP_TABLE);
300     // MAPI_CMD_MHL_HANDLER
301     UADP_SPT_NAME0NXT(MHL_POLLING_HANDLER, stMHL_POLLING_HANDLER);
302     // MAPI_CMD_MHL_AUTO_SWITCH
303     UADP_SPT_NAME1NXT(MHL_AUTO_SWITCH_HANDLER, stMHL_AUTO_SWITCH_HANDLER, ucCbusPath, MHL_MS_U8);
304     // MAPI_CMD_MHL_SET_POWER_STATE
305     UADP_SPT_NAME0NXT(MHL_SET_POWER_STATE, stMHL_SET_POWER_STATE);
306     // MAPI_CMD_MHL_CBUS_CONTROL
307     UADP_SPT_NAME0NXT(MHL_CBUS_CONTROL, stMHL_CBUS_CONTROL);
308     // MAPI_CMD_MHL_LOAD_EDID
309     UADP_SPT_NAME1NXT(MHL_LOAD_EDID, stMHL_LOAD_EDID, ucEDIDTable, MHL_LOAD_EDID_TABLE);
310     // MAPI_CMD_MHL_LOAD_DEVCAP
311     UADP_SPT_NAME1NXT(MHL_LOAD_DEVCAP, stMHL_LOAD_DEVCAP, ucDevcapTable, MHL_LOAD_DEVCAP_TABLE);
312     // MAPI_CMD_MHL_SET_VENDER_ID
313     UADP_SPT_NAME0NXT(MHL_SET_VENDER_ID, stMHL_SET_VENDER_ID);
314     // MAPI_CMD_MHL_SET_CABLE_DETECT_INVERT
315     UADP_SPT_NAME0NXT(MHL_SET_CABLE_DETECT_INVERT, stMHL_SET_CABLE_DETECT_INVERT);
316     // MAPI_CMD_MHL_VBUS_CONFIG_SETTING
317     UADP_SPT_NAME0NXT(MHL_VBUS_CONFIG_SETTING, stMHL_VBUS_CONFIG_SETTING);
318     // MAPI_CMD_MHL_ADJUST_I_CONTROL
319     UADP_SPT_NAME0NXT(MHL_ADJUST_I_CONTROL, stMHL_ADJUST_I_CONTROL);
320     // MAPI_CMD_MHL_ADJUST_IMPEDANCE
321     UADP_SPT_NAME0NXT(MHL_ADJUST_IMPEDANCE, stMHL_ADJUST_IMPEDANCE);
322     // MAPI_CMD_MHL_CABLE_DETECT_FLAG
323     UADP_SPT_NAME0NXT(MHL_CABLE_DETECT_FLAG, stMHL_CABLE_DETECT_FLAG);
324     // MAPI_CMD_MHL_CBUS_CONNECT_FLAG
325     UADP_SPT_NAME0NXT(MHL_CBUS_CONNECT_FLAG, stMHL_CBUS_CONNECT_FLAG);
326     // MAPI_CMD_MHL_CBUS_WAKEUP_INT_FLAG
327     UADP_SPT_NAME0NXT(MHL_CBUS_WAKEUP_INT_FLAG, stMHL_CBUS_WAKEUP_INT_FLAG);
328     // MAPI_CMD_MHL_SOURCE_SUPPORT_RCP
329     UADP_SPT_NAME0NXT(MHL_SOURCE_SUPPORT_RCP, stMHL_SOURCE_SUPPORT_RCP);
330     // MAPI_CMD_MHL_SOURCE_SUPPORT_RAP
331     UADP_SPT_NAME0NXT(MHL_SOURCE_SUPPORT_RAP, stMHL_SOURCE_SUPPORT_RAP);
332     // MAPI_CMD_MHL_GET_STATUS_FLAG
333     UADP_SPT_NAME0NXT(MHL_GET_STATUS_FLAG, stMHL_GET_STATUS_FLAG);
334     // MAPI_CMD_MHL_SEND_RAP_COMMAND
335     UADP_SPT_NAME0NXT(MHL_SEND_RAP_COMMAND, stMHL_SEND_RAP_COMMAND);
336     // MAPI_CMD_MHL_SEND_RCP_COMMAND
337     UADP_SPT_NAME0NXT(MHL_SEND_RCP_COMMAND, stMHL_SEND_RCP_COMMAND);
338     // MAPI_CMD_MHL_SEND_UCP_COMMAND
339     UADP_SPT_NAME0NXT(MHL_SEND_UCP_COMMAND, stMHL_SEND_UCP_COMMAND);
340     // MAPI_CMD_MHL_GET_DEVICE_CAPABILITY
341     ulDataSize = sizeof(MS_U8) *MHL_DEVICE_CAPABILITY_SIZE;
342     UADP_SPT_BGN(&spt_MHL_GET_DEVCAP_TABLE[0], ulDataSize);
343     UADP_SPT_FIN(&spt_MHL_GET_DEVCAP_TABLE[1]);
344     UADP_SPT_NAME1NXT(MHL_GET_DEVICE_CAPABILITY, stMHL_GET_DEVICE_CAPABILITY, ucDeviceCapability, MHL_GET_DEVCAP_TABLE);
345     // MAPI_CMD_MHL_GET_EXTEND_DEVICE_CAPABILITY
346     ulDataSize = sizeof(MS_U8) *MHL_XDEVICE_CAPABILITY_SIZE;
347     UADP_SPT_BGN(&spt_MHL_GET_XDEVCAP_TABLE[0], ulDataSize);
348     UADP_SPT_FIN(&spt_MHL_GET_XDEVCAP_TABLE[1]);
349     UADP_SPT_NAME1NXT(MHL_GET_EXTEND_DEVICE_CAPABILITY, stMHL_GET_EXTEND_DEVICE_CAPABILITY, ucExtendDeviceCapability, MHL_GET_XDEVCAP_TABLE);
350     // MAPI_CMD_MHL_GET_VENDER_ID
351     UADP_SPT_NAME1NXT(MHL_GET_VENDER_ID, stMHL_GET_VENDER_ID, ucVenderID, MHL_MS_U8);
352     // MAPI_CMD_MHL_GET_WRITE_BURST_DATA
353     ulDataSize = sizeof(MS_U8) *MHL_MSC_SCRATCHPAD_SIZE;
354     UADP_SPT_BGN(&spt_MHL_WRITE_BURST_TABLE[0], ulDataSize);
355     UADP_SPT_FIN(&spt_MHL_WRITE_BURST_TABLE[1]);
356     UADP_SPT_NAME1NXT(MHL_GET_WRITE_BURST_DATA, stMHL_GET_WRITE_BURST_DATA, ucWriteBurstData, MHL_WRITE_BURST_TABLE);
357     // MAPI_CMD_MHL_CALL_BACK_FUNCTION
358     UADP_SPT_NAME0NXT(MHL_CALL_BACK_FUNCTION, stMHL_CALL_BACK_FUNCTION);
359     // MAPI_CMD_MHL_RCP_CALL_BACK_FUNCTION
360     UADP_SPT_NAME0NXT(MHL_RCP_CALL_BACK_FUNCTION, stMHL_RCP_CALL_BACK_FUNCTION);
361     // MAPI_CMD_MHL_RAP_CALL_BACK_FUNCTION
362     UADP_SPT_NAME0NXT(MHL_RAP_CALL_BACK_FUNCTION, stMHL_RAP_CALL_BACK_FUNCTION);
363     // MAPI_CMD_MHL_UCP_CALL_BACK_FUNCTION
364     UADP_SPT_NAME0NXT(MHL_UCP_CALL_BACK_FUNCTION, stMHL_UCP_CALL_BACK_FUNCTION);
365     // MAPI_CMD_MHL_ATT_CALL_BACK_FUNCTION
366     UADP_SPT_NAME0NXT(MHL_ATT_CALL_BACK_FUNCTION, stMHL_ATT_CALL_BACK_FUNCTION);
367     // MAPI_CMD_MHL_RBP_CALL_BACK_FUNCTION
368     UADP_SPT_NAME0NXT(MHL_RBP_CALL_BACK_FUNCTION, stMHL_RBP_CALL_BACK_FUNCTION);
369     // MAPI_CMD_MHL_GET_CONFIGURATION
370     UADP_SPT_NAME0NXT(MHL_GET_CONFIGURATION, stMHL_GET_CONFIGURATION);
371 
372     *pIoctl= (FUtopiaIOctl)MHL_adp_Ioctl;
373 
374     return 0;
375 }
376 
377 //**************************************************************************
378 //  [Function Name]:
379 //                  MHL_adp_Ioctl()
380 //  [Description]
381 //
382 //  [Arguments]:
383 //
384 //  [Return]:
385 //
386 //**************************************************************************
387 MS_U32 MHL_adp_Ioctl(void* pInstanceTmp, MS_U32 u32Cmd, void* const pArgs)
388 {
389     char usbuffer_arg[2];
390     MS_U32 ulReturnValue = UTOPIA_STATUS_SUCCESS;
391     MS_U32 ulDataSize = 0;
392 
393     switch(u32Cmd)
394     {
395         case MAPI_CMD_MHL_SUPPORT_PATH:
396             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SET_SUPPORT_PATH, NULL, usbuffer_arg, sizeof(usbuffer_arg));
397             break;
398 
399         case MAPI_CMD_MHL_INITIAL:
400             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_INITIAL_SETTING, NULL, usbuffer_arg, sizeof(usbuffer_arg));
401             break;
402 
403         case MAPI_CMD_MHL_HANDLER:
404             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_POLLING_HANDLER, usbuffer_arg, sizeof(usbuffer_arg));
405             break;
406 
407         case MAPI_CMD_MHL_AUTO_SWITCH:
408             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_AUTO_SWITCH_HANDLER, spt_MHL_AUTO_SWITCH_HANDLER, usbuffer_arg, sizeof(usbuffer_arg));
409             break;
410 
411         case MAPI_CMD_MHL_SET_POWER_STATE:
412             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SET_POWER_STATE, spt_MHL_SET_POWER_STATE, usbuffer_arg, sizeof(usbuffer_arg));
413             break;
414 
415         case MAPI_CMD_MHL_CBUS_CONTROL:
416             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_CBUS_CONTROL, NULL, usbuffer_arg, sizeof(usbuffer_arg));
417             break;
418 
419         case MAPI_CMD_MHL_LOAD_EDID:
420             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_LOAD_EDID, NULL, usbuffer_arg, sizeof(usbuffer_arg));
421             break;
422 
423         case MAPI_CMD_MHL_READ_EDID:
424             {
425                 stMHL_READ_EDID stMHLArgs = {0};
426 
427                 if(IS_CMP_TASK())
428                 {
429                     stMHL_READ_EDID_COMPAT stCompatMHLArgs = {0};
430 
431                     CMP_CPY_FROM_USER(&stCompatMHLArgs, pArgs, sizeof(stMHL_READ_EDID_COMPAT));
432 
433                     ulDataSize = sizeof(MS_U8) *stCompatMHLArgs.ucEDIDSize;
434 
435                     stMHLArgs.ucEDIDTable = malloc(ulDataSize);
436                     stMHLArgs.ucEDIDSize = stCompatMHLArgs.ucEDIDSize;
437 
438                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
439 
440                     CMP_CPY_TO_USER(stCompatMHLArgs.ucEDIDTable, stMHLArgs.ucEDIDTable, ulDataSize);
441                     CMP_CPY_TO_USER(pArgs, &stCompatMHLArgs, sizeof(stMHL_READ_EDID_COMPAT));
442 
443                     free(stMHLArgs.ucEDIDTable);
444                 }
445                 else
446                 {
447                     CPY_FROM_USER(&stMHLArgs, pArgs, sizeof(stMHL_READ_EDID));
448 
449                     ulDataSize = sizeof(MS_U8) *stMHLArgs.ucEDIDSize;
450 
451                     stMHLArgs.ucEDIDTable = malloc(ulDataSize);
452 
453                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
454 
455                     CPY_TO_USER(pArgs, &stMHLArgs, sizeof(stMHL_READ_EDID));
456 
457                     free(stMHLArgs.ucEDIDTable);
458                 }
459             }
460             break;
461 
462         case MAPI_CMD_MHL_LOAD_DEVCAP:
463             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_LOAD_DEVCAP, NULL, usbuffer_arg, sizeof(usbuffer_arg));
464             break;
465 
466         case MAPI_CMD_MHL_SET_VENDER_ID:
467             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SET_VENDER_ID, NULL, usbuffer_arg, sizeof(usbuffer_arg));
468             break;
469 
470         case MAPI_CMD_MHL_SET_CABLE_DETECT_INVERT:
471             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SET_CABLE_DETECT_INVERT, NULL, usbuffer_arg, sizeof(usbuffer_arg));
472             break;
473 
474         case MAPI_CMD_MHL_VBUS_CONFIG_SETTING:
475             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_VBUS_CONFIG_SETTING, NULL, usbuffer_arg, sizeof(usbuffer_arg));
476             break;
477 
478         case MAPI_CMD_MHL_ADJUST_I_CONTROL:
479             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_ADJUST_I_CONTROL, NULL, usbuffer_arg, sizeof(usbuffer_arg));
480             break;
481 
482         case MAPI_CMD_MHL_ADJUST_IMPEDANCE:
483             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_ADJUST_IMPEDANCE, NULL, usbuffer_arg, sizeof(usbuffer_arg));
484             break;
485 
486         case MAPI_CMD_MHL_CABLE_DETECT_FLAG:
487             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_CABLE_DETECT_FLAG, usbuffer_arg, sizeof(usbuffer_arg));
488             break;
489 
490         case MAPI_CMD_MHL_CBUS_CONNECT_FLAG:
491             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_CBUS_CONNECT_FLAG, usbuffer_arg, sizeof(usbuffer_arg));
492             break;
493 
494         case MAPI_CMD_MHL_CBUS_WAKEUP_INT_FLAG:
495             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_CBUS_WAKEUP_INT_FLAG, usbuffer_arg, sizeof(usbuffer_arg));
496             break;
497 
498         case MAPI_CMD_MHL_SOURCE_SUPPORT_RCP:
499             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_SOURCE_SUPPORT_RCP, usbuffer_arg, sizeof(usbuffer_arg));
500             break;
501 
502         case MAPI_CMD_MHL_SOURCE_SUPPORT_RAP:
503             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_SOURCE_SUPPORT_RAP, usbuffer_arg, sizeof(usbuffer_arg));
504             break;
505 
506         case MAPI_CMD_MHL_GET_STATUS_FLAG:
507             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_GET_STATUS_FLAG, spt_MHL_GET_STATUS_FLAG, usbuffer_arg, sizeof(usbuffer_arg));
508             break;
509 
510         case MAPI_CMD_MHL_SEND_RAP_COMMAND:
511             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SEND_RAP_COMMAND, spt_MHL_SEND_RAP_COMMAND, usbuffer_arg, sizeof(usbuffer_arg));
512             break;
513 
514         case MAPI_CMD_MHL_SEND_RCP_COMMAND:
515             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SEND_RCP_COMMAND, spt_MHL_SEND_RCP_COMMAND, usbuffer_arg, sizeof(usbuffer_arg));
516             break;
517 
518         case MAPI_CMD_MHL_SEND_UCP_COMMAND:
519             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_SEND_UCP_COMMAND, spt_MHL_SEND_UCP_COMMAND, usbuffer_arg, sizeof(usbuffer_arg));
520             break;
521 
522         case MAPI_CMD_MHL_SEND_WRITE_BURST:
523             {
524                 stMHL_SEND_WRITE_BURST stMHLArgs = {0};
525 
526                 if(IS_CMP_TASK())
527                 {
528                     stMHL_SEND_WRITE_BURST_COMPAT stCompatMHLArgs = {0};
529 
530                     CMP_CPY_FROM_USER(&stCompatMHLArgs, pArgs, sizeof(stMHL_SEND_WRITE_BURST_COMPAT));
531 
532                     ulDataSize = sizeof(MS_U8) *stCompatMHLArgs.ucLength;
533 
534                     stMHLArgs.ucData = malloc(ulDataSize);
535                     CMP_CPY_FROM_USER(stMHLArgs.ucData, stCompatMHLArgs.ucData, ulDataSize);
536                     stMHLArgs.ucAddress = stCompatMHLArgs.ucAddress;
537                     stMHLArgs.ucLength = stCompatMHLArgs.ucLength;
538 
539                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
540 
541                     stCompatMHLArgs.bSendFlag = stMHLArgs.bSendFlag;
542 
543                     CMP_CPY_TO_USER(pArgs, &stCompatMHLArgs, sizeof(stMHL_SEND_WRITE_BURST_COMPAT));
544 
545                     free(stMHLArgs.ucData);
546                 }
547                 else
548                 {
549                     void *pData = NULL;
550 
551                     CPY_FROM_USER(&stMHLArgs, pArgs, sizeof(stMHL_SEND_WRITE_BURST));
552 
553                     ulDataSize = sizeof(MS_U8) *stMHLArgs.ucLength;
554 
555                     pData = stMHLArgs.ucData;
556                     stMHLArgs.ucData = malloc(ulDataSize);
557                     CPY_FROM_USER(stMHLArgs.ucData, pData, ulDataSize);
558 
559                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
560 
561                     CPY_TO_USER(pArgs, &stMHLArgs, sizeof(stMHL_SEND_WRITE_BURST));
562 
563                     free(stMHLArgs.ucData);
564                 }
565             }
566             break;
567 
568         case MAPI_CMD_MHL_SEND_USER_WRITE_BURST:
569             {
570                 stMHL_SEND_USER_WRITE_BURST stMHLArgs = {0};
571 
572                 if(IS_CMP_TASK())
573                 {
574                     stMHL_SEND_USER_WRITE_BURST_COMPAT stCompatMHLArgs = {0};
575 
576                     CMP_CPY_FROM_USER(&stCompatMHLArgs, pArgs, sizeof(stMHL_SEND_USER_WRITE_BURST_COMPAT));
577 
578                     ulDataSize = sizeof(MS_U8) *stCompatMHLArgs.ucLength;
579 
580                     stMHLArgs.ucData = malloc(ulDataSize);
581                     CMP_CPY_FROM_USER(stMHLArgs.ucData, stCompatMHLArgs.ucData, ulDataSize);
582                     stMHLArgs.ucLength = stCompatMHLArgs.ucLength;
583 
584                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
585 
586                     stCompatMHLArgs.bSendFlag = stMHLArgs.bSendFlag;
587 
588                     CMP_CPY_TO_USER(pArgs, &stCompatMHLArgs, sizeof(stMHL_SEND_USER_WRITE_BURST_COMPAT));
589 
590                     free(stMHLArgs.ucData);
591                 }
592                 else
593                 {
594                     void *pData = NULL;
595 
596                     CPY_FROM_USER(&stMHLArgs, pArgs, sizeof(stMHL_SEND_USER_WRITE_BURST));
597 
598                     ulDataSize = sizeof(MS_U8) *stMHLArgs.ucLength;
599 
600                     pData = stMHLArgs.ucData;
601                     stMHLArgs.ucData = malloc(ulDataSize);
602                     CPY_FROM_USER(stMHLArgs.ucData, pData, ulDataSize);
603 
604                     ulReturnValue = UtopiaIoctl(pInstanceTmp, u32Cmd, &stMHLArgs);
605 
606                     CPY_TO_USER(pArgs, &stMHLArgs, sizeof(stMHL_SEND_USER_WRITE_BURST));
607 
608                     free(stMHLArgs.ucData);
609                 }
610             }
611             break;
612 
613         case MAPI_CMD_MHL_GET_DEVICE_CAPABILITY:
614             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_GET_DEVICE_CAPABILITY, spt_MHL_GET_DEVICE_CAPABILITY, usbuffer_arg, sizeof(usbuffer_arg));
615             break;
616 
617         case MAPI_CMD_MHL_GET_EXTEND_DEVICE_CAPABILITY:
618             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_GET_EXTEND_DEVICE_CAPABILITY, spt_MHL_GET_EXTEND_DEVICE_CAPABILITY, usbuffer_arg, sizeof(usbuffer_arg));
619             break;
620 
621         case MAPI_CMD_MHL_GET_VENDER_ID:
622             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_GET_VENDER_ID, spt_MHL_GET_VENDER_ID, usbuffer_arg, sizeof(usbuffer_arg));
623             break;
624 
625         case MAPI_CMD_MHL_GET_WRITE_BURST_DATA:
626             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_GET_WRITE_BURST_DATA, spt_MHL_GET_WRITE_BURST_DATA, usbuffer_arg, sizeof(usbuffer_arg));
627             break;
628 
629         case MAPI_CMD_MHL_CALL_BACK_FUNCTION:
630             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
631             break;
632 
633         case MAPI_CMD_MHL_RCP_CALL_BACK_FUNCTION:
634             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_RCP_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
635             break;
636 
637         case MAPI_CMD_MHL_RAP_CALL_BACK_FUNCTION:
638             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_RAP_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
639             break;
640 
641         case MAPI_CMD_MHL_UCP_CALL_BACK_FUNCTION:
642             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_UCP_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
643             break;
644 
645         case MAPI_CMD_MHL_ATT_CALL_BACK_FUNCTION:
646             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_ATT_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
647             break;
648 
649         case MAPI_CMD_MHL_RBP_CALL_BACK_FUNCTION:
650             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, spt_MHL_RBP_CALL_BACK_FUNCTION, NULL, usbuffer_arg, sizeof(usbuffer_arg));
651             break;
652 
653         case MAPI_CMD_MHL_GET_CONFIGURATION:
654             ulReturnValue = UADPBypassIoctl(pInstanceTmp, u32Cmd, pArgs, NULL, spt_MHL_GET_CONFIGURATION, usbuffer_arg, sizeof(usbuffer_arg));
655             break;
656 
657         default:
658 
659             break;
660     };
661 
662     return ulReturnValue;
663 }
664 
665 #endif // _ADP_MHL_C_