diff --git a/bsp/x86/SConscript b/bsp/x86/SConscript new file mode 100644 index 0000000000000000000000000000000000000000..a42526492306f8823f7e8962a1bda70a4733eb5d --- /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 0000000000000000000000000000000000000000..061f726069f51a60a1df8cfb346a7e748301e7d9 --- /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 cad1e64d974b21a075c5ec1ec04e2d47b35bbd89..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..591734409cefcfd1d1483a5d7d0e1170678a80b2 --- /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 0000000000000000000000000000000000000000..48e17cbc1ed801b126c86601eeb52256534d9c20 --- /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 + +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 similarity index 76% rename from bsp/x86/startup.c rename to bsp/x86/applications/startup.c index 4841da83f122aa1e8433378b01395fc5974dac3e..1449b69de6b5414f1dd26f2cb418e2c2e15c968a 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 a5cc61179970d682462db2e7b999421476c6a190..0000000000000000000000000000000000000000 --- 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 20099682bc1662ce1a7a2f1c2d5068ffeeb746cd..0000000000000000000000000000000000000000 --- 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 346c319157c0b595df9cfed85c5b1dd206c744b8..0000000000000000000000000000000000000000 --- 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 33d50587888d9451ea0b26c032feccb3c55adf84..0000000000000000000000000000000000000000 --- 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 74004109c19ef6de10a340262bc2d8e4faadc506..0000000000000000000000000000000000000000 --- 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 6a3adc5d9303026a1f3cc8a9d624264d227749bb..0000000000000000000000000000000000000000 --- 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 872a4a9c1e6a2c2bb86faca1085a7cafa3255a8c..0000000000000000000000000000000000000000 --- 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 613119893161931b73576e33316d01dbe147ec88..0000000000000000000000000000000000000000 --- 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 5b56504fae4fab12bbbd980a92b60829fb1ec094..0000000000000000000000000000000000000000 --- 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 a3a541ce74ac76339fca252a8940c13392c2e06a..0000000000000000000000000000000000000000 --- 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 90becda7d5dd6db8bc613a6977ca96d8bc2812ef..0000000000000000000000000000000000000000 --- 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 b42b885f2ea5b8b08862abc909148ab905faed9c..0000000000000000000000000000000000000000 --- 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 ad51ea46089ddef55f2c3e0629dfaf0691e0f8d7..0000000000000000000000000000000000000000 --- 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 75418acd9df9913ab88e46b35796f6faba90e838..0000000000000000000000000000000000000000 --- 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 -#include - -#include - - -#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 0000000000000000000000000000000000000000..370e4f93182d1f41843e31484f77f0554ba00cfb --- /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 similarity index 61% rename from bsp/x86/board.c rename to bsp/x86/drivers/board.c index c537b507be4e3d8b01330ef838cfb5b15125aa48..3aff852b59e9f304de9143fc7fe457c9b83ccd8a 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 #include @@ -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_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 similarity index 87% rename from bsp/x86/board.h rename to bsp/x86/drivers/board.h index c7f4583157374bf6f027f108c9b377d9baf7175e..4b04efdb5d04b67f7accc131f6da414775a3452c 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 0000000000000000000000000000000000000000..d3ad91ec476be007ce7238bb77d8032056fbb137 --- /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 +#include + +#include + + +//#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 0000000000000000000000000000000000000000..e14e58927494a8def6d722ae89cf82a73e27e8b6 --- /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 + +/*******************************************************************/ +/* 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 0000000000000000000000000000000000000000..18d08a78ad0cb753eac8d312ec66701f5881cc55 --- /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 0000000000000000000000000000000000000000..4b5a0e7bd0f6ac09c9d5d1e11bc6dc590f120caa --- /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 similarity index 100% rename from bsp/x86/keyboard.c rename to bsp/x86/drivers/keyboard.c diff --git a/bsp/x86/serial.c b/bsp/x86/drivers/serial.c similarity index 100% rename from bsp/x86/serial.c rename to bsp/x86/drivers/serial.c diff --git a/bsp/x86/rtconfig.h b/bsp/x86/rtconfig.h new file mode 100644 index 0000000000000000000000000000000000000000..29cd287b7329e0159253fa7908c768a2b8cc8aba --- /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 0000000000000000000000000000000000000000..19452a16a140316982e07b9cccd409e461588733 --- /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 similarity index 75% rename from bsp/x86/qemu_ram.lds rename to bsp/x86/x86_ram.lds index 89644058751441d2dc9e097ec01b93078b1be595..27fe39270870578bc517e45671139c4961ae0030 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) }