提交 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 @@
* Date Author Notes
* 2006-03-24 Bernard first implementation
* 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
*/
......@@ -27,16 +27,12 @@
/*@{*/
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_lcd_init(void);
extern void rt_hw_mmu_init(void);
extern void rt_hw_touch_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_key_init(void);
extern void rt_hw_get_clock(void);
extern void rt_hw_set_dividor(rt_uint8_t hdivn, rt_uint8_t pdivn);
......@@ -152,6 +148,9 @@ void rt_hw_board_init()
/* initialize uart */
rt_hw_uart_init();
/* init virtual keypad */
rt_hw_key_init();
/* initialize mmu */
rt_hw_mmu_init();
......
#include <rtthread.h>
#include <s3c24x0.h>
#ifdef RT_USING_RTGUI
#include <rtgui/event.h>
#include <rtgui/rtgui_server.h>
#endif
/*
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)
static void key_handle(int key_value)
{
rt_time_t next_delay;
#ifdef RT_USING_RTGUI
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;
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;
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);
}
key_value &= 0x7F;
switch(key_value)
{
case 80:
kbd_event.key = RTGUIK_DOWN;
break;
case 72:
kbd_event.key = RTGUIK_UP;
break;
case 77:
kbd_event.key = RTGUIK_RIGHT;
break;
case 75:
kbd_event.key = RTGUIK_LEFT;
break;
case 31:
kbd_event.key = 's';
break;
case 30:
kbd_event.key = 'a';
break;
case 44:
kbd_event.key = 'z';
break;
case 45:
kbd_event.key = 'x';
break;
case 46:
kbd_event.key = 'c';
break;
case 16:
kbd_event.key = 'q';
break;
case 33:
kbd_event.key = 'r';
break;
case 23:
kbd_event.key = 'i';
break;
case 50:
kbd_event.key = 'm';
break;
case 38:
kbd_event.key = 'l';
break;
case 47:
kbd_event.key = 'v';
break;
default:
break;
}
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
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);
#endif
INTSUBMSK |= (BIT_SUB_RXD1);
key_handle(URXH1);
SUBSRCPND |= BIT_SUB_RXD1;
/*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;
extern unsigned char __bss_end;
#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
extern void finsh_system_init(void);
#endif
......@@ -115,6 +96,11 @@ void rtthread_startup(void)
rt_system_heap_init((void*)&__bss_end, (void*)0x33F00000);
#endif
#ifdef RT_USING_MODULE
/* init module system*/
rt_system_module_init();
#endif
/* init scheduler system */
rt_system_scheduler_init();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册