Annotation of margi2/cardbase.h, revision 1.2
1.1 cvs 1: /*
2: cardbase.h
3:
4: Copyright (C) Christian Wolff for convergence integrated media.
5:
6: This program is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2 of the License, or
9: (at your option) any later version.
10:
11: This program is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with this program; if not, write to the Free Software
18: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19: */
20:
21: #ifndef CARDBASE_H
22: #define CARDBASE_H
23:
24: // all the internal structs
25:
26: #include <pcmcia/config.h>
27: #include <pcmcia/k_compat.h>
28: #include "ringbuffy.h"
29:
30: #include <linux/kernel.h>
31: #include <linux/config.h>
32:
33: #include <linux/malloc.h>
34: #include <linux/vmalloc.h>
35: #include <linux/mm.h>
36: #include <linux/delay.h>
37: #include <linux/poll.h>
38: #include <linux/fs.h>
39: #include <linux/interrupt.h>
40: #include <linux/tqueue.h>
41: #include <asm/io.h>
42: #include <asm/byteorder.h>
43:
44:
45: // List of pci cards in the system
46:
47: #include "cvdvtypes.h"
48:
49: #define DVERSION "0.42"
50: #define SHORTDEVNAME "ConvDVD"
51: #define MEDDEVNAME "convergence DVD"
52: #define LONGDEVNAME "convergence DVD Video Decoder"
53: #define LOGNAME "convdvd"
54: #define NBBUF 32
55:
56: // Character device definitions
57: // char dev name
58: #define CVDV_PROCNAME "msc" // Media Stream Consumer
59: // got to get another number
60: #define CVDV_MAJOR 200 // 0=dynamic assignment
61:
62: // Author definitions
63: #define NAME "Christian Wolff"
64: #define EMAIL "scarabaeus@convergence.de"
65: #define COMPANY "convergence integrated media GmbH"
66: #define AUTHOR NAME " <" EMAIL "> " COMPANY
67:
68: #define MAXDEV 1 // maximum number of cards, distance between minor devices
69:
70: #define MINORNUM (256/MAXDEV) // number of minor devices
71:
72: #define NAVISIZE 1024 // size of one navi block
73: #define NAVIBUFFERSIZE NAVISIZE*10 // size of ten navi blocks
74:
75: #define BLANK 0xFFFFFFFF
76:
77: #define FIFO_MASK 1023
78:
79: #define CCIR601Lines(system) (((system==NTSC) || (system==NTSC60) || (system==PALM) || (system==PALM60) || (system==PAL60))?525:625)
80:
81: // default video mode
82: #define VIDEO_MODE PAL
83: //#define VIDEO_MODE NTSC
84:
85: struct DRAMBlock {
86: u32 start; // start address of the block; (21 bit word address, 64 bit aligned)
87: u32 length; // length of the block (in 16 bit words)
88: struct DRAMBlock *next; // chain link
89: };
90:
91: struct CSS {
92: u8 status; // interrupt status from Register 0x0B0
93: int ChallengeReady; // 1 if challenge data valid
94: u8 challenge[10]; // challenge data
95: int ResponseReady; // 1 if response data valid
96: u8 response[5]; // response data
97: int DiskKey; // 1 if disk key extraction complete
98: int TitleKey; // 1 if title key decryption complete
99: int Error; // 1 if authentication or disc key extraction
100: int TitleKeyDiff; // 1 if title key different from previous
101: };
102:
103: struct GOPHeader {
104: int valid; // 1: struct contains valid data
105: int timecode;
106: int closedgop;
107: int brokenlink;
108: };
109:
110: struct SequenceHeader {
111: int valid; // 1: struct contains valid data
112: int hsize;
113: int vsize;
114: int aspectratio;
115: int frameratecode;
116: int bitrate;
117: int vbvbuffersize;
118: int constrained;
119: };
120:
121: struct SequenceExtension {
122: int valid; // 1: struct contains valid data
123: int profilelevel;
124: int progressive;
125: int chroma;
126: int hsizeext;
127: int vsizeext;
128: int bitrateext;
129: int vbvbuffersizeext;
130: int lowdelay;
131: int frextn;
132: int frextd;
133: };
134:
135: struct AudioMPEG {
136: int present; // true: MPEG audio stream present
137: int MPEG2; // 0:MPEG1 Audio
138: int layer; // 1..3 (I..III)
139: int bitrate; // 0=free, 32-448 kbps
140: int samplefreq; // 32,44,48 (44 eq. 44.1)
141: int mode; // 0=stereo 1=joint-stereo 2=dualchannel 3=single channel (just right channel)
142: int modeext; // Layer I&II: intensity stereo subbands Layer III: bit 0=intensity stereo, bit 1=ms-stereo
143: int copyright; // true=copyrighted material
144: int original; // 0=copy true=original
145: int emphasis; // 0=no emph. 1=50/15usec 3=CCITT J.17
146: };
147:
148: struct AudioAC3 {
149: int present; // 1: AC3 audio stream present
150: int acmod; // parameters from the AC3 documentation
151: int bsmod;
152: int dialnorm;
153: int dialnorm2;
154: int surmixlev;
155: int mixlevel;
156: int cmixlev;
157: int mixlevel2;
158: int fscod;
159: int lfeon;
160: int bsid;
161: int dsurmod;
162: int frmsizecod;
163: int langcod;
164: int langcod2;
165: int timecod;
166: int roomtyp;
167: int timecod2;
168: int roomtyp2;
169: };
170:
171: struct AudioPCM {
172: int present; // 1: PCM audio stream present
173: int audio_frm_num;
174: int num_of_audio_ch;
175: int Fs;
176: int quantization;
177: int emphasis;
178: int mute_bit;
179: };
180:
181: struct AudioParam {
182: int valid;
183: struct AudioMPEG mpeg;
184: struct AudioAC3 ac3;
185: struct AudioPCM pcm;
186: };
187:
188: struct OSDPicture { // all u32 pointers are 21 bit word addresses
189: int open; // are the buffers initialized?
190: int width; // frame width
191: int height; // frame height
192: int bpp; // bit per pixel
193: int evenfirst; // first line is in even field
194: int aspectratio; // pixel aspect ratio: 11/aspectratio
195: int oddheight; // height of the odd field
196: u32 oddmem; // DRAM address of allocated memory
197: u32 odddata; // data (=header) pointer
198: u32 oddpalette; // pointer to palette inside data
199: u32 oddbitmap; // pointer to bitmap inside data
200: u32 oddterm; // pointer to termination header
201: int evenheight; // height of the even field
202: u32 evenmem; // DRAM address of allocated memory
203: u32 evendata; // data (=header) pointer
204: u32 evenpalette; // pointer to palette inside data
205: u32 evenbitmap; // pointer to bitmap inside data
206: u32 eventerm; // pointer to termination header
207: };
208:
209: struct StreamInfo {
210: int valid; // 1: struct contains valid data
211: int MPEG2; // 0: MPEG1/ISO11172 1: MPEG2/ISO13818
212: int hsize; // overall hsize (hsize&hsizeext)
213: int vsize; // overall vsize (vsize&vsizeext)
214: int bitrate; // overall bitrate (bitrate&bitrateext)
215: int vbvbuffersize; // overall...
216: struct GOPHeader gop;
217: struct SequenceHeader sh;
218: struct SequenceExtension se;
219: struct AudioParam audio;
220: };
221:
222: struct StreamSetup { // user selected parameters for the stream playback
223: stream_type streamtype; // what is the type of our input stream?
224: audio_type audioselect; // 0=auto/unknown 1=MPEG 2=LPCM 3=AC3
225: int videoID; // stream ID of the video ES, -1 for any
226: int audioID; // stream ID of the audio ES, -1 for any
227: int audioIDext; // stream ID of the audio extension ES, -1 for none
228: int SPDIFmode; // 0:MPEG/AC3 data on digital S/PDIF out 1:IEC956 data on digital S/PDIF out
229: };
230:
1.2 ! rjkm 231: #define MAX_PTS 64
1.1 cvs 232:
233: typedef struct PTSRecord {
234: int begin;
235: int end;
236: int size;
237: u32 LastAddr;
238: u32 AddrB[MAX_PTS];
239: u32 AddrE[MAX_PTS];
240: u32 PTS[MAX_PTS];
241: } PTSStorage;
242:
243: struct cvdv_cards {
244: struct cvdv_cards *next;
245: // struct video_device video;
246: void *margi;
247: struct bus_operations *bus;
248: u_char scl;
249: u_char sda;
250: int i2c_addr;
251: u32 VideoESSize;
252: u32 AudioESSize;
253: u32 VideoPESSize;
254: u32 DataDumpSize;
255: u32 AudioPESSize;
256: u32 NaviBankSize;
257: int currentAThread;
258: int currentBThread;
259: int currentType;
260: u32 lengthB[NBBUF];
261: u32 posB[NBBUF];
262: u32 lengthA[NBBUF];
263: u32 posA[NBBUF];
264: ringbuffy rbuf;
265: int use_ring;
266:
267: // struct video_device video;
268: u8 *addr;
269: unsigned int size;
270: unsigned int minor;
271: struct DRAMBlock *DRAMFirstBlock;
272: u32 DRAMSize;
273: struct OSDPicture OSD;
274: int DMAABusy; // Is the DMA A currently in use?
275: int DMABBusy; // Is the DMA B currently in use?
276: int IntInstalled; // is the card interrupt routine installed?
277: int ChannelBuffersAllocated; // Are the channel buffers for the decoder allocated?
278: u32 VideoES; // 21 bit word address of the allocated channel
279: u32 AudioES; // 21 bit word address of the allocated channel
280: u32 VideoPES; // 21 bit word address of the allocated channel
281: u32 DataDump; // 21 bit word address of the allocated channel
282: u32 AudioPES; // 21 bit word address of the allocated channel
283: u32 NaviBank; // 21 bit word address of the allocated channel
284: int FrameBuffersAllocated; // Are the frame buffers for the decoder allocated?
285: u32 FrameStoreLuma1; // 21 bit word address of the allocated frame
286: u32 FrameStoreChroma1; // 21 bit word address of the allocated frame
287: u32 FrameStoreLuma2; // 21 bit word address of the allocated frame
288: u32 FrameStoreChroma2; // 21 bit word address of the allocated frame
289: u32 FrameStoreLumaB; // 21 bit word address of the allocated frame
290: u32 FrameStoreChromaB; // 21 bit word address of the allocated frame
291: int DecoderOpen; // Is the Decoder initialized?
292: u16 AuxFifo[FIFO_MASK + 1]; // Auxiliary Fifo Data
293: int AuxFifoHead; // Auxiliary Fifo Position
294: int AuxFifoTail; // Auxiliary Fifo Position
295: u16 DataFifo[FIFO_MASK + 1]; // Data Fifo Data
296: int DataFifoHead; // Data Fifo Position
297: int DataFifoTail; // Data Fifo Position
298: int FifoALast; // last used thread of FIFO A
299: int FifoBLast; // last used thread of FIFO B
300: videosystem videomode; // current video output mode, PAL or NTSC
301: struct StreamInfo stream; // header information of the current stream
302: struct StreamSetup setup; // should be filled bevor sending data, but default is OK
303: int AuxFifoExt; // used by Aux FIFO parser
304: int AuxFifoLayer; // " " " " "
305: int AudioInitialized; // Is the Audio set up?
306: int AudioOldMode; // remainder of the previous mode while trickmodes, or -1
307: int open[MINORNUM]; // is the 64017 initialized and the video out active?
308: int closing; // 1 if char device closed, but DMA still running
309: int startingV; // 1 if card is waiting for the Video ES buffer to fill up, to start the decoder
310: int startingA; // 1 if card is waiting for the Audio ES buffer to fill up, to start the decoder
311: int startingDVDV; // 1 if card is waiting for the Video ES buffer to fill up, to start the decoder
312: int startingDVDA; // 1 if card is waiting for the Audio ES buffer to fill up, to start the decoder
313: int channelrun; // 1 if channel has been started by the host
314: u8 *channelA; // Buffer for channel A
315: int channelAthread; // currently filled thread
316: int channelApos; // write position in buffer
317: u8 *channelB; // Buffer for channel B
318: int channelBthread; // currently filled thread
319: int channelBpos; // write position in buffer
320: int fields; // counter of video fields, debugging only
321: struct CSS css; // CSS data
322: u32 NaviPackAddress; // Read address of the Navi Pack Buffer
323: wait_queue_head_t wqA;
324: wait_queue_head_t wqB;
325: int threadAthreads;
326: u8 *threadA[NBBUF];
327: u32 threadAsize;
328: int threadBthreads;
329: u8 *threadB[NBBUF];
330: u32 threadBsize;
331: struct tq_struct tqueue_decoder;
332: struct tq_struct tqueue_dma;
333: u8 bt864reg[128]; // Bt864/865 register mirror
334: u8 navibuffer[NAVIBUFFERSIZE];
335: int navihead;
336: int navitail;
337: int intdecodestatus;
338: int showvideo;
339: int slowdown;
340: int lastslow;
341: int videosteps;
342: int videodelay;
343: int videorip;
344: int videosync;
345: PTSStorage VideoPTSStore;
346: PTSStorage AudioPTSStore;
347: u32 LastAddr;
348: u32 VPTS;
349: u32 oldVPTS;
350: long VSCR;
351: u32 APTS;
352: u32 oldAPTS;
353: long ASCR;
354: long SyncTime;
355: int paused;
356: u16 lastvattr;
357: u16 lastaattr;
358: u8 reg07B; // mirrors of write-only register
359: u8 reg08F;
360: u8 reg090;
361: u8 reg091;
362: u8 reg092;
363: u8 reg093;
364: u8 highlight[10]; // content of registers 1C0 thru 1C0, to be written after next BAV int.
365: int highlight_valid; // if 1
366: int do_flush; // if 1, send flush packet after last transfer done
367: };
368:
369: extern u8 FlushPacket[32];
370:
371: extern struct cvdv_cards *first_card;
372: extern struct cvdv_cards *minorlist[MAXDEV];
373:
374: void DecoderStreamReset(struct cvdv_cards *card);
375:
376: void DecoderSetupReset(struct cvdv_cards *card);
377:
378: void DecoderCSSReset(struct cvdv_cards *card);
379:
380: void card_init(struct cvdv_cards *card, unsigned int minor);
381:
382: #endif /* CARDBASE_H */
LinuxTV legacy CVS <linuxtv.org/cvs>