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

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

?? radio-gemtek-pci.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
字號:
/* *************************************************************************** *      *     radio-gemtek-pci.c - Gemtek PCI Radio driver *     (C) 2001 Vladimir Shebordaev <vshebordaev@mail.ru> * *************************************************************************** * *     This program is free software; you can redistribute it and/or *     modify it under the terms of the GNU General Public License as *     published by the Free Software Foundation; either version 2 of *     the License, or (at your option) any later version. * *     This program is distributed in the hope that it will be useful, *     but WITHOUT ANY WARRANTY; without even the implied warranty of *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *     GNU General Public License for more details. * *     You should have received a copy of the GNU General Public *     License along with this program; if not, write to the Free *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, *     USA. * *************************************************************************** * *     Gemtek Corp still silently refuses to release any specifications *     of their multimedia devices, so the protocol still has to be *     reverse engineered. * *     The v4l code was inspired by Jonas Munsin's  Gemtek serial line *     radio device driver. * *     Please, let me know if this piece of code was useful :) *  *     TODO: multiple device support and portability were not tested * *************************************************************************** */#include <linux/version.h>#include <linux/config.h>#include <linux/types.h>#include <linux/list.h>#include <linux/module.h>#include <linux/init.h>#include <linux/pci.h>#include <linux/videodev.h>#include <linux/errno.h>#include <asm/io.h>#include <asm/uaccess.h>#ifndef PCI_VENDOR_ID_GEMTEK#define PCI_VENDOR_ID_GEMTEK 0x5046#endif#ifndef PCI_DEVICE_ID_GEMTEK_PR103#define PCI_DEVICE_ID_GEMTEK_PR103 0x1001#endif#ifndef GEMTEK_PCI_RANGE_LOW#define GEMTEK_PCI_RANGE_LOW (87*16000)#endif#ifndef GEMTEK_PCI_RANGE_HIGH#define GEMTEK_PCI_RANGE_HIGH (108*16000)#endif#ifndef TRUE#define TRUE (1)#endif#ifndef FALSE #define FALSE (0)#endifstruct gemtek_pci_card {	struct video_device *videodev;		u32 iobase;	u32 length;	u8  chiprev;	u16 model;		u32 current_frequency;	u8  mute;};static const char rcsid[] = "$Id: radio-gemtek-pci.c,v 1.1 2001/07/23 08:08:16 ted Exp ted $";static int nr_radio = -1;static int gemtek_pci_open( struct video_device *dev, int flags){	struct gemtek_pci_card *card =  dev->priv;/* Paranoid check */	if ( !card )		return -ENODEV;	return 0;}static void gemtek_pci_close( struct video_device *dev ){/* *  The module usage is managed by 'videodev' */}static inline u8 gemtek_pci_out( u16 value, u32 port ){	outw( value, port );	return (u8)value;}#define _b0( v ) *((u8 *)&v)  static void __gemtek_pci_cmd( u16 value, u32 port, u8 *last_byte, int keep ){	register u8 byte = *last_byte;	if ( !value ) {		if ( !keep )			value = (u16)port;		byte &= 0xfd;		} else		byte |= 2;	_b0( value ) = byte;	outw( value, port );	byte |= 1;	_b0( value ) = byte;	outw( value, port );	byte &= 0xfe;	_b0( value ) = byte;	outw( value, port );		*last_byte = byte;}static inline void gemtek_pci_nil( u32 port, u8 *last_byte ){	__gemtek_pci_cmd( 0x00, port, last_byte, FALSE );}static inline void gemtek_pci_cmd( u16 cmd, u32 port, u8 *last_byte ){	__gemtek_pci_cmd( cmd, port, last_byte, TRUE );}static void gemtek_pci_setfrequency( struct gemtek_pci_card *card, unsigned long frequency ){	register int i;	register u32 value = frequency / 200 + 856;	register u16 mask = 0x8000;	u8 last_byte;	u32 port = card->iobase;	last_byte = gemtek_pci_out( 0x06, port );	i = 0;	do {		gemtek_pci_nil( port, &last_byte );		i++;	} while ( i < 9 );	i = 0;	do {		gemtek_pci_cmd( value & mask, port, &last_byte );		mask >>= 1;		i++;	} while ( i < 16 );	outw( 0x10, port );}static inline void gemtek_pci_mute( struct gemtek_pci_card *card ){	outb( 0x1f, card->iobase );	card->mute = TRUE;}static inline void gemtek_pci_unmute( struct gemtek_pci_card *card ){	if ( card->mute ) {		gemtek_pci_setfrequency( card, card->current_frequency );		card->mute = FALSE;	}}static inline unsigned int gemtek_pci_getsignal( struct gemtek_pci_card *card ){	return ( inb( card->iobase ) & 0x08 ) ? 0 : 1;}static int gemtek_pci_ioctl( struct video_device *dev, unsigned int cmd, void *arg){	struct gemtek_pci_card *card = dev->priv;	switch ( cmd ) {		case VIDIOCGCAP:		{			struct video_capability c;			c.type = VID_TYPE_TUNER;			c.channels = 1;			c.audios = 1;			c.maxwidth = 0;			c.maxheight = 0;			c.minwidth = 0;			c.minheight = 0;			strcpy( c.name, "Gemtek PCI Radio" );			if ( copy_to_user( arg, &c, sizeof( c ) ) )				return -EFAULT;			return 0;		} 		case VIDIOCGTUNER:		{			struct video_tuner t;			int signal;			if ( copy_from_user( &t, arg, sizeof( struct video_tuner ) ) )				return -EFAULT;			if ( t.tuner ) 				return -EINVAL;			signal = gemtek_pci_getsignal( card );			t.rangelow = GEMTEK_PCI_RANGE_LOW;			t.rangehigh = GEMTEK_PCI_RANGE_HIGH;			t.flags = VIDEO_TUNER_LOW | (7 << signal) ;			t.mode = VIDEO_MODE_AUTO;			t.signal = 0xFFFF * signal;			strcpy( t.name, "FM" );			if ( copy_to_user( arg, &t, sizeof( struct video_tuner ) ) )				return -EFAULT;			return 0;		}		case VIDIOCSTUNER:		{			struct video_tuner t;			if ( copy_from_user( &t, arg, sizeof( struct video_tuner ) ) )				return -EFAULT;			if ( t.tuner )				return -EINVAL;			return 0;		}		case VIDIOCGFREQ:			return put_user( card->current_frequency, (u32 *)arg );		case VIDIOCSFREQ:		{			u32 frequency;	 			if ( get_user( frequency, (u32 *)arg ) )				return -EFAULT;			if ( (frequency < GEMTEK_PCI_RANGE_LOW) || (frequency > GEMTEK_PCI_RANGE_HIGH) )				return -EINVAL;			gemtek_pci_setfrequency( card, frequency );			card->current_frequency = frequency;			card->mute = FALSE;			return 0;		}  		case VIDIOCGAUDIO:		{				struct video_audio a;			memset( &a, 0, sizeof( a ) );			a.flags |= VIDEO_AUDIO_MUTABLE;			a.volume = 1;			a.step = 65535;                        a.mode = (1 << gemtek_pci_getsignal( card ));			strcpy( a.name, "Radio" );			if ( copy_to_user( arg, &a, sizeof( struct video_audio ) ) )				return -EFAULT;			return 0;					}		case VIDIOCSAUDIO:		{			struct video_audio a;			if ( copy_from_user( &a, arg, sizeof( struct video_audio ) ) ) 				return -EFAULT;				if ( a.audio ) 				return -EINVAL;			if ( a.flags & VIDEO_AUDIO_MUTE ) 				gemtek_pci_mute( card );			else				gemtek_pci_unmute( card );			return 0;		}		default:			return -ENOIOCTLCMD;	}}enum {	GEMTEK_PR103};static char *card_names[] __devinitdata = {	"GEMTEK_PR103"};static struct pci_device_id gemtek_pci_id[] ={	{ PCI_VENDOR_ID_GEMTEK, PCI_DEVICE_ID_GEMTEK_PR103,	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, GEMTEK_PR103 },	{ 0 }};MODULE_DEVICE_TABLE( pci, gemtek_pci_id );static u8 mx = 1;static char gemtek_pci_videodev_name[] = "Gemtek PCI Radio";static inline void gemtek_pci_init_struct( struct video_device *dev ){	memset( dev, 0, sizeof( struct video_device ) );	dev->owner = THIS_MODULE;	strcpy( dev->name , gemtek_pci_videodev_name );	dev->type = VID_TYPE_TUNER;	dev->hardware = VID_HARDWARE_GEMTEK;	dev->open = gemtek_pci_open;	dev->close = gemtek_pci_close;	dev->ioctl = gemtek_pci_ioctl;}static int __devinit gemtek_pci_probe( struct pci_dev *pci_dev, const struct pci_device_id *pci_id ){	struct gemtek_pci_card *card;	struct video_device *devradio;	if ( (card = kmalloc( sizeof( struct gemtek_pci_card ), GFP_KERNEL )) == NULL ) {		printk( KERN_ERR "gemtek_pci: out of memory\n" );		return -ENOMEM;	}	memset( card, 0, sizeof( struct gemtek_pci_card ) );	if ( pci_enable_device( pci_dev ) ) 		goto err_pci;		card->iobase = pci_resource_start( pci_dev, 0 );	card->length = pci_resource_len( pci_dev, 0 );	if ( request_region( card->iobase, card->length, card_names[pci_id->driver_data] ) == NULL ) {		printk( KERN_ERR "gemtek_pci: i/o port already in use\n" );		goto err_pci;	}	pci_read_config_byte( pci_dev, PCI_REVISION_ID, &card->chiprev );	pci_read_config_word( pci_dev, PCI_SUBSYSTEM_ID, &card->model );	pci_set_drvdata( pci_dev, card ); 	if ( (devradio = kmalloc( sizeof( struct video_device ), GFP_KERNEL )) == NULL ) {		printk( KERN_ERR "gemtek_pci: out of memory\n" );		goto err_video;	}	gemtek_pci_init_struct( devradio );	if ( video_register_device( devradio, VFL_TYPE_RADIO , nr_radio) == -1 ) {		kfree( devradio );		goto err_video;	}	card->videodev = devradio;	devradio->priv = card;	gemtek_pci_mute( card );	printk( KERN_INFO "Gemtek PCI Radio (rev. %d) found at 0x%04x-0x%04x.\n", 		card->chiprev, card->iobase, card->iobase + card->length - 1 );	return 0;err_video:	release_region( card->iobase, card->length );err_pci:	kfree( card );	return -ENODEV;        }static void __devexit gemtek_pci_remove( struct pci_dev *pci_dev ){	struct gemtek_pci_card *card = pci_get_drvdata( pci_dev );	video_unregister_device( card->videodev );	kfree( card->videodev );	release_region( card->iobase, card->length );		if ( mx )		gemtek_pci_mute( card );	kfree( card );		pci_set_drvdata( pci_dev, NULL );}static struct pci_driver gemtek_pci_driver ={    name:	"gemtek_pci",id_table:	gemtek_pci_id,   probe:	gemtek_pci_probe,  remove:	__devexit_p(gemtek_pci_remove),};static int __init gemtek_pci_init_module( void ){	return pci_module_init( &gemtek_pci_driver );}static void __exit gemtek_pci_cleanup_module( void ){	return pci_unregister_driver( &gemtek_pci_driver );}MODULE_AUTHOR( "Vladimir Shebordaev <vshebordaev@mail.ru>" );MODULE_DESCRIPTION( "The video4linux driver for the Gemtek PCI Radio Card" );MODULE_LICENSE("GPL");MODULE_PARM( mx, "b" );MODULE_PARM_DESC( mx, "single digit: 1 - turn off the turner upon module exit (default), 0 - do not" );MODULE_PARM( nr_radio, "i");MODULE_PARM_DESC( nr_radio, "video4linux device number to use");EXPORT_NO_SYMBOLS;module_init( gemtek_pci_init_module );module_exit( gemtek_pci_cleanup_module );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲福利视频一区二区| 欧美日韩aaa| 制服.丝袜.亚洲.中文.综合| 久久丝袜美腿综合| 日本欧美在线看| 欧美亚洲丝袜传媒另类| 国产欧美日韩亚州综合| 毛片一区二区三区| 精品污污网站免费看| 椎名由奈av一区二区三区| 国产精华液一区二区三区| 日韩限制级电影在线观看| 一区二区三区中文在线| 不卡在线观看av| 国产欧美一区二区在线观看| 久99久精品视频免费观看| 欧美猛男超大videosgay| 一区二区三区在线视频播放| 99久久综合99久久综合网站| 日本一区二区在线不卡| 国产精品综合二区| 久久久久亚洲综合| 国产精品一二三区在线| 国产视频一区在线播放| 国产精品一品二品| 欧美国产日韩亚洲一区| 高清在线不卡av| 欧美激情艳妇裸体舞| 丁香婷婷综合激情五月色| 久久久www免费人成精品| 国产一区二区三区免费播放 | 337p日本欧洲亚洲大胆色噜噜| 丝袜美腿高跟呻吟高潮一区| 欧美日本一区二区三区四区| 亚洲国产精品影院| 日韩一级片在线播放| 久久国产人妖系列| 国产午夜精品理论片a级大结局| 国产精品资源网| 欧美国产成人精品| 91蝌蚪国产九色| 亚洲精品视频自拍| 欧美揉bbbbb揉bbbbb| 日韩福利视频导航| 久久久蜜桃精品| 成人免费高清视频| 亚洲自拍偷拍欧美| 欧美一区二区三区成人| 狠狠狠色丁香婷婷综合激情| 久久精品视频免费观看| 91在线观看高清| 亚洲国产你懂的| 亚洲精品在线电影| av高清不卡在线| 亚洲午夜激情网页| 精品99999| 波波电影院一区二区三区| 香蕉久久一区二区不卡无毒影院| 日韩欧美一级在线播放| youjizz久久| 青青国产91久久久久久 | 亚洲婷婷国产精品电影人久久| 欧美性色aⅴ视频一区日韩精品| 亚洲高清中文字幕| 国产欧美日韩在线观看| 欧美色视频一区| 国产一区二区三区精品欧美日韩一区二区三区 | 色天使久久综合网天天| 秋霞影院一区二区| 亚洲人成网站影音先锋播放| 日韩一二三区视频| 在线精品亚洲一区二区不卡| 久久99在线观看| 亚洲综合在线第一页| 久久九九国产精品| 欧美精品黑人性xxxx| av高清久久久| 国产美女娇喘av呻吟久久| 亚洲电影欧美电影有声小说| 国产欧美视频一区二区| 91精品国产一区二区三区蜜臀| 成+人+亚洲+综合天堂| 久久精品国产99国产| 一区二区三区四区国产精品| www日韩大片| 欧美一区二区三区啪啪| 91福利在线观看| 不卡高清视频专区| 国产乱码精品1区2区3区| 免费在线看成人av| 亚洲一区二区三区小说| 亚洲四区在线观看| 国产精品麻豆欧美日韩ww| www国产精品av| 日韩欧美国产系列| 91精品国产aⅴ一区二区| 欧美在线观看18| 一本到高清视频免费精品| 成人精品国产一区二区4080| 国内精品视频一区二区三区八戒| 日本成人超碰在线观看| 五月婷婷激情综合网| 亚洲一线二线三线视频| 日韩毛片在线免费观看| 国产精品二三区| 国产精品激情偷乱一区二区∴| 久久久久久夜精品精品免费| 精品少妇一区二区三区| 日韩欧美一区二区不卡| 精品国产欧美一区二区| 精品国产91久久久久久久妲己| 制服.丝袜.亚洲.中文.综合| 欧美日本一区二区三区四区| 在线成人av网站| 7777女厕盗摄久久久| 欧美一区二区三区电影| 日韩女优制服丝袜电影| 欧美r级在线观看| 久久久激情视频| 中文字幕一区av| 亚洲一区二区综合| 日本vs亚洲vs韩国一区三区二区| 污片在线观看一区二区| 久久精品国产99国产| 国产suv精品一区二区三区| www.久久精品| 欧美日韩美女一区二区| 欧美一区二区福利在线| 久久久亚洲精品石原莉奈| 欧美国产精品中文字幕| 一级精品视频在线观看宜春院 | 国产成人亚洲综合a∨猫咪| 岛国av在线一区| 91免费版pro下载短视频| 欧美综合一区二区| 欧美tickling挠脚心丨vk| 中文字幕国产一区二区| 亚洲一区二区三区三| 极品少妇xxxx精品少妇| 成人激情黄色小说| 欧美调教femdomvk| 久久看人人爽人人| 亚洲欧美日韩人成在线播放| 日韩在线观看一区二区| 国产成人精品一区二| 欧美日本一道本| 国产日韩综合av| 亚洲 欧美综合在线网络| 国产高清无密码一区二区三区| 色综合欧美在线| 欧美电视剧在线看免费| 中文字幕在线一区免费| 另类欧美日韩国产在线| 一本一道久久a久久精品 | 国产一区二区精品久久91| 91原创在线视频| 日韩一区二区三区观看| 中文字幕一区二区三区不卡| 青青草国产成人av片免费| 99精品一区二区三区| 欧美tk—视频vk| 亚洲v精品v日韩v欧美v专区| 成a人片国产精品| 精品国产免费视频| 亚瑟在线精品视频| 色综合天天综合在线视频| 久久免费美女视频| 免费欧美在线视频| 欧美日韩国产一级片| 国产精品人妖ts系列视频| 麻豆国产精品777777在线| 91久久久免费一区二区| 国产网站一区二区| 美女一区二区在线观看| 欧美老肥妇做.爰bbww视频| 亚洲欧美自拍偷拍色图| 国产成人鲁色资源国产91色综 | 综合激情成人伊人| 国产在线乱码一区二区三区| 717成人午夜免费福利电影| 亚洲色图欧美偷拍| 99久久99久久精品国产片果冻| 久久久久久久性| 国产米奇在线777精品观看| 91精品国产综合久久国产大片| 午夜精品一区二区三区电影天堂 | 国产成人一区在线| 26uuu国产一区二区三区| 麻豆国产精品一区二区三区| 欧美一级夜夜爽| 日本强好片久久久久久aaa| 欧美日精品一区视频| 亚洲一区二区三区在线播放| 91极品视觉盛宴| 亚洲伦理在线精品| 91精品福利视频| 性久久久久久久| 91.成人天堂一区| 人人狠狠综合久久亚洲| 欧美一级免费大片|