Annotation of margi2/cvdv.c, revision 1.9
1.1 cvs 1: /*
2: cvdv.c
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: /////////////////////////////////////////////////////////////////////
22: // //
23: // Driver for the Convergence Digital Video decoder card (pci) //
24: // with L64017, L64021, PCM1723, and Bt864/Bt865 chipset //
25: // (c) Christian Wolff 19990209 for convergence integrated media //
26: // //
27: /////////////////////////////////////////////////////////////////////
28:
29: // Convergence CV2300i
30: #define __NO_VERSION__
31:
32: #include "cvdv.h"
33: #include "i2c.h"
34:
35: //////////////////////
36: // global variables //
37: //////////////////////
38:
39: // Our major device number
40: unsigned int major_device_number;
41:
42:
43: // my little random function for memory test
44: u16 rnd_seed;
45: u16 rnd(u16 range)
46: { // returns random 0..(range-1) range<=872
47: u32 b = 75 * (rnd_seed + 1) - 1;
48: rnd_seed = (u16) (b & 0xFFFF);
49: return ((b * range) / 0xFFFF) - ((b / 0xFFFF) * range);
50: }
51: void rnd_omize(void)
52: {
53: rnd_seed = (u16) jiffies;
54: }
55:
1.5 mocm 56: static char *cimlogo[] = {
57: ".............................................",
58: ".............................................",
59: "......................###....................",
60: ".....................#####...................",
61: ".....................######..................",
62: "..............#......#####...................",
63: "...........#####....######...................",
64: ".........########...######...................",
65: "........########....######...................",
66: ".......#########...######....................",
67: "......########.....######...####.............",
68: ".....#######.......#####...#####.............",
69: ".....######.......######...######............",
70: "....#######.......######....######...........",
71: "....######........######....######...........",
72: "....#####........######......#####...........",
73: "...######........######......#####...........",
74: "...#####.........######......######..........",
75: "...#####.........#####.......######..........",
76: "...#####........######........#####..........",
77: "...#####........######.......######..........",
78: "...#####........#####.........#####..........",
79: "...#####.......######........######..........",
80: "...#####.......######........#####...........",
81: "...######.......####.........#####...........",
82: "....#####........##.........######...........",
83: "....######..................######...........",
84: "....######.................######............",
85: ".....#######..............######.....#####...",
86: ".....########............#######....#######..",
87: "......#########........########.....#######..",
88: ".......#######################......########.",
89: "........#####################.......#######..",
90: "..........#################.........#######..",
91: "............#############............#####...",
92: "...............#.#####.................##....",
93: ".............................................",
94: "............................................."
95: };
1.1 cvs 96:
97: /////////////////////////////////////////////
98: // //
99: // Controlling the L64021 MPEG-2 Decoder //
100: // //
101: /////////////////////////////////////////////
102:
103: int OSDTest(struct cvdv_cards *card)
104: {
1.5 mocm 105: int i, j, col, x0, y0, x1, y1,aspx;
106: u8 b;
107:
1.1 cvs 108:
109: if (!card->OSD.open)
110: return -2;
111:
112: OSDQuery(card, &x0, &y0, &x1, &y1, &aspx);
113: OSDShow(card);
1.5 mocm 114: OSDSetColor(card, 0, 0, 0, 0, 0, 0, 0);
115: OSDSetColor(card, 1, 128, 255, 255, 0, 0, 0);
116: for ( i = 0; i < cimlogo_width; i++){
117: for ( j = 0; j < cimlogo_height; j++){
118: b = cimlogo[j][i];
119: col = (b == '#') ? 1: 0;
120: OSDSetPixel(card, x0+i, y0+j, col);
1.1 cvs 121: }
122: }
123:
124: return 0;
125: }
126:
127:
128: void SetVideoSystem(struct cvdv_cards *card)
129: {
130: // set the hsync and vsync generators in the L64017 according to the video standard
131: switch (card->videomode) {
132: case PAL: // 864*625*50Hz = 27MHz, 25fps
133: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x41 | 0x0a);
134: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
135: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
136: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x96);
137: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x15);
138: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0x13);
139: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x54);
140: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_PAL);
141: break;
142: case PALN:
143: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0xa1 | 0x0a);
144: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
145: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
146: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x96);
147: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x15);
148: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0x13);
149: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x54);
150: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_PAL);
151: break;
152:
153: case PALNc:
154: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x81 | 0x0a);
155: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
156: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
157: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x8c);
158: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x28);
159: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xed);
160: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
161: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_PAL);
162:
163: break;
164:
165: case NTSC: // 858*525*59.94006Hz = 27MHz, 29.97fps
166: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x01 | 0x0a);
167: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
168: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x1c);
169: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x3e);
170: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0xf8);
171: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe0);
172: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
173: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_NTSC);
174:
175: break;
176:
177: case PALM:
178: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x01 | 0x0a);
179: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
180: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
181: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x4e);
182: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x4a);
183: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe1);
184: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
185: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_PAL);
186:
187: break;
188:
189: case NTSC60: // 857*525*60.010002Hz = 27MHz, 30fps
190: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x21 | 0x0a);
191: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
192: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x1c);
193: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x3e);
194: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0xf8);
195: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe0);
196: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
197: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_NTSC);
198: break;
199:
200: case PALM60:
201: I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x61 | 0x0a);
202: I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
203: I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
204: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x4e);
205: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x4a);
206: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe1);
207: I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
208: write_indexed_register(card, IIO_VIDEO_CONTROL1, VMS_PAL);
209:
210: break;
211:
212: case PAL60:
213: break;
214: }
215: // set the pixel generators according to the video standard
216: L64021Setup(card);
217: }
218:
219: int SetVideoAttr(struct cvdv_cards *card, u16 vattr)
220: {
221: u8 video_compression_mode;
222: u8 tv_system;
223: u8 aspect_ratio;
224: u8 display_mode;
225: u8 line_21_switch_1;
226: u8 line_21_switch_2;
227: u8 source_picture_resolution;
228: u8 source_picture_letterboxed;
229: u8 reserved;
230: u8 film_camera_mode;
231: u16 hsize, vsize;
232: if (vattr != card->lastvattr) {
233: video_compression_mode = (vattr >> 14) & 0x03;
234: tv_system = (vattr >> 12) & 0x03;
235: aspect_ratio = (vattr >> 10) & 0x03;
236: display_mode = (vattr >> 8) & 0x03;
237: line_21_switch_1 = (vattr >> 7) & 0x01;
238: line_21_switch_2 = (vattr >> 6) & 0x01;
239: source_picture_resolution = (vattr >> 3) & 0x07;
240: source_picture_letterboxed = (vattr >> 2) & 0x01;
241: reserved = (vattr >> 1) & 0x01;
242: film_camera_mode = (vattr >> 0) & 0x01;
243: card->videomode =
244: ((tv_system == 0) ? NTSC : ((tv_system == 1) ?
245: PAL : PAL));
246: SetVideoSystem(card);
247: hsize =
248: ((source_picture_resolution == 0) ? 720
249: : ((source_picture_resolution == 1) ? 702 : 352));
250: vsize = ((source_picture_resolution == 3)
251: ? ((tv_system == 0) ? 240 : 288)
252: : ((tv_system == 0) ? 480 : 576));
253: if (DecoderOpen
254: (card, hsize, vsize, ((aspect_ratio) ? 3 : 2),
255: ((video_compression_mode) ? 0 : 1),
256: source_picture_letterboxed, tv_system)) {
257: printk(KERN_ERR LOGNAME
258: ": Video Decoder Open failed: On-card memory insufficient for frame stores\n");
259: }
260: card->lastvattr = vattr;
261: } else {
262: printk(KERN_ERR LOGNAME
263: ": Video attribute not set, equal to previous one.\n");
264: }
265: return 0;
266: }
267:
268: int SetAudioAttr(struct cvdv_cards *card, u16 aattr)
269: {
270: u8 audio_coding_mode;
271: u8 multichannel_extension;
272: u8 audio_type;
273: u8 audio_application_mode;
274: u8 quantization_drc;
275: u8 fs;
276: u8 reserved;
277: u8 num_audio_ch;
278: if (aattr) {
279: if (aattr != card->lastaattr) {
280: audio_coding_mode = (aattr >> 13) & 0x07;
281: multichannel_extension = (aattr >> 12) & 0x01;
282: audio_type = (aattr >> 10) & 0x03;
283: audio_application_mode = (aattr >> 8) & 0x03;
284: quantization_drc = (aattr >> 6) & 0x03;
285: fs = (aattr >> 4) & 0x03;
286: reserved = (aattr >> 3) & 0x01;
287: num_audio_ch = (aattr >> 0) & 0x07;
288: switch (audio_coding_mode) {
289: case 0: // AC-3
290: card->setup.audioselect = audio_AC3;
291: break;
292: case 2: // MPEG Audio
293: card->setup.audioselect = audio_MPEG;
294: break;
295: case 3: // MPEG Audio with ext.
296: card->setup.audioselect = audio_MPEG_EXT;
297: break;
298: case 4: // Linear Pulse Code Modulation LPCM
299: card->setup.audioselect = audio_LPCM;
300: break;
301: case 6: // DTS
302: card->setup.audioselect = audio_DTS;
303: break;
304: case 7: // SDDS
305: card->setup.audioselect = audio_SDDS;
306: break;
307: }
308: DecoderPrepareAudio(card);
309: AudioInit(card, ((fs) ? 96 : 48),
310: ((audio_application_mode == 2) ? 1 : 0));
311: } else {
312: printk(KERN_ERR LOGNAME
313: ": Audio attribute not set, equal to previous one.\n");
314: }
315: } else {
316: card->setup.audioselect = audio_none;
317: DecoderPrepareAudio(card);
318: }
319: card->lastaattr = aattr;
320: return 0;
321: }
322:
323: int Prepare(struct cvdv_cards *card)
324: {
325: int err, h;
326: struct StreamSetup *setup = &card->setup;
327:
328: if (!card->ChannelBuffersAllocated) {
329:
330: DecoderStreamReset(card);
331: if (setup->streamtype == stream_none) {
332: setup->streamtype = stream_PS;
333: }
334:
335: if (setup->audioselect == audio_none) {
336: setup->audioselect = audio_MPEG;
337: }
338:
339: DecoderPrepareAudio(card);
340: AudioMute(card, 1);
341: DecoderPrepareVideo(card);
342: VideoSetBackground(card, 1, 0, 0, 0); // black
343:
344: switch (setup->streamtype) {
345: default:
346: case stream_none: // unknown stream!
347: printk(KERN_ERR LOGNAME
348: ": Video Decoder Prepare failed: unknown stream type\n");
349: return -ENODEV; // not an MPEG stream!
350: case stream_ES: // Elementary Stream
351: err = DecoderPrepareES(card);
352: break;
353: case stream_PES: // Packetized Elementary Stream
354: err = DecoderPreparePES(card);
355: break;
356: case stream_PS: // MPEG-1 System Stream / MPEG-2 Program Stream
357: err = DecoderPreparePS(card, -1, 0, 0, 0, 0, 0);
358: break;
359: case stream_DVD: // DVD Stream
360: err = DecoderPreparePS(card, 0, 0, 0, 0, 3, 1);
361: break;
362: }
363: if (err) { // insufficient memory
364: printk(KERN_ERR LOGNAME
365: ": Video Decoder Prepare failed: no kernel memory, please reboot if possible\n");
366: CloseCard(card);
367: return -ENODEV;
368: }
369: }
370:
371: // Set up the Video Decoder as we have the stream information
372: if ((!card->FrameBuffersAllocated)
373: && (card->ChannelBuffersAllocated) && (card->stream.sh.valid)) {
374: // Automatic PAL/NTSC-switch according to MPEG-Source
375: h = card->stream.vsize;
376: if (h < 480)
377: h *= 2; // catch quarter sized images
378: printk(KERN_INFO LOGNAME ": Video mode: %s\n",
379: ((h == 480) ? "NTSC" : "PAL"));
380: card->videomode = ((h == 480) ? NTSC : PAL);
381: SetVideoSystem(card);
382: // Open the Video Decoder with the parameters retreived from the stream
383: if (
384: (err =
385: DecoderOpen(card, card->stream.hsize,
386: card->stream.vsize,
387: card->stream.sh.aspectratio,
388: !card->stream.MPEG2, 0,
1.2 rjkm 389: (card->stream.hsize > 480)))) { // TODO: include vbvbuffersize
1.1 cvs 390: printk(KERN_ERR LOGNAME
391: ": Video Decoder Open failed: %s\n",
392: ((err == 1) ?
393: "Picture size too big (>1440 pixel wide)" :
394: "On-card memory insufficient for frame stores"));
395: CloseCard(card);
396: return -ENODEV; // picture too big or insufficient memory
397: }
1.3 rjkm 398: printk(KERN_DEBUG LOGNAME ": Ready to go\n");
1.1 cvs 399: card->startingV = 1; // tell the card to start playing as soon as ES-buffers are sufficiently full
400: card->startingA = 1; // tell the card to start playing as soon as ES-buffers are sufficiently full
401: }
402:
403:
404: return 0;
405: }
406:
407: int SetSCRstart(struct cvdv_cards *card, u32 SCR_base)
408: {
409: u32 SCR_compare;
410: u32 SCR_compareA;
411: u32 SCR_compareV;
412: if (card->startingV) {
413: printk(KERN_ERR LOGNAME ": SCR in DVD Pack: 0x%08X\n",
414: SCR_base);
415: card->startingV = 0;
416: card->startingA = 0;
417: DecoderMaskByte(card, 0x007, 0xD2, 0xD2); // Set 0x010, halt SCR counter
418: SCR_compare = SCR_base + 000;
419: if (SCR_base < 900)
420: SCR_base = 0;
421: else
422: SCR_base -= 900;
423: //DecoderWriteDWord(card,0x009,SCR_base); // Set SCR counter
424: DecoderWriteByte(card, 0x009, SCR_base & 0xFF); // Set SCR counter
425: DecoderWriteByte(card, 0x00A, (SCR_base >> 8) & 0xFF);
426: DecoderWriteByte(card, 0x00B, (SCR_base >> 16) & 0xFF);
427: DecoderWriteByte(card, 0x00C, (SCR_base >> 24) & 0xFF);
428: DecoderMaskByte(card, 0x011, 0x03, 0x02); // compare, not capture
429: printk(KERN_ERR LOGNAME ": SCR compare value: 0x%08X\n",
430: SCR_compare);
431: //DecoderWriteDWord(card,0x00D,SCR_compare); // Set Compare register
432: DecoderWriteByte(card, 0x00D, SCR_compare & 0xFF); // Set Compare register
433: DecoderWriteByte(card, 0x00E, (SCR_compare >> 8) & 0xFF);
434: DecoderWriteByte(card, 0x00F, (SCR_compare >> 16) & 0xFF);
435: DecoderWriteByte(card, 0x010, (SCR_compare >> 24) & 0xFF);
436: //DecoderWriteDWord(card,0x014,SCR_compare); // Set audio compare reg.
437: DecoderWriteByte(card, 0x014, SCR_compare & 0xFF); // Set audio compare reg.
438: DecoderWriteByte(card, 0x015, (SCR_compare >> 8) & 0xFF);
439: DecoderWriteByte(card, 0x016, (SCR_compare >> 16) & 0xFF);
440: DecoderWriteByte(card, 0x017, (SCR_compare >> 24) & 0xFF);
441: DecoderSetByte(card, 0x013, 0x03); // Video and Audio start on cmp.
442: //DecoderSetVideoPanic(card,0,DecoderGetVideoESSize(card)/4); // video panic at 25 percent
443: VideoSetBackground(card, 1, 0, 0, 0); // black
444: SCR_base = DecoderReadByte(card, 0x009);
445: SCR_base =
446: SCR_base | ((u32) DecoderReadByte(card, 0x00A) << 8);
447: SCR_base =
448: SCR_base | ((u32) DecoderReadByte(card, 0x00B) << 16);
449: SCR_base =
450: SCR_base | ((u32) DecoderReadByte(card, 0x00C) << 24);
451: SCR_compareA = DecoderReadByte(card, 0x014);
452: SCR_compareA =
453: SCR_compareA | ((u32) DecoderReadByte(card, 0x015) <<
454: 8);
455: SCR_compareA =
456: SCR_compareA | ((u32) DecoderReadByte(card, 0x016) <<
457: 16);
458: SCR_compareA =
459: SCR_compareA | ((u32) DecoderReadByte(card, 0x017) <<
460: 24);
461: SCR_compareV = DecoderReadByte(card, 0x00D);
462: SCR_compareV =
463: SCR_compareV | ((u32) DecoderReadByte(card, 0x00E) <<
464: 8);
465: SCR_compareV =
466: SCR_compareV | ((u32) DecoderReadByte(card, 0x00F) <<
467: 16);
468: SCR_compareV =
469: SCR_compareV | ((u32) DecoderReadByte(card, 0x010) <<
470: 24);
471: if (DecoderReadByte(card, 0x013) & 0x03)
472: printk(KERN_DEBUG LOGNAME
473: ": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n",
474: SCR_base, SCR_compareV, SCR_compareA,
475: DecoderReadByte(card, 0x013));
476: DecoderMaskByte(card, 0x007, 0xD2, 0xC2); // Del 0x010, SCR counter run
477: }
478: return 0;
479: }
480:
481: int DecoderWriteBlock(struct cvdv_cards *card, u8 * data, int size,
482: int initial, int setSCR)
483: {
484: //int a,v,as,vs,ap,vp;
485: int res;
486: u32 SCR_base;
487: int co = 0;
488: // u32 SCR_compare;
489: res = 0;
1.6 mocm 490:
491: Prepare(card);
1.1 cvs 492:
493: if (size > 0) {
494:
495: if (!card->use_ring)
1.6 mocm 496: MargiSetBuffers(card, NBBUF* 128 *
1.4 mocm 497: CHANNELBUFFERSIZE);
1.1 cvs 498:
499: if (card->startingDVDV || card->startingDVDA)
500: setSCR = 1;
501:
502: if (initial) {
503: DecoderStreamReset(card);
504: //TODO stop and start channel interface
505: setSCR = 1;
506: }
507:
508: if (setSCR) {
509: SCR_base = ParseSCR(data);
510: SetSCR(card, SCR_base);
511: }
1.6 mocm 512: card->DMAABusy = 0;
1.1 cvs 513: while (((res = MargiPush(card, size, data)) < size)
1.6 mocm 514: && co < 1000) {
1.1 cvs 515: data+=res;
516: size-=res;
517: co++;
1.6 mocm 518: // printk(KERN_DEBUG LOGNAME
1.1 cvs 519: // ": DecoderWriteBlock - buffers only filled with %d instead of %d bytes\n",
1.6 mocm 520: // res, size);
1.1 cvs 521: if (card->DMAABusy)
522: interruptible_sleep_on(&card->wqA);
523: }
524:
525: if (card->startingDVDV) {
526: card->startingDVDV = 0;
1.6 mocm 527: card->startingV = 1;
1.1 cvs 528: DecoderStartDecode(card);
529: }
530: if (card->startingDVDA) {
531: card->startingDVDA = 0;
1.6 mocm 532: card->startingA = 1;
533: AudioSetPlayMode(card, MAUDIO_PLAY);
1.1 cvs 534: }
535: }
536: return 0;
537: }
538:
539:
540:
541:
542:
543: //////////////////////////////
544: // //
545: // Char Device Procedures //
546: // //
547: //////////////////////////////
1.6 mocm 548: static long margi_write(struct video_device *dev, const char *data,
549: unsigned long count, int nonblock)
1.1 cvs 550: {
1.6 mocm 551: struct cvdv_cards *card = (struct cvdv_cards*)dev;
552:
1.1 cvs 553: struct StreamSetup *setup = &card->setup;
554: // int i;
555: // int laststart=-1;
556: // int B3=0, B5=0, C0=0, E0=0, BD=0, BF=0;
557: int res;
1.6 mocm 558: int channel=0;
1.1 cvs 559:
560: if (card != NULL) {
561: if (count > 0) { // Do we have data?
562: if ((res = Prepare(card)))
563: return res;
564:
565: if ((setup->streamtype != stream_ES)
566: && (setup->streamtype != stream_PES))
567: channel = 0;
568: // only ES and PES come in separate streams
569: switch (channel) {
570: case 0:
571: if (!card->use_ring)
572: MargiSetBuffers(card, NBBUF*
573: CHANNELBUFFERSIZE);
574: if (!(count = MargiPush(card, count, data))){
575: if (card->DMAABusy)
576: interruptible_sleep_on(
577: &card->wqA);
578: }
579: break;
580:
581:
582: case 1:
583:
584: // todo
585: break;
586: }
587: }
588: return count;
589: } else {
590: printk(KERN_ERR LOGNAME
591: ": Video Decoder Prepare failed: device with this minor number not found\n");
592: return -ENODEV; // device with this minor number not found
593: }
1.6 mocm 594: }
595:
596:
597: static ssize_t PSwrite(struct file *file, const char *data, size_t count,
598: loff_t * offset)
599: {
600: struct cvdv_cards *card =
601: minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
602: return margi_write((struct video_device *)card, data, count, 0);
603:
1.1 cvs 604: }
605:
606: static unsigned int PSpoll(struct file *file, poll_table * table)
607: {
608: struct cvdv_cards *card =
609: minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
610: if (card != NULL) {
1.9 ! mocm 611: poll_wait(file, &card->wqA , table);
1.8 mocm 612: if (ring_read_rest(&(card->rbuf)) &&
613: card->videostate.playState==VIDEO_PLAYING)
614: return POLLOUT | POLLWRNORM;
615: else return 0;
1.1 cvs 616: } else
1.8 mocm 617: return POLLERR;
1.1 cvs 618: }
619:
1.6 mocm 620:
621: static int margi_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
622: {
623: // struct cvdv_cards *card = (struct cvdv_cards*)dev;
624: return 0;
625: }
626:
627:
1.1 cvs 628: static int PSioctl(struct inode *inode, struct file *file,
629: unsigned int cmd, unsigned long arg)
630: {
631: struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16
632: struct drawcmd *dc;
633: struct decodercmd *command;
634: u16 attr;
635: if (card != NULL) {
636: if (_IOC_TYPE(cmd) == CVDV_IOCTL_MAGIC)
637: switch (_IOC_NR(cmd)) {
638: case IOCTL_DRAW: // Drawing commands
639: dc = (struct drawcmd *) arg;
640: switch (dc->cmd) {
641: case OSD_Close:
642: printk(KERN_DEBUG LOGNAME
643: ": OSD Close\n");
644: return OSDClose(card);
645: case OSD_Open: // Open(x0,y0,x1,y1,BitPerPixel(2/4/8),mix(0..15))
646: return OSDOpen(card, dc->x0,
647: dc->y0, dc->x1,
648: dc->y1,
649: dc->color & 0x0F,
650: (dc->color >> 4) &
651: 0x0F);
652: case OSD_Show:
653: return OSDShow(card);
654: case OSD_Hide:
655: return OSDHide(card);
656: case OSD_Clear:
657: return OSDClear(card);
658: case OSD_Fill: // Fill(color)
659: return OSDFill(card, dc->color);
660: case OSD_SetColor: // SetColor(color,R(x0),G(y0),B(x1),opacity(y1))
661: //printk(KERN_DEBUG LOGNAME ": OSD SetColor(%d,%d,%d,%d,%d)\n",
662: //dc->color,dc->x0,dc->y0,dc->x1,dc->y1);
663: return (OSDSetColor
664: (card, dc->color, dc->x0,
665: dc->y0, dc->x1, 0,
666: (dc->y1 != 255),
667: (dc->y1 == 0)) >= 0);
668: case OSD_SetPalette: // SetPalette(firstcolor{color},lastcolor{x0},data)
669: return OSDSetPalette(card,
670: dc->color,
671: dc->x0, (u8 *)
672: dc->data);
673: case OSD_SetTrans: // SetTrans(transparency{color})
674: return OSDSetTrans(card,
675: (dc->color >> 4)
676: & 0x0F);
677: case OSD_SetPixel: // SetPixel(x0,y0,color)
678: return OSDSetPixel(card, dc->x0,
679: dc->y0,
680: dc->color);
681: case OSD_GetPixel: // GetPixel(x0,y0);
682: return OSDGetPixel(card, dc->x0,
683: dc->y0);
684: case OSD_SetRow: // SetRow(x0,y0,x1,(u8*)data)
685: return OSDSetRow(card, dc->x0,
686: dc->y0, dc->x1,
687: (u8 *) dc->data);
688: case OSD_SetBlock: // SetBlock(x0,y0,x1,y1,(u8*)data)
689: return OSDSetBlock(card, dc->x0,
690: dc->y0, dc->x1,
691: dc->y1,
692: dc->color,
693: (u8 *)
694: dc->data);
695: case OSD_FillRow: // FillRow(x0,y0,x1,color)
696: return OSDFillRow(card, dc->x0,
697: dc->y0, dc->x1,
698: dc->color);
699: case OSD_FillBlock: // FillRow(x0,y0,x1,y1,color)
700: return OSDFillBlock(card, dc->x0,
701: dc->y0, dc->x1,
702: dc->y1,
703: dc->color);
704: case OSD_Line: // Line(x0,y0,x1,y1,color);
705: return OSDLine(card, dc->x0,
706: dc->y0, dc->x1,
707: dc->y1, dc->color);
708: case OSD_Query: // Query(x0,y0,x1,y1,aspect(color:11)
709: return OSDQuery(card, &dc->x0,
710: &dc->y0, &dc->x1,
711: &dc->y1,
712: &dc->color);
713: case OSD_Test:
714: return OSDTest(card);
715: default:
716: return -EINVAL;
717: }
718: case IOCTL_DECODER:
719: command = (struct decodercmd *) arg;
720: switch (command->cmd) {
721: /*
722: case Decoder_CSS:
723: return DecoderCSS(card,
724: command->param1,
725: command->data1);
726: */
727: case Decoder_Set_Videosystem:
728: printk(KERN_DEBUG LOGNAME
729: ": -- Decoder_Set_Videosystem\n");
730: card->videomode =
731: (videosystem) command->param1;
732: SetVideoSystem(card);
733: return 0;
734: case Decoder_Set_Streamtype:
735: printk(KERN_DEBUG LOGNAME
736: ": -- Decoder_Set_Streamtype\n");
737: card->setup.streamtype =
738: (stream_type) command->param1;
739: return 0;
740: case Decoder_Set_Audiotype:
741: printk(KERN_DEBUG LOGNAME
742: ": -- Decoder_Set_Audiotype\n");
743: card->setup.audioselect =
744: (audio_type) command->param1;
745: DecoderPrepareAudio(card);
746: return 0;
747: case Decoder_Set_VideoStreamID:
748: printk(KERN_DEBUG LOGNAME
749: ": -- Decoder_Set_VideoStreamID\n");
750: card->setup.videoID =
751: command->param1;
752: DecoderPrepareVideo(card);
753: return 0;
754: case Decoder_Set_AudioStreamID:
755: printk(KERN_DEBUG LOGNAME
756: ": -- Decoder_Set_AudioStreamID 0x%02X 0x%02X\n",command->param1,command->param2);
757: card->setup.audioID =
758: command->param1;
759: card->setup.audioIDext =
760: command->param2;
761: attr = card->lastaattr;
762: DecoderSelectAudioID(card);
763: card->lastaattr = attr;
764: return 0;
765: case Decoder_Still_Put:
766: return DecoderShowStill(card,
767: command->
768: param1,
769: command->
770: param2,
771: command->
772: data1,
773: command->
774: data2);
775: case Decoder_Still_Get:
776: return DecoderGetStill(card,
777: &command->
778: param1,
779: &command->
780: param2,
781: command->
782: data1,
783: command->
784: data2);
785: case Decoder_Pause: // pause{param1} 0=run 1=pause 2=toggle
786: if (command->param1 == 2) {
787: if (card->paused)
788: DecoderUnPause
789: (card);
790: else
791: DecoderPause(card);
792: } else {
793: if (!command->param1)
794: DecoderUnPause
795: (card);
796: else
797: DecoderPause(card);
798: }
799: return 0;
800: case Decoder_Highlight: // active{param1}, color information(SL_COLI or AC_COLI){data1[4]}, button position(BTN_POSI){data2[6]}
801: return DecoderHighlight(card,
802: command->
803: param1,
804: command->
805: data1,
806: command->
807: data2);
808: case Decoder_SPU: // stream{param1}, active{param2}
809: return DecoderSPUStream(card,
810: command->
811: param1,
812: command->
813: param2);
814: case Decoder_SPU_Palette: // length{param1}, palette{data1}
815: return DecoderSPUPalette(card,
816: command->
817: param1,
818: command->
819: data1);
820: case Decoder_GetNavi: // data1 will be filled with PCI or DSI pack, and 1024 will be returned
821: return DecoderGetNavi(card,
822: command->
823: data1);
824: case Decoder_SetKaraoke: // Vocal1{param1}, Vocal2{param2}, Melody{param3}
825: return DecoderKaraoke(card,
826: command->
827: param1,
828: command->
829: param2,
830: command->
831: param3);
832: case Decoder_Set_Videoattribute:
833: printk(KERN_DEBUG LOGNAME
834: ": -- Decoder_Set_Videoattribute\n");
835: if (!card->ChannelBuffersAllocated) {
836: DecoderStreamReset(card);
837: MargiFlush(card);
838:
839: card->setup.streamtype =
840: stream_DVD;
841: card->setup.videoID = 0;
842: DecoderPrepareVideo(card);
843: DecoderPreparePS(card, 0,
844: 0, 2, 2,
845: 3, 1);
846: }
847:
848: SetVideoAttr(card,
849: command->param1);
1.6 mocm 850: card->startingDVDV = 1;
851: // tell the card to start playing as soon as ES-buffers are sufficiently full
1.1 cvs 852: return 0;
853: case Decoder_Set_Audioattribute:
854: printk(KERN_DEBUG LOGNAME
855: ": -- Decoder_Set_Audioattribute\n");
856: SetAudioAttr(card,
857: command->param1);
858: card->startingDVDA =
859: ((card->setup.audioselect !=
860: audio_none)
861: && (card->setup.audioselect != audio_disable)); // tell the card to start playing as soon as ES-buffers are sufficiently full
862: return 0;
863: case Decoder_WriteBlock: // DVD-Sector{data1}, sectorsize{param1{2048}}, initialsector{param2{bool}}, set_SCR{param3}
864: return DecoderWriteBlock(card,
865: command->
866: data1,
867: command->
868: param1,
869: command->
870: param2,
871: command->
872: param3);
873: default:
874: return -EINVAL;
875: }
876: default:
877: return -EINVAL;
878: } else
879: return -EINVAL;
880: } else {
881: printk(KERN_ERR LOGNAME
882: ": Video Decoder Prepare failed: device with this minor number not found\n");
883: return -ENODEV; // device with this minor number not found
884: }
885: }
886:
1.6 mocm 887:
1.1 cvs 888: static int PSmmap(struct file *file, struct vm_area_struct *vm)
889: {
890: return -ENODEV;
891: }
892:
1.6 mocm 893:
894:
895: static int margi_open(struct video_device *dev, int flags)
1.1 cvs 896: {
1.6 mocm 897: struct cvdv_cards *card = (struct cvdv_cards*)dev;
898:
899: int closed;
1.1 cvs 900: if (card != NULL) {
1.6 mocm 901: printk(KERN_DEBUG LOGNAME ": -- PSopen \n");
1.1 cvs 902: CloseCard(card);
1.5 mocm 903: OSDClose(card);
1.6 mocm 904: #ifdef NOINT
905: card->timer.function = Timerfunction;
906: card->timer.data=(unsigned long) card;
907: card->timer.expires=jiffies+1;
908: add_timer(&card->timer);
909: #endif
910:
911: if (card->open)
1.1 cvs 912: printk(KERN_DEBUG LOGNAME
1.6 mocm 913: ": PSopen - already open\n");
1.1 cvs 914: closed = 1;
1.6 mocm 915: if (card->open)
916: closed = 0;
1.1 cvs 917: if (closed) { // first open() for this card?
918: MargiFreeBuffers(card);
919: VideoSetBackground(card, 1, 0, 0, 0); // black
920: }
1.6 mocm 921: card->open++;
1.1 cvs 922: //MOD_INC_USE_COUNT;
923: return 0;
924: } else {
925: printk(KERN_ERR LOGNAME
926: ": Video Decoder Prepare failed: device with this minor number not found\n");
927: return -ENODEV; // device with this minor number not found
928: }
1.6 mocm 929:
1.1 cvs 930: }
931:
1.6 mocm 932:
933: static int PSopen(struct inode *inode, struct file *file)
1.1 cvs 934: {
935: struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16
1.6 mocm 936: return margi_open((struct video_device *) card,0);
937: }
938:
939:
940: static int all_margi_close(struct video_device *dev)
941: {
942: struct cvdv_cards *card = (struct cvdv_cards*)dev;
943:
944: int closed;
1.4 mocm 945: int count;
946: count = ring_read_rest(&(card->rbuf));
947: if (count > 0 ) card->DMAABusy = 1;
1.1 cvs 948: if (card != NULL) {
949: printk(KERN_DEBUG LOGNAME ": -- PSrelease\n");
1.6 mocm 950: if (!card->open)
1.1 cvs 951: printk(KERN_DEBUG LOGNAME
1.6 mocm 952: ": PSrelease - not open\n");
953: card->open--;
1.4 mocm 954:
1.1 cvs 955: //MOD_DEC_USE_COUNT;
1.6 mocm 956: if (!card->open) {
1.1 cvs 957: closed = 1;
958: if (closed) { // last close() for this card?
959: printk(KERN_DEBUG LOGNAME
960: ": PSrelease - last close\n");
961: // flush remaining data
962:
963: card->channelApos = 0;
964: card->channelBpos = 0;
965:
1.4 mocm 966: if ((card->DMAABusy || card->DMABBusy
967: || count >1000 ) &&
968: (card->intdecodestatus)) {
969: // ongoing DMA?
1.1 cvs 970: printk(KERN_DEBUG LOGNAME
971: ": Delayed closing: A=%d B=%d\n",
972: card->DMAABusy,
973: card->DMABBusy);
974: card->closing = 1; // then delay closing until DMA finished,
975: } else { // otherwise
976: CloseCard(card); // close immediately
1.4 mocm 977: printk(KERN_DEBUG LOGNAME
978: ": closing now\n");
1.1 cvs 979: }
980: }
981: }
982: return 0;
983: } else {
984: printk(KERN_ERR LOGNAME
985: ": Video Decoder Prepare failed: device with this minor number not found\n");
986: return -ENODEV; // device with this minor number not found
987: }
1.6 mocm 988:
989: }
990:
991:
992: static void margi_close(struct video_device *dev)
993: {
994: all_margi_close(dev);
995: }
996:
997: static int PSrelease(struct inode *inode, struct file *file)
998: {
999: struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV]; // minor number modulo 16
1000: return all_margi_close((struct video_device *)card);
1.1 cvs 1001: }
1002:
1003: //////////////////////////
1004: // //
1005: // Char Device Hookup //
1006: // //
1007: //////////////////////////
1008:
1009: // Hookups for a write-only device, that accepts MPEG-2 Program Stream
1010: struct file_operations cvdv_fileops = {
1011: write: PSwrite,
1012: poll: PSpoll,
1013: ioctl: PSioctl,
1014: mmap: PSmmap,
1015: open: PSopen,
1016: release: PSrelease,
1017: };
1.6 mocm 1018:
1019: static int margi_init_done(struct video_device *dev)
1020: {
1021: printk(KERN_ERR "margi: margi_init_done called\n");
1022: return 0;
1023: }
1024:
1025: static int margi_mmap(struct video_device *dev,
1026: const char *adr, unsigned long size)
1027: {
1028: return 0;
1029: }
1030:
1031: static struct video_device margi_template = {
1032: name: "Margi MPEG2 Decoder",
1.8 mocm 1033: type: (VID_TYPE_MPEG_DECODER|VID_TYPE_OVERLAY),
1.6 mocm 1034: open: margi_open,
1035: close: margi_close,
1036: write: margi_write,
1037: ioctl: margi_ioctl,
1038: mmap: margi_mmap,
1039: initialize: margi_init_done,
1040: };
1041:
1042:
1043:
1044: #ifdef DVB
1045:
1046: static inline int
1047: num2type(struct cvdv_cards *card, int num)
1048: {
1049: if (!card->dvb_devs)
1050: return -2;
1051: if (num>=card->dvb_devs->num)
1052: return -2;
1053: return card->dvb_devs->tab[num];
1054: }
1055:
1056: static int
1057: dvbdev_open(struct dvb_device *dvbdev, int num,
1058: struct inode *inode, struct file *file)
1059: {
1060: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1061: int type=num2type(card, num);
1062: int ret=0;
1063:
1064: if (type<0)
1065: return -EINVAL;
1066:
1067: if (card->users[num] >= card->dvb_devs->max_users[num])
1068: return -EBUSY;
1069:
1070: if ((file->f_flags&O_ACCMODE)!=O_RDONLY)
1071: if (card->writers[num] >= card->dvb_devs->max_writers[num])
1072: return -EBUSY;
1073:
1074: switch (type) {
1075: case DVB_DEVICE_VIDEO_0:
1076: card->video_blank=true;
1.9 ! mocm 1077: card->audiostate.AVSyncState=true;
1.6 mocm 1078: card->videostate.streamSource=VIDEO_SOURCE_DEMUX;
1.7 mocm 1079: margi_open((struct video_device *) card, 0);
1080: break;
1.6 mocm 1081:
1082: case DVB_DEVICE_AUDIO_0:
1083: card->audiostate.streamSource=AUDIO_SOURCE_DEMUX;
1084: break;
1085:
1086: case DVB_DEVICE_DEMUX_0:
1087: if ((file->f_flags&O_ACCMODE)!=O_RDWR)
1088: return -EINVAL;
1089: ret=DmxDevFilterAlloc(&card->dmxdev, file);
1090: break;
1091: case DVB_DEVICE_DVR_0:
1092: ret=DmxDevDVROpen(&card->dmxdev, file);
1093: break;
1.9 ! mocm 1094:
! 1095: case DVB_DEVICE_OSD_0:
! 1096: break;
! 1097: default:
1.6 mocm 1098: return -EINVAL;
1099: }
1100: if (ret<0)
1101: return ret;
1102: if ((file->f_flags&O_ACCMODE)!=O_RDONLY)
1103: card->writers[num]++;
1104: card->users[num]++;
1105: return ret;
1106: }
1107:
1108: static int
1109: dvbdev_close(struct dvb_device *dvbdev, int num,
1110: struct inode *inode, struct file *file)
1111: {
1112: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1113: int type=num2type(card, num);
1114: int ret=0;
1115:
1116: if (type<0)
1117: return -EINVAL;
1118:
1119: switch (type) {
1120: case DVB_DEVICE_VIDEO_0:
1121: all_margi_close((struct video_device *)card);
1122: break;
1123:
1124: case DVB_DEVICE_AUDIO_0:
1125: all_margi_close((struct video_device *)card);
1126: break;
1127:
1128: case DVB_DEVICE_DEMUX_0:
1129: ret=DmxDevFilterFree(&card->dmxdev, file);
1130: break;
1131:
1132: case DVB_DEVICE_DVR_0:
1133: ret=DmxDevDVRClose(&card->dmxdev, file);
1134: break;
1.9 ! mocm 1135: case DVB_DEVICE_OSD_0:
! 1136: break;
! 1137: default:
1.6 mocm 1138: return -EINVAL;
1139: }
1140: if (ret<0)
1141: return ret;
1142: if ((file->f_flags&O_ACCMODE)!=O_RDONLY)
1143: card->writers[num]--;
1144: card->users[num]--;
1145: return ret;
1146: }
1147:
1148: static ssize_t
1149: dvbdev_write(struct dvb_device *dvbdev, int num,
1150: struct file *file,
1151: const char *buf, size_t count, loff_t *ppos)
1152: {
1153: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1154: int type=num2type(card, num);
1155:
1156: switch (type) {
1157: case DVB_DEVICE_VIDEO_0:
1158: if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY)
1159: return -EPERM;
1160: return margi_write((struct video_device *)card, buf, count,
1161: file->f_flags&O_NONBLOCK);
1162:
1163: case DVB_DEVICE_AUDIO_0:
1164: if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
1165: return -EPERM;
1166: return count;
1167:
1168: case DVB_DEVICE_DVR_0:
1169: return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos);
1170: default:
1171: return -EOPNOTSUPP;
1172: }
1173: return 0;
1174: }
1175:
1176:
1177: static int
1178: dvbdev_ioctl(struct dvb_device *dvbdev, int num,
1179: struct file *file, unsigned int cmd, unsigned long arg)
1180: {
1181: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1182: void *parg=(void *)arg;
1183: int type=num2type(card, num);
1184:
1185: switch (type) {
1186: case DVB_DEVICE_VIDEO_0:
1187: if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
1188: (cmd!=VIDEO_GET_STATUS))
1189: return -EPERM;
1190:
1191: switch (cmd) {
1192:
1193: case VIDEO_STOP:
1194: DecoderPause(card);
1.9 ! mocm 1195: card->videostate.playState = VIDEO_STOPPED;
! 1196: VideoSetBackground(card, 1, 0, 0, 0);
! 1197:
! 1198: return 0;
1.6 mocm 1199:
1200: case VIDEO_PLAY:
1201:
1202: if (card->videostate.streamSource==
1203: VIDEO_SOURCE_MEMORY) {
1.9 ! mocm 1204: if (card->videostate.playState==VIDEO_FREEZED){
! 1205: DecoderUnPause(card);
! 1206: } else {
! 1207: DecoderUnPause(card);
! 1208: }
1.6 mocm 1209: }
1210: break;
1211:
1212: case VIDEO_FREEZE:
1213: DecoderPause(card);
1214: break;
1215:
1216: case VIDEO_CONTINUE:
1217: if (card->videostate.playState==VIDEO_FREEZED) {
1218: DecoderUnPause(card);
1219: }
1220: break;
1221:
1222: case VIDEO_SELECT_SOURCE:
1223: card->videostate.streamSource=(videoStreamSource_t) arg;
1224: break;
1225:
1226: case VIDEO_SET_BLANK:
1227: card->videostate.videoBlank=(boolean) arg;
1228: break;
1229:
1230: case VIDEO_GET_STATUS:
1231: if(copy_to_user(parg, &card->videostate,
1232: sizeof(struct videoStatus)))
1233: return -EFAULT;
1234: break;
1235:
1236: case VIDEO_GET_EVENT:
1237: return -EOPNOTSUPP;
1238:
1239: case VIDEO_SET_DISPLAY_FORMAT:
1240: {
1241: videoDisplayFormat_t format=(videoDisplayFormat_t) arg;
1242: u16 val=0;
1243:
1244: switch(format) {
1245: case VIDEO_PAN_SCAN:
1246: val=VID_PAN_SCAN_PREF;
1247: break;
1248:
1249: case VIDEO_LETTER_BOX:
1250: val=VID_VC_AND_PS_PREF;
1251: break;
1252:
1253: case VIDEO_CENTER_CUT_OUT:
1254: val=VID_CENTRE_CUT_PREF;
1255: break;
1256:
1257: default:
1258: return -EINVAL;
1259: }
1260:
1261: card->videostate.videoFormat=format;
1262: return 0;
1263: }
1264:
1265: case VIDEO_STILLPICTURE:
1266: {
1267: struct videoDisplayStillPicture pic;
1268:
1269: if(copy_from_user(&pic, parg,
1270: sizeof(struct videoDisplayStillPicture)))
1271: return -EFAULT;
1272:
1273: break;
1274: }
1275:
1276: case VIDEO_FAST_FORWARD:
1277: if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY)
1278: return -EPERM;
1279: break;
1280:
1281: case VIDEO_SLOWMOTION:
1282: if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY)
1283: return -EPERM;
1284:
1285: break;
1286:
1287: case VIDEO_GET_CAPABILITIES:
1288: {
1.8 mocm 1289: int cap=VIDEO_CAP_MPEG1|
1290: VIDEO_CAP_MPEG2|
1291: VIDEO_CAP_SYS|
1292: VIDEO_CAP_PROG|
1293: VIDEO_CAP_SPU|
1294: VIDEO_CAP_NAVI|
1295: VIDEO_CAP_CSS;
1296:
1.6 mocm 1297:
1298: if (copy_to_user(parg, &cap,
1299: sizeof(cap)))
1300: return -EFAULT;
1301: break;
1302: }
1303: default:
1304: return -ENOIOCTLCMD;
1305: }
1306: return 0;
1307:
1308: case DVB_DEVICE_AUDIO_0:
1309: if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
1310: (cmd!=AUDIO_GET_STATUS))
1311: return -EPERM;
1312:
1313: switch (cmd) {
1314:
1315: case AUDIO_STOP:
1316: if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
1317: break;
1318: AudioStopDecode(card);
1319: card->audiostate.playState=AUDIO_STOPPED;
1320: break;
1321:
1322: case AUDIO_PLAY:
1323: if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
1324: break;
1325: AudioSetPlayMode(card, MAUDIO_PLAY);
1326: card->audiostate.playState=AUDIO_PLAYING;
1327: break;
1328:
1329: case AUDIO_PAUSE:
1330: card->audiostate.playState=AUDIO_PAUSED;
1331: AudioSetPlayMode(card, MAUDIO_PAUSE);
1332: break;
1333:
1334: case AUDIO_CONTINUE:
1335: if (card->audiostate.playState==AUDIO_PAUSED) {
1336: card->audiostate.playState=AUDIO_PLAYING;
1337: AudioSetPlayMode(card, MAUDIO_PLAY);
1338: }
1339: break;
1340:
1341: case AUDIO_SELECT_SOURCE:
1342: card->audiostate.streamSource=(audioStreamSource_t) arg;
1343: break;
1344:
1345: case AUDIO_SET_MUTE:
1346: {
1347: AudioMute(card, arg);
1348: card->audiostate.muteState=(boolean) arg;
1349: break;
1350: }
1351:
1352: case AUDIO_SET_AV_SYNC:
1.9 ! mocm 1353: card->videosync=(boolean) arg;
1.6 mocm 1354: card->audiostate.AVSyncState=(boolean) arg;
1355: break;
1356:
1357: case AUDIO_SET_BYPASS_MODE:
1358: return -EINVAL;
1359:
1360: case AUDIO_CHANNEL_SELECT:
1361: card->audiostate.channelSelect=(audioChannelSelect_t) arg;
1362:
1363: switch(card->audiostate.channelSelect) {
1364: case AUDIO_STEREO:
1365: break;
1366:
1367: case AUDIO_MONO_LEFT:
1368: break;
1369:
1370: case AUDIO_MONO_RIGHT:
1371: break;
1372:
1373: default:
1374: return -EINVAL;
1375: }
1376: return 0;
1377:
1378: case AUDIO_GET_STATUS:
1379: if(copy_to_user(parg, &card->audiostate,
1380: sizeof(struct audioStatus)))
1381: return -EFAULT;
1382: break;
1383:
1384: case AUDIO_GET_CAPABILITIES:
1385: {
1386: int cap=AUDIO_CAP_LPCM|
1387: AUDIO_CAP_MP1|
1.8 mocm 1388: AUDIO_CAP_MP2|
1389: AUDIO_CAP_AC3;
1.6 mocm 1390:
1391: if (copy_to_user(parg, &cap,
1392: sizeof(cap)))
1393: return -EFAULT;
1394: break;
1395: }
1396: default:
1397: return -ENOIOCTLCMD;
1398: }
1399: break;
1400:
1401:
1402: case DVB_DEVICE_DEMUX_0:
1403: return DmxDevIoctl(&card->dmxdev, file, cmd, arg);
1404:
1.9 ! mocm 1405: case DVB_DEVICE_OSD_0:
! 1406: {
! 1407: /* switch (cmd) {
! 1408: case OSD_SEND_CMD:
! 1409: {
! 1410: osd_cmd_t doc;
! 1411:
! 1412: if(copy_from_user(&doc, parg,
! 1413: sizeof(osd_cmd_t)))
! 1414: return -EFAULT;
! 1415: return OSD_DrawCommand(dvb, &doc);
! 1416: }
! 1417: default:
! 1418: return -EINVAL;
! 1419: }*/
! 1420: break;
! 1421: }
! 1422: default:
1.6 mocm 1423: return -EOPNOTSUPP;
1424: }
1425: return 0;
1426: }
1427:
1428: static unsigned int
1429: dvbdev_poll(struct dvb_device *dvbdev, int num,
1430: struct file *file, poll_table * wait)
1431: {
1432: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1433: int type=num2type(card, num);
1434:
1435: switch (type) {
1436: case DVB_DEVICE_DEMUX_0:
1437: return DmxDevPoll(&card->dmxdev, file, wait);
1438:
1439: case DVB_DEVICE_VIDEO_0:
1440: return PSpoll(file, wait);
1441:
1442: case DVB_DEVICE_AUDIO_0:
1443: return PSpoll(file, wait);
1444:
1445: case DVB_DEVICE_CA_0:
1446: break;
1447:
1448: default:
1449: return -EOPNOTSUPP;
1450: }
1451:
1452: return 0;
1453: }
1454:
1455:
1456: static int
1457: dvbdev_device_type(struct dvb_device *dvbdev, unsigned int num)
1458: {
1459: struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
1460:
1461: return num2type(card, num);
1462: }
1463: #endif
1464:
1465: /******************************************************************************
1466: * driver registration
1467: ******************************************************************************/
1468:
1469:
1470: void v4l_init(struct cvdv_cards *card)
1471: {
1472:
1473: memcpy( &card->video, &margi_template, sizeof(struct video_device));
1474:
1475: if( 0 > (video_register_device(&card->video, VFL_TYPE_GRABBER))) {
1476: printk(KERN_ERR "margi: can't register videodevice\n");
1477: }
1478: }
1479:
1480: #ifdef DVB
1481:
1482: #define INFU 32768
1483:
1.9 ! mocm 1484:
! 1485:
1.6 mocm 1486: static dvb_devs_t mdvb_devs = {
1.9 ! mocm 1487: 9,
1.6 mocm 1488: {
1.9 ! mocm 1489: DVB_DEVICE_VIDEO_0, DVB_DEVICE_AUDIO_0,
! 1490: -1, -1,
! 1491: DVB_DEVICE_DEMUX_0, DVB_DEVICE_DVR_0,
! 1492: -1, -1,
! 1493: -1//DVB_DEVICE_OSD,
1.6 mocm 1494: },
1.9 ! mocm 1495: { INFU, INFU, INFU, INFU, INFU, 1, 1, INFU, 1 },
! 1496: { 1, 1, 1, 1, INFU, 1, 1, 1, 1}
1.6 mocm 1497: };
1498:
1499: int dvb_register(struct cvdv_cards *card)
1500: {
1501: int i;
1502: struct dvb_device *dvbd=&card->dvb_dev;
1503:
1504: if (card->dvb_registered)
1505: return -1;
1506: card->dvb_registered=1;
1507:
1508: card->audiostate.AVSyncState=0;
1509: card->audiostate.muteState=0;
1510: card->audiostate.playState=AUDIO_STOPPED;
1511: card->audiostate.streamSource=AUDIO_SOURCE_MEMORY;
1512: card->audiostate.channelSelect=AUDIO_STEREO;
1513: card->audiostate.bypassMode=0;
1514:
1515: card->videostate.videoBlank=0;
1516: card->videostate.playState=VIDEO_STOPPED;
1517: card->videostate.streamSource=VIDEO_SOURCE_MEMORY;
1518: card->videostate.videoFormat=VIDEO_FORMAT_4_3;
1519: card->videostate.displayFormat=VIDEO_CENTER_CUT_OUT;
1520:
1521: // init and register demuxes
1522:
1523:
1524: // init and register dvb device structure
1525: dvbd->priv=(void *) card;
1526: dvbd->open=dvbdev_open;
1527: dvbd->close=dvbdev_close;
1528: dvbd->write=dvbdev_write;
1529: dvbd->ioctl=dvbdev_ioctl;
1530: dvbd->poll=dvbdev_poll;
1531: dvbd->device_type=dvbdev_device_type;
1532:
1533: for (i=0; i<DVB_DEVS_MAX; i++)
1534: card->users[i]=card->writers[i]=0;
1535:
1536: card->dvb_devs=0;
1537: card->dvb_devs=&mdvb_devs;
1538:
1539: return dvb_register_device(dvbd);
1540: }
1541:
1542: void dvb_unregister(struct cvdv_cards *card)
1543: {
1544: dvb_unregister_device(&card->dvb_dev);
1545: }
1546: #endif
LinuxTV legacy CVS <linuxtv.org/cvs>