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

📄 budget-av.c

📁 trident tm5600的linux驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
#define SUBID_DVBS_KNC1_PLUS		0x0011#define SUBID_DVBS_TYPHOON		0x4f56#define SUBID_DVBS_CINERGY1200		0x1154#define SUBID_DVBS_CYNERGY1200N 	0x1155#define SUBID_DVBS_TV_STAR		0x0014#define SUBID_DVBS_TV_STAR_PLUS_X4	0x0015#define SUBID_DVBS_TV_STAR_CI		0x0016#define SUBID_DVBS_EASYWATCH_1  	0x001a#define SUBID_DVBS_EASYWATCH_2  	0x001b#define SUBID_DVBS_EASYWATCH		0x001e#define SUBID_DVBC_EASYWATCH		0x002a#define SUBID_DVBC_EASYWATCH_MK3	0x002c#define SUBID_DVBC_KNC1			0x0020#define SUBID_DVBC_KNC1_PLUS		0x0021#define SUBID_DVBC_KNC1_MK3		0x0022#define SUBID_DVBC_KNC1_PLUS_MK3	0x0023#define SUBID_DVBC_CINERGY1200		0x1156#define SUBID_DVBC_CINERGY1200_MK3	0x1176#define SUBID_DVBT_EASYWATCH		0x003a#define SUBID_DVBT_KNC1_PLUS		0x0031#define SUBID_DVBT_KNC1			0x0030#define SUBID_DVBT_CINERGY1200		0x1157static void frontend_init(struct budget_av *budget_av){	struct saa7146_dev * saa = budget_av->budget.dev;	struct dvb_frontend * fe = NULL;	/* Enable / PowerON Frontend */	saa7146_setgpio(saa, 0, SAA7146_GPIO_OUTLO);	/* Wait for PowerON */	msleep(100);	/* additional setup necessary for the PLUS cards */	switch (saa->pci->subsystem_device) {		case SUBID_DVBS_KNC1_PLUS:		case SUBID_DVBC_KNC1_PLUS:		case SUBID_DVBT_KNC1_PLUS:		case SUBID_DVBC_EASYWATCH:		case SUBID_DVBC_KNC1_PLUS_MK3:			saa7146_setgpio(saa, 3, SAA7146_GPIO_OUTHI);			break;	}	switch (saa->pci->subsystem_device) {	case SUBID_DVBS_KNC1:		/*		 * maybe that setting is needed for other dvb-s cards as well,		 * but so far it has been only confirmed for this type		 */		budget_av->reinitialise_demod = 1;		/* fall through */	case SUBID_DVBS_KNC1_PLUS:	case SUBID_DVBS_EASYWATCH_1:		if (saa->pci->subsystem_vendor == 0x1894) {			fe = dvb_attach(stv0299_attach, &cinergy_1200s_1894_0010_config,					     &budget_av->budget.i2c_adap);			if (fe) {				dvb_attach(tua6100_attach, fe, 0x60, &budget_av->budget.i2c_adap);			}		} else {			fe = dvb_attach(stv0299_attach, &typhoon_config,					     &budget_av->budget.i2c_adap);			if (fe) {				fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params;			}		}		break;	case SUBID_DVBS_TV_STAR:	case SUBID_DVBS_TV_STAR_PLUS_X4:	case SUBID_DVBS_TV_STAR_CI:	case SUBID_DVBS_CYNERGY1200N:	case SUBID_DVBS_EASYWATCH:	case SUBID_DVBS_EASYWATCH_2:		fe = dvb_attach(stv0299_attach, &philips_sd1878_config,				&budget_av->budget.i2c_adap);		if (fe) {			dvb_attach(dvb_pll_attach, fe, 0x60,				   &budget_av->budget.i2c_adap,				   DVB_PLL_PHILIPS_SD1878_TDA8261);		}		break;	case SUBID_DVBS_TYPHOON:		fe = dvb_attach(stv0299_attach, &typhoon_config,				    &budget_av->budget.i2c_adap);		if (fe) {			fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params;		}		break;	case SUBID_DVBS_CINERGY1200:		fe = dvb_attach(stv0299_attach, &cinergy_1200s_config,				    &budget_av->budget.i2c_adap);		if (fe) {			fe->ops.tuner_ops.set_params = philips_su1278_ty_ci_tuner_set_params;		}		break;	case SUBID_DVBC_KNC1:	case SUBID_DVBC_KNC1_PLUS:	case SUBID_DVBC_CINERGY1200:	case SUBID_DVBC_EASYWATCH:		budget_av->reinitialise_demod = 1;		budget_av->budget.dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;		fe = dvb_attach(tda10021_attach, &philips_cu1216_config,				     &budget_av->budget.i2c_adap,				     read_pwm(budget_av));		if (fe == NULL)			fe = dvb_attach(tda10021_attach, &philips_cu1216_config_altaddress,					     &budget_av->budget.i2c_adap,					     read_pwm(budget_av));		if (fe) {			fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params;		}		break;	case SUBID_DVBC_EASYWATCH_MK3:	case SUBID_DVBC_CINERGY1200_MK3:	case SUBID_DVBC_KNC1_MK3:	case SUBID_DVBC_KNC1_PLUS_MK3:		budget_av->reinitialise_demod = 1;		budget_av->budget.dev->i2c_bitrate = SAA7146_I2C_BUS_BIT_RATE_240;		fe = dvb_attach(tda10023_attach,			&philips_cu1216_tda10023_config,			&budget_av->budget.i2c_adap,			read_pwm(budget_av));		if (fe) {			fe->ops.tuner_ops.set_params = philips_cu1216_tuner_set_params;		}		break;	case SUBID_DVBT_EASYWATCH:	case SUBID_DVBT_KNC1:	case SUBID_DVBT_KNC1_PLUS:	case SUBID_DVBT_CINERGY1200:		budget_av->reinitialise_demod = 1;		fe = dvb_attach(tda10046_attach, &philips_tu1216_config,				     &budget_av->budget.i2c_adap);		if (fe) {			fe->ops.tuner_ops.init = philips_tu1216_tuner_init;			fe->ops.tuner_ops.set_params = philips_tu1216_tuner_set_params;		}		break;	}	if (fe == NULL) {		printk(KERN_ERR "budget-av: A frontend driver was not found "				"for device [%04x:%04x] subsystem [%04x:%04x]\n",		       saa->pci->vendor,		       saa->pci->device,		       saa->pci->subsystem_vendor,		       saa->pci->subsystem_device);		return;	}	budget_av->budget.dvb_frontend = fe;	if (dvb_register_frontend(&budget_av->budget.dvb_adapter,				  budget_av->budget.dvb_frontend)) {		printk(KERN_ERR "budget-av: Frontend registration failed!\n");		dvb_frontend_detach(budget_av->budget.dvb_frontend);		budget_av->budget.dvb_frontend = NULL;	}}static void budget_av_irq(struct saa7146_dev *dev, u32 * isr){	struct budget_av *budget_av = (struct budget_av *) dev->ext_priv;	dprintk(8, "dev: %p, budget_av: %p\n", dev, budget_av);	if (*isr & MASK_10)		ttpci_budget_irq10_handler(dev, isr);}static int budget_av_detach(struct saa7146_dev *dev){	struct budget_av *budget_av = (struct budget_av *) dev->ext_priv;	int err;	dprintk(2, "dev: %p\n", dev);	if (1 == budget_av->has_saa7113) {		saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);		msleep(200);		saa7146_unregister_device(&budget_av->vd, dev);		saa7146_vv_release(dev);	}	if (budget_av->budget.ci_present)		ciintf_deinit(budget_av);	if (budget_av->budget.dvb_frontend != NULL) {		dvb_unregister_frontend(budget_av->budget.dvb_frontend);		dvb_frontend_detach(budget_av->budget.dvb_frontend);	}	err = ttpci_budget_deinit(&budget_av->budget);	kfree(budget_av);	return err;}static struct saa7146_ext_vv vv_data;static int budget_av_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info){	struct budget_av *budget_av;	u8 *mac;	int err;	dprintk(2, "dev: %p\n", dev);	if (!(budget_av = kzalloc(sizeof(struct budget_av), GFP_KERNEL)))		return -ENOMEM;	budget_av->has_saa7113 = 0;	budget_av->budget.ci_present = 0;	dev->ext_priv = budget_av;	err = ttpci_budget_init(&budget_av->budget, dev, info, THIS_MODULE,				adapter_nr);	if (err) {		kfree(budget_av);		return err;	}	/* knc1 initialization */	saa7146_write(dev, DD1_STREAM_B, 0x04000000);	saa7146_write(dev, DD1_INIT, 0x07000600);	saa7146_write(dev, MC2, MASK_09 | MASK_25 | MASK_10 | MASK_26);	if (saa7113_init(budget_av) == 0) {		budget_av->has_saa7113 = 1;		if (0 != saa7146_vv_init(dev, &vv_data)) {			/* fixme: proper cleanup here */			ERR(("cannot init vv subsystem.\n"));			return err;		}		if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1", VFL_TYPE_GRABBER))) {			/* fixme: proper cleanup here */			ERR(("cannot register capture v4l2 device.\n"));			saa7146_vv_release(dev);			return err;		}		/* beware: this modifies dev->vv ... */		saa7146_set_hps_source_and_sync(dev, SAA7146_HPS_SOURCE_PORT_A,						SAA7146_HPS_SYNC_PORT_A);		saa7113_setinput(budget_av, 0);	}	/* fixme: find some sane values here... */	saa7146_write(dev, PCI_BT_V1, 0x1c00101f);	mac = budget_av->budget.dvb_adapter.proposed_mac;	if (i2c_readregs(&budget_av->budget.i2c_adap, 0xa0, 0x30, mac, 6)) {		printk(KERN_ERR "KNC1-%d: Could not read MAC from KNC1 card\n",		       budget_av->budget.dvb_adapter.num);		memset(mac, 0, 6);	} else {		printk(KERN_INFO "KNC1-%d: MAC addr = %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",		       budget_av->budget.dvb_adapter.num,		       mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);	}	budget_av->budget.dvb_adapter.priv = budget_av;	frontend_init(budget_av);	ciintf_init(budget_av);	ttpci_budget_init_hooks(&budget_av->budget);	return 0;}#define KNC1_INPUTS 2static struct v4l2_input knc1_inputs[KNC1_INPUTS] = {	{0, "Composite", V4L2_INPUT_TYPE_TUNER, 1, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0},	{1, "S-Video", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG | V4L2_STD_NTSC_M, 0},};static struct saa7146_extension_ioctls ioctls[] = {	{VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE},	{VIDIOC_G_INPUT, SAA7146_EXCLUSIVE},	{VIDIOC_S_INPUT, SAA7146_EXCLUSIVE},	{0, 0}};static int av_ioctl(struct saa7146_fh *fh, unsigned int cmd, void *arg){	struct saa7146_dev *dev = fh->dev;	struct budget_av *budget_av = (struct budget_av *) dev->ext_priv;	switch (cmd) {	case VIDIOC_ENUMINPUT:{		struct v4l2_input *i = arg;		dprintk(1, "VIDIOC_ENUMINPUT %d.\n", i->index);		if (i->index < 0 || i->index >= KNC1_INPUTS) {			return -EINVAL;		}		memcpy(i, &knc1_inputs[i->index], sizeof(struct v4l2_input));		return 0;	}	case VIDIOC_G_INPUT:{		int *input = (int *) arg;		*input = budget_av->cur_input;		dprintk(1, "VIDIOC_G_INPUT %d.\n", *input);		return 0;	}	case VIDIOC_S_INPUT:{		int input = *(int *) arg;		dprintk(1, "VIDIOC_S_INPUT %d.\n", input);		return saa7113_setinput(budget_av, input);	}	default:		return -ENOIOCTLCMD;	}	return 0;}static struct saa7146_standard standard[] = {	{.name = "PAL",.id = V4L2_STD_PAL,	 .v_offset = 0x17,.v_field = 288,	 .h_offset = 0x14,.h_pixels = 680,	 .v_max_out = 576,.h_max_out = 768 },	{.name = "NTSC",.id = V4L2_STD_NTSC,	 .v_offset = 0x16,.v_field = 240,	 .h_offset = 0x06,.h_pixels = 708,	 .v_max_out = 480,.h_max_out = 640, },};static struct saa7146_ext_vv vv_data = {	.inputs = 2,	.capabilities = 0,	// perhaps later: V4L2_CAP_VBI_CAPTURE, but that need tweaking with the saa7113	.flags = 0,	.stds = &standard[0],	.num_stds = ARRAY_SIZE(standard),	.ioctls = &ioctls[0],	.ioctl = av_ioctl,};static struct saa7146_extension budget_extension;MAKE_BUDGET_INFO(knc1s, "KNC1 DVB-S", BUDGET_KNC1S);MAKE_BUDGET_INFO(knc1c, "KNC1 DVB-C", BUDGET_KNC1C);MAKE_BUDGET_INFO(knc1t, "KNC1 DVB-T", BUDGET_KNC1T);MAKE_BUDGET_INFO(kncxs, "KNC TV STAR DVB-S", BUDGET_TVSTAR);MAKE_BUDGET_INFO(satewpls, "Satelco EasyWatch DVB-S light", BUDGET_TVSTAR);MAKE_BUDGET_INFO(satewpls1, "Satelco EasyWatch DVB-S light", BUDGET_KNC1S);MAKE_BUDGET_INFO(satewps, "Satelco EasyWatch DVB-S", BUDGET_KNC1S);MAKE_BUDGET_INFO(satewplc, "Satelco EasyWatch DVB-C", BUDGET_KNC1CP);MAKE_BUDGET_INFO(satewcmk3, "Satelco EasyWatch DVB-C MK3", BUDGET_KNC1C_MK3);MAKE_BUDGET_INFO(satewt, "Satelco EasyWatch DVB-T", BUDGET_KNC1T);MAKE_BUDGET_INFO(knc1sp, "KNC1 DVB-S Plus", BUDGET_KNC1SP);MAKE_BUDGET_INFO(knc1spx4, "KNC1 DVB-S Plus X4", BUDGET_KNC1SP);MAKE_BUDGET_INFO(knc1cp, "KNC1 DVB-C Plus", BUDGET_KNC1CP);MAKE_BUDGET_INFO(knc1cmk3, "KNC1 DVB-C MK3", BUDGET_KNC1C_MK3);MAKE_BUDGET_INFO(knc1cpmk3, "KNC1 DVB-C Plus MK3", BUDGET_KNC1CP_MK3);MAKE_BUDGET_INFO(knc1tp, "KNC1 DVB-T Plus", BUDGET_KNC1TP);MAKE_BUDGET_INFO(cin1200s, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);MAKE_BUDGET_INFO(cin1200sn, "TerraTec Cinergy 1200 DVB-S", BUDGET_CIN1200S);MAKE_BUDGET_INFO(cin1200c, "Terratec Cinergy 1200 DVB-C", BUDGET_CIN1200C);MAKE_BUDGET_INFO(cin1200cmk3, "Terratec Cinergy 1200 DVB-C MK3", BUDGET_CIN1200C_MK3);MAKE_BUDGET_INFO(cin1200t, "Terratec Cinergy 1200 DVB-T", BUDGET_CIN1200T);static struct pci_device_id pci_tbl[] = {	MAKE_EXTENSION_PCI(knc1s, 0x1131, 0x4f56),	MAKE_EXTENSION_PCI(knc1s, 0x1131, 0x0010),	MAKE_EXTENSION_PCI(knc1s, 0x1894, 0x0010),	MAKE_EXTENSION_PCI(knc1sp, 0x1131, 0x0011),	MAKE_EXTENSION_PCI(knc1sp, 0x1894, 0x0011),	MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0014),	MAKE_EXTENSION_PCI(knc1spx4, 0x1894, 0x0015),	MAKE_EXTENSION_PCI(kncxs, 0x1894, 0x0016),	MAKE_EXTENSION_PCI(satewpls, 0x1894, 0x001e),	MAKE_EXTENSION_PCI(satewpls1, 0x1894, 0x001a),	MAKE_EXTENSION_PCI(satewps, 0x1894, 0x001b),	MAKE_EXTENSION_PCI(satewplc, 0x1894, 0x002a),	MAKE_EXTENSION_PCI(satewcmk3, 0x1894, 0x002c),	MAKE_EXTENSION_PCI(satewt, 0x1894, 0x003a),	MAKE_EXTENSION_PCI(knc1c, 0x1894, 0x0020),	MAKE_EXTENSION_PCI(knc1cp, 0x1894, 0x0021),	MAKE_EXTENSION_PCI(knc1cmk3, 0x1894, 0x0022),	MAKE_EXTENSION_PCI(knc1cpmk3, 0x1894, 0x0023),	MAKE_EXTENSION_PCI(knc1t, 0x1894, 0x0030),	MAKE_EXTENSION_PCI(knc1tp, 0x1894, 0x0031),	MAKE_EXTENSION_PCI(cin1200s, 0x153b, 0x1154),	MAKE_EXTENSION_PCI(cin1200sn, 0x153b, 0x1155),	MAKE_EXTENSION_PCI(cin1200c, 0x153b, 0x1156),	MAKE_EXTENSION_PCI(cin1200cmk3, 0x153b, 0x1176),	MAKE_EXTENSION_PCI(cin1200t, 0x153b, 0x1157),	{	 .vendor = 0,	}};MODULE_DEVICE_TABLE(pci, pci_tbl);static struct saa7146_extension budget_extension = {	.name = "budget_av",	.flags = SAA7146_USE_I2C_IRQ,	.pci_tbl = pci_tbl,	.module = THIS_MODULE,	.attach = budget_av_attach,	.detach = budget_av_detach,	.irq_mask = MASK_10,	.irq_func = budget_av_irq,};static int __init budget_av_init(void){	return saa7146_register_extension(&budget_extension);}static void __exit budget_av_exit(void){	saa7146_unregister_extension(&budget_extension);}module_init(budget_av_init);module_exit(budget_av_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");MODULE_DESCRIPTION("driver for the SAA7146 based so-called "		   "budget PCI DVB w/ analog input and CI-module (e.g. the KNC cards)");

⌨️ 快捷键说明

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