⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brooktree848.c

📁 基于组件方式开发操作系统的OSKIT源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
 */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 + -