xref: /utopia/UTPA2-700.0.x/modules/sar/drv/sar/drvSAR.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 // Copyright (c) 2009-2010 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 
95 ///////////////////////////////////////////////////////////////////////////////////////////////////
96 ///
97 /// file    drvSAR.c
98 /// @brief  SAR Driver Interface
99 /// @author MStar Semiconductor Inc.
100 ///////////////////////////////////////////////////////////////////////////////////////////////////
101 
102 
103 //##################################
104 //
105 //  Access SAR settings by using Mailbox
106 //  sent commands to PM
107 //
108 //##################################
109 //-------------------------------------------------------------------------------------------------
110 //  Include Files
111 //-------------------------------------------------------------------------------------------------
112 // Common Definition
113 #ifdef MSOS_TYPE_LINUX_KERNEL
114 #include <linux/string.h> //for memcpy, memset
115 #else
116 #include <string.h> //for memcpy, memset
117 #endif // end MSOS_TYPE_LINUX_KERNEL
118 #include "MsCommon.h"
119 #include "MsVersion.h"
120 #ifndef MSOS_TYPE_LINUX_KERNEL
121 #include "drvMBX.h"
122 #endif // end MSOS_TYPE_LINUX_KERNEL
123 #include "drvSAR.h"
124 #include "utopia_dapi.h"
125 #include "utopia.h"
126 #include "drvSAR_v2.h"
127 #include "drvSAR_private.h"
128 
129 #include "ULog.h"
130 
131 // Internal Definition
132 //-------------------------------------------------------------------------------------------------
133 //  Driver Compiler Options
134 //-------------------------------------------------------------------------------------------------
135 
136 
137 //-------------------------------------------------------------------------------------------------
138 //  Local Defines
139 //-------------------------------------------------------------------------------------------------
140 #define TAG_SAR "SAR"
141 #define SAR_MBX_QUEUESIZE       8
142 #define SAR_MBX_TIMEOUT         5000
143 
144 #ifdef CONFIG_MSTAR_UTPA2K_SAR_ENABLE
145 #define SAR_UTOPIA20  (1)
146 #else
147 #define SAR_UTOPIA20  (0)
148 #endif
149 //-------------------------------------------------------------------------------------------------
150 //  Local Structurs
151 //-------------------------------------------------------------------------------------------------
152 typedef struct
153 {
154     MS_U8 u8Reserved[16]; //Dummy Write for flushing MIU FIFO
155 
156 }SAR_Dummy;
157 
158 
159 //-------------------------------------------------------------------------------------------------
160 //  Global Variables
161 //-------------------------------------------------------------------------------------------------
162 
163 #if (SAR_UTOPIA20)
164 MS_BOOL bU20SAROpened = FALSE;
165 void* pInstantSar;
166 void* pAttributeSar;
167 #endif
168 //-------------------------------------------------------------------------------------------------
169 //  Local Variables
170 //-------------------------------------------------------------------------------------------------
171 static SAR_DbgLvl _gSARDbgLevel = E_SAR_DBGLVL_ERROR;
172 
173 static MSIF_Version _drv_sar_version = {
174     .DDI = { SAR_DRV_VERSION },
175 };
176 
177 static MS_BOOL gbSARInitialized = FALSE;
178 static SAR_AckFlags gSARAckFlags;
179 static MS_U8 gu8SARKey;
180 static MS_U8 gu8SARRepeat;
181 static MS_U8 gu8SARStatus;
182 static SAR_DrvInfo gSARDrvInfo;
183 static SAR_Callback gfSARCallback = NULL;
184 static SAR_Result gSARResult;
185 #ifndef MSOS_TYPE_LINUX_KERNEL
186 static MBX_Result gMBXResult;
187 #endif // end MSOS_TYPE_LINUX_KERNEL
188 
189 //-------------------------------------------------------------------------------------------------
190 //  Debug Functions
191 //-------------------------------------------------------------------------------------------------
192 #define SAR_DBG_FUNC()               if (_gSARDbgLevel >= E_SAR_DBGLVL_ALL) \
193                                         {MS_DEBUG_MSG(ULOGD(TAG_SAR, "\t====   %s   ====\n", __FUNCTION__);)}
194 #define SAR_DBG_INFO(x, args...)     if (_gSARDbgLevel >= E_SAR_DBGLVL_INFO ) \
195                                         {MS_DEBUG_MSG(ULOGI(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGI(TAG_SAR, x, ##args);)}
196 #define SAR_DBG_ERR(x, args...)      if (_gSARDbgLevel >= E_SAR_DBGLVL_ERROR) \
197                                         {MS_DEBUG_MSG(ULOGE(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGE(TAG_SAR, x, ##args);)}
198 #define SAR_DBG_WARN(x, args...)     if (_gSARDbgLevel >= E_SAR_DBGLVL_WARNING) \
199                                         {MS_DEBUG_MSG(ULOGW(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGW(TAG_SAR, x, ##args);)}
200 
201 //-------------------------------------------------------------------------------------------------
202 //  Local Functions
203 //-------------------------------------------------------------------------------------------------
204 //define mutex
205 #define SAR_MUTEX_CREATE()
206 #define SAR_MUTEX_LOCK()
207 #define SAR_MUTEX_UNLOCK()
208 #define SAR_MUTEX_DELETE()
209 
210 
211 #ifndef MSOS_TYPE_LINUX_KERNEL
212 //-------------------------------------------------------------------------------------------------
213 //  Global Functions
214 //-------------------------------------------------------------------------------------------------
215 //it is called by PM51 side MailBox driver(MailBox ISR)
_SAR_MailBoxCallbackHandler(MBX_Msg * pMsg,MS_BOOL * pbAddToQueue)216 static void _SAR_MailBoxCallbackHandler( MBX_Msg *pMsg, MS_BOOL *pbAddToQueue)
217 {
218     SAR_DBG_FUNC();
219 
220     *pbAddToQueue = FALSE; //no need to add to queue
221 
222     if(!pMsg) return;
223 
224     if(pMsg->u8MsgClass!= E_MBX_CLASS_SAR_NOWAIT)
225     {
226         SAR_DBG_ERR("Invalid Message Class!\n");
227         return;
228     }
229 
230     // check control type
231     if ((pMsg->u8Ctrl != 4) && (pMsg->u8Ctrl != 5))
232     {
233         gSARResult = E_SAR_FAIL;
234         SAR_DBG_INFO("Control: 0x%02x\n", pMsg->u8Ctrl);
235         SAR_DBG_ERR("Not Implemented!\n");
236         return;
237     }
238     SAR_DBG_INFO("Get SAR command: 0x%02x\n", pMsg->u8Index);
239     SAR_DBG_INFO("Parameter[0]=%d\n",  pMsg->u8Parameters[0]);
240     SAR_DBG_INFO("Parameter[1]=%d\n",  pMsg->u8Parameters[1]);
241     gSARResult = E_SAR_FAIL;
242     if (pMsg->u8Index == E_SAR_51ToCPU_CMD_KEYCODE)
243     {
244         //Notification from MCU51
245         gSARResult = E_SAR_OK;
246         gu8SARKey = (MS_U8)pMsg->u8Parameters[0];
247         gu8SARRepeat = (MS_U8)pMsg->u8Parameters[1];
248         SAR_DBG_INFO("Notify => (key=0x%02x, repeat=0x%02x)\n", gu8SARKey,gu8SARRepeat);
249         if(gfSARCallback)
250         {
251             gfSARCallback(gu8SARKey, gu8SARRepeat);
252         }
253     }
254 
255     return;
256 
257 }
258 
_SAR_MailBoxHandler(MBX_Class eMsgClass,MBX_MSGQ_Status * pMsgQueueStatus)259 static void _SAR_MailBoxHandler(MBX_Class eMsgClass, MBX_MSGQ_Status *pMsgQueueStatus)
260 {
261     MBX_Msg MB_Command;
262 
263     SAR_DBG_FUNC();
264 
265     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
266     gMBXResult = MDrv_MBX_RecvMsg(E_MBX_CLASS_SAR, &MB_Command, SAR_MBX_TIMEOUT/*ms*/, MBX_CHECK_NORMAL_MSG);
267     if (gMBXResult == E_MBX_ERR_TIME_OUT)
268     {
269         SAR_DBG_ERR("Handler Timeout!\n");
270         return;
271     }
272 
273     if (gMBXResult == E_MBX_SUCCESS)
274     {
275         if ((MB_Command.u8Ctrl != 0) && (MB_Command.u8Ctrl != 1))
276         {
277             gSARResult = E_SAR_FAIL;
278             SAR_DBG_ERR("Not Implemented!\n");
279             return;
280         }
281         SAR_DBG_INFO("Get SAR command: 0x%02x.\n", MB_Command.u8Index);
282         SAR_DBG_INFO("Parameter[0]=0x%02x\n",  MB_Command.u8Parameters[0]);
283         SAR_DBG_INFO("Parameter[1]=0x%02x\n",  MB_Command.u8Parameters[1]);
284         gSARResult = E_SAR_FAIL;
285         switch (MB_Command.u8Index)
286         {
287             case E_SAR_51ToCPU_CMD_ACK_INIT:
288                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
289                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_INIT);
290                 break;
291             case E_SAR_51ToCPU_CMD_ACK_CONFIG:
292                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
293                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_CONFIG);
294                 break;
295             case E_SAR_51ToCPU_CMD_ACK_KEYCODE:
296                 gSARResult = E_SAR_OK;
297                 gu8SARKey = MB_Command.u8Parameters[0];
298                 gu8SARRepeat = MB_Command.u8Parameters[1];
299                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_KEYCODE);
300                 break;
301             case E_SAR_51ToCPU_CMD_ACK_SETCLBK:
302                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
303                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_SETCLBK);
304                 break;
305             case E_SAR_51ToCPU_CMD_ACK_LIBVER:
306                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
307                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_LIBVER);
308                 break;
309             case E_SAR_51ToCPU_CMD_ACK_STATUS:
310                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
311                 gu8SARStatus = MB_Command.u8Parameters[1];
312                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_STATUS);
313                 break;
314             case E_SAR_51ToCPU_CMD_ACK_ENABLE:
315                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
316                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_ENABLE);
317                 break;
318             case E_SAR_51ToCPU_CMD_ACK_INFO:
319                 gSARResult = (SAR_Result)MB_Command.u8Parameters[0];
320                 gSARAckFlags &= (SAR_AckFlags)(~E_SAR_ACKFLG_WAIT_INFO);
321                 break;
322             default:
323                 break;
324         }
325     }
326 
327     return;
328 }
329 
330 //Software patch to flush MIU FIFO data to DRAM
_MDrv_SAR_DummyMiuFifo(void)331 static void _MDrv_SAR_DummyMiuFifo(void)
332 {
333     static SAR_Dummy SarDummy;
334     MS_U8 u8Idx;
335     int count=0;
336 
337     for(u8Idx = 0; u8Idx<16; u8Idx++)
338     {
339         SarDummy.u8Reserved[u8Idx] = u8Idx;
340         //Coverity Fixed
341         if( SarDummy.u8Reserved[u8Idx] < 8)
342         {
343             count++;
344         }
345         else
346         {
347             count--;
348         }
349     }
350     MsOS_FlushMemory();
351 }
352 
353 //-------------------------------------------------------------------------------------------------
354 //  Global Functions
355 //-------------------------------------------------------------------------------------------------
356 
357 //-------------------------------------------------------------------------------------------------
358 /// SAR Iinitialized function before using SAR to receive keys. (This sends command to PM51 using mailbox.)
359 /// @return E_SAR_OK: Success
360 /// @return E_SAR_FAIL or other values: Failure
361 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Init(void)362 SAR_Result MDrv_SAR_Init(void)
363 {
364     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
365     MBX_Msg MB_Command;
366     MBX_MSGQ_Status MbxMsgQStatus;
367     MS_U32 MBX_Resendcnt=0;
368 
369     SAR_DBG_FUNC();
370 
371     if(gbSARInitialized == TRUE)
372     {
373     	 ULOGE(TAG_SAR,"SAR Driver Already Init!\r\n");
374          return E_SAR_OK;
375     }
376 
377     //flush MIU FIFO
378     _MDrv_SAR_DummyMiuFifo();
379     //(1) register handler callback in MBX
380     //gbSARInitialized = FALSE;
381     MbxResult = MDrv_MBX_RegisterMSGWithCallBack(E_MBX_CLASS_SAR_NOWAIT,SAR_MBX_QUEUESIZE,_SAR_MailBoxCallbackHandler);
382     if(MbxResult!=E_MBX_SUCCESS)
383     {
384     	if (MbxResult == E_MBX_ERR_SLOT_AREADY_OPENNED)
385     	{
386             SAR_DBG_WARN("Mailbox has been registered, classNumber=%d !\n", E_MBX_CLASS_SAR_NOWAIT);
387     	}
388     	else
389     	{
390             SAR_DBG_ERR("Mailbox registered with callback fails!\n");
391             return E_SAR_FAIL;
392         }
393     }
394     MbxResult = MDrv_MBX_RegisterMSG(E_MBX_CLASS_SAR,SAR_MBX_QUEUESIZE);
395     if(MbxResult!=E_MBX_SUCCESS)
396     {
397     	if (MbxResult == E_MBX_ERR_SLOT_AREADY_OPENNED)
398     	{
399             SAR_DBG_WARN("Mailbox has been registered, classNumber=%d !\n", E_MBX_CLASS_SAR);
400     	}
401     	else
402     	{
403             SAR_DBG_ERR("Mailbox registered fails!\n");
404             return E_SAR_FAIL;
405         }
406     }
407 
408     //(2) send msg to CPU to get keycode if interrupt happens
409     // set flag
410     gSARAckFlags |= E_SAR_ACKFLG_WAIT_INIT;
411     // send to PM51
412     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
413     MB_Command.eRoleID = E_MBX_ROLE_PM;
414     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
415     MB_Command.u8Ctrl = 0;
416     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
417     MB_Command.u8Index = E_SAR_CPUTo51_CMD_INIT;
418     MB_Command.u8ParameterCount = 0;
419     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
420     while(E_MBX_SUCCESS != MbxResult)
421     {
422         //Error Handling here:
423         return E_SAR_FAIL;
424     }
425 
426     //(3) Waiting for SAR message done
427     do
428     {
429        if(MBX_Resendcnt<10)
430        {
431        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
432         MBX_Resendcnt++;
433        }
434        else
435        {
436           MBX_Resendcnt=0;
437           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
438           while(E_MBX_SUCCESS != MbxResult)
439           {
440             //Error Handling here:
441             return E_SAR_FAIL;
442           }
443        }
444 
445     }
446     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_INIT) && (gMBXResult != E_MBX_ERR_TIME_OUT));
447 
448     //(4) check result
449     if(gSARResult == E_SAR_FAIL)
450     {
451         gSARResult = E_SAR_FAIL;
452         SAR_DBG_ERR("Fail\n");
453     }
454     else
455     {
456         gbSARInitialized = TRUE;
457         SAR_DBG_INFO("OK\n");
458     }
459     return gSARResult;
460 }
461 
462 //-------------------------------------------------------------------------------------------------
463 /// SAR parameter configuration function. (This sends command to PM51 using mailbox.)
464 /// @param pSARRegCfg \b IN: pointer to the SAR configuration structure.
465 /// @return E_SAR_OK: Success
466 /// @return E_SAR_FAIL or other values: Failure
467 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Config(SAR_RegCfg * pSARRegCfg)468 SAR_Result MDrv_SAR_Config(SAR_RegCfg *pSARRegCfg)
469 {
470     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
471     MBX_Msg MB_Command;
472     MBX_MSGQ_Status MbxMsgQStatus;
473     MS_VIRT virtSrcAddr;
474     MS_U32 MBX_Resendcnt=0;
475 
476     SAR_DBG_FUNC();
477 
478     //flush MIU FIFO
479     _MDrv_SAR_DummyMiuFifo();
480     //(1) set address to get final result
481     virtSrcAddr = (MS_VIRT)pSARRegCfg;
482 
483     //(2) send msg to CPU to get keycode if interrupt happens
484     // set flag
485     gSARAckFlags |= E_SAR_ACKFLG_WAIT_CONFIG;
486     // send to PM51
487     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
488     MB_Command.eRoleID = E_MBX_ROLE_PM;
489     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
490     MB_Command.u8Ctrl = 0;
491     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
492     MB_Command.u8Index = E_SAR_CPUTo51_CMD_CONFIG;
493     MB_Command.u8ParameterCount = 4;
494     MB_Command.u8Parameters[0] = (MS_S8)(virtSrcAddr>>24);
495     MB_Command.u8Parameters[1] = (MS_S8)(virtSrcAddr>>16);
496     MB_Command.u8Parameters[2] = (MS_S8)(virtSrcAddr>>8);
497     MB_Command.u8Parameters[3] = (MS_S8)(virtSrcAddr&0x000000FFUL);
498     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
499     while(E_MBX_SUCCESS != MbxResult)
500     {
501         //Error Handling here:
502         return E_SAR_FAIL;
503     }
504 
505     //(3) Waiting for SAR message done
506     do
507     {
508        if(MBX_Resendcnt<10)
509        {
510        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
511         MBX_Resendcnt++;
512        }
513        else
514        {
515           MBX_Resendcnt=0;
516           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
517           while(E_MBX_SUCCESS != MbxResult)
518           {
519             //Error Handling here:
520             return E_SAR_FAIL;
521           }
522        }
523     }
524     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_CONFIG) && (gMBXResult != E_MBX_ERR_TIME_OUT));
525 
526     //(4) check result
527     if(gSARResult == E_SAR_FAIL)
528     {
529         SAR_DBG_ERR("Fail\n");
530     }
531     else
532     {
533         SAR_DBG_INFO("OK\n");
534     }
535     return gSARResult;
536 }
537 
538 //-------------------------------------------------------------------------------------------------
539 /// SAR get key code function. (This sends command to PM51 using mailbox.)
540 /// @param pu8Key \b OUT: Get SAR key code
541 /// @param pu8Repeat \b OUT: Get SAR key repeat status
542 /// @return E_SAR_OK: Success
543 /// @return E_SAR_FAIL or other values: Failure
544 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetKeyCode(MS_U8 * pu8Key,MS_U8 * pu8Repeat)545 SAR_Result MDrv_SAR_GetKeyCode(MS_U8 *pu8Key, MS_U8 *pu8Repeat)
546 {
547     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
548     MBX_Msg MB_Command;
549     MBX_MSGQ_Status MbxMsgQStatus;
550     MS_U32 MBX_Resendcnt=0;
551 
552     SAR_DBG_FUNC();
553 
554     //(0) check SAR driver is initialized
555     *pu8Key = SAR_DUMMY_KEY;
556     *pu8Repeat = FALSE;
557     //flush MIU FIFO
558     _MDrv_SAR_DummyMiuFifo();
559     //check SAR is initialized
560     if(gbSARInitialized==FALSE)
561     {
562         SAR_DBG_ERR("Not initialized!\n");
563         return E_SAR_FAIL;
564     }
565 
566     //(1) send msg to CPU to get keycode if interrupt happens
567     // set flag
568     gSARAckFlags |= E_SAR_ACKFLG_WAIT_KEYCODE;
569     // send to PM51
570     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
571     MB_Command.eRoleID = E_MBX_ROLE_PM;
572     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
573     MB_Command.u8Ctrl = 0;
574     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
575     MB_Command.u8Index = E_SAR_CPUTo51_CMD_KEYCODE;
576     MB_Command.u8ParameterCount = 0;
577     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
578     while(E_MBX_SUCCESS != MbxResult)
579     {
580         //Error Handling here:
581         return E_SAR_FAIL;
582     }
583 
584     //(3) Waiting for SAR message done
585     do
586     {
587        if(MBX_Resendcnt<10)
588        {
589        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
590         MBX_Resendcnt++;
591        }
592        else
593        {
594           MBX_Resendcnt=0;
595           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
596           while(E_MBX_SUCCESS != MbxResult)
597           {
598             //Error Handling here:
599             return E_SAR_FAIL;
600           }
601        }
602     }
603     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_KEYCODE) && (gMBXResult != E_MBX_ERR_TIME_OUT));
604 
605     //(4) check result and get key
606     if( gSARResult == E_SAR_FAIL)
607     {
608         SAR_DBG_ERR("Fail\n");
609     }
610     else
611     {
612         *pu8Key = gu8SARKey;
613         *pu8Repeat = gu8SARRepeat;
614         SAR_DBG_INFO("OK\n");
615     }
616     return gSARResult;
617 }
618 
619 //-------------------------------------------------------------------------------------------------
620 /// Set SAR callback function when receive SAR key. Support only one callback. If call it twice,
621 /// the first callback does not be called. (This sends command to PM51 using mailbox.)
622 /// Note: The callback runs at interrupt mode.
623 /// @param pCallback \b IN: Set the callback function when generate SAR interrupt.
624 /// @return E_SAR_OK: Success
625 /// @return E_SAR_FAIL or other values: Failure
626 //-------------------------------------------------------------------------------------------------
MDrv_SAR_SetCallback(SAR_Callback pCallback)627 SAR_Result MDrv_SAR_SetCallback(SAR_Callback pCallback)
628 {
629     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
630     MBX_Msg MB_Command;
631     MBX_MSGQ_Status MbxMsgQStatus;
632     MS_U32 MBX_Resendcnt=0;
633 
634     SAR_DBG_FUNC();
635 
636     //(0) check SAR driver is initialized
637     //flush MIU FIFO
638     _MDrv_SAR_DummyMiuFifo();
639     //check SAR is initialized
640     if(gbSARInitialized==FALSE)
641     {
642         SAR_DBG_ERR("Not initialized!\n");
643         return E_SAR_FAIL;
644     }
645 
646     //(1) set local callback
647     gfSARCallback = pCallback;
648 
649     //(2) send msg to CPU to get keycode if interrupt happens
650     // set flag
651     gSARAckFlags |= E_SAR_ACKFLG_WAIT_SETCLBK;
652     // send to PM51
653     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
654     MB_Command.eRoleID = E_MBX_ROLE_PM;
655     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
656     MB_Command.u8Ctrl = 0;
657     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
658     MB_Command.u8Index = E_SAR_CPUTo51_CMD_SETCLBK;
659     MB_Command.u8ParameterCount = 0;
660     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
661     while(E_MBX_SUCCESS != MbxResult)
662     {
663         //Error Handling here:
664         return E_SAR_FAIL;
665     }
666 
667     //(3) Waiting for SAR message done
668     do
669     {
670        if(MBX_Resendcnt<10)
671        {
672        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
673         MBX_Resendcnt++;
674        }
675        else
676        {
677           MBX_Resendcnt=0;
678           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
679           while(E_MBX_SUCCESS != MbxResult)
680           {
681             //Error Handling here:
682             return E_SAR_FAIL;
683           }
684        }
685     }
686     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_SETCLBK) && (gMBXResult != E_MBX_ERR_TIME_OUT));
687 
688     //(4) check result
689     if(gSARResult == E_SAR_FAIL)
690     {
691         SAR_DBG_ERR("Fail\n");
692     }
693     else
694     {
695         SAR_DBG_INFO("OK\n");
696     }
697     return gSARResult;
698 
699 }
700 
701 //-------------------------------------------------------------------------------------------------
702 /// Get SAR callback function which receive SAR key.
703 /// @return the callback function when generate SAR interrupt
704 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetCallback(void)705 SAR_Callback MDrv_SAR_GetCallback(void)
706 {
707     SAR_DBG_FUNC();
708 
709     return gfSARCallback;
710 }
711 
712 //-------------------------------------------------------------------------------------------------
713 /// Get SAR library version function.
714 /// @param ppVersion \b OUT: pointer to library structure
715 /// @return E_SAR_OK: Success
716 /// @return E_SAR_FAIL or other values: Failure
717 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetLibVer(const MSIF_Version ** ppVersion)718 SAR_Result MDrv_SAR_GetLibVer(const MSIF_Version **ppVersion)
719 {
720     if (!ppVersion)
721     {
722         SAR_DBG_ERR("Fail\n");
723         return E_SAR_FAIL;
724     }
725     *ppVersion = &_drv_sar_version;
726     SAR_DBG_INFO("OK\n");
727     return E_SAR_OK;
728 }
729 
730 //-------------------------------------------------------------------------------------------------
731 /// Get SAR status function. (This sends command to PM51 using mailbox.)
732 /// @param pu8SARStatus \b OUT: pointer to status structure
733 /// @return E_SAR_OK: Success
734 /// @return E_SAR_FAIL or other values: Failure
735 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetStatus(MS_U8 * pu8SARStatus)736 SAR_Result MDrv_SAR_GetStatus(MS_U8 *pu8SARStatus)
737 {
738     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
739     MBX_Msg MB_Command;
740     MBX_MSGQ_Status MbxMsgQStatus;
741     MS_U32 MBX_Resendcnt=0;
742 
743     SAR_DBG_FUNC();
744 
745     //(0) check SAR driver is initialized
746      *pu8SARStatus = SAR_DUMMY_STATUS;
747     //flush MIU FIFO
748     _MDrv_SAR_DummyMiuFifo();
749     //check SAR is initialized
750     if(gbSARInitialized==FALSE)
751     {
752         SAR_DBG_ERR("Not initialized!\n");
753         return E_SAR_FAIL;
754     }
755 
756     //(1) send msg to CPU to get keycode if interrupt happens
757     // set flag
758     gSARAckFlags |= E_SAR_ACKFLG_WAIT_STATUS;
759     // send to PM51
760     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
761     MB_Command.eRoleID = E_MBX_ROLE_PM;
762     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
763     MB_Command.u8Ctrl = 0;
764     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
765     MB_Command.u8Index = E_SAR_CPUTo51_CMD_STATUS;
766     MB_Command.u8ParameterCount = 0;
767     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
768     while(E_MBX_SUCCESS != MbxResult)
769     {
770         //Error Handling here:
771         return E_SAR_FAIL;
772     }
773 
774     //(2) Waiting for SAR message done
775     do
776     {
777        if(MBX_Resendcnt<10)
778        {
779        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
780         MBX_Resendcnt++;
781        }
782        else
783        {
784           MBX_Resendcnt=0;
785           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
786           while(E_MBX_SUCCESS != MbxResult)
787           {
788             //Error Handling here:
789             return E_SAR_FAIL;
790           }
791        }
792     }
793     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_STATUS) && (gMBXResult != E_MBX_ERR_TIME_OUT));
794 
795     if(gSARResult == E_SAR_FAIL)
796     {
797         SAR_DBG_ERR("Fail\n");
798     }
799     else
800     {
801         *pu8SARStatus = gu8SARStatus;
802         SAR_DBG_INFO("OK\n");
803     }
804     return gSARResult;
805 }
806 
807 //-------------------------------------------------------------------------------------------------
808 /// Set SAR enable function. (This sends command to PM51 using mailbox.)
809 /// @param bEnable \b IN: TRUE: enable SAR, FALSE: disable SAR
810 /// @return E_SAR_OK: Success
811 /// @return E_SAR_FAIL or other values: Failure
812 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Enable(MS_BOOL bEnable)813 SAR_Result MDrv_SAR_Enable(MS_BOOL bEnable)
814 {
815     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
816     MBX_Msg MB_Command;
817     MBX_MSGQ_Status MbxMsgQStatus;
818     MS_U32 MBX_Resendcnt=0;
819 
820     SAR_DBG_FUNC();
821 
822     //(0) check SAR driver is initialized
823     //flush MIU FIFO
824     _MDrv_SAR_DummyMiuFifo();
825     //check SAR is initialized
826     if(gbSARInitialized==FALSE)
827     {
828         SAR_DBG_ERR("Not initialized!\n");
829         return E_SAR_FAIL;
830     }
831 
832     //(1) send msg to CPU to get keycode if interrupt happens
833     // set flag
834     gSARAckFlags |= E_SAR_ACKFLG_WAIT_ENABLE;
835     // send to PM51
836     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
837     MB_Command.eRoleID = E_MBX_ROLE_PM;
838     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
839     MB_Command.u8Ctrl = 0;
840     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
841     MB_Command.u8Index = E_SAR_CPUTo51_CMD_ENABLE;
842     MB_Command.u8ParameterCount = 1;
843     MB_Command.u8Parameters[0] = (MS_S8)bEnable;
844     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
845     while(E_MBX_SUCCESS != MbxResult)
846     {
847         //Error Handling here:
848         return E_SAR_FAIL;
849     }
850 
851     //(2) Waiting for SAR message done
852     do
853     {
854        if(MBX_Resendcnt<10)
855        {
856        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
857         MBX_Resendcnt++;
858        }
859        else
860        {
861           MBX_Resendcnt=0;
862           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
863           while(E_MBX_SUCCESS != MbxResult)
864           {
865             //Error Handling here:
866             return E_SAR_FAIL;
867           }
868        }
869     }
870     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_ENABLE) && (gMBXResult != E_MBX_ERR_TIME_OUT));
871 
872     if(gSARResult == E_SAR_FAIL)
873     {
874         SAR_DBG_ERR("Fail\n");
875     }
876     else
877     {
878         SAR_DBG_INFO("OK\n");
879     }
880     return gSARResult;
881 }
882 
883 //-------------------------------------------------------------------------------------------------
884 /// Get SAR driver information function. (This sends command to PM51 using mailbox.)
885 /// @return @ref SAR_DrvInfo structure
886 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetInfo(void)887 const SAR_DrvInfo* MDrv_SAR_GetInfo(void)
888 {
889     MS_VIRT virtSrcAddr;
890     MBX_Result MbxResult=E_MBX_UNKNOW_ERROR;
891     MBX_Msg MB_Command;
892     MBX_MSGQ_Status MbxMsgQStatus;
893     MS_U32 MBX_Resendcnt=0;
894 
895     SAR_DBG_FUNC();
896 
897     //(0) check SAR driver is initialized
898     //flush MIU FIFO
899     _MDrv_SAR_DummyMiuFifo();
900     //check SAR is initialized
901     if(gbSARInitialized==FALSE)
902         return (SAR_DrvInfo*)NULL;
903 
904     //(1) set address to get final result
905     virtSrcAddr = (MS_VIRT)&gSARDrvInfo;
906     SAR_DBG_INFO("virtSrcAddr = 0x%08lX\n", virtSrcAddr);
907 
908     //(2) send msg to CPU to get keycode if interrupt happens
909     // set flag
910     gSARAckFlags |= E_SAR_ACKFLG_WAIT_INFO;
911     // send to PM51
912     memset((void*)&MB_Command, 0, sizeof(MBX_Msg));
913     MB_Command.eRoleID = E_MBX_ROLE_PM;
914     MB_Command.eMsgType = E_MBX_MSG_TYPE_INSTANT;
915     MB_Command.u8Ctrl = 0;
916     MB_Command.u8MsgClass = E_MBX_CLASS_SAR_NOWAIT;
917     MB_Command.u8Index = E_SAR_CPUTo51_CMD_INFO;
918     MB_Command.u8ParameterCount = 4;
919     MB_Command.u8Parameters[0] = (MS_S8)(virtSrcAddr>>24);
920     MB_Command.u8Parameters[1] = (MS_S8)(virtSrcAddr>>16);
921     MB_Command.u8Parameters[2] = (MS_S8)(virtSrcAddr>>8);
922     MB_Command.u8Parameters[3] = (MS_S8)(virtSrcAddr&0x000000FFUL);
923     MbxResult = MDrv_MBX_SendMsg(&MB_Command);
924     while(E_MBX_SUCCESS != MbxResult)
925     {
926         //Error Handling here:
927         return (SAR_DrvInfo*)NULL;
928     }
929 
930     //(3) Waiting for SAR message done
931     do
932     {
933        if(MBX_Resendcnt<10)
934        {
935        _SAR_MailBoxHandler(E_MBX_CLASS_SAR,&MbxMsgQStatus);
936         MBX_Resendcnt++;
937        }
938        else
939        {
940           MBX_Resendcnt=0;
941           MbxResult = MDrv_MBX_SendMsg(&MB_Command);
942           while(E_MBX_SUCCESS != MbxResult)
943           {
944             //Error Handling here:
945             return (SAR_DrvInfo*)NULL;
946           }
947        }
948     }
949     while((gSARAckFlags & E_SAR_ACKFLG_WAIT_INFO) && (gMBXResult != E_MBX_ERR_TIME_OUT));
950 
951     //(4) check result
952     if(gSARResult == E_SAR_FAIL)
953     {
954         SAR_DBG_ERR("Fail\n");
955     }
956     else
957     {
958         SAR_DBG_INFO("OK\n");
959     }
960     return &gSARDrvInfo;
961 }
962 
963 //-------------------------------------------------------------------------------------------------
964 /// Set SAR debug function level.
965 /// @param eLevel \b IN: E_SAR_DBGLVL_NONE/E_SAR_DBGLVL_WARNING/E_SAR_DBGLVL_ERROR/E_SAR_DBGLVL_INFO/E_SAR_DBGLVL_ALL
966 /// @return E_SAR_OK: Success
967 /// @return E_SAR_FAIL or other values: Failure
968 //-------------------------------------------------------------------------------------------------
MDrv_SAR_SetDbgLevel(SAR_DbgLvl eLevel)969 SAR_Result MDrv_SAR_SetDbgLevel(SAR_DbgLvl eLevel)
970 {
971     SAR_DBG_INFO("Debug level: %u\n", eLevel);
972 
973     _gSARDbgLevel = eLevel;
974     return E_SAR_OK;
975 }
976 
977 #endif // end MSOS_TYPE_KERNEL
978 
979 //##################################
980 //
981 //  Access SAR settings directly by RIU without
982 //  using Mailbox sent commands to PM
983 //
984 //##################################
985 //-------------------------------------------------------------------------------------------------
986 //  Include Files
987 //-------------------------------------------------------------------------------------------------
988 // Common Definition
989 #include "MsOS.h"
990 #include "drvMMIO.h"
991 #include "drvSAR.h"
992 #include "halSAR.h"
993 
994 // Internal Definition
995 //-------------------------------------------------------------------------------------------------
996 //  Driver Compiler Options
997 //-------------------------------------------------------------------------------------------------
998 
999 //-------------------------------------------------------------------------------------------------
1000 //  Local Defines
1001 //-------------------------------------------------------------------------------------------------
1002 ///SAR keypad max supported channels (cabability)
1003 #define CFG_SAR_KPD_CHANNELS        HAL_SAR_KPD_SUPPCHS
1004 ///SAR keypad max available channels
1005 #define CFG_SAR_KPD_AVLBCHS         HAL_SAR_KPD_AVLBCHS
1006 ///SAR keypad adc max levels of all channels
1007 #define CFG_SAR_KPD_AVLBLVLS        8 //### max level for available channels (Maximum level <= 8)
1008 
1009 ///SAR keypad driver parameters
1010 #define SAR_KEY_NULL                0xFFUL
1011 #define SAR_LEVEL_STABLE_NUM        10
1012 #define SAR_LEVEL_STABLE_NUM_MIN    9
1013 #define SAR_KEY_VALIDATION          2
1014 #define SAR_REPEAT_KEY_CHECK        SAR_KEY_VALIDATION + 2
1015 #define SAR_REPEAT_KEY_CHECK_1      SAR_KEY_VALIDATION + 3
1016 #define SAR_REPEAT_PERIOD           5
1017 #define SAR_REPEAT_PERIOD_1         SAR_REPEAT_PERIOD/2
1018 #define SAR_CH_MAXID                0xFFUL
1019 
1020 //-------------------------------------------------------------------------------------------------
1021 //  Local Structurs
1022 //-------------------------------------------------------------------------------------------------
1023 
1024 //-------------------------------------------------------------------------------------------------
1025 //  Global Variables
1026 //-------------------------------------------------------------------------------------------------
1027 /// Version string
1028 
1029 //-------------------------------------------------------------------------------------------------
1030 //  Local Variables
1031 //-------------------------------------------------------------------------------------------------
1032 static SAR_KpdStatus g_u8SARKpdStatus = E_SAR_KPD_INVALID;
1033 static SAR_KpdDrvInfo g_SARKpdDrvInfo;
1034 static MS_BOOL gu8StorageChUsed[CFG_SAR_KPD_AVLBCHS];
1035 static MS_U8 gu8StorageChInfo[CFG_SAR_KPD_AVLBCHS];
1036 static MS_U8 gu8StorageLevelInfo[CFG_SAR_KPD_AVLBCHS][CFG_SAR_KPD_AVLBLVLS];
1037 static MS_U8 gu8StorageLevels[CFG_SAR_KPD_AVLBCHS];
1038 static MS_U8 gu8StorageKeyInfo[CFG_SAR_KPD_AVLBCHS][CFG_SAR_KPD_AVLBLVLS];
1039 static MS_U8 gu8SARCheckCount[CFG_SAR_KPD_AVLBCHS], gu8SARPrevCMD[CFG_SAR_KPD_AVLBCHS], gu8SARPressKey[CFG_SAR_KPD_AVLBCHS];
1040 static MS_U32 gu32SARTimePeriod[CFG_SAR_KPD_AVLBCHS];
1041 static MS_U8 gu8ShortPressFlag[CFG_SAR_KPD_AVLBCHS] = {0};
1042 
1043 static MS_U8 gu8KeyCmdBak[CFG_SAR_KPD_AVLBCHS] = {0};
1044 
1045 
1046 static SAR_KpdDbgLvl _gSARKpdDbgLevel = E_SAR_KPD_DBGLVL_ERROR;
1047 static SAR_AdcDbgLvl _gSARAdcDbgLevel = E_SAR_ADC_DBGLVL_ERROR;
1048 static SAR_GpioDbgLvl _gSARGpioDbgLevel = E_SAR_GPIO_DBGLVL_ERROR;
1049 
1050 //-------------------------------------------------------------------------------------------------
1051 //  Debug Functions
1052 //-------------------------------------------------------------------------------------------------
1053 #define SAR_KPD_DBG_FUNC()               if (_gSARKpdDbgLevel >= E_SAR_KPD_DBGLVL_ALL) \
1054                                         {MS_DEBUG_MSG(ULOGD(TAG_SAR, "\t====   %s   ====\n", __FUNCTION__);)}
1055 #define SAR_KPD_DBG_INFO(x, args...)     if (_gSARKpdDbgLevel >= E_SAR_KPD_DBGLVL_INFO ) \
1056                                         {MS_DEBUG_MSG(ULOGI(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGI(TAG_SAR, x, ##args);)}
1057 #define SAR_KPD_DBG_ERR(x, args...)      if (_gSARKpdDbgLevel >= E_SAR_KPD_DBGLVL_ERROR) \
1058                                         {MS_DEBUG_MSG(ULOGE(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGE(TAG_SAR, x, ##args);)}
1059 #define SAR_KPD_DBG_WARN(x, args...)     if (_gSARKpdDbgLevel >= E_SAR_KPD_DBGLVL_WARNING) \
1060                                         {MS_DEBUG_MSG(ULOGW(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGW(TAG_SAR, x, ##args);)}
1061 
1062 #define SAR_ADC_DBG_FUNC()               if (_gSARAdcDbgLevel >= E_SAR_ADC_DBGLVL_ALL) \
1063                                         {MS_DEBUG_MSG(ULOGD(TAG_SAR, "\t====   %s   ====\n", __FUNCTION__);)}
1064 #define SAR_ADC_DBG_INFO(x, args...)     if (_gSARAdcDbgLevel >= E_SAR_ADC_DBGLVL_INFO ) \
1065                                         {MS_DEBUG_MSG(ULOGI(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGI(TAG_SAR, x, ##args);)}
1066 #define SAR_ADC_DBG_ERR(x, args...)      if (_gSARAdcDbgLevel >= E_SAR_ADC_DBGLVL_ERROR) \
1067                                         {MS_DEBUG_MSG(ULOGE(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGE(TAG_SAR, x, ##args);)}
1068 #define SAR_ADC_DBG_WARN(x, args...)     if (_gSARAdcDbgLevel >= E_SAR_ADC_DBGLVL_WARNING) \
1069                                         {MS_DEBUG_MSG(ULOGW(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGW(TAG_SAR, x, ##args);)}
1070 
1071 #define SAR_GPIO_DBG_FUNC()               if (_gSARGpioDbgLevel >= E_SAR_GPIO_DBGLVL_ALL) \
1072                                         {MS_DEBUG_MSG(ULOGD(TAG_SAR, "\t====   %s   ====\n", __FUNCTION__);)}
1073 #define SAR_GPIO_DBG_INFO(x, args...)     if (_gSARGpioDbgLevel >= E_SAR_GPIO_DBGLVL_INFO ) \
1074                                         {MS_DEBUG_MSG(ULOGI(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGI(TAG_SAR, x, ##args);)}
1075 #define SAR_GPIO_DBG_ERR(x, args...)      if (_gSARGpioDbgLevel >= E_SAR_GPIO_DBGLVL_ERROR) \
1076                                         {MS_DEBUG_MSG(ULOGE(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGE(TAG_SAR, x, ##args);)}
1077 #define SAR_GPIO_DBG_WARN(x, args...)     if (_gSARGpioDbgLevel >= E_SAR_GPIO_DBGLVL_WARNING) \
1078                                         {MS_DEBUG_MSG(ULOGW(TAG_SAR, "[%s]: ", __FUNCTION__); ULOGW(TAG_SAR, x, ##args);)}
1079 
1080 //-------------------------------------------------------------------------------------------------
1081 //  Local Functions
1082 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_GetCfgChannels(void)1083 static MS_U8 MDrv_SAR_Kpd_GetCfgChannels(void)
1084 {
1085     MS_U8 i,u8Count=0;
1086 
1087     for(i=0;i<CFG_SAR_KPD_AVLBCHS;i++)
1088     {
1089         //compare valid channel id
1090         if(gu8StorageChInfo[i] != SAR_CH_MAXID)
1091         {
1092             u8Count++;
1093         }
1094     }
1095     return u8Count;
1096 }
1097 
MDrv_SAR_Kpd_GetChIndex(MS_U8 u8Channel)1098 static MS_U8 MDrv_SAR_Kpd_GetChIndex(MS_U8 u8Channel)
1099 {
1100     MS_U8 i;
1101 
1102     for(i=0;i<CFG_SAR_KPD_AVLBCHS;i++)
1103     {
1104         //compare valid channel id
1105         if(gu8StorageChInfo[i] == u8Channel)
1106             break;
1107     }
1108     return i;
1109 }
1110 
MDrv_SAR_Kpd_GetChID(MS_U8 u8ChIdx)1111 static MS_U8 MDrv_SAR_Kpd_GetChID(MS_U8 u8ChIdx)
1112 {
1113     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1114         return SAR_CH_MAXID;
1115     return gu8StorageChInfo[u8ChIdx];
1116 }
1117 
MDrv_SAR_Kpd_GetChLevels(MS_U8 u8ChIdx)1118 static MS_U8 MDrv_SAR_Kpd_GetChLevels(MS_U8 u8ChIdx)
1119 {
1120     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1121         return 0;
1122     return gu8StorageLevels[u8ChIdx];
1123 }
1124 
MDrv_SAR_Kpd_GetChIdxLevel(MS_U8 u8ChIdx,MS_U8 u8LvlIdx)1125 static MS_U8 MDrv_SAR_Kpd_GetChIdxLevel(MS_U8 u8ChIdx,MS_U8 u8LvlIdx)
1126 {
1127     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1128         return 0;
1129     return gu8StorageLevelInfo[u8ChIdx][u8LvlIdx];
1130 }
1131 
MDrv_SAR_Kpd_GetChIdxKey(MS_U8 u8ChIdx,MS_U8 u8LvlIdx)1132 static MS_U8 MDrv_SAR_Kpd_GetChIdxKey(MS_U8 u8ChIdx,MS_U8 u8LvlIdx)
1133 {
1134     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1135         return 0;
1136     return gu8StorageKeyInfo[u8ChIdx][u8LvlIdx];
1137 }
1138 
MDrv_SAR_Kpd_SetChID(MS_U8 u8ChIdx,MS_U8 u8ChID)1139 static void MDrv_SAR_Kpd_SetChID(MS_U8 u8ChIdx,MS_U8 u8ChID)
1140 {
1141     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1142         return;
1143     gu8StorageChInfo[u8ChIdx]=u8ChID;
1144 }
1145 
MDrv_SAR_Kpd_SetChLevels(MS_U8 u8ChIdx,MS_U8 u8Levels)1146 static void MDrv_SAR_Kpd_SetChLevels(MS_U8 u8ChIdx,MS_U8 u8Levels)
1147 {
1148     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1149         return;
1150     gu8StorageLevels[u8ChIdx]=u8Levels;
1151 }
1152 
MDrv_SAR_Kpd_SetChIdxLevel(MS_U8 u8ChIdx,MS_U8 u8LvlIdx,MS_U8 u8Val)1153 static void MDrv_SAR_Kpd_SetChIdxLevel(MS_U8 u8ChIdx,MS_U8 u8LvlIdx,MS_U8 u8Val)
1154 {
1155     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1156         return;
1157     gu8StorageLevelInfo[u8ChIdx][u8LvlIdx]= u8Val;
1158 }
1159 
MDrv_SAR_Kpd_SetChIdxKey(MS_U8 u8ChIdx,MS_U8 u8LvlIdx,MS_U8 u8Val)1160 static void MDrv_SAR_Kpd_SetChIdxKey(MS_U8 u8ChIdx,MS_U8 u8LvlIdx,MS_U8 u8Val)
1161 {
1162     if(u8ChIdx>=CFG_SAR_KPD_AVLBCHS)
1163         return;
1164     gu8StorageKeyInfo[u8ChIdx][u8LvlIdx]=u8Val;
1165 }
1166 
MDrv_SAR_Kpd_CfgChInfo(SAR_KpdRegCfg * pHalSarChInfo)1167 static SAR_KpdResult MDrv_SAR_Kpd_CfgChInfo(SAR_KpdRegCfg *pHalSarChInfo)
1168 {
1169     MS_U8 u8Channel;
1170     MS_U8 i,j,k;
1171 
1172     SAR_KPD_DBG_INFO("MDrv_SAR_Kpd_CfgChInfo: ================= start\n");
1173     SAR_KPD_DBG_INFO("u8SARChID=0x%02X\n",pHalSarChInfo->u8SARChID);
1174     SAR_KPD_DBG_INFO("tSARChBnd.u8UpBnd=0x%02X\n",pHalSarChInfo->tSARChBnd.u8UpBnd);
1175     SAR_KPD_DBG_INFO("tSARChBnd.u8LoBnd=0x%02X\n",pHalSarChInfo->tSARChBnd.u8LoBnd);
1176     SAR_KPD_DBG_INFO("u8KeyLevelNum=0x%02X\n",pHalSarChInfo->u8KeyLevelNum);
1177     for(k=0;k<pHalSarChInfo->u8KeyLevelNum;k++)
1178         SAR_KPD_DBG_INFO("u8KeyThreshold[%d]=0x%02X\n",k,pHalSarChInfo->u8KeyThreshold[k]);
1179     for(k=0;k<pHalSarChInfo->u8KeyLevelNum;k++)
1180         SAR_KPD_DBG_INFO("u8KeyCode[%d]=0x%02X\n",k,pHalSarChInfo->u8KeyCode[k]);
1181     SAR_KPD_DBG_INFO("MDrv_SAR_Kpd_CfgChInfo: ================= end\n");
1182 
1183     // get channel ID
1184     u8Channel = (MS_U8)pHalSarChInfo->u8SARChID;
1185     // configure
1186     for(i=0;i<CFG_SAR_KPD_AVLBCHS;i++)
1187     {
1188         if((MDrv_SAR_Kpd_GetChID(i) == SAR_CH_MAXID) || (MDrv_SAR_Kpd_GetChID(i) == u8Channel))
1189         {
1190             MDrv_SAR_Kpd_SetChID(i,u8Channel);
1191             MDrv_SAR_Kpd_SetChLevels(i,pHalSarChInfo->u8KeyLevelNum);
1192             for(j=0;j<pHalSarChInfo->u8KeyLevelNum;j++)
1193             {
1194                 MDrv_SAR_Kpd_SetChIdxLevel(i,j,pHalSarChInfo->u8KeyThreshold[j]);
1195                 MDrv_SAR_Kpd_SetChIdxKey(i,j,pHalSarChInfo->u8KeyCode[j]);
1196             }
1197             HAL_SAR_CfgChannelBound(u8Channel,(HAL_SAR_BndCfg*)&pHalSarChInfo->tSARChBnd);
1198 
1199             //acording to u8UpBnd & u8LoBnd , it decide gu8StorageChUsed
1200             if ((MS_U8)pHalSarChInfo->tSARChBnd.u8UpBnd > (MS_U8)pHalSarChInfo->tSARChBnd.u8LoBnd)
1201               gu8StorageChUsed[u8Channel] = TRUE;
1202             else
1203               gu8StorageChUsed[u8Channel] = FALSE;
1204 
1205             return E_SAR_KPD_OK;
1206         }
1207     }
1208     return E_SAR_KPD_FAIL;
1209 }
1210 
MDrv_SAR_Kpd_CfgAnalogInputs(void)1211 static void MDrv_SAR_Kpd_CfgAnalogInputs(void)
1212 {
1213     MS_U8 i,j;
1214 
1215     // configure analog input & output enable according to used channels
1216     for(j=0;j<CFG_SAR_KPD_CHANNELS;j++)
1217     {
1218         for(i=0;i<CFG_SAR_KPD_AVLBCHS;i++)
1219         {
1220             if(MDrv_SAR_Kpd_GetChID(i) == j)
1221                 break;
1222         }
1223         if(i<CFG_SAR_KPD_AVLBCHS)//matches
1224         {
1225             HAL_SAR_CfgAanlogInputSelect(j,ENABLE);
1226             HAL_SAR_CfgOutputEnable(j,DISABLE);
1227         }
1228         else
1229         {
1230             HAL_SAR_CfgAanlogInputSelect(j,DISABLE);
1231             //HAL_SAR_CfgOutputEnable(j,DISABLE);
1232         }
1233     }
1234 }
1235 
MDrv_SAR_Kpd_ResetAllChInfo(void)1236 static void MDrv_SAR_Kpd_ResetAllChInfo(void)
1237 {
1238     SAR_KpdBndCfg tSARChBnd;
1239     MS_U8 u8ChId;
1240 
1241     tSARChBnd.u8LoBnd = 0x00;
1242     tSARChBnd.u8UpBnd = 0x00;
1243     for(u8ChId=0;u8ChId < CFG_SAR_KPD_CHANNELS;u8ChId++)
1244     {
1245         HAL_SAR_CfgChannelBound(u8ChId,(HAL_SAR_BndCfg*)&tSARChBnd);
1246         HAL_SAR_CfgAanlogInputSelect(u8ChId,DISABLE);
1247         //HAL_SAR_CfgOutputEnable(u8ChId,DISABLE);
1248     }
1249 
1250     for(u8ChId=0;u8ChId < CFG_SAR_KPD_AVLBCHS;u8ChId++)
1251     {
1252         gu8StorageChInfo[u8ChId] = SAR_CH_MAXID;
1253     }
1254 }
1255 
MDrv_SAR_Kpd_SetDefaultChannels(void)1256 static void MDrv_SAR_Kpd_SetDefaultChannels(void)
1257 {
1258     MDrv_SAR_Kpd_ResetAllChInfo();
1259     //MDrv_SAR_Kpd_CfgAnalogInputs();
1260 }
1261 
_GetSystemTime(MS_U8 u8MsDivisor)1262 static MS_U32 _GetSystemTime(MS_U8 u8MsDivisor)
1263 {
1264     if(u8MsDivisor==0)
1265         return 0;
1266     return (MsOS_GetSystemTime()/(MS_U32)u8MsDivisor);
1267 }
1268 
MDrv_SAR_Kpd_GetCHKey(MS_U8 u8Channel,MS_U8 * pu8Key,MS_U8 * pu8Repeat)1269 static MS_U8 MDrv_SAR_Kpd_GetCHKey(MS_U8 u8Channel, MS_U8 *pu8Key , MS_U8 *pu8Repeat)
1270 {
1271     MS_U8 ret_val=FALSE;
1272     MS_U8 i,k,KEY_LV[CFG_SAR_KPD_AVLBLVLS],Key_Value;
1273     MS_U8 u8Index;
1274 
1275     *pu8Key = 0xFF;
1276     *pu8Repeat = 1;
1277 
1278     u8Index = MDrv_SAR_Kpd_GetChIndex(u8Channel);
1279     if(u8Index>=g_SARKpdDrvInfo.u8ConfigUsedChs)
1280     {
1281         return ret_val;
1282     }
1283 
1284     for(i=0; i<CFG_SAR_KPD_AVLBLVLS; i++)
1285         KEY_LV[i] = 0;
1286 
1287     for (k=0; k<SAR_LEVEL_STABLE_NUM; k++)
1288     {
1289         Key_Value = MDrv_SAR_Adc_GetValue(u8Channel);
1290         for (i=0;i<MDrv_SAR_Kpd_GetChLevels(u8Index);i++)
1291         {
1292             if (Key_Value <= MDrv_SAR_Kpd_GetChIdxLevel(u8Index,i))
1293             {
1294             	{
1295 	                KEY_LV[i] += 1;
1296 	                break;
1297             	}
1298             }
1299         }
1300     }
1301 
1302     for(i=0; i<MDrv_SAR_Kpd_GetChLevels(u8Index); i++)
1303     {
1304         if(KEY_LV[i] >= SAR_LEVEL_STABLE_NUM_MIN)
1305         {
1306             SAR_KPD_DBG_INFO("[%d_%d]: Key_Value = 0x%02X\n",u8Channel,u8Index,Key_Value);
1307             gu8SARPressKey[u8Index] = TRUE;
1308             *pu8Key = MDrv_SAR_Kpd_GetChIdxKey(u8Index,i);
1309 
1310             if (gu8SARPrevCMD[u8Index] != *pu8Key)
1311             {
1312                 gu8SARPrevCMD[u8Index] = *pu8Key;
1313                 gu8SARCheckCount[u8Index] = 0;
1314                 gu8KeyCmdBak[u8Index] = 0xFF;
1315             }
1316             else
1317             {
1318                 if (gu8SARCheckCount[u8Index] < SAR_KEY_VALIDATION)
1319                 {
1320                     gu8SARCheckCount[u8Index]++;
1321                     return FALSE;
1322                 }
1323                 else if (gu8SARCheckCount[u8Index] == SAR_KEY_VALIDATION)
1324                 {
1325                     gu8SARCheckCount[u8Index]++;
1326                     gu32SARTimePeriod[u8Index] = _GetSystemTime(100);
1327                     gu8KeyCmdBak[u8Index]=*pu8Key;
1328                     gu8ShortPressFlag[u8Index]=TRUE;
1329                     //return TRUE;
1330                 }
1331 
1332                 if (gu8SARCheckCount[u8Index] == SAR_REPEAT_KEY_CHECK)    //SAR_KEY_VALIDATION+2
1333                 {
1334                     if (_GetSystemTime(100) > (gu32SARTimePeriod[u8Index] + SAR_REPEAT_PERIOD/3))
1335                     {
1336                         gu32SARTimePeriod[u8Index] = _GetSystemTime(100);
1337                         gu8SARCheckCount[u8Index] = SAR_REPEAT_KEY_CHECK_1;
1338                         gu8ShortPressFlag[u8Index]=FALSE;
1339                         *pu8Repeat = 0x01;
1340                     }
1341                     else
1342                     {
1343                         *pu8Key = 0xFF;
1344                         *pu8Repeat = 0x01;
1345                     }
1346                     return TRUE;
1347                 }
1348                 else if (gu8SARCheckCount[u8Index] == SAR_REPEAT_KEY_CHECK_1) //SAR_KEY_VALIDATION+3
1349                 {
1350                     if (_GetSystemTime(100) > gu32SARTimePeriod[u8Index])
1351                     {
1352                         gu32SARTimePeriod[u8Index] = _GetSystemTime(100);
1353                         gu8SARCheckCount[u8Index] = SAR_REPEAT_KEY_CHECK_1;
1354                         gu8ShortPressFlag[u8Index]=FALSE;
1355                         *pu8Repeat = 0x01;
1356                     }
1357                     else
1358                     {
1359                         *pu8Key = 0xFF;
1360                         *pu8Repeat = 0x01;
1361                     }
1362                     return TRUE;
1363                 }
1364 
1365                 if (_GetSystemTime(100) > (gu32SARTimePeriod[u8Index] + SAR_REPEAT_PERIOD))  //if 700ms
1366                 {
1367                     gu32SARTimePeriod[u8Index] = _GetSystemTime(100);
1368                     gu8SARCheckCount[u8Index] = SAR_REPEAT_KEY_CHECK; //SAR_KEY_VALIDATION+2
1369                     gu8ShortPressFlag[u8Index] = 0;
1370                     *pu8Repeat = 0x01;
1371                     return TRUE;
1372                 }
1373             }
1374         }
1375     }
1376 
1377     if (gu8SARPressKey[u8Index])
1378 		{
1379          gu8SARPressKey[u8Index] = FALSE;
1380     }
1381     else
1382     {
1383 			if(gu8ShortPressFlag[u8Index])
1384 			{
1385 				gu8ShortPressFlag[u8Index] = FALSE;
1386 				*pu8Key = gu8KeyCmdBak[u8Index];
1387 				*pu8Repeat = 0x00;
1388 				return TRUE;
1389 			}
1390 			gu8SARPrevCMD[u8Index] = 0xFF;
1391     }
1392     return ret_val;
1393 }
1394 
MDrv_SAR_Kpd_IntClear(void)1395 static void MDrv_SAR_Kpd_IntClear(void)
1396 {
1397     HAL_SAR_CfgIntClear(ENABLE);
1398     HAL_SAR_CfgIntClear(DISABLE);
1399 }
1400 
MDrv_SAR_Kpd_SetStatus(SAR_KpdStatus SARStatus,MS_BOOL bEnable)1401 static void MDrv_SAR_Kpd_SetStatus(SAR_KpdStatus SARStatus, MS_BOOL bEnable)
1402 {
1403     if(bEnable)
1404         g_u8SARKpdStatus |= SARStatus;
1405     else
1406         g_u8SARKpdStatus &= (SAR_KpdStatus)(~SARStatus);
1407 }
1408 
MDrv_SAR_Kpd_IntEnable(MS_BOOL bEnable)1409 static void MDrv_SAR_Kpd_IntEnable(MS_BOOL bEnable)
1410 {
1411     HAL_SAR_CfgIntMask((bEnable)? DISABLE : ENABLE);
1412     //MDrv_SAR_Kpd_SetStatus(E_SAR_KPD_INT_ENABLE,bEnable);
1413 }
1414 
MDrv_SAR_Kpd_MMIO_Init(void)1415 SAR_KpdResult MDrv_SAR_Kpd_MMIO_Init(void)
1416 {
1417     MS_VIRT virtBaseAddr = 0;
1418     MS_PHY u32BaseSize = 0;
1419 
1420     SAR_KPD_DBG_FUNC();
1421 
1422     if(!MDrv_MMIO_GetBASE(&virtBaseAddr, &u32BaseSize, MS_MODULE_PM))
1423     {
1424         SAR_KPD_DBG_ERR("Get PM IOMAP Base faill!\n");
1425         return E_SAR_KPD_FAIL;
1426     }
1427     HAL_SAR_SetIOMapBase(virtBaseAddr);
1428     SAR_KPD_DBG_INFO("virtBaseAddr(PM) = %lx\n", virtBaseAddr);
1429 
1430     if(!MDrv_MMIO_GetBASE(&virtBaseAddr, &u32BaseSize, MS_MODULE_HW))
1431     {
1432         SAR_KPD_DBG_ERR("Get NPM IOMAP Base faill!\n");
1433         return E_SAR_KPD_FAIL;
1434     }
1435     HAL_SAR_SetIOMapBase_NPM(virtBaseAddr);
1436     SAR_KPD_DBG_INFO("virtBaseAddr(NPM) = %lx\n", virtBaseAddr);
1437 
1438     return E_SAR_KPD_OK;
1439 }
1440 
MDrv_SAR_Kpd_CfgChannelBound(MS_U8 u8Channel,MS_U16 u16Upper,MS_U16 u16Lower)1441 SAR_KpdResult MDrv_SAR_Kpd_CfgChannelBound(MS_U8 u8Channel, MS_U16 u16Upper, MS_U16 u16Lower)
1442 {
1443 	HAL_SAR_BndCfg  sBnd;
1444 	sBnd.u8UpBnd = (MS_U8) u16Upper;
1445 	sBnd.u8LoBnd = (MS_U8) u16Lower;
1446 
1447 	return HAL_SAR_CfgChannelBound(u8Channel, &sBnd);
1448 }
1449 
1450 
1451 
1452 //-------------------------------------------------------------------------------------------------
1453 /// Set SAR Keypad initialized function.
1454 /// @param None:
1455 /// @return E_SAR_KPD_OK: Success
1456 /// @return E_SAR_KPD_FAIL or other values: Failure
1457 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_Init(void)1458 SAR_KpdResult MDrv_SAR_Kpd_Init(void)
1459 {
1460     MS_VIRT virtBaseAddr = 0;
1461     MS_PHY u32BaseSize = 0;
1462     MS_U32 i;
1463 
1464     SAR_KPD_DBG_FUNC();
1465 
1466     if (!(g_u8SARKpdStatus & E_SAR_KPD_INIT_OK))
1467     {
1468         if(!MDrv_MMIO_GetBASE(&virtBaseAddr, &u32BaseSize, MS_MODULE_PM))
1469         {
1470             SAR_KPD_DBG_ERR("Get PM IOMAP Base faill!\n");
1471             return E_SAR_KPD_FAIL;
1472         }
1473         HAL_SAR_SetIOMapBase(virtBaseAddr);
1474         SAR_KPD_DBG_INFO("virtBaseAddr(PM) = %lx\n", virtBaseAddr);
1475 
1476         if(!MDrv_MMIO_GetBASE(&virtBaseAddr, &u32BaseSize, MS_MODULE_HW))
1477         {
1478             SAR_KPD_DBG_ERR("Get NPM IOMAP Base faill!\n");
1479             return E_SAR_KPD_FAIL;
1480         }
1481         HAL_SAR_SetIOMapBase_NPM(virtBaseAddr);
1482         SAR_KPD_DBG_INFO("virtBaseAddr(NPM) = %lx\n", virtBaseAddr);
1483     }
1484     else
1485     {
1486         SAR_KPD_DBG_ERR("SAR Kpd has been initialized!\n");
1487         return E_SAR_KPD_OK;
1488     }
1489 
1490     // set default channels
1491     MDrv_SAR_Kpd_SetDefaultChannels();
1492     // set configured parameters
1493     g_SARKpdDrvInfo.u8TrigMode = HAL_SAR_EDGE;
1494     g_SARKpdDrvInfo.u8SingleChEn = DISABLE;
1495     g_SARKpdDrvInfo.u8DigitOprMode = HAL_SAR_FREERUN;
1496     g_SARKpdDrvInfo.u8AtopFreerun = ENABLE;
1497     g_SARKpdDrvInfo.u8DigitPwrDn = DISABLE;
1498     g_SARKpdDrvInfo.u8AtopPwrDn = DISABLE;
1499     g_SARKpdDrvInfo.u8HighChEn = ENABLE;
1500     g_SARKpdDrvInfo.u8InterruptEn = DISABLE;
1501     g_SARKpdDrvInfo.u8ConfigUsedChs = 0;
1502     g_SARKpdDrvInfo.u8MaxKpdSuppChs = CFG_SAR_KPD_CHANNELS;
1503     g_SARKpdDrvInfo.u8MaxKpdAvlbChs = CFG_SAR_KPD_AVLBCHS;
1504     g_SARKpdDrvInfo.u8MaxKpdAvlbLvls = CFG_SAR_KPD_AVLBLVLS;
1505     // config sar parameters
1506     HAL_SAR_CfgSingleChannel(0x00);
1507     HAL_SAR_CfgTriggerMode(g_SARKpdDrvInfo.u8TrigMode); //0:edge trigger, 1: level trigger
1508     HAL_SAR_CfgSingleChannelEn(g_SARKpdDrvInfo.u8SingleChEn);
1509     HAL_SAR_CfgDigitOperMode(g_SARKpdDrvInfo.u8DigitOprMode);
1510     HAL_SAR_CfgDigitPowerdown(g_SARKpdDrvInfo.u8DigitPwrDn);
1511     HAL_SAR_CfgAtopPowerdown(g_SARKpdDrvInfo.u8AtopPwrDn);
1512     HAL_SAR_CfgAtopFreeRun(g_SARKpdDrvInfo.u8AtopFreerun);
1513     HAL_SAR_CfgHighChannel(g_SARKpdDrvInfo.u8HighChEn);
1514     MDrv_SAR_Kpd_IntEnable(g_SARKpdDrvInfo.u8InterruptEn);
1515     HAL_SAR_CfgStart(DISABLE);
1516     HAL_SAR_CfgSelection(DISABLE);
1517     HAL_SAR_CfgClockSamplePeriod(0x05);
1518 
1519     MDrv_SAR_Kpd_IntClear();
1520     MDrv_SAR_Kpd_SetStatus(E_SAR_KPD_INIT_OK,TRUE);
1521     for (i = 0; i<CFG_SAR_KPD_AVLBCHS; i++)
1522     {
1523     	gu8SARCheckCount[i] = 0;
1524         gu8SARPrevCMD[i] = 0xFF;
1525     	gu8SARPressKey[i] =FALSE;
1526     	gu32SARTimePeriod[i] = 0;
1527     }
1528     SAR_KPD_DBG_INFO("SAR keypad is initialized completely\n");
1529     return E_SAR_KPD_OK;
1530 }
1531 
1532 //-------------------------------------------------------------------------------------------------
1533 /// Set SAR Keypad channel information function.
1534 /// @param sarChInfo: sar channel info pointer
1535 /// @return E_SAR_KPD_OK: Success
1536 /// @return E_SAR_KPD_FAIL or other values: Failure
1537 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_SetChInfo_U2K(SAR_KpdRegCfg * sarChInfo)1538 SAR_KpdResult MDrv_SAR_Kpd_SetChInfo_U2K(SAR_KpdRegCfg *sarChInfo)
1539 {
1540     SAR_KpdResult ret_val;
1541 
1542     SAR_KPD_DBG_FUNC();
1543 
1544     if(sarChInfo->u8SARChID >= CFG_SAR_KPD_AVLBCHS)
1545         return E_SAR_KPD_FAIL;
1546 
1547     if(g_SARKpdDrvInfo.u8ConfigUsedChs >= CFG_SAR_KPD_AVLBCHS)
1548         return E_SAR_KPD_FAIL;
1549 
1550     ret_val = MDrv_SAR_Kpd_CfgChInfo(sarChInfo);
1551     g_SARKpdDrvInfo.u8ConfigUsedChs = MDrv_SAR_Kpd_GetCfgChannels();
1552     SAR_KPD_DBG_INFO("Configured Channels = %d\n",g_SARKpdDrvInfo.u8ConfigUsedChs);
1553 
1554     // configure analog input & output enable according to used channels
1555     MDrv_SAR_Kpd_CfgAnalogInputs();
1556     return ret_val;
1557 }
1558 
1559 //-------------------------------------------------------------------------------------------------
1560 /// Get SAR Keypad key code Alogrithm function.
1561 /// @param pu8Key: key code pointer
1562 /// @param pu8Repeat: key repeat pointer
1563 /// @param u8Idx: Inspect SAR index
1564 /// @return E_SAR_KPD_OK: Success
1565 /// @return E_SAR_KPD_FAIL or other values: Failure
1566 //-------------------------------------------------------------------------------------------------
1567 
MDrv_SAR_Kpa_GetKeyCode_Alogrithm(MS_U8 * pu8Key,MS_U8 * pu8Repeat,MS_U8 u8Idx)1568 SAR_KpdResult MDrv_SAR_Kpa_GetKeyCode_Alogrithm(MS_U8 *pu8Key, MS_U8 *pu8Repeat, MS_U8 u8Idx)
1569 {
1570     MS_U8 u8Channel;
1571     u8Channel = MDrv_SAR_Kpd_GetChID(u8Idx) ;
1572 
1573     if((u8Channel<CFG_SAR_KPD_AVLBCHS) && (gu8StorageChUsed[u8Channel]==TRUE))
1574     {
1575         if(MDrv_SAR_Kpd_GetCHKey(u8Channel, pu8Key, pu8Repeat))
1576             return E_SAR_KPD_OK;
1577     }
1578 
1579     return E_SAR_KPD_FAIL;
1580 }
1581 
1582 //-------------------------------------------------------------------------------------------------
1583 /// Get SAR Keypad key code function.
1584 /// @param pu8Key: key code pointer
1585 /// @param pu8Repeat: key repeat pointer
1586 /// @return E_SAR_KPD_OK: Success
1587 /// @return E_SAR_KPD_FAIL or other values: Failure
1588 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_GetKeyCode_U2K(MS_U8 * pu8Key,MS_U8 * pu8Repeat)1589 SAR_KpdResult MDrv_SAR_Kpd_GetKeyCode_U2K(MS_U8 *pu8Key, MS_U8 *pu8Repeat)
1590 {
1591     MS_U8 i;
1592 
1593     SAR_KPD_DBG_FUNC();
1594 
1595     for(i=0;i<g_SARKpdDrvInfo.u8ConfigUsedChs;i++)
1596     {
1597         if (MDrv_SAR_Kpa_GetKeyCode_Alogrithm(pu8Key, pu8Repeat, i) == E_SAR_KPD_OK)
1598   	    return E_SAR_KPD_OK;
1599     }
1600     return E_SAR_KPD_FAIL;
1601 }
1602 
1603 //-------------------------------------------------------------------------------------------------
1604 /// Get SAR Multi-Keypad key code function with every SAR channel
1605 /// @param SAR_KeyValue: key code struct pointer
1606 /// @param u32Size: Struct Size
1607 /// @return E_SAR_KPD_OK: Success
1608 /// @return E_SAR_KPD_FAIL or other values: Failure
1609 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_GetMultiKeyCode(SAR_KeyValue * sSarKey,MS_U32 u32Size)1610 SAR_KpdResult MDrv_SAR_Kpd_GetMultiKeyCode(SAR_KeyValue *sSarKey, MS_U32 u32Size)
1611 {
1612     MS_U8 i;
1613     MS_U8 u8Key;
1614     MS_U8 u8Repeat;
1615 
1616     if (sSarKey == NULL)
1617         return E_SAR_KPD_FAIL;
1618 
1619     if ((sSarKey->u32Version == 0) && (sizeof(SAR_KeyValue) == u32Size))
1620     {
1621         sSarKey->u32Num = 0; //initalize u32Num = 0
1622         for(i=0;i<g_SARKpdDrvInfo.u8ConfigUsedChs;i++)
1623         {
1624             u8Key = 0;
1625 	    u8Repeat = 0;
1626             if (MDrv_SAR_Kpa_GetKeyCode_Alogrithm(&u8Key, &u8Repeat, i) == E_SAR_KPD_OK)
1627 	    {
1628 	        sSarKey->unSarKeyData.sData[sSarKey->u32Num].u8Channel = MDrv_SAR_Kpd_GetChID(i) ;
1629 		sSarKey->unSarKeyData.sData[sSarKey->u32Num].u8Key = u8Key;
1630 		sSarKey->unSarKeyData.sData[sSarKey->u32Num].u8Repeat = u8Repeat;
1631 		sSarKey->u32Num++;
1632             }
1633         }
1634 
1635         return (sSarKey->u32Num == 0? E_SAR_KPD_FAIL : E_SAR_KPD_OK);
1636     }
1637     else
1638     {
1639         SAR_DBG_ERR("Invalid SAR_KeyValue Version, version:[%d], struct size:[%d <--> %d]!!!!\n",
1640 	    sSarKey->u32Version, u32Size, sizeof(SAR_KeyValue));
1641     }
1642     return E_SAR_KPD_FAIL;
1643 }
1644 //-------------------------------------------------------------------------------------------------
1645 /// Get SAR Keypad current status function.
1646 /// @param None:
1647 /// @return E_SAR_KPD_INIT_OK: Init OK
1648 /// @return others: other status
1649 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_GetStatus(void)1650 SAR_KpdStatus MDrv_SAR_Kpd_GetStatus(void)
1651 {
1652     SAR_KPD_DBG_FUNC();
1653 
1654     return g_u8SARKpdStatus;
1655 }
1656 
1657 //-------------------------------------------------------------------------------------------------
1658 /// Get SAR Keypad driver information function.
1659 /// @return @ref SAR_KpdDrvInfo structure
1660 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_GetInfo(void)1661 const SAR_KpdDrvInfo* MDrv_SAR_Kpd_GetInfo(void)
1662 {
1663     SAR_KPD_DBG_FUNC();
1664 
1665     return &g_SARKpdDrvInfo;
1666 }
1667 
1668 //-------------------------------------------------------------------------------------------------
1669 /// Set SAR Keypad debug function level.
1670 /// @param eLevel \b IN: E_SAR_KPD_DBGLVL_NONE/E_SAR_KPD_DBGLVL_WARNING/E_SAR_KPD_DBGLVL_ERROR/E_SAR_KPD_DBGLVL_INFO/E_SAR_KPD_DBGLVL_ALL
1671 /// @return E_SAR_KPD_OK: Success
1672 /// @return E_SAR_KPD_FAIL or other values: Failure
1673 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Kpd_SetDbgLevel(SAR_KpdDbgLvl eLevel)1674 SAR_KpdResult MDrv_SAR_Kpd_SetDbgLevel(SAR_KpdDbgLvl eLevel)
1675 {
1676     SAR_KPD_DBG_FUNC();
1677 
1678     SAR_DBG_INFO("Debug level: %u\n", eLevel);
1679     _gSARKpdDbgLevel = eLevel;
1680     return E_SAR_KPD_OK;
1681 }
1682 
1683 //-------------------------------------------------------------------------------------------------
1684 /// Set SAR as ADC channel.
1685 /// @param u8Channel: sar ADC channel 0~7
1686 /// @param bEnable: 1: configured as ADC, 0: configured as GPIO input
1687 /// @return E_SAR_ADC_OK: Success
1688 /// @return E_SAR_ADC_FAIL or other values: Failure
1689 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Adc_Config(MS_U8 u8Channel,MS_BOOL bEnable)1690 SAR_AdcResult MDrv_SAR_Adc_Config(MS_U8 u8Channel,MS_BOOL bEnable)
1691 {
1692     SAR_ADC_DBG_FUNC();
1693 
1694     if(bEnable)
1695     {
1696         HAL_SAR_CfgAanlogInputSelect(u8Channel,ENABLE);
1697         HAL_SAR_CfgOutputEnable(u8Channel,DISABLE);
1698     }
1699     else
1700     {
1701         HAL_SAR_CfgAanlogInputSelect(u8Channel,DISABLE);
1702         HAL_SAR_CfgOutputEnable(u8Channel,DISABLE);
1703     }
1704     return E_SAR_ADC_OK;
1705 }
1706 
1707 //-------------------------------------------------------------------------------------------------
1708 /// Get SAR ADC value function for each SAR channel.
1709 /// @param u8Channel: sar ADC channel 0~7
1710 /// @return MS_U8: ADC value
1711 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Adc_GetValue(MS_U8 u8Channel)1712 MS_U8 MDrv_SAR_Adc_GetValue(MS_U8 u8Channel)
1713 {
1714     SAR_ADC_DBG_FUNC();
1715 
1716     return HAL_SAR_GetChannelADC(u8Channel);
1717 }
1718 
1719 //-------------------------------------------------------------------------------------------------
1720 /// Set SAR High channel function for RGB HSync application
1721 /// @param bEnable: 1: enable high channel, 0: disable high channel
1722 /// @return E_SAR_ADC_OK: Success
1723 /// @return E_SAR_ADC_FAIL or other values: Failure
1724 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Adc_SetHSyncChEn(MS_BOOL bEnable)1725 SAR_AdcResult MDrv_SAR_Adc_SetHSyncChEn(MS_BOOL bEnable)
1726 {
1727     SAR_ADC_DBG_FUNC();
1728 
1729     HAL_SAR_CfgHighChannel(bEnable);
1730 
1731     return E_SAR_ADC_OK;
1732 }
1733 
1734 //-------------------------------------------------------------------------------------------------
1735 /// Switch RGB HSync MUX to direct signal to SAR High channel
1736 /// @param u8HsynCh: HSync channel: 0, 1, 2
1737 /// @return E_SAR_ADC_OK: Success
1738 /// @return E_SAR_ADC_FAIL or other values: Failure
1739 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Adc_SetHSyncCh(SAR_AdcHSyncCh eHSyncCh)1740 SAR_AdcResult MDrv_SAR_Adc_SetHSyncCh(SAR_AdcHSyncCh eHSyncCh)
1741 {
1742     MS_BOOL bResult;
1743 
1744     SAR_ADC_DBG_FUNC();
1745 
1746     switch(eHSyncCh)
1747     {
1748         case E_SAR_ADC_HSYNC_CH0:
1749             bResult= HAL_SAR_SetAdcHSyncChannel(0);
1750             break;
1751         case E_SAR_ADC_HSYNC_CH1:
1752             bResult= HAL_SAR_SetAdcHSyncChannel(1);
1753             break;
1754         case E_SAR_ADC_HSYNC_CH2:
1755             bResult= HAL_SAR_SetAdcHSyncChannel(2);
1756             break;
1757         case E_SAR_ADC_HSYNC_CH3:
1758             bResult= HAL_SAR_SetAdcHSyncChannel(3);
1759             break;
1760         default:
1761             return E_SAR_ADC_FAIL;
1762     }
1763     return ((bResult)? E_SAR_ADC_OK : E_SAR_ADC_FAIL);
1764 }
1765 
1766 //-------------------------------------------------------------------------------------------------
1767 /// Set SAR ADC debug function level.
1768 /// @param eLevel \b IN: E_SAR_ADC_DBGLVL_NONE/E_SAR_ADC_DBGLVL_WARNING/E_SAR_ADC_DBGLVL_ERROR/E_SAR_ADC_DBGLVL_INFO/E_SAR_ADC_DBGLVL_ALL
1769 /// @return E_SAR_ADC_OK: Success
1770 /// @return E_SAR_ADC_FAIL or other values: Failure
1771 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Adc_SetDbgLevel(SAR_AdcDbgLvl eLevel)1772 SAR_AdcResult MDrv_SAR_Adc_SetDbgLevel(SAR_AdcDbgLvl eLevel)
1773 {
1774     SAR_ADC_DBG_FUNC();
1775 
1776     SAR_DBG_INFO("Debug level: %u\n", eLevel);
1777     _gSARAdcDbgLevel = eLevel;
1778     return E_SAR_ADC_OK;
1779 }
1780 
1781 //-------------------------------------------------------------------------------------------------
1782 /// Set SAR as GPIO channel.
1783 /// @param u8Channel: sar GPIO channel 0~7
1784 /// @param u8InOut: 1: Input, 0:output
1785 /// @return E_SAR_GPIO_OK: Success
1786 /// @return E_SAR_GPIO_FAIL or other values: Failure
1787 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Gpio_CfgDir(MS_U8 u8Channel,MS_BOOL u8InOut)1788 SAR_GpioResult MDrv_SAR_Gpio_CfgDir(MS_U8 u8Channel,MS_BOOL u8InOut)
1789 {
1790     SAR_GPIO_DBG_FUNC();
1791 
1792     HAL_SAR_CfgAanlogInputSelect(u8Channel,DISABLE);
1793     HAL_SAR_CfgOutputEnable(u8Channel,(u8InOut)? DISABLE : ENABLE);
1794     return E_SAR_GPIO_OK;
1795 }
1796 
1797 //-------------------------------------------------------------------------------------------------
1798 /// Set SAR GPIO channel High/Low
1799 /// @param u8Channel: sar GPIO channel 0~7
1800 /// @param bHighLow: 1: High, 0:low
1801 /// @return E_SAR_GPIO_OK: Success
1802 /// @return E_SAR_GPIO_FAIL or other values: Failure
1803 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Gpio_SetOutput(MS_U8 u8Channel,MS_BOOL bHighLow)1804 SAR_GpioResult MDrv_SAR_Gpio_SetOutput(MS_U8 u8Channel,MS_BOOL bHighLow)
1805 {
1806     SAR_GPIO_DBG_FUNC();
1807 
1808     HAL_SAR_SetOutput(u8Channel,bHighLow);
1809     return E_SAR_GPIO_OK;
1810 }
1811 
1812 //-------------------------------------------------------------------------------------------------
1813 /// Get SAR GPIO channel High/Low
1814 /// @param u8Channel: sar GPIO channel 0~7
1815 /// @param pbResult: pointer to get Input level
1816 /// @return E_SAR_GPIO_OK: Success
1817 /// @return E_SAR_GPIO_FAIL or other values: Failure
1818 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Gpio_GetInput(MS_U8 u8Channel,MS_BOOL * pbResult)1819 SAR_GpioResult MDrv_SAR_Gpio_GetInput(MS_U8 u8Channel, MS_BOOL* pbResult)
1820 {
1821     SAR_GPIO_DBG_FUNC();
1822 
1823     *pbResult = HAL_SAR_GetInput(u8Channel);
1824     return E_SAR_GPIO_OK;
1825 }
1826 
1827 //-------------------------------------------------------------------------------------------------
1828 /// Set SAR GPIO debug function level.
1829 /// @param eLevel \b IN: E_SAR_GPIO_DBGLVL_NONE/E_SAR_GPIO_DBGLVL_WARNING/E_SAR_GPIO_DBGLVL_ERROR/E_SAR_GPIO_DBGLVL_INFO/E_SAR_GPIO_DBGLVL_ALL
1830 /// @return E_SAR_GPIO_OK: Success
1831 /// @return E_SAR_GPIO_FAIL or other values: Failure
1832 //-------------------------------------------------------------------------------------------------
MDrv_SAR_Gpio_SetDbgLevel(SAR_GpioDbgLvl eLevel)1833 SAR_GpioResult MDrv_SAR_Gpio_SetDbgLevel(SAR_GpioDbgLvl eLevel)
1834 {
1835     SAR_GPIO_DBG_FUNC();
1836 
1837     SAR_DBG_INFO("Debug level: %u\n", eLevel);
1838     _gSARGpioDbgLevel = eLevel;
1839     return E_SAR_GPIO_OK;
1840 }
1841 
1842 //-------------------------------------------------------------------------------------------------
1843 /// Set SAR Interrupt mask
1844 /// @param u8Channel: sar GPIO channel 0~7
1845 /// @param bEnable:  1: enable interrupt, 0: disable interrupt
1846 /// @return E_SAR_GPIO_OK: Success
1847 /// @return E_SAR_GPIO_FAIL or other values: Failure
1848 //-------------------------------------------------------------------------------------------------
MDrv_SAR_CfgInterrupt(MS_U8 u8Channel,MS_BOOL bEnable)1849 SAR_GpioResult MDrv_SAR_CfgInterrupt(MS_U8 u8Channel, MS_BOOL bEnable)
1850 {
1851     HAL_SAR_Interrupt_EN(u8Channel, !bEnable);
1852     return E_SAR_GPIO_OK;
1853 }
1854 
1855 //-------------------------------------------------------------------------------------------------
1856 /// Set SAR Interrupt wakeup
1857 /// @param bEnable:  1: enable interrupt, 0: disable interrupt
1858 /// @return E_SAR_GPIO_OK: Success
1859 /// @return E_SAR_GPIO_FAIL or other values: Failure
1860 //-------------------------------------------------------------------------------------------------
MDrv_SAR_CfgPMWakeup(MS_BOOL bEnable)1861 SAR_GpioResult MDrv_SAR_CfgPMWakeup(MS_BOOL bEnable)
1862 {
1863     HAL_SAR_Wakeup_EN(!bEnable);
1864     return E_SAR_GPIO_OK;
1865 }
1866 
1867 //-------------------------------------------------------------------------------------------------
1868 /// Set SAR Clear Interrupt Status
1869 /// @param u8Channel: sar GPIO channel 0~7
1870 /// @return E_SAR_GPIO_OK: Success
1871 /// @return E_SAR_GPIO_FAIL or other values: Failure
1872 //-------------------------------------------------------------------------------------------------
MDrv_SAR_ClearInterrupt(MS_U8 u8Channel)1873 void MDrv_SAR_ClearInterrupt(MS_U8 u8Channel)
1874 {
1875     HAL_SAR_CLR_INT(u8Channel);
1876 }
1877 
1878 //-------------------------------------------------------------------------------------------------
1879 /// Get SAR Status
1880 /// @param u8Channel: sar GPIO channel 0~7
1881 /// @return E_SAR_GPIO_OK: trigger interrupt
1882 /// @return E_SAR_GPIO_FAIL or interrrupt do not trigger
1883 //-------------------------------------------------------------------------------------------------
MDrv_SAR_GetInterruptStatus(MS_U8 u8Channel)1884 SAR_GpioResult MDrv_SAR_GetInterruptStatus(MS_U8 u8Channel)
1885 {
1886     return HAL_SAR_INT_Status(u8Channel)? E_SAR_GPIO_OK: E_SAR_GPIO_FAIL;
1887 }
1888 
1889 
1890 //-------------------------------------------------------------------------------------------------
1891 /// Set SAR 2.2V / 3.3V Level
1892 /// @param eSarLevel:  E_SAR_33V: 3.3V, E_SAR_22V: 2.2V
1893 /// @return Void
1894 /// @return Void
1895 //-------------------------------------------------------------------------------------------------
MDrv_SAR_SetLevel(SAR_LEVEL eSarLevel)1896 void MDrv_SAR_SetLevel(SAR_LEVEL eSarLevel)
1897 {
1898 	HAL_SAR_SET_LEVEL((MS_BOOL) eSarLevel);
1899 }
1900 
1901 
MDrv_SAR_SetPowerState(EN_POWER_MODE u16PowerState)1902 MS_U32 MDrv_SAR_SetPowerState(EN_POWER_MODE u16PowerState)
1903 {
1904 	static EN_POWER_MODE _prev_u16PowerState = E_POWER_MECHANICAL;
1905 	MS_U16 u16Return = UTOPIA_STATUS_FAIL;
1906 	if (u16PowerState == E_POWER_SUSPEND)
1907 	{
1908         // suspend reset initflag
1909     gbSARInitialized = FALSE;
1910 		_prev_u16PowerState = u16PowerState;
1911 		u16Return = UTOPIA_STATUS_SUCCESS;//SUSPEND_OK;
1912 	}
1913 	else if (u16PowerState == E_POWER_RESUME)
1914 	{
1915 
1916 		if (_prev_u16PowerState == E_POWER_SUSPEND)
1917 		{
1918             //for high sar channel set
1919             HAL_SAR_CfgHighChannel(ENABLE);
1920 
1921 			_prev_u16PowerState = u16PowerState;
1922 			u16Return = UTOPIA_STATUS_SUCCESS;//RESUME_OK;
1923 		}
1924 		else
1925 		{
1926 			ULOGE(TAG_SAR, "[%s,%5d]It is not suspended yet. We shouldn't resume\n",__FUNCTION__,__LINE__);
1927 			u16Return = UTOPIA_STATUS_FAIL;//SUSPEND_FAILED;
1928 		}
1929 	}
1930 	else
1931 	{
1932 		ULOGE(TAG_SAR, "[%s,%5d]Do Nothing: %d\n",__FUNCTION__,__LINE__,u16PowerState);
1933 		u16Return = UTOPIA_STATUS_FAIL;
1934 	}
1935 
1936 	return u16Return;// for success
1937 }
1938 
1939 #if (SAR_UTOPIA20)
1940 // below are utopia10 interface and will call to utopia20 core
_MDrv_SAR_CheckUtopia20Open(void ** pInstance,MS_U32 u32ModuleVersion,void * pAttribute)1941 MS_BOOL _MDrv_SAR_CheckUtopia20Open(void** pInstance, MS_U32 u32ModuleVersion, void* pAttribute)
1942 {
1943     if (FALSE == bU20SAROpened)
1944     {
1945         if(UtopiaOpen(MODULE_SAR | KERNEL_MODE, pInstance, u32ModuleVersion, pAttribute) != UTOPIA_STATUS_SUCCESS)
1946         {
1947             printf("Open SAR fail\n");
1948     		return FALSE;
1949         }
1950         bU20SAROpened = TRUE;
1951     }
1952     return TRUE;
1953 }
1954 #endif
1955 
MDrv_SAR_Kpd_GetKeyCode(MS_U8 * pu8Key,MS_U8 * pu8Repeat)1956 SAR_KpdResult MDrv_SAR_Kpd_GetKeyCode(MS_U8 *pu8Key, MS_U8 *pu8Repeat)
1957 {
1958 #if (SAR_UTOPIA20)
1959     MS_U32 u32Ret;
1960     SAR_PRIVATE_PARAM_Kpd_GetKeyCode SarParam_Kpd_GetKeyCode;
1961 
1962     if ((pu8Key==NULL) || (pu8Repeat==NULL))
1963     {
1964         printf("[ERROR] %s, pu8Key or pu8Repeat is null\n", __FUNCTION__);
1965         return E_SAR_KPD_FAIL;
1966     }
1967 
1968     if (FALSE == _MDrv_SAR_CheckUtopia20Open(&pInstantSar, 0, pAttributeSar))
1969     {
1970     	printf("[ERROR] %s, _MDrv_SAR_CheckUtopia20Open fail\n", __FUNCTION__);
1971         return E_SAR_KPD_FAIL;
1972     }
1973 
1974     u32Ret = UtopiaIoctl(pInstantSar,MDrv_CMD_Kpd_GetKeyCode,(MS_U32*) &SarParam_Kpd_GetKeyCode);
1975     if (u32Ret == UTOPIA_STATUS_SUCCESS)
1976     {
1977         *pu8Key = SarParam_Kpd_GetKeyCode.u8Key;
1978         *pu8Repeat = SarParam_Kpd_GetKeyCode.u8Repeat;
1979     }
1980     u32Ret = SarParam_Kpd_GetKeyCode.u32Retn;
1981     return u32Ret;
1982 #else
1983      return MDrv_SAR_Kpd_GetKeyCode_U2K(pu8Key,pu8Repeat);
1984 #endif
1985 }
1986 
MDrv_SAR_Kpd_SetChInfo(SAR_KpdRegCfg * sarChInfo)1987 SAR_KpdResult MDrv_SAR_Kpd_SetChInfo(SAR_KpdRegCfg *sarChInfo)
1988 {
1989 #if (SAR_UTOPIA20)
1990 		SAR_KpdResult u32Ret;
1991 		PSAR_PRIVATE_PARAM_KeyConfig pSarParam_Config = NULL;
1992 		pSarParam_Config = (PSAR_PRIVATE_PARAM_KeyConfig)malloc(sizeof(SAR_PRIVATE_PARAM_KeyConfig));
1993 		pSarParam_Config->pKeyRegCfg= sarChInfo;
1994 		if (FALSE == _MDrv_SAR_CheckUtopia20Open(&pInstantSar, 0, pAttributeSar))
1995 			return 0;
1996 		u32Ret = UtopiaIoctl(pInstantSar,MDrv_CMD_SAR_Config,(MS_U32*)pSarParam_Config);
1997 		free(pSarParam_Config);
1998 		return (SAR_KpdResult)u32Ret;
1999 #else
2000 		return MDrv_SAR_Kpd_SetChInfo_U2K(sarChInfo);
2001 #endif
2002 }
2003 
MDrv_SAR_GetConfig(SAR_KpdRegCfg * sarChInfo)2004 SAR_KpdResult MDrv_SAR_GetConfig(SAR_KpdRegCfg *sarChInfo)
2005 {
2006 #if (SAR_UTOPIA20)
2007      SAR_KpdResult u32Ret;
2008      PSAR_PRIVATE_PARAM_KeyConfig pSarParam_Config = NULL;
2009      pSarParam_Config = (PSAR_PRIVATE_PARAM_KeyConfig)malloc(sizeof(SAR_PRIVATE_PARAM_KeyConfig));
2010      pSarParam_Config->pKeyRegCfg= sarChInfo;
2011      if (FALSE == _MDrv_SAR_CheckUtopia20Open(&pInstantSar, 0, pAttributeSar))
2012         return 0;
2013      u32Ret = UtopiaIoctl(pInstantSar,MDrv_CMD_SAR_GetConfig,(MS_U32*)pSarParam_Config);
2014      free(pSarParam_Config);
2015      return (SAR_KpdResult)u32Ret;
2016 #else
2017      return MDrv_SAR_Kpd_SetChInfo_U2K(sarChInfo);
2018 #endif
2019 }
2020 
2021 
2022 #ifdef CONFIG_MSTAR_T_SENSOR_ENABLE
2023 
2024 static TSENSOR_CB_FUNC _pTSensorCbFunc = NULL;
2025 static MS_BOOL _bSARInit  = FALSE;
2026 
_MDrv_TSensor_INTHandler(InterruptNum eIntNum)2027 static void _MDrv_TSensor_INTHandler(InterruptNum eIntNum)
2028 {
2029     if(!_bSARInit)
2030     {
2031         MDrv_TSensor_Init();
2032         _bSARInit = TRUE;
2033     }
2034     if(NULL == _pTSensorCbFunc)
2035         return;
2036     if(!HAL_TSensorINTCheck())
2037     {
2038         printf("Not T-Sensor IRQ\n");
2039         return;
2040     }
2041     printf("T-Sensor IRQ\n");
2042     if(_pTSensorCbFunc == NULL)
2043         return;
2044     else
2045         _pTSensorCbFunc();
2046     MsOS_EnableInterrupt(eIntNum);
2047 }
2048 
MDrv_TSensor_GetTemperatureRange(MS_S16 * s16UpBound_C,MS_S16 * s16LowBound_C)2049 MS_BOOL MDrv_TSensor_GetTemperatureRange(MS_S16 *s16UpBound_C, MS_S16 *s16LowBound_C)
2050 {
2051     if(!_bSARInit)
2052     {
2053         MDrv_TSensor_Init();
2054         _bSARInit = TRUE;
2055     }
2056     if((s16UpBound_C== NULL) ||(s16LowBound_C==NULL))
2057         return FALSE;
2058     *s16UpBound_C = HAL_TSensorGetUpBound();
2059     *s16LowBound_C = HAL_TSensorGetLowBound();
2060      return TRUE;
2061 }
MDrv_TSensor_GetTemperature(void)2062 MS_S16 MDrv_TSensor_GetTemperature(void)
2063 {
2064     if(!_bSARInit)
2065     {
2066         MDrv_TSensor_Init();
2067         _bSARInit = TRUE;
2068     }
2069     return HAL_TSensorGetCurTemp_C();
2070 }
MDrv_TSensor_Init(void)2071 MS_BOOL MDrv_TSensor_Init(void)
2072 {
2073     MS_BOOL bRet = TRUE;
2074     if(_bSARInit)
2075     {
2076         return bRet;
2077     }
2078     MDrv_SAR_Kpd_MMIO_Init();
2079     bRet &= HAL_TSensorEnable(); //disable interrupt in SAR bank
2080     _bSARInit = TRUE;
2081     return bRet;
2082 }
MDrv_TSensor_SetTemperatureMointerRange(MS_S16 s16UpBound_C,MS_S16 s16LowBound_C,TSENSOR_CB_FUNC pTSensor)2083 MS_BOOL MDrv_TSensor_SetTemperatureMointerRange(MS_S16 s16UpBound_C, MS_S16 s16LowBound_C, TSENSOR_CB_FUNC pTSensor)
2084 {
2085     static MS_BOOL ISRIsAttched = FALSE;
2086     MS_BOOL bRet = TRUE;
2087     if(!_bSARInit)
2088     {
2089         MDrv_TSensor_Init();
2090         _bSARInit = TRUE;
2091     }
2092     if(pTSensor)
2093     {
2094         _pTSensorCbFunc = pTSensor;
2095     }
2096     else
2097     {
2098         return FALSE;
2099     }
2100     if(!ISRIsAttched)
2101     {
2102         bRet &= MsOS_AttachInterrupt(E_INT_IRQ_KEYPAD, (InterruptCb)_MDrv_TSensor_INTHandler);
2103     }
2104     ISRIsAttched = TRUE;
2105     bRet &= MsOS_EnableInterrupt(E_INT_IRQ_KEYPAD); //enable interrupt in INTR bank
2106     bRet &= HAL_TSensorSetBound(s16UpBound_C,s16LowBound_C);
2107 
2108     return bRet;
2109 }
MDrv_TSensorIRQClear(void)2110 MS_BOOL MDrv_TSensorIRQClear(void)
2111 {
2112     if(!_bSARInit)
2113     {
2114         MDrv_TSensor_Init();
2115         _bSARInit = TRUE;
2116     }
2117     return HAL_TSensorIRQClear();
2118 }
2119 
2120 #endif
2121 
2122 
2123 
2124