V4L/DVB: ir-core: add two functions to report keyup/keydown events
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 21 Mar 2010 15:15:16 +0000 (12:15 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 18 May 2010 03:52:56 +0000 (00:52 -0300)
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/IR/ir-keytable.c
include/media/ir-core.h

index 73fe4bec83bc8124b894715a91644bd9be0c0b42..e59290febf812b83f66c3ca47a1f87cb6197ae30 100644 (file)
@@ -365,7 +365,7 @@ static int ir_setkeycode(struct input_dev *dev,
  *
  * This routine is used by the input routines when a key is pressed at the
  * IR. The scancode is received and needs to be converted into a keycode.
- * If the key is not found, it returns KEY_UNKNOWN. Otherwise, returns the
+ * If the key is not found, it returns KEY_RESERVED. Otherwise, returns the
  * corresponding keycode from the table.
  */
 u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode)
@@ -391,6 +391,61 @@ u32 ir_g_keycode_from_table(struct input_dev *dev, u32 scancode)
 }
 EXPORT_SYMBOL_GPL(ir_g_keycode_from_table);
 
+/**
+ * ir_keyup() - generates input event to cleanup a key press
+ * @input_dev: the struct input_dev descriptor of the device
+ *
+ * This routine is used by the input routines when a key is pressed at the
+ * IR. It reports a keyup input event via input_report_key().
+ */
+void ir_keyup(struct input_dev *dev)
+{
+       struct ir_input_dev *ir = input_get_drvdata(dev);
+
+       if (!ir->keypressed)
+               return;
+
+       input_report_key(dev, ir->keycode, 0);
+       input_sync(dev);
+       ir->keypressed = 0;
+}
+EXPORT_SYMBOL_GPL(ir_keyup);
+
+/**
+ * ir_keydown() - generates input event for a key press
+ * @input_dev: the struct input_dev descriptor of the device
+ * @scancode:  the scancode that we're seeking
+ *
+ * This routine is used by the input routines when a key is pressed at the
+ * IR. It gets the keycode for a scancode and reports an input event via
+ * input_report_key().
+ */
+void ir_keydown(struct input_dev *dev, int scancode)
+{
+       struct ir_input_dev *ir = input_get_drvdata(dev);
+
+       u32 keycode = ir_g_keycode_from_table(dev, scancode);
+
+       /* If already sent a keydown, do a keyup */
+       if (ir->keypressed)
+               ir_keyup(dev);
+
+       if (KEY_RESERVED == keycode)
+               return;
+
+       ir->keycode = keycode;
+       ir->keypressed = 1;
+
+       IR_dprintk(1, "%s: key down event, key 0x%04x, scancode 0x%04x\n",
+               dev->name, keycode, scancode);
+
+       input_report_key(dev, ir->keycode, 1);
+       input_sync(dev);
+
+}
+EXPORT_SYMBOL_GPL(ir_keydown);
+
+
 /**
  * ir_input_register() - sets the IR keycode table and add the handlers
  *                         for keymap table get/set
index 369969d90779790c96e8b06ad6330cb51e097a68..198fd61f0da9ef4d1c35687db2a1eee0d4c4f38f 100644 (file)
@@ -72,6 +72,10 @@ struct ir_input_dev {
        unsigned long                   devno;          /* device number */
        const struct ir_dev_props       *props;         /* Device properties */
        struct ir_raw_event_ctrl        *raw;           /* for raw pulse/space events */
+
+       /* key info - needed by IR keycode handlers */
+       u32                             keycode;        /* linux key code */
+       int                             keypressed;     /* current state */
 };
 
 #define to_ir_input_dev(_attr) container_of(_attr, struct ir_input_dev, attr)