source: svn/newcon3bcm2_21bu/magnum/portinginterface/hdm/7552/bhdm_cec_priv.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 26.1 KB
Line 
1/***************************************************************************
2 *         Copyright (c) 2005-2011, Broadcom Corporation
3 *         All Rights Reserved
4 *         Confidential Property of Broadcom Corporation
5 *
6 *      THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *      AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *      EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bhdm_cec_priv.c $
11 * $brcm_Revision: Hydra_Software_Devel/21 $
12 * $brcm_Date: 11/22/11 6:02p $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/portinginterface/hdm/7038/bhdm_cec_priv.c $
19 *
20 * Hydra_Software_Devel/21   11/22/11 6:02p vle
21 * SW7425-1140: Merge to mainline.  Remove all CEC functionality out of
22 * HDM PI.
23 *
24 * Hydra_Software_Devel/SW7425-1140/2   11/22/11 5:47p vle
25 * SW7425-1140: Add BHDM_CONFIG_CEC_LEGACY_SUPPORT for backward compatible
26 * for CEC legacy platforms.
27 *
28 * Hydra_Software_Devel/SW7425-1140/1   11/16/11 12:16p vle
29 * SW7425-1140: Remove all CEC functionalities out of HDM PI
30 *
31 * Hydra_Software_Devel/20   11/14/11 2:15p rgreen
32 * SW7425-1710: Update BHDM_CONFIG macro usage.  Describe specific
33 * functionality vs chip process
34 *
35 * Hydra_Software_Devel/19   10/11/11 4:50p vle
36 * SW7429-5: Add support for 7429.
37 *
38 * Hydra_Software_Devel/18   5/20/11 5:20p vle
39 * SWBLURAY-25934: Fix copy and paste error in resetting CEC core.
40 *
41 * Hydra_Software_Devel/17   9/28/10 7:18p vle
42 * SW7422-23: Refactor HDMI code to isolate platform dependent code
43 * furthermore. Add support for 7422 and other 40nm platforms.
44 *
45 * Hydra_Software_Devel/16   1/6/10 4:30p vle
46 * SW3548-2670: Fix compiler errors for HDMI TX platforms. Centralize all
47 * CEC timing configurations
48 *
49 * Hydra_Software_Devel/15   12/29/09 3:51p rgreen
50 * SW3548-2670: Add register offset to support multiple fe channels
51 * Add function to adjust default timing
52 *
53 * Hydra_Software_Devel/14   12/3/09 10:11a rgreen
54 * SW7405-3411: Remove forced error when CEC message cannot be sent
55 *
56 * Hydra_Software_Devel/13   9/23/09 3:23p vle
57 * SW7601-166: Do not disable/re-enable xmit message when disable/enable
58 * CEC.
59 * Merge fix from bdvd_v3.0 branch
60 *
61 * Hydra_Software_Devel/12   9/18/09 11:11a vle
62 * SW7601-166: Merge fix from bdvd_v3.0 branch, made by Rajul
63 *
64 * Hydra_Software_Devel/11   7/13/09 8:06p vle
65 * PR55786: Fix coverity issue.
66 *
67 * Hydra_Software_Devel/10   3/23/09 6:49p vle
68 * PR52895: Reset FirstCecMessage variable after resetting CEC core when
69 * setting CEC logical address.
70 *
71 * Hydra_Software_Devel/9   3/2/09 3:44p vle
72 * PR52485: Fix build issue with BDBG_DEBUG_BUILD=0
73 *
74 * Hydra_Software_Devel/8   12/2/08 11:52a vle
75 * PR49651: Fix CEC compiling issue for 7601/7420
76 *
77 * Hydra_Software_Devel/7   11/11/08 10:48a rgreen
78 * PR47447: Fix compilation warning; use debug message for debug builds
79 * only
80 *
81 * Hydra_Software_Devel/6   10/30/08 5:51p vle
82 * PR47447: Merge to main branch.
83 * Add new GetReceivedMessage API. Use same CEC configuration for
84 * transmitter and receiver.
85 *
86 * Hydra_Software_Devel/PR47447/1   9/30/08 7:03p vle
87 * PR47447: Add new GetReceivedMessage API. Use same CEC configuration for
88 * transmitter and receiver.
89 *
90 * Hydra_Software_Devel/5   9/11/08 11:10p rgreen
91 * PR45482: PR44257: Add debug messages.  Copy message without header in
92 * BHDM_CEC_P_RecvMsg
93 * PR44257,PR45482: clear warning
94 *
95 * Hydra_Software_Devel/4   9/10/08 12:47p vle
96 * PR 44168: Update CEC debug message.
97 *
98 * Hydra_Software_Devel/PR45482/2   9/11/08 11:03p rgreen
99 * PR44257: Add debug messages.  Copy message without header in
100 * BHDM_CEC_P_RecvMsg
101 *
102 * Hydra_Software_Devel/PR45482/2   9/11/08 11:02p rgreen
103 * PR44257: Add more debug messages;copy message without header in
104 * BHDM_CEC_P_RecvMsg
105 *
106 * Hydra_Software_Devel/PR45482/1   8/7/08 2:07p honglang
107 * PR44257,PR45482: clear warning
108 *
109 * Hydra_Software_Devel/3   7/8/08 1:06p vle
110 * PR44168: merge to main branch
111 *
112 * Hydra_Software_Devel/PR44168/1   6/25/08 4:07p vle
113 * PR 44168: resetting CEC core at the right time. Clear CEC logical
114 * address at hotplug to prevent a possible confused state for the core.
115 *
116 * Hydra_Software_Devel/2   5/27/08 12:22p vle
117 * PR42271, PR40264: add CEC support for HDMI Rx platforms.
118 *
119 * Hydra_Software_Devel/PR42271/3   5/23/08 6:25p vle
120 * PR 42271: Modify to allow easier code reuse between HDMI Tx and HDMI Rx
121 *
122 * Hydra_Software_Devel/PR42271/2   5/16/08 4:48p honglang
123 * PR42271, PR40264: add CEC support to 3563
124 *
125 * Hydra_Software_Devel/PR42271/1   5/16/08 2:56p honglang
126 * PR42271, PR40264: add CEC support to 3563
127 *
128 * Hydra_Software_Devel/1   4/28/08 6:11p vle
129 * PR42271: Move HDMI CEC implementation to bhdm_cec_priv files
130 *
131 ***************************************************************************/
132
133 /****************************** Include Files ********************************/
134#include "bstd.h"
135#include "bavc_hdmi.h"
136#include "bhdm_cec_priv.h"
137
138 
139BDBG_MODULE(BHDM_CEC_PRIV) ;
140 
141#define BHDM_CHECK_RC( rc, func )                                 \
142do                                                                                                \
143{                                                                                                 \
144        if( (rc = BERR_TRACE(func)) != BERR_SUCCESS ) \
145        {                                                                                         \
146                goto done;                                                                \
147        }                                                                                         \
148} while(0)
149
150#if BHDM_CONFIG_CEC_LEGACY_SUPPORT
151
152#if BHDM_CONFIG_TX
153#define BCEC_REG_OFFSET 0
154#else
155#define BCEC_REG_OFFSET hHDMI->ulOffset 
156#endif
157
158
159/******************************************************************************
160 * Private API
161 ******************************************************************************/
162void BHDM_CEC_P_ResetCore (BCEC_Handle hHDMI, uint8_t bReset)
163{
164        uint32_t Register;
165        BREG_Handle hRegister ;
166        uint32_t ulOffset;
167       
168        hRegister = hHDMI->hRegister ;
169        ulOffset = BCEC_REG_OFFSET ;
170
171
172        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset) ;
173
174#if BHDM_CONFIG_40NM_SUPPORT
175        Register &= ~(BCHP_MASK_DVP(CEC_CNTRL_5, CEC_TX_SW_INIT)
176                                | BCHP_MASK_DVP(CEC_CNTRL_5, CEC_RX_SW_INIT));
177       
178        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CEC_TX_SW_INIT, bReset)
179                        | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CEC_RX_SW_INIT, bReset);
180       
181#else
182        Register &= ~(BCHP_MASK_DVP(CEC_CNTRL_5, CEC_TX_SW_RESET)
183                                | BCHP_MASK_DVP(CEC_CNTRL_5, CEC_RX_SW_RESET));
184       
185        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CEC_TX_SW_RESET, bReset)
186                        | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CEC_RX_SW_RESET, bReset);
187#endif 
188
189        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset, Register) ;
190
191
192#ifdef BHDM_CONFIG_CEC_USE_PAD_SW_RESET
193        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset) ;
194        Register &= ~(BCHP_MASK_DVP(CEC_CNTRL_5, CEC_PAD_SW_RESET));
195
196        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CEC_PAD_SW_RESET, bReset);
197        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset, Register) ; 
198#endif
199
200        return;
201}
202
203
204BERR_Code BHDM_CEC_P_GetMyAddrs(
205        BCEC_Handle hHDMI,               /* [in] HDMI handle */
206        uint8_t *pMyPhysicalAddr, /* [out] ptr to uint8 to hold my Physical Addr */
207        uint8_t *pMyLogicalAddr  /* [out] ptr to uint8 to hold my Logical Addr */
208) 
209{
210        BERR_Code rc = BERR_SUCCESS ;
211        BREG_Handle hRegister ;
212        uint32_t Register ;
213        uint32_t ulOffset ;
214
215        BDBG_ENTER(BHDM_CEC_P_GetMyAddrs);
216
217        hRegister = hHDMI->hRegister ;
218        ulOffset = BCEC_REG_OFFSET ;
219
220#if BHDM_CONFIG_TX
221        /* for CEC on a Tx device; verify the EDID has been initialized */
222        /* the EDID is where the Tx Physical Address (A.B.C.D) is stored */
223        if ( hHDMI->edidStatus != BHDM_EDID_STATE_eOK ||
224                hHDMI->cecConfiguration.CecLogicalAddr == BHDM_CONFIG_CEC_UNINITIALIZED_LOGICAL_ADDR)
225        {
226                rc = BERR_NOT_INITIALIZED ;
227                goto done;
228        }
229#endif 
230
231        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
232       
233        *pMyLogicalAddr = 
234                BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, CEC_ADDR) ;
235
236               
237#if BHDM_CONFIG_TX
238        BKNI_Memcpy(pMyPhysicalAddr, &hHDMI->cecConfiguration.CecPhysicalAddr[0], 2)  ; 
239#else
240        /* Physical Address is always 0.0.0.0 on TVs/Receivers */
241        BKNI_Memset(pMyPhysicalAddr, 0, 2) ;
242#endif
243
244        BDBG_MSG(("My Logical Addr: %d", *pMyLogicalAddr)) ;
245        BDBG_MSG(("My Physical Addr: %02X %02X", *pMyPhysicalAddr, *(pMyPhysicalAddr+1))) ;
246
247#if BHDM_CONFIG_TX
248done:
249#endif
250
251        BDBG_LEAVE(BHDM_CEC_P_GetMyAddrs);
252        return rc ;
253}
254
255
256
257BERR_Code BHDM_CEC_P_SetMyAddr(
258        BCEC_Handle hHDMI,
259        uint8_t MyLogicalAddr
260)
261{
262        BERR_Code rc = BERR_SUCCESS ;
263        BREG_Handle hRegister ;
264        uint32_t Register ;
265        uint32_t ulOffset ;
266
267        BDBG_ENTER(BHDM_CEC_P_SetMyAddr);
268
269        hRegister = hHDMI->hRegister ;
270        ulOffset = BCEC_REG_OFFSET ;
271       
272        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
273        Register &= ~ BCHP_MASK_DVP(CEC_CNTRL_1, CEC_ADDR) ;
274
275       
276        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, CEC_ADDR, MyLogicalAddr) ;
277        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;
278       
279        hHDMI->cecConfiguration.CecLogicalAddr = MyLogicalAddr ;
280
281
282        /* holding CEC core in reset    */
283        BHDM_CEC_P_ResetCore (hHDMI, 1);
284
285        /* bring CEC core out of reset  */
286        BHDM_CEC_P_ResetCore (hHDMI, 0);
287
288        /* Reset FirstCecMessage */
289        hHDMI->cecConfiguration.FirstCecMessage = true; 
290
291        BDBG_LEAVE(BHDM_CEC_P_SetMyAddr);       
292        return rc ;
293}
294
295
296
297BERR_Code BHDM_CEC_P_GetMsgInfo(
298        BCEC_Handle hHDMI,         
299        BAVC_HDMI_CEC_IntMessageType *CECMsgType, /* Interrupt Message Type (Rx or) Tx */
300        uint8_t *CECMsgStatus,
301        uint8_t *CECMsgLength,
302        uint8_t *EOM
303)
304{
305        BERR_Code rc = BERR_SUCCESS ;
306        BREG_Handle hRegister ;
307        uint32_t Register ;
308        uint32_t ulOffset ;
309       
310#if BDBG_DEBUG_BUILD
311        static char *MsgStatus[] = {"NoACK", "ACK"} ;
312        static char *EomStatus[] = {"No", "Yes"} ;
313#endif 
314
315        BDBG_ENTER(BHDM_CEC_P_GetMsgInfo);
316        BDBG_ASSERT(CECMsgStatus);
317       
318        hRegister = hHDMI->hRegister ;
319        ulOffset = BCEC_REG_OFFSET ;
320
321        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset) ;
322        *CECMsgType = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_5, RX_CEC_INT) ;
323       
324        /* Get Status, EOM, CEC */
325        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
326       
327        if (*CECMsgType)  /* Receive Type Message */
328        {
329                *CECMsgStatus = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, RX_STATUS_GOOD) ;
330
331                /* number of rx CEC words that came in */
332                *CECMsgLength = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, REC_WRD_CNT) ;
333                *EOM = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, RX_EOM) ;
334                BDBG_MSG(("Rx Msg Int; Bytes: %d, EOM: %s", *CECMsgLength, EomStatus[*EOM])) ;
335
336        }
337        else  /* Transmit Type Message */
338        {
339                *CECMsgStatus = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, TX_STATUS_GOOD) ;
340               
341                /* Message Length should be same as transmitted length */
342                *CECMsgLength = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, MESSAGE_LENGTH) ;
343                *EOM = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, TX_EOM) ;
344                BDBG_MSG(("Transmitted Length: %d Xmit Status: %s", 
345                        *CECMsgLength, MsgStatus[*CECMsgStatus])) ;
346        }
347       
348        if (!CECMsgStatus)
349        {
350                rc = BCEC_RECEIVE_ERROR ;
351                BDBG_ERR(("Msg Err")) ;
352        }
353
354        BDBG_MSG(("Status: %s; EOM: %s", 
355                MsgStatus[*CECMsgStatus], 
356                EomStatus[*EOM])) ;
357
358
359        BDBG_LEAVE(BHDM_CEC_P_GetMsgInfo);
360        return rc ;
361}
362
363
364BERR_Code BHDM_CEC_P_PingLogicalAddr(
365   BCEC_Handle hHDMI,     /* [in] HDMI handle */
366   uint8_t LogicalAddr  /* [in] device logical address */
367) 
368{
369        BERR_Code rc = BERR_SUCCESS ;
370        BREG_Handle hRegister ;
371        uint32_t Register ;
372        uint32_t ulOffset ;
373        uint8_t i ;
374
375        BDBG_ENTER(BHDM_CEC_P_PingLogicalAddr);
376        BDBG_ASSERT(hHDMI);
377
378        hRegister = hHDMI->hRegister ;
379        ulOffset = BCEC_REG_OFFSET ;
380       
381        if (hHDMI->cecConfiguration.FirstCecMessage)
382        {
383                hHDMI->cecConfiguration.FirstCecMessage = false ;
384        }
385        else
386        {
387                /* verify no message is currently being transmitted */
388                Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
389                i = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, TX_EOM) ;
390                if (i == 0)
391                {
392                        BDBG_WRN(("Transmit CEC is Busy (TX_EOM: %d)!!... retry Ping later", i)) ;
393                        rc = BCEC_TRANSMIT_BUSY ;
394                        goto done ;
395                }
396        }
397       
398        Register = 0 ;
399        /* load the first nibble with the source/destination addr */
400        Register = (LogicalAddr << 4) | LogicalAddr ;
401        BDBG_MSG(("CecMsg[00]: Initiator %02X, Destination %02X", (Register >> 4),(Register & 0x0F))) ;
402
403        /* write the first nibble in case there is no PayLoad i.e zero length message */
404        BREG_Write32(hRegister, REGADDR_CEC_TX_DATA_1 + ulOffset, Register) ;
405       
406        /* set up the message length (=0) before xmit */
407        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
408        Register &= ~ BCHP_MASK_DVP(CEC_CNTRL_1, MESSAGE_LENGTH) ;
409        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, MESSAGE_LENGTH, 0) ;
410        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;
411       
412        /* toggle the start xmit bit */ 
413        Register &=  ~ BCHP_MASK_DVP(CEC_CNTRL_1, START_XMIT_BEGIN) ;
414        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;   /* 0 */
415       
416        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, START_XMIT_BEGIN, 1) ;
417        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;   /* 1 */
418       
419done:
420        BDBG_LEAVE(BHDM_CEC_P_PingLogicalAddr);
421        return rc ;     
422}
423
424
425
426BERR_Code BHDM_CEC_P_XmitMsg(
427        BCEC_Handle hHDMI,        /* [in] HDMI handle */
428        uint8_t DestinationAddr, 
429        const uint8_t *pCecTxMsgBuf, /* [in] ptr to buffer containing CEC msg to send */
430        uint8_t uiPayLoadLength          /* [in] size (bytes) of buffer to send */
431) 
432{
433        BERR_Code rc = BERR_SUCCESS ;
434        BREG_Handle hRegister ;
435        uint32_t Register ;
436        uint32_t ulOffset ;
437        uint32_t TxDataRegisterOffset ;
438        uint8_t i, j ;
439        uint8_t XmitMessageLength ;
440        char XmitMessage[255];
441        uint8_t debugMsgOffset;
442       
443
444        BDBG_ENTER(BHDM_CEC_P_XmitMsg);
445
446        hRegister = hHDMI->hRegister ;
447        ulOffset = BCEC_REG_OFFSET ;
448        if (uiPayLoadLength > BAVC_HDMI_CEC_MAX_XMIT_LENGTH) 
449        {
450                /* configure for Continuous Mode */
451                BDBG_ERR(("CEC Continuous Mode not implemented yet")) ;
452                rc = BCEC_NOT_IMPLEMENTED ;
453                goto done ;
454        }
455
456#if BHDM_CONFIG_TX
457        if (!hHDMI->RxDeviceAttached)
458        {
459                rc = BERR_NOT_INITIALIZED ;
460                BDBG_WRN(("No HDMI Device Connected; Unable to Send message")) ;
461                goto done ;
462        }
463        else if (hHDMI->cecConfiguration.CecLogicalAddr == BHDM_CONFIG_CEC_UNINITIALIZED_LOGICAL_ADDR)
464        {
465                BDBG_WRN(("CEC Logical Address has not been initialized; Unable to Send message")) ;
466                rc = BERR_NOT_INITIALIZED ;
467                goto done ;
468        }
469#endif
470
471        if (hHDMI->cecConfiguration.FirstCecMessage)
472        {
473                hHDMI->cecConfiguration.FirstCecMessage = false ;
474        }
475        else
476        {
477                /* verify no message is currently being transmitted */
478                Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
479                i = BCHP_GET_FIELD_DATA(Register, REGNAME_CEC_CNTRL_1, TX_EOM) ;
480                if (i == 0)
481                {
482                        BDBG_WRN(("Transmit CEC is Busy (TX_EOM: %d)!!... retry transmit later", i)) ;
483                        rc = BCEC_TRANSMIT_BUSY ;
484                        goto done ;
485                }
486        }
487
488       
489        /* load the CEC Msg Bytes */
490        Register = 0 ;
491        TxDataRegisterOffset = 0 ;
492        debugMsgOffset = 0;
493       
494        /* load the first nibble with the source/destination addr */
495        j = 1 ;
496        Register = (hHDMI->cecConfiguration.CecLogicalAddr << 4) | DestinationAddr ;
497        debugMsgOffset += BKNI_Snprintf(XmitMessage+debugMsgOffset, sizeof (XmitMessage) - debugMsgOffset, "%02X ", Register) ;
498
499        /* write the first nibble in case there is no PayLoad i.e zero length message */
500        BREG_Write32(hRegister, REGADDR_CEC_TX_DATA_1 + ulOffset + TxDataRegisterOffset, Register) ;
501       
502        XmitMessageLength = uiPayLoadLength /*+ 1*/ ;
503        for ( i = 0 ; XmitMessageLength && (i <= XmitMessageLength) ; i = i + 4) 
504        {
505                for ( ; j < 4 ; j++)
506                {
507                        Register |= pCecTxMsgBuf[j+i-1] << (8 * j) ;
508                       
509                        if (j + i == XmitMessageLength)
510                                break ;
511                }
512                       
513                BREG_Write32(hRegister, REGADDR_CEC_TX_DATA_1  + ulOffset + TxDataRegisterOffset, Register) ;
514                       
515                BDBG_MSG(("CEC TxReg %#08x: %#08x", 
516                        REGADDR_CEC_TX_DATA_1 + ulOffset + TxDataRegisterOffset, Register)) ;
517                       
518                j = 0 ;
519                Register = 0 ;
520                TxDataRegisterOffset += 4 ;
521        }
522
523
524        /* set up  the length */
525        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
526        Register &= ~BCHP_MASK_DVP(CEC_CNTRL_1, MESSAGE_LENGTH) ;
527        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, MESSAGE_LENGTH, uiPayLoadLength) ;
528        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;
529       
530        /* toggle the start xmit bit */ 
531        Register &=  ~ BCHP_MASK_DVP(CEC_CNTRL_1, START_XMIT_BEGIN) ;
532        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;   /* 0 */
533       
534        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, START_XMIT_BEGIN, 1) ;
535        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;   /* 1 */
536
537        /* CEC print/process message */
538        for (i = 0; i < XmitMessageLength && debugMsgOffset<sizeof(XmitMessage); i++) 
539        {
540                debugMsgOffset += BKNI_Snprintf(XmitMessage+debugMsgOffset, 
541                        sizeof (XmitMessage) - debugMsgOffset, "%02X ", pCecTxMsgBuf[i]) ;
542        }
543
544        BDBG_MSG(("CEC Message Length %d transmitted: %s", XmitMessageLength, XmitMessage)) ;
545       
546done:
547        BDBG_LEAVE(BHDM_CEC_P_XmitMsg);
548        return rc ;     
549}
550
551
552
553BERR_Code BHDM_CEC_P_EnableReceive(
554        BCEC_Handle hHDMI        /* [in] HDMI handle */
555) 
556{
557        BERR_Code rc = BERR_SUCCESS ;
558        BREG_Handle hRegister ;
559        uint32_t Register ;
560        uint32_t ulOffset ;
561
562        BDBG_ENTER(BHDM_CEC_P_EnableReceive);
563       
564        hRegister = hHDMI->hRegister ;
565        ulOffset = BCEC_REG_OFFSET ;
566       
567        BDBG_MSG(("Enable CEC Receive Mode")) ;
568        /* Enable Receive */
569        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
570       
571        Register |= BCHP_MASK_DVP(CEC_CNTRL_1, CLEAR_RECEIVE_OFF) ;
572        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;  /* Wr 1 */
573       
574        Register &= ~ BCHP_MASK_DVP(CEC_CNTRL_1, CLEAR_RECEIVE_OFF) ;
575        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;  /* Wr 0 */
576
577
578        BDBG_LEAVE(BHDM_CEC_P_EnableReceive);
579        return rc ;
580}
581
582
583
584BERR_Code BHDM_CEC_P_GetReceivedMessage(
585        BCEC_Handle hHDMI,                      /* [in] HDMI handle */
586        BAVC_HDMI_CEC_MessageData *pRecvMessageData             /* [out] ptr to storage for received CEC msg */
587) 
588{
589        BERR_Code rc = BERR_SUCCESS ;
590
591#if BDBG_DEBUG_BUILD
592        char receivedMsg[255] ;
593        uint8_t i,j;
594#endif
595
596       
597        BDBG_ENTER(BHDM_CEC_P_GetReceivedMessage);
598
599        /* EnterCriticalSection to prevent interrupt to fire off. Ensure CEC message queue is intact while copying */
600        BKNI_EnterCriticalSection() ;
601       
602                pRecvMessageData->messageLength = hHDMI->cecConfiguration.CecBufferedMsgLength ;
603                pRecvMessageData->initiatorAddr = (uint8_t) ((hHDMI->cecConfiguration.CecBufferedMsg[0] & 0xF0) >> 4);
604                pRecvMessageData->destinationAddr = (uint8_t) (hHDMI->cecConfiguration.CecBufferedMsg[0] & 0x0F);
605                BKNI_Memcpy(pRecvMessageData->messageBuffer, 
606                        hHDMI->cecConfiguration.CecBufferedMsg+1, pRecvMessageData->messageLength);                     
607               
608        BKNI_LeaveCriticalSection() ; 
609
610
611#if BDBG_DEBUG_BUILD
612        /* For debugging purposes */
613        for (i = 0, j = 0; i <= hHDMI->cecConfiguration.CecBufferedMsgLength && j<sizeof(receivedMsg); i++) {
614                j += BKNI_Snprintf(receivedMsg+j, sizeof(receivedMsg)-j, "%02X ", 
615                        hHDMI->cecConfiguration.CecBufferedMsg[i]) ;
616        }
617       
618        BDBG_MSG(("CEC Message Length %d Received: %s", 
619                hHDMI->cecConfiguration.CecBufferedMsgLength, receivedMsg)) ;
620#endif 
621
622        BDBG_LEAVE(BHDM_CEC_P_GetReceivedMessage);     
623        return rc ;
624}
625
626
627
628BERR_Code BHDM_CEC_P_RecvMsg(
629        BCEC_Handle hHDMI,                      /* [in] HDMI handle */
630        uint8_t *pCECRxMsgBuf,          /* [out] ptr to storage for received CEC msg */
631        uint8_t *iByteLength      /* [out ] size of memory in Received CEC Msg */
632) 
633{
634        BERR_Code rc = BERR_SUCCESS ;
635        BDBG_ENTER(BHDM_CEC_P_RecvMsg);
636       
637        /* EnterCriticalSection to prevent interrupt to fire off. Ensure CEC message queue is intact while copying */
638        BKNI_EnterCriticalSection() ;
639                *iByteLength = hHDMI->cecConfiguration.CecBufferedMsgLength ;
640                BKNI_Memcpy(pCECRxMsgBuf, hHDMI->cecConfiguration.CecBufferedMsg+1, *iByteLength);                     
641        BKNI_LeaveCriticalSection() ; 
642        BDBG_MSG(("MsgRecdLength: %d", *iByteLength)) ;
643
644        BDBG_LEAVE(BHDM_CEC_P_RecvMsg); 
645        return rc ;
646}
647
648
649BERR_Code BHDM_CEC_P_ReportPhysicalAddress(
650        BCEC_Handle hHDMI     /* [in] HDMI handle */
651) 
652{
653        BERR_Code rc = BERR_SUCCESS ;
654        uint8_t uiMsgBytes[4];
655
656        BDBG_ENTER(BHDM_CEC_P_ReportPhysicalAddress);
657
658#if BHDM_CONFIG_TX
659        if ( (hHDMI->edidStatus != BHDM_EDID_STATE_eOK) ||
660                (hHDMI->cecConfiguration.CecLogicalAddr == BHDM_CONFIG_CEC_UNINITIALIZED_LOGICAL_ADDR))
661        {
662                rc = BERR_NOT_INITIALIZED ;
663                return rc ;
664        }
665#endif 
666
667        /**********************************
668                CEC Message Buffer consists of:
669                        hexOpCode
670                        device physical address
671                        device type
672        ***********************************/
673       
674        /* CEC message opcode = 0x84 */
675        uiMsgBytes[0] = 0x84;
676
677        /* [Device Physical Address] */ 
678        uiMsgBytes[1] = hHDMI->cecConfiguration.CecPhysicalAddr[0];
679        uiMsgBytes[2] = hHDMI->cecConfiguration.CecPhysicalAddr[1];
680
681        /* Device Type */
682        uiMsgBytes[3] = BCEC_CONFIG_DEVICE_TYPE;
683
684        /* Broadcast CEC message */
685        BHDM_CEC_P_XmitMsg(hHDMI,BCEC_BROADCAST_ADDR, (uint8_t *) &uiMsgBytes, sizeof(uiMsgBytes));
686
687
688        BDBG_LEAVE(BHDM_CEC_P_ReportPhysicalAddress);
689        return rc ;
690}
691
692
693BERR_Code BHDM_CEC_P_Enable(
694        BCEC_Handle hHDMI,              /* [in] HDMI handle */
695        bool bEnableCec         /* [in] boolean to enable/disable CEC core      */
696)
697{
698        BERR_Code rc = BERR_SUCCESS;
699        BREG_Handle hRegister ;
700        uint32_t ulOffset ;
701        uint8_t enableCec = 0x0; 
702
703        BDBG_ENTER(BHDM_CEC_P_Enable);
704
705        hRegister = hHDMI->hRegister ;
706        ulOffset = BCEC_REG_OFFSET ;
707
708        if (bEnableCec)
709        {
710                enableCec = 0x0;        /* Enable CEC core */ 
711
712                /* Next xmit message is consider to be first CEC message
713                after re-enabling CEC core */
714                hHDMI->cecConfiguration.FirstCecMessage = true;
715        }
716        else 
717        {
718                enableCec = 0x1;        /* Disable CEC core */ 
719        }
720       
721        /* holding CEC core in reset    if needed */
722        BHDM_CEC_P_ResetCore (hHDMI, enableCec);
723
724        BDBG_LEAVE(BHDM_CEC_P_Enable);
725        return rc;
726}
727
728
729static void BHDM_CEC_P_AdjustTiming(BCEC_Handle hHDMI) 
730{
731        BREG_Handle hRegister ;
732        uint32_t Register ;
733        uint32_t ulOffset ;
734
735        BDBG_ENTER(BHDM_CEC_P_Enable);
736
737        hRegister = hHDMI->hRegister ;
738        ulOffset = BCEC_REG_OFFSET ;
739       
740        /* adjust default CEC timing */
741        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset) ;
742        Register &= ~BCHP_MASK_DVP(CEC_CNTRL_1, DIV_CLK_CNT);
743        Register |= BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_1, DIV_CLK_CNT, 
744                                BHDM_CEC_CNTRL_1_DIV_CLK_CNT_VALUE);
745        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_1 + ulOffset, Register) ;
746
747        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_2 + ulOffset) ;
748        Register &= 
749                ~(BCHP_MASK_DVP(CEC_CNTRL_2, CNT_TO_400_US)
750                | BCHP_MASK_DVP(CEC_CNTRL_2, CNT_TO_600_US)
751                | BCHP_MASK_DVP(CEC_CNTRL_2, CNT_TO_800_US)
752                | BCHP_MASK_DVP(CEC_CNTRL_2, CNT_TO_1300_US)
753                | BCHP_MASK_DVP(CEC_CNTRL_2, CNT_TO_1500_US));
754       
755        Register |= 
756                  BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_2, CNT_TO_400_US, 
757                                BHDM_CEC_CNTRL_2_CNT_TO_400_US_VALUE)
758                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_2, CNT_TO_600_US, 
759                                BHDM_CEC_CNTRL_2_CNT_TO_600_US_VALUE)   
760                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_2, CNT_TO_800_US, 
761                                BHDM_CEC_CNTRL_2_CNT_TO_800_US_VALUE)
762                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_2, CNT_TO_1300_US, 
763                                BHDM_CEC_CNTRL_2_CNT_TO_1300_US_VALUE)
764                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_2, CNT_TO_1500_US, 
765                                BHDM_CEC_CNTRL_2_CNT_TO_1500_US_VALUE);
766        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_2 + ulOffset, Register) ;
767
768
769        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_3 + ulOffset) ;
770        Register &= 
771                ~(BCHP_MASK_DVP(CEC_CNTRL_3, CNT_TO_1700_US)
772                | BCHP_MASK_DVP(CEC_CNTRL_3, CNT_TO_2050_US)
773                | BCHP_MASK_DVP(CEC_CNTRL_3, CNT_TO_2400_US)
774                | BCHP_MASK_DVP(CEC_CNTRL_3, CNT_TO_2750_US));
775       
776        Register |= 
777                  BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_3, CNT_TO_1700_US, 
778                                BHDM_CEC_CNTRL_3_CNT_TO_1700_US_VALUE)
779                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_3, CNT_TO_2050_US, 
780                                BHDM_CEC_CNTRL_3_CNT_TO_2050_US_VALUE) 
781                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_3, CNT_TO_2400_US, 
782                                BHDM_CEC_CNTRL_3_CNT_TO_2400_US_VALUE)
783                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_3, CNT_TO_2750_US, 
784                                BHDM_CEC_CNTRL_3_CNT_TO_2750_US_VALUE);
785        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_3 + ulOffset, Register) ;
786
787       
788        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_4 + ulOffset) ;
789        Register &= 
790                ~(BCHP_MASK_DVP(CEC_CNTRL_4, CNT_TO_3500_US)
791                | BCHP_MASK_DVP(CEC_CNTRL_4, CNT_TO_3600_US)
792                | BCHP_MASK_DVP(CEC_CNTRL_4, CNT_TO_3900_US)           
793                | BCHP_MASK_DVP(CEC_CNTRL_4, CNT_TO_4300_US));
794       
795        Register |= 
796                  BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_4, CNT_TO_3500_US, 
797                                BHDM_CEC_CNTRL_4_CNT_TO_3500_US_VALUE)
798                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_4, CNT_TO_3600_US, 
799                                BHDM_CEC_CNTRL_4_CNT_TO_3600_US_VALUE) 
800                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_4, CNT_TO_3900_US, 
801                                BHDM_CEC_CNTRL_4_CNT_TO_3900_US_VALUE)
802                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_4, CNT_TO_4300_US, 
803                                BHDM_CEC_CNTRL_4_CNT_TO_4300_US_VALUE);
804        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_4 + ulOffset, Register) ;
805
806
807        Register = BREG_Read32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset) ;
808        Register &= 
809                ~(BCHP_MASK_DVP(CEC_CNTRL_5, CNT_TO_4500_US)
810                | BCHP_MASK_DVP(CEC_CNTRL_5, CNT_TO_4700_US));
811 
812        Register |= 
813                  BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CNT_TO_4500_US, 
814                                BHDM_CEC_CNTRL_5_CNT_TO_4500_US_VALUE)
815                | BCHP_FIELD_DATA(REGNAME_CEC_CNTRL_5, CNT_TO_4700_US, 
816                                BHDM_CEC_CNTRL_5_CNT_TO_4700_US_VALUE) ;
817        BREG_Write32(hRegister, REGADDR_CEC_CNTRL_5 + ulOffset, Register) ;
818
819#if BHDR_CONFIG_DEBUG_CEC_TIMING
820        BDBG_WRN(("CNT_TO_400_US_VALUE %d", BHDM_CEC_CNTRL_2_CNT_TO_400_US_VALUE )) ;
821        BDBG_WRN(("CNT_TO_600_US_VALUE %d", BHDM_CEC_CNTRL_2_CNT_TO_600_US_VALUE )) ;
822        BDBG_WRN(("CNT_TO_800_US_VALUE %d", BHDM_CEC_CNTRL_2_CNT_TO_800_US_VALUE )) ;
823        BDBG_WRN(("CNT_TO_1300_US_VALUE %d", BHDM_CEC_CNTRL_2_CNT_TO_1300_US_VALUE)) ;
824        BDBG_WRN(("CNT_TO_1500_US_VALUE %d", BHDM_CEC_CNTRL_2_CNT_TO_1500_US_VALUE)) ;
825
826
827        BDBG_WRN(("CNT_TO_1700_US_VALUE %d", BHDM_CEC_CNTRL_3_CNT_TO_1700_US_VALUE));
828        BDBG_WRN(("CNT_TO_2050_US_VALUE %d", BHDM_CEC_CNTRL_3_CNT_TO_2050_US_VALUE)) ;
829        BDBG_WRN(("CNT_TO_2400_US_VALUE %d", BHDM_CEC_CNTRL_3_CNT_TO_2400_US_VALUE)) ;
830        BDBG_WRN(("CNT_TO_2750_US_VALUE %d", BHDM_CEC_CNTRL_3_CNT_TO_2750_US_VALUE)) ;
831                                                                             
832        BDBG_WRN(("CNT_TO_3500_US_VALUE %d", BHDM_CEC_CNTRL_4_CNT_TO_3500_US_VALUE)) ;
833        BDBG_WRN(("CNT_TO_3600_US_VALUE %d", BHDM_CEC_CNTRL_4_CNT_TO_3600_US_VALUE)) ;
834        BDBG_WRN(("CNT_TO_3900_US_VALUE %d", BHDM_CEC_CNTRL_4_CNT_TO_3900_US_VALUE)) ;
835        BDBG_WRN(("CNT_TO_4300_US_VALUE", BHDM_CEC_CNTRL_4_CNT_TO_4300_US_VALUE)) ;
836                                                                             
837                                                                             
838        BDBG_WRN(("CNT_TO_4500_US_VALUE %d", BHDM_CEC_CNTRL_5_CNT_TO_4500_US_VALUE)) ;
839        BDBG_WRN(("CNT_TO_4700_US_VALUE %d", BHDM_CEC_CNTRL_5_CNT_TO_4700_US_VALUE)) ;
840#endif
841        BDBG_LEAVE(BHDM_CEC_P_Enable);
842}
843
844
845void BHDM_CEC_P_Initialize(BCEC_Handle hHDMI) 
846{
847        BDBG_ENTER(BHDM_CEC_P_Initialize) ;
848
849        /* adjust CEC timing parameters */
850        BHDM_CEC_P_AdjustTiming(hHDMI) ;
851
852        /* set flag to indicate first CEC message */
853        hHDMI->cecConfiguration.FirstCecMessage = true ;
854       
855        BDBG_LEAVE(BHDM_CEC_P_Initialize) ;     
856}
857
858#endif /* end BHDM_CONFIG_CEC_LEGACY_SUPPORT*/
859
860/* End of file. */
Note: See TracBrowser for help on using the repository browser.