提交 9536c463 编写于 作者: qiuyiuestc's avatar qiuyiuestc

add virtual key driver for QEUM/mini2440

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1020 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 e98032b2
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* Date Author Notes * Date Author Notes
* 2006-03-24 Bernard first implementation * 2006-03-24 Bernard first implementation
* 2006-05-05 Bernard add DATA_COUNT definition * 2006-05-05 Bernard add DATA_COUNT definition
* 2006-10-05 Alsor.Z for s3c2410x porting * 2006-10-05 Alsor.Z for s3c2410x porting
* 2007-11-20 Yi.Qiu add lcd,touch,console * 2007-11-20 Yi.Qiu add lcd,touch,console
*/ */
...@@ -27,16 +27,12 @@ ...@@ -27,16 +27,12 @@
/*@{*/ /*@{*/
extern rt_uint32_t PCLK, FCLK, HCLK, UCLK; extern rt_uint32_t PCLK, FCLK, HCLK, UCLK;
extern rt_uint8_t asc16_font[];
extern rt_uint16_t _rt_hw_framebuffer[];
extern void rt_hw_clock_init(void); extern void rt_hw_clock_init(void);
extern void rt_hw_lcd_init(void); extern void rt_hw_lcd_init(void);
extern void rt_hw_mmu_init(void); extern void rt_hw_mmu_init(void);
extern void rt_hw_touch_init(void); extern void rt_hw_touch_init(void);
extern void rt_hw_key_init(void);
extern void rt_kbd_init(void);
extern void rt_console_init(rt_uint8_t*, rt_uint8_t*, rt_uint8_t);
extern void rt_hw_get_clock(void); extern void rt_hw_get_clock(void);
extern void rt_hw_set_dividor(rt_uint8_t hdivn, rt_uint8_t pdivn); extern void rt_hw_set_dividor(rt_uint8_t hdivn, rt_uint8_t pdivn);
...@@ -152,6 +148,9 @@ void rt_hw_board_init() ...@@ -152,6 +148,9 @@ void rt_hw_board_init()
/* initialize uart */ /* initialize uart */
rt_hw_uart_init(); rt_hw_uart_init();
/* init virtual keypad */
rt_hw_key_init();
/* initialize mmu */ /* initialize mmu */
rt_hw_mmu_init(); rt_hw_mmu_init();
......
#include <rtthread.h> #include <rtthread.h>
#include <s3c24x0.h> #include <s3c24x0.h>
#ifdef RT_USING_RTGUI
#include <rtgui/event.h> #include <rtgui/event.h>
#include <rtgui/rtgui_server.h> #include <rtgui/rtgui_server.h>
#endif
/* static void key_handle(int key_value)
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; #ifdef RT_USING_RTGUI
struct rtgui_event_kbd kbd_event; 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 */ /* init keyboard event */
RTGUI_EVENT_KBD_INIT(&kbd_event); RTGUI_EVENT_KBD_INIT(&kbd_event);
kbd_event.mod = RTGUI_KMOD_NONE; kbd_event.mod = RTGUI_KMOD_NONE;
kbd_event.unicode = 0; kbd_event.unicode = 0;
kbd_event.key = RTGUIK_UNKNOWN;
while (1) if(key_value & 0x80)
{
kbd_event.type = RTGUI_KEYUP;
}
else
{ {
next_delay = 20;
kbd_event.key = RTGUIK_UNKNOWN;
kbd_event.type = RTGUI_KEYDOWN; kbd_event.type = RTGUI_KEYDOWN;
if ( key_enter_GETVALUE() == 0 ) }
{
rt_thread_delay(next_delay); key_value &= 0x7F;
if (key_enter_GETVALUE() == 0) switch(key_value)
{ {
/* HOME key */ case 80:
rt_kprintf("key_home\n"); kbd_event.key = RTGUIK_DOWN;
kbd_event.key = RTGUIK_HOME; break;
} case 72:
else kbd_event.key = RTGUIK_UP;
{ break;
rt_kprintf("key_enter\n"); case 77:
kbd_event.key = RTGUIK_RETURN; kbd_event.key = RTGUIK_RIGHT;
} break;
} case 75:
kbd_event.key = RTGUIK_LEFT;
if ( key_down_GETVALUE() == 0 ) break;
{ case 31:
rt_kprintf("key_down\n"); kbd_event.key = 's';
kbd_event.key = RTGUIK_DOWN; break;
} case 30:
kbd_event.key = 'a';
if ( key_up_GETVALUE() == 0 ) break;
{ case 44:
rt_kprintf("key_up\n"); kbd_event.key = 'z';
kbd_event.key = RTGUIK_UP; break;
} case 45:
kbd_event.key = 'x';
if ( key_right_GETVALUE() == 0 ) break;
{ case 46:
rt_kprintf("key_right\n"); kbd_event.key = 'c';
kbd_event.key = RTGUIK_RIGHT; break;
} case 16:
kbd_event.key = 'q';
if ( key_left_GETVALUE() == 0 ) break;
{ case 33:
rt_kprintf("key_left\n"); kbd_event.key = 'r';
kbd_event.key = RTGUIK_LEFT; break;
} case 23:
kbd_event.key = 'i';
if (kbd_event.key != RTGUIK_UNKNOWN) break;
{ case 50:
/* post down event */ kbd_event.key = 'm';
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); break;
case 38:
next_delay = 10; kbd_event.key = 'l';
/* delay to post up event */ break;
rt_thread_delay(next_delay); case 47:
kbd_event.key = 'v';
/* post up event */ break;
kbd_event.type = RTGUI_KEYUP;
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event)); default:
} break;
}
/* wait next key press */
rt_thread_delay(next_delay); if (kbd_event.key != RTGUIK_UNKNOWN)
{
/* post down event */
rtgui_server_post_event(&(kbd_event.parent), sizeof(kbd_event));
} }
#endif
} }
void rt_hw_key_init() /**
* This function is only for QEMU emulation
*/
void rt_virtual_key_isr(int vector)
{ {
#if 0 INTSUBMSK |= (BIT_SUB_RXD1);
rt_thread_t key_tid;
key_tid = rt_thread_create("key", key_handle(URXH1);
key_thread_entry, RT_NULL,
512, 30, 5); SUBSRCPND |= BIT_SUB_RXD1;
if (key_tid != RT_NULL) rt_thread_startup(key_tid);
#endif /*Unmask sub interrupt (RXD0)*/
INTSUBMSK &=~(BIT_SUB_RXD1);
} }
/**
* This function is only for QEMU emulation
*/
void rt_hw_key_init(void)
{
unsigned long i;
GPHCON |= 0xa0;
/*PULLUP is enable */
GPHUP |= 0x0c;
/* FIFO enable, Tx/Rx FIFO clear */
UFCON1 = 0x0;
/* disable the flow control */
UMCON1= 0x0;
/* Normal,No parity,1 stop,8 bit */
ULCON1 = 0x3;
/*
* tx=level,rx=edge,disable timeout int.,enable rx error int.,
* normal,interrupt or polling
*/
UCON1 = 0x245;
//UBRD0 = div;
// UBRD0 = 0x500; /* baudrate = 19200bps */
UBRD1 = 0x1a;
UTXH1 = 0x2;
URXH1 = 0x1;
/* output PCLK to UART0/1, PWMTIMER */
CLKCON |= 0x0D00;
for (i = 0; i < 100; i++);
/* install keypad isr */
INTSUBMSK &= ~(BIT_SUB_RXD1);
rt_hw_interrupt_install(INTUART1, rt_virtual_key_isr, RT_NULL);
rt_hw_interrupt_umask(INTUART1);
}
...@@ -58,25 +58,6 @@ extern struct rt_device uart0_device; ...@@ -58,25 +58,6 @@ extern struct rt_device uart0_device;
extern unsigned char __bss_end; extern unsigned char __bss_end;
#endif #endif
/**
* Fix me
*/
#if (defined (__GNUC__))
void *_sbrk (int incr)
{
static char * heap_end;
char * prev_heap_end;
if (heap_end == 0)
heap_end = & __bss_end;
prev_heap_end = heap_end;
heap_end += incr;
return (void *) prev_heap_end;
}
#endif
#ifdef RT_USING_FINSH #ifdef RT_USING_FINSH
extern void finsh_system_init(void); extern void finsh_system_init(void);
#endif #endif
...@@ -115,6 +96,11 @@ void rtthread_startup(void) ...@@ -115,6 +96,11 @@ void rtthread_startup(void)
rt_system_heap_init((void*)&__bss_end, (void*)0x33F00000); rt_system_heap_init((void*)&__bss_end, (void*)0x33F00000);
#endif #endif
#ifdef RT_USING_MODULE
/* init module system*/
rt_system_module_init();
#endif
/* init scheduler system */ /* init scheduler system */
rt_system_scheduler_init(); rt_system_scheduler_init();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册