Subversion Repositories HelenOS

Rev

Rev 4346 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2009 Jiri Svoboda
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  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 WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup kbd_ctl
  30.  * @ingroup kbd
  31.  * @{
  32.  */
  33. /**
  34.  * @file
  35.  * @brief   Serial TTY-like keyboard controller driver.
  36.  */
  37.  
  38. #include <kbd.h>
  39. #include <io/keycode.h>
  40. #include <kbd_ctl.h>
  41. #include <gsp.h>
  42. #include <stroke.h>
  43.  
  44. /** Scancode parser */
  45. static gsp_t sp;
  46.  
  47. /** Current parser state */
  48. static int ds;
  49.  
  50. #include <stdio.h>
  51.  
  52. int seq_defs[] = {
  53.     /* Not shifted */
  54.  
  55.     0,  KC_BACKTICK,    0x60, GSP_END,
  56.  
  57.     0,  KC_1,       0x31, GSP_END,
  58.     0,  KC_2,       0x32, GSP_END,
  59.     0,  KC_3,       0x33, GSP_END,
  60.     0,  KC_4,       0x34, GSP_END,
  61.     0,  KC_5,       0x35, GSP_END,
  62.     0,  KC_6,       0x36, GSP_END,
  63.     0,  KC_7,       0x37, GSP_END,
  64.     0,  KC_8,       0x38, GSP_END,
  65.     0,  KC_9,       0x39, GSP_END,
  66.     0,  KC_0,       0x30, GSP_END,
  67.  
  68.     0,  KC_MINUS,   0x2d, GSP_END,
  69.     0,  KC_EQUALS,  0x3d, GSP_END,
  70.     0,  KC_BACKSPACE,   0x08, GSP_END,
  71.  
  72.     0,  KC_TAB,     0x09, GSP_END,
  73.  
  74.     0,  KC_Q,       0x71, GSP_END,
  75.     0,  KC_W,       0x77, GSP_END,
  76.     0,  KC_E,       0x65, GSP_END,
  77.     0,  KC_R,       0x72, GSP_END,
  78.     0,  KC_T,       0x74, GSP_END,
  79.     0,  KC_Y,       0x79, GSP_END,
  80.     0,  KC_U,       0x75, GSP_END,
  81.     0,  KC_I,       0x69, GSP_END,
  82.     0,  KC_O,       0x6f, GSP_END,
  83.     0,  KC_P,       0x70, GSP_END,
  84.  
  85.     0,  KC_LBRACKET,    0x5b, GSP_END,
  86.     0,  KC_RBRACKET,    0x5d, GSP_END,
  87.  
  88.     0,  KC_A,       0x61, GSP_END,
  89.     0,  KC_S,       0x73, GSP_END,
  90.     0,  KC_D,       0x64, GSP_END,
  91.     0,  KC_F,       0x66, GSP_END,
  92.     0,  KC_G,       0x67, GSP_END,
  93.     0,  KC_H,       0x68, GSP_END,
  94.     0,  KC_J,       0x6a, GSP_END,
  95.     0,  KC_K,       0x6b, GSP_END,
  96.     0,  KC_L,       0x6c, GSP_END,
  97.  
  98.     0,  KC_SEMICOLON,   0x3b, GSP_END,
  99.     0,  KC_QUOTE,   0x27, GSP_END,
  100.     0,  KC_BACKSLASH,   0x5c, GSP_END,
  101.  
  102.     0,  KC_Z,       0x7a, GSP_END,
  103.     0,  KC_X,       0x78, GSP_END,
  104.     0,  KC_C,       0x63, GSP_END,
  105.     0,  KC_V,       0x76, GSP_END,
  106.     0,  KC_B,       0x62, GSP_END,
  107.     0,  KC_N,       0x6e, GSP_END,
  108.     0,  KC_M,       0x6d, GSP_END,
  109.  
  110.     0,  KC_COMMA,   0x2c, GSP_END,
  111.     0,  KC_PERIOD,  0x2e, GSP_END,
  112.     0,  KC_SLASH,   0x2f, GSP_END,
  113.  
  114.     /* Shifted */
  115.  
  116.     KM_SHIFT,   KC_BACKTICK,    0x7e, GSP_END,
  117.  
  118.     KM_SHIFT,   KC_1,       0x21, GSP_END,
  119.     KM_SHIFT,   KC_2,       0x40, GSP_END,
  120.     KM_SHIFT,   KC_3,       0x23, GSP_END,
  121.     KM_SHIFT,   KC_4,       0x24, GSP_END,
  122.     KM_SHIFT,   KC_5,       0x25, GSP_END,
  123.     KM_SHIFT,   KC_6,       0x5e, GSP_END,
  124.     KM_SHIFT,   KC_7,       0x26, GSP_END,
  125.     KM_SHIFT,   KC_8,       0x2a, GSP_END,
  126.     KM_SHIFT,   KC_9,       0x28, GSP_END,
  127.     KM_SHIFT,   KC_0,       0x29, GSP_END,
  128.  
  129.     KM_SHIFT,   KC_MINUS,   0x5f, GSP_END,
  130.     KM_SHIFT,   KC_EQUALS,  0x2b, GSP_END,
  131.  
  132.     KM_SHIFT,   KC_Q,       0x51, GSP_END,
  133.     KM_SHIFT,   KC_W,       0x57, GSP_END,
  134.     KM_SHIFT,   KC_E,       0x45, GSP_END,
  135.     KM_SHIFT,   KC_R,       0x52, GSP_END,
  136.     KM_SHIFT,   KC_T,       0x54, GSP_END,
  137.     KM_SHIFT,   KC_Y,       0x59, GSP_END,
  138.     KM_SHIFT,   KC_U,       0x55, GSP_END,
  139.     KM_SHIFT,   KC_I,       0x49, GSP_END,
  140.     KM_SHIFT,   KC_O,       0x4f, GSP_END,
  141.     KM_SHIFT,   KC_P,       0x50, GSP_END,
  142.  
  143.     KM_SHIFT,   KC_LBRACKET,    0x7b, GSP_END,
  144.     KM_SHIFT,   KC_RBRACKET,    0x7d, GSP_END,
  145.  
  146.     KM_SHIFT,   KC_A,       0x41, GSP_END,
  147.     KM_SHIFT,   KC_S,       0x53, GSP_END,
  148.     KM_SHIFT,   KC_D,       0x44, GSP_END,
  149.     KM_SHIFT,   KC_F,       0x46, GSP_END,
  150.     KM_SHIFT,   KC_G,       0x47, GSP_END,
  151.     KM_SHIFT,   KC_H,       0x48, GSP_END,
  152.     KM_SHIFT,   KC_J,       0x4a, GSP_END,
  153.     KM_SHIFT,   KC_K,       0x4b, GSP_END,
  154.     KM_SHIFT,   KC_L,       0x4c, GSP_END,
  155.  
  156.     KM_SHIFT,   KC_SEMICOLON,   0x3a, GSP_END,
  157.     KM_SHIFT,   KC_QUOTE,   0x22, GSP_END,
  158.     KM_SHIFT,   KC_BACKSLASH,   0x7c, GSP_END,
  159.  
  160.     KM_SHIFT,   KC_Z,       0x5a, GSP_END,
  161.     KM_SHIFT,   KC_X,       0x58, GSP_END,
  162.     KM_SHIFT,   KC_C,       0x43, GSP_END,
  163.     KM_SHIFT,   KC_V,       0x56, GSP_END,
  164.     KM_SHIFT,   KC_B,       0x42, GSP_END,
  165.     KM_SHIFT,   KC_N,       0x4e, GSP_END,
  166.     KM_SHIFT,   KC_M,       0x4d, GSP_END,
  167.  
  168.     KM_SHIFT,   KC_COMMA,   0x3c, GSP_END,
  169.     KM_SHIFT,   KC_PERIOD,  0x3e, GSP_END,
  170.     KM_SHIFT,   KC_SLASH,   0x3f, GSP_END,
  171.  
  172.     /* ... */
  173.  
  174.     0,  KC_SPACE,   0x20, GSP_END,
  175.     0,  KC_ENTER,   0x0a, GSP_END,
  176.     0,  KC_ENTER,   0x0d, GSP_END,
  177.  
  178.     0,  KC_ESCAPE,  0x1b, 0x1b, GSP_END,
  179.  
  180.     0,  KC_F1,      0x1b, 0x4f, 0x50, GSP_END,
  181.     0,  KC_F2,      0x1b, 0x4f, 0x51, GSP_END,
  182.     0,  KC_F3,      0x1b, 0x4f, 0x52, GSP_END,
  183.     0,  KC_F4,      0x1b, 0x4f, 0x53, GSP_END,
  184.     0,  KC_F5,      0x1b, 0x5b, 0x31, 0x35, 0x7e, GSP_END,
  185.     0,  KC_F6,      0x1b, 0x5b, 0x31, 0x37, 0x7e, GSP_END,
  186.     0,  KC_F7,      0x1b, 0x5b, 0x31, 0x38, 0x7e, GSP_END,
  187.     0,  KC_F8,      0x1b, 0x5b, 0x31, 0x39, 0x7e, GSP_END,
  188.     0,  KC_F9,      0x1b, 0x5b, 0x32, 0x30, 0x7e, GSP_END,
  189.     0,  KC_F10,     0x1b, 0x5b, 0x32, 0x31, 0x7e, GSP_END,
  190.     0,  KC_F11,     0x1b, 0x5b, 0x32, 0x33, 0x7e, GSP_END,
  191.     0,  KC_F12,     0x1b, 0x5b, 0x32, 0x34, 0x7e, GSP_END,
  192.  
  193.     0,  KC_INSERT,  0x1b, 0x5b, 0x32, 0x7e, GSP_END,
  194.     0,  KC_HOME,    0x1b, 0x5b, 0x48, GSP_END,
  195.     0,  KC_PAGE_UP, 0x1b, 0x5b, 0x35, 0x7e, GSP_END,
  196.     0,  KC_DELETE,  0x1b, 0x5b, 0x33, 0x7e, GSP_END,
  197.     0,  KC_END,     0x1b, 0x5b, 0x46, GSP_END,
  198.     0,  KC_PAGE_DOWN,   0x1b, 0x5b, 0x36, 0x7e, GSP_END,
  199.  
  200.     0,  KC_UP,      0x1b, 0x5b, 0x41, GSP_END,
  201.     0,  KC_LEFT,    0x1b, 0x5b, 0x44, GSP_END,
  202.     0,  KC_DOWN,    0x1b, 0x5b, 0x42, GSP_END,
  203.     0,  KC_RIGHT,   0x1b, 0x5b, 0x43, GSP_END,
  204.  
  205.     0,  0
  206. };
  207.  
  208. int kbd_ctl_init(void)
  209. {
  210.     ds = 0;
  211.  
  212.     gsp_init(&sp);
  213.     return gsp_insert_defs(&sp, seq_defs);
  214. }
  215.  
  216. void kbd_ctl_parse_scancode(int scancode)
  217. {
  218.     unsigned mods, key;
  219.  
  220.     ds = gsp_step(&sp, ds, scancode, &mods, &key);
  221.     if (key != 0) {
  222.         stroke_sim(mods, key);
  223.     }
  224. }
  225.  
  226. /**
  227.  * @}
  228.  */
  229.