source: tools/oebuild/data/pti_np/pti_slot.c @ 45168

Last change on this file since 45168 was 45168, checked in by obi, 19 months ago

add oebuild building files

  • Property svn:executable set to *
File size: 7.9 KB
Line 
1#include <dvb_demux.h>
2
3#include "pti.h"
4#include "pti_main.h"
5
6/* ************************************
7 * Set a pid to a slot
8 */
9void pti_slot_set_pid(int tc_slot_index, u16 Pid)
10{
11        STPTI_TCParameters_t *TC_Params_p = &tc_params;
12        TCMainInfo_t *MainInfo_p;
13        // *****************************************************************
14        //stptiHAL_SlotSetPid(FullHandle_t SlotHandle, U16 Pid, U16 MapPid)
15        if (tc_slot_index < 0)
16        {
17                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
18                return;
19        }
20        MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
21        STSYS_SetTCMask16LE((void *)&MainInfo_p->SlotState, (SLOT_STATE_INITIAL_SCRAMBLE_STATE));
22        /* Clear the PID */
23        PutTCData(&((u16 *)TC_Params_p->TC_LookupTableStart)[tc_slot_index], 0xe000 /*STPTI_InvalidPid()*/);
24        /* Set the Mapping PID */
25        STSYS_WriteTCReg16LE((void *)&MainInfo_p->RemainingPESLength, Pid);
26        /* Set the PID */
27        PutTCData(&((u16 *)TC_Params_p->TC_LookupTableStart)[tc_slot_index], Pid);
28}
29
30void pti_slot_clear_pid(int tc_slot_index, int tc_dma_index, int rewind)
31{
32#define TC_ONE_PACKET_TIME 75
33        STPTI_TCParameters_t *TC_Params_p = &tc_params;
34        TCMainInfo_t *MainInfo_p;
35        if (tc_slot_index < 0)
36        {
37                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
38                return;
39        }
40        MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
41        /* Clear the PID */
42        PutTCData(&((u16 *)TC_Params_p->TC_LookupTableStart)[tc_slot_index], 0xe000 /*STPTI_InvalidPid()*/);
43        udelay(TC_ONE_PACKET_TIME);
44        /* rewind will be set if clearing the pid, if updating (not implemented)
45         * the it will remain false. tc_dma_index kann kleiner null sein!
46         */
47        if ((rewind == 1) && (tc_dma_index >= 0))
48        {
49                int vLoop;
50                TCDMAConfig_t *DMAConfig_p = &((TCDMAConfig_t *)TC_Params_p->TC_DMAConfigStart)[tc_dma_index];
51                /* wait for dma completion */
52                for (vLoop = 0; vLoop < 16; vLoop++)
53                {
54                        /* if 0 then dma not in progress */
55                        if (!(readw((void *)&MainInfo_p->SlotState) & TC_MAIN_INFO_SLOT_STATE_DMA_IN_PROGRESS))
56                                break;
57                        udelay(TC_ONE_PACKET_TIME);
58                }
59                printk("QWrite = %x\n", DMAConfig_p->DMAQWrite_p);
60                /* now rewind dma */
61                DMAConfig_p->DMAWrite_p = DMAConfig_p->DMAQWrite_p;
62                /* Reset Slot Status Word in slot's Main Info */
63                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SlotState, 0);
64        }
65        /* fixme: im orig machen sie noch eine Disassoziation des Descramblers
66         STSYS_WriteTCReg16LE((U32)&MainInfo_p->DescramblerKeys_p,TC_INVALID_LINK);
67        + des Indexers stpti_SlotDisassociateIndex
68        */
69}
70
71/* **********************************
72 * Get a pid from a slot
73 */
74u16 pti_slot_get_pid(u32 tc_slot_index)
75{
76        u16 Pid;
77        STPTI_TCParameters_t *TC_Params_p = &tc_params;
78        if (tc_slot_index < 0)
79        {
80                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
81                return -1;
82        }
83        GetTCData(&((u16 *)TC_Params_p->TC_LookupTableStart)[tc_slot_index], Pid)
84        return Pid;
85}
86
87/* ************************************
88 * Allocate/Initialise a slot in a session
89 */
90void pti_slot_allocate(u32 tc_slot_index, int dvb_type, int dvb_pes_type)
91{
92        STPTI_TCParameters_t *TC_Params_p = &tc_params;
93        int type = TC_SLOT_TYPE_NULL;
94        if (tc_slot_index < 0)
95        {
96                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
97                return;
98        }
99        /* Aus den linuxDVB Params type und pes_type den tc type machen */
100        switch (dvb_type)
101        {
102                case DMX_TYPE_TS:
103                        if (dvb_pes_type != DMX_TS_PES_PCR)
104                                type = TC_SLOT_TYPE_RAW;
105                        else
106                                type = TC_SLOT_TYPE_NULL;
107                        break;
108                case DMX_TYPE_SEC:
109                        /* type = TC_SLOT_TYPE_SECTION;*/
110                        /* fixme: erstmal sec filter nicht behandeln,
111                         * da wir die filter daten hier nicht
112                         * herbekommen. wir liefern der dvb api
113                         * also die packete und sie soll den rest
114                         * machen
115                         */
116                        type = TC_SLOT_TYPE_RAW;
117                        break;
118                case DMX_TYPE_PES:
119                        type = TC_SLOT_TYPE_PES;
120                        break;
121                default:
122                        type = TC_SLOT_TYPE_NULL;
123                        break;
124                        //FIXME: PCR braucht noch setup des indexers?!
125        }
126        // ********************************************************
127        //SlotAllocate ->stptiHAL_SlotInitialise
128        {
129                TCMainInfo_t *MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
130                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SlotState, 0);
131                STSYS_WriteTCReg16LE((void *)&MainInfo_p->PacketCount, 0);
132                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SlotMode, 0);
133                STSYS_WriteTCReg16LE((void *)&MainInfo_p->DescramblerKeys_p, TC_INVALID_LINK);
134                STSYS_WriteTCReg16LE((void *)&MainInfo_p->DMACtrl_indices, 0xffff);
135                STSYS_WriteTCReg16LE((void *)&MainInfo_p->IndexMask, 0);
136                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SectionPesFilter_p, TC_INVALID_LINK);
137                STSYS_WriteTCReg16LE((void *)&MainInfo_p->RemainingPESLength, 0);
138                STSYS_WriteTCReg16LE((void *)&MainInfo_p->PESStuff, 0);
139                STSYS_WriteTCReg16LE((void *)&MainInfo_p->StartCodeIndexing_p, 0);
140#if defined(SECURE_LITE2)
141                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SecondaryPid_p, TC_SECONDARY_SLOT_NONE);
142#endif
143                STSYS_SetTCMask16LE((void *)&MainInfo_p->SlotMode, type);
144#if !defined(A18) && !defined(REL23) && !defined(REL29)
145                STSYS_SetTCMask16LE((void *)&MainInfo_p->SlotMode, TC_MAIN_INFO_SLOT_MODE_DISABLE_CC_CHECK);
146#endif
147        }
148}
149
150void pti_slot_link_to_buffer(u32 tc_slot_index, u32 tc_dma_index)
151{
152        u16 DMACtrl_indices;
153        TCMainInfo_t *MainInfo_p;
154        STPTI_TCParameters_t *TC_Params_p = &tc_params;
155        TCDMAConfig_t *DMAConfig_p = &((TCDMAConfig_t *)TC_Params_p->TC_DMAConfigStart)[tc_dma_index];
156        if (tc_slot_index < 0)
157        {
158                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
159                return;
160        }
161        if (tc_dma_index < 0)
162        {
163                printk("%s: invalid dma index passed %d\n", __func__, tc_dma_index);
164                return;
165        }
166        //printk("%s (slot %d, dma %d)>\n", __func__, tc_slot_index, tc_dma_index);
167        // *******************************************************************************
168        //TcHal_MainInfoAssociateDmaWithSlot( TC_Params_p, SlotIdent, DMAConfig_p );
169        MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
170        DMACtrl_indices = readl((void *)&MainInfo_p->DMACtrl_indices);
171        DMACtrl_indices &= 0xFF00; /* mask off main buffer index */
172        DMACtrl_indices |= tc_dma_index & 0x00FF; /* or in main buffer index */
173        STSYS_WriteTCReg16LE((void *)&MainInfo_p->DMACtrl_indices, DMACtrl_indices);
174#if defined(SECURE_LITE2)
175        STSYS_WriteTCReg16LE((void *)&DMAConfig_p->BufferLevelThreshold, 0);
176#endif
177}
178
179void pti_slot_unlink_buffer(u32 tc_slot_index)
180{
181        STPTI_TCParameters_t *TC_Params_p = &tc_params;
182        TCMainInfo_t *MainInfo_p;
183        /* **************************
184         * TcHal_MainInfoUnlinkDmaWithSlot(TC_Params_p, SlotIdent);
185         */
186        if (tc_slot_index < 0)
187        {
188                printk("%s: invalid slot index passed %d\n", __func__, tc_slot_index);
189                return;
190        }
191        MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
192        STSYS_SetTCMask16LE((void *)&MainInfo_p->DMACtrl_indices, 0xffff);
193}
194
195void pti_slot_free(u32 tc_slot_index)
196{
197        STPTI_TCParameters_t *TC_Params_p = &tc_params;
198        int type = TC_SLOT_TYPE_NULL;
199        /* dont trust user so invalidate pid ;-) */
200        PutTCData(&((u16 *)TC_Params_p->TC_LookupTableStart)[tc_slot_index], 0xe000);
201        /* stptiHelper_WaitPacketTimeDeschedule */
202        udelay(320);
203        {
204                TCMainInfo_t *MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
205                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SlotState, 0);
206                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SlotMode, 0);
207                STSYS_WriteTCReg16LE((void *)&MainInfo_p->DescramblerKeys_p, TC_INVALID_LINK);
208                STSYS_WriteTCReg16LE((void *)&MainInfo_p->DMACtrl_indices, 0xffff);
209                STSYS_WriteTCReg16LE((void *)&MainInfo_p->StartCodeIndexing_p, 0);
210                STSYS_WriteTCReg16LE((void *)&MainInfo_p->SectionPesFilter_p, TC_INVALID_LINK);
211                STSYS_WriteTCReg16LE((void *)&MainInfo_p->RemainingPESLength, 0);
212                STSYS_WriteTCReg16LE((void *)&MainInfo_p->PacketCount, 0);
213                STSYS_SetTCMask16LE((void *)&MainInfo_p->SlotMode, type);
214        }
215}
216
217int pti_slot_get_state(u32 tc_slot_index)
218{
219        STPTI_TCParameters_t *TC_Params_p = &tc_params;
220        TCMainInfo_t *MainInfo_p = &((TCMainInfo_t *)TC_Params_p->TC_MainInfoStart)[tc_slot_index];
221        return MainInfo_p->SlotState;
222}
Note: See TracBrowser for help on using the repository browser.