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

📄 tvp5150.c

📁 linux tvp5150 driver the is ok for test
💻 C
📖 第 1 页 / 共 3 页
字号:
		tvp5150_info("tvp%02x%02xam1 detected.\n",msb_id, lsb_id);	printk("tvp%02x%02xam1 detected.----------\n",msb_id, lsb_id);		/* ITU-T BT.656.4 timing */		tvp5150_write(c,TVP5150_REV_SELECT,0);	} else {		if ((msb_rom==3)||(lsb_rom==0x21)) { /* Is TVP5150A */			tvp5150_info("tvp%02x%02xa detected.\n",msb_id, lsb_id);		} else {			tvp5150_info("*** unknown tvp%02x%02x chip detected.\n",msb_id,lsb_id);			tvp5150_info("*** Rom ver is %d.%d\n",msb_rom,lsb_rom);		}	}	/* Initializes TVP5150 to its default values */	tvp5150_write_inittab(c, tvp5150_init_default);	/* Initializes VDP registers */	tvp5150_vdp_init(c, vbi_ram_default);	/* Selects decoder input */	tvp5150_selmux(c);	/* Initializes TVP5150 to stream enabled values */	tvp5150_write_inittab(c, tvp5150_init_enable);	/* Initialize image preferences */	tvp5150_write(c, TVP5150_BRIGHT_CTL, decoder->bright);	tvp5150_write(c, TVP5150_CONTRAST_CTL, decoder->contrast);	tvp5150_write(c, TVP5150_SATURATION_CTL, decoder->contrast);	tvp5150_write(c, TVP5150_HUE_CTL, decoder->hue);	tvp5150_set_std(c, decoder->norm);};static int tvp5150_get_ctrl(struct i2c_client *c, struct v4l2_control *ctrl){/*	struct tvp5150 *decoder = i2c_get_clientdata(c); */	switch (ctrl->id) {	case V4L2_CID_BRIGHTNESS:		ctrl->value = tvp5150_read(c, TVP5150_BRIGHT_CTL);		return 0;	case V4L2_CID_CONTRAST:		ctrl->value = tvp5150_read(c, TVP5150_CONTRAST_CTL);		return 0;	case V4L2_CID_SATURATION:		ctrl->value = tvp5150_read(c, TVP5150_SATURATION_CTL);		return 0;	case V4L2_CID_HUE:		ctrl->value = tvp5150_read(c, TVP5150_HUE_CTL);		return 0;	}	return -EINVAL;}static int tvp5150_set_ctrl(struct i2c_client *c, struct v4l2_control *ctrl){/*	struct tvp5150 *decoder = i2c_get_clientdata(c); */	switch (ctrl->id) {	case V4L2_CID_BRIGHTNESS:		tvp5150_write(c, TVP5150_BRIGHT_CTL, ctrl->value);		return 0;	case V4L2_CID_CONTRAST:		tvp5150_write(c, TVP5150_CONTRAST_CTL, ctrl->value);		return 0;	case V4L2_CID_SATURATION:		tvp5150_write(c, TVP5150_SATURATION_CTL, ctrl->value);		return 0;	case V4L2_CID_HUE:		tvp5150_write(c, TVP5150_HUE_CTL, ctrl->value);		return 0;	}	return -EINVAL;}/****************************************************************************			I2C Command ****************************************************************************/static int tvp5150_command(struct i2c_client *c,			   unsigned int cmd, void *arg){	struct tvp5150 *decoder = i2c_get_clientdata(c);	printk("input tvp5150_command ----------!\n");	switch (cmd) {	case 0:	case VIDIOC_INT_RESET:		tvp5150_reset(c);		break;	case VIDIOC_INT_G_VIDEO_ROUTING:	{		struct v4l2_routing *route = arg;		*route = decoder->route;		break;	}	case VIDIOC_INT_S_VIDEO_ROUTING:	{		struct v4l2_routing *route = arg;		decoder->route = *route;		tvp5150_selmux(c);		break;	}	case VIDIOC_S_STD:		if (decoder->norm == *(v4l2_std_id *)arg)			break;		return tvp5150_set_std(c, *(v4l2_std_id *)arg);	case VIDIOC_G_STD:		*(v4l2_std_id *)arg = decoder->norm;		break;	case VIDIOC_G_SLICED_VBI_CAP:	{		struct v4l2_sliced_vbi_cap *cap = arg;		tvp5150_dbg(1, "VIDIOC_G_SLICED_VBI_CAP\n");		tvp5150_vbi_get_cap(vbi_ram_default, cap);		break;	}	case VIDIOC_S_FMT:	{		struct v4l2_format *fmt;		struct v4l2_sliced_vbi_format *svbi;		int i;		fmt = arg;		if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)			return -EINVAL;		svbi = &fmt->fmt.sliced;		if (svbi->service_set != 0) {			for (i = 0; i <= 23; i++) {				svbi->service_lines[1][i] = 0;				svbi->service_lines[0][i]=tvp5150_set_vbi(c,					 vbi_ram_default,					 svbi->service_lines[0][i],0xf0,i,3);			}			/* Enables FIFO */			tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,1);		} else {			/* Disables FIFO*/			tvp5150_write(c, TVP5150_FIFO_OUT_CTRL,0);			/* Disable Full Field */			tvp5150_write(c, TVP5150_FULL_FIELD_ENA, 0);			/* Disable Line modes */			for (i=TVP5150_LINE_MODE_INI; i<=TVP5150_LINE_MODE_END; i++)				tvp5150_write(c, i, 0xff);		}		break;	}	case VIDIOC_G_FMT:	{		struct v4l2_format *fmt;		struct v4l2_sliced_vbi_format *svbi;		int i, mask=0;		fmt = arg;		if (fmt->type != V4L2_BUF_TYPE_SLICED_VBI_CAPTURE)			return -EINVAL;		svbi = &fmt->fmt.sliced;		memset(svbi, 0, sizeof(*svbi));		for (i = 0; i <= 23; i++) {			svbi->service_lines[0][i]=tvp5150_get_vbi(c,				vbi_ram_default,i);			mask|=svbi->service_lines[0][i];		}		svbi->service_set=mask;		break;	}#ifdef CONFIG_VIDEO_ADV_DEBUG	case VIDIOC_DBG_G_REGISTER:	case VIDIOC_DBG_S_REGISTER:	{		struct v4l2_register *reg = arg;		if (!v4l2_chip_match_i2c_client(c, reg->match_type, reg->match_chip))			return -EINVAL;		if (!capable(CAP_SYS_ADMIN))			return -EPERM;		if (cmd == VIDIOC_DBG_G_REGISTER)			reg->val = tvp5150_read(c, reg->reg & 0xff);		else			tvp5150_write(c, reg->reg & 0xff, reg->val & 0xff);		break;	}#endif	case VIDIOC_LOG_STATUS:		dump_reg(c);		break;	case VIDIOC_G_TUNER:		{			struct v4l2_tuner *vt = arg;			int status = tvp5150_read(c, 0x88);			vt->signal = ((status & 0x04) && (status & 0x02)) ? 0xffff : 0x0;			break;		}	case VIDIOC_QUERYCTRL:		{			struct v4l2_queryctrl *qc = arg;			int i;			tvp5150_dbg(1, "VIDIOC_QUERYCTRL called\n");			for (i = 0; i < ARRAY_SIZE(tvp5150_qctrl); i++)				if (qc->id && qc->id == tvp5150_qctrl[i].id) {					memcpy(qc, &(tvp5150_qctrl[i]),					       sizeof(*qc));					return 0;				}			return -EINVAL;		}	case VIDIOC_G_CTRL:		{			struct v4l2_control *ctrl = arg;			tvp5150_dbg(1, "VIDIOC_G_CTRL called\n");			return tvp5150_get_ctrl(c, ctrl);		}	case VIDIOC_S_CTRL:		{			struct v4l2_control *ctrl = arg;			u8 i, n;			n = ARRAY_SIZE(tvp5150_qctrl);			for (i = 0; i < n; i++)				if (ctrl->id == tvp5150_qctrl[i].id) {					if (ctrl->value <					    tvp5150_qctrl[i].minimum					    || ctrl->value >					    tvp5150_qctrl[i].maximum)						return -ERANGE;					tvp5150_dbg(1,						"VIDIOC_S_CTRL: id=%d, value=%d\n",						ctrl->id, ctrl->value);					return tvp5150_set_ctrl(c, ctrl);				}			return -EINVAL;		}	default:		return -EINVAL;	}	return 0;}/****************************************************************************			I2C Client & Driver ****************************************************************************//*following add by esion */static struct file_operations tvp5150_fops = {	.owner		= THIS_MODULE,	.ioctl		= tvp5150_command,};static struct miscdevice tvp5150_miscdev = {	.name		= "(unset)",	.fops		= &tvp5150_fops,};static struct i2c_driver driver;static struct i2c_client client_template = {	.name = "(unset)",	.driver = &driver,};static int tvp5150_detect_client(struct i2c_adapter *adapter,				 int address, int kind){	struct i2c_client *c;	struct tvp5150 *core;	int rv;	if (debug)		printk( KERN_INFO		"tvp5150.c: detecting tvp5150 client on address 0x%x\n",		address << 1);	client_template.adapter = adapter;	client_template.addr = address;	/* Check if the adapter supports the needed features */	if (!i2c_check_functionality	    (adapter,	     I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))		return 0;	c = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);	if (c == 0)		return -ENOMEM;	memcpy(c, &client_template, sizeof(struct i2c_client));	core = kzalloc(sizeof(struct tvp5150), GFP_KERNEL);	if (core == 0) {		kfree(c);		return -ENOMEM;	}	i2c_set_clientdata(c, core);	rv = i2c_attach_client(c);		core->norm = V4L2_STD_ALL;	/* Default is autodetect */	core->route.input = TVP5150_COMPOSITE1;	core->enable = 1;	core->bright = 128;	core->contrast = 128;	core->hue = 0;	core->sat = 128;		if ((err = misc_register(&tvp5150_miscdev))){			tvp5150_miscdev = NULL;			printk(KERN_ERR "Failed to register tvp5150_miscdev device\n");		}	if (rv) {		kfree(c);		kfree(core);		return rv;	}	if (debug > 1)		dump_reg(c);	return 0;}static int tvp5150_attach_adapter(struct i2c_adapter *adapter){	if (debug)		printk( KERN_INFO		"tvp5150.c: starting probe for adapter %s (0x%x)\n",		adapter->name, adapter->id);	return i2c_probe(adapter, &addr_data, &tvp5150_detect_client);}static int tvp5150_detach_client(struct i2c_client *c){	struct tvp5150 *decoder = i2c_get_clientdata(c);	int err;	tvp5150_dbg(1,		"tvp5150.c: removing tvp5150 adapter on address 0x%x\n",		c->addr << 1);	err = i2c_detach_client(c);	if (err) {		return err;	}	misc_deregister(&tvp5150_miscdev);	kfree(decoder);	kfree(c);	return 0;}/* ----------------------------------------------------------------------- */static struct i2c_driver driver = {	.driver = {		.name = "tvp5150",	},	.id = I2C_DRIVERID_TVP5150,	.attach_adapter = tvp5150_attach_adapter,	.detach_client = tvp5150_detach_client,	.command = tvp5150_command,};static int __init tvp5150_init(void){	return i2c_add_driver(&driver);}static void __exit tvp5150_exit(void){	i2c_del_driver(&driver);}module_init(tvp5150_init);module_exit(tvp5150_exit);

⌨️ 快捷键说明

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