Hello,
I have an Yealink USB phone which is handled by the yealink.c driver but the
'#' key returns an unexpected value and keys labeled "RING" and "MUTE" do not
return any value to userspace.
In the first patch of this series I replace the combination KEY_LEFTSHIFT and
KEY_3 with KEY_NUMERIC_POUND and I also replace other keys for internal consistency
and with the cm109.c driver, which according to the comment in the code is derived
from this one, is this the right approach?
In the second patch I add two additional keys which could be handled by userspace:
"RING" whose purpose according to the user manual is to cycle all available ringtones
"MUTE" whose purpose is to mute the USB microphone
which KEY_* values should be used for them?
I have two more questions:
DRIVER_VERSION should be updated?
are both patches suitable for stable?
Daniele Forsi (2):
USB: input: yealink.c: use KEY_NUMERIC_* for numeric keys, star and
pound
USB: input: yealink.c: add mapping for "RING" and "MUTE" keys
drivers/input/misc/yealink.c | 43 +++++++++++++++++++------------------------
1 file changed, 19 insertions(+), 24 deletions(-)
--
2.1.3
According to the user manual of the "VOIP-3 SKY" USB phone, the RING
key is used to select different ring tones and the MUTE key is used
to mute the microphone.
Signed-off-by: Daniele Forsi <[email protected]>
---
drivers/input/misc/yealink.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c
index e9403da..0b86c49 100644
--- a/drivers/input/misc/yealink.c
+++ b/drivers/input/misc/yealink.c
@@ -189,7 +189,9 @@ static int setChar(struct yealink_dev *yld, int el, int chr)
* USB-P1K button layout:
*
* up
+ * ring
* IN OUT
+ * mute
* down
*
* pickup C hangup
@@ -207,7 +209,9 @@ static int map_p1k_to_key(int scancode)
switch(scancode) { /* phone key: */
case 0x23: return KEY_LEFT; /* IN */
case 0x33: return KEY_UP; /* up */
+ case 0x44: return KEY_SOUND; /* ring */
case 0x04: return KEY_RIGHT; /* OUT */
+ case 0x41: return KEY_MICMUTE; /* mute */
case 0x24: return KEY_DOWN; /* down */
case 0x03: return KEY_ENTER; /* pickup */
case 0x14: return KEY_BACKSPACE; /* C */
--
2.1.3
Fix the "pound" key that being mapped to Shift+3 was returning '£' instead
of '#' when using an Italian keyboard mapping and use the same values as
the cm109.c driver (which was based on this yealink.c driver) also for '0'
to '9' and for '*'.
Signed-off-by: Daniele Forsi <[email protected]>
---
drivers/input/misc/yealink.c | 39 +++++++++++++++------------------------
1 file changed, 15 insertions(+), 24 deletions(-)
diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c
index 79c964c..e9403da 100644
--- a/drivers/input/misc/yealink.c
+++ b/drivers/input/misc/yealink.c
@@ -212,27 +212,24 @@ static int map_p1k_to_key(int scancode)
case 0x03: return KEY_ENTER; /* pickup */
case 0x14: return KEY_BACKSPACE; /* C */
case 0x13: return KEY_ESC; /* hangup */
- case 0x00: return KEY_1; /* 1 */
- case 0x01: return KEY_2; /* 2 */
- case 0x02: return KEY_3; /* 3 */
- case 0x10: return KEY_4; /* 4 */
- case 0x11: return KEY_5; /* 5 */
- case 0x12: return KEY_6; /* 6 */
- case 0x20: return KEY_7; /* 7 */
- case 0x21: return KEY_8; /* 8 */
- case 0x22: return KEY_9; /* 9 */
- case 0x30: return KEY_KPASTERISK; /* * */
- case 0x31: return KEY_0; /* 0 */
- case 0x32: return KEY_LEFTSHIFT |
- KEY_3 << 8; /* # */
+ case 0x00: return KEY_NUMERIC_1; /* 1 */
+ case 0x01: return KEY_NUMERIC_2; /* 2 */
+ case 0x02: return KEY_NUMERIC_3; /* 3 */
+ case 0x10: return KEY_NUMERIC_4; /* 4 */
+ case 0x11: return KEY_NUMERIC_5; /* 5 */
+ case 0x12: return KEY_NUMERIC_6; /* 6 */
+ case 0x20: return KEY_NUMERIC_7; /* 7 */
+ case 0x21: return KEY_NUMERIC_8; /* 8 */
+ case 0x22: return KEY_NUMERIC_9; /* 9 */
+ case 0x30: return KEY_NUMERIC_STAR; /* * */
+ case 0x31: return KEY_NUMERIC_0; /* 0 */
+ case 0x32: return KEY_NUMERIC_POUND; /* # */
}
return -EINVAL;
}
/* Completes a request by converting the data into events for the
* input subsystem.
- *
- * The key parameter can be cascaded: key2 << 8 | key1
*/
static void report_key(struct yealink_dev *yld, int key)
{
@@ -240,17 +237,13 @@ static void report_key(struct yealink_dev *yld, int key)
if (yld->key_code >= 0) {
/* old key up */
- input_report_key(idev, yld->key_code & 0xff, 0);
- if (yld->key_code >> 8)
- input_report_key(idev, yld->key_code >> 8, 0);
+ input_report_key(idev, yld->key_code, 0);
}
yld->key_code = key;
if (key >= 0) {
/* new valid key */
- input_report_key(idev, key & 0xff, 1);
- if (key >> 8)
- input_report_key(idev, key >> 8, 1);
+ input_report_key(idev, key, 1);
}
input_sync(idev);
}
@@ -966,9 +959,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
for (i = 0; i < 256; i++) {
int k = map_p1k_to_key(i);
if (k >= 0) {
- set_bit(k & 0xff, input_dev->keybit);
- if (k >> 8)
- set_bit(k >> 8, input_dev->keybit);
+ set_bit(k, input_dev->keybit);
}
}
--
2.1.3