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

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

?? budget-ci.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * budget-ci.c: driver for the SAA7146 based Budget DVB cards * * Compiled from various sources by Michael Hunold <michael@mihu.de> * *     msp430 IR support contributed by Jack Thomasson <jkt@Helius.COM> *     partially based on the Siemens DVB driver by Ralph+Marcus Metzler * * CI interface support (c) 2004 Andrew de Quincey <adq_dvb@lidskialf.net> * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Or, point your browser to http://www.gnu.org/copyleft/gpl.html * * * the project's page is at http://www.linuxtv.org/dvb/ */#include "budget.h"#include <linux/module.h>#include <linux/errno.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/input.h>#include <linux/spinlock.h>#include "dvb_ca_en50221.h"#include "stv0299.h"#include "stv0297.h"#include "tda1004x.h"#define DEBIADDR_IR		0x1234#define DEBIADDR_CICONTROL	0x0000#define DEBIADDR_CIVERSION	0x4000#define DEBIADDR_IO		0x1000#define DEBIADDR_ATTR		0x3000#define CICONTROL_RESET		0x01#define CICONTROL_ENABLETS	0x02#define CICONTROL_CAMDETECT	0x08#define DEBICICTL		0x00420000#define DEBICICAM		0x02420000#define SLOTSTATUS_NONE		1#define SLOTSTATUS_PRESENT	2#define SLOTSTATUS_RESET	4#define SLOTSTATUS_READY	8#define SLOTSTATUS_OCCUPIED	(SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY)struct budget_ci {	struct budget budget;	struct input_dev input_dev;	struct tasklet_struct msp430_irq_tasklet;	struct tasklet_struct ciintf_irq_tasklet;	int slot_status;	struct dvb_ca_en50221 ca;	char ir_dev_name[50];	u8 tuner_pll_address; /* used for philips_tdm1316l configs */};/* from reading the following remotes:   Zenith Universal 7 / TV Mode 807 / VCR Mode 837   Hauppauge (from NOVA-CI-s box product)   i've taken a "middle of the road" approach and note the differences*/static u16 key_map[64] = {	/* 0x0X */	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8,	KEY_9,	KEY_ENTER,	KEY_RED,	KEY_POWER,		/* RADIO on Hauppauge */	KEY_MUTE,	0,	KEY_A,			/* TV on Hauppauge */	/* 0x1X */	KEY_VOLUMEUP, KEY_VOLUMEDOWN,	0, 0,	KEY_B,	0, 0, 0, 0, 0, 0, 0,	KEY_UP, KEY_DOWN,	KEY_OPTION,		/* RESERVED on Hauppauge */	KEY_BREAK,	/* 0x2X */	KEY_CHANNELUP, KEY_CHANNELDOWN,	KEY_PREVIOUS,		/* Prev. Ch on Zenith, SOURCE on Hauppauge */	0, KEY_RESTART, KEY_OK,	KEY_CYCLEWINDOWS,	/* MINIMIZE on Hauppauge */	0,	KEY_ENTER,		/* VCR mode on Zenith */	KEY_PAUSE,	0,	KEY_RIGHT, KEY_LEFT,	0,	KEY_MENU,		/* FULL SCREEN on Hauppauge */	0,	/* 0x3X */	KEY_SLOW,	KEY_PREVIOUS,		/* VCR mode on Zenith */	KEY_REWIND,	0,	KEY_FASTFORWARD,	KEY_PLAY, KEY_STOP,	KEY_RECORD,	KEY_TUNER,		/* TV/VCR on Zenith */	0,	KEY_C,	0,	KEY_EXIT,	KEY_POWER2,	KEY_TUNER,		/* VCR mode on Zenith */	0,};static void msp430_ir_debounce(unsigned long data){	struct input_dev *dev = (struct input_dev *) data;	if (dev->rep[0] == 0 || dev->rep[0] == ~0) {		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);		return;	}	dev->rep[0] = 0;	dev->timer.expires = jiffies + HZ * 350 / 1000;	add_timer(&dev->timer);	input_event(dev, EV_KEY, key_map[dev->repeat_key], 2);	/* REPEAT */}static void msp430_ir_interrupt(unsigned long data){	struct budget_ci *budget_ci = (struct budget_ci *) data;	struct input_dev *dev = &budget_ci->input_dev;	unsigned int code =		ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;	if (code & 0x40) {		code &= 0x3f;		if (timer_pending(&dev->timer)) {			if (code == dev->repeat_key) {				++dev->rep[0];				return;			}			del_timer(&dev->timer);			input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);		}		if (!key_map[code]) {			printk("DVB (%s): no key for %02x!\n", __FUNCTION__, code);			return;		}		/* initialize debounce and repeat */		dev->repeat_key = code;		/* Zenith remote _always_ sends 2 sequences */		dev->rep[0] = ~0;		/* 350 milliseconds */		dev->timer.expires = jiffies + HZ * 350 / 1000;		/* MAKE */		input_event(dev, EV_KEY, key_map[code], !0);		add_timer(&dev->timer);	}}static int msp430_ir_init(struct budget_ci *budget_ci){	struct saa7146_dev *saa = budget_ci->budget.dev;	int i;	memset(&budget_ci->input_dev, 0, sizeof(struct input_dev));	sprintf(budget_ci->ir_dev_name, "Budget-CI dvb ir receiver %s", saa->name);	budget_ci->input_dev.name = budget_ci->ir_dev_name;	set_bit(EV_KEY, budget_ci->input_dev.evbit);	for (i = 0; i < sizeof(key_map) / sizeof(*key_map); i++)		if (key_map[i])			set_bit(key_map[i], budget_ci->input_dev.keybit);	input_register_device(&budget_ci->input_dev);	budget_ci->input_dev.timer.function = msp430_ir_debounce;	saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);	return 0;}static void msp430_ir_deinit(struct budget_ci *budget_ci){	struct saa7146_dev *saa = budget_ci->budget.dev;	struct input_dev *dev = &budget_ci->input_dev;	saa7146_write(saa, IER, saa7146_read(saa, IER) & ~MASK_06);	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);	if (del_timer(&dev->timer))		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);	input_unregister_device(dev);}static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	if (slot != 0)		return -EINVAL;	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,				     DEBIADDR_ATTR | (address & 0xfff), 1, 1, 0);}static int ciintf_write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address, u8 value){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	if (slot != 0)		return -EINVAL;	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,				      DEBIADDR_ATTR | (address & 0xfff), 1, value, 1, 0);}static int ciintf_read_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	if (slot != 0)		return -EINVAL;	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,				     DEBIADDR_IO | (address & 3), 1, 1, 0);}static int ciintf_write_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address, u8 value){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	if (slot != 0)		return -EINVAL;	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,				      DEBIADDR_IO | (address & 3), 1, value, 1, 0);}static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	struct saa7146_dev *saa = budget_ci->budget.dev;	if (slot != 0)		return -EINVAL;	// trigger on RISING edge during reset so we know when READY is re-asserted	saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);	budget_ci->slot_status = SLOTSTATUS_RESET;	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);	msleep(1);	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,			       CICONTROL_RESET, 1, 0);	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);	return 0;}static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	struct saa7146_dev *saa = budget_ci->budget.dev;	if (slot != 0)		return -EINVAL;	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);	return 0;}static int ciintf_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot){	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;	struct saa7146_dev *saa = budget_ci->budget.dev;	int tmp;	if (slot != 0)		return -EINVAL;	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTLO);	tmp = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,			       tmp | CICONTROL_ENABLETS, 1, 0);	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA);	return 0;}static void ciintf_interrupt(unsigned long data){	struct budget_ci *budget_ci = (struct budget_ci *) data;	struct saa7146_dev *saa = budget_ci->budget.dev;	unsigned int flags;	// ensure we don't get spurious IRQs during initialisation	if (!budget_ci->budget.ci_present)		return;	// read the CAM status	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);	if (flags & CICONTROL_CAMDETECT) {		// GPIO should be set to trigger on falling edge if a CAM is present		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);		if (budget_ci->slot_status & SLOTSTATUS_NONE) {			// CAM insertion IRQ			budget_ci->slot_status = SLOTSTATUS_PRESENT;			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,						     DVB_CA_EN50221_CAMCHANGE_INSERTED);		} else if (budget_ci->slot_status & SLOTSTATUS_RESET) {			// CAM ready (reset completed)			budget_ci->slot_status = SLOTSTATUS_READY;			dvb_ca_en50221_camready_irq(&budget_ci->ca, 0);		} else if (budget_ci->slot_status & SLOTSTATUS_READY) {			// FR/DA IRQ			dvb_ca_en50221_frda_irq(&budget_ci->ca, 0);		}	} else {		// trigger on rising edge if a CAM is not present - when a CAM is inserted, we		// only want to get the IRQ when it sets READY. If we trigger on the falling edge,		// the CAM might not actually be ready yet.		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);		// generate a CAM removal IRQ if we haven't already		if (budget_ci->slot_status & SLOTSTATUS_OCCUPIED) {			// CAM removal IRQ			budget_ci->slot_status = SLOTSTATUS_NONE;			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,						     DVB_CA_EN50221_CAMCHANGE_REMOVED);		}	}}static int ciintf_init(struct budget_ci *budget_ci){	struct saa7146_dev *saa = budget_ci->budget.dev;	int flags;	int result;	memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221));	// enable DEBI pins	saa7146_write(saa, MC1, saa7146_read(saa, MC1) | (0x800 << 16) | 0x800);	// test if it is there	if ((ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0) & 0xa0) != 0xa0) {		result = -ENODEV;		goto error;	}	// determine whether a CAM is present or not	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);	budget_ci->slot_status = SLOTSTATUS_NONE;	if (flags & CICONTROL_CAMDETECT)		budget_ci->slot_status = SLOTSTATUS_PRESENT;	// register CI interface	budget_ci->ca.owner = THIS_MODULE;	budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem;	budget_ci->ca.write_attribute_mem = ciintf_write_attribute_mem;	budget_ci->ca.read_cam_control = ciintf_read_cam_control;	budget_ci->ca.write_cam_control = ciintf_write_cam_control;	budget_ci->ca.slot_reset = ciintf_slot_reset;	budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;	budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;	budget_ci->ca.data = budget_ci;	if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷国产精品综合在线观看| 亚洲一级二级在线| 麻豆精品视频在线观看免费 | 色偷偷88欧美精品久久久| 国产精品久久777777| 97精品久久久午夜一区二区三区| 国产精品理论片| 欧美www视频| 久久国产精品99精品国产| 2020国产精品久久精品美国| 成人一道本在线| 亚洲人成精品久久久久久| 一本色道久久综合精品竹菊| 午夜精品久久久久久久蜜桃app| 欧美一级精品在线| 国产毛片精品视频| 精品少妇一区二区三区免费观看| 99视频一区二区| 综合自拍亚洲综合图不卡区| 91在线无精精品入口| 亚洲成人1区2区| 337p日本欧洲亚洲大胆精品| av激情综合网| 日韩专区欧美专区| 久久久久一区二区三区四区| 色综合欧美在线| 蜜乳av一区二区| 国产精品网站导航| 91精品国产日韩91久久久久久| 丁香婷婷综合激情五月色| 亚洲网友自拍偷拍| 久久影视一区二区| 欧美午夜精品久久久| 国产毛片精品视频| 香蕉成人伊视频在线观看| 欧美精品一区二区三区蜜臀| 91香蕉视频在线| 九九精品视频在线看| 一区二区三区四区不卡在线 | 亚洲午夜免费视频| 久久综合九色欧美综合狠狠| 中文字幕欧美一区| 日韩欧美综合在线| 日本二三区不卡| 国产一区二三区| 一区二区三区日韩欧美精品| 久久久精品综合| 欧美疯狂性受xxxxx喷水图片| jlzzjlzz亚洲女人18| 免费在线成人网| 一二三区精品视频| 国产精品毛片a∨一区二区三区| 日韩一本二本av| 在线观看精品一区| 成人精品在线视频观看| 久久国产尿小便嘘嘘尿| 性久久久久久久久久久久| 亚洲欧美日韩一区二区三区在线观看| 欧美电影精品一区二区| 欧美人体做爰大胆视频| 91久久奴性调教| 91免费视频观看| 91伊人久久大香线蕉| 成人综合在线观看| 国产99精品视频| 国产美女精品一区二区三区| 激情丁香综合五月| 奇米色一区二区三区四区| 午夜久久久久久久久| 亚洲综合在线五月| 亚洲综合在线视频| 亚洲午夜在线观看视频在线| 亚洲另类在线制服丝袜| 亚洲人成伊人成综合网小说| 亚洲欧美自拍偷拍色图| 亚洲欧洲精品一区二区三区| 日韩一区中文字幕| 成人免费视频在线观看| 亚洲视频图片小说| 亚洲综合色区另类av| 亚洲一区二区欧美日韩| 午夜视频一区二区| 日韩精品五月天| 久草精品在线观看| 国产一区免费电影| 国产激情偷乱视频一区二区三区| 国产精品一区二区在线观看不卡| 国产伦精一区二区三区| 成人美女在线观看| 色综合视频一区二区三区高清| 在线一区二区三区做爰视频网站| 欧美午夜电影网| 91精品国产麻豆| 五月天亚洲精品| 精品一区二区三区免费| 国产福利一区二区三区视频| eeuss国产一区二区三区| 91国内精品野花午夜精品| 欧美日韩激情一区二区| 日韩免费福利电影在线观看| 久久九九久久九九| 亚洲视频一区二区在线观看| 亚洲高清一区二区三区| 久久www免费人成看片高清| 高清av一区二区| 91久久精品网| 日韩无一区二区| 国产精品你懂的| 五月天久久比比资源色| 国产一区二区三区四区五区入口 | 99久久精品国产麻豆演员表| 欧洲精品一区二区三区在线观看| 制服丝袜激情欧洲亚洲| 国产日韩欧美a| 亚洲一区在线观看免费观看电影高清| 日韩国产高清在线| 成人av在线看| 一本大道综合伊人精品热热| 丁香六月综合激情| 欧美日韩一区二区在线观看| 欧美精品一区男女天堂| 亚洲视频 欧洲视频| 欧美色综合影院| 国产亚洲成av人在线观看导航| 亚洲一区二区精品视频| 国产精品自拍av| 欧美色男人天堂| 日本一区二区三区视频视频| 五月天亚洲婷婷| 91啪在线观看| xnxx国产精品| 五月天一区二区三区| av一二三不卡影片| 欧美精品一区视频| 五月婷婷色综合| 91麻豆文化传媒在线观看| 久久一留热品黄| 日韩 欧美一区二区三区| 99久久精品99国产精品| 久久综合九色综合欧美就去吻 | 日韩女优制服丝袜电影| 亚洲精品国产a| 国产suv精品一区二区883| 67194成人在线观看| 一区二区三区小说| 成人福利电影精品一区二区在线观看| 91精品国产色综合久久不卡电影| 一区二区三区在线视频播放| 国产ts人妖一区二区| 欧美mv日韩mv国产网站| 视频一区二区不卡| 欧美日韩在线精品一区二区三区激情 | 色综合天天综合色综合av| 亚洲精品一区二区三区在线观看| 午夜久久久影院| 欧美日韩国产高清一区| 亚洲综合免费观看高清完整版 | 天天影视涩香欲综合网| 91国产丝袜在线播放| 亚洲免费av在线| 91农村精品一区二区在线| 国产精品国产三级国产aⅴ原创| 国产精品一二一区| 久久久精品欧美丰满| 国产一区二区三区久久悠悠色av| 欧美电视剧免费全集观看| 蜜桃视频免费观看一区| 日韩视频不卡中文| 精品一区二区在线视频| 亚洲愉拍自拍另类高清精品| 亚洲卡通动漫在线| 99久久伊人网影院| 国产精品久久久久久一区二区三区| 国产成人在线影院| 国产亚洲一区字幕| 丁香天五香天堂综合| 中文字幕一区二区三区四区不卡 | 青青草国产精品97视觉盛宴| 欧美区在线观看| 日韩av在线免费观看不卡| 欧美一区二区在线不卡| 九九精品一区二区| 亚洲国产精品v| 91激情五月电影| 爽爽淫人综合网网站| 日韩免费观看2025年上映的电影| 美女国产一区二区三区| 26uuu成人网一区二区三区| 成人的网站免费观看| 亚洲视频在线观看一区| 欧美日韩亚洲综合在线| 另类小说色综合网站| 国产女同性恋一区二区| 91丨porny丨最新| 调教+趴+乳夹+国产+精品| 日韩女同互慰一区二区| 成+人+亚洲+综合天堂| 亚洲精品成人在线| 欧美成人乱码一区二区三区| 成人精品小蝌蚪|