diff --git a/bsp/mini2440/key.c b/bsp/mini2440/key.c new file mode 100644 index 0000000000..688f371dee --- /dev/null +++ b/bsp/mini2440/key.c @@ -0,0 +1,131 @@ +/* + * File : key.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2007-11-20 Yi.Qiu add rtgui application + * 2008-6-28 Bernard no rtgui init + */ + +/** + * @addtogroup mini2440 + */ +/*@{*/ + +#include +#include + +#include +#include + +/* +key_enter GPG0 +key_down GPG3 +key_up GPG5 +key_right GPG6 +key_left GPG7 +key_power GPG11 +*/ +#define key_enter_GETVALUE() (GPGDAT & (1 << 0)) +#define key_down_GETVALUE() (GPGDAT & (1 << 3)) +#define key_up_GETVALUE() (GPGDAT & (1 << 5)) +#define key_right_GETVALUE() (GPGDAT & (1 << 6)) +#define key_left_GETVALUE() (GPGDAT & (1 << 7)) +#define key_power_GETVALUE() (GPGDAT & (1 << 11)) + + +static void key_thread_entry(void *parameter) +{ + rt_time_t next_delay; + struct rtgui_event_kbd kbd_event; + + /* init gpio configuration */ + GPGCON = GPGCON & (~((3<<22)|(3<<6)|(3<<0)|(3<<10)|(3<<12)|(3<<14))) | + ((2<<22)|(2<<6)|(2<<0)|(2<<10)|(2<<12)|(2<<14)); + + /* init keyboard event */ + RTGUI_EVENT_KBD_INIT(&kbd_event); + kbd_event.mod = RTGUI_KMOD_NONE; + kbd_event.unicode = 0; + + while (1) + { + next_delay = 20; + kbd_event.key = RTGUIK_UNKNOWN; + + kbd_event.type = RTGUI_KEYDOWN; + if ( key_enter_GETVALUE() == 0 ) + { + rt_thread_delay(next_delay); + if (key_enter_GETVALUE() == 0) + { + /* HOME key */ + rt_kprintf("key_home\n"); + kbd_event.key = RTGUIK_HOME; + } + else + { + rt_kprintf("key_enter\n"); + kbd_event.key = RTGUIK_RETURN; + } + } + + if ( key_down_GETVALUE() == 0 ) + { + rt_kprintf("key_down\n"); + kbd_event.key = RTGUIK_DOWN; + } + + if ( key_up_GETVALUE() == 0 ) + { + rt_kprintf("key_up\n"); + kbd_event.key = RTGUIK_UP; + } + + if ( key_right_GETVALUE() == 0 ) + { + rt_kprintf("key_right\n"); + kbd_event.key = RTGUIK_RIGHT; + } + + if ( key_left_GETVALUE() == 0 ) + { + rt_kprintf("key_left\n"); + kbd_event.key = RTGUIK_LEFT; + } + + if (kbd_event.key != RTGUIK_UNKNOWN) + { + /* post down event */ + rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); + + next_delay = 10; + /* delay to post up event */ + rt_thread_delay(next_delay); + + /* post up event */ + kbd_event.type = RTGUI_KEYUP; + rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); + } + + /* wait next key press */ + rt_thread_delay(next_delay); + } +} + +void rt_hw_key_init() +{ + rt_thread_t key_tid; + key_tid = rt_thread_create("key", + key_thread_entry, RT_NULL, + 512, 30, 5); + if (key_tid != RT_NULL) rt_thread_startup(key_tid); +} + +/*@}*/