^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * drivers/usb/input/yealink.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef INPUT_YEALINK_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define INPUT_YEALINK_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* Using the control channel on interface 3 various aspects of the phone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * can be controlled like LCD, LED, dialtone and the ringtone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct yld_ctl_packet {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) u8 cmd; /* command code, see below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) u8 size; /* 1-11, size of used data bytes. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) __be16 offset; /* internal packet offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) u8 data[11];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) s8 sum; /* negative sum of 15 preceding bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) } __attribute__ ((packed));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define USB_PKT_LEN sizeof(struct yld_ctl_packet)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /* The following yld_ctl_packet's are available: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) /* Init registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * cmd 0x8e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * size 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * data 0,0,0,0....
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define CMD_INIT 0x8e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* Request key scan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * cmd 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * data[0] on return returns the key number, if it changes there's a new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * key pressed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define CMD_KEYPRESS 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* Request scancode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * cmd 0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * offset key number [0-1f]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * data[0] on return returns the scancode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define CMD_SCANCODE 0x81
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* Set LCD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) * cmd 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * size 1-11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * offset 0-23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) * data segment bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define CMD_LCD 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Set led
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * cmd 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * data[0] 0 OFF / 1 ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #define CMD_LED 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Set ringtone volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) * cmd 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * data[0] 0-0xff volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define CMD_RING_VOLUME 0x11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Set ringtone notes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * cmd 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * size 1-11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * offset 0->
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * data binary representation LE16(-freq), LE16(duration) ....
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define CMD_RING_NOTE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* Sound ringtone via the speaker on the back
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) * cmd 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) * data[0] 0 OFF / 0x24 ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define CMD_RINGTONE 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* Sound dial tone via the ear speaker
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * cmd 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * size 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * offset 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * data[0] 0 OFF / 1 ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define CMD_DIALTONE 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #endif /* INPUT_YEALINK_H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #if defined(_SEG) && defined(_PIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* This table maps the LCD segments onto individual bit positions in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * yld_status struct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /* LCD, each segment must be driven separately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * Layout:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * |[] [][] [][] [][] in |[][]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) * |[] M [][] D [][] : [][] out |[][]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * store
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) * NEW REP SU MO TU WE TH FR SA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) * [] [] [] [] [] [] [] [] [] [] [] []
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * [] [] [] [] [] [] [] [] [] [] [] []
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* Line 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * Format : 18.e8.M8.88...188
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) * Icon names : M D : IN OUT STORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define LCD_LINE1_OFFSET 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define LCD_LINE1_SIZE 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /* Note: first g then f => ! ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) /* _SEG( type a b c d e g f ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) _SEG('1', 0,0 , 22,2 , 22,2 , 0,0 , 0,0 , 0,0 , 0,0 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) _SEG('8', 20,1 , 20,2 , 20,4 , 20,8 , 21,4 , 21,2 , 21,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) _PIC('.', 22,1 , "M" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) _SEG('e', 18,1 , 18,2 , 18,4 , 18,1 , 19,2 , 18,1 , 19,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) _SEG('8', 16,1 , 16,2 , 16,4 , 16,8 , 17,4 , 17,2 , 17,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) _PIC('.', 15,8 , "D" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) _SEG('M', 14,1 , 14,2 , 14,4 , 14,1 , 15,4 , 15,2 , 15,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) _SEG('8', 12,1 , 12,2 , 12,4 , 12,8 , 13,4 , 13,2 , 13,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) _PIC('.', 11,8 , ":" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) _SEG('8', 10,1 , 10,2 , 10,4 , 10,8 , 11,4 , 11,2 , 11,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) _SEG('8', 8,1 , 8,2 , 8,4 , 8,8 , 9,4 , 9,2 , 9,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) _PIC('.', 7,1 , "IN" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) _PIC('.', 7,2 , "OUT" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) _PIC('.', 7,4 , "STORE" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) _SEG('1', 0,0 , 5,1 , 5,1 , 0,0 , 0,0 , 0,0 , 0,0 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) _SEG('8', 4,1 , 4,2 , 4,4 , 4,8 , 5,8 , 5,4 , 5,2 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) _SEG('8', 2,1 , 2,2 , 2,4 , 2,8 , 3,4 , 3,2 , 3,1 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* Line 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) * Format : .........
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) * Pict. name : NEW REP SU MO TU WE TH FR SA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define LCD_LINE2_OFFSET LCD_LINE1_OFFSET + LCD_LINE1_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define LCD_LINE2_SIZE 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) _PIC('.', 23,2 , "NEW" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) _PIC('.', 23,4 , "REP" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) _PIC('.', 1,8 , "SU" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) _PIC('.', 1,4 , "MO" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) _PIC('.', 1,2 , "TU" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) _PIC('.', 1,1 , "WE" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) _PIC('.', 0,1 , "TH" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) _PIC('.', 0,2 , "FR" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) _PIC('.', 0,4 , "SA" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* Line 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) * Format : 888888888888
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define LCD_LINE3_OFFSET LCD_LINE2_OFFSET + LCD_LINE2_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) #define LCD_LINE3_SIZE 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) _SEG('8', 22,16, 22,32, 22,64, 22,128, 23,128, 23,64, 23,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) _SEG('8', 20,16, 20,32, 20,64, 20,128, 21,128, 21,64, 21,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) _SEG('8', 18,16, 18,32, 18,64, 18,128, 19,128, 19,64, 19,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) _SEG('8', 16,16, 16,32, 16,64, 16,128, 17,128, 17,64, 17,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) _SEG('8', 14,16, 14,32, 14,64, 14,128, 15,128, 15,64, 15,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) _SEG('8', 12,16, 12,32, 12,64, 12,128, 13,128, 13,64, 13,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) _SEG('8', 10,16, 10,32, 10,64, 10,128, 11,128, 11,64, 11,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) _SEG('8', 8,16, 8,32, 8,64, 8,128, 9,128, 9,64, 9,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) _SEG('8', 6,16, 6,32, 6,64, 6,128, 7,128, 7,64, 7,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) _SEG('8', 4,16, 4,32, 4,64, 4,128, 5,128, 5,64, 5,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) _SEG('8', 2,16, 2,32, 2,64, 2,128, 3,128, 3,64, 3,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) _SEG('8', 0,16, 0,32, 0,64, 0,128, 1,128, 1,64, 1,32 ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) /* Line 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) * The LED, DIALTONE and RINGTONE are implemented as icons and use the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) * sysfs interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define LCD_LINE4_OFFSET LCD_LINE3_OFFSET + LCD_LINE3_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) _PIC('.', offsetof(struct yld_status, led) , 0x01, "LED" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) _PIC('.', offsetof(struct yld_status, dialtone) , 0x01, "DIALTONE" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) _PIC('.', offsetof(struct yld_status, ringtone) , 0x24, "RINGTONE" ),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) #undef _SEG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #undef _PIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #endif /* _SEG && _PIC */