[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 | ||||
| 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 | ||||
| P:	Jeff Garzik | ||||
| M:	jgarzik@pobox.com | ||||
|  | ||||
| @ -230,6 +230,20 @@ config USB_EGALAX | ||||
| 	  To compile this driver as a module, choose M here: the | ||||
| 	  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 | ||||
| 	tristate "X-Box gamepad support" | ||||
| 	depends on USB && INPUT | ||||
|  | ||||
| @ -39,4 +39,5 @@ obj-$(CONFIG_USB_EGALAX)	+= touchkitusb.o | ||||
| obj-$(CONFIG_USB_POWERMATE)	+= powermate.o | ||||
| obj-$(CONFIG_USB_WACOM)		+= wacom.o | ||||
| obj-$(CONFIG_USB_ACECAD)	+= acecad.o | ||||
| obj-$(CONFIG_USB_YEALINK)	+= yealink.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 New Issue
	
	Block a user