Subversion Repositories HelenOS

Rev

Rev 1632 | Rev 1645 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Josef Cejka
  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. #include <arch/kbd.h>
  30. #include <ipc/ipc.h>
  31. #include <sysinfo.h>
  32.  
  33.  
  34. #define MSIM_KEY_F1 0x504f1bL
  35. #define MSIM_KEY_F2 0x514f1bL
  36. #define MSIM_KEY_F3 0x524f1bL
  37. #define MSIM_KEY_F4 0x534f1bL
  38. #define MSIM_KEY_F5 0x35315b1bL
  39. #define MSIM_KEY_F6 0x37315b1bL
  40. #define MSIM_KEY_F7 0x38315b1bL
  41. #define MSIM_KEY_F8 0x39315b1bL
  42. #define MSIM_KEY_F9 0x30325b1bL
  43. #define MSIM_KEY_F10 0x31325b1bL
  44. #define MSIM_KEY_F11 0x33325b1bL
  45. #define MSIM_KEY_F12 0x34325b1bL
  46.  
  47.  
  48. #define GXEMUL_KEY_F1 0x504f5b1bL
  49. #define GXEMUL_KEY_F2 0x514f5b1bL
  50. #define GXEMUL_KEY_F3 0x524f5b1bL
  51. #define GXEMUL_KEY_F4 0x534f5b1bL
  52. #define GXEMUL_KEY_F5 0x35315b1bL
  53. #define GXEMUL_KEY_F6 0x37315b1bL
  54. #define GXEMUL_KEY_F7 0x38315b1bL
  55. #define GXEMUL_KEY_F8 0x39315b1bL
  56. #define GXEMUL_KEY_F9 0x38325b1bL
  57. #define GXEMUL_KEY_F10 0x39325b1bL
  58. #define GXEMUL_KEY_F11 0x33325b1bL
  59. #define GXEMUL_KEY_F12 0x34325b1bL
  60.  
  61.  
  62. #define FUNCTION_KEYS 0x100
  63.  
  64.  
  65. irq_cmd_t msim_cmds[1] = {
  66.     { CMD_MEM_READ_1, (void *)0xB0000000, 0 }
  67. };
  68.  
  69. irq_code_t msim_kbd = {
  70.     1,
  71.     msim_cmds
  72. };
  73.  
  74. static int msim,gxemul;
  75.  
  76. int kbd_arch_init(void)
  77. {
  78.     ipc_register_irq(2, &msim_kbd);
  79.     msim=sysinfo_value("machine.msim");
  80.     gxemul=sysinfo_value("machine.lgxemul");
  81.     return 1;
  82. }
  83.  
  84.  
  85. //*
  86. //*
  87. //* Please preserve this code (it can be used to determine scancodes)
  88. //*
  89. int to_hex(int v)
  90. {
  91.         return "0123456789ABCDEF"[v];
  92. }
  93. //*/
  94.  
  95. static int kbd_arch_process_msim(keybuffer_t *keybuffer, int scan_code)
  96. {
  97.  
  98.     static unsigned long buf=0;
  99.     static int count=0;
  100.  
  101.  
  102.     //* Please preserve this code (it can be used to determine scancodes)
  103.     //*
  104.     //keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
  105.     //keybuffer_push(keybuffer, to_hex(scan_code&0xf));
  106.     //keybuffer_push(keybuffer, ' ');
  107.     //keybuffer_push(keybuffer, ' ');
  108.     //*/
  109.     //return 1;
  110.    
  111.    
  112.     if(scan_code==0x7e)
  113.     {
  114.         switch (buf){
  115.             case MSIM_KEY_F5:
  116.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 5 );
  117.                 buf=count=0;
  118.                 return 1;
  119.             case MSIM_KEY_F6:
  120.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 6 );
  121.                 buf=count=0;
  122.                 return 1;
  123.             case MSIM_KEY_F7:
  124.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 7 );
  125.                 buf=count=0;
  126.                 return 1;
  127.             case MSIM_KEY_F8:
  128.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 8 );
  129.                 buf=count=0;
  130.                 return 1;
  131.  
  132.             case MSIM_KEY_F9:
  133.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 9 );
  134.                 buf=count=0;
  135.                 return 1;
  136.             case MSIM_KEY_F10:
  137.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 10 );
  138.                 buf=count=0;
  139.                 return 1;
  140.  
  141.             case MSIM_KEY_F11:
  142.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 11 );
  143.                 buf=count=0;
  144.                 return 1;
  145.             case MSIM_KEY_F12:
  146.                 keybuffer_push(keybuffer,FUNCTION_KEYS | 12 );
  147.                 buf=count=0;
  148.                 return 1;
  149.             default:
  150.                 keybuffer_push(keybuffer, buf & 0xff );
  151.                 keybuffer_push(keybuffer, (buf >> 8) &0xff );
  152.                 keybuffer_push(keybuffer, (buf >> 16) &0xff );
  153.                 keybuffer_push(keybuffer, (buf >> 24) &0xff );
  154.                 keybuffer_push(keybuffer, scan_code );
  155.                 buf=count=0;
  156.                 return 1;
  157.    
  158.         }
  159.     }
  160.  
  161.     buf|=((unsigned long) scan_code)<<(8*(count++));
  162.    
  163.    
  164.     if((buf & 0xff)!= (MSIM_KEY_F1 & 0xff)) {
  165.  
  166.         keybuffer_push(keybuffer,buf );
  167.         buf=count=0;
  168.         return 1;
  169.     }
  170.  
  171.     if ( count <= 1 )
  172.         return 1;
  173.  
  174.     if(    (buf & 0xffff) != (MSIM_KEY_F1 & 0xffff)
  175.         && (buf & 0xffff) != (MSIM_KEY_F5 & 0xffff) ) {
  176.  
  177.         keybuffer_push(keybuffer, buf & 0xff );
  178.         keybuffer_push(keybuffer, (buf >> 8) &0xff );
  179.         buf=count=0;
  180.         return 1;
  181.     }
  182.  
  183.     if ( count <= 2)
  184.         return 1;
  185.  
  186.     switch (buf){
  187.         case MSIM_KEY_F1:
  188.             keybuffer_push(keybuffer,FUNCTION_KEYS | 1 );
  189.             buf=count=0;
  190.             return 1;
  191.         case MSIM_KEY_F2:
  192.             keybuffer_push(keybuffer,FUNCTION_KEYS | 2 );
  193.             buf=count=0;
  194.             return 1;
  195.         case MSIM_KEY_F3:
  196.             keybuffer_push(keybuffer,FUNCTION_KEYS | 3 );
  197.             buf=count=0;
  198.             return 1;
  199.         case MSIM_KEY_F4:
  200.             keybuffer_push(keybuffer,FUNCTION_KEYS | 4 );
  201.             buf=count=0;
  202.             return 1;
  203.     }
  204.  
  205.  
  206.     if(    (buf & 0xffffff) != (MSIM_KEY_F5 & 0xffffff)
  207.         && (buf & 0xffffff) != (MSIM_KEY_F9 & 0xffffff) ) {
  208.  
  209.         keybuffer_push(keybuffer, buf & 0xff );
  210.         keybuffer_push(keybuffer, (buf >> 8) &0xff );
  211.         keybuffer_push(keybuffer, (buf >> 16) &0xff );
  212.         buf=count=0;
  213.         return 1;
  214.     }
  215.  
  216.     if ( count <= 3 )
  217.         return 1;
  218.    
  219.  
  220.    
  221.    
  222.     switch (buf){
  223.         case MSIM_KEY_F5:
  224.         case MSIM_KEY_F6:
  225.         case MSIM_KEY_F7:
  226.         case MSIM_KEY_F8:
  227.         case MSIM_KEY_F9:
  228.         case MSIM_KEY_F10:
  229.         case MSIM_KEY_F11:
  230.         case MSIM_KEY_F12:
  231.             return 1;
  232.         default:
  233.             keybuffer_push(keybuffer, buf & 0xff );
  234.             keybuffer_push(keybuffer, (buf >> 8) &0xff );
  235.             keybuffer_push(keybuffer, (buf >> 16) &0xff );
  236.             keybuffer_push(keybuffer, (buf >> 24) &0xff );
  237.             buf=count=0;
  238.             return 1;
  239.        
  240.         }
  241.     return 1;
  242. }
  243.  
  244.  
  245.  
  246. static int kbd_arch_process_gxemul(keybuffer_t *keybuffer, int scan_code)
  247. {
  248.  
  249.     static unsigned long buf=0;
  250.     static int count=0;
  251.  
  252.  
  253.     //* Please preserve this code (it can be used to determine scancodes)
  254.     //*
  255.     //keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf));
  256.     //keybuffer_push(keybuffer, to_hex(scan_code&0xf));
  257.     //keybuffer_push(keybuffer, ' ');
  258.     //keybuffer_push(keybuffer, ' ');
  259.     //*/
  260.     //return 1;
  261.    
  262.    
  263.     if ( scan_code == '\r' )
  264.         scan_code = '\n' ;
  265.    
  266.     buf|=((unsigned long) scan_code)<<(8*(count++));
  267.    
  268.    
  269.     if((buf & 0xff)!= (GXEMUL_KEY_F1 & 0xff)) {
  270.  
  271.         keybuffer_push(keybuffer,buf );
  272.         buf=count=0;
  273.         return 1;
  274.     }
  275.  
  276.     if ( count <= 1 )
  277.         return 1;
  278.  
  279.     if(    (buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff)  ) {
  280.  
  281.         keybuffer_push(keybuffer, buf & 0xff );
  282.         keybuffer_push(keybuffer, (buf >> 8) &0xff );
  283.         buf=count=0;
  284.         return 1;
  285.     }
  286.  
  287.     if ( count <= 2)
  288.         return 1;
  289.  
  290.  
  291.     if(    (buf & 0xffffff) != (GXEMUL_KEY_F1 & 0xffffff)
  292.         && (buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff)
  293.         && (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff) ) {
  294.  
  295.         keybuffer_push(keybuffer, buf & 0xff );
  296.         keybuffer_push(keybuffer, (buf >> 8) &0xff );
  297.         keybuffer_push(keybuffer, (buf >> 16) &0xff );
  298.         buf=count=0;
  299.         return 1;
  300.     }
  301.  
  302.     if ( count <= 3 )
  303.         return 1;
  304.    
  305.  
  306.     switch (buf){
  307.  
  308.         case GXEMUL_KEY_F1:
  309.             keybuffer_push(keybuffer,FUNCTION_KEYS | 1 );
  310.             buf=count=0;
  311.             return 1;
  312.         case GXEMUL_KEY_F2:
  313.             keybuffer_push(keybuffer,FUNCTION_KEYS | 2 );
  314.             buf=count=0;
  315.             return 1;
  316.         case GXEMUL_KEY_F3:
  317.             keybuffer_push(keybuffer,FUNCTION_KEYS | 3 );
  318.             buf=count=0;
  319.             return 1;
  320.         case GXEMUL_KEY_F4:
  321.             keybuffer_push(keybuffer,FUNCTION_KEYS | 4 );
  322.             buf=count=0;
  323.             return 1;
  324.         case GXEMUL_KEY_F5:
  325.             keybuffer_push(keybuffer,FUNCTION_KEYS | 5 );
  326.             buf=count=0;
  327.             return 1;
  328.         case GXEMUL_KEY_F6:
  329.             keybuffer_push(keybuffer,FUNCTION_KEYS | 6 );
  330.             buf=count=0;
  331.             return 1;
  332.         case GXEMUL_KEY_F7:
  333.             keybuffer_push(keybuffer,FUNCTION_KEYS | 7 );
  334.             buf=count=0;
  335.             return 1;
  336.         case GXEMUL_KEY_F8:
  337.             keybuffer_push(keybuffer,FUNCTION_KEYS | 8 );
  338.             buf=count=0;
  339.             return 1;
  340.         case GXEMUL_KEY_F9:
  341.             keybuffer_push(keybuffer,FUNCTION_KEYS | 9 );
  342.             buf=count=0;
  343.             return 1;
  344.         case GXEMUL_KEY_F10:
  345.             keybuffer_push(keybuffer,FUNCTION_KEYS | 10 );
  346.             buf=count=0;
  347.             return 1;
  348.         case GXEMUL_KEY_F11:
  349.             keybuffer_push(keybuffer,FUNCTION_KEYS | 11 );
  350.             buf=count=0;
  351.             return 1;
  352.         case GXEMUL_KEY_F12:
  353.             keybuffer_push(keybuffer,FUNCTION_KEYS | 12 );
  354.             buf=count=0;
  355.             return 1;
  356.  
  357.         default:
  358.             keybuffer_push(keybuffer, buf & 0xff );
  359.             keybuffer_push(keybuffer, (buf >> 8) &0xff );
  360.             keybuffer_push(keybuffer, (buf >> 16) &0xff );
  361.             keybuffer_push(keybuffer, (buf >> 24) &0xff );
  362.             buf=count=0;
  363.             return 1;
  364.        
  365.         }
  366.     return 1;
  367. }
  368.  
  369. int kbd_arch_process(keybuffer_t *keybuffer, int scan_code)
  370. {
  371.     if(msim) return kbd_arch_process_msim(keybuffer, scan_code);
  372.     if(gxemul) return kbd_arch_process_gxemul(keybuffer, scan_code);
  373.  
  374.     return 0;
  375. }
  376.  
  377.