xref: /openbsd/sys/dev/sun/sunkbdmap.c (revision 09467b48)
1 /*	$OpenBSD: sunkbdmap.c,v 1.6 2014/01/26 17:48:08 miod Exp $	*/
2 
3 /*
4  * Copyright (c) 2002, 2003 Miodrag Vallat.
5  * Copyright (c) 2002 Jason L. Wright (jason@thought.net)
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
21  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  * Effort sponsored in part by the Defense Advanced Research Projects
30  * Agency (DARPA) and Air Force Research Laboratory, Air Force
31  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
32  *
33  */
34 
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/device.h>
38 #include <sys/kernel.h>
39 #include <sys/timeout.h>
40 
41 #include <dev/wscons/wsconsio.h>
42 #include <dev/wscons/wskbdvar.h>
43 #include <dev/wscons/wsksymdef.h>
44 #include <dev/wscons/wsksymvar.h>
45 
46 #include <dev/sun/sunkbdreg.h>
47 #include <dev/sun/sunkbdvar.h>
48 
49 #ifdef WSDISPLAY_COMPAT_RAWKBD
50 #include <dev/wscons/wskbdraw.h>
51 
52 /*
53  * Translate Sun keycodes to US keyboard XT scancodes, for proper
54  * X11-over-wsmux operation.
55  */
56 const u_int8_t sunkbd_rawmap[0x80] = {
57 	RAWKEY_Null,
58 	RAWKEY_L1,
59 	RAWKEY_AudioLower,
60 	RAWKEY_L2,
61 	RAWKEY_AudioRaise,
62 	RAWKEY_f1,
63 	RAWKEY_f2,
64 	RAWKEY_f10,
65 	RAWKEY_f3,
66 	RAWKEY_f11,
67 	RAWKEY_f4,
68 	RAWKEY_f12,
69 	RAWKEY_f5,
70 	RAWKEY_Alt_R,
71 	RAWKEY_f6,
72 	RAWKEY_Null,
73 	RAWKEY_f7,
74 	RAWKEY_f8,
75 	RAWKEY_f9,
76 	RAWKEY_Alt_L,
77 	RAWKEY_Up,
78 	RAWKEY_Pause,
79 	RAWKEY_Print_Screen,
80 	RAWKEY_Hold_Screen,
81 	RAWKEY_Left,
82 	RAWKEY_L3,
83 	RAWKEY_L4,
84 	RAWKEY_Down,
85 	RAWKEY_Right,
86 	RAWKEY_Escape,
87 	RAWKEY_1,
88 	RAWKEY_2,
89 	RAWKEY_3,
90 	RAWKEY_4,
91 	RAWKEY_5,
92 	RAWKEY_6,
93 	RAWKEY_7,
94 	RAWKEY_8,
95 	RAWKEY_9,
96 	RAWKEY_0,
97 	RAWKEY_minus,
98 	RAWKEY_equal,
99 	RAWKEY_grave,
100 	RAWKEY_BackSpace,
101 	RAWKEY_Insert,
102 	RAWKEY_KP_Equal,	/* type 4 only */
103 	RAWKEY_KP_Divide,
104 	RAWKEY_KP_Multiply,
105 	RAWKEY_Null,
106 	RAWKEY_L5,
107 	RAWKEY_KP_Delete,
108 	RAWKEY_L6,
109 	RAWKEY_Home,
110 	RAWKEY_Tab,
111 	RAWKEY_q,
112 	RAWKEY_w,
113 	RAWKEY_e,
114 	RAWKEY_r,
115 	RAWKEY_t,
116 	RAWKEY_y,
117 	RAWKEY_u,
118 	RAWKEY_i,
119 	RAWKEY_o,
120 	RAWKEY_p,
121 	RAWKEY_bracketleft,
122 	RAWKEY_bracketright,
123 	RAWKEY_Delete,
124 	RAWKEY_Compose,
125 	RAWKEY_KP_Home,
126 	RAWKEY_KP_Up,
127 	RAWKEY_KP_Prior,
128 	RAWKEY_KP_Subtract,
129 	RAWKEY_L7,
130 	RAWKEY_L8,
131 	RAWKEY_End,
132 	RAWKEY_Null,
133 	RAWKEY_Control_L,
134 	RAWKEY_a,
135 	RAWKEY_s,
136 	RAWKEY_d,
137 	RAWKEY_f,
138 	RAWKEY_g,
139 	RAWKEY_h,
140 	RAWKEY_j,
141 	RAWKEY_k,
142 	RAWKEY_l,
143 	RAWKEY_semicolon,
144 	RAWKEY_apostrophe,
145 	RAWKEY_backslash,
146 	RAWKEY_Return,
147 	RAWKEY_KP_Enter,
148 	RAWKEY_KP_Left,
149 	RAWKEY_KP_Begin,
150 	RAWKEY_KP_Right,
151 	RAWKEY_KP_Insert,
152 	RAWKEY_L9,
153 	RAWKEY_Prior,
154 	RAWKEY_L10,
155 	RAWKEY_Num_Lock,
156 	RAWKEY_Shift_L,
157 	RAWKEY_z,
158 	RAWKEY_x,
159 	RAWKEY_c,
160 	RAWKEY_v,
161 	RAWKEY_b,
162 	RAWKEY_n,
163 	RAWKEY_m,
164 	RAWKEY_comma,
165 	RAWKEY_period,
166 	RAWKEY_slash,
167 	RAWKEY_Shift_R,
168 	RAWKEY_Null,		/* KS_Linefeed on type 3/4 */
169 	RAWKEY_KP_End,
170 	RAWKEY_KP_Down,
171 	RAWKEY_KP_Next,
172 	RAWKEY_Null,
173 	RAWKEY_Null,
174 	RAWKEY_Null,
175 	RAWKEY_Help,
176 	RAWKEY_Caps_Lock,
177 	RAWKEY_Meta_L,
178 	RAWKEY_space,
179 	RAWKEY_Meta_R,
180 	RAWKEY_Next,
181 	RAWKEY_Null,
182 	RAWKEY_KP_Add,
183 	RAWKEY_Null,
184 	RAWKEY_AudioMute	/* type 5 remapped 0x2d */
185 };
186 #endif
187 
188 #define	KC(n)	KS_KEYCODE(n)
189 
190 /* 000/021/022 US English type 4/5 keyboard */
191 const keysym_t sunkbd_keydesc_us[] = {
192     KC(0x01), KS_Cmd,
193     KC(0x02), KS_Cmd_BrightnessDown,
194     KC(0x03),				KS_Again,
195     KC(0x04), KS_Cmd_BrightnessUp,
196     KC(0x05),				KS_f1,
197     KC(0x06),				KS_f2,
198     KC(0x07),				KS_f10,
199     KC(0x08),				KS_f3,
200     KC(0x09),				KS_f11,
201     KC(0x0a),				KS_f4,
202     KC(0x0b),				KS_f12,
203     KC(0x0c),				KS_f5,
204     KC(0x0d),				KS_Alt_R,
205     KC(0x0e),				KS_f6,
206     KC(0x10),				KS_f7,
207     KC(0x11),				KS_f8,
208     KC(0x12),				KS_f9,
209     KC(0x13),				KS_Alt_L,
210     KC(0x14),				KS_Up,
211     KC(0x15),				KS_Pause,
212     KC(0x16),				KS_Print_Screen,
213     KC(0x17),				KS_Hold_Screen,
214     KC(0x18),				KS_Left,
215     KC(0x19),				KS_Props,
216     KC(0x1a),				KS_Undo,
217     KC(0x1b),				KS_Down,
218     KC(0x1c),				KS_Right,
219     KC(0x1d),				KS_Escape,
220     KC(0x1e),				KS_1,		KS_exclam,
221     KC(0x1f),				KS_2,		KS_at,
222     KC(0x20),				KS_3,		KS_numbersign,
223     KC(0x21),				KS_4,		KS_dollar,
224     KC(0x22),				KS_5,		KS_percent,
225     KC(0x23),				KS_6,		KS_asciicircum,
226     KC(0x24),				KS_7,		KS_ampersand,
227     KC(0x25),				KS_8,		KS_asterisk,
228     KC(0x26),				KS_9,		KS_parenleft,
229     KC(0x27),				KS_0,		KS_parenright,
230     KC(0x28),				KS_minus,	KS_underscore,
231     KC(0x29),				KS_equal,	KS_plus,
232     KC(0x2a),				KS_grave,	KS_asciitilde,
233     KC(0x2b),				KS_Delete,
234     KC(0x2c),				KS_Insert,
235     KC(0x2d),				KS_KP_Equal,	/* type 4 */
236     KC(0x2e),				KS_KP_Divide,
237     KC(0x2f),				KS_KP_Multiply,
238     KC(0x31),				KS_Front,
239     KC(0x32),				KS_KP_Delete,	KS_KP_Decimal,
240     KC(0x33),				KS_Copy,
241     KC(0x34),				KS_Home,
242     KC(0x35),				KS_Tab,
243     KC(0x36),				KS_q,
244     KC(0x37),				KS_w,
245     KC(0x38),				KS_e,
246     KC(0x39),				KS_r,
247     KC(0x3a),				KS_t,
248     KC(0x3b),				KS_y,
249     KC(0x3c),				KS_u,
250     KC(0x3d),				KS_i,
251     KC(0x3e),				KS_o,
252     KC(0x3f),				KS_p,
253     KC(0x40),				KS_bracketleft,	KS_braceleft,
254     KC(0x41),				KS_bracketright,KS_braceright,
255     KC(0x42),				KS_Delete,
256     KC(0x43),				KS_Multi_key,
257     KC(0x44),				KS_KP_Home,	KS_KP_7,
258     KC(0x45),				KS_KP_Up,	KS_KP_8,
259     KC(0x46),				KS_KP_Prior,	KS_KP_9,
260     KC(0x47),				KS_KP_Subtract,
261     KC(0x48),				KS_Open,
262     KC(0x49),				KS_Paste,
263     KC(0x4a),				KS_End,
264     KC(0x4c),				KS_Control_L,
265     KC(0x4d), KS_Cmd_Debugger,		KS_a,
266     KC(0x4e),				KS_s,
267     KC(0x4f),				KS_d,
268     KC(0x50),				KS_f,
269     KC(0x51),				KS_g,
270     KC(0x52),				KS_h,
271     KC(0x53),				KS_j,
272     KC(0x54),				KS_k,
273     KC(0x55),				KS_l,
274     KC(0x56),				KS_semicolon,	KS_colon,
275     KC(0x57),				KS_apostrophe,	KS_quotedbl,
276     KC(0x58),				KS_backslash,	KS_bar,
277     KC(0x59),				KS_Return,
278     KC(0x5a),				KS_KP_Enter,
279     KC(0x5b),				KS_KP_Left,	KS_KP_4,
280     KC(0x5c),				KS_KP_Begin,	KS_KP_5,
281     KC(0x5d),				KS_KP_Right,	KS_KP_6,
282     KC(0x5e),				KS_KP_Insert,	KS_KP_0,
283     KC(0x5f),				KS_Find,
284     KC(0x60),				KS_Prior,
285     KC(0x61),				KS_Cut,
286     KC(0x62),				KS_Num_Lock,
287     KC(0x63),				KS_Shift_L,
288     KC(0x64),				KS_z,
289     KC(0x65),				KS_x,
290     KC(0x66),				KS_c,
291     KC(0x67),				KS_v,
292     KC(0x68),				KS_b,
293     KC(0x69),				KS_n,
294     KC(0x6a),				KS_m,
295     KC(0x6b),				KS_comma,	KS_less,
296     KC(0x6c),				KS_period,	KS_greater,
297     KC(0x6d),				KS_slash,	KS_question,
298     KC(0x6e),				KS_Shift_R,
299     KC(0x6f),				KS_Linefeed,
300     KC(0x70),				KS_KP_End,	KS_KP_1,
301     KC(0x71),				KS_KP_Down,	KS_KP_2,
302     KC(0x72),				KS_KP_Next,	KS_KP_3,
303     KC(0x76),				KS_Help,
304     KC(0x77),				KS_Caps_Lock,
305     KC(0x78),				KS_Meta_L,
306     KC(0x79),				KS_space,
307     KC(0x7a),				KS_Meta_R,
308     KC(0x7b),				KS_Next,
309     KC(0x7d),				KS_KP_Add,
310     KC(0x7f),				KS_AudioMute,	/* type 5 KC(0x2d) */
311 };
312 
313 /* 002 French/Belgian type 4 keyboard */
314 const keysym_t sunkbd_keydesc_befr[] = {
315     KC(0x0d),		KS_Caps_Lock,
316     KC(0x0f),		KS_bracketright,KS_braceright,	KS_guillemotright,
317     KC(0x1e),		KS_ampersand,	KS_1,
318     KC(0x1f),		KS_eacute,	KS_2,		KS_twosuperior,
319     KC(0x20),		KS_quotedbl,	KS_3,		KS_threesuperior,
320     KC(0x21),		KS_apostrophe,	KS_4,
321     KC(0x22),		KS_parenleft,	KS_5,
322     KC(0x23),		KS_section,	KS_6,
323     KC(0x24),		KS_egrave,	KS_7,
324     KC(0x25),		KS_exclam,	KS_8,		KS_sterling,
325     KC(0x26),		KS_ccedilla,	KS_9,		KS_backslash,
326     KC(0x27),		KS_agrave,	KS_0,
327     KC(0x28),		KS_parenright,	KS_degree,	KS_asciitilde,
328     KC(0x29),		KS_minus,	KS_underscore,	KS_numbersign,
329     KC(0x2a),		KS_asterisk,	KS_bar,		KS_currency,
330     KC(0x36),		KS_a,
331     KC(0x37),		KS_z,
332     KC(0x40),		KS_dead_circumflex,KS_dead_diaeresis,
333     KC(0x41),		KS_grave,	KS_dollar,	KS_at,
334     KC(0x4d), KS_Cmd_Debugger,	KS_q,
335     KC(0x56),		KS_m,		KS_M,		KS_mu,
336     KC(0x57),		KS_ugrave,	KS_percent,
337     KC(0x58),		KS_bracketleft,	KS_braceleft,	KS_guillemotleft,
338     KC(0x64),		KS_w,
339     KC(0x6a),		KS_comma,	KS_question,
340     KC(0x6b),		KS_semicolon,	KS_period,
341     KC(0x6c),		KS_colon,	KS_slash,
342     KC(0x6d),		KS_equal,	KS_plus,
343     KC(0x77),		KS_Mode_switch,
344     KC(0x7c),		KS_less,	KS_greater,
345 };
346 
347 /* 023 French type 5 keyboard */
348 const keysym_t sunkbd5_keydesc_fr[] = {
349     KC(0x0d),		KS_Mode_switch,
350     KC(0x1e),		KS_ampersand,	KS_1,
351     KC(0x1f),		KS_eacute,	KS_2,		KS_asciitilde,
352     KC(0x20),		KS_quotedbl,	KS_3,		KS_numbersign,
353     KC(0x21),		KS_apostrophe,	KS_4,		KS_braceleft,
354     KC(0x22),		KS_parenleft,	KS_5,		KS_bracketleft,
355     KC(0x23),		KS_minus,	KS_6,		KS_bar,
356     KC(0x24),		KS_egrave,	KS_7,		KS_grave,
357     KC(0x25),		KS_underscore,	KS_8,		KS_backslash,
358     KC(0x26),		KS_ccedilla,	KS_9,		KS_asciicircum,
359     KC(0x27),		KS_agrave,	KS_0,		KS_at,
360     KC(0x28),		KS_parenright,	KS_degree,	KS_bracketright,
361     KC(0x29),		KS_equal,	KS_plus,	KS_braceright,
362     KC(0x2a),		KS_twosuperior,
363     KC(0x36),		KS_a,
364     KC(0x37),		KS_z,
365     KC(0x40),		KS_dead_circumflex,KS_dead_diaeresis,
366     KC(0x41),		KS_dollar,	KS_sterling,	KS_currency,
367     KC(0x4d), KS_Cmd_Debugger,	KS_q,
368     KC(0x56),		KS_m,
369     KC(0x57),		KS_ugrave,	KS_percent,
370     KC(0x58),		KS_asterisk,	KS_mu,
371     KC(0x64),		KS_w,
372     KC(0x6a),		KS_comma,	KS_question,
373     KC(0x6b),		KS_semicolon,	KS_period,
374     KC(0x6c),		KS_colon,	KS_slash,
375     KC(0x6d),		KS_exclam,	KS_section,
376     KC(0x7c),		KS_less,	KS_greater,
377 };
378 
379 /* 004 Danish type 4 keyboard */
380 const keysym_t sunkbd_keydesc_dk[] = {
381     KC(0x0d),		KS_Multi_key,
382     KC(0x0f),		KS_asciitilde,	KS_asciicircum,
383     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
384     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
385     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
386     KC(0x23),		KS_6,		KS_ampersand,
387     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
388     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
389     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
390     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
391     KC(0x28),		KS_plus,	KS_question,
392     KC(0x29),		KS_dead_acute,	KS_dead_grave,	KS_bar,
393     KC(0x2a),		KS_apostrophe,	KS_asterisk,	KS_grave,
394     KC(0x40),		KS_aring,
395     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
396     KC(0x43),		KS_Mode_switch,
397     KC(0x4c),		KS_Caps_Lock,
398     KC(0x56),		KS_ae,
399     KC(0x57),		KS_oslash,
400     KC(0x58),		KS_onehalf,	KS_section,
401     KC(0x6b),		KS_comma,	KS_semicolon,
402     KC(0x6c),		KS_period,	KS_colon,
403     KC(0x6d),		KS_minus,	KS_underscore,
404     KC(0x77),		KS_Control_L,
405     KC(0x7c),		KS_less,	KS_greater,	KS_backslash,
406 };
407 
408 /* 024 Danish type 5 keyboard */
409 const keysym_t sunkbd5_keydesc_dk[] = {
410     KC(0x0d),		KS_Mode_switch,
411     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
412     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
413     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
414     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
415     KC(0x23),		KS_6,		KS_ampersand,	KS_asciicircum,
416     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
417     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
418     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
419     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
420     KC(0x28),		KS_plus,	KS_question,
421     KC(0x29),		KS_dead_acute,	KS_dead_grave,	KS_bar,
422     KC(0x2a),		KS_onehalf,	KS_asterisk,	KS_grave,
423     KC(0x40),		KS_aring,
424     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
425     KC(0x56),		KS_ae,
426     KC(0x57),		KS_oslash,
427     KC(0x58),		KS_backslash,	KS_asterisk,	KS_grave,
428     KC(0x6b),		KS_comma,	KS_semicolon,
429     KC(0x6c),		KS_period,	KS_colon,
430     KC(0x6d),		KS_minus,	KS_underscore,
431     KC(0x7c),		KS_less,	KS_greater,	KS_backslash,
432 };
433 
434 /* 005 German type 4 keyboard */
435 const keysym_t sunkbd_keydesc_de[] = {
436     KC(0x0d),		KS_Alt_L,
437     KC(0x0f),		KS_bracketright,KS_braceright,	KS_guillemotright,
438     KC(0x13),		KS_Mode_switch,
439     KC(0x1f),		KS_2,		KS_quotedbl,	KS_twosuperior,
440     KC(0x20),		KS_3,		KS_section,	KS_threesuperior,
441     KC(0x23),		KS_6,		KS_ampersand,
442     KC(0x24),		KS_7,		KS_slash,	KS_degree,
443     KC(0x25),		KS_8,		KS_parenleft,	KS_grave,
444     KC(0x26),		KS_9,		KS_parenright,	KS_apostrophe,
445     KC(0x27),		KS_0,		KS_equal,	KS_bar,
446     KC(0x28),		KS_ssharp,	KS_question,	KS_backslash,
447     KC(0x29),		KS_dead_acute,	KS_dead_grave,
448     KC(0x2a),		KS_numbersign,	KS_asciicircum,	KS_at,
449     KC(0x3b),		KS_z,
450     KC(0x40),		KS_udiaeresis,
451     KC(0x41),		KS_plus,	KS_asterisk,	KS_asciitilde,
452     KC(0x4c),		KS_Caps_Lock,
453     KC(0x56),		KS_odiaeresis,
454     KC(0x57),		KS_adiaeresis,
455     KC(0x58),		KS_bracketleft,	KS_braceleft,	KS_guillemotleft,
456     KC(0x64),		KS_y,
457     KC(0x6a),		KS_m,		KS_M,		KS_mu,
458     KC(0x6b),		KS_comma,	KS_semicolon,
459     KC(0x6c),		KS_period,	KS_colon,
460     KC(0x6d),		KS_minus,	KS_underscore,
461     KC(0x77),		KS_Control_L,
462     KC(0x7c),		KS_less,	KS_greater,
463 };
464 
465 /* 025 German type 5 keyboard */
466 const keysym_t sunkbd5_keydesc_de[] = {
467     KC(0x0d),		KS_Mode_switch,
468     KC(0x1f),		KS_2,		KS_quotedbl,	KS_twosuperior,
469     KC(0x20),		KS_3,		KS_section,	KS_threesuperior,
470     KC(0x23),		KS_6,		KS_ampersand,
471     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
472     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
473     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
474     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
475     KC(0x28),		KS_ssharp,	KS_question,	KS_backslash,
476     KC(0x29),		KS_dead_acute,	KS_dead_grave,
477     KC(0x2a),		KS_asciicircum,	KS_degree,
478     KC(0x36),		KS_q,		KS_Q,		KS_at,
479     KC(0x3b),		KS_z,
480     KC(0x40),		KS_udiaeresis,
481     KC(0x41),		KS_plus,	KS_asterisk,	KS_asciitilde,
482     KC(0x56),		KS_odiaeresis,
483     KC(0x57),		KS_adiaeresis,
484     KC(0x58),		KS_numbersign,	KS_apostrophe,	KS_grave,
485     KC(0x64),		KS_y,
486     KC(0x6a),		KS_m,		KS_M,		KS_mu,
487     KC(0x6b),		KS_comma,	KS_semicolon,
488     KC(0x6c),		KS_period,	KS_colon,
489     KC(0x6d),		KS_minus,	KS_underscore,
490     KC(0x7c),		KS_less,	KS_greater,	KS_bar,
491 };
492 
493 /* 006 Italian type 4 keyboard */
494 const keysym_t sunkbd_keydesc_it[] = {
495     KC(0x0d),		KS_Mode_switch,
496     KC(0x0f),		KS_bracketright,KS_braceright,	KS_guillemotright,
497     KC(0x1f),		KS_2,		KS_quotedbl,	KS_twosuperior,
498     KC(0x20),		KS_3,		KS_sterling,	KS_threesuperior,
499     KC(0x23),		KS_6,		KS_ampersand,	KS_notsign,
500     KC(0x24),		KS_7,		KS_slash,
501     KC(0x25),		KS_8,		KS_parenleft,
502     KC(0x26),		KS_9,		KS_parenright,	KS_backslash,
503     KC(0x27),		KS_0,		KS_equal,	KS_bar,
504     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
505     KC(0x29),		KS_igrave,	KS_asciicircum,
506     KC(0x2a),		KS_ugrave,	KS_section,
507     KC(0x40),		KS_egrave,	KS_eacute,
508     KC(0x41),		KS_plus,	KS_asterisk,	KS_asciitilde,
509     KC(0x4c),		KS_Caps_Lock,
510     KC(0x56),		KS_ograve,	KS_ccedilla,	KS_at,
511     KC(0x57),		KS_agrave,	KS_degree,	KS_numbersign,
512     KC(0x58),		KS_bracketleft,	KS_braceleft,	KS_guillemotleft,
513     KC(0x6b),		KS_comma,	KS_semicolon,
514     KC(0x6c),		KS_period,	KS_colon,
515     KC(0x6d),		KS_minus,	KS_underscore,
516     KC(0x77),		KS_Control_L,
517     KC(0x7c),		KS_less,	KS_greater,
518 };
519 
520 /* 026 Italian type 5 keyboard */
521 const keysym_t sunkbd5_keydesc_it[] = {
522     KC(0x0d),		KS_Mode_switch,
523     KC(0x1f),		KS_2,		KS_quotedbl,
524     KC(0x20),		KS_3,		KS_sterling,
525     KC(0x23),		KS_6,		KS_ampersand,
526     KC(0x24),		KS_7,		KS_slash,
527     KC(0x25),		KS_8,		KS_parenleft,	KS_braceleft,
528     KC(0x26),		KS_9,		KS_parenright,	KS_braceright,
529     KC(0x27),		KS_0,		KS_equal,
530     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
531     KC(0x29),		KS_igrave,	KS_asciicircum,
532     KC(0x2a),		KS_backslash,	KS_bar,
533     KC(0x40),		KS_egrave,	KS_eacute,	KS_bracketleft,
534     KC(0x41),		KS_plus,	KS_asterisk,	KS_bracketright,
535     KC(0x56),		KS_ograve,	KS_ccedilla,	KS_at,
536     KC(0x57),		KS_agrave,	KS_degree,	KS_numbersign,
537     KC(0x58),		KS_ugrave,	KS_section,	KS_asciitilde,
538     KC(0x6b),		KS_comma,	KS_semicolon,
539     KC(0x6c),		KS_period,	KS_colon,
540     KC(0x6d),		KS_minus,	KS_underscore,
541     KC(0x7c),		KS_less,	KS_greater,
542 };
543 
544 /* 007 Dutch type 4 keyboard */
545 const keysym_t sunkbd_keydesc_nl[] = {
546     KC(0x0d),		KS_Caps_Lock,
547     KC(0x0f),		KS_backslash,	KS_bar,
548     KC(0x1e),		KS_1,		KS_exclam,	KS_onesuperior,
549     KC(0x1f),		KS_2,		KS_quotedbl,	KS_twosuperior,
550     KC(0x20),		KS_3,		KS_numbersign,	KS_threesuperior,
551     KC(0x21),		KS_4,		KS_dollar,	KS_onequarter,
552     KC(0x22),		KS_5,		KS_percent,	KS_onehalf,
553     KC(0x23),		KS_6,		KS_ampersand,	KS_threequarters,
554     KC(0x24),		KS_7,		KS_underscore,	KS_sterling,
555     KC(0x25),		KS_8,		KS_parenleft,	KS_braceleft,
556     KC(0x26),		KS_9,		KS_parenright,	KS_braceright,
557     KC(0x27),		KS_0,		KS_apostrophe,	KS_grave,
558     KC(0x28),		KS_slash,	KS_question,
559     KC(0x29),		KS_degree,	KS_dead_tilde,	KS_dead_abovering,
560     KC(0x2a),		KS_less,	KS_greater,
561     KC(0x40),		KS_dead_diaeresis,KS_dead_circumflex,
562     KC(0x41),		KS_asterisk,	KS_brokenbar,	KS_asciitilde,
563     KC(0x4e),		KS_s,		KS_S,		KS_ssharp,
564     KC(0x56),		KS_plus,	KS_plusminus,
565     KC(0x57),		KS_dead_acute,	KS_dead_grave,
566     KC(0x58),		KS_at,		KS_section,	KS_notsign,
567     KC(0x64),		KS_z,		KS_Z,		KS_guillemotleft,
568     KC(0x65),		KS_x,		KS_X,		KS_guillemotright,
569     KC(0x66),		KS_c,		KS_C,		KS_cent,
570     KC(0x6a),		KS_m,		KS_M,		KS_mu,
571     KC(0x6b),		KS_comma,	KS_semicolon,
572     KC(0x6c),		KS_period,	KS_colon,
573     KC(0x6d),		KS_minus,	KS_equal,
574     KC(0x77),		KS_Mode_switch,
575     KC(0x7d),		KS_bracketright,KS_bracketleft,
576 };
577 
578 /* 027 Dutch type 5 keyboard */
579 const keysym_t sunkbd5_keydesc_nl[] = {
580     KC(0x0d),		KS_Mode_switch,
581     KC(0x1e),		KS_1,		KS_exclam,	KS_onesuperior,
582     KC(0x1f),		KS_2,		KS_quotedbl,	KS_twosuperior,
583     KC(0x20),		KS_3,		KS_numbersign,	KS_threesuperior,
584     KC(0x21),		KS_4,		KS_dollar,	KS_onequarter,
585     KC(0x22),		KS_5,		KS_percent,	KS_onehalf,
586     KC(0x23),		KS_6,		KS_ampersand,	KS_threequarters,
587     KC(0x24),		KS_7,		KS_underscore,	KS_sterling,
588     KC(0x25),		KS_8,		KS_parenleft,	KS_braceleft,
589     KC(0x26),		KS_9,		KS_parenright,	KS_braceright,
590     KC(0x27),		KS_0,		KS_apostrophe,	KS_grave,
591     KC(0x28),		KS_slash,	KS_question,	KS_backslash,
592     KC(0x29),		KS_degree,	KS_dead_tilde,	KS_dead_abovering,
593     KC(0x2a),		KS_at,		KS_section,	KS_notsign,
594     KC(0x40),		KS_dead_diaeresis,KS_dead_circumflex,
595     KC(0x41),		KS_asterisk,	KS_bar,		KS_asciitilde,
596     KC(0x4e),		KS_s,		KS_S,		KS_ssharp,
597     KC(0x56),		KS_plus,	KS_plusminus,
598     KC(0x57),		KS_dead_acute,	KS_dead_grave,
599     KC(0x58),		KS_less,	KS_greater,	KS_asciicircum,
600     KC(0x64),		KS_z,		KS_Z,		KS_guillemotleft,
601     KC(0x65),		KS_x,		KS_X,		KS_guillemotright,
602     KC(0x66),		KS_c,		KS_C,		KS_cent,
603     KC(0x6a),		KS_m,		KS_M,		KS_mu,
604     KC(0x6b),		KS_comma,	KS_semicolon,
605     KC(0x6c),		KS_period,	KS_colon,	KS_hyphen,
606     KC(0x6d),		KS_minus,	KS_equal,
607     KC(0x7d),		KS_bracketright,KS_bracketleft,	KS_brokenbar,
608 };
609 
610 /* 008 Norwegian type 4 keyboard */
611 const keysym_t sunkbd_keydesc_no[] = {
612     KC(0x0d),		KS_Mode_switch,
613     KC(0x0f),		KS_asciitilde,	KS_asciicircum,
614     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
615     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
616     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
617     KC(0x23),		KS_6,		KS_ampersand,
618     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
619     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
620     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
621     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
622     KC(0x28),		KS_plus,	KS_question,
623     KC(0x29),		KS_backslash,	KS_dead_grave,	KS_dead_acute,
624     KC(0x2a),		KS_apostrophe,	KS_asterisk,	KS_grave,
625     KC(0x40),		KS_aring,
626     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
627     KC(0x4c),		KS_Caps_Lock,
628     KC(0x56),		KS_oslash,
629     KC(0x57),		KS_ae,
630     KC(0x58),		KS_bar,		KS_section,
631     KC(0x6b),		KS_comma,	KS_semicolon,
632     KC(0x6c),		KS_period,	KS_colon,
633     KC(0x6d),		KS_minus,	KS_underscore,
634     KC(0x77),		KS_Control_L,
635     KC(0x7d),		KS_less,	KS_greater,
636 };
637 
638 /* 028 Norwegian type 5 keyboard */
639 const keysym_t sunkbd5_keydesc_no[] = {
640     KC(0x0d),		KS_Mode_switch,
641     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
642     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
643     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
644     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
645     KC(0x23),		KS_6,		KS_ampersand,	KS_asciicircum,
646     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
647     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
648     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
649     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
650     KC(0x28),		KS_plus,	KS_question,
651     KC(0x29),		KS_backslash,	KS_dead_grave,	KS_dead_acute,
652     KC(0x2a),		KS_bar,		KS_section,
653     KC(0x40),		KS_aring,
654     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
655     KC(0x56),		KS_oslash,
656     KC(0x57),		KS_ae,
657     KC(0x58),		KS_apostrophe,	KS_asterisk,	KS_grave,
658     KC(0x6b),		KS_comma,	KS_semicolon,
659     KC(0x6c),		KS_period,	KS_colon,
660     KC(0x6d),		KS_minus,	KS_underscore,
661     KC(0x7d),		KS_less,	KS_greater,
662 };
663 
664 /* 009 Portuguese type 4 keyboard */
665 const keysym_t sunkbd_keydesc_pt[] = {
666     KC(0x0d),		KS_Mode_switch,
667     KC(0x0f),		KS_bracketright,KS_braceright,	KS_guillemotright,
668     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
669     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
670     KC(0x21),		KS_4,		KS_dollar,	KS_section,
671     KC(0x23),		KS_6,		KS_ampersand,	KS_notsign,
672     KC(0x24),		KS_7,		KS_slash,
673     KC(0x25),		KS_8,		KS_parenleft,
674     KC(0x26),		KS_9,		KS_parenright,	KS_backslash,
675     KC(0x27),		KS_0,		KS_equal,	KS_bar,
676     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
677     KC(0x29),		KS_exclamdown,	KS_questiondown,
678     KC(0x2a),		KS_dead_tilde,	KS_dead_circumflex,KS_asciicircum,
679     KC(0x40),		KS_dead_diaeresis,KS_asterisk,	KS_plus,
680     KC(0x41),		KS_dead_acute,	KS_dead_grave,	KS_asciitilde,
681     KC(0x4c),		KS_Caps_Lock,
682     KC(0x56),		KS_ccedilla,
683     KC(0x57),		KS_masculine,	KS_ordfeminine,
684     KC(0x58),		KS_bracketleft,	KS_braceleft,	KS_guillemotleft,
685     KC(0x6b),		KS_comma,	KS_semicolon,
686     KC(0x6c),		KS_period,	KS_colon,
687     KC(0x6d),		KS_minus,	KS_underscore,
688     KC(0x77),		KS_Control_L,
689     KC(0x7d),		KS_less,	KS_greater,
690 };
691 
692 /* 029 Portuguese type 4 keyboard */
693 const keysym_t sunkbd5_keydesc_pt[] = {
694     KC(0x0d),		KS_Mode_switch,
695     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
696     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
697     KC(0x21),		KS_4,		KS_dollar,	KS_section,
698     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
699     KC(0x23),		KS_6,		KS_ampersand,	KS_asciicircum,
700     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
701     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
702     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
703     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
704     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
705     KC(0x29),		KS_guillemotleft,KS_guillemotright,
706     KC(0x2a),		KS_backslash,	KS_bar,
707     KC(0x40),		KS_plus,	KS_asterisk,	KS_dead_diaeresis,
708     KC(0x41),		KS_dead_acute,	KS_dead_grave,
709     KC(0x56),		KS_ccedilla,
710     KC(0x57),		KS_masculine,	KS_ordfeminine,
711     KC(0x58),		KS_dead_tilde,	KS_dead_circumflex,
712     KC(0x6b),		KS_comma,	KS_semicolon,
713     KC(0x6c),		KS_period,	KS_colon,
714     KC(0x6d),		KS_minus,	KS_underscore,
715     KC(0x7d),		KS_less,	KS_greater,
716 };
717 
718 /* 00a Spanish type 4 keyboard */
719 const keysym_t sunkbd_keydesc_es[] = {
720     KC(0x0d),		KS_Mode_switch,
721     KC(0x0f),		KS_bracketright,KS_braceright,	KS_guillemotright,
722     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
723     KC(0x20),		KS_3,		KS_hyphen,	KS_numbersign,
724     KC(0x22),		KS_5,		KS_percent,	KS_degree,
725     KC(0x23),		KS_6,		KS_ampersand,	KS_notsign,
726     KC(0x24),		KS_7,		KS_slash,
727     KC(0x25),		KS_8,		KS_parenleft,
728     KC(0x26),		KS_9,		KS_parenright,	KS_backslash,
729     KC(0x27),		KS_0,		KS_equal,	KS_bar,
730     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
731     KC(0x29),		KS_exclamdown,	KS_questiondown,
732     KC(0x2a),		KS_ccedilla,
733     KC(0x3e),		KS_o,		KS_O,		KS_masculine,
734     KC(0x40),		KS_dead_grave,	KS_dead_circumflex,KS_asciicircum,
735     KC(0x41),		KS_plus,	KS_asterisk,	KS_asciitilde,
736     KC(0x4c),		KS_Caps_Lock,
737     KC(0x4d),		KS_a,		KS_A,		KS_ordfeminine,
738     KC(0x56),		KS_ntilde,
739     KC(0x57),		KS_dead_acute,	KS_dead_diaeresis,
740     KC(0x58),		KS_bracketleft,	KS_braceleft,	KS_guillemotleft,
741     KC(0x6b),		KS_comma,	KS_semicolon,
742     KC(0x6c),		KS_period,	KS_colon,
743     KC(0x6d),		KS_minus,	KS_underscore,
744     KC(0x77),		KS_Control_L,
745     KC(0x7d),		KS_less,	KS_greater,
746 };
747 
748 /* 02a Spanish type 5 keyboard */
749 const keysym_t sunkbd5_keydesc_es[] = {
750     KC(0x0d),		KS_Mode_switch,
751     KC(0x1e),		KS_1,		KS_exclam,	KS_bar,
752     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
753     KC(0x20),		KS_3,		KS_hyphen,	KS_numbersign,
754     KC(0x21),		KS_4,		KS_dollar,	KS_asciicircum,
755     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
756     KC(0x23),		KS_6,		KS_ampersand,	KS_notsign,
757     KC(0x24),		KS_7,		KS_slash,
758     KC(0x25),		KS_8,		KS_parenleft,
759     KC(0x26),		KS_9,		KS_parenright,
760     KC(0x27),		KS_0,		KS_equal,
761     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
762     KC(0x29),		KS_exclamdown,	KS_questiondown,
763     KC(0x2a),		KS_masculine,	KS_ordfeminine,	KS_backslash,
764     KC(0x40),		KS_dead_grave,	KS_dead_circumflex,KS_bracketleft,
765     KC(0x41),		KS_plus,	KS_asterisk,	KS_bracketright,
766     KC(0x56),		KS_ntilde,
767     KC(0x57),		KS_dead_acute,	KS_dead_diaeresis,KS_braceleft,
768     KC(0x58),		KS_ccedilla,	KS_Ccedilla,	KS_braceright,
769     KC(0x6b),		KS_comma,	KS_semicolon,
770     KC(0x6c),		KS_period,	KS_colon,
771     KC(0x6d),		KS_minus,	KS_underscore,
772     KC(0x7d),		KS_less,	KS_greater,
773 };
774 
775 /* 00b Swedish/Finnish type 4 keyboard */
776 const keysym_t sunkbd_keydesc_sv[] = {
777     KC(0x0d),		KS_Multi_key,
778     KC(0x0f),		KS_asciitilde,	KS_asciicircum,
779     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
780     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
781     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
782     KC(0x23),		KS_6,		KS_ampersand,
783     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
784     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
785     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
786     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
787     KC(0x28),		KS_plus,	KS_question,	KS_backslash,
788     KC(0x29),		KS_dead_acute,	KS_dead_grave,
789     KC(0x2a),		KS_apostrophe,	KS_asterisk,	KS_grave,
790     KC(0x40),		KS_aring,
791     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
792     KC(0x43),		KS_Mode_switch,
793     KC(0x4c),		KS_Caps_Lock,
794     KC(0x56),		KS_odiaeresis,
795     KC(0x57),		KS_adiaeresis,
796     KC(0x58),		KS_section,	KS_onehalf,
797     KC(0x6b),		KS_comma,	KS_semicolon,
798     KC(0x6c),		KS_period,	KS_colon,
799     KC(0x6d),		KS_minus,	KS_underscore,
800     KC(0x77),		KS_Control_L,
801     KC(0x7c),		KS_less,	KS_greater,	KS_bar,
802 };
803 
804 const keysym_t sunkbd_keydesc_sv_nodead[] = {
805     KC(0x29),		KS_apostrophe,	KS_grave,
806     KC(0x41),		KS_diaeresis,	KS_asciicircum,	KS_asciitilde,
807 };
808 
809 /* 02b Swedish type 5 keyboard */
810 const keysym_t sunkbd5_keydesc_sv[] = {
811     KC(0x0d),		KS_Mode_switch,
812     KC(0x0f),		KS_asciitilde,	KS_asciicircum,
813     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
814     KC(0x20),		KS_3,		KS_numbersign,	KS_sterling,
815     KC(0x21),		KS_4,		KS_currency,	KS_dollar,
816     KC(0x23),		KS_6,		KS_ampersand,
817     KC(0x24),		KS_7,		KS_slash,	KS_braceleft,
818     KC(0x25),		KS_8,		KS_parenleft,	KS_bracketleft,
819     KC(0x26),		KS_9,		KS_parenright,	KS_bracketright,
820     KC(0x27),		KS_0,		KS_equal,	KS_braceright,
821     KC(0x28),		KS_plus,	KS_question,	KS_backslash,
822     KC(0x29),		KS_dead_acute,	KS_dead_grave,
823     KC(0x2a),		KS_section,	KS_onehalf,
824     KC(0x40),		KS_aring,
825     KC(0x41),		KS_dead_diaeresis,KS_dead_circumflex,KS_dead_tilde,
826     KC(0x43),		KS_Multi_key,
827     KC(0x4c),		KS_Control_L,
828     KC(0x56),		KS_odiaeresis,
829     KC(0x57),		KS_adiaeresis,
830     KC(0x58),		KS_apostrophe,	KS_asterisk,	KS_grave,
831     KC(0x6b),		KS_comma,	KS_semicolon,
832     KC(0x6c),		KS_period,	KS_colon,
833     KC(0x6d),		KS_minus,	KS_underscore,
834     KC(0x77),		KS_Caps_Lock,
835     KC(0x7c),		KS_less,	KS_greater,	KS_bar,
836 };
837 
838 /* 00c Swiss-French type 4 keyboard */
839 const keysym_t sunkbd_keydesc_sf[] = {
840     KC(0x0d),		KS_Multi_key,
841     KC(0x0f),		KS_greater,	KS_braceright,
842     KC(0x1e),		KS_1,		KS_plus,	KS_exclam,
843     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
844     KC(0x20),		KS_3,		KS_asterisk,	KS_numbersign,
845     KC(0x21),		KS_4,		KS_ccedilla,	KS_cent,
846     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
847     KC(0x23),		KS_6,		KS_ampersand,	KS_section,
848     KC(0x24),		KS_7,		KS_slash,	KS_bar,
849     KC(0x25),		KS_8,		KS_parenleft,	KS_degree,
850     KC(0x26),		KS_9,		KS_parenright,	KS_backslash,
851     KC(0x27),		KS_0,		KS_equal,	KS_asciicircum,
852     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
853     KC(0x29),		KS_dead_circumflex,KS_dead_grave,
854     KC(0x2a),		KS_dollar,	KS_dead_tilde,	KS_sterling,
855     KC(0x3b),		KS_z,
856     KC(0x40),		KS_egrave,	KS_udiaeresis,
857     KC(0x41),		KS_dead_diaeresis,KS_dead_acute,
858     KC(0x43),		KS_Mode_switch,
859     KC(0x4c),		KS_Caps_Lock,
860     KC(0x56),		KS_eacute,	KS_odiaeresis,
861     KC(0x57),		KS_agrave,	KS_adiaeresis,
862     KC(0x58),		KS_less,	KS_braceleft,
863     KC(0x64),		KS_y,
864     KC(0x6a),		KS_m,		KS_M,		KS_mu,
865     KC(0x6b),		KS_comma,	KS_semicolon,
866     KC(0x6c),		KS_period,	KS_colon,
867     KC(0x6d),		KS_minus,	KS_underscore,
868     KC(0x77),		KS_Control_L,
869     KC(0x7c),		KS_bracketright,KS_bracketleft,	KS_backslash,
870 };
871 
872 /* 02c Swiss-French type 5 keyboard */
873 const keysym_t sunkbd5_keydesc_sf[] = {
874     KC(0x0d),		KS_Mode_switch,
875     KC(0x1e),		KS_1,		KS_plus,	KS_bar,
876     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
877     KC(0x20),		KS_3,		KS_asterisk,	KS_numbersign,
878     KC(0x21),		KS_4,		KS_ccedilla,	KS_asciicircum,
879     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
880     KC(0x23),		KS_6,		KS_ampersand,
881     KC(0x24),		KS_7,		KS_slash,
882     KC(0x25),		KS_8,		KS_parenleft,
883     KC(0x26),		KS_9,		KS_parenright,
884     KC(0x27),		KS_0,		KS_equal,	KS_grave,
885     KC(0x28),		KS_apostrophe,	KS_question,	KS_dead_acute,
886     KC(0x29),		KS_dead_circumflex,KS_dead_grave,KS_dead_tilde,
887     KC(0x2a),		KS_dollar,	KS_degree,
888     KC(0x3b),		KS_z,
889     KC(0x40),		KS_egrave,	KS_udiaeresis,	KS_bracketleft,
890     KC(0x41),		KS_dead_diaeresis,KS_exclam,	KS_bracketright,
891     KC(0x56),		KS_eacute,	KS_odiaeresis,
892     KC(0x57),		KS_agrave,	KS_adiaeresis,	KS_braceleft,
893     KC(0x58),		KS_dollar,	KS_sterling,	KS_braceright,
894     KC(0x64),		KS_y,
895     KC(0x6b),		KS_comma,	KS_semicolon,
896     KC(0x6c),		KS_period,	KS_colon,
897     KC(0x6d),		KS_minus,	KS_underscore,
898     KC(0x7c),		KS_less,	KS_greater,	KS_backslash,
899 };
900 
901 /* 00d Swiss-German type 4 keyboard */
902 const keysym_t sunkbd_keydesc_sg[] = {
903     KC(0x0d),		KS_Multi_key,
904     KC(0x0f),		KS_greater,	KS_braceright,
905     KC(0x1e),		KS_1,		KS_plus,	KS_exclam,
906     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
907     KC(0x20),		KS_3,		KS_asterisk,	KS_numbersign,
908     KC(0x21),		KS_4,		KS_ccedilla,	KS_cent,
909     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
910     KC(0x23),		KS_6,		KS_ampersand,	KS_section,
911     KC(0x24),		KS_7,		KS_slash,	KS_bar,
912     KC(0x25),		KS_8,		KS_parenleft,	KS_degree,
913     KC(0x26),		KS_9,		KS_parenright,	KS_backslash,
914     KC(0x27),		KS_0,		KS_equal,	KS_asciicircum,
915     KC(0x28),		KS_apostrophe,	KS_question,	KS_grave,
916     KC(0x29),		KS_dead_circumflex,KS_dead_grave,
917     KC(0x2a),		KS_dollar,	KS_dead_tilde,	KS_sterling,
918     KC(0x3b),		KS_z,
919     KC(0x40),		KS_udiaeresis,	KS_egrave,
920     KC(0x41),		KS_dead_diaeresis,KS_dead_acute,
921     KC(0x43),		KS_Mode_switch,
922     KC(0x4c),		KS_Caps_Lock,
923     KC(0x56),		KS_odiaeresis,	KS_eacute,
924     KC(0x57),		KS_adiaeresis,	KS_agrave,
925     KC(0x58),		KS_less,	KS_braceleft,
926     KC(0x64),		KS_y,
927     KC(0x6a),		KS_m,		KS_M,		KS_mu,
928     KC(0x6b),		KS_comma,	KS_semicolon,
929     KC(0x6c),		KS_period,	KS_colon,
930     KC(0x6d),		KS_minus,	KS_underscore,
931     KC(0x77),		KS_Control_L,
932     KC(0x7c),		KS_bracketright,KS_bracketleft,	KS_backslash,
933 };
934 
935 /* 02d Swiss-German type 5 keyboard */
936 const keysym_t sunkbd5_keydesc_sg[] = {
937     KC(0x0d),		KS_Mode_switch,
938     KC(0x1e),		KS_1,		KS_plus,	KS_bar,
939     KC(0x1f),		KS_2,		KS_quotedbl,	KS_at,
940     KC(0x20),		KS_3,		KS_asterisk,	KS_numbersign,
941     KC(0x21),		KS_4,		KS_ccedilla,	KS_asciicircum,
942     KC(0x22),		KS_5,		KS_percent,	KS_asciitilde,
943     KC(0x23),		KS_6,		KS_ampersand,
944     KC(0x24),		KS_7,		KS_slash,
945     KC(0x25),		KS_8,		KS_parenleft,
946     KC(0x26),		KS_9,		KS_parenright,
947     KC(0x27),		KS_0,		KS_equal,	KS_grave,
948     KC(0x28),		KS_apostrophe,	KS_question,	KS_dead_acute,
949     KC(0x29),		KS_dead_circumflex,KS_dead_grave,KS_dead_tilde,
950     KC(0x2a),		KS_dollar,	KS_degree,
951     KC(0x3b),		KS_z,
952     KC(0x40),		KS_udiaeresis,	KS_egrave,	KS_bracketleft,
953     KC(0x41),		KS_dead_diaeresis,KS_exclam,	KS_bracketright,
954     KC(0x56),		KS_odiaeresis,	KS_eacute,
955     KC(0x57),		KS_adiaeresis,	KS_agrave,	KS_braceleft,
956     KC(0x58),		KS_dollar,	KS_sterling,	KS_braceright,
957     KC(0x64),		KS_y,
958     KC(0x6b),		KS_comma,	KS_semicolon,
959     KC(0x6c),		KS_period,	KS_colon,
960     KC(0x6d),		KS_minus,	KS_underscore,
961     KC(0x7c),		KS_less,	KS_greater,	KS_backslash,
962 };
963 
964 /* 00e UK English type 4 keyboard */
965 const keysym_t sunkbd_keydesc_uk[] = {
966     KC(0x1e),		KS_1,		KS_exclam,	KS_bar,
967     KC(0x21),		KS_3,		KS_sterling,	KS_numbersign,
968     KC(0x28),		KS_minus,	KS_underscore,	KS_notsign,
969     KC(0x43),		KS_Mode_switch,
970 };
971 
972 /* 02e UK English type 5 keyboard */
973 const keysym_t sunkbd5_keydesc_uk[] = {
974     KC(0x0d),		KS_Mode_switch,
975     KC(0x1f),		KS_2,		KS_quotedbl,
976     KC(0x20),		KS_3,		KS_sterling,
977     KC(0x2a),		KS_grave,	KS_notsign,	KS_brokenbar,
978     KC(0x57),		KS_apostrophe,	KS_at,
979     KC(0x58),		KS_numbersign,	KS_asciitilde,
980     KC(0x7c),		KS_backslash,	KS_bar,
981 };
982 
983 /* 031 Japan type 5 keyboard */
984 const keysym_t sunkbd5_keydesc_jp[] = {
985     KC(0x1f),		KS_2,		KS_quotedbl,
986     KC(0x23),		KS_6,		KS_ampersand,
987     KC(0x24),		KS_7,		KS_apostrophe,
988     KC(0x25),		KS_8,		KS_parenleft,
989     KC(0x26),		KS_9,		KS_parenright,
990     KC(0x27),		KS_0,
991     KC(0x28),		KS_minus,	KS_equal,
992     KC(0x29),		KS_asciicircum,	KS_asciitilde,
993     KC(0x2a),		KS_yen,		KS_bar,
994     KC(0x40),		KS_at,		KS_grave,
995     KC(0x41),		KS_bracketleft,	KS_braceleft,
996     KC(0x56),		KS_semicolon,	KS_plus,
997     KC(0x57),		KS_colon,	KS_asterisk,
998     KC(0x58),		KS_bracketright,KS_braceright,
999     KC(0x7c),		KS_backslash,	KS_underscore,
1000 };
1001 
1002 #define KBD_MAP(name, base, map) \
1003     { name, base, sizeof(map)/sizeof(keysym_t), map }
1004 
1005 /* Supported type 4 keyboard layouts */
1006 const struct wscons_keydesc sunkbd_keydesctab[] = {
1007 	KBD_MAP(KB_US,			0,	sunkbd_keydesc_us),
1008 	KBD_MAP(KB_BE,			KB_US,	sunkbd_keydesc_befr),
1009 	KBD_MAP(KB_DE,			KB_US,	sunkbd_keydesc_de),
1010 	KBD_MAP(KB_DK,			KB_US,	sunkbd_keydesc_dk),
1011 	KBD_MAP(KB_ES,			KB_US,	sunkbd_keydesc_es),
1012 	KBD_MAP(KB_FR,			KB_US,	sunkbd_keydesc_befr),
1013 	KBD_MAP(KB_IT,			KB_US,	sunkbd_keydesc_it),
1014 	KBD_MAP(KB_NL,			KB_US,	sunkbd_keydesc_nl),
1015 	KBD_MAP(KB_NO,			KB_US,	sunkbd_keydesc_no),
1016 	KBD_MAP(KB_PT,			KB_US,	sunkbd_keydesc_pt),
1017 	KBD_MAP(KB_SF,			KB_US,	sunkbd_keydesc_sf),
1018 	KBD_MAP(KB_SG,			KB_US,	sunkbd_keydesc_sg),
1019 	KBD_MAP(KB_SV,			KB_US,	sunkbd_keydesc_sv),
1020 	KBD_MAP(KB_SV | KB_NODEAD,	KB_SV,	sunkbd_keydesc_sv_nodead),
1021 	KBD_MAP(KB_UK,			KB_US,	sunkbd_keydesc_uk),
1022 	{0, 0, 0, 0},
1023 };
1024 
1025 /* Supported type 5 keyboard layouts */
1026 const struct wscons_keydesc sunkbd5_keydesctab[] = {
1027 	KBD_MAP(KB_US,			0,	sunkbd_keydesc_us),
1028 	KBD_MAP(KB_DE,			KB_US,	sunkbd5_keydesc_de),
1029 	KBD_MAP(KB_DK,			KB_US,	sunkbd5_keydesc_dk),
1030 	KBD_MAP(KB_ES,			KB_US,	sunkbd5_keydesc_es),
1031 	KBD_MAP(KB_FR,			KB_US,	sunkbd5_keydesc_fr),
1032 	KBD_MAP(KB_IT,			KB_US,	sunkbd5_keydesc_it),
1033 	KBD_MAP(KB_JP,			KB_US,	sunkbd5_keydesc_jp),
1034 	KBD_MAP(KB_NL,			KB_US,	sunkbd5_keydesc_nl),
1035 	KBD_MAP(KB_NO,			KB_US,	sunkbd5_keydesc_no),
1036 	KBD_MAP(KB_PT,			KB_US,	sunkbd5_keydesc_pt),
1037 	KBD_MAP(KB_SF,			KB_US,	sunkbd5_keydesc_sf),
1038 	KBD_MAP(KB_SG,			KB_US,	sunkbd5_keydesc_sg),
1039 	KBD_MAP(KB_SV,			KB_US,	sunkbd5_keydesc_sv),
1040 	KBD_MAP(KB_SV | KB_NODEAD,	KB_SV,	sunkbd_keydesc_sv_nodead),
1041 	KBD_MAP(KB_UK,			KB_US,	sunkbd5_keydesc_uk),
1042 	{0, 0, 0, 0},
1043 };
1044 
1045 /*
1046  * Keyboard layout to ID table
1047  * References:
1048  *	Sun Type 5 Keyboard Supplement Installation Guide, May 1992
1049  *	http://docs.sun.com/db/doc/806-6642/6jfipqu57?a=view
1050  *	http://jp.sunsolve.sun.com/handbook_pub/Systems/SSVygr/INPUT_Compact1_Keyboard.html
1051  */
1052 const int sunkbd_layouts[MAXSUNLAYOUT] = {
1053 	/* Type 4 layouts */
1054 	KB_US,	/* 000 USA */
1055 	KB_US,	/* 001 same as 000 */
1056 	KB_BE,	/* 002 Belgium/French */
1057 	-1,	/* 003 Canada */
1058 	KB_DK,	/* 004 Denmark */
1059 	KB_DE,	/* 005 Germany */
1060 	KB_IT,	/* 006 Italy */
1061 	KB_NL,	/* 007 The Netherlands */
1062 	KB_NO,	/* 008 Norway */
1063 	KB_PT,	/* 009 Portugal */
1064 	KB_ES,	/* 00a Latin America/Spanish */
1065 	KB_SV,	/* 00b Sweden */
1066 	KB_SF,	/* 00c Switzerland/French */
1067 	KB_SG,	/* 00d Switzerland/German */
1068 	KB_UK,	/* 00e Great Britain */
1069 	-1,	/* 00f unaffected */
1070 	-1,	/* 010 Korea */
1071 	-1,	/* 011 Taiwan */
1072 	-1,	/* 012 unaffected */
1073 	-1,	/* 013 unaffected */
1074 	-1,	/* 014 VT220 */
1075 	-1,	/* 015 VT220 Switzerland/French */
1076 	-1,	/* 016 VT220 Switzerland/German */
1077 	-1,	/* 017 VT220 Switzerland/Italian */
1078 	-1,	/* 018 unaffected */
1079 	-1,	/* 019 Belgium */
1080 	-1,	/* 01a unaffected */
1081 	-1,	/* 01b unaffected */
1082 	-1,	/* 01c unaffected */
1083 	-1,	/* 01d unaffected */
1084 	-1,	/* 01e unaffected */
1085 	-1,	/* 01f unaffected */
1086 	-1,	/* 020 Japan */
1087 
1088 	/* Type 5 layouts */
1089 	KB_US,	/* 021 USA */
1090 	KB_US,	/* 022 UNIX */
1091 	KB_FR,	/* 023 France */
1092 	KB_DK,	/* 024 Denmark */
1093 	KB_DE,	/* 025 Germany */
1094 	KB_IT,	/* 026 Italy */
1095 	KB_NL,	/* 027 The Netherlands */
1096 	KB_NO,	/* 028 Norway */
1097 	KB_PT,	/* 029 Portugal */
1098 	KB_ES,	/* 02a Spain */
1099 	KB_SV,	/* 02b Sweden */
1100 	KB_SF,	/* 02c Switzerland/French */
1101 	KB_SG,	/* 02d Switzerland/German */
1102 	KB_UK,	/* 02e Great Britain */
1103 	-1,	/* 02f Korea */
1104 	-1,	/* 030 Taiwan */
1105 	KB_JP,	/* 031 Japan */
1106 	-1,	/* 032 Canada/French */
1107 	-1,	/* 033 Hungary */
1108 	-1,	/* 034 Poland */
1109 	-1,	/* 035 Czech */
1110 	-1,	/* 036 Russia */
1111 	-1,	/* 037 Latvia */
1112 	-1,	/* 038 Turkey-Q5 */
1113 	-1,	/* 039 Greece */
1114 	-1,	/* 03a Arabic */
1115 	-1,	/* 03b Lithuania */
1116 	-1,	/* 03c Belgium */
1117 	-1,	/* 03d unaffected */
1118 	-1,	/* 03e Turkey-F5 */
1119 	-1,	/* 03f Canada/French */
1120 
1121 	/* Not affected range */
1122 	-1,	/* 040 */
1123 	-1,	/* 041 */
1124 	-1,	/* 042 */
1125 	-1,	/* 043 */
1126 	-1,	/* 044 */
1127 	-1,	/* 045 */
1128 	-1,	/* 046 */
1129 	-1,	/* 047 */
1130 	-1,	/* 048 */
1131 	-1,	/* 049 */
1132 	-1,	/* 04a */
1133 	-1,	/* 04b */
1134 	-1,	/* 04c */
1135 	-1,	/* 04d */
1136 	-1,	/* 04e */
1137 	-1,	/* 04f */
1138 
1139 	/* ``Compact-1'' layouts */
1140 	KB_US,	/* 050 USA */
1141 	KB_US,	/* 051 UNIX */
1142 	KB_FR,	/* 052 France */
1143 	KB_DK,	/* 053 Denmark */
1144 	KB_DE,	/* 054 Germany */
1145 	KB_IT,	/* 055 Italy */
1146 	KB_NL,	/* 056 The Netherlands */
1147 	KB_NO,	/* 057 Norway */
1148 	KB_PT,	/* 058 Portugal */
1149 	KB_ES,	/* 059 Spain */
1150 	KB_SV,	/* 05a Sweden */
1151 	KB_SF,	/* 05b Switzerland/French */
1152 	KB_SG,	/* 05c Switzerland/German */
1153 	KB_UK,	/* 05d Great Britain */
1154 	-1,	/* 05e Korea */
1155 	-1,	/* 05f Taiwan */
1156 	KB_JP,	/* 060 Japan */
1157 	-1,	/* 061 Canada/French */
1158 };
1159 
1160 struct wskbd_mapdata sunkbd_keymapdata = {
1161 	sunkbd_keydesctab,
1162 #ifdef SUNKBD_LAYOUT
1163 	SUNKBD_LAYOUT,
1164 #else
1165 	KB_US | KB_DEFAULT,
1166 #endif
1167 };
1168 
1169 struct wskbd_mapdata sunkbd5_keymapdata = {
1170 	sunkbd5_keydesctab,
1171 #ifdef SUNKBD5_LAYOUT
1172 	SUNKBD5_LAYOUT,
1173 #else
1174 	KB_US | KB_DEFAULT,
1175 #endif
1176 };
1177