mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-19 05:51:24 +08:00
add virtual key driver for QEUM/mini2440
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1020 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
e98032b284
commit
9536c46386
@ -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 @@
|
|||||||
/*@{*/
|
/*@{*/
|
||||||
|
|
||||||
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()
|
|||||||
/* 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();
|
||||||
|
|
||||||
|
@ -1,110 +1,146 @@
|
|||||||
#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;
|
|||||||
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)
|
|||||||
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();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user