source: svn/trunk/newcon3bcm2_21bu/magnum/portinginterface/xpt/7552/bxpt_directv.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 19.7 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-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: bxpt_directv.c $
11 * $brcm_Revision: Hydra_Software_Devel/6 $
12 * $brcm_Date: 7/13/11 1:37p $
13 * $brcm_Revision: Hydra_Software_Devel/6 $
14 * $brcm_Date: 7/13/11 1:37p $
15 *
16 * Porting interface code for the DirecTV section of the data transport core.
17 *
18 * Revision History:
19 *
20 * $brcm_Log: /magnum/portinginterface/xpt/base2/bxpt_directv.c $
21 *
22 * Hydra_Software_Devel/6   7/13/11 1:37p gmullen
23 * SW7346-317: Merged fix to Hydra branch
24 *
25 * Hydra_Software_Devel/SW7346-317/1   7/13/11 11:47a gmullen
26 * SW7346-317: Added message buffer counting
27 *
28 * Hydra_Software_Devel/5   4/15/11 4:49p gmullen
29 * SW7425-313: Merged to mainline
30 *
31 * Hydra_Software_Devel/SW7425-313/1   4/13/11 2:05p gmullen
32 * SW7425-313: Added parser remapping support
33 *
34 * Hydra_Software_Devel/4   2/24/11 2:34p rjlewis
35 * SW7425-89: DSS needs to use binary mode for timestamp generation.
36 *
37 * Hydra_Software_Devel/3   11/9/10 2:57p gmullen
38 * SW7422-20: Fixed register overwrite in BXPT_Open(). Changed RS and XC
39 * defines; buffer init was not called
40 *
41 * Hydra_Software_Devel/2   10/27/10 11:59a gmullen
42 * SW7422-20: Ported to 7422
43 *
44 * Hydra_Software_Devel/22   8/30/10 5:24p gmullen
45 * SW7403-924: Protected access to the PID and SPID table from other
46 * modules in the PI
47 *
48 * Hydra_Software_Devel/21   7/7/10 10:07a gmullen
49 * SW7401-4402: Merged to Hydra_Software_Devel
50 *
51 * Hydra_Software_Devel/20   2/8/10 3:03p gmullen
52 * SW7408-64: Added missing API.
53 *
54 * Hydra_Software_Devel/19   11/23/09 5:14p gmullen
55 * SW7468-13: Updated PI and unit test
56 *
57 * Hydra_Software_Devel/18   10/29/09 11:06a piyushg
58 * SW7400-2559: Add PID2BUFF mapping api's for DirecTv message
59 * capture start and stop.
60 *
61 * Hydra_Software_Devel/17   10/19/09 5:15p piyushg
62 * SW7400-2559: Add PID2BUFF mapping api's for DirecTv message
63 * capture start and stop.
64 *
65 * Hydra_Software_Devel/16   9/23/09 2:26p gmullen
66 * SW7405-2994: Merged fix to Hydra_Software_Devel
67 *
68 * Hydra_Software_Devel/SW7405-2994/1   9/8/09 6:56p gmullen
69 * SW7405-2994: Stored MPEG mode setting for CONT_COUNT_IGNORE in module
70 * handle
71 *
72 * Hydra_Software_Devel/15   8/19/09 12:15p piyushg
73 * PR56771: Add support for 7342. Hence the previous usage
74 * of constant PARSER_REG_STEPSIZE does not work for this chip.
75 * Added new function to calculate offset.
76 *
77 * Hydra_Software_Devel/14   7/16/08 3:43p gmullen
78 * PR37867: Merged playback mux code to Hydra_Software_Devel
79 *
80 * Hydra_Software_Devel/13   5/7/08 10:47a gmullen
81 * PR42443: Removed call to change band rates when changing parser mode.
82 *
83 * Hydra_Software_Devel/12   7/24/07 11:59a gmullen
84 * PR33366: Do not write identical config to a PID channel register.
85 *
86 * Hydra_Software_Devel/11   12/5/06 3:00p gmullen
87 * PR26325: Added support for CAP filtering.
88 *
89 * Hydra_Software_Devel/10   12/5/06 2:04p gmullen
90 * PR26278: Allow user to configure byte alignment of data in message
91 * buffer.
92 *
93 * Hydra_Software_Devel/9   8/21/06 1:26p gmullen
94 * PR21524: Set FILTER_MODE to Generic AND Special Filter .
95 *
96 * Hydra_Software_Devel/8   7/27/06 10:58a gmullen
97 * PR15309: BXPT_ConfigurePidChannel() now checks for duplicated PID
98 * channels
99 *
100 * Hydra_Software_Devel/7   7/20/06 5:30p katrep
101 * PR22365: Added better mangement of XC buffer client BW for playback.XC
102 * buf for PB is given max BW & BW throtle is done at PB engine.Spare BW
103 * enabllag is used to provide more BW for PB if available.
104 *
105 * Hydra_Software_Devel/6   7/18/06 10:20a gmullen
106 * PR15309: Set GEN_OFFSET to 3 for DirecTV regular message.
107 *
108 * Hydra_Software_Devel/5   4/25/06 5:47p gmullen
109 * PR18998: Set GEN_OFFSET to 4 for MPT frames.
110 *
111 * Hydra_Software_Devel/4   4/24/06 5:48p gmullen
112 * PR18998: Set GEN_OFFSET to 3 for AUX messages, 0 for all others.
113 *
114 * Hydra_Software_Devel/3   4/13/06 4:41p gmullen
115 * PR18998: Incorrect register address used in StartScidChannelRecord.
116 *
117 * Hydra_Software_Devel/2   4/13/06 4:01p gmullen
118 * PR20914: Ported over Prashant's fix from 7401A0
119 *
120 * Hydra_Software_Devel/8   1/6/06 4:41p gmullen
121 * PR18489: Changes to other modules to support fix for PR 18489.
122 *
123 * Hydra_Software_Devel/7   1/4/06 9:57a gmullen
124 * PR15309: Filter mode is now Generic OR Special Filter when capturing
125 * DirecTV messages.
126 *
127 * Hydra_Software_Devel/6   11/23/05 9:18a gmullen
128 * PR15309: More updates.
129 *
130 * Hydra_Software_Devel/5   9/21/05 2:17p gmullen
131 * PR15309: Added support for AAC HE and AC3+ audio, fixed bug in playback
132 * PI, modified RAVE PI to support channel change and reset.
133 *
134 * Hydra_Software_Devel/4   8/26/05 2:01p gmullen
135 * PR15309: Added DirecTV support, RAVE video support, cleaned up RS and
136 * XC buffer code.
137 *
138 * Hydra_Software_Devel/3   8/18/05 9:58a gmullen
139 * PR15309: Added more DirecTV support.
140 *
141 * Hydra_Software_Devel/2   8/12/05 8:57a gmullen
142 * PR15309: Added PCR, PCR Offset, DirecTV, RAVE video, and ITB/CDB
143 * endianess support. Tested same.
144 *
145 * Hydra_Software_Devel/1   7/25/05 5:11p gmullen
146 * PR15309: Fixed bugs in numerous files
147 *
148 *
149 ***************************************************************************/
150
151#include "bstd.h"
152#include "bxpt.h"
153#include "bxpt_directv.h"
154#include "bdbg.h"
155#include "bkni.h"
156#include "bxpt_priv.h"
157
158#include "bchp_xpt_fe.h"
159
160#if BXPT_HAS_MESG_BUFFERS
161#include "bchp_xpt_msg.h"
162#endif
163
164#if BXPT_HAS_PACKETSUB
165#include "bchp_xpt_psub.h"
166#include "bxpt_packetsub.h"
167#endif
168
169#define MSG_BUF_CTRL1_STEPSIZE  ( 4 )
170#define PID_CHANNEL_STEPSIZE    ( 4 )
171#define CAP_FILT_REG_STEPSIZE   ( 4 )
172#define SPID_CHNL_STEPSIZE              ( 4 )
173#define DEFAULT_PEAK_RATE               ( 25000000 )
174
175BDBG_MODULE( xpt_directv );
176
177#if BXPT_HAS_IB_PID_PARSERS
178
179BERR_Code BXPT_DirecTv_SetParserBandMode( 
180        BXPT_Handle hXpt,               /* [Input] Handle for this transport */
181        unsigned int Band,                      /* [Input] Which parser band */
182        BXPT_ParserMode Mode    /* [Input] Which mode (packet format) is being used. */
183        )
184{
185        uint32_t Reg, RegAddr;
186
187        BERR_Code ExitCode = BERR_SUCCESS;
188
189        BDBG_ASSERT( hXpt );
190
191        /* Sanity check on the arguments. */
192        if( Band >= hXpt->MaxPidParsers )
193        {
194                /* Bad PID channel number. Complain. */
195                BDBG_ERR(( "Band %lu is out of range!", ( unsigned long ) Band ));
196                ExitCode = BERR_TRACE(BERR_INVALID_PARAMETER);
197        }
198        else
199        {
200                /* The parser config registers are at consecutive addresses. */
201        RegAddr = BXPT_P_GetParserCtrlRegAddr( hXpt, Band, BCHP_XPT_FE_MINI_PID_PARSER0_CTRL1 );
202                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
203
204                Reg &= ~( 
205                        BCHP_MASK( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PACKET_TYPE ) |
206                        BCHP_MASK( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_TIMESTAMP_MODE ) |
207                        BCHP_MASK( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PKT_LENGTH )
208                        );
209
210                if( Mode == BXPT_ParserMode_eMpeg )
211                {
212                        Reg |= (
213                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PACKET_TYPE, 0 ) |
214                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_TIMESTAMP_MODE, 2 ) |
215                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PKT_LENGTH, 188 )
216                        );
217                        BREG_Write32( hXpt->hRegister, RegAddr, Reg );
218                }
219                else if ( Mode == BXPT_ParserMode_eDirecTv )
220                {
221                        Reg |= (
222                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PACKET_TYPE, 1 ) |
223                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_TIMESTAMP_MODE, 3 ) |
224                                BCHP_FIELD_DATA( XPT_FE_MINI_PID_PARSER0_CTRL1, PARSER_PKT_LENGTH, 130 )
225                        );
226                        BREG_Write32( hXpt->hRegister, RegAddr, Reg );
227                }
228                else
229                {
230                        /* Unsupported parser mode. Complain. */
231                        BDBG_ERR(( "Unsupported parser mode %d!", ( unsigned long ) Mode ));
232                        ExitCode = BERR_TRACE(BERR_INVALID_PARAMETER);
233                }
234        }
235
236        return( ExitCode );
237}
238
239#endif
240
241#if BXPT_HAS_MESG_BUFFERS
242
243void BXPT_DirecTv_SaveMptFlag( 
244        BXPT_Handle hXpt,               /* [in] Handle for this transport */
245        bool Enable                     /* [in] Enable or disable flag saving. */
246        )
247{
248        uint32_t Reg, RegAddr;
249        unsigned Index;
250
251        BDBG_ASSERT( hXpt );
252
253        for( Index = 0; Index < BXPT_NUM_PID_CHANNELS; Index++ )
254        {
255                RegAddr = BCHP_XPT_MSG_BUF_CTRL1_TABLE_i_ARRAY_BASE + ( Index * MSG_BUF_CTRL1_STEPSIZE );
256                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
257                Reg &= ~( BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, DIRECTV_SAVE_FLAGS ) );
258                Reg |= ( BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, DIRECTV_SAVE_FLAGS, Enable == true ? 1 : 0 ) );
259                BREG_Write32( hXpt->hRegister, RegAddr, Reg );
260        }
261}
262
263void BXPT_DirecTv_SetPesStreamIdBoundaries( 
264        BXPT_Handle hXpt,               /* [in] Handle for this transport */
265        unsigned int UpperId,           /* [in] The upper stream id. */
266        unsigned int LowerId                    /* [in] The lower stream id. */
267        )
268{
269        uint32_t Reg;
270
271        BDBG_ASSERT( hXpt );
272
273        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_PES_CTRL1 );
274
275        Reg &= ~( 
276                BCHP_MASK( XPT_MSG_PES_CTRL1, PES_STREAM_ID_HI ) |
277                BCHP_MASK( XPT_MSG_PES_CTRL1, PES_STREAM_ID_LO ) 
278                );
279       
280        Reg |= ( 
281                BCHP_FIELD_DATA( XPT_MSG_PES_CTRL1, PES_STREAM_ID_HI, UpperId ) |
282                BCHP_FIELD_DATA( XPT_MSG_PES_CTRL1, PES_STREAM_ID_LO, LowerId ) 
283                );
284       
285        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_PES_CTRL1, Reg );
286}
287
288
289void BXPT_DirecTv_SetStartcodeChecking( 
290        BXPT_Handle hXpt,               /* [in] Handle for this transport */
291        bool EnableChecking             /* [in] Enable checking, or not. */
292        )
293{
294        uint32_t Reg;
295
296        BDBG_ASSERT( hXpt );
297
298        Reg = BREG_Read32( hXpt->hRegister, BCHP_XPT_MSG_PES_CTRL1 );
299
300        Reg &= ~( 
301                BCHP_MASK( XPT_MSG_PES_CTRL1, PSC_CHECK_MODE ) 
302                );
303       
304        Reg |= ( 
305                BCHP_FIELD_DATA( XPT_MSG_PES_CTRL1, PSC_CHECK_MODE, EnableChecking == true ? 1 : 0  ) 
306                );
307       
308        BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_PES_CTRL1, Reg );
309}
310
311
312BERR_Code BXPT_Mesg_StartDirecTvMessageCapture( 
313        BXPT_Handle hXpt,                                                       /* [in] Handle for this transport */
314        unsigned int PidChannelNum,                             /* [in] Which PID channel. */
315        unsigned int MesgBufferNum,                 /* [in] Which Message Buffer. */
316        BXPT_DirecTvMessageType MessageType,            /* [in] What type of DirecTV messages. */
317        const BXPT_PsiMessageSettings *Settings         /* [in] PID, band, and filters to use. */
318        )
319{
320    BXPT_DirecTvMessageOptions Options;
321
322    Options.Flags = BXPT_DirecTvMessageFlags_eSaveFirst;
323    return BXPT_Mesg_StartDirecTvMessageCaptureWithOptions( hXpt, PidChannelNum, MesgBufferNum, MessageType, Settings, &Options );
324}
325
326extern void ConfigPid2BufferMap( BXPT_Handle hXpt, unsigned int PidChannelNum, unsigned int BufferNumber, bool enableIt);
327
328BERR_Code BXPT_Mesg_StartDirecTvMessageCaptureWithOptions( 
329        BXPT_Handle hXpt,                                                       /* [in] Handle for this transport */
330        unsigned int PidChannelNum,                             /* [in] Which PID channel. */
331        unsigned int MesgBufferNum,                 /* [in] Which Message Buffer. */
332        BXPT_DirecTvMessageType MessageType,            /* [in] What type of DirecTV messages. */
333        const BXPT_PsiMessageSettings *Settings,        /* [in] PID, band, and filters to use. */
334    const BXPT_DirecTvMessageOptions *Options   /* [in] Additional options for message capture */
335        )
336{
337        BERR_Code ExitCode = BERR_SUCCESS;
338
339        BDBG_ASSERT( hXpt );
340        BDBG_ASSERT( Settings );
341        BDBG_ASSERT( Options );
342
343        /* Sanity check on the arguments. */
344        if( PidChannelNum > hXpt->MaxPidChannels )         
345        {
346                /* Bad parser band number. Complain. */
347                BDBG_ERR(( "PidChannelNum %lu is out of range!", ( unsigned long ) PidChannelNum ));
348                ExitCode = BERR_TRACE(BERR_INVALID_PARAMETER);
349        }
350        else if( hXpt->MesgBufferIsInitialized[ MesgBufferNum ] == false )
351    {
352        BDBG_ERR(( "Message buffer for this channel not configured!" ));
353        ExitCode = BERR_TRACE( BXPT_ERR_MESG_BUFFER_NOT_CONFIGURED );
354    }
355        else if ( MesgBufferNum > BXPT_NUM_MESG_BUFFERS ) {
356        /* Bad Message Buffer number. Complain. */
357        BDBG_ERR(( "Message Buffer Number %lu is out of range!", ( unsigned long ) MesgBufferNum ));
358        ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
359        }
360        else if ( hXpt->Pid2BuffMappingOn == true )
361        {
362                uint32_t Reg, RegAddr;
363                unsigned int GroupSel, OutputMode, GenOffset, SpecialSel, SpecialType;
364
365                ExitCode = BXPT_P_GetGroupSelect( Settings->Bank, &GroupSel );
366                if( ExitCode != BERR_SUCCESS )
367                        goto Done;
368
369                /* Enable the filters for this PID channel. */
370                BREG_Write32( hXpt->hRegister, BCHP_XPT_MSG_GEN_FILT_EN_i_ARRAY_BASE + ( MesgBufferNum * GEN_FILT_EN_STEP ), Settings->FilterEnableMask );             
371
372                /* Configure the message buffer for capturing messages. */
373                switch( MessageType )
374                {
375                        case BXPT_DirecTvMessageType_eMpt:
376                        GenOffset = 4;
377                        OutputMode = 0x0A; 
378            SpecialSel = 0;
379            SpecialType = 0;
380                        break;
381
382                        case BXPT_DirecTvMessageType_eAuxOnlyPackets:
383                        GenOffset = 3;
384                        OutputMode = 0x08; 
385            SpecialSel = 0;
386            SpecialType = 0;
387                        break;
388       
389                        case BXPT_DirecTvMessageType_eRegular_CapFilter0:
390                        case BXPT_DirecTvMessageType_eRegular_CapFilter1:
391                        case BXPT_DirecTvMessageType_eRegular_CapFilter2:
392                        case BXPT_DirecTvMessageType_eRegular_CapFilter3:
393                        case BXPT_DirecTvMessageType_eRegular_CapFilter4:
394                        GenOffset = 3;
395                        OutputMode = 0x09; 
396
397            /* Determine which CAP filter is to used. */
398            SpecialSel = MessageType - BXPT_DirecTvMessageType_eRegular_CapFilter0;
399            SpecialType = 2;
400                        break;
401                         
402                        /* Regular mode is also the default case. */
403                        default:
404                        case BXPT_DirecTvMessageType_eRegular:
405                        GenOffset = 3;
406                        OutputMode = 0x09; 
407            SpecialSel = 0;
408            SpecialType = 0;
409                        break;
410                }
411       
412                /* Select the bank the filters are in. */
413                RegAddr = BCHP_XPT_MSG_BUF_CTRL2_TABLE_i_ARRAY_BASE + ( MesgBufferNum * PID_CTRL2_TABLE_STEP );
414                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
415                Reg &= ~(
416                        BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, GEN_OFFSET ) |
417                        BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_TYPE ) |
418                        BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, SKIP_BYTE2 ) |
419                        BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, GEN_GRP_SEL ) |
420                        BCHP_MASK( XPT_MSG_BUF_CTRL2_TABLE_i, FILTER_MODE ) 
421                );
422                Reg |= (
423                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, GEN_OFFSET, GenOffset ) |
424                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, SPECIAL_TYPE, SpecialType ) |
425                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, SKIP_BYTE2, 1 ) |
426                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, GEN_GRP_SEL, GroupSel ) |
427                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL2_TABLE_i, FILTER_MODE, 0 )
428                );
429                BREG_Write32( hXpt->hRegister, RegAddr, Reg );
430       
431                RegAddr = BCHP_XPT_MSG_BUF_CTRL1_TABLE_i_ARRAY_BASE + ( MesgBufferNum * PID_CTRL1_TABLE_STEP );
432                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
433                Reg &= ~(
434                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, ERR_CK_MODE ) |
435                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, ERR_CK_DIS ) |
436                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, SPECIAL_SEL ) |
437                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, ALIGN_MODE ) |
438                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, DIRECTV_SAVE_FLAGS ) |
439                        BCHP_MASK( XPT_MSG_BUF_CTRL1_TABLE_i, DATA_OUTPUT_MODE ) 
440                );
441       
442                /* Configure the message buffer for capturing PSI messages. */
443                Reg |= (
444                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, SPECIAL_SEL, SpecialSel ) |
445                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, ALIGN_MODE, Settings->ByteAlign == true ? 0 : 1 ) |
446                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, DIRECTV_SAVE_FLAGS, Options->Flags ) |
447                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, DATA_OUTPUT_MODE, OutputMode ) 
448                );
449
450                /* CRC checks can be disabled on a per-PID channel basis. Do this here if requested in the settings struct. */
451                Reg |= (
452                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, ERR_CK_MODE, 0 ) |
453                        BCHP_FIELD_DATA( XPT_MSG_BUF_CTRL1_TABLE_i, ERR_CK_DIS, Settings->CrcDisable == true ? 1 : 0 ) 
454                );
455                BREG_Write32( hXpt->hRegister, RegAddr, Reg );
456
457                /* Enable data from the PID channel to the mesg block. */
458                BXPT_P_SetPidChannelDestination( hXpt, PidChannelNum, 6, true );
459
460                /* Set this PID channel as allocated, in case they forced the channel assignment. */
461                hXpt->PidChannelTable[ PidChannelNum ].IsAllocated = true;
462
463        /* Enable data from the PID channel to the mesg block. */
464        if(hXpt->PidChannelTable[ PidChannelNum ].MessageBuffercount == 0)
465        {
466            /* Configure the PID channel. */
467            ExitCode = BXPT_ConfigurePidChannel( hXpt, PidChannelNum, Settings->Pid, Settings->Band );
468            if( ExitCode != BERR_SUCCESS )
469                goto Done;
470        }
471
472        ConfigPid2BufferMap( hXpt, PidChannelNum, MesgBufferNum, true);
473
474        /* Enable the PID channel. */ 
475        if(hXpt->PidChannelTable[ PidChannelNum ].MessageBuffercount == 0)
476        {
477            ExitCode = BERR_TRACE( BXPT_EnablePidChannel( hXpt, PidChannelNum ) );
478        }
479
480        hXpt->PidChannelTable[ PidChannelNum ].MessageBuffercount++;
481        }
482        else
483        {
484        /* Wrong function call. Complain. */
485        BDBG_ERR(( "Pid2BuffMapping is OFF. You might need to call BXPT_SetPid2Buff() to turn it ON" ));
486        ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
487        }
488
489        Done:
490        return( ExitCode );
491}
492
493
494BERR_Code BXPT_Mesg_StopDirecTvMessageCapture( 
495        BXPT_Handle hXpt,                       /* [in] Handle for this transport */
496        unsigned int ScidChannelNum,            /* [in] Which SCID channel. */
497        unsigned int MesgBufferNum     /* [in] Which Message Buffer. */
498        )
499{
500        BDBG_ASSERT( hXpt );
501
502        return( BERR_TRACE(BXPT_Mesg_StopPidChannelRecord( hXpt, ScidChannelNum, MesgBufferNum )) );
503}
504
505
506BERR_Code BXPT_DirecTv_SetCapPattern( 
507        BXPT_Handle hXpt,                       /* [in] Handle for this transport */
508        unsigned AddressFilter,         /* [in] Which address filter gets the pattern. */
509        uint32_t Pattern                        /* [in] The pattern to load. */
510        )
511{
512        uint32_t RegAddr;
513
514        BERR_Code ExitCode = BERR_SUCCESS;
515
516        BDBG_ASSERT( hXpt );
517
518        if( AddressFilter > BXPT_NUM_CAP_FILTERS )
519        {
520                BDBG_ERR(( "AddressFilter %lu is out of range!", ( unsigned long ) AddressFilter ));
521                ExitCode = BERR_TRACE( BERR_INVALID_PARAMETER );
522        }
523        else
524        {
525                RegAddr = BCHP_XPT_MSG_C_MATCH0 + ( AddressFilter * CAP_FILT_REG_STEPSIZE );
526                BREG_Write32( hXpt->hRegister, RegAddr, Pattern );
527        }
528       
529        return( ExitCode );
530}
531
532#endif
533
534BERR_Code BXPT_DirecTv_ConfigHdFiltering( 
535        BXPT_Handle hXpt,                                       /* [in] Handle for this transport */
536        unsigned int PidChannelNum,             /* [in] Which PID channel. */
537        bool EnableFilter,                                      /* [in] Which SCID channel. */
538        BXPT_HdFilterMode FilterMode            /* [in] HD values to filter on. Ignored if EnableFilter == false */
539        )
540{
541        BERR_Code ExitCode = BERR_SUCCESS;
542
543        BDBG_ASSERT( hXpt );
544
545        /* Sanity check on the arguments. */
546        if( PidChannelNum >= hXpt->MaxPidChannels )       
547        {
548                /* Bad parser band number. Complain. */
549                BDBG_ERR(( "PidChannelNum %lu is out of range!", ( unsigned long ) PidChannelNum ));
550                ExitCode = BERR_TRACE(BERR_INVALID_PARAMETER);
551        }
552        else
553        {
554                uint32_t Reg;
555        unsigned OldHdEn = 255;
556        unsigned OldFilterMode = 255;
557
558                uint32_t RegAddr = BCHP_XPT_FE_PID_TABLE_i_ARRAY_BASE + ( PID_CHANNEL_STEPSIZE * PidChannelNum );
559
560#ifdef ENABLE_PLAYBACK_MUX
561                /*gain access to the pid table*/
562                BKNI_EnterCriticalSection();
563#endif /*ENABLE_PLAYBACK_MUX*/
564
565                Reg = BREG_Read32( hXpt->hRegister, RegAddr );
566        OldHdEn = BCHP_GET_FIELD_DATA( Reg, XPT_FE_PID_TABLE_i, ENABLE_HD_FILTER );
567        OldFilterMode = BCHP_GET_FIELD_DATA( Reg, XPT_FE_PID_TABLE_i, HD_FILT_EN_HD_FILTER_TYPE );
568
569                if( EnableFilter == true )
570                {
571                        Reg &= ~( 
572                                BCHP_MASK( XPT_FE_PID_TABLE_i, ENABLE_HD_FILTER ) |
573                                BCHP_MASK( XPT_FE_PID_TABLE_i, HD_FILT_EN_HD_FILTER_TYPE ) 
574                                );
575                        Reg |= ( 
576                                BCHP_FIELD_DATA( XPT_FE_PID_TABLE_i, ENABLE_HD_FILTER, 1 ) |
577                                BCHP_FIELD_DATA( XPT_FE_PID_TABLE_i, HD_FILT_EN_HD_FILTER_TYPE, FilterMode ) 
578                                );
579                }
580                else
581                {
582                        Reg &= ~( 
583                                BCHP_MASK( XPT_FE_PID_TABLE_i, ENABLE_HD_FILTER ) 
584                                );
585                }
586
587        if( EnableFilter != OldHdEn || FilterMode != OldFilterMode )
588        {
589                BREG_Write32( hXpt->hRegister, RegAddr, Reg );         
590        }
591
592#ifdef ENABLE_PLAYBACK_MUX
593                /*leave pid table protected area*/
594                BKNI_LeaveCriticalSection();
595#endif /*ENABLE_PLAYBACK_MUX*/
596        }
597
598        return( ExitCode );
599}
600
601
602/* end of file */
603
Note: See TracBrowser for help on using the repository browser.