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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ir-kbd-i2c.c

?? 電視卡驅(qū)動源碼!適用于FI1256/FI1216ME等PHILIPS高頻頭
?? C
字號:
/*
 * keyboard input driver for i2c IR remote controls
 *
 * Copyright (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
 * modified for PixelView (BT878P+W/FM) by
 *      Michal Kochanowicz <mkochano@pld.org.pl>
 *      Christoph Bartelmus <lirc@bartelmus.de>
 * modified for KNC ONE TV Station/Anubis Typhoon TView Tuner by
 *      Ulrich Mueller <ulrich.mueller42@web.de>
 *
 *  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
 *
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/i2c.h>
#include <linux/workqueue.h>

#include <asm/semaphore.h>

#include <media/ir-common.h>

struct IR;
struct IR {
	struct i2c_client      c;
	struct input_dev       input;
	struct ir_input_state  ir;

	struct work_struct     work;
	struct timer_list      timer;
	char                   phys[32];
	int                    (*get_key)(struct IR*, u32*, u32*);
};

/* ----------------------------------------------------------------------- */
/* insmod parameters                                                       */

static int debug = 0;    /* debug level (0,1,2) */
MODULE_PARM(debug,"i");

#define DEVNAME "ir-kbd-i2c"
#define dprintk(level, fmt, arg...)	if (debug >= level) \
	printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)

/* ----------------------------------------------------------------------- */

static inline int reverse(int data, int bits)
{
	int i,c;
	
	for (c=0,i=0; i<bits; i++) {
		c |= (((data & (1<<i)) ? 1:0)) << (bits-1-i);
	}
	return c;
}

static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
{
	unsigned char buf[3];
	int start, toggle, dev, code;

	/* poll IR chip */
	if (3 != i2c_master_recv(&ir->c,buf,3))
		return -EIO;

	/* split rc5 data block ... */
	start  = (buf[0] >> 6) &    3;
	toggle = (buf[0] >> 5) &    1;
	dev    =  buf[0]       & 0x1f;
	code   = (buf[1] >> 2) & 0x3f;

	if (3 != start)
		/* no key pressed */
		return 0;
	dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
		start, toggle, dev, code);

	/* return key */
	*ir_key = code;
	*ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
	return 1;
}

static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
{
        unsigned char b;
	
	/* poll IR chip */
	if (1 != i2c_master_recv(&ir->c,&b,1)) {
		dprintk(1,"read error\n");
		return -EIO;
	}
	*ir_key = b;
	*ir_raw = b;
	return 1;
}

static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
{
        unsigned char b;
	
	/* poll IR chip */
	if (1 != i2c_master_recv(&ir->c,&b,1)) {
		dprintk(1,"read error\n");
		return -EIO;
	}

	/* ignore 0xaa */
	if (b==0xaa)
		return 0;
	dprintk(2,"key %02x\n", b);
	
	*ir_key = b;
	*ir_raw = b;
	return 1;
}

static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
{
	unsigned char b;
	
	/* poll IR chip */
	if (1 != i2c_master_recv(&ir->c,&b,1)) {
		dprintk(1,"read error\n");
		return -EIO;
	}
	
	/* it seems that 0xFE indicates that a button is still hold
	   down, while 0xFF indicates that no button is hold
	   down. 0xFE sequences are sometimes interrupted by 0xFF */
	
	dprintk(2,"key %02x\n", b);
	
	if (b == 0xFF)
		return 0;
	
	if (b == 0xFE)
		/* keep old data */
		return 1;
	
	*ir_key = b;
	*ir_raw = b;
	return 1;
}

/* ----------------------------------------------------------------------- */

static void ir_key_poll(struct IR *ir)
{
	u32 ir_key, ir_raw;
	int rc;

	dprintk(2,"ir_poll_key\n");
	rc = ir->get_key(ir, &ir_key, &ir_raw);
	if (rc < 0) {
		dprintk(2,"error\n");
		return;
	}

	if (0 == rc) {
		ir_input_nokey(&ir->input,&ir->ir);
	} else {
		ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw);
	}
}

static void ir_timer(unsigned long data)
{
	struct IR *ir = (struct IR*)data;
	schedule_work(&ir->work);
}

static void ir_work(void *data)
{
	struct IR *ir = data;
	ir_key_poll(ir);
	mod_timer(&ir->timer, jiffies+HZ/10);
}

/* ----------------------------------------------------------------------- */

static int ir_attach(struct i2c_adapter *adap, int addr,
		      unsigned short flags, int kind);
static int ir_detach(struct i2c_client *client);
static int ir_probe(struct i2c_adapter *adap);

static struct i2c_driver driver = {
        .name           = "ir remote kbd driver",
        .id             = I2C_DRIVERID_EXP3, /* FIXME */
        .flags          = I2C_DF_NOTIFY,
        .attach_adapter = ir_probe,
        .detach_client  = ir_detach,
};

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

static int ir_attach(struct i2c_adapter *adap, int addr,
		     unsigned short flags, int kind)
{
	IR_KEYTAB_TYPE *ir_codes = NULL;
	char *name;
	int ir_type;
        struct IR *ir;
		
        if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL)))
                return -ENOMEM;
	memset(ir,0,sizeof(*ir));
	ir->c = client_template;

	i2c_set_clientdata(&ir->c, ir);
	ir->c.adapter = adap;
	ir->c.addr    = addr;

	switch(addr) {
	case 0x64:
		name        = "Pixelview";
		ir->get_key = get_key_pixelview;
		ir_type     = IR_TYPE_OTHER;
		ir_codes    = ir_codes_empty;
		break;
	case 0x4b:
		name        = "PV951";
		ir->get_key = get_key_pv951;
		ir_type     = IR_TYPE_OTHER;
		ir_codes    = ir_codes_empty;
		break;
	case 0x18:
	case 0x1a:
		name        = "Hauppauge";
		ir->get_key = get_key_haup;
		ir_type     = IR_TYPE_RC5;
		ir_codes    = ir_codes_rc5_tv;
		break;
	case 0x30:
		name        = "KNC One";
		ir->get_key = get_key_knc1;
		ir_type     = IR_TYPE_OTHER;
		ir_codes    = ir_codes_empty;
		break;
	default:
		/* shouldn't happen */
		printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
		kfree(ir);
		return -1;
	}

	/* register i2c device */
	i2c_attach_client(&ir->c);
	snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
	snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
		 ir->c.adapter->dev.bus_id,
		 ir->c.dev.bus_id);

	/* init + register input device */
	ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes);
	ir->input.id.bustype = BUS_I2C;
	ir->input.name       = ir->c.name;
	ir->input.phys       = ir->phys;
	input_register_device(&ir->input);
	printk(DEVNAME ": %s detected at %s\n",ir->input.name,ir->input.phys);
	       
	/* start polling via eventd */
	INIT_WORK(&ir->work, ir_work, ir);
	init_timer(&ir->timer);
	ir->timer.function = ir_timer;
	ir->timer.data     = (unsigned long)ir;
	schedule_work(&ir->work);
	
	return 0;
}

static int ir_detach(struct i2c_client *client)
{
        struct IR *ir = i2c_get_clientdata(client);

	/* kill outstanding polls */
	del_timer(&ir->timer);
	flush_scheduled_work();

	/* unregister devices */
	input_unregister_device(&ir->input);
	i2c_detach_client(&ir->c);

	/* free memory */
	kfree(ir);
	return 0;
}

static int ir_probe(struct i2c_adapter *adap)
{
	
	/* The external IR receiver is at i2c address 0x34 (0x35 for
	   reads).  Future Hauppauge cards will have an internal
	   receiver at 0x30 (0x31 for reads).  In theory, both can be
	   fitted, and Hauppauge suggest an external overrides an
	   internal. 
	   
	   That's why we probe 0x1a (~0x34) first. CB 
	*/
	
	static const int probe[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
	struct i2c_client c; char buf; int i,rc;

	if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) {
		memset(&c,0,sizeof(c));
		c.adapter = adap;
		for (i = 0; -1 != probe[i]; i++) {
			c.addr = probe[i];
			rc = i2c_master_recv(&c,&buf,1);
			dprintk(1,"probe 0x%02x @ %s: %s\n",
				probe[i], adap->name, 
				(1 == rc) ? "yes" : "no");
			if (1 == rc) {
				ir_attach(adap,probe[i],0,0);
				break;
			}
		}
	}
	return 0;
}

/* ----------------------------------------------------------------------- */

MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
MODULE_DESCRIPTION("input driver for i2c IR remote controls");
MODULE_LICENSE("GPL");

static int ir_init(void)
{
	i2c_add_driver(&driver);
	return 0;
}

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

module_init(ir_init);
module_exit(ir_fini);

/*
 * Overrides for Emacs so that we follow Linus's tabbing style.
 * ---------------------------------------------------------------------------
 * Local variables:
 * c-basic-offset: 8
 * End:
 */

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久成人免费日本黄色| 日韩影院在线观看| 欧美精品一区二区在线播放| 欧美优质美女网站| 91成人国产精品| 91国偷自产一区二区开放时间| 一本久久综合亚洲鲁鲁五月天| 99精品视频在线免费观看| 欧美伊人精品成人久久综合97 | 色视频成人在线观看免| 91久久精品网| 91精品欧美综合在线观看最新 | 色欧美片视频在线观看 | 亚洲国产毛片aaaaa无费看 | 一区二区三区四区乱视频| 亚洲一区二区五区| 秋霞成人午夜伦在线观看| 精品一区二区精品| 国产精品99久久久久久久vr| zzijzzij亚洲日本少妇熟睡| 色综合久久中文综合久久牛| 欧美日韩国产影片| 久久亚洲欧美国产精品乐播 | 在线一区二区三区| 欧美一区二区三区公司| 精品国产成人系列| 亚洲日本护士毛茸茸| 五月天一区二区| 国内久久精品视频| 91精彩视频在线| 精品国产亚洲一区二区三区在线观看 | av亚洲精华国产精华精| 在线观看日韩毛片| 日韩精品一区二| 亚洲欧美国产77777| 日韩1区2区日韩1区2区| 成人午夜大片免费观看| 欧美猛男超大videosgay| 久久精品日韩一区二区三区| 亚洲高清中文字幕| 成人激情综合网站| 欧美xxxxx牲另类人与| 亚洲欧美日韩在线| 国产一区欧美二区| 欧美日韩不卡一区二区| 中文字幕亚洲欧美在线不卡| 久草热8精品视频在线观看| 91美女在线观看| 欧美国产欧美综合| 极品少妇一区二区| 欧美日韩高清一区二区三区| 国产精品国产三级国产aⅴ中文 | 久久99精品久久久久久国产越南| 99re视频精品| 国产午夜精品一区二区三区嫩草 | 亚洲少妇中出一区| 国产一区二区三区免费| 欧美一级二级三级蜜桃| 一区二区三区不卡在线观看| 国产精品亚洲第一| 欧美一级一区二区| 水蜜桃久久夜色精品一区的特点 | 欧美国产精品一区二区| 精品一区二区三区香蕉蜜桃| 欧美精三区欧美精三区| 亚洲国产精品一区二区www| 91在线精品秘密一区二区| 久久久777精品电影网影网| 狠狠色丁香久久婷婷综合_中| 91精品久久久久久久99蜜桃| 亚洲成人免费av| 欧美伊人久久久久久午夜久久久久| 综合网在线视频| 91视频国产观看| 亚洲色图制服诱惑| 色婷婷亚洲一区二区三区| 亚洲三级理论片| 在线免费观看日本欧美| 亚洲高清三级视频| 在线播放视频一区| 奇米影视在线99精品| 日韩欧美视频一区| 久久激情五月激情| 久久蜜桃av一区二区天堂| 久草这里只有精品视频| 久久久一区二区| 成人动漫一区二区三区| 亚洲欧洲精品成人久久奇米网| 99久久久国产精品| 亚洲国产精品一区二区www | 91在线免费看| 亚洲高清视频中文字幕| 日韩视频免费观看高清完整版在线观看 | 一本高清dvd不卡在线观看| 亚洲午夜精品在线| 欧美日韩不卡在线| 国产一区二区三区免费观看| 国产精品色婷婷久久58| 91成人免费网站| 日韩高清在线电影| 国产午夜精品在线观看| 91网上在线视频| 美女一区二区视频| 国产精品免费久久| 欧美性xxxxxxxx| 国产一区二区三区免费看| 国产精品理伦片| 91精品国产综合久久精品图片 | 国产精品高潮呻吟| 欧美日韩精品综合在线| 国产九色sp调教91| 中文字幕一区二区三区不卡在线| 欧美在线一二三四区| 九九久久精品视频| 亚洲国产中文字幕在线视频综合| 精品久久一二三区| 色婷婷久久综合| 国产精品自在在线| 亚洲一区二区美女| 国产精品久久久久久久久快鸭| 欧美日韩精品电影| www.爱久久.com| 精品在线免费观看| 亚洲午夜精品久久久久久久久| 久久久久久久久久久黄色| 欧美日韩亚洲丝袜制服| 91视频国产观看| 国产成人免费av在线| 美国欧美日韩国产在线播放| 艳妇臀荡乳欲伦亚洲一区| 国产校园另类小说区| 欧美大片一区二区三区| 91久久人澡人人添人人爽欧美| 国产成人精品亚洲午夜麻豆| 裸体健美xxxx欧美裸体表演| 亚洲一区二区在线观看视频| 1024亚洲合集| 国产精品丝袜黑色高跟| 久久久久久久久久久久久久久99| 日韩一区二区三区在线视频| 欧美日韩一级视频| 欧美日韩亚洲综合一区| 欧美性猛片aaaaaaa做受| 成人av资源网站| 99国内精品久久| 不卡一区二区在线| 国产成人av福利| 国产一区二区成人久久免费影院| 加勒比av一区二区| 国产制服丝袜一区| 国模少妇一区二区三区| 国产一区二区三区香蕉| 精品一区二区免费在线观看| 蜜桃av一区二区| 美日韩黄色大片| 久久99精品久久久久久动态图| 麻豆国产一区二区| 黄色精品一二区| 粉嫩蜜臀av国产精品网站| 丰满放荡岳乱妇91ww| 成人黄色小视频在线观看| 91视视频在线观看入口直接观看www| av福利精品导航| 在线视频中文字幕一区二区| 欧美色男人天堂| 日韩欧美专区在线| 久久精品人人做人人爽人人| 国产精品免费视频网站| 亚洲精品美国一| 丝袜美腿高跟呻吟高潮一区| 激情综合网天天干| 高清不卡在线观看av| 91国产福利在线| 欧美一级视频精品观看| 久久久国产午夜精品| 国产精品电影一区二区| 久久久久免费观看| 99久久精品国产观看| 欧美又粗又大又爽| 日韩午夜精品视频| 国产色产综合色产在线视频| 国产精品国产精品国产专区不蜜| 亚洲一区二区欧美| 激情图区综合网| heyzo一本久久综合| 欧美日韩一区二区三区不卡| 精品粉嫩aⅴ一区二区三区四区| 国产精品久久久99| 日韩精品欧美精品| jizz一区二区| 欧美一级二级三级蜜桃| 国产精品欧美极品| 日本一不卡视频| 91农村精品一区二区在线| 欧美mv日韩mv国产| 亚洲一级不卡视频| 岛国精品在线观看| 欧美福利视频导航| 亚洲精品免费一二三区| 国产一区视频网站|