key.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include <rtthread.h>
  2. #include <S3C24x0.h>
  3. #include <rtgui/event.h>
  4. #include <rtgui/rtgui_server.h>
  5. /*
  6. key_enter GPG0
  7. key_down GPG3
  8. key_up GPG5
  9. key_right GPG6
  10. key_left GPG7
  11. key_power GPG11
  12. */
  13. #define key_enter_GETVALUE() (GPGDAT & (1 << 0))
  14. #define key_down_GETVALUE() (GPGDAT & (1 << 3))
  15. #define key_up_GETVALUE() (GPGDAT & (1 << 5))
  16. #define key_right_GETVALUE() (GPGDAT & (1 << 6))
  17. #define key_left_GETVALUE() (GPGDAT & (1 << 7))
  18. #define key_power_GETVALUE() (GPGDAT & (1 << 11))
  19. static void key_thread_entry(void *parameter)
  20. {
  21. rt_time_t next_delay;
  22. struct rtgui_event_kbd kbd_event;
  23. /* init gpio configuration */
  24. GPGCON = GPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) |
  25. ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14));
  26. /* init keyboard event */
  27. RTGUI_EVENT_KBD_INIT(&kbd_event);
  28. kbd_event.mod = RTGUI_KMOD_NONE;
  29. kbd_event.unicode = 0;
  30. while (1)
  31. {
  32. next_delay = 20;
  33. kbd_event.key = RTGUIK_UNKNOWN;
  34. kbd_event.type = RTGUI_KEYDOWN;
  35. if ( key_enter_GETVALUE() == 0 )
  36. {
  37. rt_thread_delay(next_delay);
  38. if (key_enter_GETVALUE() == 0)
  39. {
  40. /* HOME key */
  41. rt_kprintf("key_home\n");
  42. kbd_event.key = RTGUIK_HOME;
  43. }
  44. else
  45. {
  46. rt_kprintf("key_enter\n");
  47. kbd_event.key = RTGUIK_RETURN;
  48. }
  49. }
  50. if ( key_down_GETVALUE() == 0 )
  51. {
  52. rt_kprintf("key_down\n");
  53. kbd_event.key = RTGUIK_DOWN;
  54. }
  55. if ( key_up_GETVALUE() == 0 )
  56. {
  57. rt_kprintf("key_up\n");
  58. kbd_event.key = RTGUIK_UP;
  59. }
  60. if ( key_right_GETVALUE() == 0 )
  61. {
  62. rt_kprintf("key_right\n");
  63. kbd_event.key = RTGUIK_RIGHT;
  64. }
  65. if ( key_left_GETVALUE() == 0 )
  66. {
  67. rt_kprintf("key_left\n");
  68. kbd_event.key = RTGUIK_LEFT;
  69. }
  70. if (kbd_event.key != RTGUIK_UNKNOWN)
  71. {
  72. /* post down event */
  73. rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
  74. next_delay = 10;
  75. /* delay to post up event */
  76. rt_thread_delay(next_delay);
  77. /* post up event */
  78. kbd_event.type = RTGUI_KEYUP;
  79. rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
  80. }
  81. /* wait next key press */
  82. rt_thread_delay(next_delay);
  83. }
  84. }
  85. void rt_hw_key_init()
  86. {
  87. #if 0
  88. rt_thread_t key_tid;
  89. key_tid = rt_thread_create("key",
  90. key_thread_entry, RT_NULL,
  91. 512, 30, 5);
  92. if (key_tid != RT_NULL) rt_thread_startup(key_tid);
  93. #endif
  94. }