亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tvaudio.c

?? 這是一個市場上常見電視卡的驅動程序源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
		.checkit    = tda9874a_checkit,
		.initialize = tda9874a_initialize,
		.insmodopt  = &tda9874a,
		.addr_lo    = I2C_TDA9874 >> 1,
		.addr_hi    = I2C_TDA9874 >> 1,

		.getmode    = tda9874a_getmode,
		.setmode    = tda9874a_setmode,
		.checkmode  = generic_checkmode,
	},
	{
		.name       = "tda9850",
		.id         = I2C_DRIVERID_TDA9850,
		.insmodopt  = &tda9850,
		.addr_lo    = I2C_TDA985x_L >> 1,
		.addr_hi    = I2C_TDA985x_H >> 1,
		.registers  = 11,

		.getmode    = tda985x_getmode,
		.setmode    = tda985x_setmode,

		.init       = { 8, { TDA9850_C4, 0x08, 0x08, TDA985x_STEREO, 0x07, 0x10, 0x10, 0x03 } }
	},
	{
		.name       = "tda9855",
		.id         = I2C_DRIVERID_TDA9855,
		.insmodopt  = &tda9855,
		.addr_lo    = I2C_TDA985x_L >> 1,
		.addr_hi    = I2C_TDA985x_H >> 1,
		.registers  = 11,
		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE,

		.leftreg    = TDA9855_VL,
		.rightreg   = TDA9855_VR,
		.bassreg    = TDA9855_BA,
		.treblereg  = TDA9855_TR,
		.volfunc    = tda9855_volume,
		.bassfunc   = tda9855_bass,
		.treblefunc = tda9855_treble,

		.getmode    = tda985x_getmode,
		.setmode    = tda985x_setmode,

		.init       = { 12, { 0, 0x6f, 0x6f, 0x0e, 0x07<<1, 0x8<<2,
				    TDA9855_MUTE | TDA9855_AVL | TDA9855_LOUD | TDA9855_INT,
				    TDA985x_STEREO | TDA9855_LINEAR | TDA9855_TZCM | TDA9855_VZCM,
				    0x07, 0x10, 0x10, 0x03 }}
	},
	{
		.name       = "tea6300",
		.id         = I2C_DRIVERID_TEA6300,
		.insmodopt  = &tea6300,
		.addr_lo    = I2C_TEA6300 >> 1,
		.addr_hi    = I2C_TEA6300 >> 1,
		.registers  = 6,
		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,

		.leftreg    = TEA6300_VR,
		.rightreg   = TEA6300_VL,
		.bassreg    = TEA6300_BA,
		.treblereg  = TEA6300_TR,
		.volfunc    = tea6300_shift10,
		.bassfunc   = tea6300_shift12,
		.treblefunc = tea6300_shift12,

		.inputreg   = TEA6300_S,
		.inputmap   = { TEA6300_S_SA, TEA6300_S_SB, TEA6300_S_SC },
		.inputmute  = TEA6300_S_GMU,
	},
	{
		.name       = "tea6420",
		.id         = I2C_DRIVERID_TEA6420,
		.insmodopt  = &tea6420,
		.addr_lo    = I2C_TEA6420 >> 1,
		.addr_hi    = I2C_TEA6420 >> 1,
		.registers  = 1,
		.flags      = CHIP_HAS_INPUTSEL,

		.inputreg   = -1,
		.inputmap   = { TEA6420_S_SA, TEA6420_S_SB, TEA6420_S_SC },
		.inputmute  = TEA6300_S_GMU,
	},
	{
		.name       = "tda8425",
		.id         = I2C_DRIVERID_TDA8425,
		.insmodopt  = &tda8425,
		.addr_lo    = I2C_TDA8425 >> 1,
		.addr_hi    = I2C_TDA8425 >> 1,
		.registers  = 9,
		.flags      = CHIP_HAS_VOLUME | CHIP_HAS_BASSTREBLE | CHIP_HAS_INPUTSEL,

		.leftreg    = TDA8425_VL,
		.rightreg   = TDA8425_VR,
		.bassreg    = TDA8425_BA,
		.treblereg  = TDA8425_TR,
		.volfunc    = tda8425_shift10,
		.bassfunc   = tda8425_shift12,
		.treblefunc = tda8425_shift12,

		.inputreg   = TDA8425_S1,
		.inputmap   = { TDA8425_S1_CH1, TDA8425_S1_CH1, TDA8425_S1_CH1 },
		.inputmute  = TDA8425_S1_OFF,

		.setmode    = tda8425_setmode,
		.initialize = tda8425_initialize,
	},
	{
		.name       = "pic16c54 (PV951)",
		.id         = I2C_DRIVERID_PIC16C54_PV951,
		.insmodopt  = &pic16c54,
		.addr_lo    = I2C_PIC16C54 >> 1,
		.addr_hi    = I2C_PIC16C54>> 1,
		.registers  = 2,
		.flags      = CHIP_HAS_INPUTSEL,

		.inputreg   = PIC16C54_REG_MISC,
		.inputmap   = {PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_TUNER,
			     PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE,
			     PIC16C54_MISC_SND_NOTMUTE|PIC16C54_MISC_SWITCH_LINE,
			     PIC16C54_MISC_SND_MUTE,PIC16C54_MISC_SND_MUTE,
			     PIC16C54_MISC_SND_NOTMUTE},
		.inputmute  = PIC16C54_MISC_SND_MUTE,
	},
	{
		.name       = "ta8874z",
		.id         = -1,
		//.id         = I2C_DRIVERID_TA8874Z,
		.checkit    = ta8874z_checkit,
		.insmodopt  = &ta8874z,
		.addr_lo    = I2C_TDA9840 >> 1,
		.addr_hi    = I2C_TDA9840 >> 1,
		.registers  = 2,

		.getmode    = ta8874z_getmode,
		.setmode    = ta8874z_setmode,
		.checkmode  = generic_checkmode,

	        .init       = {2, { TA8874Z_MONO_SET, TA8874Z_SEPARATION_DEFAULT}},
	},
	{ .name = NULL } /* EOF */
};


/* ---------------------------------------------------------------------- */
/* i2c registration                                                       */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
static int chip_attach(struct i2c_adapter *adap, int addr, int kind)
#else
static int chip_attach(struct i2c_adapter *adap, int addr,
		       unsigned short flags, int kind)
#endif
{
	struct CHIPSTATE *chip;
	struct CHIPDESC  *desc;
	int rc;

	chip = kmalloc(sizeof(*chip),GFP_KERNEL);
	if (!chip)
		return -ENOMEM;
	memset(chip,0,sizeof(*chip));
	memcpy(&chip->c,&client_template,sizeof(struct i2c_client));
        chip->c.adapter = adap;
        chip->c.addr = addr;
	i2c_set_clientdata(&chip->c, chip);

	/* find description for the chip */
	dprintk("tvaudio: chip found @ i2c-addr=0x%x\n", addr<<1);
	for (desc = chiplist; desc->name != NULL; desc++) {
		if (0 == *(desc->insmodopt))
			continue;
		if (addr < desc->addr_lo ||
		    addr > desc->addr_hi)
			continue;
		if (desc->checkit && !desc->checkit(chip))
			continue;
		break;
	}
	if (desc->name == NULL) {
		dprintk("tvaudio: no matching chip description found\n");
		return -EIO;
	}
	printk("tvaudio: found %s @ 0x%x\n", desc->name, addr<<1);
	dprintk("tvaudio: matches:%s%s%s.\n",
		(desc->flags & CHIP_HAS_VOLUME)     ? " volume"      : "",
		(desc->flags & CHIP_HAS_BASSTREBLE) ? " bass/treble" : "",
		(desc->flags & CHIP_HAS_INPUTSEL)   ? " audiomux"    : "");

	/* fill required data structures */
	strcpy(i2c_clientname(&chip->c),desc->name);
	chip->type = desc-chiplist;
	chip->shadow.count = desc->registers+1;
        chip->prevmode = -1;
	/* register */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
	MOD_INC_USE_COUNT;
#endif
	i2c_attach_client(&chip->c);

	/* initialization  */
	if (desc->initialize != NULL)
		desc->initialize(chip);
	else
		chip_cmd(chip,"init",&desc->init);

	if (desc->flags & CHIP_HAS_VOLUME) {
		chip->left   = desc->leftinit   ? desc->leftinit   : 65535;
		chip->right  = desc->rightinit  ? desc->rightinit  : 65535;
		chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
		chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
	}
	if (desc->flags & CHIP_HAS_BASSTREBLE) {
		chip->treble = desc->trebleinit ? desc->trebleinit : 32768;
		chip->bass   = desc->bassinit   ? desc->bassinit   : 32768;
		chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
		chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
	}

	if (desc->checkmode) {
		/* start async thread */
		DECLARE_MUTEX_LOCKED(sem);
		chip->notify = &sem;
		init_timer(&chip->wt);
		chip->wt.function = chip_thread_wake;
		chip->wt.data     = (unsigned long)chip;
		init_waitqueue_head(&chip->wq);
		rc = kernel_thread(chip_thread,(void *)chip,0);
		if (rc < 0)
			printk(KERN_WARNING "%s: kernel_thread() failed\n",
			       i2c_clientname(&chip->c));
		else
			down(&sem);
		chip->notify = NULL;
		wake_up_interruptible(&chip->wq);
	}
	return 0;
}

static int chip_probe(struct i2c_adapter *adap)
{
#ifdef I2C_ADAP_CLASS_TV_ANALOG
	if (adap->class & I2C_ADAP_CLASS_TV_ANALOG)
		return i2c_probe(adap, &addr_data, chip_attach);
#else
	switch (adap->id) {
	case I2C_ALGO_BIT | I2C_HW_B_BT848:
	case I2C_ALGO_BIT | I2C_HW_B_RIVA:
	case I2C_ALGO_SAA7134:
		return i2c_probe(adap, &addr_data, chip_attach);
	}
#endif
	return 0;
}

static int chip_detach(struct i2c_client *client)
{
	struct CHIPSTATE *chip = i2c_get_clientdata(client);

	del_timer(&chip->wt);
	if (NULL != chip->thread) {
		/* shutdown async thread */
		DECLARE_MUTEX_LOCKED(sem);
		chip->notify = &sem;
		chip->done = 1;
		wake_up_interruptible(&chip->wq);
		down(&sem);
		chip->notify = NULL;
	}
	
	i2c_detach_client(&chip->c);
	kfree(chip);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
	MOD_DEC_USE_COUNT;
#endif
	return 0;
}

/* ---------------------------------------------------------------------- */
/* video4linux interface                                                  */

static int chip_command(struct i2c_client *client,
			unsigned int cmd, void *arg)
{
        __u16 *sarg = arg;
	struct CHIPSTATE *chip = i2c_get_clientdata(client);
	struct CHIPDESC  *desc = chiplist + chip->type;

	dprintk("%s: chip_command 0x%x\n",i2c_clientname(&chip->c),cmd);

	switch (cmd) {
	case AUDC_SET_INPUT:
		if (desc->flags & CHIP_HAS_INPUTSEL) {
			if (*sarg & 0x80)
				chip_write_masked(chip,desc->inputreg,desc->inputmute,desc->inputmask);
			else
				chip_write_masked(chip,desc->inputreg,desc->inputmap[*sarg],desc->inputmask);
		}
		break;

	case AUDC_SET_RADIO:
		dprintk(KERN_DEBUG "tvaudio: AUDC_SET_RADIO\n");
		chip->norm = VIDEO_MODE_RADIO;
		chip->watch_stereo = 0;
		/* del_timer(&chip->wt); */
		break;

	/* --- v4l ioctls --- */
	/* take care: bttv does userspace copying, we'll get a
	   kernel pointer here... */
	case VIDIOCGAUDIO:
	{
		struct video_audio *va = arg;

		if (desc->flags & CHIP_HAS_VOLUME) {
			va->flags  |= VIDEO_AUDIO_VOLUME;
			va->volume  = max(chip->left,chip->right);
			va->balance = (32768*min(chip->left,chip->right))/
				(va->volume ? va->volume : 1);
		}
		if (desc->flags & CHIP_HAS_BASSTREBLE) {
			va->flags |= VIDEO_AUDIO_BASS | VIDEO_AUDIO_TREBLE;
			va->bass   = chip->bass;
			va->treble = chip->treble;
		}
		if (chip->norm != VIDEO_MODE_RADIO) {
			if (desc->getmode)
				va->mode = desc->getmode(chip);
			else
				va->mode = VIDEO_SOUND_MONO;
		}
		break;
	}

	case VIDIOCSAUDIO:
	{
		struct video_audio *va = arg;
		
		if (desc->flags & CHIP_HAS_VOLUME) {
			chip->left = (min(65536 - va->balance,32768) *
				      va->volume) / 32768;
			chip->right = (min(va->balance,(__u16)32768) *
				       va->volume) / 32768;
			chip_write(chip,desc->leftreg,desc->volfunc(chip->left));
			chip_write(chip,desc->rightreg,desc->volfunc(chip->right));
		}
		if (desc->flags & CHIP_HAS_BASSTREBLE) {
			chip->bass = va->bass;
			chip->treble = va->treble;
			chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
			chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
		}
		if (desc->setmode && va->mode) {
			chip->watch_stereo = 0;
			/* del_timer(&chip->wt); */
			chip->mode = va->mode;
			desc->setmode(chip,va->mode);
		}
		break;
	}
	case VIDIOCSCHAN:
	{
		struct video_channel *vc = arg;
		
		dprintk(KERN_DEBUG "tvaudio: VIDIOCSCHAN\n");
		chip->norm = vc->norm;
		break;
	}
	case VIDIOCSFREQ:
	{
	    	chip->mode = 0; /* automatic */
		if (desc->checkmode) {
			desc->setmode(chip,VIDEO_SOUND_MONO);
		    	if (chip->prevmode != VIDEO_SOUND_MONO)
		    		chip->prevmode = -1; /* reset previous mode */
			mod_timer(&chip->wt, jiffies+2*HZ);
			/* the thread will call checkmode() later */
		}
	}
	}
	return 0;
}


static struct i2c_driver driver = {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,54)
	.owner           = THIS_MODULE,
#endif
        .name            = "generic i2c audio driver",
        .id              = I2C_DRIVERID_TVAUDIO,
        .flags           = I2C_DF_NOTIFY,
        .attach_adapter  = chip_probe,
        .detach_client   = chip_detach,
        .command         = chip_command,
};

static struct i2c_client client_template =
{
	I2C_DEVNAME("(unset)"),
	.flags      = I2C_CLIENT_ALLOW_USE,
        .driver     = &driver,
};

static int audiochip_init_module(void)
{
	struct CHIPDESC  *desc;
	printk(KERN_INFO "tvaudio: TV audio decoder + audio/video mux driver\n");
	printk(KERN_INFO "tvaudio: known chips: ");
	for (desc = chiplist; desc->name != NULL; desc++)
		printk("%s%s", (desc == chiplist) ? "" : ",",desc->name);
	printk("\n");
	i2c_add_driver(&driver);
	return 0;
}

static void audiochip_cleanup_module(void)
{
	i2c_del_driver(&driver);
}

module_init(audiochip_init_module);
module_exit(audiochip_cleanup_module);

/*
 * Local variables:
 * c-basic-offset: 8
 * End:
 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区视频在线 | 99国产精品国产精品久久| 99r国产精品| 日韩亚洲欧美高清| 亚洲精品国久久99热| 国产一区二区视频在线| 欧美在线视频全部完| 国产亚洲福利社区一区| 亚洲国产综合在线| 高清国产一区二区| 欧美成人vr18sexvr| 天堂午夜影视日韩欧美一区二区| 成人国产精品免费网站| 精品美女一区二区| 婷婷一区二区三区| 欧美视频你懂的| 亚洲人123区| a美女胸又www黄视频久久| 欧美精品一区视频| 国产自产v一区二区三区c| 555www色欧美视频| 午夜一区二区三区视频| 色噜噜狠狠成人网p站| 自拍偷在线精品自拍偷无码专区| 国产真实乱对白精彩久久| 欧美成人r级一区二区三区| 日韩va亚洲va欧美va久久| 欧美色精品在线视频| 亚洲激情中文1区| 色天天综合色天天久久| 亚洲三级电影网站| 99久久精品国产麻豆演员表| 国产精品理论片在线观看| 成人av网站免费观看| 国产精品欧美久久久久一区二区| 成人综合婷婷国产精品久久| 中日韩av电影| 99久久99久久精品免费看蜜桃| 国产精品白丝在线| k8久久久一区二区三区| 亚洲永久免费视频| 欧美日韩国产色站一区二区三区| 亚洲成人综合在线| 91麻豆精品国产91久久久资源速度| 日韩成人av影视| 日韩精品资源二区在线| 国产传媒日韩欧美成人| 亚洲欧洲99久久| 在线这里只有精品| 水蜜桃久久夜色精品一区的特点| 欧美成va人片在线观看| 国产成人日日夜夜| 亚洲精品国产精华液| 欧美日韩精品免费| 极品尤物av久久免费看| 国产精品欧美一级免费| 欧美亚洲日本国产| 三级欧美在线一区| 精品国产伦理网| 成人爱爱电影网址| 日韩精品免费视频人成| 26uuu色噜噜精品一区二区| proumb性欧美在线观看| 婷婷久久综合九色综合伊人色| 精品久久久影院| 91蝌蚪porny九色| 日本特黄久久久高潮| 久久精品亚洲一区二区三区浴池| 色女孩综合影院| 久久99精品视频| 亚洲精品高清在线| 欧美精品一区二区三区高清aⅴ| 成人综合婷婷国产精品久久免费| 亚洲成人激情av| 中文字幕乱码久久午夜不卡| 欧美日韩亚洲国产综合| 国产精品一二三在| 性久久久久久久久| 国产精品久久国产精麻豆99网站 | 成人午夜视频网站| 亚洲成人免费av| 中文字幕亚洲欧美在线不卡| 91精品国产综合久久婷婷香蕉 | 日韩免费看的电影| 91精品91久久久中77777| 国产尤物一区二区| 天堂在线一区二区| 一区二区三区日本| 国产亚洲婷婷免费| 日韩视频一区二区| 欧美性一区二区| 91在线观看美女| 国产精品一区在线观看你懂的| 亚洲二区在线视频| 自拍偷拍亚洲综合| 中文字幕免费不卡| 久久伊99综合婷婷久久伊| 欧美日韩国产一区| 欧美伊人久久久久久久久影院 | 精品一区二区三区在线视频| 午夜av一区二区三区| 亚洲精品videosex极品| 中文av一区二区| 欧美激情一区二区三区| 精品国产人成亚洲区| 91麻豆精品国产91久久久久| 欧美色综合久久| 91蜜桃传媒精品久久久一区二区| 成人午夜在线免费| 成人91在线观看| 粉嫩在线一区二区三区视频| 国产成人在线视频网址| 国产剧情一区二区| 国产成人在线网站| 成人精品小蝌蚪| 99在线精品一区二区三区| 国产白丝精品91爽爽久久| 国产精品正在播放| 国产69精品一区二区亚洲孕妇 | 亚洲三级久久久| 亚洲激情校园春色| 亚洲国产精品欧美一二99| 亚洲一区二区三区影院| 亚洲国产精品一区二区久久恐怖片| 亚洲综合色噜噜狠狠| 伊人夜夜躁av伊人久久| 亚洲大片免费看| 蜜臀av性久久久久av蜜臀妖精| 美美哒免费高清在线观看视频一区二区 | 日本女人一区二区三区| 日本不卡一区二区| 国产综合一区二区| 成人免费av资源| 91福利精品视频| 在线综合视频播放| 久久精品视频一区| 国产精品久久久久久久久动漫 | 国产在线精品一区二区三区不卡| 国产在线精品视频| 色综合av在线| 91精品久久久久久久久99蜜臂| 精品999久久久| 日韩理论片网站| 亚洲福利一区二区三区| 精品在线一区二区| 色狠狠综合天天综合综合| 欧美日本在线看| 久久久久久久久久久黄色| 17c精品麻豆一区二区免费| 肉色丝袜一区二区| 国产一区二区三区美女| 色综合天天综合网天天看片| 欧美一区二区在线观看| 久久一区二区三区四区| 亚洲精品国产高清久久伦理二区| 麻豆精品新av中文字幕| 不卡的av在线| 日韩免费高清视频| 亚洲免费av网站| 激情综合网av| 欧美日韩一区国产| 中文字幕av一区 二区| 日韩不卡一区二区三区| 91视频com| 久久久久9999亚洲精品| 亚洲国产精品人人做人人爽| 高清在线成人网| 欧美福利视频一区| 中文字幕日韩欧美一区二区三区| 青青草伊人久久| 在线观看国产精品网站| 国产喷白浆一区二区三区| 日韩高清在线观看| 色婷婷av一区| 国产精品动漫网站| 国产一本一道久久香蕉| 正在播放一区二区| 亚洲精品国产无套在线观| 波多野结衣欧美| 久久久精品国产免费观看同学| 三级在线观看一区二区| 在线免费观看一区| 亚洲视频一区二区在线| 国产成人日日夜夜| 国产午夜精品一区二区三区视频| 午夜久久久久久| 欧美日韩视频专区在线播放| 亚洲欧美偷拍另类a∨色屁股| 国产99久久久精品| 2欧美一区二区三区在线观看视频| 首页亚洲欧美制服丝腿| 欧美日韩mp4| 午夜精品久久久久久久久| 欧美亚洲国产bt| 一区二区三区中文字幕精品精品 | 粉嫩久久99精品久久久久久夜| 日韩精品一区在线| 久久国产日韩欧美精品| 精品剧情在线观看| 国产综合久久久久影院|