⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 saa7134-input.c

📁 底层驱动开发
💻 C
📖 第 1 页 / 共 2 页
字号:
	[ 30 ] = KEY_KP9,	[ 31 ] = KEY_KP0,	[ 32 ] = KEY_LANGUAGE,	[ 33 ] = KEY_SLEEP,};/* Michael Tokarev <mjt@tls.msk.ru>   http://www.corpit.ru/mjt/beholdTV/remote_control.jpg   keytable is used by MANLI MTV00[12] and BeholdTV 40[13] at   least, and probably other cards too.   The "ascii-art picture" below (in comments, first row   is the keycode in hex, and subsequent row(s) shows   the button labels (several variants when appropriate)   helps to descide which keycodes to assign to the buttons. */static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = {	/*  0x1c            0x12  *	 * FUNCTION         POWER *	 *   FM              (|)  *	 *                        */	[ 0x1c ] = KEY_RADIO,	/*XXX*/	[ 0x12 ] = KEY_POWER,	/*  0x01    0x02    0x03  *	 *   1       2       3    *	 *                        *	 *  0x04    0x05    0x06  *	 *   4       5       6    *	 *                        *	 *  0x07    0x08    0x09  *	 *   7       8       9    *	 *                        */	[ 0x01 ] = KEY_KP1,	[ 0x02 ] = KEY_KP2,	[ 0x03 ] = KEY_KP3,	[ 0x04 ] = KEY_KP4,	[ 0x05 ] = KEY_KP5,	[ 0x06 ] = KEY_KP6,	[ 0x07 ] = KEY_KP7,	[ 0x08 ] = KEY_KP8,	[ 0x09 ] = KEY_KP9,	/*  0x0a    0x00    0x17  *	 * RECALL    0      +100  *	 *                  PLUS  *	 *                        */	[ 0x0a ] = KEY_AGAIN,	/*XXX KEY_REWIND? */	[ 0x00 ] = KEY_KP0,	[ 0x17 ] = KEY_DIGITS,	/*XXX*/	/*  0x14            0x10  *	 *  MENU            INFO  *	 *  OSD                   */	[ 0x14 ] = KEY_MENU,	[ 0x10 ] = KEY_INFO,	/*          0x0b          *	 *           Up           *	 *                        *	 *  0x18    0x16    0x0c  *	 *  Left     Ok     Right *	 *                        *	 *         0x015          *	 *         Down           *	 *                        */	[ 0x0b ] = KEY_UP,	/*XXX KEY_SCROLLUP? */	[ 0x18 ] = KEY_LEFT,	/*XXX KEY_BACK? */	[ 0x16 ] = KEY_OK,	/*XXX KEY_SELECT? KEY_ENTER? */	[ 0x0c ] = KEY_RIGHT,	/*XXX KEY_FORWARD? */	[ 0x15 ] = KEY_DOWN,	/*XXX KEY_SCROLLDOWN? */	/*  0x11            0x0d  *	 *  TV/AV           MODE  *	 *  SOURCE         STEREO *	 *                        */	[ 0x11 ] = KEY_TV,	/*XXX*/	[ 0x0d ] = KEY_MODE,	/*XXX there's no KEY_STEREO */	/*  0x0f    0x1b    0x1a  *	 *  AUDIO   Vol+    Chan+ *	 *        TIMESHIFT???    *	 *                        *	 *  0x0e    0x1f    0x1e  *	 *  SLEEP   Vol-    Chan- *	 *                        */	[ 0x0f ] = KEY_AUDIO,	[ 0x1b ] = KEY_VOLUMEUP,	[ 0x1a ] = KEY_CHANNELUP,	[ 0x0e ] = KEY_SLEEP,	/*XXX maybe KEY_PAUSE */	[ 0x1f ] = KEY_VOLUMEDOWN,	[ 0x1e ] = KEY_CHANNELDOWN,	/*         0x13     0x19  *	 *         MUTE   SNAPSHOT*	 *                        */	[ 0x13 ] = KEY_MUTE,	[ 0x19 ] = KEY_RECORD,	/*XXX*/	// 0x1d unused ?};/* ---------------------------------------------------------------------- */static int build_key(struct saa7134_dev *dev){	struct saa7134_ir *ir = dev->remote;	u32 gpio, data;	/* rising SAA7134_GPIO_GPRESCAN reads the status */	saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);	saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);	gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);        if (ir->polling) {                if (ir->last_gpio == gpio)                        return 0;                ir->last_gpio = gpio;        } 	data = ir_extract_bits(gpio, ir->mask_keycode);	dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",		gpio, ir->mask_keycode, data);	if ((ir->mask_keydown  &&  (0 != (gpio & ir->mask_keydown))) ||	    (ir->mask_keyup    &&  (0 == (gpio & ir->mask_keyup)))) {		ir_input_keydown(&ir->dev,&ir->ir,data,data);	} else {		ir_input_nokey(&ir->dev,&ir->ir);	}	return 0;}/* ---------------------------------------------------------------------- */void saa7134_input_irq(struct saa7134_dev *dev){        struct saa7134_ir *ir = dev->remote;        if (!ir->polling)		build_key(dev);}static void saa7134_input_timer(unsigned long data){	struct saa7134_dev *dev = (struct saa7134_dev*)data;	struct saa7134_ir *ir = dev->remote;	unsigned long timeout;	build_key(dev);	timeout = jiffies + (ir->polling * HZ / 1000);	mod_timer(&ir->timer, timeout);}int saa7134_input_init1(struct saa7134_dev *dev){	struct saa7134_ir *ir;	IR_KEYTAB_TYPE *ir_codes = NULL;	u32 mask_keycode = 0;	u32 mask_keydown = 0;	u32 mask_keyup   = 0;	int polling      = 0;	int ir_type      = IR_TYPE_OTHER;	if (!dev->has_remote)		return -ENODEV;	if (disable_ir)		return -ENODEV;	/* detect & configure */	switch (dev->board) {	case SAA7134_BOARD_FLYVIDEO2000:	case SAA7134_BOARD_FLYVIDEO3000:        case SAA7134_BOARD_FLYTVPLATINUM_FM:		ir_codes     = flyvideo_codes;		mask_keycode = 0xEC00000;		mask_keydown = 0x0040000;		break;	case SAA7134_BOARD_CINERGY400:	case SAA7134_BOARD_CINERGY600:	case SAA7134_BOARD_CINERGY600_MK3:		ir_codes     = cinergy_codes;		mask_keycode = 0x00003f;		mask_keyup   = 0x040000;		break;	case SAA7134_BOARD_ECS_TVP3XP:	case SAA7134_BOARD_ECS_TVP3XP_4CB5:		ir_codes     = eztv_codes;		mask_keycode = 0x00017c;		mask_keyup   = 0x000002;		polling      = 50; // ms		break;	case SAA7134_BOARD_KWORLD_XPERT:	case SAA7134_BOARD_AVACSSMARTTV:		ir_codes     = avacssmart_codes;		mask_keycode = 0x00001F;		mask_keyup   = 0x000020;		polling      = 50; // ms		break;	case SAA7134_BOARD_MD2819:	case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:	case SAA7134_BOARD_AVERMEDIA_305:	case SAA7134_BOARD_AVERMEDIA_307:	case SAA7134_BOARD_AVERMEDIA_STUDIO_305:	case SAA7134_BOARD_AVERMEDIA_STUDIO_307:	case SAA7134_BOARD_AVERMEDIA_GO_007_FM:		ir_codes     = md2819_codes;		mask_keycode = 0x0007C8;		mask_keydown = 0x000010;		polling      = 50; // ms		/* Set GPIO pin2 to high to enable the IR controller */		saa_setb(SAA7134_GPIO_GPMODE0, 0x4);		saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);		break;	case SAA7134_BOARD_MANLI_MTV001:	case SAA7134_BOARD_MANLI_MTV002:		ir_codes     = manli_codes;		mask_keycode = 0x001f00;		mask_keyup   = 0x004000;		mask_keydown = 0x002000;		polling      = 50; // ms		break;	case SAA7134_BOARD_VIDEOMATE_TV_PVR:	case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:		ir_codes     = videomate_tv_pvr_codes;		mask_keycode = 0x00003F;		mask_keyup   = 0x400000;		polling      = 50; // ms		break;	}	if (NULL == ir_codes) {		printk("%s: Oops: IR config error [card=%d]\n",		       dev->name, dev->board);		return -ENODEV;	}	ir = kmalloc(sizeof(*ir),GFP_KERNEL);	if (NULL == ir)		return -ENOMEM;	memset(ir,0,sizeof(*ir));	/* init hardware-specific stuff */	ir->mask_keycode = mask_keycode;	ir->mask_keydown = mask_keydown;	ir->mask_keyup   = mask_keyup;        ir->polling      = polling;	/* init input device */	snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",		 saa7134_boards[dev->board].name);	snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",		 pci_name(dev->pci));	ir_input_init(&ir->dev, &ir->ir, ir_type, ir_codes);	ir->dev.name = ir->name;	ir->dev.phys = ir->phys;	ir->dev.id.bustype = BUS_PCI;	ir->dev.id.version = 1;	if (dev->pci->subsystem_vendor) {		ir->dev.id.vendor  = dev->pci->subsystem_vendor;		ir->dev.id.product = dev->pci->subsystem_device;	} else {		ir->dev.id.vendor  = dev->pci->vendor;		ir->dev.id.product = dev->pci->device;	}	ir->dev.dev = &dev->pci->dev;	/* all done */	dev->remote = ir;	if (ir->polling) {		init_timer(&ir->timer);		ir->timer.function = saa7134_input_timer;		ir->timer.data     = (unsigned long)dev;		ir->timer.expires  = jiffies + HZ;		add_timer(&ir->timer);	}	input_register_device(&dev->remote->dev);	printk("%s: registered input device for IR\n",dev->name);	return 0;}void saa7134_input_fini(struct saa7134_dev *dev){	if (NULL == dev->remote)		return;	input_unregister_device(&dev->remote->dev);	if (dev->remote->polling)		del_timer_sync(&dev->remote->timer);	kfree(dev->remote);	dev->remote = NULL;}/* ---------------------------------------------------------------------- * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -