source: svn/trunk/newcon3bcm2_21bu/magnum/commonutils/xdm/bxdm_dih.c @ 3

Last change on this file since 3 was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 23.3 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2012, 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: bxdm_dih.c $
11 * $brcm_Revision: Hydra_Software_Devel/12 $
12 * $brcm_Date: 2/9/12 12:07p $
13 *
14 * [File Description:]
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/commonutils/xdm/bxdm_dih.c $
19 *
20 * Hydra_Software_Devel/12   2/9/12 12:07p btosi
21 * SW7425-2253: added BXDM_MFD1 debug message
22 *
23 * Hydra_Software_Devel/11   2/8/12 2:19p btosi
24 * SW7425-2253: added support for MFD.bChannelChange
25 *
26 * Hydra_Software_Devel/10   12/14/11 1:54p btosi
27 * SW7405-3984: added
28 * BXDM_DisplayInterruptHandler_(Set/Get)PictureProviderMode_isr
29 *
30 * Hydra_Software_Devel/9   9/8/11 1:27p btosi
31 * SW7425-1064: added debug messages to help debug dual decode 3D
32 *
33 * Hydra_Software_Devel/8   6/9/11 1:44p nilesh
34 * SW7425-44: Set bIgnorePicture and bStallStc to TRUE (Decoder Underflow)
35 * by default if no channels are started.
36 *
37 * Hydra_Software_Devel/7   9/28/10 3:10p btosi
38 * SW7405-4736: added back in the line I removed by mistake
39 *
40 * Hydra_Software_Devel/6   9/23/10 3:09p btosi
41 * SW7405-4736: add support for a XDM instance ID to help debug multi-
42 * channel issues
43 *
44 * Hydra_Software_Devel/5   8/10/10 1:08p btosi
45 * SW7405-4736: added support for printing the channel ID before/after
46 * calling the PictureProvider
47 *
48 * Hydra_Software_Devel/4   4/13/10 12:18p nilesh
49 * SW7125-262: Fixed memory leak in BXDM_DisplayInterruptHandler_Create()
50 * when errors occur
51 *
52 * Hydra_Software_Devel/3   4/13/10 12:13p nilesh
53 * SW7125-263: Fixed memory leak in
54 * BXDM_DisplayInterruptHandler_AddPictureProviderInterface() when errors
55 * occur
56 *
57 * Hydra_Software_Devel/2   3/1/10 5:10p nilesh
58 * SW7405-2993: Fixed coverity warnings
59 *
60 * Hydra_Software_Devel/1   2/16/10 10:50a nilesh
61 * SW7405-2993: Initial XDM version
62 *
63 ***************************************************************************/
64
65#include "bstd.h"
66#include "bkni.h"          /* For malloc */
67#include "bkni_multi.h"    /* For mutex */
68#include "bmem.h"
69
70#include "blst_slist.h"
71
72#include "bavc.h"
73#include "bxdm.h"
74#include "bxdm_dih.h"
75
76BDBG_MODULE(BXDM_DIH);
77BDBG_FILE_MODULE(BXDM_DIHCTL);
78BDBG_FILE_MODULE(BXDM_DIHDBG);
79BDBG_FILE_MODULE(BXDM_MFD1);
80
81typedef struct BXDM_DisplayInterruptHandler_P_PictureProviderCallback
82{
83   BLST_S_ENTRY(BXDM_DisplayInterruptHandler_P_PictureProviderCallback) link;
84
85   BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback;
86   void *pPrivateContext;
87   uint32_t uiVDCRectangleNumber;
88   BXDM_DisplayInterruptHandler_PictureProviderMode ePictureProviderMode; /* SW7405-3984: enabled or disabled */
89} BXDM_DisplayInterruptHandler_P_PictureProviderCallback;
90
91typedef struct BXDM_DisplayInterruptHandler_P_PictureDataReadyHandler
92{
93      BXDM_DisplayInterruptHandler_PictureDataReady_isr fCallback;
94      void *pPrivateContext;
95      int32_t iPrivateParam;
96} BXDM_DisplayInterruptHandler_P_PictureDataReadyHandler;
97
98typedef struct BXDM_DisplayInterruptHandler_P_DisplayHandler
99{
100      BXDM_DisplayInterruptHandler_Display_isr fCallback;
101      void *pPrivateContext;
102      int32_t iPrivateParam;
103} BXDM_DisplayInterruptHandler_P_DisplayHandler;
104
105typedef struct BXDM_DisplayInterruptHandler_P_Context
106{
107      BAVC_MFD_Picture stMFDPicture; /* Used if no picture providers exist */
108      BXDM_DisplayInterruptHandler_P_PictureDataReadyHandler stPictureDataReadyHandler;
109      BXDM_DisplayInterruptHandler_P_DisplayHandler stDisplayHandler;
110
111      BKNI_MutexHandle hMutex; /* Mutex to lock access to PictureProviderList*/
112
113      /* Picture Provider List */
114      BLST_S_HEAD(BXDM_DisplayInterruptHandler_P_PictureProviderList, BXDM_DisplayInterruptHandler_P_PictureProviderCallback) hPictureProviderList;
115} BXDM_DisplayInterruptHandler_P_Context;
116
117BERR_Code
118BXDM_DisplayInterruptHandler_Create(
119         BXDM_DisplayInterruptHandler_Handle *phXdmDih
120         )
121{
122   BXDM_DisplayInterruptHandler_P_Context *pXdmDih = NULL;
123
124   BERR_Code rc;
125
126   BDBG_ENTER( BXDM_DisplayInterruptHandler_Create );
127
128   BDBG_ASSERT( phXdmDih );
129
130   /* Set the handle to NULL in case the allocation fails */
131   *phXdmDih = NULL;
132
133   pXdmDih = ( BXDM_DisplayInterruptHandler_P_Context* ) BKNI_Malloc( sizeof( BXDM_DisplayInterruptHandler_P_Context ) );
134   if ( NULL == pXdmDih )
135   {
136      return BERR_TRACE( BERR_OUT_OF_SYSTEM_MEMORY );
137   }
138
139   /* Zero out the newly allocated context */
140   BKNI_Memset( ( void * ) pXdmDih, 0, sizeof( BXDM_DisplayInterruptHandler_P_Context ) );
141
142   rc = BKNI_CreateMutex( &(pXdmDih->hMutex) );
143
144   if ( BERR_SUCCESS != rc ) 
145   {
146      BKNI_Free( pXdmDih );
147      return BERR_TRACE( rc );
148   }
149
150
151   rc = BKNI_AcquireMutex( pXdmDih->hMutex );
152
153   if ( BERR_SUCCESS != rc )
154   {
155      BKNI_Free( pXdmDih );
156      return BERR_TRACE( rc );
157   }
158
159   BLST_S_INIT( &pXdmDih->hPictureProviderList );
160
161   BKNI_ReleaseMutex( pXdmDih->hMutex );
162
163   *phXdmDih = pXdmDih;
164
165   BDBG_MODULE_MSG( BXDM_DIHCTL, ("Create: hDih:%08x", pXdmDih));
166
167   BDBG_LEAVE( BXDM_DisplayInterruptHandler_Create );
168
169   return BERR_TRACE( BERR_SUCCESS );
170}
171
172BERR_Code
173BXDM_DisplayInterruptHandler_Destroy(
174         BXDM_DisplayInterruptHandler_Handle hXdmDih
175         )
176{
177   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
178
179   BERR_Code rc;
180
181   BDBG_ENTER( BXDM_DisplayInterruptHandler_Destroy );
182
183   if ( NULL != hXdmDih )
184   {
185      pPictureProvider = BLST_S_FIRST( &hXdmDih->hPictureProviderList );
186
187      rc = BKNI_AcquireMutex(  hXdmDih->hMutex );
188
189      if ( BERR_SUCCESS != rc )
190      {
191         return BERR_TRACE( rc );
192      }
193
194      while ( NULL != pPictureProvider )
195      {
196         BLST_S_REMOVE_HEAD(
197                  &hXdmDih->hPictureProviderList,
198                  link);
199
200         BKNI_Free(pPictureProvider);
201
202         pPictureProvider = BLST_S_FIRST( &hXdmDih->hPictureProviderList );
203      }
204
205      BLST_S_INIT( &hXdmDih->hPictureProviderList );
206
207      BKNI_ReleaseMutex( hXdmDih->hMutex );
208
209      BKNI_DestroyMutex( hXdmDih->hMutex );
210
211      BDBG_MODULE_MSG( BXDM_DIHCTL, ("Destroy: hDih:%08x", hXdmDih));
212
213      BKNI_Free( hXdmDih );
214   }
215
216   BDBG_LEAVE( BXDM_DisplayInterruptHandler_Destroy );
217
218   return BERR_TRACE( BERR_SUCCESS );
219}
220
221static BXDM_DisplayInterruptHandler_P_PictureProviderCallback* BXDM_DisplayInterruptHandler_S_FindPictureProvider(
222         BXDM_DisplayInterruptHandler_Handle hXdmDih,
223         const BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback,
224         const void *pPrivateContext
225         )
226{
227   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
228
229   BDBG_ENTER( BXDM_DisplayInterruptHandler_S_FindPictureProvider );
230
231   pPictureProvider = BLST_S_FIRST( &hXdmDih->hPictureProviderList );
232   while ( NULL != pPictureProvider )
233   {
234      if ( ( pPictureProvider->fCallback == fCallback )
235           && ( pPictureProvider->pPrivateContext == pPrivateContext ) )
236      {
237         return pPictureProvider;
238      }
239
240      pPictureProvider = BLST_S_NEXT( pPictureProvider, link );
241   }
242
243   BDBG_LEAVE( BXDM_DisplayInterruptHandler_S_FindPictureProvider );
244
245   return NULL;
246}
247
248
249BERR_Code
250BXDM_DIH_AddPictureProviderInterface_GetDefaultSettings ( 
251   BXDM_DisplayInterruptHandler_AddPictureProviderInterface_Settings *pstDefSettings
252   )
253{
254   BDBG_ENTER( BXDM_DIH_AddPictureProviderInterface_GetDefaultSettings );
255
256   BDBG_ASSERT(pstDefSettings);
257
258   pstDefSettings->uiVDCRectangleNumber = 0;
259
260   BDBG_LEAVE( BXDM_DIH_AddPictureProviderInterface_GetDefaultSettings );
261
262   return BERR_TRACE( BERR_SUCCESS );
263}
264
265BERR_Code
266BXDM_DisplayInterruptHandler_AddPictureProviderInterface(
267         BXDM_DisplayInterruptHandler_Handle hXdmDih,
268         BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback,
269         void *pPrivateContext,
270         BXDM_DisplayInterruptHandler_AddPictureProviderInterface_Settings *pDefSettings
271         )
272{
273   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
274
275   BERR_Code rc;
276
277   BDBG_ENTER( BXDM_DisplayInterruptHandler_AddPictureProviderInterface );
278
279   BDBG_ASSERT( fCallback );
280
281   pPictureProvider = BXDM_DisplayInterruptHandler_S_FindPictureProvider(
282               hXdmDih,
283               fCallback,
284               pPrivateContext);
285
286   if ( NULL == pPictureProvider )
287   {
288      pPictureProvider = ( BXDM_DisplayInterruptHandler_P_PictureProviderCallback* ) BKNI_Malloc( sizeof ( BXDM_DisplayInterruptHandler_P_PictureProviderCallback ) );
289      if ( NULL == pPictureProvider )
290      {
291         return BERR_TRACE( BERR_OUT_OF_SYSTEM_MEMORY );
292      }
293
294      /* Zero out the newly allocated context */
295      BKNI_Memset( ( void * ) pPictureProvider, 0, sizeof( BXDM_DisplayInterruptHandler_P_PictureProviderCallback) );
296
297      pPictureProvider->fCallback = fCallback;
298      pPictureProvider->pPrivateContext = pPrivateContext;
299      pPictureProvider->uiVDCRectangleNumber = pDefSettings->uiVDCRectangleNumber;
300
301      /* SW7405-3984: mark the PictureProvider as enabled. */
302      pPictureProvider->ePictureProviderMode = BXDM_DisplayInterruptHandler_PictureProviderMode_eEnabled;
303
304      /* BLST list key's in descending order, needed to negate to get in ascending order */
305      pPictureProvider->uiVDCRectangleNumber = (pPictureProvider->uiVDCRectangleNumber + 1) * (-1);
306     
307      rc = BKNI_AcquireMutex( hXdmDih->hMutex );
308
309      if ( BERR_SUCCESS != rc ) 
310      {
311         BKNI_Free( pPictureProvider );
312         return BERR_TRACE( rc );
313      }
314
315      BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x Add pp:%08x ch:%d",
316                  hXdmDih,
317                  pPictureProvider,
318                  pDefSettings->uiVDCRectangleNumber
319                  ));
320
321      BLST_S_DICT_ADD(
322               &hXdmDih->hPictureProviderList,
323               pPictureProvider,
324               BXDM_DisplayInterruptHandler_P_PictureProviderCallback,
325               uiVDCRectangleNumber,
326               link,
327               err_duplicate);
328
329      BKNI_ReleaseMutex( hXdmDih->hMutex );
330
331   }
332   else
333   {
334      BDBG_ERR(("Specified Picture Provider already exists"));
335      return BERR_TRACE( BERR_INVALID_PARAMETER );
336   }
337
338   BDBG_LEAVE( BXDM_DisplayInterruptHandler_AddPictureProviderInterface );
339
340   return BERR_TRACE( BERR_SUCCESS );
341
342err_duplicate:
343   BKNI_Free( pPictureProvider );
344   BKNI_ReleaseMutex( hXdmDih->hMutex );
345   BDBG_ERR(("Specified Picture Provider already exists"));
346   return BERR_TRACE( BERR_INVALID_PARAMETER );
347}
348
349BERR_Code
350BXDM_DisplayInterruptHandler_RemovePictureProviderInterface(
351         BXDM_DisplayInterruptHandler_Handle hXdmDih,
352         BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback,
353         void *pPrivateContext
354         )
355{
356   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
357
358   BERR_Code rc;
359
360   BDBG_ENTER( BXDM_DisplayInterruptHandler_RemovePictureProviderInterface );
361
362   /* Find the picture provider */
363   pPictureProvider = BXDM_DisplayInterruptHandler_S_FindPictureProvider(
364            hXdmDih,
365            fCallback,
366            pPrivateContext);
367
368   if ( NULL != pPictureProvider )
369   {
370      rc = BKNI_AcquireMutex( hXdmDih->hMutex );
371
372      if ( BERR_SUCCESS != rc ) 
373      {
374         return BERR_TRACE( rc );
375      }
376
377      BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x remove pp:%08x",
378                  hXdmDih,
379                  pPictureProvider
380                  ));
381
382      BLST_S_REMOVE(
383               &hXdmDih->hPictureProviderList,
384               pPictureProvider,
385               BXDM_DisplayInterruptHandler_P_PictureProviderCallback,
386               link);
387
388      BKNI_ReleaseMutex( hXdmDih->hMutex );
389
390      BKNI_Free( pPictureProvider );
391   }
392   else
393   {
394      BDBG_ERR(("Specified Picture Provider could not be found"));
395      return BERR_TRACE( BERR_INVALID_PARAMETER );
396   }
397
398   BDBG_LEAVE( BXDM_DisplayInterruptHandler_RemovePictureProviderInterface );
399
400   return BERR_TRACE( BERR_SUCCESS );
401}
402
403BERR_Code
404BXDM_DisplayInterruptHandler_Callback_isr(
405         void *pPrivateContext,
406         BXDM_DisplayInterruptInfo *pstDisplayInterruptInfo
407         )
408{
409   BXDM_DisplayInterruptHandler_Handle hXdmDih = ( BXDM_DisplayInterruptHandler_Handle ) pPrivateContext;
410   BAVC_MFD_Picture *pMFDPictureList = NULL;
411   BAVC_MFD_Picture *pMFDPicture = NULL;
412   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
413
414   BDBG_ENTER( BXDM_DisplayInterruptHandler_Callback_isr );
415
416   BDBG_ASSERT( hXdmDih );
417
418   pPictureProvider = BLST_S_FIRST( &hXdmDih->hPictureProviderList );
419
420   /* SW7405-3085: If we only have one picture provider outputting to this display,
421    * we set the interrupt count to invalid so that the picture provider
422    * does not use it to synchronize interlaced output on interlaced displays.
423    *
424    * For non-mosaic display, this will result in the best cadence output on
425    * progressive displays.
426    *
427    * For mosaic display, we leave the interrupt count valid to ensure all
428    * picture providers synchronize to the correct target polarity when on a
429    * progressive display
430    */
431   if ( ( NULL != pPictureProvider )
432        && ( NULL == BLST_S_NEXT( pPictureProvider, link ) )
433      )
434   {
435      pstDisplayInterruptInfo->stInterruptCount.bValid = false;
436   }
437
438   while ( NULL != pPictureProvider )
439   {
440
441      BDBG_MODULE_MSG( BXDM_DIHDBG, ("%08x pp:%08x ch:%d %d",
442                  hXdmDih,
443                  pPictureProvider,
444                  ((pPictureProvider->uiVDCRectangleNumber * (-1)) - 1),
445                  pstDisplayInterruptInfo->stInterruptCount.uiValue
446                  ));
447
448      /* SW7405-3984: only execute the callback if the PictureProvider is enabled.
449       */
450      if ( BXDM_DisplayInterruptHandler_PictureProviderMode_eEnabled == pPictureProvider->ePictureProviderMode )
451      {
452         pPictureProvider->fCallback(
453               pPictureProvider->pPrivateContext,
454               pstDisplayInterruptInfo,
455               &pMFDPicture );
456
457         /* Needed to negate to get in ascending order, now restore actual value */
458         pMFDPicture->ulChannelId = (pPictureProvider->uiVDCRectangleNumber * (-1)) - 1;
459
460         /* Append the returned picture list to the previous MFD Pictures */
461         if ( NULL == pMFDPictureList )
462         {
463            pMFDPictureList = pMFDPicture;
464         }
465         else
466         {
467            BAVC_MFD_Picture *pMFDPictureLast = pMFDPictureList;
468
469            /* Add this picture to the end of the current pMFDPictureList */
470            while ( pMFDPictureLast->pNext != NULL )
471            {
472               pMFDPictureLast = pMFDPictureLast->pNext;
473            }
474
475            pMFDPictureLast->pNext = pMFDPicture;
476            pMFDPicture->pNext = NULL;
477         }
478      }
479
480      pPictureProvider = BLST_S_NEXT( pPictureProvider, link );
481   }
482
483   if ( NULL == pMFDPictureList )
484   {
485      char cInterrtupPolarity;
486     
487      hXdmDih->stMFDPicture.eInterruptPolarity = pstDisplayInterruptInfo->eInterruptPolarity;
488      hXdmDih->stMFDPicture.bIgnorePicture = true;
489      hXdmDih->stMFDPicture.bStallStc = true;
490      hXdmDih->stMFDPicture.bMute = true;
491      hXdmDih->stMFDPicture.bChannelChange = true; /* for SW7425-2253: */
492      hXdmDih->stMFDPicture.pNext = NULL;
493
494      pMFDPictureList = &hXdmDih->stMFDPicture;
495
496      switch( pstDisplayInterruptInfo->eInterruptPolarity )
497      {
498         case 0:  cInterrtupPolarity = 'T';  break;
499         case 1:  cInterrtupPolarity = 'B';  break;
500         case 2:  cInterrtupPolarity = 'F';  break;
501         default: cInterrtupPolarity = 'x';  break;
502      }
503
504      BDBG_MODULE_MSG( BXDM_MFD1, ("%c :[x.%03x] int:%c %s %s %s",
505                                 ( hXdmDih->stMFDPicture.bMute ) ? 'M' : ' ',
506                                 hXdmDih->stMFDPicture.ulDecodePictureId,
507                                 cInterrtupPolarity,
508                                 ( hXdmDih->stMFDPicture.bIgnorePicture ) ? "ip" : " ",
509                                 ( hXdmDih->stMFDPicture.bStallStc ) ? "ss" : " ",
510                                 ( hXdmDih->stMFDPicture.bChannelChange) ? "chg" : " "
511                                 ));
512   }
513
514   /* Execute the application's Picture Data Ready callback */
515   if( NULL != hXdmDih->stPictureDataReadyHandler.fCallback )
516   {
517      hXdmDih->stPictureDataReadyHandler.fCallback(
518               hXdmDih->stPictureDataReadyHandler.pPrivateContext,
519               hXdmDih->stPictureDataReadyHandler.iPrivateParam,
520               pMFDPictureList
521               );
522   }
523
524   /* Execute the application's Display Interrupt Callback */
525   if ( NULL != hXdmDih->stDisplayHandler.fCallback )
526   {
527      hXdmDih->stDisplayHandler.fCallback(
528               hXdmDih->stDisplayHandler.pPrivateContext,
529               hXdmDih->stDisplayHandler.iPrivateParam,
530               pMFDPictureList
531               );
532   }
533
534   BDBG_LEAVE( BXDM_DisplayInterruptHandler_Callback_isr );
535
536   return BERR_TRACE( BERR_SUCCESS );
537}
538
539BERR_Code
540BXDM_DisplayInterruptHandler_InstallCallback_PictureDataReadyInterrupt(
541         BXDM_DisplayInterruptHandler_Handle hXdmDih,
542         BXDM_DisplayInterruptHandler_PictureDataReady_isr fCallback,
543         void *pPrivateContext,
544         int32_t iPrivateParam
545         )
546{
547   BDBG_ENTER( BXDM_DisplayInterruptHandler_InstallCallback_PictureDataReadyInterrupt );
548
549   BDBG_ASSERT( hXdmDih );
550
551   hXdmDih->stPictureDataReadyHandler.fCallback = fCallback;
552   hXdmDih->stPictureDataReadyHandler.pPrivateContext = pPrivateContext;
553   hXdmDih->stPictureDataReadyHandler.iPrivateParam = iPrivateParam;
554
555   BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x Install PDR:%08x context:%08x param:%d",
556                  hXdmDih,
557                  hXdmDih->stPictureDataReadyHandler.fCallback,
558                  hXdmDih->stPictureDataReadyHandler.pPrivateContext,
559                  hXdmDih->stPictureDataReadyHandler.iPrivateParam
560                  ));
561
562   BDBG_LEAVE( BXDM_DisplayInterruptHandler_InstallCallback_PictureDataReadyInterrupt );
563
564   return BERR_TRACE( BERR_SUCCESS );
565}
566
567BERR_Code
568BXDM_DisplayInterruptHandler_UnInstallCallback_PictureDataReadyInterrupt(
569         BXDM_DisplayInterruptHandler_Handle hXdmDih
570         )
571{
572   BDBG_ENTER( BXDM_DisplayInterruptHandler_UnInstallCallback_PictureDataReadyInterrupt );
573
574   BDBG_ASSERT( hXdmDih );
575
576   BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x UnInstall PDR:%08x context:%08x param:%d",
577                  hXdmDih,
578                  hXdmDih->stPictureDataReadyHandler.fCallback,
579                  hXdmDih->stPictureDataReadyHandler.pPrivateContext,
580                  hXdmDih->stPictureDataReadyHandler.iPrivateParam
581                  ));
582
583   hXdmDih->stPictureDataReadyHandler.fCallback = NULL;
584   hXdmDih->stPictureDataReadyHandler.pPrivateContext = NULL;
585   hXdmDih->stPictureDataReadyHandler.iPrivateParam = 0;
586
587   BDBG_LEAVE( BXDM_DisplayInterruptHandler_UnInstallCallback_PictureDataReadyInterrupt );
588
589   return BERR_TRACE( BERR_SUCCESS );
590}
591
592
593BERR_Code
594BXDM_DisplayInterruptHandler_InstallCallback_DisplayInterrupt(
595         BXDM_DisplayInterruptHandler_Handle hXdmDih,
596         BXDM_DisplayInterruptHandler_Display_isr fCallback,
597         void *pPrivateContext,
598         int32_t iPrivateParam
599         )
600{
601   BDBG_ENTER( BXDM_DisplayInterruptHandler_InstallCallback_DisplayInterrupt );
602
603   BDBG_ASSERT( hXdmDih );
604
605   hXdmDih->stDisplayHandler.fCallback = fCallback;
606   hXdmDih->stDisplayHandler.pPrivateContext = pPrivateContext;
607   hXdmDih->stDisplayHandler.iPrivateParam = iPrivateParam;
608
609   BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x Install DisplayInterupt:%08x context:%08x param:%d",
610                  hXdmDih,
611                  hXdmDih->stDisplayHandler.fCallback,
612                  hXdmDih->stDisplayHandler.pPrivateContext,
613                  hXdmDih->stDisplayHandler.iPrivateParam
614                  ));
615
616   BDBG_LEAVE( BXDM_DisplayInterruptHandler_InstallCallback_DisplayInterrupt );
617
618   return BERR_TRACE( BERR_SUCCESS );
619}
620
621BERR_Code
622BXDM_DisplayInterruptHandler_UnInstallCallback_DisplayInterrupt(
623         BXDM_DisplayInterruptHandler_Handle hXdmDih
624         )
625{
626   BDBG_ENTER( BXDM_DisplayInterruptHandler_UnInstallCallback_DisplayInterrupt );
627
628   BDBG_ASSERT( hXdmDih );
629
630   BDBG_MODULE_MSG( BXDM_DIHCTL, ("hDih:%08x UnInstall DisplayInterupt:%08x context:%08x param:%d",
631                  hXdmDih,
632                  hXdmDih->stDisplayHandler.fCallback,
633                  hXdmDih->stDisplayHandler.pPrivateContext,
634                  hXdmDih->stDisplayHandler.iPrivateParam
635                  ));
636
637   hXdmDih->stDisplayHandler.fCallback = NULL;
638   hXdmDih->stDisplayHandler.pPrivateContext = NULL;
639   hXdmDih->stDisplayHandler.iPrivateParam = 0;
640
641   BDBG_LEAVE( BXDM_DisplayInterruptHandler_UnInstallCallback_DisplayInterrupt );
642
643   return BERR_TRACE( BERR_SUCCESS );
644}
645
646/* SW7405-3984: the Set/Get mode API's provide a way to disable
647 * a PictureProvide (XDM) without unregistering it from the DIH.
648 * When a PictureProvider is "disabled", the associated callback
649 * will not be executed by in BXDM_DisplayInterruptHandler_Callback_isr.
650 */
651BERR_Code
652BXDM_DisplayInterruptHandler_SetPictureProviderMode_isr( 
653   BXDM_DisplayInterruptHandler_Handle hXdmDih,
654   BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback,
655   void *pPrivateContext,
656   BXDM_DisplayInterruptHandler_PictureProviderMode eMode
657   )
658{
659   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
660
661   BERR_Code rc=BERR_SUCCESS;
662
663   BDBG_ENTER( BXDM_DisplayInterruptHandler_SetPictureProviderMode_isr );
664
665   BDBG_ASSERT( hXdmDih );
666
667   /* Find the picture provider */
668   pPictureProvider = BXDM_DisplayInterruptHandler_S_FindPictureProvider(
669            hXdmDih,
670            fCallback,
671            pPrivateContext);
672
673   if ( NULL != pPictureProvider )
674   {
675      /* Set the mode. */
676      pPictureProvider->ePictureProviderMode = eMode;
677
678      BDBG_MODULE_MSG( BXDM_DIHCTL, ("SetPictureProviderMode:: hDih:%08x mode:%d",
679                  hXdmDih,
680                  pPictureProvider->ePictureProviderMode
681                  ));
682   }
683   else
684   {
685      BDBG_ERR(("BXDM_DisplayInterruptHandler_SetPictureProviderMode_isr:: Specified Picture Provider could not be found"));
686      rc = BERR_INVALID_PARAMETER;
687   }
688
689   BDBG_LEAVE( BXDM_DisplayInterruptHandler_SetPictureProviderMode_isr );
690
691   return BERR_TRACE( rc );
692}
693
694BERR_Code
695BXDM_DisplayInterruptHandler_GetPictureProviderMode_isr( 
696   BXDM_DisplayInterruptHandler_Handle hXdmDih,
697   BXDM_DisplayInterruptHandler_PictureProvider_isr fCallback,
698   void *pPrivateContext,
699   BXDM_DisplayInterruptHandler_PictureProviderMode * peMode
700   )
701{
702   BXDM_DisplayInterruptHandler_P_PictureProviderCallback *pPictureProvider;
703
704   BERR_Code rc=BERR_SUCCESS;
705
706   BDBG_ENTER( BXDM_DisplayInterruptHandler_GetPictureProviderMode_isr );
707
708   BDBG_ASSERT( hXdmDih );
709   
710   /* Find the picture provider */
711   pPictureProvider = BXDM_DisplayInterruptHandler_S_FindPictureProvider(
712            hXdmDih,
713            fCallback,
714            pPrivateContext);
715
716   if ( NULL != pPictureProvider )
717   {
718      /* Return the current mode. */
719      *peMode = pPictureProvider->ePictureProviderMode;
720
721      BDBG_MODULE_MSG( BXDM_DIHCTL, ("GetPictureProviderMode:: hDih:%08x mode:%d",
722                  hXdmDih,
723                  pPictureProvider->ePictureProviderMode
724                  ));
725   }
726   else
727   {
728      BDBG_ERR(("BXDM_DisplayInterruptHandler_GetPictureProviderMode_isr:: Specified Picture Provider could not be found"));
729      rc = BERR_INVALID_PARAMETER;
730   }
731
732   BDBG_LEAVE( BXDM_DisplayInterruptHandler_GetPictureProviderMode_isr );
733
734   return BERR_TRACE( rc );
735}
736
737
Note: See TracBrowser for help on using the repository browser.