Browse Source

update Fujitsu FM3 easy kit IAR project:
add LCD/ADC/KEY/LED device support
using RTGUI to display the ADC and key status on the 128x64 LCD

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1317 bbd45198-f89e-11dd-88c7-29a3b14d5316

dzzxzz 14 years ago
parent
commit
c4b51ff718
12 changed files with 1282 additions and 72 deletions
  1. 23 10
      bsp/fm3/application.c
  2. 0 47
      bsp/fm3/board.c
  3. 1 15
      bsp/fm3/board.h
  4. 205 0
      bsp/fm3/fm3_easy_kit.ewp
  5. 174 0
      bsp/fm3/info.c
  6. 110 0
      bsp/fm3/key.c
  7. 46 0
      bsp/fm3/key.h
  8. 356 0
      bsp/fm3/lcd.c
  9. 167 0
      bsp/fm3/lcd.h
  10. 135 0
      bsp/fm3/led.c
  11. 41 0
      bsp/fm3/led.h
  12. 24 0
      bsp/fm3/rtconfig.h

+ 23 - 10
bsp/fm3/application.c

@@ -19,18 +19,31 @@
 
 
 #include <rtthread.h>
 #include <rtthread.h>
 #include "board.h"
 #include "board.h"
+#include "led.h"
+
+#ifdef RT_USING_RTGUI
+#include "key.h"
+#include "adc.h"
+#include "lcd.h"
+#include <rtgui/rtgui.h>
+extern void rtgui_startup();
+#endif
 
 
 void rt_init_thread_entry(void *parameter)
 void rt_init_thread_entry(void *parameter)
 {
 {
-    while(1)
-    {
-        rt_hw_led_on(LED1);
-        rt_hw_led_off(LED2);
-        rt_thread_delay(100);        
-        rt_hw_led_off(LED1);
-        rt_hw_led_on(LED2);
-        rt_thread_delay(100);
-    }
+	rt_hw_led_init();
+
+#ifdef RT_USING_RTGUI
+	rt_hw_key_init();
+	rt_hw_adc_init();
+	rt_hw_lcd_init();      
+    
+	/* re-init device driver */
+	rt_device_init_all();
+
+	/* startup rtgui */
+	rtgui_startup();
+#endif
 }
 }
 
 
 int rt_application_init()
 int rt_application_init()
@@ -40,7 +53,7 @@ int rt_application_init()
     init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 21, 20);
     init_thread = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 1024, 21, 20);
     if(init_thread != RT_NULL)
     if(init_thread != RT_NULL)
         rt_thread_startup(init_thread);
         rt_thread_startup(init_thread);
-
+    
     return 0;
     return 0;
 }
 }
 
 

+ 0 - 47
bsp/fm3/board.c

@@ -42,58 +42,11 @@ void rt_hw_timer_handler(void)
 	rt_interrupt_leave();
 	rt_interrupt_leave();
 }
 }
 
 
-void led_init(void)
-{
-    /*Select CPIO function*/
-    LED_PFR &= ~LED_MASK;
-    /*Set Pin to turn off leds*/
-    LED_PDOR |= LED_MASK;
-    /*Make led pins outputs*/
-    LED_DDR |= LED_MASK;
-}
-
-void rt_hw_led_on(int n)
-{
-    switch(n)
-    {
-        case LED1:
-            LED_PDOR &= ~LED1;
-        break;
-        case LED2:
-            LED_PDOR &= ~LED2;
-        break;
-        case LED3:
-            LED_PDOR &= ~LED3;        
-        break;
-        default:
-        break;
-    }
-}
-
-void rt_hw_led_off(int n)
-{
-    switch(n)
-    {
-        case LED1:
-            LED_PDOR |= LED1;
-        break;
-        case LED2:
-            LED_PDOR |= LED2;
-        break;
-        case LED3:
-            LED_PDOR |= LED3;        
-        break;
-        default:
-        break;
-    }
-}
-
 /**
 /**
 * This function will initial FM3 Easy Kit board.
 * This function will initial FM3 Easy Kit board.
  */
  */
 void rt_hw_board_init()
 void rt_hw_board_init()
 {
 {
-    led_init();
     /* init systick */
     /* init systick */
     SysTick_Config(SystemFrequency/RT_TICK_PER_SECOND - 1);
     SysTick_Config(SystemFrequency/RT_TICK_PER_SECOND - 1);
 }
 }

+ 1 - 15
bsp/fm3/board.h

@@ -10,24 +10,12 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2009-09-22     Bernard      add board.h to this bsp
  * 2009-09-22     Bernard      add board.h to this bsp
- * 2010-02-04     Magicoe      add board.h to LPC176x bsp
+ * 2011-03-04     lgnq         add board.h to FM3 bsp
  */
  */
 
 
 #ifndef __BOARD_H__
 #ifndef __BOARD_H__
 #define __BOARD_H__
 #define __BOARD_H__
 
 
-#include "mb9bf506r.h"
-
-/*LEDs*/
-#define LED1        (1UL<<10)
-#define LED2        (1UL<<11)
-#define LED3        (1UL<<12)
-#define LED_MASK    (LED1 | LED2 | LED3)
-
-#define LED_PFR     (FM3_GPIO->PFR3)
-#define LED_DDR     (FM3_GPIO->DDR3)
-#define LED_PDOR    (FM3_GPIO->PDOR3)
-
 //Internal SRAM memory size[Kbytes] <8-64>
 //Internal SRAM memory size[Kbytes] <8-64>
 //MB9BF500 : 32
 //MB9BF500 : 32
 //MB9BF504 : 32
 //MB9BF504 : 32
@@ -36,8 +24,6 @@
 #define FM3_SRAM_SIZE         32
 #define FM3_SRAM_SIZE         32
 #define FM3_SRAM_END          (0x1FFFC000 + FM3_SRAM_SIZE * 1024)
 #define FM3_SRAM_END          (0x1FFFC000 + FM3_SRAM_SIZE * 1024)
 
 
-void rt_hw_led_on(int n);
-void rt_hw_led_off(int n);
 void rt_hw_board_init(void);
 void rt_hw_board_init(void);
 
 
 #endif
 #endif

+ 205 - 0
bsp/fm3/fm3_easy_kit.ewp

@@ -278,6 +278,7 @@
           <state>$PROJ_DIR$\</state>
           <state>$PROJ_DIR$\</state>
           <state>$PROJ_DIR$\CMSIS</state>
           <state>$PROJ_DIR$\CMSIS</state>
           <state>$PROJ_DIR$\..\..\include</state>
           <state>$PROJ_DIR$\..\..\include</state>
+          <state>$PROJ_DIR$\..\..\components\rtgui\include</state>
         </option>
         </option>
         <option>
         <option>
           <name>CCStdIncCheck</name>
           <name>CCStdIncCheck</name>
@@ -1788,14 +1789,218 @@
       <name>$PROJ_DIR$\..\..\src\timer.c</name>
       <name>$PROJ_DIR$\..\..\src\timer.c</name>
     </file>
     </file>
   </group>
   </group>
+  <group>
+    <name>Rtgui</name>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\about_view.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\asc12font.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\asc16font.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\blit.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\box.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\button.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\checkbox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\color.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\combobox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\container.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\dc.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\dc_buffer.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\dc_client.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\dc_hw.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\driver.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\filelist_view.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\filerw.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\font.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\font_bmp.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\font_freetype.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\font_hz_bmp.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\font_hz_file.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\hz12font.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\hz16font.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\iconbox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_bmp.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_container.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_hdc.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_jpg.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_png.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\image_xpm.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\label.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\list_view.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\listbox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\listctrl.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\menu.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\mouse.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\mouse.h</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\notebook.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\panel.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\panel.h</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\progressbar.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\radiobox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\region.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\rtgui_object.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\rtgui_system.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\rtgui_theme.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\common\rtgui_xml.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\scrollbar.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\server.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\slider.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\staticline.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\textbox.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\title.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\toplevel.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\topwin.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\server\topwin.h</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\view.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\widget.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\window.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\..\..\components\rtgui\widgets\workbench.c</name>
+    </file>
+  </group>
   <group>
   <group>
     <name>Startup</name>
     <name>Startup</name>
+    <file>
+      <name>$PROJ_DIR$\adc.c</name>
+    </file>
     <file>
     <file>
       <name>$PROJ_DIR$\application.c</name>
       <name>$PROJ_DIR$\application.c</name>
     </file>
     </file>
     <file>
     <file>
       <name>$PROJ_DIR$\board.c</name>
       <name>$PROJ_DIR$\board.c</name>
     </file>
     </file>
+    <file>
+      <name>$PROJ_DIR$\info.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\key.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\lcd.c</name>
+    </file>
+    <file>
+      <name>$PROJ_DIR$\led.c</name>
+    </file>
     <file>
     <file>
       <name>$PROJ_DIR$\startup.c</name>
       <name>$PROJ_DIR$\startup.c</name>
     </file>
     </file>

+ 174 - 0
bsp/fm3/info.c

@@ -0,0 +1,174 @@
+#include <rtgui/rtgui.h>
+#include <rtgui/rtgui_server.h>
+#include <rtgui/rtgui_system.h>
+
+#include <rtgui/widgets/view.h>
+#include <rtgui/widgets/workbench.h>
+
+#include "adc.h"
+#include <rtthread.h>
+
+extern rt_uint16_t adc_value;
+
+static rt_bool_t view_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
+{
+	if(event->type == RTGUI_EVENT_PAINT)
+	{
+		struct rtgui_dc* dc;
+		struct rtgui_rect rect;
+
+		dc = rtgui_dc_begin_drawing(widget);
+		if(dc == RT_NULL) 
+            return RT_FALSE;
+		rtgui_widget_get_rect(widget, &rect);
+
+		rtgui_dc_fill_rect(dc, &rect);
+		rect.x2 -= 1; rect.y2 -= 1;
+		rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
+		rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
+
+		rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2);
+		rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2 + 1);
+        
+        /* shrink border */
+		rtgui_rect_inflate(&rect, -1);
+        
+		/* draw text */
+        rtgui_widget_get_rect(widget, &rect);
+        rect.x1 += 1;
+        rect.y1 += 1;        
+		rtgui_dc_draw_text(dc, "FM3 Easy Kit Demo", &rect);
+        rect.y1 += 10;
+        rtgui_dc_draw_text(dc, "[rt-thread/RTGUI]", &rect);
+        
+		rtgui_dc_end_drawing(dc);
+
+		return RT_FALSE;
+	}
+    else if(event->type == RTGUI_EVENT_KBD)
+    {
+        struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*)event;
+        if(ekbd->type == RTGUI_KEYDOWN)
+        {
+            char key_str[16];
+            struct rtgui_dc* dc;
+            struct rtgui_rect rect;
+
+            switch(ekbd->key)
+            {
+                case RTGUIK_LEFT:
+                rt_sprintf(key_str, "KEY = %s", "LEFT");
+                break;
+                case RTGUIK_RIGHT:
+                rt_sprintf(key_str, "KEY = %s", "RIGHT");
+                break;
+                case RTGUIK_DOWN:
+                rt_sprintf(key_str, "KEY = %s", "DOWN");
+                break;
+                case RTGUIK_UP:
+                rt_sprintf(key_str, "KEY = %s", "UP");
+                break;                
+                default:
+                rt_sprintf(key_str, "KEY = %s", "UNKNOWN");
+                break;
+            }
+            dc = rtgui_dc_begin_drawing(widget);
+            if(dc == RT_NULL) 
+                return RT_FALSE;
+            rect.x1 = 10;
+            rect.y1 = 30;  
+            rect.x2 = 120;
+            rect.y2 = 40;       
+            rtgui_dc_fill_rect(dc, &rect);
+            rtgui_dc_draw_text(dc, key_str, &rect);
+            rtgui_dc_end_drawing(dc);
+        }
+    }
+    else if(event->type == RTGUI_EVENT_COMMAND)
+    {
+        char adc_str[10];
+        struct rtgui_dc* dc;
+        struct rtgui_rect rect;
+        dc = rtgui_dc_begin_drawing(widget);
+        if(dc == RT_NULL) 
+            return RT_FALSE;
+            
+        struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;
+        switch(ecmd->command_id)
+        {   
+            case ADC_UPDATE:
+            rect.x1 = 10;
+            rect.y1 = 40;  
+            rect.x2 = 120;
+            rect.y2 = 50;       
+            rtgui_dc_fill_rect(dc, &rect);     
+			rt_sprintf(adc_str, "ADC = %d mv", adc_value);
+			rtgui_dc_draw_text(dc, adc_str, &rect);	
+            rtgui_dc_end_drawing(dc);
+        }
+    }
+
+	return rtgui_view_event_handler(widget, event);
+}
+
+static void info_entry(void* parameter)
+{
+	rt_mq_t mq;
+	struct rtgui_view* view;
+	struct rtgui_workbench* workbench;
+
+	mq = rt_mq_create("qInfo", 256, 4, RT_IPC_FLAG_FIFO);
+	rtgui_thread_register(rt_thread_self(), mq);
+
+	workbench = rtgui_workbench_create("info", "workbench");
+	if(workbench == RT_NULL) 
+        return;
+
+	view = rtgui_view_create("view");
+	RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(view)) = white;
+    RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(view)) = black;
+	rtgui_widget_set_event_handler(RTGUI_WIDGET(view), view_event_handler);
+
+	rtgui_workbench_add_view(workbench, view);
+    /* this view can be focused */
+    RTGUI_WIDGET(view)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
+    /* set widget focus */
+    rtgui_widget_focus(RTGUI_WIDGET(view));    
+
+	rtgui_view_show(view, RT_FALSE);
+
+	rtgui_workbench_event_loop(workbench);
+
+	rtgui_thread_deregister(rt_thread_self());
+	rt_mq_delete(mq);
+}
+
+rt_thread_t info_tid;
+void info_init()
+{
+    info_tid = rt_thread_create("info",
+        info_entry, RT_NULL,
+        2048, 26, 10);
+
+    if (info_tid != RT_NULL) rt_thread_startup(info_tid);
+}
+
+void rtgui_startup()
+{
+    rtgui_rect_t rect;
+    
+	/* GUIϵͳ³õʼ»¯ */
+    rtgui_system_server_init();
+        
+    /* register dock panel */
+    rect.x1 = 0;
+    rect.y1 = 0;
+    rect.x2 = 128;
+    rect.y2 = 64;
+    rtgui_panel_register("info", &rect);
+    rtgui_panel_set_default_focused("info");
+    
+	/* Æô¶¯info workbench */
+	info_init();
+}
+

+ 110 - 0
bsp/fm3/key.c

@@ -0,0 +1,110 @@
+#include <rtthread.h>
+#include "key.h"
+
+#include <rtgui/event.h>
+#include <rtgui/rtgui_server.h>
+
+static void key_io_init(void)
+{
+    /*Select CPIO function*/
+    KEY_PFR &= ~KEY_MASK;
+	/*Set CPIO Pull-Up function*/
+    KEY_PCR |= KEY_MASK;
+    /*Make button pins inputs*/
+    KEY_DDR &= ~KEY_MASK;
+}
+
+static void key_thread_entry(void *parameter)
+{
+    rt_time_t next_delay;
+    struct rtgui_event_kbd kbd_event;
+    rt_uint8_t i;
+    
+    key_io_init();
+
+    /* init keyboard event */
+    RTGUI_EVENT_KBD_INIT(&kbd_event);
+    kbd_event.mod  = RTGUI_KMOD_NONE;
+    kbd_event.unicode = 0;
+
+    while (1)
+    {
+        next_delay = RT_TICK_PER_SECOND/10;
+        kbd_event.key = RTGUIK_UNKNOWN;
+        kbd_event.type = RTGUI_KEYDOWN;
+
+        if(KEY_ENTER_GETVALUE() == 0 )
+        {
+            for(i=0; ; i++)
+            {
+                rt_thread_delay( next_delay );
+                if (KEY_ENTER_GETVALUE() == 0)
+                {
+                    if(i>=4)
+                    {
+                        /* HOME key */
+                        //rt_kprintf("key_home\n");
+                        kbd_event.key  = RTGUIK_HOME;
+                        next_delay = RT_TICK_PER_SECOND/5;
+                        break;
+                    }
+                }
+                else
+                {
+                    //rt_kprintf("key_enter\n");
+                    kbd_event.key  = RTGUIK_RETURN;
+                    break;
+                }
+            }
+        }
+
+        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 = RT_TICK_PER_SECOND/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);
+    }
+}
+
+static rt_thread_t key_thread;
+void rt_hw_key_init(void)
+{
+    key_thread = rt_thread_create("key", key_thread_entry, RT_NULL, 384, 30, 5);
+    if(key_thread != RT_NULL) 
+        rt_thread_startup(key_thread);
+}

+ 46 - 0
bsp/fm3/key.h

@@ -0,0 +1,46 @@
+/*
+ * File      : key.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2011, RT-Thread Develop 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
+ * 2011-03-06     lgnq
+ */
+#ifndef __KEY_H__
+#define __KEY_H__
+
+#include "mb9bf506r.h"
+
+#define KEY_DOWN      (1<<0)
+#define KEY_ENTER     (1<<1)
+#define KEY_LEFT      (1<<2)
+#define KEY_RIGHT     (1<<3)
+#define KEY_UP        (1<<4)
+
+#define KEY_MASK        (KEY_DOWN | KEY_ENTER | KEY_LEFT | KEY_RIGHT | KEY_UP)
+#define KEY_PFR         (FM3_GPIO->PFR7)
+#define KEY_PCR         (FM3_GPIO->PCR7)
+#define KEY_PDIR        (FM3_GPIO->PDIR7)
+#define KEY_DDR         (FM3_GPIO->DDR7)
+
+#define RT_DEVICE_CTRL_KEY_SCAN   0
+#define RT_DEVICE_CTRL_KEY_STATUS 1
+
+#define SET_BIT(byte, bit)      ((byte) |= (1<<(bit)))
+#define CLR_BIT(byte, bit)      ((byte) &= ~(1<<(bit)))
+#define TST_BIT(byte, bit)      (((byte) & (1<<(bit)))?1:0)
+
+#define KEY_ENTER_GETVALUE()  TST_BIT(KEY_PDIR, 1)
+#define KEY_DOWN_GETVALUE()   TST_BIT(KEY_PDIR, 0)
+#define KEY_UP_GETVALUE()     TST_BIT(KEY_PDIR, 4)
+#define KEY_RIGHT_GETVALUE()  TST_BIT(KEY_PDIR, 3)
+#define KEY_LEFT_GETVALUE()   TST_BIT(KEY_PDIR, 2)
+
+void rt_hw_key_init(void);
+
+#endif

+ 356 - 0
bsp/fm3/lcd.c

@@ -0,0 +1,356 @@
+/*
+ * File      : lcd.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2011, RT-Thread Develop 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
+ * 2011-03-05     lgnq         ZYMG12864C3 LCD driver
+ */
+
+#include <rtthread.h>
+#include "lcd.h"
+
+static rt_uint8_t gui_disp_buf[GUI_LCM_YMAX/8][GUI_LCM_XMAX];
+
+struct rtgui_lcd_device
+{
+    struct rt_device parent;
+
+    /* screen width and height */
+    rt_uint16_t width;
+    rt_uint16_t height;
+
+    void* hw_framebuffer;
+};
+static struct rtgui_lcd_device *lcd = RT_NULL;
+
+void Power_Delay(void)
+{
+    rt_uint32_t i=0x4ffff;
+    while(i--)
+        ;//asm("nop");
+}
+
+void Delay(void)
+{
+    rt_uint8_t i=0x8;
+    while(i--)
+        ;//asm("nop");
+}
+
+void Reset_Delay(void)
+{
+    rt_uint8_t i=0xff;
+    while(i--)
+        ;//asm("nop");
+}
+
+void LCD_WriteCmd(unsigned char command)
+{
+    rt_uint8_t i;
+
+    LCD_PS_LOW();
+    LCD_CS_LOW();
+    LCD_CD_LOW();
+    for(i=0; i<8; i++)
+    {
+        if(command & (0x80 >> i))
+            LCD_DATA_HIGH();
+        else
+            LCD_DATA_LOW();
+            
+        LCD_CLK_LOW();
+        Delay();
+        LCD_CLK_HIGH();
+        Delay();
+    }
+    LCD_CS_HIGH();
+}
+
+void LCD_WriteData(unsigned char data)
+{
+    rt_uint8_t i;
+
+    LCD_PS_LOW();
+    LCD_CS_LOW();
+    LCD_CD_HIGH();
+    for(i=0; i<8; i++)
+    {
+        if(data & (0x80 >> i))
+            LCD_DATA_HIGH();
+        else
+            LCD_DATA_LOW();
+        
+        LCD_CLK_LOW();
+        Delay();
+        LCD_CLK_HIGH();
+        Delay();
+    }
+    LCD_CS_HIGH();
+}
+
+#ifdef RT_USING_RTGUI
+#include <rtgui/driver.h>
+#include <rtgui/color.h>
+
+static void rt_hw_lcd_update(rtgui_rect_t *rect)
+{
+    rt_uint8_t i,j = GUI_LCM_XMAX;
+    rt_uint8_t* p = (rt_uint8_t*)gui_disp_buf;  
+    
+    for(i=0; i<GUI_LCM_PAGE; i++)
+    { 
+        LCD_WriteCmd(Set_Page_Addr_0|i);    
+        LCD_WriteCmd(Set_ColH_Addr_0);        
+        LCD_WriteCmd(Set_ColL_Addr_0);
+        j = GUI_LCM_XMAX;
+        while(j--)
+        {
+            LCD_WriteData(*p++);
+            Delay();
+        }
+    }
+}
+
+static rt_uint8_t * rt_hw_lcd_get_framebuffer(void)
+{
+    return(rt_uint8_t *)gui_disp_buf;
+}
+
+static void rt_hw_lcd_set_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
+{
+    rt_uint8_t page;
+    page = y/8;
+
+    if(*c == black)
+        gui_disp_buf[page][x] |= 1<<(y%8);
+    else 
+        if(*c == white)
+            gui_disp_buf[page][x] &= ~(1<<(y%8));
+}
+
+static void rt_hw_lcd_get_pixel(rtgui_color_t *c, rt_base_t x, rt_base_t y)
+{
+    rt_uint8_t page;
+    page = y/8;
+    
+    if(gui_disp_buf[page][x] & (1<<(y%8)))
+        *c = black;
+    else
+        *c = white;
+}
+
+static void rt_hw_lcd_draw_hline(rtgui_color_t *c, rt_base_t x1, rt_base_t x2, rt_base_t y)
+{
+    rt_uint8_t page;
+	rt_uint8_t i;
+    page = y/8;
+  
+    for(i=x1; i<x2; i++)
+    {
+        if(*c == black)
+            gui_disp_buf[page][i] |= 1<<(y%8);
+        else 
+            if(*c == white)
+                gui_disp_buf[page][i] &= ~(1<<(y%8));      
+    }
+}
+
+static void rt_hw_lcd_draw_vline(rtgui_color_t *c, rt_base_t x, rt_base_t y1, rt_base_t y2)
+{
+    rt_uint8_t y;
+
+    for(y = y1; y < y2; y ++)
+    {
+        rt_hw_lcd_set_pixel(c, x, y);
+    }
+}
+
+static void rt_hw_lcd_draw_raw_hline(rt_uint8_t *pixels, rt_base_t x1, rt_base_t x2, rt_base_t y)
+{
+    rt_uint8_t coll; 
+	rt_uint8_t colh; 
+	rt_uint8_t page;
+	rt_uint8_t i;
+
+    page = y/8;
+  
+    for(i=x1; i<x2; i++)
+    {
+        gui_disp_buf[page][i] |= 1<<(y%8);
+        coll = i & 0x0f;
+        colh = i >> 4;
+        LCD_WriteCmd(Set_Page_Addr_0 | page);
+        LCD_WriteCmd(Set_ColH_Addr_0 | colh);
+        LCD_WriteCmd(Set_ColL_Addr_0 | coll);
+        LCD_WriteData(gui_disp_buf[page][i]);
+    }
+}
+
+struct rtgui_graphic_driver _rtgui_lcd_driver =
+{
+    "lcd",
+    1,
+    LCD_WIDTH,
+    LCD_HEIGHT,
+    rt_hw_lcd_update,
+    rt_hw_lcd_get_framebuffer,
+    rt_hw_lcd_set_pixel,
+    rt_hw_lcd_get_pixel,
+    rt_hw_lcd_draw_hline,
+    rt_hw_lcd_draw_vline,
+    rt_hw_lcd_draw_raw_hline
+};
+#endif
+
+void lcd_io_init()
+{
+    /* Release the analog input function*/
+    FM3_GPIO->ADE =0x03;
+    /*Select CPIO function*/
+    LCD_CS_PFR &= ~LCD_CS;
+    /*Make pin output*/
+    LCD_CS_DDR |= LCD_CS;
+    /*Select CPIO function*/
+    LCD_CD_PFR &= ~LCD_CD;
+    /*Make pin output*/
+    LCD_CD_DDR |= LCD_CD;
+    /*Select CPIO function*/
+    LCD_PS_PFR &= ~LCD_PS;
+    /*Make pin output*/
+    LCD_PS_DDR |= LCD_PS;    
+    /*Select CPIO function*/
+    LCD_CLK_PFR &= ~LCD_CLK;
+    /*Make pin output*/
+    LCD_CLK_DDR |= LCD_CLK;
+    /*Select CPIO function*/
+    LCD_DATA_PFR &= ~LCD_DATA;
+    /*Make pin output*/
+    LCD_DATA_DDR |= LCD_DATA;
+}
+
+/* RT-Thread Device Interface */
+static rt_err_t rt_lcd_init (rt_device_t dev)
+{
+    lcd_io_init();
+    
+    Power_Delay();
+    LCD_WriteCmd(Display_Off);
+    Reset_Delay();
+    // Resetting circuit
+    LCD_WriteCmd(Reset_LCD);
+    Reset_Delay();
+    // LCD bias setting
+    LCD_WriteCmd(Set_LCD_Bias_9);
+    Reset_Delay();
+    // ADC selection: display from left to right
+    LCD_WriteCmd(Set_ADC_Normal);        
+    Reset_Delay();
+    // Common output state selection: display from up to down
+    LCD_WriteCmd(COM_Scan_Dir_Reverse);
+    Reset_Delay();
+      
+    LCD_WriteCmd(Power_Booster_On);
+    Power_Delay(); // 50ms requried
+    LCD_WriteCmd(Power_Regulator_On);
+    Power_Delay(); // 50ms
+    LCD_WriteCmd(Power_Follower_On);
+    Power_Delay(); // 50ms
+      
+    // Setting the built-in resistance radio for regulation of the V0 voltage
+    // Electronic volume control
+    // Power control setting
+    LCD_WriteCmd(Set_ElecVol_Reg|0x05);
+    Delay();
+    LCD_WriteCmd(Set_ElecVol_Mode);
+    Delay();
+    LCD_WriteCmd(Set_ElecVol_Reg);
+    Delay();
+    //  LCD_Clear();
+    Delay();
+    LCD_WriteCmd(Set_Page_Addr_0);
+    Delay();
+    LCD_WriteCmd(Set_ColH_Addr_0);
+    Delay();
+    LCD_WriteCmd(Set_ColL_Addr_0);
+    Delay();
+    LCD_WriteCmd(Display_On);
+    Delay();
+      
+    LCD_WriteCmd(Display_All_On);
+    Delay();
+    LCD_WriteCmd(Display_Off);
+    Delay();
+    LCD_WriteCmd(Display_On);
+    Delay();
+    LCD_WriteCmd(Display_All_Normal);
+    Delay();
+    
+    return RT_EOK;
+}
+
+static rt_err_t rt_lcd_control (rt_device_t dev, rt_uint8_t cmd, void *args)
+{
+    switch (cmd)
+    {
+        case RT_DEVICE_CTRL_LCD_GET_WIDTH:
+            *((rt_uint16_t*)args) = lcd->width;
+            break;
+        case RT_DEVICE_CTRL_LCD_GET_HEIGHT:
+            *((rt_uint16_t*)args) = lcd->height;
+            break;
+        case RT_DEVICE_CTRL_LCD_DISPLAY_ON:
+            LCD_WriteCmd(Display_On);
+            break;
+        case RT_DEVICE_CTRL_LCD_DISPLAY_OFF:
+            LCD_WriteCmd(Display_Off);
+            break;        
+    }
+
+    return RT_EOK;
+}
+
+static rt_err_t rt_lcd_open(rt_device_t dev, rt_uint16_t oflag)
+{    
+    RT_ASSERT(dev != RT_NULL);
+    
+    return RT_EOK;
+}
+
+static rt_err_t rt_lcd_close(rt_device_t dev)
+{    
+    RT_ASSERT(dev != RT_NULL);
+
+    return RT_EOK;
+}
+
+void rt_hw_lcd_init(void)
+{
+    lcd = (struct rtgui_lcd_device*)rt_malloc(sizeof(struct rtgui_lcd_device));
+    if (lcd == RT_NULL) 
+        return; /* no memory yet */
+
+    /* init device structure */
+    lcd->parent.type = RT_Device_Class_Unknown;
+    lcd->parent.init = rt_lcd_init;
+    lcd->parent.open = rt_lcd_open;
+    lcd->parent.close = rt_lcd_close;
+    lcd->parent.control = rt_lcd_control;
+    lcd->parent.user_data = RT_NULL;
+    lcd->width = LCD_WIDTH;
+    lcd->height = LCD_HEIGHT;
+    lcd->hw_framebuffer = (void*)gui_disp_buf;
+    
+    /* register touch device to RT-Thread */
+    rt_device_register(&(lcd->parent), "lcd", RT_DEVICE_FLAG_RDWR);
+
+#ifdef RT_USING_RTGUI
+    /* add lcd driver into graphic driver */
+    rtgui_graphic_driver_add(&_rtgui_lcd_driver);
+#endif
+}

+ 167 - 0
bsp/fm3/lcd.h

@@ -0,0 +1,167 @@
+/*
+ * File      : lcd.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006, RT-Thread Develop 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
+ * 2008-03-29     Yi.Qiu
+ */
+#ifndef __LCD_H__
+#define __LCD_H__
+
+#include <rtthread.h>
+#include "mb9bf506r.h"
+
+/********* LCD Hardward Interface *************
+LCD_CS		PORT1.7
+LCD_CD		PORT1.6
+LCD_WR		PORT1.5
+LCD_RD		PORT1.4
+LCD_SCK		PORT1.3
+LCD_MOSI	PORT1.2
+LCD_C86		PORT1.1
+LCD_PS		PORT1.0
+LCD_DATA[0..7]		PORT5.[0..7]
+***********************************************/
+#define LCD_CS                    (1UL << 7)
+#define LCD_CS_DDR                (FM3_GPIO->DDR1)
+#define LCD_CS_PFR                (FM3_GPIO->PFR1)
+#define LCD_CS_PDOR               (FM3_GPIO->PDOR1)
+
+#define LCD_CD                    (1UL << 6)
+#define LCD_CD_DDR                (FM3_GPIO->DDR1)
+#define LCD_CD_PFR                (FM3_GPIO->PFR1)
+#define LCD_CD_PDOR               (FM3_GPIO->PDOR1)
+
+#define LCD_PS                    (1UL << 0)
+#define LCD_PS_DDR                (FM3_GPIO->DDR1)
+#define LCD_PS_PFR                (FM3_GPIO->PFR1)
+#define LCD_PS_PDOR               (FM3_GPIO->PDOR1)
+
+#define LCD_CLK                   (1UL << 6)
+#define LCD_CLK_DDR               (FM3_GPIO->DDR5)
+#define LCD_CLK_PFR               (FM3_GPIO->PFR5)
+#define LCD_CLK_PDOR              (FM3_GPIO->PDOR5)
+
+#define LCD_DATA                  (1UL << 7)
+#define LCD_DATA_DDR              (FM3_GPIO->DDR5)
+#define LCD_DATA_PFR              (FM3_GPIO->PFR5)
+#define LCD_DATA_PDOR             (FM3_GPIO->PDOR5)
+
+/* LCD driver for ZYMG12864C3 */
+#define LCD_WIDTH 128
+#define LCD_HEIGHT 64
+
+// Driver the LCD with Parallel or serial interface and the command/data control pin is gpio
+#define LCD_CS_HIGH()             LCD_CS_PDOR  |=  LCD_CS
+#define LCD_CS_LOW()              LCD_CS_PDOR  &= ~LCD_CS
+
+#define LCD_CD_HIGH()             LCD_CD_PDOR |=  LCD_CD
+#define LCD_CD_LOW()              LCD_CD_PDOR &= ~LCD_CD
+
+#define LCD_PS_HIGH()             LCD_PS_PDOR |=  LCD_PS
+#define LCD_PS_LOW()              LCD_PS_PDOR &= ~LCD_PS
+
+#define LCD_CLK_HIGH()            LCD_CLK_PDOR |=  LCD_CLK
+#define LCD_CLK_LOW()             LCD_CLK_PDOR &= ~LCD_CLK
+
+#define LCD_DATA_HIGH()           LCD_DATA_PDOR |=  LCD_DATA
+#define LCD_DATA_LOW()            LCD_DATA_PDOR &= ~LCD_DATA
+
+// define the arrtibute of ZYMG12864(LCM)
+#define GUI_LCM_XMAX 					128		// defined the lcd's line-number is 128 
+#define GUI_LCM_YMAX 					64		// defined the lcd's column-number is 64
+#define GUI_LCM_PAGE					8		// defined the lcd's page-number is 8(GUI_LCM_YMAX/8)
+
+/* set LCD command */
+#define Display_On					0xAF	// A0,RD,WR:010
+#define Display_Off					0xAE	// A0,RD,WR:010
+
+#define Set_Start_Line_0		0x40	// A0,RD,WR:010; line0~line63
+#define Set_Page_Addr_0			0xB0	// A0,RD,WR:010; addr0~addr8
+#define Set_ColH_Addr_0			0x10	// A0,RD,WR:010; 
+#define Set_ColL_Addr_0			0x00	// A0,RD,WR:010; addr0~addr131
+
+#define Read_Status				    0x-0	// A0,RD,WR:001; BUSY | ADC | ON/OFF |  RESET | 0 0 0 0
+#define Status_Busy						0x80
+#define Status_ADC_Reverse		0x40	// column address 131-n : SEG n, else column address n : SEG n
+#define Status_Display_Off		0x20
+#define Status_Reset					0x80
+
+#define Write_Data				0x--	// A0,RD,WR:110
+#define Read_Date					0x--	// A0,RD,WR:101; spi mode is unavailable
+
+#define Set_ADC_Normal				0xA0	// A0,RD,WR:010
+#define Set_ADC_Reverse				0xA1	// A0,RD,WR:010
+#define Display_Normal				0xA6	// A0,RD,WR:010
+#define Display_Reverse				0xA7	// A0,RD,WR:010; reverse color
+#define Display_All_On				0xA5	// A0,RD,WR:010
+#define Display_All_Normal		0xA4	// A0,RD,WR:010
+
+/*************************************************************
+*	bias:	1/65duty | 1/49duty | 1/33duty | 1/55duty | 1/53duty *
+*	---------------|----------|----------|----------|--------- *
+*	A2: 	1/9 bias | 1/8 bias | 1/6 bias | 1/8 bias | 1/8 bias *
+*	A3:		1/7 bias | 1/6 bias | 1/5 bias | 1/6 bias | 1/6 bias *
+**************************************************************/
+
+#define Set_LCD_Bias_7    		0xA3	// A0,RD,WR:010
+#define Set_LCD_Bias_9    		0xA2	// A0,RD,WR:010
+
+#define RMW_Mode_Enable   		0xE0	// A0,RD,WR:010; the column address locked when read command operating
+#define RMW_Mode_End		  		0xEE	// A0,RD,WR:010; returns to the column address when RMW was entered.
+#define Reset_LCD         		0xE2	// A0,RD,WR:010
+
+
+/**************************************************************************************
+*	Com Scan Dir:	|	1/65duty 		| 1/49duty 		| 1/33duty 		| 1/55duty 		| 1/53duty		*
+*	--------------|-------------|-------------|-------------|------------------------ 	*
+*	C0: 	Normal	|	COM0:COM63	|	COM0:COM47	|	COM0:COM31	|	COM0:COM53	|	COM0:COM51	*
+*	C8:		Reverse	|	COM63:COM0	|	COM47:COM0	|	COM31:COM0	|	COM53:COM0	|	COM51:COM0	*
+***************************************************************************************/
+
+#define COM_Scan_Dir_Normal 	   0xC0	// A0,RD,WR:010
+#define COM_Scan_Dir_Reverse     0xC8	// A0,RD,WR:010
+
+// 0 0 1 0 1 | Booster On | Regulator On | Follower On
+#define Power_Booster_On			0x2C	// A0,RD,WR:010
+#define Power_Regulator_On		0x2E	// A0,RD,WR:010
+#define Power_Follower_On			0x2F	// A0,RD,WR:010
+
+#define Set_Resistor_Ratio		0x20	// A0,RD,WR:010; 20~27:small~large
+
+#define Set_ElecVol_Mode		0x81	// A0,RD,WR:010; double byte command
+#define Set_ElecVol_Reg			0x20	// A0,RD,WR:010; the electronic volume(64 voltage levels:00~3F) function is not used.
+
+#define Sleep_Mode_Enable			0xAC	// A0,RD,WR:010; double byte command, preceding command
+#define Sleep_Mode_Disable		0xAD	// A0,RD,WR:010; preceding command
+#define Sleep_Mode_Deliver		0x00	// A0,RD,WR:010; following command
+
+#define Boost_Ratio_Set			0xF8	// A0,RD,WR:010; double byte command, preceding command
+#define Boost_Ratio_234			0x00	// A0,RD,WR:010; following command
+#define Boost_Ratio_5				0x01	// A0,RD,WR:010; following command
+#define Boost_Ratio_6				0x03	// A0,RD,WR:010; following command
+
+#define Command_Nop					0xE3	// A0,RD,WR:010
+#define Command_IC_Test			0xFC	// A0,RD,WR:010; don't use
+
+#define RT_DEVICE_CTRL_LCD_GET_WIDTH			0
+#define RT_DEVICE_CTRL_LCD_GET_HEIGHT			1
+#define RT_DEVICE_CTRL_LCD_GET_BPP			 	2
+#define RT_DEVICE_CTRL_LCD_GET_FRAMEBUFFER		3
+#define RT_DEVICE_CTRL_LCD_POWER_ON     		4
+#define RT_DEVICE_CTRL_LCD_POWER_OFF     		5
+#define RT_DEVICE_CTRL_LCD_CLEAR_SCR     		6
+#define RT_DEVICE_CTRL_LCD_FILL_ALL     		7
+#define RT_DEVICE_CTRL_LCD_UPDATE_POINT    		8
+#define RT_DEVICE_CTRL_LCD_DISPLAY_ON    		9
+#define RT_DEVICE_CTRL_LCD_DISPLAY_OFF    		10
+
+void rt_hw_lcd_init(void);
+
+#endif

+ 135 - 0
bsp/fm3/led.c

@@ -0,0 +1,135 @@
+/*
+ * File      : led.c
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2011, RT-Thread Develop 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
+ * 2011-03-03     lgnq
+ */
+     
+#include <rtthread.h>
+#include <rthw.h>
+
+#include "mb9bf506r.h"
+#include "led.h"
+
+void rt_hw_led_on(rt_uint8_t num)
+{
+	RT_ASSERT(num < LEDS_MAX_NUMBER);
+    
+    switch(num)
+    {
+        case 1:
+            LED_PDOR &= ~LED1;
+        break;
+        case 2:
+            LED_PDOR &= ~LED2;
+        break;
+        case 3:
+            LED_PDOR &= ~LED3;        
+        break;
+        default:
+        break;
+    }	
+}
+
+void rt_hw_led_off(rt_uint8_t num)
+{
+	RT_ASSERT(num < LEDS_MAX_NUMBER);
+
+    switch(num)
+    {
+        case 1:
+            LED_PDOR |= LED1;
+        break;
+        case 2:
+            LED_PDOR |= LED2;
+        break;
+        case 3:
+            LED_PDOR |= LED3;        
+        break;
+        default:
+        break;
+    }	
+}
+
+void rt_hw_led_toggle(rt_uint8_t num)
+{
+	RT_ASSERT(num < LEDS_MAX_NUMBER);
+    
+    switch(num)
+    {
+        case 1:
+            if(LED_PDOR&LED1)
+                LED_PDOR &= ~LED1;
+            else
+                LED_PDOR |= LED1;
+        break;
+        case 2:
+            if(LED_PDOR&LED2)
+                LED_PDOR &= ~LED2;
+            else
+                LED_PDOR |= LED2;
+        break;
+        case 3:
+            if(LED_PDOR&LED3)
+                LED_PDOR &= ~LED3;
+            else
+                LED_PDOR |= LED3;    
+        break;
+        default:
+        break;
+    }	    
+}
+
+static rt_err_t led_io_init(void)
+{
+    /*Select CPIO function*/
+    LED_PFR &= ~LED_MASK;
+    /*Set Pin to turn off leds*/
+    LED_PDOR |= LED_MASK;
+    /*Make led pins outputs*/
+    LED_DDR |= LED_MASK;
+
+    return RT_EOK;
+}
+
+static void led1_thread_entry(void *parameter)
+{
+    while(1)
+    {
+        rt_hw_led_toggle(1);
+        rt_thread_delay(10);
+    }
+}
+
+static void led2_thread_entry(void *parameter)
+{
+    while(1)
+    {
+        rt_hw_led_toggle(2);
+        rt_thread_delay(20);
+    }
+}
+
+static rt_thread_t led1_thread;
+static rt_thread_t led2_thread;
+void rt_hw_led_init(void)
+{
+    led_io_init();
+    
+    led1_thread = rt_thread_create("led1", led1_thread_entry, RT_NULL, 384, 31, 5);
+    if(led1_thread != RT_NULL) 
+        rt_thread_startup(led1_thread);
+    
+    led2_thread = rt_thread_create("led2", led2_thread_entry, RT_NULL, 384, 30, 5);
+    if(led2_thread != RT_NULL) 
+        rt_thread_startup(led2_thread);
+}
+
+

+ 41 - 0
bsp/fm3/led.h

@@ -0,0 +1,41 @@
+/*
+ * File      : led.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2011, RT-Thread Develop 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
+ * 2011-03-03     lgnq
+ */
+ 
+#ifndef __LED_H__
+#define __LED_H__
+
+#include "mb9bf506r.h"
+
+#define LEDS_MAX_NUMBER 		4
+
+/*LEDs*/
+#define LED1        (1UL<<10)
+#define LED2        (1UL<<11)
+#define LED3        (1UL<<12)
+#define LED_MASK    (LED1 | LED2 | LED3)
+
+#define LED_PFR     (FM3_GPIO->PFR3)
+#define LED_DDR     (FM3_GPIO->DDR3)
+#define LED_PDOR    (FM3_GPIO->PDOR3)
+
+#define RT_DEVICE_CTRL_LED_ON			0
+#define RT_DEVICE_CTRL_LED_OFF			1
+#define RT_DEVICE_CTRL_LED_TOGGLE	 	2
+
+void rt_hw_led_init(void);
+void rt_hw_led_on(rt_uint8_t num);
+void rt_hw_led_off(rt_uint8_t num);
+void rt_hw_led_toggle(rt_uint8_t num);
+
+#endif

+ 24 - 0
bsp/fm3/rtconfig.h

@@ -61,4 +61,28 @@
 /* the buffer size of console */
 /* the buffer size of console */
 #define RT_CONSOLEBUF_SIZE	128
 #define RT_CONSOLEBUF_SIZE	128
 
 
+/* SECTION: RTGUI support */
+/* using RTGUI support */
+#define RT_USING_RTGUI
+
+/* name length of RTGUI object */
+#define RTGUI_NAME_MAX		16
+/* support 16 weight font */
+//#define RTGUI_USING_FONT16
+/* support 12 weight font */
+#define RTGUI_USING_FONT12
+/* support Chinese font */
+//#define RTGUI_USING_FONTHZ
+/* use DFS as file interface */
+//#define RTGUI_USING_DFS_FILERW
+/* use font file as Chinese font */
+/* #define RTGUI_USING_HZ_FILE */
+/* use Chinese bitmap font */
+//#define RTGUI_USING_HZ_BMP
+/* use small size in RTGUI */
+//#define RTGUI_USING_SMALL_SIZE
+/* use mouse cursor */
+/* #define RTGUI_USING_MOUSE_CURSOR */
+#define RTGUI_DEFAULT_FONT_SIZE 12
+
 #endif
 #endif