KWorld Global TV Terminator remote control part1.patch

From MythTV

Jump to: navigation, search
--- linux/drivers/media/video/saa7134/saa7134-input.c.orig	2006-11-03 17:33:58.000000000 -0800
+++ linux/drivers/media/video/saa7134/saa7134-input.c	2007-02-11 02:19:51.000000000 -0800
@@ -46,6 +46,69 @@
 #define i2cdprintk(fmt, arg...)    if (ir_debug) \
 	printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
 
+ /* 
+   Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
+   is marked "KS003". The controller is I2C at address 0x30, but does not seem to respond
+   to probes until a read is performed from a valid device. (I don't know why.)
+   Henry Wong <henry@xxxxxxxxxxxxxx>
+ */
+ static IR_KEYTAB_TYPE msi_tvanywhere_plus_codes[IR_KEYTAB_SIZE] = {
+ 
+ /*
+     POWER   SOURCE  SCAN    MUTE    
+     TV/FM   1       2       3
+     CH+     4       5       6
+     CH-     7       8       9
+     >>(12)  0       +(16)   RECALL(19)
+     <<(4)   RECORD  STOP    PLAY
+ 
+         MINIMIZE(15)   ZOOM(25)
+ 	
+                   CH+
+            VOL-         VOL+
+                   CH-
+ 		  
+         SNAPSHOT(26)     MTS(13)
+ 	
+     <<(4)  FUNCTION  >>(12) RESET(29)
+ */
+ 	[    2 ] = KEY_KP0,
+ 	[    1 ] = KEY_KP1,
+ 	[   11 ] = KEY_KP2,
+ 	[   27 ] = KEY_KP3,
+ 	[    5 ] = KEY_KP4,
+ 	[    9 ] = KEY_KP5,
+ 	[   21 ] = KEY_KP6,
+ 	[    6 ] = KEY_KP7,
+ 	[   10 ] = KEY_KP8,
+ 	[   18 ] = KEY_KP9,
+ 
+ 	[    0 ] = KEY_RECORD,
+ 	[    3 ] = KEY_RADIO,          /* FM Radio */
+ 	[    4 ] = KEY_BACK,
+ 	[    7 ] = KEY_TUNER,          /* Source */
+ 	[    8 ] = KEY_STOP,
+ 	[   12 ] = KEY_FORWARD,
+ 	[   13 ] = KEY_LANGUAGE,       /* MTS */
+ 	[   14 ] = KEY_MENU,           /* Function */
+ 	[   15 ] = KEY_CLOSE,          /* Minimize */
+ 	[   16 ] = KEY_KPPLUS,         /* + */
+  	[   17 ] = KEY_PLAY,
+ 	[   19 ] = KEY_AGAIN,          /* Recall */
+ 	[   20 ] = KEY_VOLUMEDOWN,
+ 	[   22 ] = KEY_VOLUMEUP,
+ 	[   23 ] = KEY_CHANNELDOWN,
+ 	[   24 ] = KEY_MUTE,
+ 	[   25 ] = KEY_ZOOM,
+ 	[   26 ] = KEY_SHUFFLE,        /* Snapshot */
+ 	[   28 ] = KEY_SEARCH,	       /* Scan */
+ 	[   29 ] = KEY_RESTART,        /* Reset */
+  	[   30 ] = KEY_POWER,
+ 	[   31 ] = KEY_CHANNELUP
+ };
+ 
+ 
+
 /* -------------------- GPIO generic keycode builder -------------------- */
 
 static int build_key(struct saa7134_dev *dev)
@@ -88,6 +151,48 @@
 }
 
 /* --------------------- Chip specific I2C key builders ----------------- */
+static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
+{
+	unsigned char b;
+	int rc;
+	int gpio;
+
+	/* We need this to access GPIO. Used by the saa_readl macro. */
+	struct saa7134_dev *dev = ir->c.adapter->algo_data;
+	if (dev == NULL) {
+		dprintk ("ir->c.adapter->algo_data is NULL!\n");
+		return -EIO;
+	}
+	
+	/* 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);
+
+	/* GPIO&0x40 is pulsed low when a button is pressed. Don't do
+	   I2C receive if gpio&0x40 is not low. */
+	if (gpio & 0x40) 
+		return 0;	/* No button press */
+
+
+	/* GPIO says there is a button press. Get it. */
+	if (1 != (rc=i2c_master_recv(&ir->c,&b,1))) {
+		dprintk("read error %d\n", rc);
+		return -EIO;
+	}
+
+	/* No button press */
+	if (b == 0xFF)
+		return 0;
+	
+	/* Button pressed */
+	dprintk ("get_key_msi_tvanywhere_plus key=0x%x\n", b);
+
+	*ir_key = b;
+	*ir_raw = b;
+	return 1;
+}
 
 static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
 {
@@ -333,6 +438,11 @@
 		ir->get_key   = get_key_purpletv;
 		ir->ir_codes  = ir_codes_purpletv;
 		break;
+	case SAA7134_BOARD_MSI_TVANYWHERE_PLUS:
+		snprintf(ir->c.name, sizeof(ir->c.name), "MSI TV@nywhere Plus");
+		ir->get_key   = get_key_msi_tvanywhere_plus;
+		ir->ir_codes  = msi_tvanywhere_plus_codes;
+		break;
 	default:
 		dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board);
 		break;
Personal tools