summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwuyangyong <[email protected]>2012-02-16 15:58:52 +0000
committerwuyangyong <[email protected]>2012-02-16 15:58:52 +0000
commitbe7bd6b5d7f0100cb75211568a21442ff79c2f3f (patch)
treef30967b27f16d462a8a08b72e2cc06efd00cd16e
parent4f6f15601dad6f72dca278afe2af1451cdae29c2 (diff)
update x86.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1950 bbd45198-f89e-11dd-88c7-29a3b14d5316
-rw-r--r--bsp/x86/SConscript14
-rw-r--r--bsp/x86/SConstruct28
-rw-r--r--bsp/x86/application.c28
-rw-r--r--bsp/x86/applications/SConscript11
-rw-r--r--bsp/x86/applications/application.c95
-rw-r--r--bsp/x86/applications/startup.c (renamed from bsp/x86/startup.c)64
-rw-r--r--bsp/x86/build/Makefile59
-rw-r--r--bsp/x86/build/bsp/Makefile9
-rw-r--r--bsp/x86/build/bsp/qemu/Makefile39
-rwxr-xr-xbsp/x86/build/clean-link18
-rw-r--r--bsp/x86/build/config.local38
-rw-r--r--bsp/x86/build/config.mk140
-rw-r--r--bsp/x86/build/config.target59
-rwxr-xr-xbsp/x86/build/create-link24
-rw-r--r--bsp/x86/build/finsh/Makefile29
-rw-r--r--bsp/x86/build/libcpu/Makefile9
-rw-r--r--bsp/x86/build/libcpu/ia32/Makefile33
-rw-r--r--bsp/x86/build/readme9
-rw-r--r--bsp/x86/build/src/Makefile25
-rw-r--r--bsp/x86/console.c210
-rw-r--r--bsp/x86/drivers/SConscript13
-rw-r--r--bsp/x86/drivers/board.c (renamed from bsp/x86/board.c)47
-rw-r--r--bsp/x86/drivers/board.h (renamed from bsp/x86/board.h)4
-rw-r--r--bsp/x86/drivers/console.c378
-rw-r--r--bsp/x86/drivers/include/bsp.h125
-rw-r--r--bsp/x86/drivers/include/grub.h93
-rw-r--r--bsp/x86/drivers/include/i386.h108
-rw-r--r--bsp/x86/drivers/keyboard.c (renamed from bsp/x86/keyboard.c)0
-rw-r--r--bsp/x86/drivers/serial.c (renamed from bsp/x86/serial.c)0
-rw-r--r--bsp/x86/rtconfig.h177
-rw-r--r--bsp/x86/rtconfig.py41
-rw-r--r--bsp/x86/x86_ram.lds (renamed from bsp/x86/qemu_ram.lds)17
32 files changed, 1152 insertions, 792 deletions
diff --git a/bsp/x86/SConscript b/bsp/x86/SConscript
new file mode 100644
index 0000000000..a425264923
--- /dev/null
+++ b/bsp/x86/SConscript
@@ -0,0 +1,14 @@
+# for module compiling
+import os
+Import('RTT_ROOT')
+
+cwd = str(Dir('#'))
+objs = []
+list = os.listdir(cwd)
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
diff --git a/bsp/x86/SConstruct b/bsp/x86/SConstruct
new file mode 100644
index 0000000000..061f726069
--- /dev/null
+++ b/bsp/x86/SConstruct
@@ -0,0 +1,28 @@
+import os
+import sys
+import rtconfig
+
+RTT_ROOT = os.path.normpath(os.getcwd() + '/../..')
+sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+from building import *
+
+TARGET = 'rtthread.' + rtconfig.TARGET_EXT
+
+env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
+env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT)
+
+# build program
+env.Program(TARGET, objs)
+
+# end building
+EndBuilding(TARGET)
diff --git a/bsp/x86/application.c b/bsp/x86/application.c
deleted file mode 100644
index cad1e64d97..0000000000
--- a/bsp/x86/application.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * File : application.c
- * 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://openlab.rt-thread.com/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2006-09-15 QiuYi the first version
- */
-
-/**
- * @addtogroup QEMU
- */
-/*@{*/
-
-/**
- * This function will be invoked to initalize user application when system startup.
- */
-int rt_application_init()
-{
- return 0; /* empty */
-}
-
-/*@}*/
diff --git a/bsp/x86/applications/SConscript b/bsp/x86/applications/SConscript
new file mode 100644
index 0000000000..591734409c
--- /dev/null
+++ b/bsp/x86/applications/SConscript
@@ -0,0 +1,11 @@
+Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+cwd = os.path.join(str(Dir('#')), 'applications')
+src = Glob('*.c')
+CPPPATH = [cwd, str(Dir('#'))]
+
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/bsp/x86/applications/application.c b/bsp/x86/applications/application.c
new file mode 100644
index 0000000000..48e17cbc1e
--- /dev/null
+++ b/bsp/x86/applications/application.c
@@ -0,0 +1,95 @@
+/*
+ * File : application.c
+ * 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://openlab.rt-thread.com/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2006-09-15 QiuYi the first version
+ */
+
+/**
+ * @addtogroup QEMU
+ */
+/*@{*/
+
+#include <rtthread.h>
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread_led1_stack[1024];
+struct rt_thread thread_led1;
+static void rt_thread_entry_led1(void* parameter)
+{
+ unsigned int count=0;
+ while (1)
+ {
+ /* led1 on */
+#ifndef RT_USING_FINSH
+ rt_kprintf("led1 on,count : %d\r\n",count);
+#endif
+ count++;
+ /* sleep 0.5 second and switch to other thread */
+ rt_thread_delay(RT_TICK_PER_SECOND/2);
+
+ /* led1 off */
+#ifndef RT_USING_FINSH
+ rt_kprintf("led1 off\r\n");
+#endif
+ rt_thread_delay(RT_TICK_PER_SECOND/2);
+ }
+}
+
+ALIGN(RT_ALIGN_SIZE)
+static char thread_led2_stack[1024];
+struct rt_thread thread_led2;
+void rt_thread_entry_led2(void* parameter)
+{
+ unsigned int count=0;
+ while (1)
+ {
+ /* led2 on */
+#ifndef RT_USING_FINSH
+ rt_kprintf("led2 on,count : %d\r\n",count);
+#endif
+ count++;
+ rt_thread_delay(RT_TICK_PER_SECOND);
+
+ /* led2 off */
+#ifndef RT_USING_FINSH
+ rt_kprintf("led2 off\r\n");
+#endif
+ rt_thread_delay(RT_TICK_PER_SECOND);
+ }
+}
+
+/**
+ * This function will be invoked to initalize user application when system startup.
+ */
+int rt_application_init()
+{
+ //------- init led1 thread
+ rt_thread_init(&thread_led1,
+ "led1",
+ rt_thread_entry_led1,
+ RT_NULL,
+ &thread_led1_stack[0],
+ sizeof(thread_led1_stack),11,5);
+ rt_thread_startup(&thread_led1);
+
+ //------- init led2 thread
+ rt_thread_init(&thread_led2,
+ "led2",
+ rt_thread_entry_led2,
+ RT_NULL,
+ &thread_led2_stack[0],
+ sizeof(thread_led2_stack),12,5);
+ rt_thread_startup(&thread_led2);
+
+ return 0; /* empty */
+}
+
+/*@}*/
diff --git a/bsp/x86/startup.c b/bsp/x86/applications/startup.c
index 4841da83f1..1449b69de6 100644
--- a/bsp/x86/startup.c
+++ b/bsp/x86/applications/startup.c
@@ -18,12 +18,18 @@
#include "board.h"
-extern void rt_console_init(void);
-extern void rt_hw_interrupt_init(void);
+extern void rt_hw_console_init(void);
extern void rt_hw_board_init(void);
-extern void rt_system_timer_init(void);
-extern void rt_system_scheduler_init(void);
-extern void rt_thread_idle_init(void);
+extern int rt_application_init(void);
+//extern void rt_hw_interrupt_init(void);
+//extern void rt_system_timer_init(void);
+//extern void rt_system_scheduler_init(void);
+//extern void rt_thread_idle_init(void);
+
+#ifdef RT_USING_FINSH
+extern void finsh_system_init(void);
+extern void finsh_set_device(const char* device);
+#endif
extern unsigned char __bss_start[];
extern unsigned char __bss_end[];
@@ -41,9 +47,6 @@ void rt_hw_clear_bss()
while(dst < __bss_end) *dst++ = 0;
}
-extern void finsh_system_init(void);
-extern int rt_application_init(void);
-
/**
* This function will startup RT-Thread RTOS
*/
@@ -51,55 +54,56 @@ void rtthread_startup()
{
/* clear .bss */
rt_hw_clear_bss();
-
+
/* init hardware interrupt */
rt_hw_interrupt_init();
-
+
/* init the console */
- rt_console_init();
-
+ rt_hw_console_init();
+ rt_console_set_device("console");
+
/* init board */
rt_hw_board_init();
-
+
rt_show_version();
-
+
/* init tick */
- rt_system_tick_init();
-
+ rt_system_tick_init();
+
/* init kernel object */
rt_system_object_init();
-
+
/* init timer system */
rt_system_timer_init();
-
+
/* init memory system */
-#ifdef RT_USING_HEAP
- //rt_system_heap_init();
+#ifdef RT_USING_HEAP
+ rt_system_heap_init((void*)&__bss_end, (void*)(1024UL*1024*8)); /* RAM 16M */
#endif
-
+
/* init scheduler system */
rt_system_scheduler_init();
-
+
/* init application */
rt_application_init();
-
- /* init the finsh input */
- rt_hw_finsh_init();
-
+
+#ifdef RT_USING_FINSH
/* init finsh */
finsh_system_init();
-
+ finsh_set_device("console");
+#endif
+
#ifdef RT_USING_HOOK
/* set idle thread hook */
rt_thread_idle_sethook(RT_NULL);
#endif
-
+
/* init idle thread */
rt_thread_idle_init();
-
+
/* start scheduler */
rt_system_scheduler_start();
-
+
/* never reach here */
return ;
diff --git a/bsp/x86/build/Makefile b/bsp/x86/build/Makefile
deleted file mode 100644
index a5cc611799..0000000000
--- a/bsp/x86/build/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-KERNEL_ROOT=.
-
-include $(KERNEL_ROOT)/config.mk
-
-SRC_DIR = src libcpu
-MAKE_CMD=
-
-ifeq ($(RT_USING_FINSH), 1)
-SRC_DIR += finsh
-MAKE_CMD+= RT_USING_FINSH=1
-endif
-
-ifeq ($(RT_USING_LWIP), 1)
-SRC_DIR += net
-MAKE_CMD+= RT_USING_LWIP=1
-endif
-
-ifeq ($(RT_USING_EFSL), 1)
-SRC_DIR += filesystem
-MAKE_CMD+= RT_USING_EFSL=1
-endif
-
-ifeq ($(RT_USING_RTGUI), 1)
-SRC_DIR += rtgui
-MAKE_CMD+= RT_USING_RTGUI=1
-endif
-
-ifeq ($(RT_USING_CPLUSPLUS), 1)
-SRC_DIR += cplusplus
-endif
-
-ifeq ($(RT_USING_NEWLIB), 1)
-SRC_DIR += libc
-else
-ifeq ($(RT_USING_MINILIBC), 1)
-SRC_DIR += libc
-endif
-endif
-
-SRC_DIR += bsp
-
-all:
- for dir in $(SRC_DIR); do \
- make -C $$dir $(MAKE_CMD); \
- done
-
-clean :
- for dir in $(SRC_DIR); do \
- make -C $$dir clean $(MAKE_CMD); \
- done
-
-test:
- make -C testsuite
-
-docs:
- $(DOXYGEN) Doxyfile
-
-dist-clean: clean
- make -C testsuite clean
diff --git a/bsp/x86/build/bsp/Makefile b/bsp/x86/build/bsp/Makefile
deleted file mode 100644
index 20099682bc..0000000000
--- a/bsp/x86/build/bsp/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-KERNEL_ROOT=..
-
-include $(KERNEL_ROOT)/config.mk
-
-all:
- make -C $(BOARD)
-
-clean:
- make -C $(BOARD) clean \ No newline at end of file
diff --git a/bsp/x86/build/bsp/qemu/Makefile b/bsp/x86/build/bsp/qemu/Makefile
deleted file mode 100644
index 346c319157..0000000000
--- a/bsp/x86/build/bsp/qemu/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-KERNEL_ROOT=../..
-
-include $(KERNEL_ROOT)/config.mk
-
-SRC = board.c startup.c keyboard.c console.c serial.c
-APP = application.o
-OBJ = $(SRC:.c=.o)
-BIN = rtthread-$(BOARD)
-IMG = $(KERNEL_ROOT)/lib/$(BIN).img
-
-#LFALGS = -nostdlib -Bstatic -T $(LDSCRIPT) -Ttext $(TEXTBASE)
-LFALGS = -nostdlib -Bstatic -T $(LDSCRIPT)
-CFLAGS += -I$(KERNEL_ROOT)/libcpu/$(ARCH)/include
-
-all: $(BIN) $(LIBBSP)
-
-$(IMG): $(BIN) $(KERNEL_ROOT)/lib/boot
- dd if=/dev/zero of=$(IMG)~ count=1000 2>/dev/null
- dd if=$(KERNEL_ROOT)/lib/boot of=$(IMG)~ conv=notrunc 2>/dev/null
- dd if=$(BIN) of=$(IMG)~ seek=1 conv=notrunc 2>/dev/null
-
-$(LIBBSP): $(OBJ)
- $(AR) r $@ $?
- $(RANLIB) $@
-
-$(BIN): $(OBJ) $(APP) $(LIBFINSH) $(LIBCPU) $(KERNEL)
- $(LD) $(LFALGS) $(STARTOBJ) $(OBJ) $(APP) $(LIBFINSH) $(KERNEL) $(LIBCPU) -o $(BIN).elf
- $(SIZE) $(BIN).elf
-
-clean :
- $(RM) $(BIN).elf *.o *~ *.bak *.bin $(LIBBSP)
- $(RM) .depend
-
-dep : .depend
-
-include .depend
-
-.depend: $(SRC)
- $(CC) $(CFLAGS) -M $^ > $@
diff --git a/bsp/x86/build/clean-link b/bsp/x86/build/clean-link
deleted file mode 100755
index 33d5058788..0000000000
--- a/bsp/x86/build/clean-link
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-rm lib -rf
-rm include -f
-rm src/*.c -f
-rm src/*.h -f
-rm src/*.o -f
-rm bsp/qemu/*.c -f
-rm bsp/qemu/*.h -f
-rm bsp/qemu/*.S -f
-rm bsp/qemu/*.o -f
-rm bsp/qemu/*.lds -f
-rm libcpu/ia32/*.c -f
-rm libcpu/ia32/*.S -f
-rm libcpu/ia32/*.o -f
-rm libcpu/ia32/include -f
-rm finsh/*.c -f
-rm finsh/*.h -f
-rm finsh/*.o -f
diff --git a/bsp/x86/build/config.local b/bsp/x86/build/config.local
deleted file mode 100644
index 74004109c1..0000000000
--- a/bsp/x86/build/config.local
+++ /dev/null
@@ -1,38 +0,0 @@
-# RT-Thread build config file
-# Platform
-PLATFORM=qemu
-
-# Platform Prefix
-PREFIX=
-
-# C flags
-CFLAGS=-Wall
-
-# Linker flags
-LDFLAGS=-nostdlib
-
-# ASM Flags
-ASFLAGS=
-
-# Build Type
-BUILDTYPE=RAM
-
-# Release Type
-RELEASETYPE=Release
-
-# Text Base
-TEXTBASE=0x108000
-
-# SECTION: RT-Thread Component
-# finsh, shell of RT-Thread
-RT_USING_FINSH=1
-
-# a mini libc
-#RT_USING_MINILIBC=1
-
-# Using C++ support
-# RT_USING_CPLUSPLUS=1
-
-# LwIP, light weight TCP/IP stack for RT-Thread
-# RT_USING_LWIP=1
-
diff --git a/bsp/x86/build/config.mk b/bsp/x86/build/config.mk
deleted file mode 100644
index 6a3adc5d93..0000000000
--- a/bsp/x86/build/config.mk
+++ /dev/null
@@ -1,140 +0,0 @@
-#
-# RT-Thread Makefile
-# CFLAGS for C compiler flags
-# CPPFLAGS for C++ compiler flags
-# LDFLAGS for ld link flags
-# LDLIBS for libraries should be linked
-# AFLAGS for assemble flags
-#
-
-include $(KERNEL_ROOT)/config.local
-include $(KERNEL_ROOT)/config.target
-
-#
-# toolchain variables
-#
-CC = $(PREFIX)gcc
-CXX = $(PREFIX)g++
-LD = $(PREFIX)ld
-AR = $(PREFIX)ar
-AS = $(PREFIX)as
-RANLIB = $(PREFIX)ranlib
-NM = $(PREFIX)nm
-OBJCOPY = $(PREFIX)objcopy
-OBJDUMP = $(PREFIX)objdump
-STRIP = $(PREFIX)strip
-SIZE = $(PREFIX)size
-RM = rm -rf
-MKDIR = mkdir -p
-
-#
-# start object and library
-#
-STARTOBJ = $(KERNEL_ROOT)/lib/start_$(CPU).o
-LIBCPU = $(KERNEL_ROOT)/lib/libcpu_$(CPU).a
-KERNEL = $(KERNEL_ROOT)/lib/libkernel_$(ARCH).a
-LIBBSP = $(KERNEL_ROOT)/lib/libbsp_$(BOARD).a
-LIBFINSH = $(KERNEL_ROOT)/lib/libfinsh_$(ARCH).a
-LIBEFSL = $(KERNEL_ROOT)/lib/libefsl-fs-vfat.a \
- $(KERNEL_ROOT)/lib/libefsl-base.a
-LIBRTGUI = $(KERNEL_ROOT)/lib/librtgui_widgets.a \
- $(KERNEL_ROOT)/lib/librtgui_server.a \
- $(KERNEL_ROOT)/lib/librtgui_common.a \
- $(KERNEL_ROOT)/lib/librtgui_app.a
-LIBLWIP = $(KERNEL_ROOT)/lib/liblwip_$(ARCH).a
-LIBCPP = $(KERNEL_ROOT)/lib/librtt++_$(ARCH).a
-LIBMINIC = $(KERNEL_ROOT)/lib/libminilibc_$(ARCH).a
-
-LDLIBS = -lcpu_$(CPU) -lkernel_$(ARCH) -lbsp_$(BOARD)
-
-#
-# ld script, according to build type, RAM or ROM
-#
-ifeq ($(BUILDTYPE), RAM)
-LDSCRIPT= $(KERNEL_ROOT)/bsp/$(BOARD)/$(BOARD)_ram.lds
-else
-LDSCRIPT= $(KERNEL_ROOT)/bsp/$(BOARD)/$(BOARD)_rom.lds
-endif
-
-#
-# RT-Thread component
-#
-ifeq ($(RT_USING_FINSH), 1)
-CFLAGS += -I$(KERNEL_ROOT)/finsh
-LDLIBS += -lfinsh_$(ARCH)
-endif
-
-ifeq ($(RT_USING_RTGUI), 1)
-CFLAGS += -I$(KERNEL_ROOT)/rtgui/include
-LDLIBS += -lrtgui_server -lrtgui_common -lrtgui_widgets -lrtgui_app
-endif
-
-ifeq ($(RT_USING_LWIP), 1)
-CFLAGS += -I$(KERNEL_ROOT)/net/lwip/src \
- -I$(KERNEL_ROOT)/net/lwip/src/include \
- -I$(KERNEL_ROOT)/net/lwip/src/include/ipv4 \
- -I$(KERNEL_ROOT)/net/lwip/src/arch/include
-LDLIBS += -llwip_$(ARCH)
-endif
-
-ifeq ($(RT_USING_EFSL), 1)
-CFLAGS += -I$(KERNEL_ROOT)/filesystem/efsl/src/fs/vfat/include \
- -I$(KERNEL_ROOT)/filesystem/efsl/src/base/include \
- -I$(KERNEL_ROOT)/filesystem/efsl/src/include \
- -I$(KERNEL_ROOT)/filesystem/efsl/conf
-LDLIBS += -lefsl-base -lefsl-fs-vfat
-endif
-
-ifeq ($(RT_USING_CPLUSPLUS), 1)
-CFLAGS +=
-LDLIBS += -lrtt++_$(ARCH)
-endif
-
-ifeq ($(RT_USING_NEWLIB), 1)
-CFLAGS += -I$(KERNEL_ROOT)/newlib/libc/include
-LDLIBS += -lnewlib_$(ARCH)
-else
-ifeq ($(RT_USING_MINILIBC), 1)
-CFLAGS += -I$(KERNEL_ROOT)/libc/minilibc
-LDLIBS += -lminilibc_$(ARCH)
-endif
-endif
-
-#
-# compiler, assemble and ld link flag
-#
-CFLAGS += -I$(KERNEL_ROOT)/include -I$(KERNEL_ROOT)/bsp/$(BOARD) -Wall -nostdinc -fno-builtin
-
-ifeq ($(RELEASETYPE), DEBUG)
-CFLAGS += -ggdb
-AFLAGS += -ggdb
-else
-CFLAGS += -O2
-CFLAGS +=
-AFLAGS +=
-endif
-
-ifeq ($(BUILDTYPE), RAM)
-#AFLAGS +=
-#AFLAGS += -x assembler-with-cpp -DTEXT_BASE=$(TEXTBASE)
-#AFLAGS += -x assembler-with-cpp
-else
-#AFLAGS +=
-#AFLAGS += -x assembler-with-cpp -DTEXT_BASE=$(TEXTBASE) -D__FLASH_BUILD__
-endif
-
-LDFLAGS += -L$(KERNEL_ROOT)/lib --start-group $(LDLIBS) --end-group
-
-CPPFLAGS = $(CFLAGS) -fno-rtti
-
-#
-# Common rules
-#
-.c.o:
- $(CC) -c $(CFLAGS) -o $@ $<
-
-.cpp.o:
- $(CXX) -c $(CPPFLAGS) -o $@ $<
-
-.S.o:
- $(CC) -c $(AFLAGS) -o $@ $<
diff --git a/bsp/x86/build/config.target b/bsp/x86/build/config.target
deleted file mode 100644
index 872a4a9c1e..0000000000
--- a/bsp/x86/build/config.target
+++ /dev/null
@@ -1,59 +0,0 @@
-ifeq ($(PLATFORM), lumit4510)
-ARCH = arm
-CPU = s3c4510
-BOARD = lumit4510
-endif
-
-ifeq ($(PLATFORM), wh44b0)
-ARCH = arm
-CPU = s3c44b0
-BOARD = wh44b0
-endif
-
-ifeq ($(PLATFORM), s3ceb2410)
-ARCH = arm
-CPU = s3c2410
-BOARD = s3ceb2410
-endif
-
-ifeq ($(PLATFORM), sam7s)
-ARCH = arm
-CPU = AT91SAM7S
-BOARD = sam7s
-endif
-
-ifeq ($(PLATFORM), sam7x)
-ARCH = arm
-CPU = AT91SAM7X
-BOARD = sam7x
-endif
-
-ifeq ($(PLATFORM), zaurusc1k)
-ARCH = arm
-CPU = pxa270
-BOARD = zaurusc1k
-endif
-
-ifeq ($(PLATFORM), qemu_akita)
-ARCH = arm
-CPU = pxa270
-BOARD = qemu_akita
-endif
-
-ifeq ($(PLATFORM), nds)
-ARCH = arm
-CPU = nds
-BOARD = nds
-endif
-
-ifeq ($(PLATFORM), qemu)
-ARCH = ia32
-CPU = ia32
-BOARD = qemu
-endif
-
-ifeq ($(PLATFORM), at9200)
-ARCH = arm
-CPU = AT9200
-BOARD = AT9200
-endif
diff --git a/bsp/x86/build/create-link b/bsp/x86/build/create-link
deleted file mode 100755
index 6131198931..0000000000
--- a/bsp/x86/build/create-link
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-mkdir lib
-ln -s ../../../include include
-
-for m_file in `ls ../../../src`
-do
- ln -s ../../../../src/$m_file src/$m_file
-done
-
-for m_file in `ls ../`
-do
- ln -s ../../../$m_file bsp/qemu/$m_file
-done
-rm bsp/qemu/build -f
-
-for m_file in `ls ../../../libcpu/ia32`
-do
- ln -s ../../../../../libcpu/ia32/$m_file libcpu/ia32/$m_file
-done
-
-for m_file in `ls ../../../finsh`
-do
- ln -s ../../../../finsh/$m_file finsh/$m_file
-done
diff --git a/bsp/x86/build/finsh/Makefile b/bsp/x86/build/finsh/Makefile
deleted file mode 100644
index 5b56504fae..0000000000
--- a/bsp/x86/build/finsh/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-KERNEL_ROOT=..
-
-include $(KERNEL_ROOT)/config.mk
-
-SRC = cmd.c shell.c symbol.c finsh_error.c finsh_node.c finsh_token.c \
- finsh_heap.c finsh_ops.c finsh_var.c finsh_compiler.c finsh_init.c\
- finsh_parser.c finsh_vm.c
-OBJ = $(SRC:.c=.o)
-
-CFLAGS += -I.
-
-
-all: $(LIBFINSH)
-
-$(LIBFINSH): $(OBJ)
- $(AR) -r $@ $?
- $(RANLIB) $@
-
-clean :
- $(RM) *.o *~ *.bak
- $(RM) $(LIBFINSH)
- $(RM) .depend
-
-dep : .depend
-
-include .depend
-
-.depend: $(SRC)
- $(CC) $(CFLAGS) -M $^ > $@
diff --git a/bsp/x86/build/libcpu/Makefile b/bsp/x86/build/libcpu/Makefile
deleted file mode 100644
index a3a541ce74..0000000000
--- a/bsp/x86/build/libcpu/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-KERNEL_ROOT=..
-
-include $(KERNEL_ROOT)/config.mk
-
-all:
- make -C $(ARCH)
-
-clean:
- make -C $(ARCH) clean
diff --git a/bsp/x86/build/libcpu/ia32/Makefile b/bsp/x86/build/libcpu/ia32/Makefile
deleted file mode 100644
index 90becda7d5..0000000000
--- a/bsp/x86/build/libcpu/ia32/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-KERNEL_ROOT=../..
-
-include $(KERNEL_ROOT)/config.mk
-
-SRC = interrupt.c trap.c stack.c backtrace.c showmem.c __udivsi3.c __umodsi3.c
-CPU_OBJ = $(SRC:.c=.o) context.o trapisr.o hdisr.o
-
-#AFLAGS += -DTEXT_BASE=$(TEXTBASE) -I$(KERNEL_ROOT)/libcpu/$(ARCH)/include
-AFLAGS += -I$(KERNEL_ROOT)/libcpu/$(ARCH)/include
-CFLAGS += -I$(KERNEL_ROOT)/libcpu/$(ARCH)/include
-
-all: $(LIBCPU) $(STARTOBJ)
-
-$(STARTOBJ): start.S
-# $(CC) $(AFLAGS) -c start.S -ggdb -o $(STARTOBJ)
- $(CC) $(AFLAGS) -c start.S -o $(STARTOBJ)
-
-$(LIBCPU): $(CPU_OBJ)
- $(AR) r $(LIBCPU) $?
- $(RANLIB) $(LIBCPU)
-
-clean :
- $(RM) *.o *~ *.bak
- $(RM) $(LIBCPU)
- $(RM) $(STARTOBJ)
- $(RM) .depend
-
-dep : .depend
-
-include .depend
-
-.depend: $(SRC)
- $(CC) $(CFLAGS) -M $^ > $@
diff --git a/bsp/x86/build/readme b/bsp/x86/build/readme
deleted file mode 100644
index b42b885f2e..0000000000
--- a/bsp/x86/build/readme
+++ /dev/null
@@ -1,9 +0,0 @@
-./create-link
-make
-cp bsp/qemu/rtthread-qemu.elf $dest
-
-
-
-test OK ON:
- Fedora 10
- Fedora 11
diff --git a/bsp/x86/build/src/Makefile b/bsp/x86/build/src/Makefile
deleted file mode 100644
index ad51ea4608..0000000000
--- a/bsp/x86/build/src/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-KERNEL_ROOT=..
-
-include $(KERNEL_ROOT)/config.mk
-
-SRC = kservice.c clock.c object.c ipc.c timer.c irq.c scheduler.c \
- thread.c idle.c mempool.c mem.c slab.c device.c
-OBJ = $(SRC:.c=.o)
-
-all: $(KERNEL)
-
-$(KERNEL): $(OBJ)
- $(AR) r $@ $?
- $(RANLIB) $@
-
-clean :
- $(RM) *.o *~ *.bak
- $(RM) $(KERNEL)
- $(RM) .depend
-
-dep : .depend
-
-include .depend
-
-.depend: $(SRC)
- $(CC) $(CFLAGS) -M $^ > $@
diff --git a/bsp/x86/console.c b/bsp/x86/console.c
deleted file mode 100644
index 75418acd9d..0000000000
--- a/bsp/x86/console.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * File : console.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://openlab.rt-thread.com/license/LICENSE
- *
- * Change Logs:
- * Date Author Notes
- * 2006-09-15 QiuYi the first version
- */
-
-#include <rtthread.h>
-#include <rthw.h>
-
-#include <bsp.h>
-
-
-#include "serial.h"
-
-static unsigned addr_6845;
-static rt_uint16_t *crt_buf;
-static rt_int16_t crt_pos;
-
-extern void rt_serial_init(void);
-extern char rt_keyboard_getc(void);
-
-static void rt_console_putc(int c);
-
-/**
- * @addtogroup QEMU
- */
-/*@{*/
-
-/**
- * This function initializes cga
- *
- */
-void rt_cga_init(void)
-{
- rt_uint16_t volatile *cp;
- rt_uint16_t was;
- rt_uint32_t pos;
-
- cp = (rt_uint16_t *) (CGA_BUF);
- was = *cp;
- *cp = (rt_uint16_t) 0xA55A;
- if (*cp != 0xA55A)
- {
- cp = (rt_uint16_t *) (MONO_BUF);
- addr_6845 = MONO_BASE;
- }
- else
- {
- *cp = was;
- addr_6845 = CGA_BASE;
- }
-
- /* Extract cursor location */
- outb(addr_6845, 14);
- pos = inb(addr_6845+1) << 8;
- outb(addr_6845, 15);
- pos |= inb(addr_6845+1);
-
- crt_buf = (rt_uint16_t *)cp;
- crt_pos = pos;
-}
-
-/**
- * This function will write a character to cga
- *
- * @param c the char to write
- */
-static void rt_cga_putc(int c)
-{
- /* if no attribute given, then use black on white */
- if (!(c & ~0xff)) c |= 0x0700;
-
- switch (c & 0xff)
- {
- case '\b':
- if (crt_pos > 0)
- {
- crt_pos--;
- crt_buf[crt_pos] = (c&~0xff) | ' ';
- }
- break;
- case '\n':
- crt_pos += CRT_COLS;
- /* cascade */
- case '\r':
- crt_pos -= (crt_pos % CRT_COLS);
- break;
- case '\t':
- rt_console_putc(' ');
- rt_console_putc(' ');
- rt_console_putc(' ');
- rt_console_putc(' ');
- rt_console_putc(' ');
- break;
- default:
- crt_buf[crt_pos++] = c; /* write the character */
- break;
- }
-
- if (crt_pos >= CRT_SIZE)
- {
- rt_int32_t i;
- rt_memcpy(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) << 1);
- for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++)
- crt_buf[i] = 0x0700 | ' ';
- crt_pos -= CRT_COLS;
- }
-
- outb(addr_6845, 14);
- outb(addr_6845+1, crt_pos >> 8);
- outb(addr_6845, 15);
- outb(addr_6845+1, crt_pos);
-}
-
-/**
- * This function will write a character to serial an cga
- *
- * @param c the char to write
- */
-static void rt_console_putc(int c)
-{
- rt_cga_putc(c);
- rt_serial_putc(c);
-}
-
-/**
- * This function initializes console
- *
- */
-void rt_console_init(void)
-{
- rt_cga_init();
- rt_serial_init();
-}
-
-/**
- * This function is used to display a string on console, normally, it's
- * invoked by rt_kprintf
- *
- * @param str the displayed string
- *
- * Modified:
- * caoxl 2009-10-14
- * the name is change to rt_hw_console_output in the v0.3.0
- *
- */
-
-//void rt_console_puts(const char* str)
-void rt_hw_console_output(const char* str)
-{
- while (*str)
- {
- rt_console_putc (*str++);
- }
-}
-
-#define BY2CONS 512
-
-static struct
-{
- rt_uint8_t buf[BY2CONS];
- rt_uint32_t rpos;
- rt_uint32_t wpos;
-}cons;
-
-static void rt_console_intr(char (*proc)(void))
-{
- int c;
-
- while ((c = (*proc)()) != -1)
- {
- if (c == 0)
- continue;
- cons.buf[cons.wpos++] = c;
- if (cons.wpos == BY2CONS)
- cons.wpos = 0;
- }
-}
-
-/**
- * return the next input character from the console,either from serial,
- * or keyboard
- *
- */
-int rt_console_getc(void)
-{
- int c;
-
- rt_console_intr(rt_serial_getc);
- rt_console_intr(rt_keyboard_getc);
-
- if (cons.rpos != cons.wpos)
- {
- c = cons.buf[cons.rpos++];
- if (cons.rpos == BY2CONS)
- cons.rpos = 0;
- return c;
- }
- return 0;
-}
-
-/*@}*/
diff --git a/bsp/x86/drivers/SConscript b/bsp/x86/drivers/SConscript
new file mode 100644
index 0000000000..370e4f9318
--- /dev/null
+++ b/bsp/x86/drivers/SConscript
@@ -0,0 +1,13 @@
+Import('RTT_ROOT')
+Import('rtconfig')
+from building import *
+
+cwd = os.path.join(str(Dir('#')), 'drivers')
+
+src = Glob('*.c')
+
+CPPPATH = [cwd, cwd + '/include']
+
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
+
+Return('group')
diff --git a/bsp/x86/board.c b/bsp/x86/drivers/board.c
index c537b507be..3aff852b59 100644
--- a/bsp/x86/board.c
+++ b/bsp/x86/drivers/board.c
@@ -12,7 +12,7 @@
* 2006-09-15 QiuYi the first version
* 2006-10-10 Bernard add hardware related of finsh
*/
-
+
#include <rtthread.h>
#include <rthw.h>
@@ -34,36 +34,31 @@ static void rt_timer_handler(int vector)
*/
void rt_hw_board_init(void)
{
- /* initialize 8253 clock to interrupt 100 times/sec */
+ /* initialize 8253 clock to interrupt 1000 times/sec */
outb(TIMER_MODE, TIMER_SEL0|TIMER_RATEGEN|TIMER_16BIT);
- outb(IO_TIMER1, TIMER_DIV(100) % 256);
- outb(IO_TIMER1, TIMER_DIV(100) / 256);
+ outb(IO_TIMER1, TIMER_DIV(RT_TICK_PER_SECOND) % 256);
+ outb(IO_TIMER1, TIMER_DIV(RT_TICK_PER_SECOND) / 256);
/* install interrupt handler */
rt_hw_interrupt_install(INTTIMER0, rt_timer_handler, RT_NULL);
rt_hw_interrupt_umask(INTTIMER0);
}
-
-#ifdef RT_USING_FINSH
-extern void finsh_notify(void);
-static void rt_serial_isr(int vector)
-{
- finsh_notify();
-}
-
-/**
- * This function will init hardware related in finsh shell
- */
-void rt_hw_finsh_init()
-{
- /* install UART isr */
- rt_hw_interrupt_install(INTUART0_RX, rt_serial_isr, RT_NULL);
- rt_hw_interrupt_umask(INTUART0_RX);
-
- /* install keyboard isr */
- rt_hw_interrupt_install(INTKEYBOARD, rt_serial_isr, RT_NULL);
- rt_hw_interrupt_umask(INTKEYBOARD);
-}
-#endif
+
+void restart(void)
+{
+ outb(KBSTATP, 0xFE); /* pulse reset low */
+ while(1);
+}
+
+#ifdef RT_USING_FINSH
+#include <finsh.h>
+FINSH_FUNCTION_EXPORT(restart, reboot PC)
+
+void reboot(void)
+{
+ restart();
+}
+FINSH_FUNCTION_EXPORT(reboot, reboot PC)
+#endif
/*@}*/
diff --git a/bsp/x86/board.h b/bsp/x86/drivers/board.h
index c7f4583157..4b04efdb5d 100644
--- a/bsp/x86/board.h
+++ b/bsp/x86/drivers/board.h
@@ -17,8 +17,4 @@
void rt_hw_board_init(void);
-#ifdef RT_USING_FINSH
-void rt_hw_finsh_init(void);
-#endif
-
#endif
diff --git a/bsp/x86/drivers/console.c b/bsp/x86/drivers/console.c
new file mode 100644
index 0000000000..d3ad91ec47
--- /dev/null
+++ b/bsp/x86/drivers/console.c
@@ -0,0 +1,378 @@
+/*
+ * File : console.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://openlab.rt-thread.com/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2006-09-15 QiuYi the first version
+ */
+
+#include <rtthread.h>
+#include <rthw.h>
+
+#include <bsp.h>
+
+
+//#include "serial.h"
+
+static unsigned addr_6845;
+static rt_uint16_t *crt_buf;
+static rt_int16_t crt_pos;
+
+//extern void rt_serial_init(void);
+extern char rt_keyboard_getc(void);
+//extern char rt_serial_getc(void);
+
+static void rt_console_putc(int c);
+
+/**
+ * @addtogroup QEMU
+ */
+/*@{*/
+
+/**
+ * This function initializes cga
+ *
+ */
+void rt_cga_init(void)
+{
+ rt_uint16_t volatile *cp;
+ rt_uint16_t was;
+ rt_uint32_t pos;
+
+ cp = (rt_uint16_t *) (CGA_BUF);
+ was = *cp;
+ *cp = (rt_uint16_t) 0xA55A;
+ if (*cp != 0xA55A)
+ {
+ cp = (rt_uint16_t *) (MONO_BUF);
+ addr_6845 = MONO_BASE;
+ }
+ else
+ {
+ *cp = was;
+ addr_6845 = CGA_BASE;
+ }
+
+ /* Extract cursor location */
+ outb(addr_6845, 14);
+ pos = inb(addr_6845+1) << 8;
+ outb(addr_6845, 15);
+ pos |= inb(addr_6845+1);
+
+ crt_buf = (rt_uint16_t *)cp;
+ crt_pos = pos;
+}
+
+/**
+ * This function will write a character to cga
+ *
+ * @param c the char to write
+ */
+static void rt_cga_putc(int c)
+{
+ /* if no attribute given, then use black on white */
+ if (!(c & ~0xff)) c |= 0x0700;
+
+ switch (c & 0xff)
+ {
+ case '\b':
+ if (crt_pos > 0)
+ {
+ crt_pos--;
+ crt_buf[crt_pos] = (c&~0xff) | ' ';
+ }
+ break;
+ case '\n':
+ crt_pos += CRT_COLS;
+ /* cascade */
+ case '\r':
+ crt_pos -= (crt_pos % CRT_COLS);
+ break;
+ case '\t':
+ rt_console_putc(' ');
+ rt_console_putc(' ');
+ rt_console_putc(' ');
+ rt_console_putc(' ');
+ rt_console_putc(' ');
+ break;
+ default:
+ crt_buf[crt_pos++] = c; /* write the character */
+ break;
+ }
+
+ if (crt_pos >= CRT_SIZE)
+ {
+ rt_int32_t i;
+ rt_memcpy(crt_buf, crt_buf + CRT_COLS, (CRT_SIZE - CRT_COLS) << 1);
+ for (i = CRT_SIZE - CRT_COLS; i < CRT_SIZE; i++)
+ crt_buf[i] = 0x0700 | ' ';
+ crt_pos -= CRT_COLS;
+ }
+
+ outb(addr_6845, 14);
+ outb(addr_6845+1, crt_pos >> 8);
+ outb(addr_6845, 15);
+ outb(addr_6845+1, crt_pos);
+}
+
+/**
+ * This function will write a character to serial an cga
+ *
+ * @param c the char to write
+ */
+static void rt_console_putc(int c)
+{
+ rt_cga_putc(c);
+// rt_serial_putc(c);
+}
+
+/* RT-Thread Device Interface */
+#define CONSOLE_RX_BUFFER_SIZE 64
+static struct rt_device console_device;
+static rt_uint8_t rx_buffer[CONSOLE_RX_BUFFER_SIZE];
+static rt_uint32_t read_index, save_index;
+
+static rt_err_t rt_console_init (rt_device_t dev)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_console_open(rt_device_t dev, rt_uint16_t oflag)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_console_close(rt_device_t dev)
+{
+ return RT_EOK;
+}
+
+static rt_err_t rt_console_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+{
+ return RT_EOK;
+}
+
+static rt_size_t rt_console_write(rt_device_t dev, rt_off_t pos, const void * buffer, rt_size_t size)
+{
+ rt_size_t i = size;
+ const char* str = buffer;
+
+ while(i--)
+ {
+ rt_console_putc(*str++);
+ }
+
+ return size;
+}
+
+static rt_size_t rt_console_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
+{
+ rt_uint8_t* ptr = buffer;
+ rt_err_t err_code = RT_EOK;
+
+ /* interrupt mode Rx */
+ while (size)
+ {
+ rt_base_t level;
+
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
+ if (read_index != save_index)
+ {
+ /* read a character */
+ *ptr++ = rx_buffer[read_index];
+ size--;
+
+ /* move to next position */
+ read_index ++;
+ if (read_index >= CONSOLE_RX_BUFFER_SIZE)
+ read_index = 0;
+ }
+ else
+ {
+ /* set error code */
+ err_code = -RT_EEMPTY;
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+ break;
+ }
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+ }
+
+ /* set error code */
+ rt_set_errno(err_code);
+ return (rt_uint32_t)ptr - (rt_uint32_t)buffer;
+}
+
+static void rt_console_isr(int vector)
+{
+// rt_kprintf("rt_console_isr\r\n");
+// RT_ASSERT(INTKEYBOARD == vector);
+// finsh_notify();
+
+ char c;
+ rt_base_t level;
+
+ while(1)
+ {
+ c = rt_keyboard_getc();
+// rt_kprintf(" %x", c);
+
+ if(c == 0)
+ {
+ break;
+ }
+ else if(c > 0)
+ {
+ /* disable interrupt */
+ level = rt_hw_interrupt_disable();
+
+ /* save character */
+ rx_buffer[save_index] = c;
+ save_index ++;
+ if (save_index >= CONSOLE_RX_BUFFER_SIZE)
+ save_index = 0;
+
+ /* if the next position is read index, discard this 'read char' */
+ if (save_index == read_index)
+ {
+ read_index ++;
+ if (read_index >= CONSOLE_RX_BUFFER_SIZE)
+ read_index = 0;
+ }
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(level);
+ }
+ }
+
+ /* invoke callback */
+ if (console_device.rx_indicate != RT_NULL)
+ {
+ rt_size_t rx_length;
+
+ /* get rx length */
+ rx_length = read_index > save_index ?
+ CONSOLE_RX_BUFFER_SIZE - read_index + save_index :
+ save_index - read_index;
+
+// rt_kprintf("\r\nrx_length %d\r\n", rx_length);
+ if(rx_length > 0)
+ {
+ console_device.rx_indicate(&console_device, rx_length);
+ }
+ }
+ else
+ {
+// rt_kprintf("\r\nconsole_device.rx_indicate == RT_NULL\r\n");
+ }
+}
+
+/**
+ * This function initializes console
+ *
+ */
+void rt_hw_console_init(void)
+{
+ rt_cga_init();
+// rt_serial_init();
+
+
+ /* install keyboard isr */
+ rt_hw_interrupt_install(INTKEYBOARD, rt_console_isr, RT_NULL);
+ rt_hw_interrupt_umask(INTKEYBOARD);
+
+ console_device.type = RT_Device_Class_Char;
+ console_device.rx_indicate = RT_NULL;
+ console_device.tx_complete = RT_NULL;
+ console_device.init = rt_console_init;
+ console_device.open = rt_console_open;
+ console_device.close = rt_console_close;
+ console_device.read = rt_console_read;
+ console_device.write = rt_console_write;
+ console_device.control = rt_console_control;
+ console_device.user_data = RT_NULL;
+
+ /* register a character device */
+ rt_device_register(&console_device,
+ "console",
+ RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM);
+}
+
+/**
+ * This function is used to display a string on console, normally, it's
+ * invoked by rt_kprintf
+ *
+ * @param str the displayed string
+ *
+ * Modified:
+ * caoxl 2009-10-14
+ * the name is change to rt_hw_console_output in the v0.3.0
+ *
+ */
+
+//void rt_console_puts(const char* str)
+void rt_hw_console_output(const char* str)
+{
+ while (*str)
+ {
+ rt_console_putc (*str++);
+ }
+}
+
+//#define BY2CONS 512
+//
+//static struct
+//{
+// rt_uint8_t buf[BY2CONS];
+// rt_uint32_t rpos;
+// rt_uint32_t wpos;
+//} cons;
+//
+//static void rt_console_intr(char (*proc)(void))
+//{
+// int c;
+//
+// while ((c = (*proc)()) != -1)
+// {
+// if (c == 0)
+// continue;
+// cons.buf[cons.wpos++] = c;
+// if (cons.wpos == BY2CONS)
+// cons.wpos = 0;
+// }
+//}
+
+///**
+// * return the next input character from the console,either from serial,
+// * or keyboard
+// *
+// */
+//int rt_console_getc(void)
+//{
+// int c;
+//
+// rt_console_intr(rt_serial_getc);
+// rt_console_intr(rt_keyboard_getc);
+//
+// if (cons.rpos != cons.wpos)
+// {
+// c = cons.buf[cons.rpos++];
+// if (cons.rpos == BY2CONS)
+// cons.rpos = 0;
+// return c;
+// }
+// return 0;
+//}
+
+/*@}*/
diff --git a/bsp/x86/drivers/include/bsp.h b/bsp/x86/drivers/include/bsp.h
new file mode 100644
index 0000000000..e14e589274
--- /dev/null
+++ b/bsp/x86/drivers/include/bsp.h
@@ -0,0 +1,125 @@
+/*
+ * File : bsp.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://openlab.rt-thread.com/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2006-09-15 QiuYi the first version */
+
+#ifndef __BSP_H_
+#define __BSP_H_
+
+#include <i386.h>
+
+/*******************************************************************/
+/* Timer Register */
+/*******************************************************************/
+#define TIMER_CNTR0 (IO_TIMER1 + 0) /* timer 0 counter port */
+#define TIMER_CNTR1 (IO_TIMER1 + 1) /* timer 1 counter port */
+#define TIMER_CNTR2 (IO_TIMER1 + 2) /* timer 2 counter port */
+#define TIMER_MODE (IO_TIMER1 + 3) /* timer mode port */
+#define TIMER_SEL0 0x00 /* select counter 0 */
+#define TIMER_SEL1 0x40 /* select counter 1 */
+#define TIMER_INTTC 0x00 /* mode 0, intr on terminal cnt */
+#define TIMER_ONESHOT 0x02 /* mode 1, one shot */
+#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */
+#define TIMER_SQWAVE 0x06 /* mode 3, square wave */
+#define TIMER_SWSTROBE 0x08 /* mode 4, s/w triggered strobe */
+#define TIMER_HWSTROBE 0x0a /* mode 5, h/w triggered strobe */
+#define TIMER_LATCH 0x00 /* latch counter for reading */
+#define TIMER_LSB 0x10 /* r/w counter LSB */
+#define TIMER_MSB 0x20 /* r/w counter MSB */
+#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */
+#define TIMER_BCD 0x01 /* count in BCD */
+
+#define TIMER_FREQ 1193182
+#define TIMER_DIV(x) ((TIMER_FREQ+(x)/2)/(x))
+
+#define IO_TIMER1 0x040 /* 8253 Timer #1 */
+
+/*******************************************************************/
+/* Interrupt Controller */
+/*******************************************************************/
+/* these are processor defined */
+#define T_DIVIDE 0 /* divide error */
+#define T_DEBUG 1 /* debug exception */
+#define T_NMI 2 /* non-maskable interrupt */
+#define T_BRKPT 3 /* breakpoint */
+#define T_OFLOW 4 /* overflow */
+#define T_BOUND 5 /* bounds check */
+#define T_ILLOP 6 /* illegal opcode */
+#define T_DEVICE 7 /* device not available */
+#define T_DBLFLT 8 /* double fault */
+/* 9 is reserved */
+#define T_TSS 10 /* invalid task switch segment */
+#define T_SEGNP 11 /* segment not present */
+#define T_STACK 12 /* stack exception */
+#define T_GPFLT 13 /* genernal protection fault */
+#define T_PGFLT 14 /* page fault */
+/* 15 is reserved */
+#define T_FPERR 16 /* floating point error */
+#define T_ALIGN 17 /* aligment check */
+#define T_MCHK 18 /* machine check */
+#define T_DEFAULT 500 /* catchall */
+
+#define INTTIMER0 0
+#define INTKEYBOARD 1
+#define INTUART0_RX 4
+
+/* I/O Addresses of the two 8259A programmable interrupt controllers */
+#define IO_PIC1 0x20 /* Master(IRQs 0-7) */
+#define IO_PIC2 0xa0 /* Slave(IRQs 8-15) */
+#define IRQ_SLAVE 0x2 /* IRQ at which slave connects to master */
+#define IRQ_OFFSET 0x20 /* IRQ 0 corresponds to int IRQ_OFFSET */
+
+#define MAX_HANDLERS 16 /*max number of isr handler*/
+
+/*******************************************************************/
+/* CRT Register */
+/*******************************************************************/
+#define MONO_BASE 0x3b4
+#define MONO_BUF 0xb0000
+#define CGA_BASE 0x3d4
+#define CGA_BUF 0xb8000
+
+#define CRT_ROWS 25
+#define CRT_COLS 80
+#define CRT_SIZE (CRT_ROWS * CRT_COLS)
+
+/*******************************************************************/
+/* Keyboard Register */
+/*******************************************************************/
+#define KBSTATP 0x64 /* kbd controller status port(I) */
+#define KBS_DIB 0x01 /* kbd data in buffer */
+#define KBDATAP 0x60 /* kbd data port(I) */
+
+/*******************************************************************/
+/* Serial Register */
+/*******************************************************************/
+/*Serial I/O code */
+#define COM1 0x3F8
+#define COMSTATUS 5
+#define COMDATA 0x01
+#define COMREAD 0
+#define COMWRITE 0
+
+/* Bits definition of the Line Status Register (LSR)*/
+#define DR 0x01 /* Data Ready */
+#define OE 0x02 /* Overrun Error */
+#define PE 0x04 /* Parity Error */
+#define FE 0x08 /* Framing Error */
+#define BI 0x10 /* Break Interrupt */
+#define THRE 0x20 /* Transmitter Holding Register Empty */
+#define TEMT 0x40 /* Transmitter Empty */
+#define ERFIFO 0x80 /* Error receive Fifo */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __BSP_H_ */
diff --git a/bsp/x86/drivers/include/grub.h b/bsp/x86/drivers/include/grub.h
new file mode 100644
index 0000000000..18d08a78ad
--- /dev/null
+++ b/bsp/x86/drivers/include/grub.h
@@ -0,0 +1,93 @@
+/*
+ * File : grub.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://openlab.rt-thread.com/license/LICENSE
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2006-10-09 Bernard the grub related definitions
+ * (multiboot)
+ */
+
+#ifndef __GRUB_H__
+#define __GRUB_H__
+
+/* the magic number for the multiboot header. */
+#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
+
+/* the flags for the multiboot header. */
+#define MULTIBOOT_HEADER_FLAGS 0x00000003
+
+/* the magic number passed by a multiboot-compliant boot loader. */
+#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
+
+#ifndef __ASM__
+/* the multiboot header. */
+typedef struct multiboot_header
+{
+ unsigned long magic;
+ unsigned long flags;
+ unsigned long checksum;
+ unsigned long header_addr;
+ unsigned long load_addr;
+ unsigned long load_end_addr;
+ unsigned long bss_end_addr;
+ unsigned long entry_addr;
+} multiboot_header_t;
+
+/* the section header table for elf. */
+typedef struct elf_section_header_table
+{
+ unsigned long num;
+ unsigned long size;
+ unsigned long addr;
+ unsigned long shndx;
+} elf_section_header_table_t;
+
+/* the multiboot information. */
+typedef struct multiboot_info
+{
+ unsigned long flags;
+ unsigned long mem_lower;
+ unsigned long mem_upper;
+ unsigned long boot_device;
+ unsigned long cmdline;
+ unsigned long mods_count;
+ unsigned long mods_addr;
+ union
+ {
+ aout_symbol_table_t aout_sym;
+ elf_section_header_table_t elf_sec;
+ } u;
+ unsigned long mmap_length;
+ unsigned long mmap_addr;
+} multiboot_info_t;
+
+/* the module structure. */
+typedef struct module
+{
+ unsigned long mod_start;
+ unsigned long mod_end;
+ unsigned long string;
+ unsigned long reserved;
+} module_t;
+
+/* the memory map. be careful that the offset 0 is base_addr_low
+ but no size. */
+typedef struct memory_map
+{
+ unsigned long size;
+ unsigned long base_addr_low;
+ unsigned long base_addr_high;
+ unsigned long length_low;
+ unsigned long length_high;
+ unsigned long type;
+} memory_map_t;
+
+#endif
+
+#endif
diff --git a/bsp/x86/drivers/include/i386.h b/bsp/x86/drivers/include/i386.h
new file mode 100644
index 0000000000..4b5a0e7bd0
--- /dev/null
+++ b/bsp/x86/drivers/include/i386.h
@@ -0,0 +1,108 @@
+#ifndef __I386_H_
+#define __I386_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static __inline unsigned char inb(int port)
+{
+ unsigned char data;
+ __asm __volatile("inb %w1,%0" : "=a" (data) : "d" (port));
+ return data;
+}
+
+static __inline unsigned short inw(int port)
+{
+ unsigned short data;
+ __asm __volatile("inw %w1,%0" : "=a" (data) : "d" (port));
+ return data;
+}
+
+static __inline unsigned int inl(int port)
+{
+ unsigned int data;
+ __asm __volatile("inl %w1,%0" : "=a" (data) : "d" (port));
+ return data;
+}
+
+static __inline void insl(int port, void *addr, int cnt)
+{
+ __asm __volatile("cld\n\trepne\n\tinsl" :
+ "=D" (addr), "=c" (cnt) :
+ "d" (port), "0" (addr), "1" (cnt) :
+ "memory", "cc");
+}
+
+static __inline void outb(int port, unsigned char data)
+{
+ __asm __volatile("outb %0,%w1" : : "a" (data), "d" (port));
+}
+
+static __inline void outw(int port, unsigned short data)
+{
+ __asm __volatile("outw %0,%w1" : : "a" (data), "d" (port));
+}
+
+/* Gate descriptors are slightly different*/
+struct Gatedesc {
+ unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment
+ unsigned gd_ss : 16; // segment selector
+ unsigned gd_args : 5; // # args, 0 for interrupt/trap gates
+ unsigned gd_rsv1 : 3; // reserved(should be zero I guess)
+ unsigned gd_type :4; // type(STS_{TG,IG32,TG32})
+ unsigned gd_s : 1; // must be 0 (system)
+ unsigned gd_dpl : 2; // descriptor(meaning new) privilege level
+ unsigned gd_p : 1; // Present
+ unsigned gd_off_31_16 : 16; // high bits of offset in segment
+};
+
+/* Pseudo-descriptors used for LGDT, LLDT and LIDT instructions*/
+struct Pseudodesc {
+ rt_uint16_t pd__garbage; // LGDT supposed to be from address 4N+2
+ rt_uint16_t pd_lim; // Limit
+ rt_uint32_t pd_base __attribute__ ((packed)); // Base address
+};
+
+#define SETGATE(gate, istrap, sel, off, dpl) \
+{ \
+ (gate).gd_off_15_0 = (rt_uint32_t) (off) & 0xffff; \
+ (gate).gd_ss = (sel); \
+ (gate).gd_args = 0; \
+ (gate).gd_rsv1 = 0; \
+ (gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \
+ (gate).gd_s = 0; \
+ (gate).gd_dpl = dpl; \
+ (gate).gd_p = 1; \
+ (gate).gd_off_31_16 = (rt_uint32_t) (off) >> 16; \
+}
+
+/* Global descriptor numbers*/
+#define GD_KT 0x08 // kernel text
+#define GD_KD 0x10 // kernel data
+#define GD_UT 0x18 // user text
+#define GD_UD 0x20 // user data
+
+/* Application segment type bits*/
+#define STA_X 0x8 // Executable segment
+#define STA_E 0x4 // Expand down(non-executable segments)
+#define STA_C 0x4 // Conforming code segment(executable only)
+#define STA_W 0x2 // Writeable(non-executable segments)
+#define STA_R 0x2 // Readable(executable segments)
+#define STA_A 0x1 // Accessed
+
+/* System segment type bits*/
+#define STS_T16A 0x1 // Available 16-bit TSS
+#define STS_LDT 0x2 // Local Descriptor Table
+#define STS_T16B 0x3 // Busy 16-bit TSS
+#define STS_CG16 0x4 // 16-bit Call Gate
+#define STS_TG 0x5 // Task Gate / Coum Transmitions
+#define STS_IG16 0x6 // 16-bit Interrupt Gate
+#define STS_TG16 0x7 // 16-bit Trap Gate
+#define STS_T32A 0x9 // Available 32-bit TSS
+#define STS_T32B 0xb // Busy 32-bit TSS
+#define STS_CG32 0xc // 32-bit Call Gate
+#define STS_IG32 0xe // 32-bit Interrupt Gate
+#define STS_TG32 0xf // 32-bit Trap Gate
+
+#endif
diff --git a/bsp/x86/keyboard.c b/bsp/x86/drivers/keyboard.c
index 5bf3de3906..5bf3de3906 100644
--- a/bsp/x86/keyboard.c
+++ b/bsp/x86/drivers/keyboard.c
diff --git a/bsp/x86/serial.c b/bsp/x86/drivers/serial.c
index f2484417e2..f2484417e2 100644
--- a/bsp/x86/serial.c
+++ b/bsp/x86/drivers/serial.c
diff --git a/bsp/x86/rtconfig.h b/bsp/x86/rtconfig.h
new file mode 100644
index 0000000000..29cd287b73
--- /dev/null
+++ b/bsp/x86/rtconfig.h
@@ -0,0 +1,177 @@
+/* RT-Thread config file */
+#ifndef __RTTHREAD_CFG_H__
+#define __RTTHREAD_CFG_H__
+
+#define RT_USING_NEWLIB
+//#define RT_USING_PTHREADS
+#define RT_USING_DFS_DEVFS
+
+/* RT_NAME_MAX*/
+#define RT_NAME_MAX 8
+
+/* RT_ALIGN_SIZE*/
+#define RT_ALIGN_SIZE 8
+
+/* PRIORITY_MAX */
+#define RT_THREAD_PRIORITY_MAX 32
+
+/* Tick per Second */
+#define RT_TICK_PER_SECOND 1000
+
+/* SECTION: RT_DEBUG */
+/* Thread Debug */
+#define RT_DEBUG
+#define RT_THREAD_DEBUG
+
+#define RT_USING_OVERFLOW_CHECK
+
+/* Using Hook */
+#define RT_USING_HOOK
+
+/* Using Software Timer */
+/* #define RT_USING_TIMER_SOFT */
+#define RT_TIMER_THREAD_PRIO 4
+#define RT_TIMER_THREAD_STACK_SIZE 512
+#define RT_TIMER_TICK_PER_SECOND 10
+
+/* SECTION: IPC */
+/* Using Semaphore*/
+#define RT_USING_SEMAPHORE
+
+/* Using Mutex */
+#define RT_USING_MUTEX
+
+/* Using Event */
+#define RT_USING_EVENT
+
+/* Using MailBox */
+#define RT_USING_MAILBOX
+
+/* Using Message Queue */
+#define RT_USING_MESSAGEQUEUE
+
+/* SECTION: Memory Management */
+/* Using Memory Pool Management*/
+#define RT_USING_MEMPOOL
+
+/* Using Dynamic Heap Management */
+#define RT_USING_HEAP
+
+/* Using Small MM */
+#define RT_USING_SMALL_MEM
+
+/* SECTION: Device System */
+/* Using Device System */
+#define RT_USING_DEVICE
+
+/* SECTION: Console options */
+#define RT_USING_CONSOLE
+/* the buffer size of console*/
+#define RT_CONSOLEBUF_SIZE 128
+
+#define IDLE_THREAD_STACK_SIZE 1024 /* idle stack 1K */
+
+/* SECTION: finsh, a C-Express shell */
+#define RT_USING_FINSH
+/* Using symbol table */
+#define FINSH_USING_SYMTAB
+#define FINSH_USING_DESCRIPTION
+
+/* SECTION: device filesystem */
+ #define RT_USING_DFS
+
+#define RT_USING_DFS_ELMFAT
+#define RT_DFS_ELM_WORD_ACCESS
+/* Reentrancy (thread safe) of the FatFs module. */
+#define RT_DFS_ELM_REENTRANT
+/* Number of volumes (logical drives) to be used. */
+#define RT_DFS_ELM_DRIVES 2
+/* #define RT_DFS_ELM_USE_LFN 1 */
+#define RT_DFS_ELM_MAX_LFN 255
+/* Maximum sector size to be handled. */
+#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
+
+/* the max number of mounted filesystem */
+#define DFS_FILESYSTEMS_MAX 2
+/* the max number of opened files */
+#define DFS_FD_MAX 4
+
+/* SECTION: lwip, a lighwight TCP/IP protocol stack */
+//#define RT_USING_LWIP
+/* LwIP uses RT-Thread Memory Management */
+#define RT_LWIP_USING_RT_MEM
+/* Enable ICMP protocol*/
+#define RT_LWIP_ICMP
+/* Enable UDP protocol*/
+#define RT_LWIP_UDP
+/* Enable TCP protocol*/
+#define RT_LWIP_TCP
+/* Enable DNS */
+#define RT_LWIP_DNS
+
+/* the number of simulatenously active TCP connections*/
+#define RT_LWIP_TCP_PCB_NUM 5
+
+/* Using DHCP */
+/* #define RT_LWIP_DHCP */
+
+/* ip address of target*/
+#define RT_LWIP_IPADDR0 192
+#define RT_LWIP_IPADDR1 168
+#define RT_LWIP_IPADDR2 1
+#define RT_LWIP_IPADDR3 30
+
+/* gateway address of target*/
+#define RT_LWIP_GWADDR0 192
+#define RT_LWIP_GWADDR1 168
+#define RT_LWIP_GWADDR2 1
+#define RT_LWIP_GWADDR3 1
+
+/* mask address of target*/
+#define RT_LWIP_MSKADDR0 255
+#define RT_LWIP_MSKADDR1 255
+#define RT_LWIP_MSKADDR2 255
+#define RT_LWIP_MSKADDR3 0
+
+/* tcp thread options */
+#define RT_LWIP_TCPTHREAD_PRIORITY 12
+#define RT_LWIP_TCPTHREAD_MBOX_SIZE 10
+#define RT_LWIP_TCPTHREAD_STACKSIZE 1024
+
+/* ethernet if thread options */
+#define RT_LWIP_ETHTHREAD_PRIORITY 15
+#define RT_LWIP_ETHTHREAD_MBOX_SIZE 10
+#define RT_LWIP_ETHTHREAD_STACKSIZE 512
+
+/* TCP sender buffer space */
+#define RT_LWIP_TCP_SND_BUF 8192
+/* TCP receive window. */
+#define RT_LWIP_TCP_WND 8192
+
+/* SECTION: RT-Thread/GUI */
+/* #define RT_USING_RTGUI */
+
+/* name length of RTGUI object */
+#define RTGUI_NAME_MAX 12
+/* support 16 weight font */
+#define RTGUI_USING_FONT16
+/* 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 */
+/* default font size in RTGUI */
+#define RTGUI_DEFAULT_FONT_SIZE 16
+
+/* image support */
+/* #define RTGUI_IMAGE_XPM */
+/* #define RTGUI_IMAGE_BMP */
+
+#endif
diff --git a/bsp/x86/rtconfig.py b/bsp/x86/rtconfig.py
new file mode 100644
index 0000000000..19452a16a1
--- /dev/null
+++ b/bsp/x86/rtconfig.py
@@ -0,0 +1,41 @@
+# toolchains options
+ARCH='ia32'
+CPU=''
+CROSS_TOOL='gcc'
+
+# cross_tool provides the cross compiler
+# EXEC_PATH is the compiler execute path, for example, CodeSourcery,
+
+if CROSS_TOOL == 'gcc':
+ PLATFORM = 'gcc'
+ EXEC_PATH = 'E:/Program Files/CodeSourcery/Sourcery_CodeBench_Lite_for_IA32_ELF/bin'
+
+BUILD = 'debug'
+
+if PLATFORM == 'gcc':
+ # toolchains
+ PREFIX = 'i686-elf-'
+ CC = PREFIX + 'gcc'
+ AS = PREFIX + 'gcc'
+ AR = PREFIX + 'ar'
+ LINK = PREFIX + 'gcc'
+ TARGET_EXT = 'elf'
+ SIZE = PREFIX + 'size'
+ OBJDUMP = PREFIX + 'objdump'
+ OBJCPY = PREFIX + 'objcopy'
+
+ DEVICE = ' -mtune=generic'
+ CFLAGS = DEVICE + ' -Wall'
+ AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp'
+ LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-ia32.map,-cref,-u,_start -T x86_ram.lds'
+
+ CPATH = ''
+ LPATH = ''
+
+ if BUILD == 'debug':
+ CFLAGS += ' -O0 -gdwarf-2'
+ AFLAGS += ' -gdwarf-2'
+ else:
+ CFLAGS += ' -O2'
+
+ POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
diff --git a/bsp/x86/qemu_ram.lds b/bsp/x86/x86_ram.lds
index 8964405875..27fe392708 100644
--- a/bsp/x86/qemu_ram.lds
+++ b/bsp/x86/x86_ram.lds
@@ -8,9 +8,20 @@ SECTIONS
. = ALIGN(4);
.text :
{
- *(.init)
- *(.text)
- }
+ *(.init)
+ *(.text)
+
+ /* section information for finsh shell */
+ . = ALIGN(4);
+ __fsymtab_start = .;
+ KEEP(*(FSymTab))
+ __fsymtab_end = .;
+ . = ALIGN(4);
+ __vsymtab_start = .;
+ KEEP(*(VSymTab))
+ __vsymtab_end = .;
+ . = ALIGN(4);
+ }
. = ALIGN(4);
.rodata : { *(.rodata) }