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

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

?? dvbdev.c

?? linux環境下的dvb驅動程序
?? C
字號:
/*  * dvbdev.c * * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de> *                  & Marcus Metzler <marcus@convergence.de> *                    for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 * 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 Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. * */#include <linux/types.h>#include <linux/errno.h>#include <linux/string.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/slab.h>#include "dvbdev.h"#include "dvb_functions.h"static int dvbdev_debug = 0;#define dprintk if (dvbdev_debug) printkstatic LIST_HEAD(dvb_adapter_list);static DECLARE_MUTEX(dvbdev_register_lock);static char *dnames[] = {         "video", "audio", "sec", "frontend", "demux", "dvr", "ca",	"net", "osd"};#ifdef CONFIG_DVB_DEVFS_ONLY	#define DVB_MAX_IDS              ~0	#define nums2minor(num,type,id)  0#else	#define DVB_MAX_IDS              4	#define nums2minor(num,type,id)  ((num << 6) | (id << 4) | type)static struct dvb_device* dvbdev_find_device (int minor){	struct list_head *entry;	list_for_each (entry, &dvb_adapter_list) {		struct list_head *entry0;		struct dvb_adapter *adap;		adap = list_entry (entry, struct dvb_adapter, list_head);		list_for_each (entry0, &adap->device_list) {			struct dvb_device *dev;			dev = list_entry (entry0, struct dvb_device, list_head);			if (nums2minor(adap->num, dev->type, dev->id) == minor)				return dev;		}	}	return NULL;}static int dvb_device_open(struct inode *inode, struct file *file){	struct dvb_device *dvbdev;		dvbdev = dvbdev_find_device (iminor(inode));	if (dvbdev && dvbdev->fops) {		int err = 0;		struct file_operations *old_fops;		file->private_data = dvbdev;		old_fops = file->f_op;                file->f_op = fops_get(dvbdev->fops);                if(file->f_op->open)                        err = file->f_op->open(inode,file);                if (err) {                        fops_put(file->f_op);                        file->f_op = fops_get(old_fops);                }                fops_put(old_fops);                return err;	}	return -ENODEV;}static struct file_operations dvb_device_fops ={	.owner =	THIS_MODULE,	.open =		dvb_device_open,};#endif /* CONFIG_DVB_DEVFS_ONLY */int dvb_generic_open(struct inode *inode, struct file *file){        struct dvb_device *dvbdev = file->private_data;        if (!dvbdev)                return -ENODEV;	if (!dvbdev->users)                return -EBUSY;	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {                if (!dvbdev->readers)		        return -EBUSY;		dvbdev->readers--;	} else {                if (!dvbdev->writers)		        return -EBUSY;		dvbdev->writers--;	}	dvbdev->users--;	return 0;}int dvb_generic_release(struct inode *inode, struct file *file){        struct dvb_device *dvbdev = file->private_data;	if (!dvbdev)                return -ENODEV;	if ((file->f_flags & O_ACCMODE) == O_RDONLY) {		dvbdev->readers++;	} else {		dvbdev->writers++;	}		dvbdev->users++;	return 0;}int dvb_generic_ioctl(struct inode *inode, struct file *file,		      unsigned int cmd, unsigned long arg){        struct dvb_device *dvbdev = file->private_data;	        if (!dvbdev)	        return -ENODEV;	if (!dvbdev->kernel_ioctl)		return -EINVAL;	return dvb_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl);}static int dvbdev_get_free_id (struct dvb_adapter *adap, int type){	u32 id = 0;	while (id < DVB_MAX_IDS) {		struct list_head *entry;		list_for_each (entry, &adap->device_list) {			struct dvb_device *dev;			dev = list_entry (entry, struct dvb_device, list_head);			if (dev->type == type && dev->id == id)				goto skip;		}		return id;skip:		id++;	}	return -ENFILE;}int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, 			const struct dvb_device *template, void *priv, int type){	struct dvb_device *dvbdev;	int id;	if (down_interruptible (&dvbdev_register_lock))		return -ERESTARTSYS;	if ((id = dvbdev_get_free_id (adap, type)) < 0) {		up (&dvbdev_register_lock);		*pdvbdev = 0;		printk ("%s: could get find free device id...\n", __FUNCTION__);		return -ENFILE;	}	*pdvbdev = dvbdev = kmalloc(sizeof(struct dvb_device), GFP_KERNEL);	if (!dvbdev) {		up(&dvbdev_register_lock);		return -ENOMEM;	}	up (&dvbdev_register_lock);		memcpy(dvbdev, template, sizeof(struct dvb_device));	dvbdev->type = type;	dvbdev->id = id;	dvbdev->adapter = adap;	dvbdev->priv = priv;	list_add_tail (&dvbdev->list_head, &adap->device_list);#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	{	char name[64];	snprintf(name, sizeof(name), "%s%d", dnames[type], id);	dvbdev->devfs_handle = devfs_register(adap->devfs_handle, name,					      DEVFS_FL_DEFAULT,					      DVB_MAJOR,					      nums2minor(adap->num, type, id),					      S_IFCHR | S_IRUSR | S_IWUSR,					      dvbdev->fops, dvbdev);	dprintk("DVB: register adapter%d/%s @ minor: %i (0x%02x)\n",		adap->num, name, nums2minor(adap->num, type, id),		nums2minor(adap->num, type, id));	}#else	devfs_mk_cdev(MKDEV(DVB_MAJOR, nums2minor(adap->num, type, id)), 			S_IFCHR | S_IRUSR | S_IWUSR,			"dvb/adapter%d/%s%d", adap->num, dnames[type], id);	dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",		adap->num, dnames[type], id, nums2minor(adap->num, type, id), 		nums2minor(adap->num, type, id));#endif	return 0;}void dvb_unregister_device(struct dvb_device *dvbdev){	if (!dvbdev)		return;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	devfs_unregister(dvbdev->devfs_handle);#else	devfs_remove("dvb/adapter%d/%s%d", dvbdev->adapter->num,			dnames[dvbdev->type], dvbdev->id);#endif	list_del (&dvbdev->list_head);	kfree (dvbdev);}static int dvbdev_get_free_adapter_num (void){	int num = 0;	while (1) {		struct list_head *entry;		list_for_each (entry, &dvb_adapter_list) {			struct dvb_adapter *adap;			adap = list_entry (entry, struct dvb_adapter, list_head);			if (adap->num == num)				goto skip;		}		return num;skip:		num++;	}	return -ENFILE;}int dvb_register_adapter(struct dvb_adapter **padap, const char *name){	struct dvb_adapter *adap;	int num;	if (down_interruptible (&dvbdev_register_lock))		return -ERESTARTSYS;	if ((num = dvbdev_get_free_adapter_num ()) < 0) {		up (&dvbdev_register_lock);		return -ENFILE;	}	if (!(*padap = adap = kmalloc(sizeof(struct dvb_adapter), GFP_KERNEL))) {		up(&dvbdev_register_lock);		return -ENOMEM;	}	memset (adap, 0, sizeof(struct dvb_adapter));	INIT_LIST_HEAD (&adap->device_list);	printk ("DVB: registering new adapter (%s).\n", name);	#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	{	char dirname[64];	snprintf(dirname, sizeof(dirname), "adapter%d", num);	adap->devfs_handle = devfs_mk_dir(dvb_devfs_handle, dirname, NULL);	}#else	devfs_mk_dir("dvb/adapter%d", num);#endif	adap->num = num;	adap->name = name;	list_add_tail (&adap->list_head, &dvb_adapter_list);	up (&dvbdev_register_lock);	return num;}int dvb_unregister_adapter(struct dvb_adapter *adap){#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	devfs_unregister(adap->devfs_handle);#else	devfs_remove("dvb/adapter%d", adap->num);#endif	if (down_interruptible (&dvbdev_register_lock))		return -ERESTARTSYS;	list_del (&adap->list_head);	up (&dvbdev_register_lock);	kfree (adap);	return 0;}static int __init init_dvbdev(void){	int retval;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	dvb_devfs_handle = devfs_mk_dir (NULL, "dvb", NULL);#else	devfs_mk_dir("dvb");#endif#ifndef CONFIG_DVB_DEVFS_ONLY	if ((retval = register_chrdev(DVB_MAJOR,"DVB", &dvb_device_fops)))		printk("video_dev: unable to get major %d\n", DVB_MAJOR);#endif	return retval;}static void __exit exit_dvbdev(void){#ifndef CONFIG_DVB_DEVFS_ONLY	unregister_chrdev(DVB_MAJOR, "DVB");#endif#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))	devfs_unregister(dvb_devfs_handle);#else        devfs_remove("dvb");#endif}module_init(init_dvbdev);module_exit(exit_dvbdev);MODULE_DESCRIPTION("DVB Core Driver");MODULE_AUTHOR("Marcus Metzler, Ralph Metzler, Holger Waechtler");MODULE_LICENSE("GPL");MODULE_PARM(dvbdev_debug,"i");MODULE_PARM_DESC(dvbdev_debug, "enable verbose debug messages");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲女性喷水在线观看一区| 欧美色图免费看| 久久影院午夜论| 国产福利一区二区三区视频 | 日韩精品资源二区在线| 蜜桃av一区二区三区电影| 日韩精品一区二区三区swag| 国产精一品亚洲二区在线视频| 久久精品欧美一区二区三区麻豆 | 激情综合五月天| 国产欧美日韩卡一| 色琪琪一区二区三区亚洲区| 午夜欧美2019年伦理| 精品欧美乱码久久久久久1区2区| 国产精品亚洲一区二区三区在线| 椎名由奈av一区二区三区| 欧美日韩国产综合视频在线观看| 麻豆精品国产传媒mv男同| 亚洲国产精品精华液2区45| 色一情一伦一子一伦一区| 日韩1区2区3区| 国产欧美日韩在线视频| 欧美色综合网站| 国产精品自拍网站| 亚洲一区二区视频在线| www久久精品| 欧美午夜精品久久久久久超碰| 精品写真视频在线观看| 亚洲精品一二三四区| 日韩精品一区在线观看| 91丨porny丨在线| 麻豆精品精品国产自在97香蕉| 国产精品美女久久久久久 | av爱爱亚洲一区| 日本不卡一二三区黄网| 亚洲欧洲精品一区二区三区不卡| 91精品久久久久久久91蜜桃| 不卡的av网站| 久久99日本精品| 亚洲曰韩产成在线| 日本一区二区免费在线| 欧美欧美欧美欧美首页| www.欧美日韩| 激情五月激情综合网| 亚洲福利视频一区| 亚洲欧洲三级电影| 久久婷婷综合激情| 91精品国产综合久久福利软件| eeuss鲁片一区二区三区| 久草精品在线观看| 日韩国产欧美在线播放| 亚洲女人小视频在线观看| 久久综合九色综合欧美98| 欧美肥妇free| 欧美少妇一区二区| 91视频免费播放| zzijzzij亚洲日本少妇熟睡| 国产乱码精品一区二区三区忘忧草| 亚洲小说欧美激情另类| 亚洲视频综合在线| 欧美激情一区二区三区全黄| 久久亚洲综合色一区二区三区| 欧美一区二区三区思思人| 在线免费观看日本一区| 91啪在线观看| 99在线精品观看| 91在线精品秘密一区二区| 成人一区二区三区在线观看| 激情成人午夜视频| 理论片日本一区| 日本美女一区二区三区| 视频一区二区三区中文字幕| 亚洲国产精品久久人人爱蜜臀 | 另类中文字幕网| 日精品一区二区| 天天综合天天做天天综合| 亚洲va国产天堂va久久en| 艳妇臀荡乳欲伦亚洲一区| 亚洲乱码中文字幕| 亚洲综合网站在线观看| 夜夜嗨av一区二区三区中文字幕| 亚洲精品高清视频在线观看| 一区二区三区四区不卡在线 | 国产精品人妖ts系列视频| 日韩欧美一区二区视频| 久久精品亚洲麻豆av一区二区 | 亚洲免费在线观看视频| 99精品欧美一区二区三区小说| 国产成人aaaa| 国产一区中文字幕| 国产成人精品亚洲午夜麻豆| 国产不卡免费视频| 不卡欧美aaaaa| 日本久久一区二区三区| 欧美日韩不卡一区二区| 欧美一级片在线观看| 精品国产一区久久| 亚洲午夜精品一区二区三区他趣| 亚洲男人天堂av| 日韩国产精品久久久久久亚洲| 日韩不卡一区二区| 国产美女在线精品| 91论坛在线播放| 国产精品黄色在线观看| 国产xxx精品视频大全| 99久久国产综合精品女不卡| 欧美日韩久久久久久| 日韩免费观看高清完整版| 国产亚洲1区2区3区| 亚洲精品中文在线影院| 免费观看日韩电影| 成人一区二区三区视频| 欧美日韩另类国产亚洲欧美一级| 欧美电影免费观看高清完整版在线观看 | 国产91精品精华液一区二区三区 | 国产成a人亚洲| 91日韩精品一区| 日韩视频一区二区在线观看| 色噜噜久久综合| 99视频精品全部免费在线| av一区二区三区在线| 99riav一区二区三区| 99久久er热在这里只有精品66| 99精品视频在线播放观看| 91丨九色丨国产丨porny| 在线观看国产精品网站| 欧美人动与zoxxxx乱| 日韩精品一区二区三区在线观看 | 欧美一级淫片007| 国产精品资源在线看| 成人一二三区视频| 欧美日本免费一区二区三区| 亚洲国产精品成人久久综合一区 | 日韩欧美久久一区| 亚洲日本在线观看| 国产精品综合视频| 91精品国产综合久久精品app| 亚洲欧洲精品一区二区精品久久久| 日韩精品三区四区| 在线免费观看日本欧美| 国产精品网站一区| 国内精品国产成人国产三级粉色| 欧美色偷偷大香| 亚洲伦理在线免费看| 国产一区二区三区在线观看免费| 欧美三级视频在线观看| 在线免费一区三区| 中文字幕免费不卡在线| 美女视频一区在线观看| 欧美日韩免费观看一区三区| 亚洲色图.com| 成人黄色电影在线| 久久精品亚洲精品国产欧美kt∨| 日韩精品欧美精品| 欧美日韩在线播| 亚洲观看高清完整版在线观看| 91在线小视频| 国产精品二三区| jizz一区二区| 中文字幕亚洲一区二区va在线| 国产成人av电影在线播放| 久久综合久色欧美综合狠狠| 美女脱光内衣内裤视频久久网站| 3751色影院一区二区三区| 日韩精品成人一区二区三区| 欧美老女人在线| 午夜精品一区在线观看| 69堂亚洲精品首页| 蜜桃视频第一区免费观看| 日韩一本二本av| 久久精品国产久精国产爱| 欧美一区二区三区的| 日本大胆欧美人术艺术动态| 7777精品久久久大香线蕉| 日本中文字幕一区二区有限公司| 日韩午夜激情av| 日韩av一级电影| 午夜亚洲福利老司机| 日本免费新一区视频| 91原创在线视频| 亚洲欧美日韩系列| 欧美综合久久久| 亚洲成人免费视| 欧美一区二区观看视频| 国产一区91精品张津瑜| 国产日产欧美一区| 91色|porny| 日韩成人一级大片| 欧美精品一区二区在线观看| 成人综合在线观看| 亚洲一区日韩精品中文字幕| 91精品麻豆日日躁夜夜躁| 国产一区二区三区免费播放| 国产精品第一页第二页第三页| 精品国产露脸精彩对白 | 久久国产精品色| 国产喷白浆一区二区三区| 91看片淫黄大片一级在线观看| 亚洲线精品一区二区三区| 欧美成人女星排行榜|