key.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <rtthread.h>
  2. #include <s3c24x0.h>
  3. #ifdef RT_USING_RTGUI
  4. #include <rtgui/event.h>
  5. #include <rtgui/rtgui_server.h>
  6. #endif
  7. static void key_handle(int key_value)
  8. {
  9. #ifdef RT_USING_RTGUI
  10. struct rtgui_event_kbd kbd_event;
  11. /* init keyboard event */
  12. RTGUI_EVENT_KBD_INIT(&kbd_event);
  13. kbd_event.mod = RTGUI_KMOD_NONE;
  14. kbd_event.unicode = 0;
  15. kbd_event.key = RTGUIK_UNKNOWN;
  16. if(key_value & 0x80)
  17. {
  18. kbd_event.type = RTGUI_KEYUP;
  19. }
  20. else
  21. {
  22. kbd_event.type = RTGUI_KEYDOWN;
  23. }
  24. key_value &= 0x7F;
  25. switch(key_value)
  26. {
  27. case 80:
  28. kbd_event.key = RTGUIK_DOWN;
  29. break;
  30. case 72:
  31. kbd_event.key = RTGUIK_UP;
  32. break;
  33. case 77:
  34. kbd_event.key = RTGUIK_RIGHT;
  35. break;
  36. case 75:
  37. kbd_event.key = RTGUIK_LEFT;
  38. break;
  39. case 31:
  40. kbd_event.key = 's';
  41. break;
  42. case 30:
  43. kbd_event.key = 'a';
  44. break;
  45. case 44:
  46. kbd_event.key = 'z';
  47. break;
  48. case 45:
  49. kbd_event.key = 'x';
  50. break;
  51. case 46:
  52. kbd_event.key = 'c';
  53. break;
  54. case 16:
  55. kbd_event.key = 'q';
  56. break;
  57. case 33:
  58. kbd_event.key = 'r';
  59. break;
  60. case 23:
  61. kbd_event.key = 'i';
  62. break;
  63. case 50:
  64. kbd_event.key = 'm';
  65. break;
  66. case 38:
  67. kbd_event.key = 'l';
  68. break;
  69. case 47:
  70. kbd_event.key = 'v';
  71. break;
  72. default:
  73. break;
  74. }
  75. if (kbd_event.key != RTGUIK_UNKNOWN)
  76. {
  77. /* post down event */
  78. rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
  79. }
  80. #endif
  81. }
  82. /**
  83. * This function is only for QEMU emulation
  84. */
  85. void rt_virtual_key_isr(int vector)
  86. {
  87. INTSUBMSK |= (BIT_SUB_RXD1);
  88. key_handle(URXH1);
  89. SUBSRCPND |= BIT_SUB_RXD1;
  90. /*Unmask sub interrupt (RXD0)*/
  91. INTSUBMSK &=~(BIT_SUB_RXD1);
  92. }
  93. /**
  94. * This function is only for QEMU emulation
  95. */
  96. void rt_hw_key_init(void)
  97. {
  98. unsigned long i;
  99. GPHCON |= 0xa0;
  100. /*PULLUP is enable */
  101. GPHUP |= 0x0c;
  102. /* FIFO enable, Tx/Rx FIFO clear */
  103. UFCON1 = 0x0;
  104. /* disable the flow control */
  105. UMCON1= 0x0;
  106. /* Normal,No parity,1 stop,8 bit */
  107. ULCON1 = 0x3;
  108. /*
  109. * tx=level,rx=edge,disable timeout int.,enable rx error int.,
  110. * normal,interrupt or polling
  111. */
  112. UCON1 = 0x245;
  113. //UBRD0 = div;
  114. // UBRD0 = 0x500; /* baudrate = 19200bps */
  115. UBRD1 = 0x1a;
  116. UTXH1 = 0x2;
  117. URXH1 = 0x1;
  118. /* output PCLK to UART0/1, PWMTIMER */
  119. CLKCON |= 0x0D00;
  120. for (i = 0; i < 100; i++);
  121. /* install keypad isr */
  122. INTSUBMSK &= ~(BIT_SUB_RXD1);
  123. rt_hw_interrupt_install(INTUART1, rt_virtual_key_isr, RT_NULL);
  124. rt_hw_interrupt_umask(INTUART1);
  125. }