|
@@ -194,88 +194,6 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
-/* Common (grey or coloured) pinnacle PCTV remote handling
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
-static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
|
|
|
|
- int parity_offset, int marker, int code_modulo)
|
|
|
|
-{
|
|
|
|
- unsigned char b[4];
|
|
|
|
- unsigned int start = 0,parity = 0,code = 0;
|
|
|
|
-
|
|
|
|
- /* poll IR chip */
|
|
|
|
- if (4 != i2c_master_recv(&ir->c,b,4)) {
|
|
|
|
- dprintk(2,"read error\n");
|
|
|
|
- return -EIO;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for (start = 0; start < ARRAY_SIZE(b); start++) {
|
|
|
|
- if (b[start] == marker) {
|
|
|
|
- code=b[(start+parity_offset+1)%4];
|
|
|
|
- parity=b[(start+parity_offset)%4];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* Empty Request */
|
|
|
|
- if (parity==0)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- /* Repeating... */
|
|
|
|
- if (ir->old == parity)
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- ir->old = parity;
|
|
|
|
-
|
|
|
|
- /* drop special codes when a key is held down a long time for the grey controller
|
|
|
|
- In this case, the second bit of the code is asserted */
|
|
|
|
- if (marker == 0xfe && (code & 0x40))
|
|
|
|
- return 0;
|
|
|
|
-
|
|
|
|
- code %= code_modulo;
|
|
|
|
-
|
|
|
|
- *ir_raw = code;
|
|
|
|
- *ir_key = code;
|
|
|
|
-
|
|
|
|
- dprintk(1,"Pinnacle PCTV key %02x\n", code);
|
|
|
|
-
|
|
|
|
- return 1;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/* The grey pinnacle PCTV remote
|
|
|
|
- *
|
|
|
|
- * There are one issue with this remote:
|
|
|
|
- * - I2c packet does not change when the same key is pressed quickly. The workaround
|
|
|
|
- * is to hold down each key for about half a second, so that another code is generated
|
|
|
|
- * in the i2c packet, and the function can distinguish key presses.
|
|
|
|
- *
|
|
|
|
- * Sylvain Pasche <sylvain.pasche@gmail.com>
|
|
|
|
- */
|
|
|
|
-int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
|
|
-{
|
|
|
|
-
|
|
|
|
- return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-EXPORT_SYMBOL_GPL(get_key_pinnacle_grey);
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-/* The new pinnacle PCTV remote (with the colored buttons)
|
|
|
|
- *
|
|
|
|
- * Ricardo Cerqueira <v4l@cerqueira.org>
|
|
|
|
- */
|
|
|
|
-int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
|
|
-{
|
|
|
|
- /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
|
|
|
|
- *
|
|
|
|
- * this is the only value that results in 42 unique
|
|
|
|
- * codes < 128
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
- return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-EXPORT_SYMBOL_GPL(get_key_pinnacle_color);
|
|
|
|
-
|
|
|
|
/* ----------------------------------------------------------------------- */
|
|
/* ----------------------------------------------------------------------- */
|
|
|
|
|
|
static void ir_key_poll(struct IR_i2c *ir)
|
|
static void ir_key_poll(struct IR_i2c *ir)
|