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

📄 cx88-blackbird.c

📁 h内核
💻 C
📖 第 1 页 / 共 2 页
字号:
        /* assign audio properties */        blackbird_api_cmd(dev, IVTV_API_ASSIGN_AUDIO_PROPERTIES, 1, 0, 0 | (2 << 2) | (14 << 4));        /* assign dnr filter mode */        blackbird_api_cmd(dev, IVTV_API_ASSIGN_DNR_FILTER_MODE, 2, 0, 0, 0);        /* assign dnr filter props*/        blackbird_api_cmd(dev, IVTV_API_ASSIGN_DNR_FILTER_PROPS, 2, 0, 0, 0);        /* assign coring levels (luma_h, luma_l, chroma_h, chroma_l) */        blackbird_api_cmd(dev, IVTV_API_ASSIGN_CORING_LEVELS, 4, 0, 0, 255, 0, 255);	/* assign spatial filter type: luma_t: 1 = horiz_only, chroma_t: 1 = horiz_only */        blackbird_api_cmd(dev, IVTV_API_ASSIGN_SPATIAL_FILTER_TYPE, 2, 0, 1, 1);        /* assign frame drop rate */        blackbird_api_cmd(dev, IVTV_API_ASSIGN_FRAME_DROP_RATE, 1, 0, 0);}static int blackbird_initialize_codec(struct cx8802_dev *dev){	struct cx88_core *core = dev->core;	int version;	int retval;	dprintk(1,"Initialize codec\n");	retval = blackbird_api_cmd(dev, IVTV_API_ENC_PING_FW, 0, 0); /* ping */	if (retval < 0) {		/* ping was not successful, reset and upload firmware */		cx_write(MO_SRST_IO, 0); /* SYS_RSTO=0 */		msleep(1);		cx_write(MO_SRST_IO, 1); /* SYS_RSTO=1 */		msleep(1);		retval = blackbird_load_firmware(dev);		if (retval < 0)			return retval;		dev->mailbox = blackbird_find_mailbox(dev);		if (dev->mailbox < 0)			return -1;		retval = blackbird_api_cmd(dev, IVTV_API_ENC_PING_FW, 0, 0); /* ping */		if (retval < 0) {			dprintk(0, "ERROR: Firmware ping failed!\n");			return -1;		}		retval = blackbird_api_cmd(dev, IVTV_API_ENC_GETVER, 0, 1, &version);		if (retval < 0) {			dprintk(0, "ERROR: Firmware get encoder version failed!\n");			return -1;		}		dprintk(0, "Firmware version is 0x%08x\n", version);	}	msleep(1);	cx_write(MO_PINMUX_IO, 0x88); /* 656-8bit IO and enable MPEG parallel IO */	cx_clear(MO_INPUT_FORMAT, 0x100); /* chroma subcarrier lock to normal? */	cx_write(MO_VBOS_CONTROL, 0x84A00); /* no 656 mode, 8-bit pixels, disable VBI */	cx_clear(MO_OUTPUT_FORMAT, 0x0008); /* Normal Y-limits to let the mpeg encoder sync */#if 0 /* FIXME */	set_scale(dev, 720, 480, V4L2_FIELD_INTERLACED);#endif	blackbird_codec_settings(dev);	msleep(1);	//blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xef, 0xef);	blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xf0, 0xf0);	//blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0x180, 0x180);        blackbird_api_cmd(dev, IVTV_API_ASSIGN_PLACEHOLDER, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);	blackbird_api_cmd(dev, IVTV_API_INITIALIZE_INPUT, 0, 0); /* initialize the video input */	msleep(1);        blackbird_api_cmd(dev, IVTV_API_MUTE_VIDEO, 1, 0, 0);	msleep(1);        blackbird_api_cmd(dev, IVTV_API_MUTE_AUDIO, 1, 0, 0);	msleep(1);	blackbird_api_cmd(dev, IVTV_API_BEGIN_CAPTURE, 2, 0, 0, 0x13); /* start capturing to the host interface */	//blackbird_api_cmd(dev, IVTV_API_BEGIN_CAPTURE, 2, 0, 0, 0); /* start capturing to the host interface */	msleep(1);	blackbird_api_cmd(dev, IVTV_API_REFRESH_INPUT, 0,0);	return 0;}/* ------------------------------------------------------------------ */static int bb_buf_setup(struct videobuf_queue *q,			unsigned int *count, unsigned int *size){	struct cx8802_fh *fh = q->priv_data;	fh->dev->ts_packet_size  = 512;	fh->dev->ts_packet_count = 100;	*size = fh->dev->ts_packet_size * fh->dev->ts_packet_count;	if (0 == *count)		*count = mpegbufs;	if (*count < 2)		*count = 2;	if (*count > 32)		*count = 32;	return 0;}static intbb_buf_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,	       enum v4l2_field field){	struct cx8802_fh *fh = q->priv_data;	return cx8802_buf_prepare(fh->dev, (struct cx88_buffer*)vb);}static voidbb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb){	struct cx8802_fh *fh = q->priv_data;	cx8802_buf_queue(fh->dev, (struct cx88_buffer*)vb);}static voidbb_buf_release(struct videobuf_queue *q, struct videobuf_buffer *vb){	struct cx8802_fh *fh = q->priv_data;	cx88_free_buffer(fh->dev->pci, (struct cx88_buffer*)vb);}static struct videobuf_queue_ops blackbird_qops = {	.buf_setup    = bb_buf_setup,	.buf_prepare  = bb_buf_prepare,	.buf_queue    = bb_buf_queue,	.buf_release  = bb_buf_release,};/* ------------------------------------------------------------------ */static int mpeg_do_ioctl(struct inode *inode, struct file *file,			 unsigned int cmd, void *arg){	struct cx8802_fh  *fh  = file->private_data;	struct cx8802_dev *dev = fh->dev;	if (debug > 1)		cx88_print_ioctl(dev->core->name,cmd);	switch (cmd) {	/* --- capture ioctls ---------------------------------------- */	case VIDIOC_ENUM_FMT:	{		struct v4l2_fmtdesc *f = arg;		int index;		index = f->index;		if (index != 0)			return -EINVAL;		memset(f,0,sizeof(*f));		f->index = index;		strlcpy(f->description, "MPEG TS", sizeof(f->description));		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;		f->pixelformat = V4L2_PIX_FMT_MPEG;		return 0;	}	case VIDIOC_G_FMT:	case VIDIOC_S_FMT:	case VIDIOC_TRY_FMT:	{		/* FIXME -- quick'n'dirty for exactly one size ... */		struct v4l2_format *f = arg;		memset(f,0,sizeof(*f));		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;		f->fmt.pix.width        = 720;		f->fmt.pix.height       = 576;		f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;		f->fmt.pix.sizeimage    = 1024 * 512 /* FIXME: BUFFER_SIZE */;	}	/* --- streaming capture ------------------------------------- */	case VIDIOC_REQBUFS:		return videobuf_reqbufs(&fh->mpegq, arg);	case VIDIOC_QUERYBUF:		return videobuf_querybuf(&fh->mpegq, arg);	case VIDIOC_QBUF:		return videobuf_qbuf(&fh->mpegq, arg);	case VIDIOC_DQBUF:		return videobuf_dqbuf(&fh->mpegq, arg,				      file->f_flags & O_NONBLOCK);	case VIDIOC_STREAMON:		return videobuf_streamon(&fh->mpegq);	case VIDIOC_STREAMOFF:		return videobuf_streamoff(&fh->mpegq);	default:		return -EINVAL;	}	return 0;}static int mpeg_ioctl(struct inode *inode, struct file *file,		       unsigned int cmd, unsigned long arg){	return video_usercopy(inode, file, cmd, arg, mpeg_do_ioctl);}static int mpeg_open(struct inode *inode, struct file *file){	int minor = iminor(inode);	struct cx8802_dev *h,*dev = NULL;	struct cx8802_fh *fh;	struct list_head *list;	list_for_each(list,&cx8802_devlist) {		h = list_entry(list, struct cx8802_dev, devlist);		if (h->mpeg_dev->minor == minor)			dev = h;	}	if (NULL == dev)		return -ENODEV;	if (blackbird_initialize_codec(dev) < 0)		return -EINVAL;	dprintk(1,"open minor=%d\n",minor);	/* allocate + initialize per filehandle data */	fh = kmalloc(sizeof(*fh),GFP_KERNEL);	if (NULL == fh)		return -ENOMEM;	memset(fh,0,sizeof(*fh));	file->private_data = fh;	fh->dev      = dev;	videobuf_queue_init(&fh->mpegq, &blackbird_qops,			    dev->pci, &dev->slock,			    V4L2_BUF_TYPE_VIDEO_CAPTURE,			    V4L2_FIELD_TOP,			    sizeof(struct cx88_buffer),			    fh);	return 0;}static int mpeg_release(struct inode *inode, struct file *file){	struct cx8802_fh  *fh  = file->private_data;	blackbird_api_cmd(fh->dev, IVTV_API_END_CAPTURE, 3, 0, 1, 0, 0x13);	/* stop mpeg capture */	if (fh->mpegq.streaming)		videobuf_streamoff(&fh->mpegq);	if (fh->mpegq.reading)		videobuf_read_stop(&fh->mpegq);	file->private_data = NULL;	kfree(fh);	return 0;}static ssize_tmpeg_read(struct file *file, char __user *data, size_t count, loff_t *ppos){	struct cx8802_fh *fh = file->private_data;	return videobuf_read_stream(&fh->mpegq, data, count, ppos, 0,				    file->f_flags & O_NONBLOCK);}static unsigned intmpeg_poll(struct file *file, struct poll_table_struct *wait){	struct cx8802_fh *fh = file->private_data;	return videobuf_poll_stream(file, &fh->mpegq, wait);}static intmpeg_mmap(struct file *file, struct vm_area_struct * vma){	struct cx8802_fh *fh = file->private_data;	return videobuf_mmap_mapper(&fh->mpegq, vma);}static struct file_operations mpeg_fops ={	.owner	       = THIS_MODULE,	.open	       = mpeg_open,	.release       = mpeg_release,	.read	       = mpeg_read,	.poll          = mpeg_poll,	.mmap	       = mpeg_mmap,	.ioctl	       = mpeg_ioctl,	.llseek        = no_llseek,};static struct video_device cx8802_mpeg_template ={	.name          = "cx8802",	.type          = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_SCALES|VID_TYPE_MPEG_ENCODER,	.hardware      = 0,	.fops          = &mpeg_fops,	.minor         = -1,};/* ------------------------------------------------------------------ */static void blackbird_unregister_video(struct cx8802_dev *dev){	if (dev->mpeg_dev) {		if (-1 != dev->mpeg_dev->minor)			video_unregister_device(dev->mpeg_dev);		else			video_device_release(dev->mpeg_dev);		dev->mpeg_dev = NULL;	}}static int blackbird_register_video(struct cx8802_dev *dev){	int err;	dev->mpeg_dev = cx88_vdev_init(dev->core,dev->pci,				       &cx8802_mpeg_template,"mpeg");	err = video_register_device(dev->mpeg_dev,VFL_TYPE_GRABBER, -1);	if (err < 0) {		printk(KERN_INFO "%s/2: can't register mpeg device\n",		       dev->core->name);		return err;	}	printk(KERN_INFO "%s/2: registered device video%d [mpeg]\n",	       dev->core->name,dev->mpeg_dev->minor & 0x1f);	return 0;}/* ----------------------------------------------------------- */static int __devinit blackbird_probe(struct pci_dev *pci_dev,				     const struct pci_device_id *pci_id){	struct cx8802_dev *dev;	struct cx88_core  *core;	int err;	/* general setup */	core = cx88_core_get(pci_dev);	if (NULL == core)		return -EINVAL;	err = -ENODEV;	if (!cx88_boards[core->board].blackbird)		goto fail_core;	err = -ENOMEM;	dev = kmalloc(sizeof(*dev),GFP_KERNEL);	if (NULL == dev)		goto fail_core;	memset(dev,0,sizeof(*dev));	dev->pci = pci_dev;	dev->core = core;	err = cx8802_init_common(dev);	if (0 != err)		goto fail_free;	/* blackbird stuff */	printk("%s/2: cx23416 based mpeg encoder (blackbird reference design)\n",	       core->name);	host_setup(dev->core);	list_add_tail(&dev->devlist,&cx8802_devlist);	blackbird_register_video(dev);	return 0; fail_free:	kfree(dev); fail_core:	cx88_core_put(core,pci_dev);	return err;}static void __devexit blackbird_remove(struct pci_dev *pci_dev){        struct cx8802_dev *dev = pci_get_drvdata(pci_dev);	/* blackbird */	blackbird_unregister_video(dev);	list_del(&dev->devlist);	/* common */	cx8802_fini_common(dev);}static struct pci_device_id cx8802_pci_tbl[] = {	{		.vendor       = 0x14f1,		.device       = 0x8802,                .subvendor    = PCI_ANY_ID,                .subdevice    = PCI_ANY_ID,	},{		/* --- end of list --- */	}};MODULE_DEVICE_TABLE(pci, cx8802_pci_tbl);static struct pci_driver blackbird_pci_driver = {        .name     = "cx88-blackbird",        .id_table = cx8802_pci_tbl,        .probe    = blackbird_probe,        .remove   = __devexit_p(blackbird_remove),	.suspend  = cx8802_suspend_common,	.resume   = cx8802_resume_common,};static int blackbird_init(void){	printk(KERN_INFO "cx2388x blackbird driver version %d.%d.%d loaded\n",	       (CX88_VERSION_CODE >> 16) & 0xff,	       (CX88_VERSION_CODE >>  8) & 0xff,	       CX88_VERSION_CODE & 0xff);#ifdef SNAPSHOT	printk(KERN_INFO "cx2388x: snapshot date %04d-%02d-%02d\n",	       SNAPSHOT/10000, (SNAPSHOT/100)%100, SNAPSHOT%100);#endif	return pci_module_init(&blackbird_pci_driver);}static void blackbird_fini(void){	pci_unregister_driver(&blackbird_pci_driver);}module_init(blackbird_init);module_exit(blackbird_fini);/* ----------------------------------------------------------- *//* * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -