[PATCH] input-driver-yealink-P1K-usb-phone
This patch aggregates all modifications in the -mm tree and adds complete ringtone support. The following features are supported: - keyboard full support - LCD full support - LED full support - dialtone full support - ringtone full support - audio playback via generic usb audio diver - audio record via generic usb audio diver For driver documentation see: Documentation/input/yealink.txt For vendor documentation see: http://yealink.com Signed-off-by: Henk <Henk.Vergonet@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
d6450e1932
commit
aca951a22a
187
Documentation/input/yealink.txt
Normal file
187
Documentation/input/yealink.txt
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
yealink - Linux driver for usb-p1k phones
|
||||||
|
|
||||||
|
0. Status
|
||||||
|
~~~~~~~~~
|
||||||
|
|
||||||
|
The p1k is a relatively cheap usb 1.1 phone with:
|
||||||
|
- keyboard full support
|
||||||
|
- LCD full support
|
||||||
|
- LED full support
|
||||||
|
- dialtone full support
|
||||||
|
- ringtone full support
|
||||||
|
- audio playback via generic usb audio diver
|
||||||
|
- audio record via generic usb audio diver
|
||||||
|
|
||||||
|
|
||||||
|
1. Compilation (stand alone version)
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Currently only kernel 2.6.x.y versions are supported.
|
||||||
|
In order to build the yealink.ko module do:
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
|
If you encounter problems please check if in the MAKE_OPTS variable in
|
||||||
|
the Makefile is pointing to the location where your kernel sources
|
||||||
|
are located, default /usr/src/linux.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. keyboard features
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
The current mapping in the kernel is provided by the map_p1k_to_key
|
||||||
|
function:
|
||||||
|
|
||||||
|
Physical USB-P1K button layout input events
|
||||||
|
|
||||||
|
|
||||||
|
up up
|
||||||
|
IN OUT left, right
|
||||||
|
down down
|
||||||
|
|
||||||
|
pickup C hangup enter, backspace, escape
|
||||||
|
1 2 3 1, 2, 3
|
||||||
|
4 5 6 4, 5, 6,
|
||||||
|
7 8 9 7, 8, 9,
|
||||||
|
* 0 # *, 0, #,
|
||||||
|
|
||||||
|
The "up" and "down" keys, are symbolised by arrows on the button.
|
||||||
|
The "pickup" and "hangup" keys are symbolised by a green and red phone
|
||||||
|
on the button.
|
||||||
|
|
||||||
|
|
||||||
|
3. LCD features
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
The LCD is divided and organised as a 3 line display:
|
||||||
|
|
||||||
|
|[] [][] [][] [][] in |[][]
|
||||||
|
|[] M [][] D [][] : [][] out |[][]
|
||||||
|
store
|
||||||
|
|
||||||
|
NEW REP SU MO TU WE TH FR SA
|
||||||
|
|
||||||
|
[] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
[] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
|
||||||
|
|
||||||
|
Line 1 Format (see below) : 18.e8.M8.88...188
|
||||||
|
Icon names : M D : IN OUT STORE
|
||||||
|
Line 2 Format : .........
|
||||||
|
Icon name : NEW REP SU MO TU WE TH FR SA
|
||||||
|
Line 3 Format : 888888888888
|
||||||
|
|
||||||
|
|
||||||
|
Format description:
|
||||||
|
From a user space perspective the world is seperated in "digits" and "icons".
|
||||||
|
A digit can have a character set, an icon can only be ON or OFF.
|
||||||
|
|
||||||
|
Format specifier
|
||||||
|
'8' : Generic 7 segment digit with individual addressable segments
|
||||||
|
|
||||||
|
Reduced capabillity 7 segm digit, when segments are hard wired together.
|
||||||
|
'1' : 2 segments digit only able to produce a 1.
|
||||||
|
'e' : Most significant day of the month digit,
|
||||||
|
able to produce at least 1 2 3.
|
||||||
|
'M' : Most significant minute digit,
|
||||||
|
able to produce at least 0 1 2 3 4 5.
|
||||||
|
|
||||||
|
Icons or pictograms:
|
||||||
|
'.' : For example like AM, PM, SU, a 'dot' .. or other single segment
|
||||||
|
elements.
|
||||||
|
|
||||||
|
|
||||||
|
4. Driver usage
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
For userland the following interfaces are available using the sysfs interface:
|
||||||
|
/sys/.../
|
||||||
|
line1 Read/Write, lcd line1
|
||||||
|
line2 Read/Write, lcd line2
|
||||||
|
line3 Read/Write, lcd line3
|
||||||
|
|
||||||
|
get_icons Read, returns a set of available icons.
|
||||||
|
hide_icon Write, hide the element by writing the icon name.
|
||||||
|
show_icon Write, display the element by writing the icon name.
|
||||||
|
|
||||||
|
map_seg7 Read/Write, the 7 segments char set, common for all
|
||||||
|
yealink phones. (see map_to_7segment.h)
|
||||||
|
|
||||||
|
ringtone Write, upload binary representation of a ringtone,
|
||||||
|
see yealink.c. status EXPERIMENTAL due to potential
|
||||||
|
races between async. and sync usb calls.
|
||||||
|
|
||||||
|
|
||||||
|
4.1 lineX
|
||||||
|
~~~~~~~~~
|
||||||
|
Reading /sys/../lineX will return the format string with its current value:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
cat ./line3
|
||||||
|
888888888888
|
||||||
|
Linux Rocks!
|
||||||
|
|
||||||
|
Writing to /sys/../lineX will set the coresponding LCD line.
|
||||||
|
- Excess characters are ignored.
|
||||||
|
- If less characters are written than allowed, the remaining digits are
|
||||||
|
unchanged.
|
||||||
|
- The tab '\t'and '\n' char does not overwrite the original content.
|
||||||
|
- Writing a space to an icon will always hide its content.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
date +"%m.%e.%k:%M" | sed 's/^0/ /' > ./line1
|
||||||
|
|
||||||
|
Will update the LCD with the current date & time.
|
||||||
|
|
||||||
|
|
||||||
|
4.2 get_icons
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
Reading will return all available icon names and its current settings:
|
||||||
|
|
||||||
|
cat ./get_icons
|
||||||
|
on M
|
||||||
|
on D
|
||||||
|
on :
|
||||||
|
IN
|
||||||
|
OUT
|
||||||
|
STORE
|
||||||
|
NEW
|
||||||
|
REP
|
||||||
|
SU
|
||||||
|
MO
|
||||||
|
TU
|
||||||
|
WE
|
||||||
|
TH
|
||||||
|
FR
|
||||||
|
SA
|
||||||
|
LED
|
||||||
|
DIALTONE
|
||||||
|
RINGTONE
|
||||||
|
|
||||||
|
|
||||||
|
4.3 show/hide icons
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
Writing to these files will update the state of the icon.
|
||||||
|
Only one icon at a time can be updated.
|
||||||
|
|
||||||
|
If an icon is also on a ./lineX the corresponding value is
|
||||||
|
updated with the first letter of the icon.
|
||||||
|
|
||||||
|
Example - light up the store icon:
|
||||||
|
echo -n "STORE" > ./show_icon
|
||||||
|
|
||||||
|
cat ./line1
|
||||||
|
18.e8.M8.88...188
|
||||||
|
S
|
||||||
|
|
||||||
|
Example - sound the ringtone for 10 seconds:
|
||||||
|
echo -n RINGTONE > /sys/..../show_icon
|
||||||
|
sleep 10
|
||||||
|
echo -n RINGTONE > /sys/..../hide_icon
|
||||||
|
|
||||||
|
|
||||||
|
5. Credits & Acknowledgments
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
- Olivier Vandorpe, for starting the usbb2k-api project doing much of
|
||||||
|
the reverse engineering.
|
||||||
|
- Martin Diehl, for pointing out how to handle USB memory allocation.
|
||||||
|
- Dmitry Torokhov, for the numerous code reviews and suggestions.
|
||||||
|
|
|
@ -116,6 +116,12 @@ M: ajk@iehk.rwth-aachen.de
|
||||||
L: linux-hams@vger.kernel.org
|
L: linux-hams@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
YEALINK PHONE DRIVER
|
||||||
|
P: Henk Vergonet
|
||||||
|
M: Henk.Vergonet@gmail.com
|
||||||
|
L: usbb2k-api-dev@nongnu.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
8139CP 10/100 FAST ETHERNET DRIVER
|
8139CP 10/100 FAST ETHERNET DRIVER
|
||||||
P: Jeff Garzik
|
P: Jeff Garzik
|
||||||
M: jgarzik@pobox.com
|
M: jgarzik@pobox.com
|
||||||
|
|
|
@ -230,6 +230,20 @@ config USB_EGALAX
|
||||||
To compile this driver as a module, choose M here: the
|
To compile this driver as a module, choose M here: the
|
||||||
module will be called touchkitusb.
|
module will be called touchkitusb.
|
||||||
|
|
||||||
|
config USB_YEALINK
|
||||||
|
tristate "Yealink usb-p1k voip phone"
|
||||||
|
depends on USB && INPUT && EXPERIMENTAL
|
||||||
|
---help---
|
||||||
|
Say Y here if you want to enable keyboard and LCD functions of the
|
||||||
|
Yealink usb-p1k usb phones. The audio part is enabled by the generic
|
||||||
|
usb sound driver, so you might want to enable that as well.
|
||||||
|
|
||||||
|
For information about how to use these additional functions, see
|
||||||
|
<file:Documentation/input/yealink.txt>.
|
||||||
|
|
||||||
|
To compile this driver as a module, choose M here: the module will be
|
||||||
|
called yealink.
|
||||||
|
|
||||||
config USB_XPAD
|
config USB_XPAD
|
||||||
tristate "X-Box gamepad support"
|
tristate "X-Box gamepad support"
|
||||||
depends on USB && INPUT
|
depends on USB && INPUT
|
||||||
|
|
|
@ -39,4 +39,5 @@ obj-$(CONFIG_USB_EGALAX) += touchkitusb.o
|
||||||
obj-$(CONFIG_USB_POWERMATE) += powermate.o
|
obj-$(CONFIG_USB_POWERMATE) += powermate.o
|
||||||
obj-$(CONFIG_USB_WACOM) += wacom.o
|
obj-$(CONFIG_USB_WACOM) += wacom.o
|
||||||
obj-$(CONFIG_USB_ACECAD) += acecad.o
|
obj-$(CONFIG_USB_ACECAD) += acecad.o
|
||||||
|
obj-$(CONFIG_USB_YEALINK) += yealink.o
|
||||||
obj-$(CONFIG_USB_XPAD) += xpad.o
|
obj-$(CONFIG_USB_XPAD) += xpad.o
|
||||||
|
|
189
drivers/usb/input/map_to_7segment.h
Normal file
189
drivers/usb/input/map_to_7segment.h
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
/*
|
||||||
|
* drivers/usb/input/map_to_7segment.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAP_TO_7SEGMENT_H
|
||||||
|
#define MAP_TO_7SEGMENT_H
|
||||||
|
|
||||||
|
/* This file provides translation primitives and tables for the conversion
|
||||||
|
* of (ASCII) characters to a 7-segments notation.
|
||||||
|
*
|
||||||
|
* The 7 segment's wikipedia notation below is used as standard.
|
||||||
|
* See: http://en.wikipedia.org/wiki/Seven_segment_display
|
||||||
|
*
|
||||||
|
* Notation: +-a-+
|
||||||
|
* f b
|
||||||
|
* +-g-+
|
||||||
|
* e c
|
||||||
|
* +-d-+
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* Register a map variable, and fill it with a character set:
|
||||||
|
* static SEG7_DEFAULT_MAP(map_seg7);
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Then use for conversion:
|
||||||
|
* seg7 = map_to_seg7(&map_seg7, some_char);
|
||||||
|
* ...
|
||||||
|
*
|
||||||
|
* In device drivers it is recommended, if required, to make the char map
|
||||||
|
* accessible via the sysfs interface using the following scheme:
|
||||||
|
*
|
||||||
|
* static ssize_t show_map(struct device *dev, char *buf) {
|
||||||
|
* memcpy(buf, &map_seg7, sizeof(map_seg7));
|
||||||
|
* return sizeof(map_seg7);
|
||||||
|
* }
|
||||||
|
* static ssize_t store_map(struct device *dev, const char *buf, size_t cnt) {
|
||||||
|
* if(cnt != sizeof(map_seg7))
|
||||||
|
* return -EINVAL;
|
||||||
|
* memcpy(&map_seg7, buf, cnt);
|
||||||
|
* return cnt;
|
||||||
|
* }
|
||||||
|
* static DEVICE_ATTR(map_seg7, PERMS_RW, show_map, store_map);
|
||||||
|
*
|
||||||
|
* History:
|
||||||
|
* 2005-05-31 RFC linux-kernel@vger.kernel.org
|
||||||
|
*/
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define BIT_SEG7_A 0
|
||||||
|
#define BIT_SEG7_B 1
|
||||||
|
#define BIT_SEG7_C 2
|
||||||
|
#define BIT_SEG7_D 3
|
||||||
|
#define BIT_SEG7_E 4
|
||||||
|
#define BIT_SEG7_F 5
|
||||||
|
#define BIT_SEG7_G 6
|
||||||
|
#define BIT_SEG7_RESERVED 7
|
||||||
|
|
||||||
|
struct seg7_conversion_map {
|
||||||
|
unsigned char table[128];
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline int map_to_seg7(struct seg7_conversion_map *map, int c)
|
||||||
|
{
|
||||||
|
return c & 0x7f ? map->table[c] : -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SEG7_CONVERSION_MAP(_name, _map) \
|
||||||
|
struct seg7_conversion_map _name = { .table = { _map } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is recommended to use a facility that allows user space to redefine
|
||||||
|
* custom character sets for LCD devices. Please use a sysfs interface
|
||||||
|
* as described above.
|
||||||
|
*/
|
||||||
|
#define MAP_TO_SEG7_SYSFS_FILE "map_seg7"
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* ASCII conversion table
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#define _SEG7(l,a,b,c,d,e,f,g) \
|
||||||
|
( a<<BIT_SEG7_A | b<<BIT_SEG7_B | c<<BIT_SEG7_C | d<<BIT_SEG7_D | \
|
||||||
|
e<<BIT_SEG7_E | f<<BIT_SEG7_F | g<<BIT_SEG7_G )
|
||||||
|
|
||||||
|
#define _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||||
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||||
|
|
||||||
|
#define _MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||||
|
_SEG7('!',0,0,0,0,1,1,0), _SEG7('"',0,1,0,0,0,1,0), _SEG7('#',0,1,1,0,1,1,0),\
|
||||||
|
_SEG7('$',1,0,1,1,0,1,1), _SEG7('%',0,0,1,0,0,1,0), _SEG7('&',1,0,1,1,1,1,1),\
|
||||||
|
_SEG7('\'',0,0,0,0,0,1,0),_SEG7('(',1,0,0,1,1,1,0), _SEG7(')',1,1,1,1,0,0,0),\
|
||||||
|
_SEG7('*',0,1,1,0,1,1,1), _SEG7('+',0,1,1,0,0,0,1), _SEG7(',',0,0,0,0,1,0,0),\
|
||||||
|
_SEG7('-',0,0,0,0,0,0,1), _SEG7('.',0,0,0,0,1,0,0), _SEG7('/',0,1,0,0,1,0,1),
|
||||||
|
|
||||||
|
#define _MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||||
|
_SEG7('0',1,1,1,1,1,1,0), _SEG7('1',0,1,1,0,0,0,0), _SEG7('2',1,1,0,1,1,0,1),\
|
||||||
|
_SEG7('3',1,1,1,1,0,0,1), _SEG7('4',0,1,1,0,0,1,1), _SEG7('5',1,0,1,1,0,1,1),\
|
||||||
|
_SEG7('6',1,0,1,1,1,1,1), _SEG7('7',1,1,1,0,0,0,0), _SEG7('8',1,1,1,1,1,1,1),\
|
||||||
|
_SEG7('9',1,1,1,1,0,1,1),
|
||||||
|
|
||||||
|
#define _MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||||
|
_SEG7(':',0,0,0,1,0,0,1), _SEG7(';',0,0,0,1,0,0,1), _SEG7('<',1,0,0,0,0,1,1),\
|
||||||
|
_SEG7('=',0,0,0,1,0,0,1), _SEG7('>',1,1,0,0,0,0,1), _SEG7('?',1,1,1,0,0,1,0),\
|
||||||
|
_SEG7('@',1,1,0,1,1,1,1),
|
||||||
|
|
||||||
|
#define _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
|
||||||
|
_SEG7('A',1,1,1,0,1,1,1), _SEG7('B',1,1,1,1,1,1,1), _SEG7('C',1,0,0,1,1,1,0),\
|
||||||
|
_SEG7('D',1,1,1,1,1,1,0), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
|
||||||
|
_SEG7('G',1,1,1,1,0,1,1), _SEG7('H',0,1,1,0,1,1,1), _SEG7('I',0,1,1,0,0,0,0),\
|
||||||
|
_SEG7('J',0,1,1,1,0,0,0), _SEG7('K',0,1,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
|
||||||
|
_SEG7('M',1,1,1,0,1,1,0), _SEG7('N',1,1,1,0,1,1,0), _SEG7('O',1,1,1,1,1,1,0),\
|
||||||
|
_SEG7('P',1,1,0,0,1,1,1), _SEG7('Q',1,1,1,1,1,1,0), _SEG7('R',1,1,1,0,1,1,1),\
|
||||||
|
_SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('U',0,1,1,1,1,1,0),\
|
||||||
|
_SEG7('V',0,1,1,1,1,1,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
|
||||||
|
_SEG7('Y',0,1,1,0,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
|
||||||
|
|
||||||
|
#define _MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||||
|
_SEG7('[',1,0,0,1,1,1,0), _SEG7('\\',0,0,1,0,0,1,1),_SEG7(']',1,1,1,1,0,0,0),\
|
||||||
|
_SEG7('^',1,1,0,0,0,1,0), _SEG7('_',0,0,0,1,0,0,0), _SEG7('`',0,1,0,0,0,0,0),
|
||||||
|
|
||||||
|
#define _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||||
|
_SEG7('A',1,1,1,0,1,1,1), _SEG7('b',0,0,1,1,1,1,1), _SEG7('c',0,0,0,1,1,0,1),\
|
||||||
|
_SEG7('d',0,1,1,1,1,0,1), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\
|
||||||
|
_SEG7('G',1,1,1,1,0,1,1), _SEG7('h',0,0,1,0,1,1,1), _SEG7('i',0,0,1,0,0,0,0),\
|
||||||
|
_SEG7('j',0,0,1,1,0,0,0), _SEG7('k',0,0,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\
|
||||||
|
_SEG7('M',1,1,1,0,1,1,0), _SEG7('n',0,0,1,0,1,0,1), _SEG7('o',0,0,1,1,1,0,1),\
|
||||||
|
_SEG7('P',1,1,0,0,1,1,1), _SEG7('q',1,1,1,0,0,1,1), _SEG7('r',0,0,0,0,1,0,1),\
|
||||||
|
_SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('u',0,0,1,1,1,0,0),\
|
||||||
|
_SEG7('v',0,0,1,1,1,0,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\
|
||||||
|
_SEG7('y',0,1,1,1,0,1,1), _SEG7('Z',1,1,0,1,1,0,1),
|
||||||
|
|
||||||
|
#define _MAP_123_126_ASCII_SEG7_SYMBOL \
|
||||||
|
_SEG7('{',1,0,0,1,1,1,0), _SEG7('|',0,0,0,0,1,1,0), _SEG7('}',1,1,1,1,0,0,0),\
|
||||||
|
_SEG7('~',1,0,0,0,0,0,0),
|
||||||
|
|
||||||
|
/* Maps */
|
||||||
|
|
||||||
|
/* This set tries to map as close as possible to the visible characteristics
|
||||||
|
* of the ASCII symbol, lowercase and uppercase letters may differ in
|
||||||
|
* presentation on the display.
|
||||||
|
*/
|
||||||
|
#define MAP_ASCII7SEG_ALPHANUM \
|
||||||
|
_MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||||
|
_MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||||
|
_MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_65_90_ASCII_SEG7_ALPHA_UPPR \
|
||||||
|
_MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||||
|
_MAP_123_126_ASCII_SEG7_SYMBOL
|
||||||
|
|
||||||
|
/* This set tries to map as close as possible to the symbolic characteristics
|
||||||
|
* of the ASCII character for maximum discrimination.
|
||||||
|
* For now this means all alpha chars are in lower case representations.
|
||||||
|
* (This for example facilitates the use of hex numbers with uppercase input.)
|
||||||
|
*/
|
||||||
|
#define MAP_ASCII7SEG_ALPHANUM_LC \
|
||||||
|
_MAP_0_32_ASCII_SEG7_NON_PRINTABLE \
|
||||||
|
_MAP_33_47_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_48_57_ASCII_SEG7_NUMERIC \
|
||||||
|
_MAP_58_64_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||||
|
_MAP_91_96_ASCII_SEG7_SYMBOL \
|
||||||
|
_MAP_97_122_ASCII_SEG7_ALPHA_LOWER \
|
||||||
|
_MAP_123_126_ASCII_SEG7_SYMBOL
|
||||||
|
|
||||||
|
#define SEG7_DEFAULT_MAP(_name) \
|
||||||
|
SEG7_CONVERSION_MAP(_name,MAP_ASCII7SEG_ALPHANUM)
|
||||||
|
|
||||||
|
#endif /* MAP_TO_7SEGMENT_H */
|
||||||
|
|
1010
drivers/usb/input/yealink.c
Normal file
1010
drivers/usb/input/yealink.c
Normal file
File diff suppressed because it is too large
Load diff
220
drivers/usb/input/yealink.h
Normal file
220
drivers/usb/input/yealink.h
Normal file
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
* drivers/usb/input/yealink.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
#ifndef INPUT_YEALINK_H
|
||||||
|
#define INPUT_YEALINK_H
|
||||||
|
|
||||||
|
/* Using the control channel on interface 3 various aspects of the phone
|
||||||
|
* can be controlled like LCD, LED, dialtone and the ringtone.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct yld_ctl_packet {
|
||||||
|
u8 cmd; /* command code, see below */
|
||||||
|
u8 size; /* 1-11, size of used data bytes. */
|
||||||
|
u16 offset; /* internal packet offset */
|
||||||
|
u8 data[11];
|
||||||
|
s8 sum; /* negative sum of 15 preceding bytes */
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
#define USB_PKT_LEN sizeof(struct yld_ctl_packet)
|
||||||
|
|
||||||
|
/* The following yld_ctl_packet's are available: */
|
||||||
|
|
||||||
|
/* Init registers
|
||||||
|
*
|
||||||
|
* cmd 0x8e
|
||||||
|
* size 10
|
||||||
|
* offset 0
|
||||||
|
* data 0,0,0,0....
|
||||||
|
*/
|
||||||
|
#define CMD_INIT 0x8e
|
||||||
|
|
||||||
|
/* Request key scan
|
||||||
|
*
|
||||||
|
* cmd 0x80
|
||||||
|
* size 1
|
||||||
|
* offset 0
|
||||||
|
* data[0] on return returns the key number, if it changes there's a new
|
||||||
|
* key pressed.
|
||||||
|
*/
|
||||||
|
#define CMD_KEYPRESS 0x80
|
||||||
|
|
||||||
|
/* Request scancode
|
||||||
|
*
|
||||||
|
* cmd 0x81
|
||||||
|
* size 1
|
||||||
|
* offset key number [0-1f]
|
||||||
|
* data[0] on return returns the scancode
|
||||||
|
*/
|
||||||
|
#define CMD_SCANCODE 0x81
|
||||||
|
|
||||||
|
/* Set LCD
|
||||||
|
*
|
||||||
|
* cmd 0x04
|
||||||
|
* size 1-11
|
||||||
|
* offset 0-23
|
||||||
|
* data segment bits
|
||||||
|
*/
|
||||||
|
#define CMD_LCD 0x04
|
||||||
|
|
||||||
|
/* Set led
|
||||||
|
*
|
||||||
|
* cmd 0x05
|
||||||
|
* size 1
|
||||||
|
* offset 0
|
||||||
|
* data[0] 0 OFF / 1 ON
|
||||||
|
*/
|
||||||
|
#define CMD_LED 0x05
|
||||||
|
|
||||||
|
/* Set ringtone volume
|
||||||
|
*
|
||||||
|
* cmd 0x11
|
||||||
|
* size 1
|
||||||
|
* offset 0
|
||||||
|
* data[0] 0-0xff volume
|
||||||
|
*/
|
||||||
|
#define CMD_RING_VOLUME 0x11
|
||||||
|
|
||||||
|
/* Set ringtone notes
|
||||||
|
*
|
||||||
|
* cmd 0x02
|
||||||
|
* size 1-11
|
||||||
|
* offset 0->
|
||||||
|
* data binary representation LE16(-freq), LE16(duration) ....
|
||||||
|
*/
|
||||||
|
#define CMD_RING_NOTE 0x02
|
||||||
|
|
||||||
|
/* Sound ringtone via the speaker on the back
|
||||||
|
*
|
||||||
|
* cmd 0x03
|
||||||
|
* size 1
|
||||||
|
* offset 0
|
||||||
|
* data[0] 0 OFF / 0x24 ON
|
||||||
|
*/
|
||||||
|
#define CMD_RINGTONE 0x03
|
||||||
|
|
||||||
|
/* Sound dial tone via the ear speaker
|
||||||
|
*
|
||||||
|
* cmd 0x09
|
||||||
|
* size 1
|
||||||
|
* offset 0
|
||||||
|
* data[0] 0 OFF / 1 ON
|
||||||
|
*/
|
||||||
|
#define CMD_DIALTONE 0x09
|
||||||
|
|
||||||
|
#endif /* INPUT_YEALINK_H */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(_SEG) && defined(_PIC)
|
||||||
|
/* This table maps the LCD segments onto individual bit positions in the
|
||||||
|
* yld_status struct.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LCD, each segment must be driven seperately.
|
||||||
|
*
|
||||||
|
* Layout:
|
||||||
|
*
|
||||||
|
* |[] [][] [][] [][] in |[][]
|
||||||
|
* |[] M [][] D [][] : [][] out |[][]
|
||||||
|
* store
|
||||||
|
*
|
||||||
|
* NEW REP SU MO TU WE TH FR SA
|
||||||
|
*
|
||||||
|
* [] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
* [] [] [] [] [] [] [] [] [] [] [] []
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Line 1
|
||||||
|
* Format : 18.e8.M8.88...188
|
||||||
|
* Icon names : M D : IN OUT STORE
|
||||||
|
*/
|
||||||
|
#define LCD_LINE1_OFFSET 0
|
||||||
|
#define LCD_LINE1_SIZE 17
|
||||||
|
|
||||||
|
/* Note: first g then f => ! ! */
|
||||||
|
/* _SEG( type a b c d e g f ) */
|
||||||
|
_SEG('1', 0,0 , 22,2 , 22,2 , 0,0 , 0,0 , 0,0 , 0,0 ),
|
||||||
|
_SEG('8', 20,1 , 20,2 , 20,4 , 20,8 , 21,4 , 21,2 , 21,1 ),
|
||||||
|
_PIC('.', 22,1 , "M" ),
|
||||||
|
_SEG('e', 18,1 , 18,2 , 18,4 , 18,1 , 19,2 , 18,1 , 19,1 ),
|
||||||
|
_SEG('8', 16,1 , 16,2 , 16,4 , 16,8 , 17,4 , 17,2 , 17,1 ),
|
||||||
|
_PIC('.', 15,8 , "D" ),
|
||||||
|
_SEG('M', 14,1 , 14,2 , 14,4 , 14,1 , 15,4 , 15,2 , 15,1 ),
|
||||||
|
_SEG('8', 12,1 , 12,2 , 12,4 , 12,8 , 13,4 , 13,2 , 13,1 ),
|
||||||
|
_PIC('.', 11,8 , ":" ),
|
||||||
|
_SEG('8', 10,1 , 10,2 , 10,4 , 10,8 , 11,4 , 11,2 , 11,1 ),
|
||||||
|
_SEG('8', 8,1 , 8,2 , 8,4 , 8,8 , 9,4 , 9,2 , 9,1 ),
|
||||||
|
_PIC('.', 7,1 , "IN" ),
|
||||||
|
_PIC('.', 7,2 , "OUT" ),
|
||||||
|
_PIC('.', 7,4 , "STORE" ),
|
||||||
|
_SEG('1', 0,0 , 5,1 , 5,1 , 0,0 , 0,0 , 0,0 , 0,0 ),
|
||||||
|
_SEG('8', 4,1 , 4,2 , 4,4 , 4,8 , 5,8 , 5,4 , 5,2 ),
|
||||||
|
_SEG('8', 2,1 , 2,2 , 2,4 , 2,8 , 3,4 , 3,2 , 3,1 ),
|
||||||
|
|
||||||
|
/* Line 2
|
||||||
|
* Format : .........
|
||||||
|
* Pict. name : NEW REP SU MO TU WE TH FR SA
|
||||||
|
*/
|
||||||
|
#define LCD_LINE2_OFFSET LCD_LINE1_OFFSET + LCD_LINE1_SIZE
|
||||||
|
#define LCD_LINE2_SIZE 9
|
||||||
|
|
||||||
|
_PIC('.', 23,2 , "NEW" ),
|
||||||
|
_PIC('.', 23,4 , "REP" ),
|
||||||
|
_PIC('.', 1,8 , "SU" ),
|
||||||
|
_PIC('.', 1,4 , "MO" ),
|
||||||
|
_PIC('.', 1,2 , "TU" ),
|
||||||
|
_PIC('.', 1,1 , "WE" ),
|
||||||
|
_PIC('.', 0,1 , "TH" ),
|
||||||
|
_PIC('.', 0,2 , "FR" ),
|
||||||
|
_PIC('.', 0,4 , "SA" ),
|
||||||
|
|
||||||
|
/* Line 3
|
||||||
|
* Format : 888888888888
|
||||||
|
*/
|
||||||
|
#define LCD_LINE3_OFFSET LCD_LINE2_OFFSET + LCD_LINE2_SIZE
|
||||||
|
#define LCD_LINE3_SIZE 12
|
||||||
|
|
||||||
|
_SEG('8', 22,16, 22,32, 22,64, 22,128, 23,128, 23,64, 23,32 ),
|
||||||
|
_SEG('8', 20,16, 20,32, 20,64, 20,128, 21,128, 21,64, 21,32 ),
|
||||||
|
_SEG('8', 18,16, 18,32, 18,64, 18,128, 19,128, 19,64, 19,32 ),
|
||||||
|
_SEG('8', 16,16, 16,32, 16,64, 16,128, 17,128, 17,64, 17,32 ),
|
||||||
|
_SEG('8', 14,16, 14,32, 14,64, 14,128, 15,128, 15,64, 15,32 ),
|
||||||
|
_SEG('8', 12,16, 12,32, 12,64, 12,128, 13,128, 13,64, 13,32 ),
|
||||||
|
_SEG('8', 10,16, 10,32, 10,64, 10,128, 11,128, 11,64, 11,32 ),
|
||||||
|
_SEG('8', 8,16, 8,32, 8,64, 8,128, 9,128, 9,64, 9,32 ),
|
||||||
|
_SEG('8', 6,16, 6,32, 6,64, 6,128, 7,128, 7,64, 7,32 ),
|
||||||
|
_SEG('8', 4,16, 4,32, 4,64, 4,128, 5,128, 5,64, 5,32 ),
|
||||||
|
_SEG('8', 2,16, 2,32, 2,64, 2,128, 3,128, 3,64, 3,32 ),
|
||||||
|
_SEG('8', 0,16, 0,32, 0,64, 0,128, 1,128, 1,64, 1,32 ),
|
||||||
|
|
||||||
|
/* Line 4
|
||||||
|
*
|
||||||
|
* The LED, DIALTONE and RINGTONE are implemented as icons and use the same
|
||||||
|
* sysfs interface.
|
||||||
|
*/
|
||||||
|
#define LCD_LINE4_OFFSET LCD_LINE3_OFFSET + LCD_LINE3_SIZE
|
||||||
|
|
||||||
|
_PIC('.', offsetof(struct yld_status, led) , 0x01, "LED" ),
|
||||||
|
_PIC('.', offsetof(struct yld_status, dialtone) , 0x01, "DIALTONE" ),
|
||||||
|
_PIC('.', offsetof(struct yld_status, ringtone) , 0x24, "RINGTONE" ),
|
||||||
|
|
||||||
|
#undef _SEG
|
||||||
|
#undef _PIC
|
||||||
|
#endif /* _SEG && _PIC */
|
Loading…
Reference in a new issue