15a333f6fSOleksandr Tymoshenko /*-
25a333f6fSOleksandr Tymoshenko * Copyright (c) 2015 Oleksandr Tymoshenko <gonzo@freebsd.org>
35a333f6fSOleksandr Tymoshenko * All rights reserved.
45a333f6fSOleksandr Tymoshenko *
55a333f6fSOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without
65a333f6fSOleksandr Tymoshenko * modification, are permitted provided that the following conditions
75a333f6fSOleksandr Tymoshenko * are met:
85a333f6fSOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright
95a333f6fSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer.
105a333f6fSOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright
115a333f6fSOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the
125a333f6fSOleksandr Tymoshenko * documentation and/or other materials provided with the distribution.
135a333f6fSOleksandr Tymoshenko *
145a333f6fSOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
155a333f6fSOleksandr Tymoshenko * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
165a333f6fSOleksandr Tymoshenko * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
175a333f6fSOleksandr Tymoshenko * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
185a333f6fSOleksandr Tymoshenko * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
195a333f6fSOleksandr Tymoshenko * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
205a333f6fSOleksandr Tymoshenko * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
215a333f6fSOleksandr Tymoshenko * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
225a333f6fSOleksandr Tymoshenko * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
235a333f6fSOleksandr Tymoshenko * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
245a333f6fSOleksandr Tymoshenko * SUCH DAMAGE.
255a333f6fSOleksandr Tymoshenko */
265a333f6fSOleksandr Tymoshenko
275a333f6fSOleksandr Tymoshenko #include <sys/param.h>
285a333f6fSOleksandr Tymoshenko #include <sys/systm.h>
295a333f6fSOleksandr Tymoshenko
305a333f6fSOleksandr Tymoshenko #include <dev/gpio/gpiokeys.h>
31*955b980bSEmmanuel Vadot #include <contrib/device-tree/include/dt-bindings/input/linux-event-codes.h>
325a333f6fSOleksandr Tymoshenko
335a333f6fSOleksandr Tymoshenko struct gpiokeys_codemap_entry {
345a333f6fSOleksandr Tymoshenko uint32_t linux_code;
355a333f6fSOleksandr Tymoshenko uint32_t bsd_code;
365a333f6fSOleksandr Tymoshenko };
375a333f6fSOleksandr Tymoshenko
385a333f6fSOleksandr Tymoshenko static struct gpiokeys_codemap_entry gpiokeys_codes_map[] = {
395a333f6fSOleksandr Tymoshenko { KEY_ESC, 1},
405a333f6fSOleksandr Tymoshenko { KEY_1, 2},
415a333f6fSOleksandr Tymoshenko { KEY_2, 3},
425a333f6fSOleksandr Tymoshenko { KEY_3, 4},
435a333f6fSOleksandr Tymoshenko { KEY_4, 5},
445a333f6fSOleksandr Tymoshenko { KEY_5, 6},
455a333f6fSOleksandr Tymoshenko { KEY_6, 7},
465a333f6fSOleksandr Tymoshenko { KEY_7, 8},
475a333f6fSOleksandr Tymoshenko { KEY_8, 9},
485a333f6fSOleksandr Tymoshenko { KEY_9, 10},
495a333f6fSOleksandr Tymoshenko { KEY_0, 11},
505a333f6fSOleksandr Tymoshenko { KEY_MINUS, 12},
515a333f6fSOleksandr Tymoshenko { KEY_EQUAL, 13},
525a333f6fSOleksandr Tymoshenko { KEY_BACKSPACE, 14},
535a333f6fSOleksandr Tymoshenko
545a333f6fSOleksandr Tymoshenko { KEY_TAB, 15},
555a333f6fSOleksandr Tymoshenko { KEY_Q, 16},
565a333f6fSOleksandr Tymoshenko { KEY_W, 17},
575a333f6fSOleksandr Tymoshenko { KEY_E, 18},
585a333f6fSOleksandr Tymoshenko { KEY_R, 19},
595a333f6fSOleksandr Tymoshenko { KEY_T, 20},
605a333f6fSOleksandr Tymoshenko { KEY_Y, 21},
615a333f6fSOleksandr Tymoshenko { KEY_U, 22},
625a333f6fSOleksandr Tymoshenko { KEY_I, 23},
635a333f6fSOleksandr Tymoshenko { KEY_O, 24},
645a333f6fSOleksandr Tymoshenko { KEY_P, 25},
655a333f6fSOleksandr Tymoshenko { KEY_LEFTBRACE, 26},
665a333f6fSOleksandr Tymoshenko { KEY_RIGHTBRACE, 27},
675a333f6fSOleksandr Tymoshenko
685a333f6fSOleksandr Tymoshenko { KEY_ENTER, 28},
695a333f6fSOleksandr Tymoshenko { KEY_LEFTCTRL, 29},
705a333f6fSOleksandr Tymoshenko { KEY_A, 30},
715a333f6fSOleksandr Tymoshenko { KEY_S, 31},
725a333f6fSOleksandr Tymoshenko { KEY_D, 32},
735a333f6fSOleksandr Tymoshenko { KEY_F, 33},
745a333f6fSOleksandr Tymoshenko { KEY_G, 34},
755a333f6fSOleksandr Tymoshenko { KEY_H, 35},
765a333f6fSOleksandr Tymoshenko { KEY_J, 36},
775a333f6fSOleksandr Tymoshenko { KEY_K, 37},
785a333f6fSOleksandr Tymoshenko { KEY_L, 38},
795a333f6fSOleksandr Tymoshenko { KEY_SEMICOLON, 39},
805a333f6fSOleksandr Tymoshenko { KEY_APOSTROPHE, 40},
815a333f6fSOleksandr Tymoshenko { KEY_GRAVE, 41},
825a333f6fSOleksandr Tymoshenko
835a333f6fSOleksandr Tymoshenko { KEY_LEFTSHIFT, 42},
845a333f6fSOleksandr Tymoshenko { KEY_BACKSLASH, 43},
855a333f6fSOleksandr Tymoshenko { KEY_Z, 44},
865a333f6fSOleksandr Tymoshenko { KEY_X, 45},
875a333f6fSOleksandr Tymoshenko { KEY_C, 46},
885a333f6fSOleksandr Tymoshenko { KEY_V, 47},
895a333f6fSOleksandr Tymoshenko { KEY_B, 48},
905a333f6fSOleksandr Tymoshenko { KEY_N, 49},
915a333f6fSOleksandr Tymoshenko { KEY_M, 50},
925a333f6fSOleksandr Tymoshenko { KEY_COMMA, 51},
935a333f6fSOleksandr Tymoshenko { KEY_DOT, 52},
945a333f6fSOleksandr Tymoshenko { KEY_SLASH, 53},
955a333f6fSOleksandr Tymoshenko { KEY_RIGHTSHIFT, 54},
965a333f6fSOleksandr Tymoshenko
975a333f6fSOleksandr Tymoshenko { KEY_LEFTALT, 56},
985a333f6fSOleksandr Tymoshenko { KEY_SPACE, 57},
995a333f6fSOleksandr Tymoshenko { KEY_CAPSLOCK, 58},
1005a333f6fSOleksandr Tymoshenko
1015a333f6fSOleksandr Tymoshenko { KEY_F1, 59},
1025a333f6fSOleksandr Tymoshenko { KEY_F2, 60},
1035a333f6fSOleksandr Tymoshenko { KEY_F3, 61},
1045a333f6fSOleksandr Tymoshenko { KEY_F4, 62},
1055a333f6fSOleksandr Tymoshenko { KEY_F5, 63},
1065a333f6fSOleksandr Tymoshenko { KEY_F6, 64},
1075a333f6fSOleksandr Tymoshenko { KEY_F7, 65},
1085a333f6fSOleksandr Tymoshenko { KEY_F8, 66},
1095a333f6fSOleksandr Tymoshenko { KEY_F9, 67},
1105a333f6fSOleksandr Tymoshenko { KEY_F10, 68},
1115a333f6fSOleksandr Tymoshenko { KEY_F11, 87},
1125a333f6fSOleksandr Tymoshenko { KEY_F12, 88},
1135a333f6fSOleksandr Tymoshenko
1145a333f6fSOleksandr Tymoshenko { KEY_RIGHTCTRL, 90},
1155a333f6fSOleksandr Tymoshenko { KEY_SYSRQ, 92},
1165a333f6fSOleksandr Tymoshenko { KEY_RIGHTALT, 93},
1175a333f6fSOleksandr Tymoshenko
1185a333f6fSOleksandr Tymoshenko { KEY_HOME, GPIOKEY_E0(71)},
1195a333f6fSOleksandr Tymoshenko { KEY_UP, GPIOKEY_E0(72)},
1205a333f6fSOleksandr Tymoshenko { KEY_PAGEUP, GPIOKEY_E0(73)},
1215a333f6fSOleksandr Tymoshenko { KEY_LEFT, GPIOKEY_E0(75)},
1225a333f6fSOleksandr Tymoshenko { KEY_RIGHT, GPIOKEY_E0(77)},
1235a333f6fSOleksandr Tymoshenko { KEY_END, GPIOKEY_E0(79)},
1245a333f6fSOleksandr Tymoshenko { KEY_DOWN, GPIOKEY_E0(80)},
1255a333f6fSOleksandr Tymoshenko { KEY_PAGEDOWN, GPIOKEY_E0(81)},
1265a333f6fSOleksandr Tymoshenko { KEY_INSERT, GPIOKEY_E0(82)},
1275a333f6fSOleksandr Tymoshenko { KEY_DELETE, GPIOKEY_E0(83)},
1285a333f6fSOleksandr Tymoshenko
1295a333f6fSOleksandr Tymoshenko { GPIOKEY_NONE, GPIOKEY_NONE}
1305a333f6fSOleksandr Tymoshenko };
1315a333f6fSOleksandr Tymoshenko
1325a333f6fSOleksandr Tymoshenko uint32_t
gpiokey_map_linux_code(uint32_t linux_code)1335a333f6fSOleksandr Tymoshenko gpiokey_map_linux_code(uint32_t linux_code)
1345a333f6fSOleksandr Tymoshenko {
1355a333f6fSOleksandr Tymoshenko int i;
1365a333f6fSOleksandr Tymoshenko
1375a333f6fSOleksandr Tymoshenko for (i = 0; gpiokeys_codes_map[i].linux_code != GPIOKEY_NONE; i++) {
1385a333f6fSOleksandr Tymoshenko if (gpiokeys_codes_map[i].linux_code == linux_code)
1395a333f6fSOleksandr Tymoshenko return (gpiokeys_codes_map[i].bsd_code);
1405a333f6fSOleksandr Tymoshenko }
1415a333f6fSOleksandr Tymoshenko
1425a333f6fSOleksandr Tymoshenko return (GPIOKEY_NONE);
1435a333f6fSOleksandr Tymoshenko }
144