Annotation of margi2/cvdv.c, revision 1.25

1.1       cvs         1: /* 
                      2:     cvdv.c
                      3: 
1.13      mocm        4:     Copyright (C) Christian Wolff 
                      5:                   Marcus Metzler for convergence integrated media.
1.1       cvs         6: 
                      7:     This program is free software; you can redistribute it and/or modify
                      8:     it under the terms of the GNU General Public License as published by
                      9:     the Free Software Foundation; either version 2 of the License, or
                     10:     (at your option) any later version.
                     11: 
                     12:     This program is distributed in the hope that it will be useful,
                     13:     but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:     GNU General Public License for more details.
                     16: 
                     17:     You should have received a copy of the GNU General Public License
                     18:     along with this program; if not, write to the Free Software
                     19:     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     20: */
                     21: 
                     22:       /////////////////////////////////////////////////////////////////////
                     23:      //                                                                 //
                     24:     //   Driver for the Convergence Digital Video decoder card (pci)   //
                     25:    //   with L64017, L64021, PCM1723, and Bt864/Bt865 chipset         //
                     26:   //   (c) Christian Wolff 19990209 for convergence integrated media //
                     27:  //                                                                 //
                     28: /////////////////////////////////////////////////////////////////////
                     29: 
                     30: #define __NO_VERSION__
                     31: 
1.24      mocm       32: //#include <linux/module.h>
1.1       cvs        33: #include "cvdv.h"
1.23      mocm       34: #include "ost/osd.h"
1.1       cvs        35: #include "i2c.h"
                     36: 
                     37:   //////////////////////  
                     38:  // global variables //
                     39: //////////////////////
                     40: 
                     41: // Our major device number
                     42: unsigned int major_device_number;
                     43: 
                     44: 
                     45: // my little random function for memory test
1.12      mocm       46: uint16_t rnd_seed;
                     47: uint16_t rnd(uint16_t range)
1.1       cvs        48: {                              // returns random 0..(range-1) range<=872
1.12      mocm       49:        uint32_t b = 75 * (rnd_seed + 1) - 1;
                     50:        rnd_seed = (uint16_t) (b & 0xFFFF);
1.1       cvs        51:        return ((b * range) / 0xFFFF) - ((b / 0xFFFF) * range);
                     52: }
                     53: void rnd_omize(void)
                     54: {
1.12      mocm       55:        rnd_seed = (uint16_t) jiffies;
1.1       cvs        56: }
                     57: 
1.5       mocm       58: static char *cimlogo[] = {
                     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: ".............................................",
                     96: "............................................."
                     97: };
1.1       cvs        98: 
                     99:     /////////////////////////////////////////////
                    100:    //                                         //
                    101:   //  Controlling the L64021 MPEG-2 Decoder  //
                    102:  //                                         //
                    103: /////////////////////////////////////////////
                    104: 
                    105: int OSDTest(struct cvdv_cards *card)
                    106: {
1.5       mocm      107:        int i, j, col, x0, y0, x1, y1,aspx;
1.12      mocm      108:        uint8_t b;
1.5       mocm      109: 
1.1       cvs       110: 
                    111:        if (!card->OSD.open)
                    112:                return -2;
                    113: 
                    114:        OSDQuery(card, &x0, &y0, &x1, &y1, &aspx);
                    115:        OSDShow(card);
1.5       mocm      116:        OSDSetColor(card, 0, 0, 0, 0, 0, 0, 0);
                    117:        OSDSetColor(card, 1, 128, 255, 255, 0, 0, 0);
                    118:        for ( i = 0; i < cimlogo_width; i++){
                    119:                for ( j = 0; j < cimlogo_height; j++){
                    120:                        b = cimlogo[j][i];
                    121:                        col = (b == '#') ? 1: 0;
                    122:                        OSDSetPixel(card, x0+i, y0+j, col);
1.1       cvs       123:                }
                    124:        }
                    125: 
                    126:        return 0;
                    127: }
                    128: 
                    129: 
                    130: void SetVideoSystem(struct cvdv_cards *card)
                    131: {
1.21      mocm      132:        uint8_t reg;
                    133: 
1.1       cvs       134:        // set the hsync and vsync generators in the L64017 according to the video standard
1.21      mocm      135:        reg = read_indexed_register(card, IIO_VIDEO_CONTROL1);
                    136:        reg &= ~0x03;
1.1       cvs       137:        switch (card->videomode) {
                    138:        case PAL:               // 864*625*50Hz = 27MHz, 25fps
                    139:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x41 | 0x0a);
                    140:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    141:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
                    142:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x96);
                    143:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x15);
                    144:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0x13);
                    145:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x54);
1.21      mocm      146:                reg |= VMS_PAL;
1.1       cvs       147:                break;
                    148:        case PALN:
                    149:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0xa1 | 0x0a);
                    150:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    151:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
                    152:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x96);
                    153:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x15);
                    154:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0x13);
                    155:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x54);
1.21      mocm      156:                reg |= VMS_PAL;
1.1       cvs       157:                break;
                    158: 
                    159:        case PALNc:
                    160:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x81 | 0x0a);
                    161:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    162:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
                    163:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x8c);
                    164:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x28);
                    165:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xed);
                    166:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
1.21      mocm      167:                reg |= VMS_PAL;
1.1       cvs       168:                break;
                    169: 
                    170:        case NTSC:              // 858*525*59.94006Hz = 27MHz, 29.97fps
                    171:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x01 | 0x0a);
                    172:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    173:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x1c);
                    174:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x3e);
                    175:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0xf8);
                    176:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe0);
                    177:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
1.21      mocm      178:                reg |= VMS_NTSC;
1.1       cvs       179:                break;
                    180: 
                    181:        case PALM:
                    182:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x01 | 0x0a);
                    183:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    184:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
                    185:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x4e);
                    186:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x4a);
                    187:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe1);
                    188:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
1.21      mocm      189:                reg |= VMS_PAL;
1.1       cvs       190:                break;
                    191: 
                    192:        case NTSC60:            // 857*525*60.010002Hz = 27MHz, 30fps
                    193:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x21 | 0x0a);
                    194:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    195:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x1c);
                    196:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x3e);
                    197:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0xf8);
                    198:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe0);
                    199:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
1.21      mocm      200:                reg |= VMS_NTSC;
1.1       cvs       201:                break;
                    202: 
                    203:        case PALM60:
                    204:                I2CWrite(card, card->i2c_addr, CS_CONTROL0, 0x61 | 0x0a);
                    205:                I2CWrite(card, card->i2c_addr, CS_CONTROL1, 0x04);
                    206:                I2CWrite(card, card->i2c_addr, CS_SC_AMP, 0x15);
                    207:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH0, 0x4e);
                    208:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH1, 0x4a);
                    209:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH2, 0xe1);
                    210:                I2CWrite(card, card->i2c_addr, CS_SC_SYNTH3, 0x43);
1.21      mocm      211:                reg |= VMS_PAL;
1.1       cvs       212:                break;
                    213: 
                    214:        case PAL60:
                    215:                break;
                    216:        }
1.21      mocm      217:        write_indexed_register(card, IIO_VIDEO_CONTROL1, reg);
1.1       cvs       218:        // set the pixel generators according to the video standard
                    219:        L64021Setup(card);
                    220: }
                    221: 
1.12      mocm      222: int SetVideoAttr(struct cvdv_cards *card, uint16_t vattr)
1.1       cvs       223: {
1.12      mocm      224:        uint8_t video_compression_mode;
                    225:        uint8_t tv_system;
                    226:        uint8_t aspect_ratio;
                    227:        uint8_t display_mode;
                    228:        uint8_t line_21_switch_1;
                    229:        uint8_t line_21_switch_2;
                    230:        uint8_t source_picture_resolution;
                    231:        uint8_t source_picture_letterboxed;
                    232:        uint8_t reserved;
                    233:        uint8_t film_camera_mode;
                    234:        uint16_t hsize, vsize;
1.1       cvs       235:        if (vattr != card->lastvattr) {
                    236:                video_compression_mode = (vattr >> 14) & 0x03;
                    237:                tv_system = (vattr >> 12) & 0x03;
                    238:                aspect_ratio = (vattr >> 10) & 0x03;
                    239:                display_mode = (vattr >> 8) & 0x03;
                    240:                line_21_switch_1 = (vattr >> 7) & 0x01;
                    241:                line_21_switch_2 = (vattr >> 6) & 0x01;
                    242:                source_picture_resolution = (vattr >> 3) & 0x07;
                    243:                source_picture_letterboxed = (vattr >> 2) & 0x01;
                    244:                reserved = (vattr >> 1) & 0x01;
                    245:                film_camera_mode = (vattr >> 0) & 0x01;
                    246:                card->videomode =
                    247:                        ((tv_system == 0) ? NTSC : ((tv_system == 1) ? 
                    248:                                                    PAL : PAL));        
                    249:                SetVideoSystem(card);
                    250:                hsize =
                    251:                        ((source_picture_resolution == 0) ? 720
                    252:                         : ((source_picture_resolution == 1) ? 702 : 352));
                    253:                vsize = ((source_picture_resolution == 3)
                    254:                         ? ((tv_system == 0) ? 240 : 288)
                    255:                         : ((tv_system == 0) ? 480 : 576));
                    256:                if (DecoderOpen
                    257:                    (card, hsize, vsize, ((aspect_ratio) ? 3 : 2),
                    258:                     ((video_compression_mode) ? 0 : 1),
                    259:                     source_picture_letterboxed, tv_system)) {  
1.14      mocm      260:                        MDEBUG(0,
1.1       cvs       261:                               ": Video Decoder Open failed: On-card memory insufficient for frame stores\n");
                    262:                }
                    263:                card->lastvattr = vattr;
                    264:        } else {
1.14      mocm      265:                MDEBUG(0,
1.1       cvs       266:                       ": Video attribute not set, equal to previous one.\n");
                    267:        }
                    268:        return 0;
                    269: }
                    270: 
1.12      mocm      271: int SetAudioAttr(struct cvdv_cards *card, uint16_t aattr)
1.1       cvs       272: {
1.12      mocm      273:        uint8_t audio_coding_mode;
                    274:        uint8_t multichannel_extension;
                    275:        uint8_t audio_type;
                    276:        uint8_t audio_application_mode;
                    277:        uint8_t quantization_drc;
                    278:        uint8_t fs;
                    279:        uint8_t reserved;
                    280:        uint8_t num_audio_ch;
1.1       cvs       281:        if (aattr) {
                    282:                if (aattr != card->lastaattr) {
                    283:                        audio_coding_mode = (aattr >> 13) & 0x07;
                    284:                        multichannel_extension = (aattr >> 12) & 0x01;
                    285:                        audio_type = (aattr >> 10) & 0x03;
                    286:                        audio_application_mode = (aattr >> 8) & 0x03;
                    287:                        quantization_drc = (aattr >> 6) & 0x03;
                    288:                        fs = (aattr >> 4) & 0x03;
                    289:                        reserved = (aattr >> 3) & 0x01;
                    290:                        num_audio_ch = (aattr >> 0) & 0x07;
                    291:                        switch (audio_coding_mode) {
                    292:                        case 0: // AC-3
                    293:                                card->setup.audioselect = audio_AC3;
                    294:                                break;
                    295:                        case 2: // MPEG Audio
                    296:                                card->setup.audioselect = audio_MPEG;
                    297:                                break;
                    298:                        case 3: // MPEG Audio with ext.
                    299:                                card->setup.audioselect = audio_MPEG_EXT;
                    300:                                break;
                    301:                        case 4: // Linear Pulse Code Modulation LPCM
                    302:                                card->setup.audioselect = audio_LPCM;
                    303:                                break;
                    304:                        case 6: // DTS
                    305:                                card->setup.audioselect = audio_DTS;
                    306:                                break;
                    307:                        case 7: // SDDS
                    308:                                card->setup.audioselect = audio_SDDS;
                    309:                                break;
                    310:                        }
                    311:                        DecoderPrepareAudio(card);
                    312:                        AudioInit(card, ((fs) ? 96 : 48),
                    313:                                  ((audio_application_mode == 2) ? 1 : 0));
                    314:                } else {
1.14      mocm      315:                        MDEBUG(0,
1.1       cvs       316:                               ": Audio attribute not set, equal to previous one.\n");
                    317:                }
                    318:        } else {
                    319:                card->setup.audioselect = audio_none;
                    320:                DecoderPrepareAudio(card);
                    321:        }
                    322:        card->lastaattr = aattr;
                    323:        return 0;
                    324: }
                    325: 
                    326: int Prepare(struct cvdv_cards *card)
                    327: {
                    328:        int err, h;
                    329:        struct StreamSetup *setup = &card->setup;
                    330: 
                    331:        if (!card->ChannelBuffersAllocated) {
                    332:                        
                    333:                DecoderStreamReset(card);
                    334:                if (setup->streamtype == stream_none) {
                    335:                        setup->streamtype = stream_PS; 
                    336:                }
                    337:                
                    338:                if (setup->audioselect == audio_none) {
                    339:                        setup->audioselect = audio_MPEG;
                    340:                }
                    341: 
                    342:                DecoderPrepareAudio(card);
                    343:                AudioMute(card, 1);
                    344:                DecoderPrepareVideo(card);
                    345:                VideoSetBackground(card, 1, 0, 0, 0);   // black
                    346: 
                    347:                switch (setup->streamtype) {
                    348:                default:
                    349:                case stream_none:       // unknown stream!
1.14      mocm      350:                        MDEBUG(0,
1.1       cvs       351:                               ": Video Decoder Prepare failed: unknown stream type\n");
                    352:                        return -ENODEV; // not an MPEG stream!
                    353:                case stream_ES: // Elementary Stream
                    354:                        err = DecoderPrepareES(card);
                    355:                        break;
                    356:                case stream_PES:        // Packetized Elementary Stream
                    357:                        err = DecoderPreparePES(card);
                    358:                        break;
                    359:                case stream_PS: // MPEG-1 System Stream / MPEG-2 Program Stream
                    360:                        err = DecoderPreparePS(card, -1, 0, 0, 0, 0, 0);
                    361:                        break;
                    362:                case stream_DVD:        // DVD Stream
                    363:                        err = DecoderPreparePS(card, 0, 0, 0, 0, 3, 1);
                    364:                        break;
                    365:                }
                    366:                if (err) {      // insufficient memory
1.14      mocm      367:                        MDEBUG(0,
1.1       cvs       368:                               ": Video Decoder Prepare failed: no kernel memory, please reboot if possible\n");
                    369:                        CloseCard(card);
                    370:                        return -ENODEV;
                    371:                }
                    372:        }
                    373: 
                    374:        // Set up the Video Decoder as we have the stream information
                    375:        if ((!card->FrameBuffersAllocated)
                    376:            && (card->ChannelBuffersAllocated) && (card->stream.sh.valid)) {
                    377:                //  Automatic PAL/NTSC-switch according to MPEG-Source
                    378:                h = card->stream.vsize;
                    379:                if (h < 480)
                    380:                        h *= 2; // catch quarter sized images
                    381:                printk(KERN_INFO LOGNAME ": Video mode: %s\n",
                    382:                       ((h == 480) ? "NTSC" : "PAL"));
                    383:                card->videomode = ((h == 480) ? NTSC : PAL);
                    384:                SetVideoSystem(card);
                    385:                // Open the Video Decoder with the parameters retreived from the stream
                    386:                if (
                    387:                    (err =
                    388:                     DecoderOpen(card, card->stream.hsize,
                    389:                                 card->stream.vsize,
                    390:                                 card->stream.sh.aspectratio,
                    391:                                 !card->stream.MPEG2, 0,
1.2       rjkm      392:                                 (card->stream.hsize > 480)))) {        // TODO: include vbvbuffersize
1.14      mocm      393:                        MDEBUG(0,
1.1       cvs       394:                               ": Video Decoder Open failed: %s\n",
                    395:                               ((err == 1) ?
                    396:                                "Picture size too big (>1440 pixel wide)" :
                    397:                                "On-card memory insufficient for frame stores"));
                    398:                        CloseCard(card);
                    399:                        return -ENODEV; // picture too big or insufficient memory
                    400:                }
1.14      mocm      401:                MDEBUG(1, ": Ready to go\n");
1.1       cvs       402:                card->startingV = 1;    // tell the card to start playing as soon as ES-buffers are sufficiently full
                    403:                card->startingA = 1;    // tell the card to start playing as soon as ES-buffers are sufficiently full
                    404:        }
                    405:        
                    406: 
                    407:        return 0;
                    408: }
                    409: 
1.12      mocm      410: int SetSCRstart(struct cvdv_cards *card, uint32_t SCR_base)
1.1       cvs       411: {
1.12      mocm      412:        uint32_t SCR_compare;
                    413:        uint32_t SCR_compareA;
                    414:        uint32_t SCR_compareV;
1.1       cvs       415:        if (card->startingV) {
1.14      mocm      416:                MDEBUG(0, ": SCR in DVD Pack: 0x%08X\n",
1.1       cvs       417:                       SCR_base);
                    418:                card->startingV = 0;
                    419:                card->startingA = 0;
                    420:                DecoderMaskByte(card, 0x007, 0xD2, 0xD2);       // Set 0x010, halt SCR counter
                    421:                SCR_compare = SCR_base + 000;
                    422:                if (SCR_base < 900)
                    423:                        SCR_base = 0;
                    424:                else
                    425:                        SCR_base -= 900;
                    426:                //DecoderWriteDWord(card,0x009,SCR_base);  // Set SCR counter
                    427:                DecoderWriteByte(card, 0x009, SCR_base & 0xFF); // Set SCR counter
                    428:                DecoderWriteByte(card, 0x00A, (SCR_base >> 8) & 0xFF);
                    429:                DecoderWriteByte(card, 0x00B, (SCR_base >> 16) & 0xFF);
                    430:                DecoderWriteByte(card, 0x00C, (SCR_base >> 24) & 0xFF);
                    431:                DecoderMaskByte(card, 0x011, 0x03, 0x02);       // compare, not capture
1.14      mocm      432:                MDEBUG(0, ": SCR compare value: 0x%08X\n",
1.1       cvs       433:                       SCR_compare);
                    434:                //DecoderWriteDWord(card,0x00D,SCR_compare);  // Set Compare register
                    435:                DecoderWriteByte(card, 0x00D, SCR_compare & 0xFF);      // Set Compare register
                    436:                DecoderWriteByte(card, 0x00E, (SCR_compare >> 8) & 0xFF);
                    437:                DecoderWriteByte(card, 0x00F, (SCR_compare >> 16) & 0xFF);
                    438:                DecoderWriteByte(card, 0x010, (SCR_compare >> 24) & 0xFF);
                    439:                //DecoderWriteDWord(card,0x014,SCR_compare);  // Set audio compare reg.
                    440:                DecoderWriteByte(card, 0x014, SCR_compare & 0xFF);      // Set audio compare reg.
                    441:                DecoderWriteByte(card, 0x015, (SCR_compare >> 8) & 0xFF);
                    442:                DecoderWriteByte(card, 0x016, (SCR_compare >> 16) & 0xFF);
                    443:                DecoderWriteByte(card, 0x017, (SCR_compare >> 24) & 0xFF);
                    444:                DecoderSetByte(card, 0x013, 0x03);      // Video and Audio start on cmp.
                    445:                //DecoderSetVideoPanic(card,0,DecoderGetVideoESSize(card)/4);  // video panic at 25 percent
                    446:                VideoSetBackground(card, 1, 0, 0, 0);   // black
                    447:                SCR_base = DecoderReadByte(card, 0x009);
                    448:                SCR_base =
1.12      mocm      449:                    SCR_base | ((uint32_t) DecoderReadByte(card, 0x00A) << 8);
1.1       cvs       450:                SCR_base =
1.12      mocm      451:                    SCR_base | ((uint32_t) DecoderReadByte(card, 0x00B) << 16);
1.1       cvs       452:                SCR_base =
1.12      mocm      453:                    SCR_base | ((uint32_t) DecoderReadByte(card, 0x00C) << 24);
1.1       cvs       454:                SCR_compareA = DecoderReadByte(card, 0x014);
                    455:                SCR_compareA =
1.12      mocm      456:                    SCR_compareA | ((uint32_t) DecoderReadByte(card, 0x015) <<
1.1       cvs       457:                                    8);
                    458:                SCR_compareA =
1.12      mocm      459:                    SCR_compareA | ((uint32_t) DecoderReadByte(card, 0x016) <<
1.1       cvs       460:                                    16);
                    461:                SCR_compareA =
1.12      mocm      462:                    SCR_compareA | ((uint32_t) DecoderReadByte(card, 0x017) <<
1.1       cvs       463:                                    24);
                    464:                SCR_compareV = DecoderReadByte(card, 0x00D);
                    465:                SCR_compareV =
1.12      mocm      466:                    SCR_compareV | ((uint32_t) DecoderReadByte(card, 0x00E) <<
1.1       cvs       467:                                    8);
                    468:                SCR_compareV =
1.12      mocm      469:                    SCR_compareV | ((uint32_t) DecoderReadByte(card, 0x00F) <<
1.1       cvs       470:                                    16);
                    471:                SCR_compareV =
1.12      mocm      472:                    SCR_compareV | ((uint32_t) DecoderReadByte(card, 0x010) <<
1.1       cvs       473:                                    24);
                    474:                if (DecoderReadByte(card, 0x013) & 0x03)
1.14      mocm      475:                        MDEBUG(1,": SCR 0x%08X, videocmp=0x%08X, audiocmp=0x%08X %02X\n",
1.1       cvs       476:                               SCR_base, SCR_compareV, SCR_compareA,
                    477:                               DecoderReadByte(card, 0x013));
                    478:                DecoderMaskByte(card, 0x007, 0xD2, 0xC2);       // Del 0x010, SCR counter run
                    479:        }
                    480:        return 0;
                    481: }
                    482: 
1.12      mocm      483: int DecoderWriteBlock(struct cvdv_cards *card, uint8_t * data, int size,
1.1       cvs       484:                      int initial, int setSCR)
                    485: {
                    486:        //int a,v,as,vs,ap,vp;
                    487:        int res;
1.12      mocm      488:        uint32_t SCR_base;
1.1       cvs       489:        int co = 0;
1.12      mocm      490:        //  uint32_t SCR_compare;
1.1       cvs       491:        res = 0;
1.6       mocm      492:        
                    493:        Prepare(card);
1.1       cvs       494: 
                    495:        if (size > 0) {
                    496: 
1.14      mocm      497:                if (!card->use_ringA)
1.17      mocm      498:                        MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE,0);
1.1       cvs       499:                
                    500:                if (card->startingDVDV || card->startingDVDA)
                    501:                        setSCR = 1;
                    502: 
                    503:                if (initial) {
                    504:                        DecoderStreamReset(card);
                    505:                        //TODO stop and start channel interface
                    506:                        setSCR = 1;
                    507:                }
                    508: 
                    509:                if (setSCR) {
                    510:                        SCR_base = ParseSCR(data);
                    511:                        SetSCR(card, SCR_base);
                    512:                }
1.6       mocm      513:                card->DMAABusy = 0;
1.14      mocm      514:                while (((res = MargiPushA(card, size, data)) < size) 
1.6       mocm      515:                       && co < 1000) {  
1.1       cvs       516:                        data+=res;
                    517:                        size-=res;
                    518:                        co++;
1.14      mocm      519:                        MDEBUG(2,
                    520:                               ": DecoderWriteBlock - buffers only filled with %d instead of %d bytes\n",res, size);
1.10      mocm      521:                        if (card->DMAABusy){
1.1       cvs       522:                                interruptible_sleep_on(&card->wqA);     
1.10      mocm      523:                        }
1.1       cvs       524:                }
                    525: 
                    526:                if (card->startingDVDV) {
                    527:                        card->startingDVDV = 0;
1.6       mocm      528:                        card->startingV = 1;
1.1       cvs       529:                        DecoderStartDecode(card);
                    530:                }
                    531:                if (card->startingDVDA) {
                    532:                        card->startingDVDA = 0;
1.6       mocm      533:                        card->startingA = 1;
                    534:                        AudioSetPlayMode(card, MAUDIO_PLAY);
1.1       cvs       535:                }
                    536:        }
                    537:        return 0;
                    538: }
                    539: 
                    540: 
                    541: 
                    542: 
                    543: 
                    544:     //////////////////////////////
                    545:    //                          //
                    546:   //  Char Device Procedures  //
                    547:  //                          //
                    548: //////////////////////////////
1.11      mocm      549: static long margi_write(struct cvdv_cards *card, const char *data,
1.6       mocm      550:                       unsigned long count, int nonblock)
1.1       cvs       551: {
1.11      mocm      552: 
1.1       cvs       553:        int res;
1.10      mocm      554:        long int out=0;
1.17      mocm      555:        int free;
                    556: 
                    557:        free = ring_write_rest(&(card->rbufA));
1.10      mocm      558: 
1.1       cvs       559:        if (card != NULL) {
1.21      mocm      560:                card->nonblock = nonblock;
1.1       cvs       561:                if (count > 0) {        // Do we have data?
                    562:                        if ((res = Prepare(card)))
                    563:                                return res;
1.17      mocm      564:                        if (!card->use_ringA)
                    565:                                MargiSetBuffers(card, NBBUF*CHANNELBUFFERSIZE,
                    566:                                                0);
                    567:                        if (!nonblock && 
1.21      mocm      568:                            !wait_event_interruptible(
                    569:                                    card->wqA, 
                    570:                                    ring_write_rest(&(card->rbufA)) >count )){
                    571:                                
1.17      mocm      572:                                out = MargiPushA(card, count,
                    573:                                                 data);
                    574:                        } else {
                    575:                                out = MargiPushA(card, count, data);
1.14      mocm      576:                        }
                    577:                }
                    578:                return out;
                    579:        } else {
                    580:                MDEBUG(0,
                    581:                       ": Video Decoder Prepare failed: device with this minor number not found\n");
                    582:                return -ENODEV; // device with this minor number not found
                    583:        }
                    584: }      
                    585: 
1.17      mocm      586: 
1.14      mocm      587: static long margi_write_audio(struct cvdv_cards *card, const char *data,
                    588:                       unsigned long count, int nonblock)
                    589: {
                    590:        struct StreamSetup *setup = &card->setup;
1.1       cvs       591: 
1.14      mocm      592:        int res;
                    593:        long int out=0;
1.17      mocm      594:        int free;
                    595: 
                    596:        free = ring_write_rest(&(card->rbufB));
1.1       cvs       597: 
1.14      mocm      598:        if (card != NULL) {
1.21      mocm      599:                card->nonblock = nonblock;
                    600:        
1.14      mocm      601:                if (count > 0) {        // Do we have data?
                    602:                        if ((res = Prepare(card)))
                    603:                                return res;
                    604:                        if ((setup->streamtype == stream_ES)
1.17      mocm      605:                            || (setup->streamtype == stream_PES)){
1.14      mocm      606:                                if (!card->use_ringB)
1.17      mocm      607:                                        MargiSetBuffers(card, NBBUF*
                    608:                                                          CHANNELBUFFERSIZE,1);
                    609:                                if (!nonblock && 
1.21      mocm      610:                                    !wait_event_interruptible(
                    611:                                            card->wqB, 
                    612:                                            ring_write_rest(&(card->rbufB))
                    613:                                            > count)){
1.17      mocm      614:                                        out = MargiPushB(card, count,
                    615:                                                         data);
                    616:                                } else {
1.14      mocm      617:                                        out = MargiPushB(card, count, data);
                    618:                                }
1.1       cvs       619:                        }
                    620:                }
1.10      mocm      621:                return out;
1.1       cvs       622:        } else {
1.14      mocm      623:                MDEBUG(0,
1.1       cvs       624:                       ": Video Decoder Prepare failed: device with this minor number not found\n");
                    625:                return -ENODEV; // device with this minor number not found
                    626:        }
1.6       mocm      627: }      
                    628: 
1.12      mocm      629: void pes_write(uint8_t *buf, int count, void *priv)
                    630: {
                    631:        struct cvdv_cards *card = (struct cvdv_cards *) priv;
1.14      mocm      632:        
                    633:        margi_write(card, buf, count, 0);
1.12      mocm      634: }
                    635: 
1.6       mocm      636: 
                    637: static ssize_t PSwrite(struct file *file, const char *data, size_t count,
                    638:                       loff_t * offset)
                    639: {
                    640:        struct cvdv_cards *card =
                    641:            minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
1.17      mocm      642:        return margi_write(card, data, count, file->f_flags&O_NONBLOCK);
1.1       cvs       643: }
                    644: 
                    645: static unsigned int PSpoll(struct file *file, poll_table * table)
                    646: {
                    647:        struct cvdv_cards *card =
                    648:            minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
                    649:        if (card != NULL) {
1.9       mocm      650:                poll_wait(file, &card->wqA , table);
1.14      mocm      651:                if  (  !card->rbufA.buffy || ring_write_rest(&(card->rbufA)) )
                    652:                        return (POLLOUT | POLLWRNORM);  
                    653:                else {
                    654:                        return 0;
                    655:                }
1.1       cvs       656:        } else
1.8       mocm      657:                return POLLERR;
1.1       cvs       658: }
                    659: 
1.17      mocm      660: static unsigned int poll_audio(struct file *file, poll_table * table)
                    661: {
                    662:        struct cvdv_cards *card =
                    663:            minorlist[MINOR(file->f_dentry->d_inode->i_rdev) % MAXDEV]; // minor number modulo 16
                    664:        if (card != NULL) {
                    665:                poll_wait(file, &card->wqB, table);
                    666:                if  (  !card->rbufB.buffy || ring_write_rest(&(card->rbufB)) )
                    667:                        return (POLLOUT | POLLWRNORM);  
                    668:                else {
                    669:                        return 0;
                    670:                }
                    671:        } else
                    672:                return POLLERR;
                    673: }
                    674: 
1.13      mocm      675: static int
                    676: OSD_DrawCommand(struct cvdv_cards *card,osd_cmd_t *dc)
                    677: {
                    678: 
                    679:        switch (dc->cmd) {
                    680:        case OSD_Close:
1.14      mocm      681:                MDEBUG(1,": OSD Close\n");
1.13      mocm      682:                return OSDClose(card);
                    683:        case OSD_Open:  // Open(x0,y0,x1,y1,BitPerPixel(2/4/8),mix(0..15))
                    684:                return OSDOpen(card, dc->x0,
                    685:                               dc->y0, dc->x1,
                    686:                               dc->y1,
                    687:                               dc->color & 0x0F,
                    688:                               (dc->color >> 4) &
                    689:                               0x0F);
                    690:        case OSD_Show:
                    691:                return OSDShow(card);
                    692:        case OSD_Hide:
                    693:                return OSDHide(card);
                    694:        case OSD_Clear:
                    695:                return OSDClear(card);
                    696:        case OSD_Fill:  // Fill(color)
                    697:                return OSDFill(card, dc->color);
                    698:        case OSD_SetColor:    // SetColor(color,R(x0),G(y0),B(x1),opacity(y1))
                    699:                return (OSDSetColor
                    700:                        (card, dc->color, dc->x0,
                    701:                         dc->y0, dc->x1, 0,
                    702:                         (dc->y1 != 255),
                    703:                         (dc->y1 == 0)) >= 0);
                    704:        case OSD_SetPalette:// SetPalette(firstcolor{color},lastcolor{x0},data)
                    705:                return OSDSetPalette(card,
                    706:                                     dc->color,
                    707:                                     dc->x0, (uint8_t *)
                    708:                                     dc->data);
                    709:        case OSD_SetTrans:      // SetTrans(transparency{color})
                    710:                return OSDSetTrans(card,
                    711:                                   (dc->color >> 4)
                    712:                                   & 0x0F);
                    713:        case OSD_SetPixel:      // SetPixel(x0,y0,color)
                    714:                return OSDSetPixel(card, dc->x0,
                    715:                                   dc->y0,
                    716:                                   dc->color);
                    717:        case OSD_GetPixel:      // GetPixel(x0,y0);
                    718:                return OSDGetPixel(card, dc->x0,
                    719:                                   dc->y0);
                    720:        case OSD_SetRow:        // SetRow(x0,y0,x1,(uint8_t*)data)
                    721:                return OSDSetRow(card, dc->x0,
                    722:                                 dc->y0, dc->x1,
                    723:                                 (uint8_t *) dc->data);
                    724:        case OSD_SetBlock:      // SetBlock(x0,y0,x1,y1,(uint8_t*)data)
                    725:                return OSDSetBlock(card, dc->x0,
                    726:                                   dc->y0, dc->x1,
                    727:                                   dc->y1,
                    728:                                   dc->color,
                    729:                                   (uint8_t *)
                    730:                                   dc->data);
                    731:        case OSD_FillRow:       // FillRow(x0,y0,x1,color)
                    732:                return OSDFillRow(card, dc->x0,
                    733:                                  dc->y0, dc->x1,
                    734:                                  dc->color);
                    735:        case OSD_FillBlock:     // FillRow(x0,y0,x1,y1,color)
                    736:                return OSDFillBlock(card, dc->x0,
                    737:                                    dc->y0, dc->x1,
                    738:                                    dc->y1,
                    739:                                    dc->color);
                    740:        case OSD_Line:  // Line(x0,y0,x1,y1,color);
                    741:                return OSDLine(card, dc->x0,
                    742:                               dc->y0, dc->x1,
                    743:                               dc->y1, dc->color);
                    744:        case OSD_Query: // Query(x0,y0,x1,y1,aspect(color:11)
                    745:                return OSDQuery(card, &dc->x0,
                    746:                                &dc->y0, &dc->x1,
                    747:                                &dc->y1,
                    748:                                &dc->color);
                    749:        case OSD_Test:
                    750:                return OSDTest(card);
                    751:        default:
                    752:                return -EINVAL;
                    753:        }
                    754: }
                    755: 
1.6       mocm      756: 
1.1       cvs       757: static int PSioctl(struct inode *inode, struct file *file,
                    758:                   unsigned int cmd, unsigned long arg)
                    759: {
                    760:        struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV];     // minor number modulo 16
1.13      mocm      761:        osd_cmd_t *dc;
1.1       cvs       762:        struct decodercmd *command;
1.12      mocm      763:        uint16_t attr;
1.10      mocm      764: 
1.1       cvs       765:        if (card != NULL) {
                    766:                if (_IOC_TYPE(cmd) == CVDV_IOCTL_MAGIC)
                    767:                        switch (_IOC_NR(cmd)) {
                    768:                        case IOCTL_DRAW:        // Drawing commands
1.13      mocm      769:                                dc = (osd_cmd_t *) arg;
                    770:                                return OSD_DrawCommand(card,dc);
                    771:                                break;
1.1       cvs       772:                        case IOCTL_DECODER:
                    773:                                command = (struct decodercmd *) arg;
                    774:                                switch (command->cmd) {
1.10      mocm      775: 
                    776:                                case Decoder_CSS:
1.1       cvs       777:                                  /*
                    778:                                        return DecoderCSS(card,
                    779:                                                          command->param1,
                    780:                                                          command->data1);
                    781:                                  */
1.10      mocm      782:                                  break;
                    783: 
1.1       cvs       784:                                case Decoder_Set_Videosystem:
1.14      mocm      785:                                        MDEBUG(1,": -- Decoder_Set_Videosystem\n");
1.1       cvs       786:                                        card->videomode =
                    787:                                            (videosystem) command->param1;
                    788:                                        SetVideoSystem(card);
                    789:                                        return 0;
1.10      mocm      790:                                        break;
                    791: 
1.1       cvs       792:                                case Decoder_Set_Streamtype:
1.14      mocm      793:                                        MDEBUG(1,": -- Decoder_Set_Streamtype\n");
1.1       cvs       794:                                        card->setup.streamtype =
                    795:                                            (stream_type) command->param1;
                    796:                                        return 0;
1.10      mocm      797:                                        break;
                    798: 
1.1       cvs       799:                                case Decoder_Set_Audiotype:
1.14      mocm      800:                                        MDEBUG(1,": -- Decoder_Set_Audiotype\n");
1.1       cvs       801:                                        card->setup.audioselect =
                    802:                                            (audio_type) command->param1;
                    803:                                        DecoderPrepareAudio(card);
                    804:                                        return 0;
1.10      mocm      805:                                        break;
                    806: 
1.1       cvs       807:                                case Decoder_Set_VideoStreamID:
1.14      mocm      808:                                        MDEBUG(1,": -- Decoder_Set_VideoStreamID\n");
1.1       cvs       809:                                        card->setup.videoID =
                    810:                                            command->param1;
                    811:                                        DecoderPrepareVideo(card);
                    812:                                        return 0;
1.10      mocm      813:                                        break;
                    814: 
1.1       cvs       815:                                case Decoder_Set_AudioStreamID:
1.14      mocm      816:                                        MDEBUG(1,": -- Decoder_Set_AudioStreamID 0x%02X 0x%02X\n",
                    817:                                               command->param1,command->param2);
1.1       cvs       818:                                        card->setup.audioID =
                    819:                                            command->param1;
                    820:                                        card->setup.audioIDext =
                    821:                                            command->param2;
                    822:                                        attr = card->lastaattr;
                    823:                                        DecoderSelectAudioID(card);
                    824:                                        card->lastaattr = attr;
                    825:                                        return 0;
1.10      mocm      826:                                        break;
                    827: 
1.1       cvs       828:                                case Decoder_Still_Put:
                    829:                                        return DecoderShowStill(card,
                    830:                                                                command->
                    831:                                                                param1,
                    832:                                                                command->
                    833:                                                                param2,
                    834:                                                                command->
                    835:                                                                data1,
                    836:                                                                command->
                    837:                                                                data2);
1.10      mocm      838:                                        break;
                    839: 
1.1       cvs       840:                                case Decoder_Still_Get:
                    841:                                        return DecoderGetStill(card,
                    842:                                                               &command->
                    843:                                                               param1,
                    844:                                                               &command->
                    845:                                                               param2,
                    846:                                                               command->
                    847:                                                               data1,
                    848:                                                               command->
                    849:                                                               data2);
1.10      mocm      850:                                        break;
                    851: 
1.1       cvs       852:                                case Decoder_Pause:     // pause{param1}  0=run 1=pause 2=toggle
                    853:                                        if (command->param1 == 2) {
                    854:                                                if (card->paused)
                    855:                                                        DecoderUnPause
                    856:                                                            (card);
                    857:                                                else
                    858:                                                        DecoderPause(card);
                    859:                                        } else {
                    860:                                                if (!command->param1)
                    861:                                                        DecoderUnPause
                    862:                                                            (card);
                    863:                                                else
                    864:                                                        DecoderPause(card);
                    865:                                        }
                    866:                                        return 0;
1.10      mocm      867: 
                    868:                                        /* Too buggy                            
                    869:                                case Decoder_FFWD:      // pause{param1}  =normal 1=ffwd 2=toggle
                    870:                                        if (command->param1 == 2) {
                    871:                                                if (card->videoffwd)
                    872:                                                        card->videoffwd = 0;
                    873:                                                else
1.13      mocm      874:                                                        card->videoffwd = 3;
1.10      mocm      875:                                        } else {
                    876:                                                if (!command->param1)
                    877:                                                        card->videoffwd = 0;
                    878:                                                else
1.13      mocm      879:                                                        card->videoffwd = 3;
1.10      mocm      880:                                        }
                    881:                                        return 0;
                    882: 
                    883:                                case Decoder_Slow:      // pause{param1}  =normal 1=slow 2=toggle
                    884:                                        if (command->param1 == 2) {
                    885:                                                if (card->videoslow)
                    886:                                                        card->videoslow = 0;
                    887:                                                else
                    888:                                                        card->videoslow = 4;
                    889:                                        } else {
                    890:                                                if (!command->param1)
                    891:                                                        card->videoslow = 0;
                    892:                                                else
                    893:                                                        card->videoslow = 4;
                    894:                                        }
                    895:                                        return 0;
                    896:                                        */
1.1       cvs       897:                                case Decoder_Highlight: // active{param1}, color information(SL_COLI or AC_COLI){data1[4]}, button position(BTN_POSI){data2[6]}
                    898:                                        return DecoderHighlight(card,
                    899:                                                                command->
                    900:                                                                param1,
                    901:                                                                command->
                    902:                                                                data1,
                    903:                                                                command->
                    904:                                                                data2);
                    905:                                case Decoder_SPU:       // stream{param1}, active{param2}
                    906:                                        return DecoderSPUStream(card,
                    907:                                                                command->
                    908:                                                                param1,
                    909:                                                                command->
                    910:                                                                param2);
                    911:                                case Decoder_SPU_Palette:       // length{param1}, palette{data1}
                    912:                                        return DecoderSPUPalette(card,
                    913:                                                                 command->
                    914:                                                                 param1,
                    915:                                                                 command->
                    916:                                                                 data1);
                    917:                                case Decoder_GetNavi:   // data1 will be filled with PCI or DSI pack, and 1024 will be returned
                    918:                                        return DecoderGetNavi(card,
                    919:                                                              command->
                    920:                                                              data1);
                    921:                                case Decoder_SetKaraoke:        // Vocal1{param1}, Vocal2{param2}, Melody{param3} 
                    922:                                        return DecoderKaraoke(card,
                    923:                                                              command->
                    924:                                                              param1,
                    925:                                                              command->
                    926:                                                              param2,
                    927:                                                              command->
                    928:                                                              param3);
                    929:                                case Decoder_Set_Videoattribute:
1.14      mocm      930:                                        MDEBUG(1,": -- Decoder_Set_Videoattribute\n");
1.1       cvs       931:                                        if (!card->ChannelBuffersAllocated) {
                    932:                                                DecoderStreamReset(card);
                    933:                                                MargiFlush(card);
                    934: 
                    935:                                                card->setup.streamtype =
                    936:                                                    stream_DVD;
                    937:                                                card->setup.videoID = 0;
                    938:                                                DecoderPrepareVideo(card);
                    939:                                                DecoderPreparePS(card, 0,
                    940:                                                                 0, 2, 2,
                    941:                                                                 3, 1);
                    942:                                        }
                    943: 
                    944:                                        SetVideoAttr(card,
                    945:                                                     command->param1);
1.6       mocm      946:                                        card->startingDVDV = 1; 
                    947: // tell the card to start playing as soon as ES-buffers are sufficiently full
1.1       cvs       948:                                        return 0;
                    949:                                case Decoder_Set_Audioattribute:
1.14      mocm      950:                                        MDEBUG(1,": -- Decoder_Set_Audioattribute\n");
1.1       cvs       951:                                        SetAudioAttr(card,
                    952:                                                     command->param1);
                    953:                                        card->startingDVDA =
                    954:                                            ((card->setup.audioselect !=
                    955:                                              audio_none)
                    956:                                             && (card->setup.audioselect != audio_disable));    // tell the card to start playing as soon as ES-buffers are sufficiently full
                    957:                                        return 0;
                    958:                                case Decoder_WriteBlock:        // DVD-Sector{data1}, sectorsize{param1{2048}}, initialsector{param2{bool}}, set_SCR{param3}
                    959:                                        return DecoderWriteBlock(card,
                    960:                                                                 command->
                    961:                                                                 data1,
                    962:                                                                 command->
                    963:                                                                 param1,
                    964:                                                                 command->
                    965:                                                                 param2,
                    966:                                                                 command->
                    967:                                                                 param3);
                    968:                                default:
                    969:                                        return -EINVAL;
                    970:                                }
                    971:                        default:
                    972:                                return -EINVAL;
                    973:                } else
                    974:                        return -EINVAL;
                    975:        } else {
1.14      mocm      976:                MDEBUG(0,
1.1       cvs       977:                       ": Video Decoder Prepare failed: device with this minor number not found\n");
                    978:                return -ENODEV; // device with this minor number not found
                    979:        }
                    980: }
                    981: 
1.6       mocm      982: 
1.1       cvs       983: static int PSmmap(struct file *file, struct vm_area_struct *vm)
                    984: {
                    985:        return -ENODEV;
                    986: }
                    987: 
1.6       mocm      988: 
                    989: 
1.11      mocm      990: static int margi_open(struct cvdv_cards *card, int flags)
1.1       cvs       991: {
1.6       mocm      992:        int closed;
1.1       cvs       993:        if (card != NULL) {
1.14      mocm      994:                MDEBUG(1, ": -- open \n");
1.1       cvs       995:                CloseCard(card);
1.5       mocm      996:                OSDClose(card);
1.6       mocm      997: #ifdef NOINT
                    998:                card->timer.function = Timerfunction;
                    999:                card->timer.data=(unsigned long) card;
                   1000:                card->timer.expires=jiffies+1;
                   1001:                add_timer(&card->timer);
                   1002: #endif
                   1003: 
                   1004:                if (card->open)
1.14      mocm     1005:                        MDEBUG(0,": PSopen - already open\n");
1.1       cvs      1006:                closed = 1;
1.6       mocm     1007:                if (card->open)
                   1008:                        closed = 0;
1.1       cvs      1009:                if (closed) {   // first open() for this card?
1.19      mocm     1010:                        MargiFreeBuffers(card);
1.1       cvs      1011:                        VideoSetBackground(card, 1, 0, 0, 0);   // black
                   1012:                }
1.6       mocm     1013:                card->open++;
1.11      mocm     1014:                MOD_INC_USE_COUNT;
1.1       cvs      1015:                return 0;
                   1016:        } else {
1.14      mocm     1017:                MDEBUG(0,
1.1       cvs      1018:                       ": Video Decoder Prepare failed: device with this minor number not found\n");
                   1019:                return -ENODEV; // device with this minor number not found
                   1020:        }
1.6       mocm     1021: 
1.1       cvs      1022: }
                   1023: 
1.6       mocm     1024: 
                   1025: static int PSopen(struct inode *inode, struct file *file)
1.1       cvs      1026: {
1.11      mocm     1027:        struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV];
1.15      mocm     1028:        card->audiostate.AVSyncState=true;
1.17      mocm     1029:        return  margi_open(card, file->f_flags);
1.6       mocm     1030: }
                   1031: 
                   1032: 
1.11      mocm     1033: static int  all_margi_close(struct cvdv_cards *card)
1.6       mocm     1034: {
1.11      mocm     1035: 
1.1       cvs      1036:        if (card != NULL) {
1.14      mocm     1037:                MDEBUG(1, ": -- PSrelease\n");
1.11      mocm     1038:                if (card->open <= 0)
1.14      mocm     1039:                        MDEBUG(1,": PSrelease - not open\n");
1.6       mocm     1040:                card->open--;
1.4       mocm     1041:                
1.11      mocm     1042:                MOD_DEC_USE_COUNT;
1.6       mocm     1043:                if (!card->open) {
1.14      mocm     1044:                        MDEBUG(1,": PSrelease - last close\n");
1.11      mocm     1045:                        CloseCard(card);        // close immediately
1.1       cvs      1046:                }
                   1047:                return 0;
                   1048:        } else {
1.14      mocm     1049:                MDEBUG(0,": Video Decoder Prepare failed:\n");
1.1       cvs      1050:                return -ENODEV; // device with this minor number not found
                   1051:        }
1.6       mocm     1052:        
                   1053: }
                   1054: 
                   1055: static int PSrelease(struct inode *inode, struct file *file)
                   1056: {
                   1057:        struct cvdv_cards *card = minorlist[MINOR(inode->i_rdev) % MAXDEV];     // minor number modulo 16
1.11      mocm     1058:        return all_margi_close(card);
1.1       cvs      1059: }
                   1060: 
                   1061:     //////////////////////////
                   1062:    //                      //
                   1063:   //  Char Device Hookup  //
                   1064:  //                      //
                   1065: //////////////////////////
                   1066: 
                   1067: // Hookups for a write-only device, that accepts MPEG-2 Program Stream
                   1068: struct file_operations cvdv_fileops = {
                   1069:        write:   PSwrite,
                   1070:        poll:    PSpoll,                
                   1071:        ioctl:   PSioctl,
                   1072:        mmap:    PSmmap,
                   1073:        open:    PSopen,
                   1074:        release: PSrelease,
                   1075: };
1.6       mocm     1076: 
                   1077: 
                   1078: #ifdef DVB
                   1079: 
                   1080: static inline int
                   1081: num2type(struct cvdv_cards *card, int num)
                   1082: {
                   1083:         if (!card->dvb_devs)
                   1084:                 return -2;
                   1085:         if (num>=card->dvb_devs->num)
                   1086:                 return -2;
                   1087:         return card->dvb_devs->tab[num];
                   1088: }
                   1089: 
                   1090: static int 
                   1091: dvbdev_open(struct dvb_device *dvbdev, int num, 
                   1092:             struct inode *inode, struct file *file)
                   1093: {
                   1094:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1095:         int type=num2type(card, num);
                   1096:         int ret=0;
                   1097: 
                   1098:         if (type<0)
                   1099:                 return -EINVAL;
                   1100: 
                   1101:         if (card->users[num] >= card->dvb_devs->max_users[num])
                   1102:                 return -EBUSY;
                   1103: 
                   1104:        if ((file->f_flags&O_ACCMODE)!=O_RDONLY) 
                   1105:                 if (card->writers[num] >= card->dvb_devs->max_writers[num])
                   1106:                        return -EBUSY;
                   1107: 
                   1108:        switch (type) {
                   1109:        case DVB_DEVICE_VIDEO_0:
                   1110:                 card->video_blank=true;
1.9       mocm     1111:                card->audiostate.AVSyncState=true;
1.6       mocm     1112:                 card->videostate.streamSource=VIDEO_SOURCE_DEMUX;
1.17      mocm     1113:                margi_open(card, file->f_flags);
1.7       mocm     1114:               break;
1.6       mocm     1115: 
                   1116:        case DVB_DEVICE_AUDIO_0:
1.17      mocm     1117:                card->audiostate.AVSyncState=true;
1.6       mocm     1118:                 card->audiostate.streamSource=AUDIO_SOURCE_DEMUX;
                   1119:                 break;
                   1120: 
                   1121:        case DVB_DEVICE_DEMUX_0:
                   1122:                 if ((file->f_flags&O_ACCMODE)!=O_RDWR)
                   1123:                         return -EINVAL;
                   1124:                 ret=DmxDevFilterAlloc(&card->dmxdev, file);
                   1125:                 break;
1.18      mocm     1126: 
1.6       mocm     1127:        case DVB_DEVICE_DVR_0:
1.17      mocm     1128:                card->audiostate.AVSyncState=true;
1.18      mocm     1129:                card->setup.streamtype =  stream_PES;
1.17      mocm     1130:                margi_open(card, file->f_flags);
1.6       mocm     1131:                 ret=DmxDevDVROpen(&card->dmxdev, file);
                   1132:                 break;
1.9       mocm     1133:        
                   1134:        case DVB_DEVICE_OSD_0:
                   1135:                 break;
                   1136:        default:
1.6       mocm     1137:                 return -EINVAL;
                   1138:        }
                   1139:        if (ret<0) 
                   1140:                return ret;
                   1141:        if ((file->f_flags&O_ACCMODE)!=O_RDONLY)
                   1142:                card->writers[num]++;
                   1143:         card->users[num]++;
                   1144:         return ret;
                   1145: }
                   1146: 
                   1147: static int 
                   1148: dvbdev_close(struct dvb_device *dvbdev, int num, 
                   1149:              struct inode *inode, struct file *file)
                   1150: {
                   1151:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1152:         int type=num2type(card, num);
                   1153:         int ret=0;
                   1154: 
                   1155:         if (type<0)
                   1156:                 return -EINVAL;
                   1157: 
                   1158:        switch (type) {
                   1159:        case DVB_DEVICE_VIDEO_0:
1.11      mocm     1160:        case DVB_DEVICE_AUDIO_0:
                   1161:                if (card->open)
                   1162:                        all_margi_close(card);
1.6       mocm     1163:                break;
                   1164: 
                   1165:        case DVB_DEVICE_DEMUX_0:
                   1166:                 ret=DmxDevFilterFree(&card->dmxdev, file);
                   1167:                 break;
                   1168: 
                   1169:        case DVB_DEVICE_DVR_0:
                   1170:                 ret=DmxDevDVRClose(&card->dmxdev, file);
1.12      mocm     1171:                if (card->open)
                   1172:                        all_margi_close(card);
1.6       mocm     1173:                 break;
1.9       mocm     1174:        case DVB_DEVICE_OSD_0:
                   1175:                 break;
                   1176:        default:
1.6       mocm     1177:                 return -EINVAL;
                   1178:        }
                   1179:        if (ret<0) 
                   1180:                return ret;
                   1181:        if ((file->f_flags&O_ACCMODE)!=O_RDONLY)
                   1182:                card->writers[num]--;
                   1183:         card->users[num]--;
                   1184:         return ret;
                   1185: }
                   1186: 
1.13      mocm     1187: 
1.6       mocm     1188: static ssize_t 
                   1189: dvbdev_write(struct dvb_device *dvbdev, int num,
                   1190:              struct file *file, 
                   1191:              const char *buf, size_t count, loff_t *ppos)
                   1192: {
                   1193:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1194:         int type=num2type(card, num);
                   1195: 
                   1196:        switch (type) {
                   1197:        case DVB_DEVICE_VIDEO_0:
                   1198:                 if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY)
                   1199:                         return -EPERM;
1.11      mocm     1200:                 return margi_write(card, buf, count, 
1.6       mocm     1201:                                   file->f_flags&O_NONBLOCK);
                   1202: 
                   1203:        case DVB_DEVICE_AUDIO_0:
                   1204:                 if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
                   1205:                         return -EPERM;
1.14      mocm     1206:                if ( card->setup.streamtype !=  stream_PES )
                   1207:                         return -EPERM;
                   1208: 
1.17      mocm     1209:                return margi_write_audio(card, buf, count, 
                   1210:                                         file->f_flags&O_NONBLOCK);
1.6       mocm     1211: 
                   1212:        case DVB_DEVICE_DVR_0:
                   1213:                 return DmxDevDVRWrite(&card->dmxdev, file, buf, count, ppos);
                   1214:        default:
                   1215:                return -EOPNOTSUPP;
                   1216:        }
                   1217:         return 0;
                   1218: }
                   1219: 
1.12      mocm     1220: static ssize_t 
                   1221: dvbdev_read(struct dvb_device *dvbdev, int num, 
                   1222:             struct file *file, char *buf, size_t count, loff_t *ppos)
                   1223: {
                   1224:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1225:         int type=num2type(card, num);
                   1226: 
                   1227:        switch (type) {
                   1228:        case DVB_DEVICE_VIDEO_0:
                   1229:                break;
                   1230:        case DVB_DEVICE_AUDIO_0:
                   1231:                 break;
                   1232:        case DVB_DEVICE_DEMUX_0:
                   1233:                 return DmxDevRead(&card->dmxdev, file, buf, count, ppos);
                   1234:        case DVB_DEVICE_DVR_0:
                   1235:                 return DmxDevDVRRead(&card->dmxdev, file, buf, count, ppos);
                   1236:        case DVB_DEVICE_CA_0:
                   1237:                 break;
                   1238:        default:
                   1239:                return -EOPNOTSUPP;
                   1240:        }
                   1241:         return 0;
                   1242: }
                   1243: 
                   1244: 
                   1245: 
1.6       mocm     1246: 
                   1247: static int 
                   1248: dvbdev_ioctl(struct dvb_device *dvbdev, int num, 
                   1249:              struct file *file, unsigned int cmd, unsigned long arg)
                   1250: {
                   1251:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1252:         void *parg=(void *)arg;
                   1253:         int type=num2type(card, num);
1.17      mocm     1254:        uint16_t attr;
1.6       mocm     1255: 
                   1256:        switch (type) {
                   1257:        case DVB_DEVICE_VIDEO_0:
                   1258:                 if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
                   1259:                     (cmd!=VIDEO_GET_STATUS))
                   1260:                         return -EPERM;
                   1261: 
                   1262:                 switch (cmd) {
                   1263: 
                   1264:                 case VIDEO_STOP:
                   1265:                        DecoderPause(card);                   
1.9       mocm     1266:                        card->videostate.playState = VIDEO_STOPPED;
1.10      mocm     1267:                        if (card->videostate.videoBlank)
                   1268:                                VideoSetBackground(card, 1, 0, 0, 0);  
1.9       mocm     1269:                                                
1.10      mocm     1270: 
1.9       mocm     1271:                        return 0; 
1.6       mocm     1272: 
                   1273:                 case VIDEO_PLAY:
                   1274:                      
                   1275:                         if (card->videostate.streamSource==
                   1276:                            VIDEO_SOURCE_MEMORY) {
1.9       mocm     1277:                                if (card->videostate.playState==VIDEO_FREEZED){
                   1278:                                        DecoderUnPause(card);   
                   1279:                                } else {
                   1280:                                        DecoderUnPause(card);   
                   1281:                                } 
1.6       mocm     1282:                         }
                   1283:                         break;
                   1284: 
                   1285:                 case VIDEO_FREEZE:
                   1286:                        DecoderPause(card);                   
                   1287:                         break;
                   1288: 
                   1289:                 case VIDEO_CONTINUE:
                   1290:                        if (card->videostate.playState==VIDEO_FREEZED) {
                   1291:                                DecoderUnPause(card);                   
                   1292:                        } 
                   1293:                         break;
                   1294: 
                   1295:                 case VIDEO_SELECT_SOURCE:
                   1296:                         card->videostate.streamSource=(videoStreamSource_t) arg;
                   1297:                         break;
                   1298: 
                   1299:                 case VIDEO_SET_BLANK:
                   1300:                         card->videostate.videoBlank=(boolean) arg;
                   1301:                         break;
                   1302: 
                   1303:                 case VIDEO_GET_STATUS:
                   1304:                         if(copy_to_user(parg, &card->videostate, 
                   1305:                                        sizeof(struct videoStatus)))
                   1306:                                 return -EFAULT;
                   1307:                         break;
                   1308: 
                   1309:                 case VIDEO_GET_EVENT:
                   1310:                         return -EOPNOTSUPP;
                   1311: 
                   1312:                 case VIDEO_SET_DISPLAY_FORMAT:
                   1313:                 {
                   1314:                         videoDisplayFormat_t format=(videoDisplayFormat_t) arg;
1.12      mocm     1315:                         uint16_t val=0;
1.6       mocm     1316:                         
                   1317:                         switch(format) {
                   1318:                         case VIDEO_PAN_SCAN:
                   1319:                                 val=VID_PAN_SCAN_PREF;
                   1320:                                 break;
                   1321: 
                   1322:                         case VIDEO_LETTER_BOX:
                   1323:                                 val=VID_VC_AND_PS_PREF;
                   1324:                                 break;
                   1325: 
                   1326:                         case VIDEO_CENTER_CUT_OUT:
                   1327:                                 val=VID_CENTRE_CUT_PREF;
                   1328:                                 break;
                   1329: 
                   1330:                         default:
                   1331:                                 return -EINVAL;
                   1332:                         }
                   1333: 
                   1334:                         card->videostate.videoFormat=format;
                   1335:                         return 0;
                   1336:                 }
                   1337:                 
                   1338:                 case VIDEO_STILLPICTURE:
                   1339:                { 
                   1340:                        struct videoDisplayStillPicture pic;
                   1341: 
                   1342:                         if(copy_from_user(&pic, parg, 
                   1343:                                           sizeof(struct videoDisplayStillPicture)))
                   1344:                                 return -EFAULT;
                   1345: 
                   1346:                         break;
                   1347:                }
                   1348: 
                   1349:                 case VIDEO_FAST_FORWARD:
1.10      mocm     1350:                         if (card->videostate.streamSource !=
                   1351:                            VIDEO_SOURCE_MEMORY)
                   1352:                                return -EPERM;
1.13      mocm     1353:                        card->videoffwd = 3;
1.6       mocm     1354:                         break;
                   1355: 
                   1356:                 case VIDEO_SLOWMOTION:
                   1357:                         if (card->videostate.streamSource!=VIDEO_SOURCE_MEMORY)
                   1358:                                 return -EPERM;
1.10      mocm     1359:                         card->videoslow = arg;
1.6       mocm     1360: 
                   1361:                         break;
                   1362: 
                   1363:                 case VIDEO_GET_CAPABILITIES:
                   1364:                 {
1.8       mocm     1365:                        int cap=VIDEO_CAP_MPEG1|
                   1366:                                VIDEO_CAP_MPEG2|
                   1367:                                VIDEO_CAP_SYS|
                   1368:                                VIDEO_CAP_PROG|
                   1369:                                VIDEO_CAP_SPU|
                   1370:                                VIDEO_CAP_NAVI|
                   1371:                                VIDEO_CAP_CSS;
                   1372: 
1.6       mocm     1373:                         
                   1374:                         if (copy_to_user(parg, &cap, 
                   1375:                                        sizeof(cap)))
                   1376:                                 return -EFAULT;
                   1377:                         break;
                   1378:                 }
1.18      mocm     1379: 
1.14      mocm     1380:                case VIDEO_SET_STREAMTYPE:
                   1381:                {
                   1382:                        int f = -1;
                   1383:                        switch(arg){
                   1384:                        case VIDEO_CAP_MPEG1:
                   1385:                        case VIDEO_CAP_MPEG2:
                   1386:                                f = stream_PES;
                   1387:                                break;
                   1388:                                
                   1389:                        case VIDEO_CAP_SYS:
                   1390:                        case VIDEO_CAP_PROG:
                   1391:                                f = stream_PS;
                   1392:                                break;
                   1393:                                
                   1394:                        case VIDEO_CAP_SPU:
                   1395:                        case VIDEO_CAP_NAVI:
                   1396:                        case VIDEO_CAP_CSS:
                   1397:                                f = stream_DVD;
                   1398:                        }   
                   1399:                        card->setup.streamtype =  f;
1.17      mocm     1400:        
1.14      mocm     1401:                }                       
                   1402:                break;
                   1403: 
1.17      mocm     1404:                case VIDEO_SET_ID:
                   1405:                        card->setup.videoID = arg;
                   1406:                        DecoderPrepareVideo(card);
                   1407:                        break;
                   1408: 
                   1409:                case VIDEO_SET_SYSTEM:
                   1410:                        card->videomode = (videosystem) arg;
                   1411:                        SetVideoSystem(card);
                   1412:                        break;
                   1413: 
                   1414:                case VIDEO_SET_HIGHLIGHT:
                   1415:                {
                   1416:                        uint8_t data1[4];
                   1417:                        uint8_t data2[6];
                   1418:                        videoHighlight_t vh;
                   1419: 
                   1420:                         if(copy_from_user(&vh, parg, sizeof(videoHighlight_t)))
                   1421:                                 return -EFAULT;
                   1422: 
                   1423:                        data1[0] = vh.contrast1;
                   1424:                        data1[1] = vh.contrast2;
                   1425:                        data1[2] = vh.color1;
                   1426:                        data1[3] = vh.color2;
                   1427:                        data2[0] = vh.ypos & 0xFF;
                   1428:                        data2[1] = (uint8_t) ((vh.ypos >> 1) & 0xFF);
                   1429:                        data2[2] = (uint8_t) ((vh.ypos >> 2) & 0xFF);
                   1430:                        data2[3] = vh.xpos & 0xFF;
                   1431:                        data2[4] = (uint8_t) ((vh.xpos >> 1) & 0xFF);
                   1432:                        data2[5] = (uint8_t) ((vh.xpos >> 2) & 0xFF);
                   1433:                        return DecoderHighlight(card, vh.active, data1, data2);
                   1434:                        break;
                   1435:                }
                   1436: 
                   1437:                case VIDEO_SET_SPU:
                   1438:                {
                   1439:                        videoSPU_t spu;
                   1440: 
                   1441:                         if(copy_from_user(&spu, parg, sizeof(videoSPU_t)))
                   1442:                                 return -EFAULT;
                   1443: 
                   1444:                        return DecoderSPUStream(card, spu.streamID, spu.active);
                   1445:                        break;
                   1446:                }
                   1447: 
1.20      mocm     1448:                case VIDEO_SET_SPU_PALETTE:
1.17      mocm     1449:                {
                   1450:                        videoSPUPalette_t spup;
                   1451:                         
                   1452:                        if(copy_from_user(&spup, parg, sizeof(videoSPUPalette_t)))
                   1453:                                 return -EFAULT;
                   1454: 
                   1455:                        return DecoderSPUPalette(card, spup.length, spup.palette);
                   1456:                        break;
                   1457:                }
                   1458: 
                   1459:                case VIDEO_GET_NAVI:
                   1460:                {
                   1461:                        videoNaviPack_t navi;
                   1462: 
1.18      mocm     1463:                        navi.length = DecoderGetNavi(card, (u8 *)&(navi.data));
1.17      mocm     1464:                        if(copy_to_user(parg, &navi, sizeof(videoNaviPack_t)))
                   1465:                                 return -EFAULT;
                   1466:                }
                   1467:                break;
                   1468: 
                   1469:                case VIDEO_SET_ATTRIBUTES:
                   1470:                {
                   1471:                        if (!card->ChannelBuffersAllocated) {
                   1472:                                DecoderStreamReset(card);
                   1473:                                MargiFlush(card);
                   1474: 
                   1475:                                card->setup.streamtype = stream_DVD;
                   1476:                                card->setup.videoID = 0;
                   1477:                                DecoderPrepareVideo(card);
                   1478:                                DecoderPreparePS(card, 0, 0, 2, 2, 3, 1);
                   1479:                        }
                   1480: 
                   1481:                        SetVideoAttr(card, arg);
                   1482:                        card->startingDVDV = 1; 
                   1483:                }
                   1484:                break;
                   1485: 
1.6       mocm     1486:                 default:
                   1487:                         return -ENOIOCTLCMD;
                   1488:                }
                   1489:                 return 0;
1.14      mocm     1490:        
1.6       mocm     1491:        case DVB_DEVICE_AUDIO_0:
                   1492:                 if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
                   1493:                     (cmd!=AUDIO_GET_STATUS))
                   1494:                         return -EPERM;
                   1495: 
                   1496:                 switch (cmd) {
                   1497: 
                   1498:                 case AUDIO_STOP:
                   1499:                         if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
                   1500:                                break;
                   1501:                        AudioStopDecode(card);
                   1502:                        card->audiostate.playState=AUDIO_STOPPED;
                   1503:                         break;
                   1504: 
                   1505:                 case AUDIO_PLAY:
                   1506:                         if (card->audiostate.streamSource!=AUDIO_SOURCE_MEMORY)
                   1507:                                break;
                   1508:                        AudioSetPlayMode(card, MAUDIO_PLAY);
                   1509:                         card->audiostate.playState=AUDIO_PLAYING;
                   1510:                        break;
                   1511: 
                   1512:                 case AUDIO_PAUSE:
                   1513:                        card->audiostate.playState=AUDIO_PAUSED;
                   1514:                        AudioSetPlayMode(card, MAUDIO_PAUSE);
                   1515:                         break;
                   1516: 
                   1517:                 case AUDIO_CONTINUE:
                   1518:                        if (card->audiostate.playState==AUDIO_PAUSED) {
                   1519:                                card->audiostate.playState=AUDIO_PLAYING;
                   1520:                                AudioSetPlayMode(card, MAUDIO_PLAY);
                   1521:                        } 
                   1522:                        break;
                   1523: 
                   1524:                 case AUDIO_SELECT_SOURCE:
1.14      mocm     1525:                         card->audiostate.streamSource=
                   1526:                                (audioStreamSource_t) arg;
1.6       mocm     1527:                        break;
                   1528: 
                   1529:                 case AUDIO_SET_MUTE:
                   1530:                 {
                   1531:                        AudioMute(card, arg);
                   1532:                         card->audiostate.muteState=(boolean) arg;
                   1533:                         break;
                   1534:                }
                   1535: 
                   1536:                 case AUDIO_SET_AV_SYNC:
1.9       mocm     1537:                        card->videosync=(boolean) arg;
1.6       mocm     1538:                         card->audiostate.AVSyncState=(boolean) arg;
                   1539:                         break;
                   1540: 
                   1541:                 case AUDIO_SET_BYPASS_MODE:
                   1542:                        return -EINVAL;
                   1543: 
                   1544:                 case AUDIO_CHANNEL_SELECT:
                   1545:                        card->audiostate.channelSelect=(audioChannelSelect_t) arg;
                   1546:                         
                   1547:                         switch(card->audiostate.channelSelect) {
                   1548:                         case AUDIO_STEREO:
                   1549:                                 break;
                   1550: 
                   1551:                         case AUDIO_MONO_LEFT:
                   1552:                                 break;
                   1553: 
                   1554:                         case AUDIO_MONO_RIGHT:
                   1555:                                 break;
                   1556: 
                   1557:                         default:
                   1558:                                 return -EINVAL;
                   1559:                        }
                   1560:                        return 0;
                   1561: 
                   1562:                 case AUDIO_GET_STATUS:
                   1563:                         if(copy_to_user(parg, &card->audiostate, 
                   1564:                                        sizeof(struct audioStatus)))
                   1565:                                 return -EFAULT;
                   1566:                         break;
                   1567: 
                   1568:                 case AUDIO_GET_CAPABILITIES:
                   1569:                 {
                   1570:                         int cap=AUDIO_CAP_LPCM|
                   1571:                                 AUDIO_CAP_MP1|
1.8       mocm     1572:                                 AUDIO_CAP_MP2|
                   1573:                                AUDIO_CAP_AC3;
1.6       mocm     1574:                         
                   1575:                         if (copy_to_user(parg, &cap, 
                   1576:                                        sizeof(cap)))
                   1577:                                 return -EFAULT;
                   1578:                 }
1.14      mocm     1579:                break;
                   1580: 
                   1581: 
                   1582:                case AUDIO_SET_STREAMTYPE:
                   1583:                {
                   1584:                        int f = -1;
                   1585: 
                   1586:                        switch(arg){
                   1587:                        case AUDIO_CAP_DTS:
                   1588:                        case AUDIO_CAP_MP3:
                   1589:                        case AUDIO_CAP_AAC:
                   1590:                        case AUDIO_CAP_SDDS:
                   1591:                        case AUDIO_CAP_OGG:
                   1592:                                f = audio_none;    
                   1593:                                break;
                   1594: 
                   1595:                        case AUDIO_CAP_LPCM:
                   1596:                                f = audio_LPCM;
                   1597:                                break;
                   1598: 
                   1599:                        case AUDIO_CAP_MP1:
                   1600:                        case AUDIO_CAP_MP2:
                   1601:                                f = audio_MPEG;
                   1602:                                break;
                   1603: 
                   1604:                        case AUDIO_CAP_AC3:
                   1605:                                f = audio_AC3;
                   1606:                                break;
                   1607:                        }
                   1608:                        
                   1609:                        card->setup.audioselect = (audio_type) f;
                   1610:                        DecoderPrepareAudio(card);
1.17      mocm     1611:                        break;
1.14      mocm     1612:                 }
1.17      mocm     1613: 
                   1614:                case AUDIO_SET_ID:
                   1615:                        if (arg < 0 || arg >32) arg = 0;
                   1616:                        card->setup.audioID = arg;
                   1617:                        arg = 0;
                   1618:                case AUDIO_SET_EXT_ID:
                   1619:                        if (arg < 0 || arg >32) arg = 0;
                   1620:                        card->setup.audioIDext = arg;
                   1621: 
                   1622:                        attr = card->lastaattr;
                   1623:                        DecoderSelectAudioID(card);
                   1624:                        card->lastaattr = attr;
                   1625:                        break;
                   1626: 
                   1627:                case AUDIO_SET_MIXER:
                   1628:                        return -EINVAL;
                   1629:                
                   1630:                case AUDIO_SET_ATTRIBUTES:
                   1631:                        SetAudioAttr(card,arg);
                   1632:                        card->startingDVDA = ((card->setup.audioselect != audio_none)
                   1633:                                              && (card->setup.audioselect != 
                   1634:                                                  audio_disable));
                   1635:                        break;
                   1636: 
                   1637:                
                   1638:                case AUDIO_SET_KARAOKE:
                   1639:                {
                   1640:                        break;
                   1641:                }
1.14      mocm     1642: 
                   1643:                default:
1.6       mocm     1644:                         return -ENOIOCTLCMD;
                   1645:                 }
1.14      mocm     1646:                 break;
1.6       mocm     1647: 
                   1648:         case DVB_DEVICE_DEMUX_0:
                   1649:                 return DmxDevIoctl(&card->dmxdev, file, cmd, arg);
1.13      mocm     1650:                break;
1.6       mocm     1651: 
1.9       mocm     1652:        case DVB_DEVICE_OSD_0:
                   1653:                {
1.13      mocm     1654:                        switch (cmd) {
1.9       mocm     1655:                        case OSD_SEND_CMD:
1.13      mocm     1656:                        {
                   1657:                                osd_cmd_t doc;
                   1658:                                
                   1659:                                if(copy_from_user(&doc, parg, 
                   1660:                                                  sizeof(osd_cmd_t)))
                   1661:                                        return -EFAULT;
                   1662:                                return OSD_DrawCommand(card, &doc);
                   1663:                        }
1.9       mocm     1664:                        default:
                   1665:                                return -EINVAL;
1.13      mocm     1666:                        }
1.9       mocm     1667:                        break;
                   1668:                }
                   1669:        default:
1.6       mocm     1670:                 return -EOPNOTSUPP;
                   1671:         }
                   1672:         return 0;
                   1673: }
                   1674: 
                   1675: static unsigned int 
                   1676: dvbdev_poll(struct dvb_device *dvbdev, int num, 
                   1677:             struct file *file, poll_table * wait)
                   1678: {
                   1679:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1680:         int type=num2type(card, num);
                   1681: 
                   1682:        switch (type) {
                   1683:         case DVB_DEVICE_DEMUX_0:
                   1684:                 return DmxDevPoll(&card->dmxdev, file, wait);
                   1685: 
                   1686:         case DVB_DEVICE_VIDEO_0:
                   1687:                 return PSpoll(file, wait);
                   1688:                 
                   1689:         case DVB_DEVICE_AUDIO_0:
1.17      mocm     1690:                 return poll_audio(file, wait);
1.6       mocm     1691: 
                   1692:         case DVB_DEVICE_CA_0:
                   1693:                 break;
                   1694: 
                   1695:        default:
                   1696:                return -EOPNOTSUPP;
                   1697:         }
                   1698: 
                   1699:         return 0;
                   1700: }
                   1701: 
                   1702: 
                   1703: static int 
                   1704: dvbdev_device_type(struct dvb_device *dvbdev, unsigned int num)
                   1705: {
                   1706:         struct cvdv_cards *card=(struct cvdv_cards *) dvbdev->priv;
                   1707: 
                   1708:         return num2type(card, num);
                   1709: }
                   1710: #endif
                   1711: 
                   1712: /******************************************************************************
                   1713:  * driver registration 
                   1714:  ******************************************************************************/
                   1715: 
                   1716: 
                   1717: #ifdef DVB
                   1718: 
                   1719: #define INFU 32768
                   1720: 
1.9       mocm     1721: 
                   1722: 
1.6       mocm     1723: static dvb_devs_t mdvb_devs = {
1.9       mocm     1724:         9,
1.6       mocm     1725:         { 
1.9       mocm     1726:                 DVB_DEVICE_VIDEO_0, DVB_DEVICE_AUDIO_0,
                   1727:                -1, -1,
                   1728:                 DVB_DEVICE_DEMUX_0, DVB_DEVICE_DVR_0,
                   1729:                -1, -1,
1.13      mocm     1730:                DVB_DEVICE_OSD_0,
1.6       mocm     1731:         },
1.9       mocm     1732:         { INFU, INFU, INFU, INFU, INFU, 1, 1, INFU, 1 },
                   1733:         { 1, 1, 1, 1, INFU, 1, 1, 1, 1}
1.6       mocm     1734: };
                   1735: 
1.12      mocm     1736: 
                   1737: static int 
                   1738: dvb_start_feed(dvb_demux_feed_t *dvbdmxfeed)
                   1739: {
                   1740:         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
                   1741:         struct cvdv_cards * card = (struct cvdv_cards *)dvbdmx->priv;
                   1742:  
                   1743:         if (!dvbdmx->dmx.frontend || !card)
                   1744:                 return -EINVAL;
                   1745:        
                   1746:         if (dvbdmxfeed->type == DMX_TYPE_TS) {
                   1747:                if ((dvbdmxfeed->ts_type & TS_DECODER) 
                   1748:                    && (dvbdmxfeed->pes_type<DMX_TS_PES_OTHER)) {
                   1749:                        switch (dvbdmx->dmx.frontend->source) {
                   1750:                        case DMX_MEMORY_FE: 
                   1751:                                if (dvbdmxfeed->ts_type & TS_DECODER)
                   1752:                                       if (dvbdmxfeed->pes_type<2 && 
                   1753:                                            dvbdmx->pids[0]!=0xffff &&
                   1754:                                            dvbdmx->pids[1]!=0xffff) {
                   1755:                                               
                   1756:                                               setup_ts2pes( &card->tsa, 
                   1757:                                                             &card->tsv,
                   1758:                                                             dvbdmx->pids,
                   1759:                                                             dvbdmx->pids+1, 
                   1760:                                                             pes_write,
                   1761:                                                             (void *)card);
                   1762: 
                   1763:                                                dvbdmx->playing=1;
                   1764:                                       }
                   1765:                                break;
                   1766:                        default:
                   1767:                                return -EINVAL;
                   1768:                                break;
                   1769:                        }
                   1770:                } 
                   1771:         }
                   1772:         
                   1773:         if (dvbdmxfeed->type == DMX_TYPE_SEC) {
                   1774:                 int i;
                   1775: 
                   1776:                for (i=0; i<dvbdmx->filternum; i++) {
                   1777:                        if (dvbdmx->filter[i].state!=DMX_STATE_READY)
                   1778:                                continue;
                   1779:                        if (dvbdmx->filter[i].type!=DMX_TYPE_SEC)
                   1780:                                continue;
                   1781:                        if (dvbdmx->filter[i].filter.parent!=
                   1782:                            &dvbdmxfeed->feed.sec)
                   1783:                                continue;
                   1784: 
                   1785:                        dvbdmxfeed->feed.sec.is_filtering=1;
                   1786:                        dvbdmx->filter[i].state=DMX_STATE_GO;
                   1787:                 }
                   1788:        }
                   1789: 
                   1790:         return 0;
                   1791: }
                   1792: 
                   1793: 
                   1794: static int 
                   1795: dvb_stop_feed(dvb_demux_feed_t *dvbdmxfeed)
                   1796: {
                   1797:         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
                   1798:         struct cvdv_cards * card = (struct cvdv_cards *)dvbdmx->priv;
                   1799:         if (!card)
                   1800:                 return -EINVAL;
                   1801: 
                   1802:         if (dvbdmxfeed->type == DMX_TYPE_TS) {
                   1803:                if ((dvbdmxfeed->ts_type & TS_DECODER) 
                   1804:                    && (dvbdmxfeed->pes_type<=1)) {
                   1805:                        if (dvbdmx->playing) {
1.14      mocm     1806:                                free_ipack(&card->tsa);
                   1807:                                free_ipack(&card->tsv);
1.12      mocm     1808:                                DecoderPause(card);
                   1809:                                dvbdmx->playing=0;
                   1810:                        }
                   1811:                } 
                   1812: 
                   1813:        }
                   1814:         if (dvbdmxfeed->type == DMX_TYPE_SEC) {
                   1815:                 int i;
                   1816:                
                   1817:                for (i=0; i<dvbdmx->filternum; i++)
                   1818:                        if (dvbdmx->filter[i].state==DMX_STATE_GO && 
                   1819:                            dvbdmx->filter[i].filter.parent==
                   1820:                            &dvbdmxfeed->feed.sec) {
                   1821:                                dvbdmx->filter[i].state=DMX_STATE_READY;
                   1822:                 }
                   1823:                
                   1824:        }
                   1825:         return 0;
                   1826: }
                   1827: 
1.22      mocm     1828: static uint16_t get_pid(uint8_t *pid)
                   1829: {
                   1830:        uint16_t pp = 0;
                   1831: 
                   1832:        pp = (pid[0] & PID_MASK_HI)<<8;
                   1833:        pp |= pid[1];
                   1834: 
                   1835:        return pp;
                   1836: }
                   1837: 
1.12      mocm     1838: 
                   1839: static int 
                   1840: dvb_write_to_decoder(dvb_demux_feed_t *dvbdmxfeed, uint8_t *buf, size_t count)
                   1841: {
                   1842:         dvb_demux_t *dvbdmx=dvbdmxfeed->demux;
                   1843:         struct cvdv_cards * card = (struct cvdv_cards *)dvbdmx->priv;
                   1844:        uint16_t pid = 0;
1.18      mocm     1845:        int off = 0;
1.12      mocm     1846: 
1.14      mocm     1847:        ipack *p;
1.12      mocm     1848: 
                   1849:         if (!card)
                   1850:                 return -EINVAL;
                   1851:        
                   1852:        pid = get_pid(buf+1);
                   1853:                        
                   1854:        if (pid == *(card->tsa.pid)) p = &(card->tsa);
                   1855:        else if (pid == *(card->tsv.pid)) p = &(card->tsv);
                   1856:        else return 0;
                   1857: 
                   1858:         if (dvbdmxfeed->pes_type>1)
                   1859:                 return -1;
                   1860:         if (!(buf[3]&0x10)) // no payload?
                   1861:                 return -1;
                   1862: 
                   1863:        if (count != TS_SIZE) return -1;
                   1864: 
1.18      mocm     1865:        if ( buf[3] & ADAPT_FIELD) {  // adaptation field?
                   1866:                off = buf[4] + 1;
                   1867:        }
                   1868:        
                   1869: 
                   1870:        if (pid == *(card->tsa.pid)){
                   1871:                MDEBUG(0,"AUDIO count: %d  off: %d\n",count,off);
                   1872:                margi_write_audio(card, buf+off+4, TS_SIZE-4-off, 0);
                   1873:        } else {
                   1874:                MDEBUG(0,"VIDEO count: %d  off: %d\n",count,off);
                   1875:                margi_write(card, buf+off+4, TS_SIZE-4-off, 0);
                   1876:        }
                   1877: 
                   1878: //     ts_to_pes( p, buf); // don't need count (=188)
1.12      mocm     1879:         return 0;
                   1880: }
                   1881: 
1.6       mocm     1882: int dvb_register(struct cvdv_cards *card)
                   1883: {
1.12      mocm     1884:         int i,ret;
1.6       mocm     1885:         struct dvb_device *dvbd=&card->dvb_dev;
1.12      mocm     1886:        
                   1887:        dvb_demux_t *dvbdemux = (dvb_demux_t *)&card->demux;
1.6       mocm     1888: 
                   1889:         if (card->dvb_registered)
                   1890:                 return -1;
                   1891:         card->dvb_registered=1;
                   1892: 
                   1893:         card->audiostate.AVSyncState=0;
                   1894:         card->audiostate.muteState=0;
                   1895:         card->audiostate.playState=AUDIO_STOPPED;
                   1896:         card->audiostate.streamSource=AUDIO_SOURCE_MEMORY;
                   1897:         card->audiostate.channelSelect=AUDIO_STEREO;
                   1898:         card->audiostate.bypassMode=0;
                   1899: 
                   1900:         card->videostate.videoBlank=0;
                   1901:         card->videostate.playState=VIDEO_STOPPED;
                   1902:         card->videostate.streamSource=VIDEO_SOURCE_MEMORY;
                   1903:         card->videostate.videoFormat=VIDEO_FORMAT_4_3;
                   1904:         card->videostate.displayFormat=VIDEO_CENTER_CUT_OUT;
                   1905: 
                   1906:         // init and register demuxes
1.12      mocm     1907:        memcpy(card->demux_id, "demux0_0", 9);
                   1908:         card->demux_id[7] = 1+0x30;
                   1909:         dvbdemux->priv = (void *) card;
                   1910:        dvbdemux->filternum = 32;
                   1911:        dvbdemux->feednum = 32;
                   1912:        dvbdemux->start_feed = dvb_start_feed;
                   1913:        dvbdemux->stop_feed = dvb_stop_feed;
                   1914:        dvbdemux->write_to_decoder = dvb_write_to_decoder;
                   1915:                 
                   1916:        dvbdemux->dmx.vendor="CIM";
                   1917:        dvbdemux->dmx.model="sw";
                   1918:        dvbdemux->dmx.id=card->demux_id;
                   1919:        dvbdemux->dmx.capabilities=(DMX_TS_FILTERING|
                   1920:                                    DMX_SECTION_FILTERING|
                   1921:                                    DMX_MEMORY_BASED_FILTERING);
                   1922:        
                   1923:        DvbDmxInit(&card->demux);
                   1924: 
                   1925:        card->dmxdev.filternum=32;
                   1926:        card->dmxdev.demux=&dvbdemux->dmx;
                   1927:        card->dmxdev.capabilities=0;
                   1928: 
                   1929:        DmxDevInit(&card->dmxdev);
1.6       mocm     1930:         
1.12      mocm     1931:         card->mem_frontend.id="mem_frontend";
                   1932:         card->mem_frontend.vendor="memory";
                   1933:         card->mem_frontend.model="sw";
                   1934:         card->mem_frontend.source=DMX_MEMORY_FE;
                   1935:         ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, 
                   1936:                                         &card->mem_frontend);
                   1937:         if (ret<0)
                   1938:                 return ret;
                   1939:        ret=dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, 
                   1940:                                           &card->mem_frontend);
                   1941:         if (ret<0)
                   1942:                 return ret;
1.6       mocm     1943: 
                   1944:         // init and register dvb device structure
                   1945:         dvbd->priv=(void *) card;
                   1946:         dvbd->open=dvbdev_open;
                   1947:         dvbd->close=dvbdev_close;
                   1948:         dvbd->write=dvbdev_write;
1.12      mocm     1949:         dvbd->read=dvbdev_read;
1.6       mocm     1950:         dvbd->ioctl=dvbdev_ioctl;
                   1951:         dvbd->poll=dvbdev_poll;
                   1952:         dvbd->device_type=dvbdev_device_type;
                   1953:         
                   1954:         for (i=0; i<DVB_DEVS_MAX; i++) 
                   1955:                 card->users[i]=card->writers[i]=0;
                   1956: 
                   1957:         card->dvb_devs=0;
                   1958:        card->dvb_devs=&mdvb_devs;
1.12      mocm     1959:        
1.6       mocm     1960:         return dvb_register_device(dvbd);
                   1961: }
                   1962: 
                   1963: void dvb_unregister(struct cvdv_cards *card)
                   1964: {
1.12      mocm     1965:        dvb_demux_t *dvbdemux=&card->demux;
                   1966: 
                   1967:         dvbdemux->dmx.close(&dvbdemux->dmx);
                   1968:         dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &card->mem_frontend);
                   1969:         DmxDevRelease(&card->dmxdev);
                   1970:         DvbDmxRelease(&card->demux);
1.6       mocm     1971:         dvb_unregister_device(&card->dvb_dev);
                   1972: }
                   1973: #endif

LinuxTV legacy CVS <linuxtv.org/cvs>