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

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

?? radio-zoltrix.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
字號:
/* zoltrix radio plus driver for Linux radio support * (c) 1998 C. van Schaik <carl@leg.uct.ac.za> * * BUGS   *  Due to the inconsistancy in reading from the signal flags *  it is difficult to get an accurate tuned signal. * *  It seems that the card is not linear to 0 volume. It cuts off *  at a low volume, and it is not possible (at least I have not found) *  to get fine volume control over the low volume range. * *  Some code derived from code by Romolo Manfredini *				   romolo@bicnet.it * * 1999-05-06 - (C. van Schaik) *	      - Make signal strength and stereo scans *	        kinder to cpu while in delay * 1999-01-05 - (C. van Schaik) *	      - Changed tuning to 1/160Mhz accuracy *	      - Added stereo support *		(card defaults to stereo) *		(can explicitly force mono on the card) *		(can detect if station is in stereo) *	      - Added unmute function *	      - Reworked ioctl functions */#include <linux/module.h>	/* Modules                        */#include <linux/init.h>		/* Initdata                       */#include <linux/ioport.h>	/* check_region, request_region   */#include <linux/delay.h>	/* udelay                 */#include <asm/io.h>		/* outb, outb_p                   */#include <asm/uaccess.h>	/* copy to/from user              */#include <linux/videodev.h>	/* kernel radio structs           */#include <linux/config.h>	/* CONFIG_RADIO_ZOLTRIX_PORT      */#ifndef CONFIG_RADIO_ZOLTRIX_PORT#define CONFIG_RADIO_ZOLTRIX_PORT -1#endifstatic int io = CONFIG_RADIO_ZOLTRIX_PORT;static int radio_nr = -1;static int users = 0;struct zol_device {	int port;	int curvol;	unsigned long curfreq;	int muted;	unsigned int stereo;	struct semaphore lock;};/* local things */static void sleep_delay(void){	/* Sleep nicely for +/- 10 mS */	schedule();}static int zol_setvol(struct zol_device *dev, int vol){	dev->curvol = vol;	if (dev->muted)		return 0;	down(&dev->lock);	if (vol == 0) {		outb(0, io);		outb(0, io);		inb(io + 3);    /* Zoltrix needs to be read to confirm */		up(&dev->lock);		return 0;	}	outb(dev->curvol-1, io);	sleep_delay();	inb(io + 2);	up(&dev->lock);	return 0;}static void zol_mute(struct zol_device *dev){	dev->muted = 1;	down(&dev->lock);	outb(0, io);	outb(0, io);	inb(io + 3);            /* Zoltrix needs to be read to confirm */	up(&dev->lock);}static void zol_unmute(struct zol_device *dev){	dev->muted = 0;	zol_setvol(dev, dev->curvol);}static int zol_setfreq(struct zol_device *dev, unsigned long freq){	/* tunes the radio to the desired frequency */	unsigned long long bitmask, f, m;	unsigned int stereo = dev->stereo;	int i;	if (freq == 0)		return 1;	m = (freq / 160 - 8800) * 2;	f = (unsigned long long) m + 0x4d1c;	bitmask = 0xc480402c10080000ull;	i = 45;	down(&dev->lock);		outb(0, io);	outb(0, io);	inb(io + 3);            /* Zoltrix needs to be read to confirm */	outb(0x40, io);	outb(0xc0, io);	bitmask = (bitmask ^ ((f & 0xff) << 47) ^ ((f & 0xff00) << 30) ^ ( stereo << 31));	while (i--) {		if ((bitmask & 0x8000000000000000ull) != 0) {			outb(0x80, io);			udelay(50);			outb(0x00, io);			udelay(50);			outb(0x80, io);			udelay(50);		} else {			outb(0xc0, io);			udelay(50);			outb(0x40, io);			udelay(50);			outb(0xc0, io);			udelay(50);		}		bitmask *= 2;	}	/* termination sequence */	outb(0x80, io);	outb(0xc0, io);	outb(0x40, io);	udelay(1000);	inb(io+2);        udelay(1000);        	if (dev->muted)	{		outb(0, io);		outb(0, io);		inb(io + 3);		udelay(1000);	}		up(&dev->lock);		if(!dev->muted)	{	        zol_setvol(dev, dev->curvol);	}	return 0;}/* Get signal strength */int zol_getsigstr(struct zol_device *dev){	int a, b;	down(&dev->lock);	outb(0x00, io);         /* This stuff I found to do nothing */	outb(dev->curvol, io);	sleep_delay();	sleep_delay();	a = inb(io);	sleep_delay();	b = inb(io);	up(&dev->lock);		if (a != b)		return (0);        if ((a == 0xcf) || (a == 0xdf)  /* I found this out by playing */		|| (a == 0xef))       /* with a binary scanner on the card io */		return (1); 	return (0);}int zol_is_stereo (struct zol_device *dev){	int x1, x2;	down(&dev->lock);		outb(0x00, io);	outb(dev->curvol, io);	sleep_delay();	sleep_delay();	x1 = inb(io);	sleep_delay();	x2 = inb(io);	up(&dev->lock);		if ((x1 == x2) && (x1 == 0xcf))		return 1;	return 0;}static int zol_ioctl(struct video_device *dev, unsigned int cmd, void *arg){	struct zol_device *zol = dev->priv;	switch (cmd) {	case VIDIOCGCAP:		{			struct video_capability v;			v.type = VID_TYPE_TUNER;			v.channels = 1 + zol->stereo;			v.audios = 1;			/* No we don't do pictures */			v.maxwidth = 0;			v.maxheight = 0;			v.minwidth = 0;			v.minheight = 0;			strcpy(v.name, "Zoltrix Radio");			if (copy_to_user(arg, &v, sizeof(v)))				return -EFAULT;			return 0;		}	case VIDIOCGTUNER:		{			struct video_tuner v;			if (copy_from_user(&v, arg, sizeof(v)))				return -EFAULT;			if (v.tuner)					return -EINVAL;			strcpy(v.name, "FM");			v.rangelow = (int) (88.0 * 16000);			v.rangehigh = (int) (108.0 * 16000);			v.flags = zol_is_stereo(zol)					? VIDEO_TUNER_STEREO_ON : 0;			v.flags |= VIDEO_TUNER_LOW;			v.mode = VIDEO_MODE_AUTO;			v.signal = 0xFFFF * zol_getsigstr(zol);			if (copy_to_user(arg, &v, sizeof(v)))				return -EFAULT;			return 0;		}	case VIDIOCSTUNER:		{			struct video_tuner v;			if (copy_from_user(&v, arg, sizeof(v)))				return -EFAULT;			if (v.tuner != 0)				return -EINVAL;			/* Only 1 tuner so no setting needed ! */			return 0;		}	case VIDIOCGFREQ:		if (copy_to_user(arg, &zol->curfreq, sizeof(zol->curfreq)))			return -EFAULT;		return 0;	case VIDIOCSFREQ:		if (copy_from_user(&zol->curfreq, arg, sizeof(zol->curfreq)))			return -EFAULT;		zol_setfreq(zol, zol->curfreq);		return 0;	case VIDIOCGAUDIO:		{			struct video_audio v;			memset(&v, 0, sizeof(v));			v.flags |= VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME;			v.mode != zol_is_stereo(zol)				? VIDEO_SOUND_STEREO : VIDEO_SOUND_MONO;			v.volume = zol->curvol * 4096;			v.step = 4096;			strcpy(v.name, "Zoltrix Radio");			if (copy_to_user(arg, &v, sizeof(v)))				return -EFAULT;			return 0;		}	case VIDIOCSAUDIO:		{			struct video_audio v;			if (copy_from_user(&v, arg, sizeof(v)))				return -EFAULT;			if (v.audio)				return -EINVAL;			if (v.flags & VIDEO_AUDIO_MUTE)				zol_mute(zol);			else			{				zol_unmute(zol);				zol_setvol(zol, v.volume / 4096);			}			if (v.mode & VIDEO_SOUND_STEREO)			{				zol->stereo = 1;				zol_setfreq(zol, zol->curfreq);			}			if (v.mode & VIDEO_SOUND_MONO)			{				zol->stereo = 0;				zol_setfreq(zol, zol->curfreq);			}			return 0;		}	default:		return -ENOIOCTLCMD;	}}static int zol_open(struct video_device *dev, int flags){	if (users)		return -EBUSY;	users++;	return 0;}static void zol_close(struct video_device *dev){	users--;}static struct zol_device zoltrix_unit;static struct video_device zoltrix_radio ={	owner:		THIS_MODULE,	name:		"Zoltrix Radio Plus",	type:		VID_TYPE_TUNER,	hardware:	VID_HARDWARE_ZOLTRIX,	open:		zol_open,	close:		zol_close,	ioctl:		zol_ioctl,};static int __init zoltrix_init(void){	if (io == -1) {		printk(KERN_ERR "You must set an I/O address with io=0x???\n");		return -EINVAL;	}	if ((io != 0x20c) && (io != 0x30c)) {		printk(KERN_ERR "zoltrix: invalid port, try 0x20c or 0x30c\n");		return -ENXIO;	}	zoltrix_radio.priv = &zoltrix_unit;	if (!request_region(io, 2, "zoltrix")) {		printk(KERN_ERR "zoltrix: port 0x%x already in use\n", io);		return -EBUSY;	}	if (video_register_device(&zoltrix_radio, VFL_TYPE_RADIO, radio_nr) == -1)	{		release_region(io, 2);		return -EINVAL;	}	printk(KERN_INFO "Zoltrix Radio Plus card driver.\n");	init_MUTEX(&zoltrix_unit.lock);		/* mute card - prevents noisy bootups */	/* this ensures that the volume is all the way down  */	outb(0, io);	outb(0, io);	sleep_delay();	sleep_delay();	inb(io + 3);	zoltrix_unit.curvol = 0;	zoltrix_unit.stereo = 1;	return 0;}MODULE_AUTHOR("C.van Schaik");MODULE_DESCRIPTION("A driver for the Zoltrix Radio Plus.");MODULE_LICENSE("GPL");MODULE_PARM(io, "i");MODULE_PARM_DESC(io, "I/O address of the Zoltrix Radio Plus (0x20c or 0x30c)");MODULE_PARM(radio_nr, "i");EXPORT_NO_SYMBOLS;static void __exit zoltrix_cleanup_module(void){	video_unregister_device(&zoltrix_radio);	release_region(io, 2);}module_init(zoltrix_init);module_exit(zoltrix_cleanup_module);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品―色哟哟| 欧美日韩一二三区| 七七婷婷婷婷精品国产| 亚洲与欧洲av电影| 亚洲黄色尤物视频| 亚洲一区二区高清| 青草国产精品久久久久久| 日韩成人午夜精品| 久久不见久久见免费视频1| 久久国产精品72免费观看| 国精产品一区一区三区mba视频| 久久99久久久久| 国产激情视频一区二区三区欧美| 国产一区日韩二区欧美三区| 国产二区国产一区在线观看| eeuss鲁片一区二区三区在线观看| 不卡高清视频专区| 精品视频在线视频| 日韩欧美一二三四区| 国产亚洲欧美激情| 日韩理论片一区二区| 亚瑟在线精品视频| 国产在线精品国自产拍免费| 99久精品国产| 欧美一区二区视频观看视频| 久久色中文字幕| 日韩理论在线观看| 精品一区二区三区免费毛片爱| 国产风韵犹存在线视精品| 在线观看av一区| 久久只精品国产| 亚洲三级在线看| 开心九九激情九九欧美日韩精美视频电影 | 26uuu亚洲| 有码一区二区三区| 国内成人精品2018免费看| 91在线高清观看| 日韩免费看的电影| 一区二区成人在线视频| 激情六月婷婷综合| 欧美亚洲精品一区| 欧美国产乱子伦| 蜜臀久久久99精品久久久久久| 成人动漫一区二区三区| 91麻豆精品国产91久久久资源速度 | 91久久一区二区| 久久久久久亚洲综合| 亚洲一区二区三区小说| 高清成人免费视频| 欧美一区二区女人| 亚洲一区二区黄色| 95精品视频在线| 国产欧美一区二区精品忘忧草 | 亚洲欧美一区二区三区极速播放| 久久99久久99| 日韩欧美中文字幕公布| 亚洲免费观看高清完整版在线观看熊 | 樱桃国产成人精品视频| 国产成人免费视频| www亚洲一区| 免费精品99久久国产综合精品| 欧美性感一区二区三区| 亚洲品质自拍视频| 99久久久久免费精品国产 | 欧美做爰猛烈大尺度电影无法无天| 久久久久久久久99精品| 日韩电影在线免费观看| 欧美日韩一区二区三区高清| 亚洲欧美日本在线| 色呦呦一区二区三区| 亚洲色大成网站www久久九九| 成人爽a毛片一区二区免费| 精品处破学生在线二十三| 国模娜娜一区二区三区| 日韩三级精品电影久久久| 奇米四色…亚洲| 欧美一区二区久久久| 奇米888四色在线精品| 日韩三级免费观看| 国产在线精品一区二区不卡了| 久久久久久久久蜜桃| 国产精品自产自拍| 国产精品区一区二区三区| 国产jizzjizz一区二区| 最新不卡av在线| 日本精品免费观看高清观看| 亚洲永久精品国产| 制服丝袜一区二区三区| 麻豆免费看一区二区三区| 欧美成人精品福利| 夫妻av一区二区| 亚洲女同ⅹxx女同tv| 欧美色网一区二区| 蜜臀99久久精品久久久久久软件 | 久久久另类综合| 国产99精品国产| 一区二区三区免费观看| 欧美日韩综合色| 韩国女主播成人在线| 日韩毛片视频在线看| 777奇米四色成人影色区| 国产一区在线观看视频| 亚洲男女毛片无遮挡| 欧美剧情片在线观看| 国产麻豆日韩欧美久久| 亚洲黄色尤物视频| 精品国产青草久久久久福利| 成人av在线网| 视频精品一区二区| 中文字幕巨乱亚洲| 欧美视频自拍偷拍| 国产综合久久久久久鬼色| 中文字幕一区二区三区不卡| 欧美日韩国产高清一区二区| 国产成a人亚洲精| 日韩国产欧美在线播放| 国产精品乱人伦| 日韩欧美亚洲一区二区| 色美美综合视频| 狠狠久久亚洲欧美| 亚洲18女电影在线观看| 国产精品久久久99| 精品国产亚洲在线| 欧美日韩一区二区三区四区| 不卡电影免费在线播放一区| 美女久久久精品| 亚洲国产日日夜夜| 亚洲同性同志一二三专区| 精品日韩欧美在线| 欧美日韩精品一区视频| proumb性欧美在线观看| 久久99精品国产.久久久久| 一区av在线播放| 国产精品乱人伦中文| 久久久av毛片精品| 日韩精品在线一区二区| 欧美久久久久久久久中文字幕| 成人app软件下载大全免费| 麻豆国产91在线播放| 偷拍自拍另类欧美| 亚洲黄色在线视频| 亚洲精品视频在线| 日韩理论在线观看| 亚洲欧洲av在线| 国产精品久久久久永久免费观看 | 日韩西西人体444www| 欧美性猛交一区二区三区精品 | 欧美日韩国产在线播放网站| 91美女片黄在线观看| 成人精品一区二区三区四区| 国产一区二区三区免费观看| 精品一区二区三区蜜桃| 久久精工是国产品牌吗| 精品一区二区影视| 精品一区二区三区在线视频| 国内精品伊人久久久久av影院| 蜜臀av性久久久久蜜臀av麻豆| 热久久国产精品| 精品一二三四区| 国产激情91久久精品导航| 国产成都精品91一区二区三| www.在线成人| 色综合天天综合网国产成人综合天| 成人av在线网| 欧美亚洲动漫制服丝袜| 日韩一区二区三区免费看| 欧美一区二区视频在线观看2020| 欧美mv日韩mv| 国产午夜精品久久| 中文字幕在线一区免费| 亚洲国产日产av| 美女免费视频一区二区| 成人精品小蝌蚪| 欧美亚洲一区三区| 日韩视频在线永久播放| 久久精品一区八戒影视| 亚洲欧美另类图片小说| 亚洲国产日韩av| 国产精品一卡二卡在线观看| 不卡影院免费观看| 欧美日韩极品在线观看一区| 精品少妇一区二区三区免费观看| 久久久蜜桃精品| 亚洲一级二级在线| 久久激情综合网| 色综合久久六月婷婷中文字幕| 国产精品乱人伦| 青娱乐精品视频| 97成人超碰视| 精品国产一区久久| 亚洲精品国产一区二区三区四区在线| 天天综合网天天综合色| 成人性生交大合| 538在线一区二区精品国产| 国产精品欧美极品| 美国欧美日韩国产在线播放| 北条麻妃一区二区三区| 日韩精品中文字幕在线一区| 综合分类小说区另类春色亚洲小说欧美 | 99久久99久久久精品齐齐|