📄 brooktree848.c
字号:
*/intbktr_open( dev_t dev, int flags, int fmt, struct proc *p ){ bktr_ptr_t bktr; int unit; unit = UNIT( minor(dev) ); if (unit >= NBKTR) /* unit out of range */ return( ENXIO ); bktr = &(brooktree[ unit ]); if (!(bktr->flags & METEOR_INITALIZED)) /* device not found */ return( ENXIO ); if (bt848_card != -1) { if ((bt848_card >> 8 == unit ) && ( (bt848_card & 0xff) < Bt848_MAX_CARD )) { if ( bktr->bt848_card != (bt848_card & 0xff) ) { bktr->bt848_card = (bt848_card & 0xff); probeCard(bktr, FALSE); } } } if (bt848_tuner != -1) { if ((bt848_tuner >> 8 == unit ) && ( (bt848_tuner & 0xff) < Bt848_MAX_TUNER )) { if ( bktr->bt848_tuner != (bt848_tuner & 0xff) ) { bktr->bt848_tuner = (bt848_tuner & 0xff); probeCard(bktr, FALSE); } } } if (bt848_reverse_mute != -1) { if (((bt848_reverse_mute >> 8) == unit ) && ((bt848_reverse_mute & 0xff) < Bt848_MAX_TUNER) ) { bktr->reverse_mute = bt848_reverse_mute & 0xff; bt848_reverse_mute = -1; } } switch ( MINOR( minor(dev) ) ) { case VIDEO_DEV: return( video_open( bktr ) ); case TUNER_DEV: return( tuner_open( bktr ) ); } return( ENXIO );}/* * */static intvideo_open( bktr_ptr_t bktr ){ bt848_ptr_t bt848; int frame_rate, video_format=0; if (bktr->flags & METEOR_OPEN) /* device is busy */ return( EBUSY ); bktr->flags |= METEOR_OPEN; bt848 = bktr->base;#ifdef BT848_DUMP dump_bt848( bt848 );#endif bktr->clr_on_start = FALSE; bt848->dstatus = 0x00; /* clear device status reg. */ bt848->adc = SYNC_LEVEL;#if BROOKTREE_SYSTEM_DEFAULT == BROOKTREE_PAL video_format = 0;#else video_format = 1;#endif if (bt848_format == 0 ) video_format = 0; if (bt848_format == 1 ) video_format = 1; if (video_format == 1 ) { bt848->iform = BT848_IFORM_F_NTSCM; bktr->format_params = BT848_IFORM_F_NTSCM; } else { bt848->iform = BT848_IFORM_F_PALBDGHI; bktr->format_params = BT848_IFORM_F_PALBDGHI; } bt848->iform |= format_params[bktr->format_params].iform_xtsel; /* work around for new Hauppauge 878 cards */ if ((bktr->card.card_id == CARD_HAUPPAUGE) && (bktr->id==BROOKTREE_878 || bktr->id==BROOKTREE_879) ) bt848->iform |= BT848_IFORM_M_MUX3; else bt848->iform |= BT848_IFORM_M_MUX1; bt848->adelay = format_params[bktr->format_params].adelay; bt848->bdelay = format_params[bktr->format_params].bdelay; frame_rate = format_params[bktr->format_params].frame_rate; /* enable PLL mode using 28Mhz crystal for PAL/SECAM users */ if (bktr->xtal_pll_mode == BT848_USE_PLL) { bt848->tgctrl=0; bt848->pll_f_lo=0xf9; bt848->pll_f_hi=0xdc; bt848->pll_f_xci=0x8e; } bktr->flags = (bktr->flags & ~METEOR_DEV_MASK) | METEOR_DEV0; bktr->max_clip_node = 0; bt848->color_ctl_gamma = 1; bt848->color_ctl_rgb_ded = 1; bt848->color_ctl_color_bars = 0; bt848->color_ctl_ext_frmrate = 0; bt848->color_ctl_swap = 0; bt848->e_hscale_lo = 170; bt848->o_hscale_lo = 170; bt848->e_delay_lo = 0x72; bt848->o_delay_lo = 0x72; bt848->e_scloop = 0; bt848->o_scloop = 0; bt848->vbi_pack_size = 0; bt848->vbi_pack_del = 0; bktr->fifo_errors = 0; bktr->dma_errors = 0; bktr->frames_captured = 0; bktr->even_fields_captured = 0; bktr->odd_fields_captured = 0; bktr->proc = (struct proc *)0; set_fps(bktr, frame_rate); bktr->video.addr = 0; bktr->video.width = 0; bktr->video.banksize = 0; bktr->video.ramsize = 0; bktr->pixfmt_compat = TRUE; bktr->format = METEOR_GEO_RGB16; bktr->pixfmt = oformat_meteor_to_bt( bktr->format ); bktr->capture_area_enabled = FALSE; bt848->int_mask = BT848_INT_MYSTERYBIT; /* if you take this out triton based motherboards will operate unreliably */ return( 0 );}/* * */static inttuner_open( bktr_ptr_t bktr ){ if ( !(bktr->tflags & TUNER_INITALIZED) ) /* device not found */ return( ENXIO ); if ( bktr->tflags & TUNER_OPEN ) /* already open */ return( 0 ); bktr->tflags |= TUNER_OPEN; bktr->tuner.radio_mode = 0; /* enable drivers on the GPIO port that control the MUXes */ bktr->base->gpio_out_en |= GPIO_AUDIOMUX_BITS; /* unmute the audio stream */ set_audio( bktr, AUDIO_UNMUTE ); /* enable stereo if appropriate on TDA audio chip */ if ( bktr->card.dbx ) set_BTSC( bktr, 0 ); /* reset the MSP34xx stereo audio chip */ if ( bktr->card.msp3400c ) msp_reset( bktr ); return( 0 );}/* * */intbktr_close( dev_t dev, int flags, int fmt, struct proc *p ){ bktr_ptr_t bktr; int unit; unit = UNIT( minor(dev) ); if (unit >= NBKTR) /* unit out of range */ return( ENXIO ); bktr = &(brooktree[ unit ]); switch ( MINOR( minor(dev) ) ) { case VIDEO_DEV: return( video_close( bktr ) ); case TUNER_DEV: return( tuner_close( bktr ) ); } return( ENXIO );}/* * */static intvideo_close( bktr_ptr_t bktr ){ bt848_ptr_t bt848; bktr->flags &= ~(METEOR_OPEN | METEOR_SINGLE | METEOR_CAP_MASK | METEOR_WANT_MASK); bt848 = bktr->base; bt848->gpio_dma_ctl = FIFO_RISC_DISABLED; bt848->cap_ctl = CAPTURE_OFF; bktr->dma_prog_loaded = FALSE; bt848->tdec = 0; bt848->int_mask = ALL_INTS_DISABLED;/** FIXME: is 0xf magic, wouldn't 0x00 work ??? */ bt848->sreset = 0xf; bt848->int_stat = ALL_INTS_CLEARED; return( 0 );}/* * tuner close handle, * place holder for tuner specific operations on a close. */static inttuner_close( bktr_ptr_t bktr ){ bktr->tflags &= ~TUNER_OPEN; /* mute the audio by switching the mux */ set_audio( bktr, AUDIO_MUTE ); /* disable drivers on the GPIO port that control the MUXes */ bktr->base->gpio_out_en = bktr->base->gpio_out_en & ~GPIO_AUDIOMUX_BITS; return( 0 );}/* * */intbktr_read( dev_t dev, struct uio *uio, int ioflag ){ bktr_ptr_t bktr; bt848_ptr_t bt848; int unit; int status; int count; if (MINOR(minor(dev)) > 0) return( ENXIO ); unit = UNIT(minor(dev)); if (unit >= NBKTR) /* unit out of range */ return( ENXIO ); bktr = &(brooktree[unit]); bt848 = bktr->base; if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */ return( ENOMEM ); if (bktr->flags & METEOR_CAP_MASK) return( EIO ); /* already capturing */ bt848->cap_ctl = bktr->bktr_cap_ctl; count = bktr->rows * bktr->cols * pixfmt_table[ bktr->pixfmt ].public.Bpp; if ((int) uio->uio_iov->iov_len < count) return( EINVAL ); bktr->flags &= ~(METEOR_CAP_MASK | METEOR_WANT_MASK); /* capture one frame */ start_capture(bktr, METEOR_SINGLE); /* wait for capture to complete */ bt848->int_stat = ALL_INTS_CLEARED; bt848->gpio_dma_ctl = FIFO_ENABLED; bt848->gpio_dma_ctl = bktr->capcontrol; bt848->int_mask = BT848_INT_MYSTERYBIT | BT848_INT_RISCI | BT848_INT_VSYNC | BT848_INT_FMTCHG; status = tsleep((caddr_t)bktr, BKTRPRI, "captur", 0); if (!status) /* successful capture */ status = uiomove((caddr_t)bktr->bigbuf, count, uio); else printf ("bktr%d: read: tsleep error %d\n", unit, status); bktr->flags &= ~(METEOR_SINGLE | METEOR_WANT_MASK); return( status );}/* * */intbktr_write( dev_t dev, struct uio *uio, int ioflag ){ return( EINVAL ); /* XXX or ENXIO ? */}/* * */intbktr_ioctl( dev_t dev, ioctl_cmd_t cmd, caddr_t arg, int flag, struct proc* pr ){ bktr_ptr_t bktr; int unit; unit = UNIT(minor(dev)); if (unit >= NBKTR) /* unit out of range */ return( ENXIO ); bktr = &(brooktree[ unit ]); if (bktr->bigbuf == 0) /* no frame buffer allocated (ioctl failed) */ return( ENOMEM ); switch ( MINOR( minor(dev) ) ) { case VIDEO_DEV: return( video_ioctl( bktr, unit, cmd, arg, pr ) ); case TUNER_DEV: return( tuner_ioctl( bktr, unit, cmd, arg, pr ) ); } return( ENXIO );}/* * video ioctls */static intvideo_ioctl( bktr_ptr_t bktr, int unit, int cmd, caddr_t arg, struct proc* pr ){ bt848_ptr_t bt848; volatile u_char c_temp; unsigned int temp; unsigned int temp_iform; unsigned int error; struct meteor_geomet *geo; struct meteor_counts *cnt; struct meteor_video *video; struct bktr_capture_area *cap_area; vm_offset_t buf; int i; char char_temp; bt848 = bktr->base; switch ( cmd ) { case BT848SCLIP: /* set clip region */ bktr->max_clip_node = 0; memcpy(&bktr->clip_list, arg, sizeof(bktr->clip_list)); for (i = 0; i < BT848_MAX_CLIP_NODE; i++) { if (bktr->clip_list[i].y_min == 0 && bktr->clip_list[i].y_max == 0) break; } bktr->max_clip_node = i; /* make sure that the list contains a valid clip secquence */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -