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