Mercurial > ecos
diff packages/cygmon/current/misc/ecos_bsp.c @ 76:435cced73e2f ecos-v1_3_1-release
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
| author | jlarmour |
|---|---|
| date | Tue, 28 Mar 2000 14:10:45 +0000 |
| parents | |
| children | 02ea4320376c |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/cygmon/current/misc/ecos_bsp.c @@ -0,0 +1,338 @@ +//========================================================================== +// +// ecos_bsp.c +// +// eCos BSP (for building Cygmon) +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Red Hat eCos Public License +// Version 1.1 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://www.redhat.com/ +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Configurable Operating System, +// released September 30, 1998. +// +// The Initial Developer of the Original Code is Red Hat. +// Portions created by Red Hat are +// Copyright (C) 1998, 1999, 2000 Red Hat, Inc. +// All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): gthomas +// Contributors: gthomas +// Date: 1999-10-11 +// Description: Wrapper functions which provide BSP environment for Cygmon +//####DESCRIPTIONEND#### + +#include <pkgconf/kernel.h> // Configuration headers +#include <pkgconf/hal.h> +#include <pkgconf/cygmon.h> + +#include <cyg/hal/hal_arch.h> +#include <cyg/hal/hal_cache.h> +#include <cyg/kernel/kapi.h> +#include <cyg/infra/diag.h> +#include <cyg/io/io.h> +#include "bsp/common/bsp_if.h" +#include <signal.h> +#include CYGHWR_MEMORY_LAYOUT_H + +#define STACK_SIZE CYGNUM_HAL_STACK_SIZE_MINIMUM +static char stack[STACK_SIZE]; +static cyg_thread thread_data; +static cyg_handle_t thread_handle; + +char *build_date = __DATE__; + +extern void monitor_main(int, char *); +extern int stub_is_active; + +void +cygmon_main(void) +{ + _bsp_init(); + monitor_main(0, 0); // Null argument list +} + +externC void +cyg_start( void ) +{ + // Create a main thread, so we can run the scheduler and have time 'pass' + cyg_thread_create(10, // Priority - just a number + cygmon_main, // entry + 0, // entry parameter + "Cygmon", // Name + &stack[0], // Stack + STACK_SIZE, // Size + &thread_handle, // Handle + &thread_data // Thread data structure + ); + cyg_thread_resume(thread_handle); // Start it + cyg_scheduler_start(); +} // cyg_package_start() + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +extern void *_hal_registers; // Used by eCos GDB stubs +extern void (*__init_vec)(void); +extern void (*__cleanup_vec)(void); +extern void __install_traps(void); +#endif + +void +_bsp_handle_exception(cyg_addrword_t data, cyg_code_t num, cyg_addrword_t info) +{ + if (num == CYGNUM_HAL_EXCEPTION_INTERRUPT) { + if (machine_syscall(info)) { + return; + } + // Fall through to "normal" exception handling if system call failed + } +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + _hal_registers = (void *)info; // Used by eCos GDB stubs + __cleanup_vec(); +#endif + bsp_invoke_dbg_handler(num, (void *)info); +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + __init_vec(); +#endif +} + +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS +extern void __handle_exception(void); +#else + +int +unhandled_exception(int num, void *args) +{ + diag_printf("Unhandled exception: %d/%x\n", num, args); + while (1) ; +} +#endif + +void +_bsp_cpu_init(void) +{ + cyg_exception_handler_t _bsp_breakpoint_handler; + int d0; + cyg_exception_set_handler(CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION, + _bsp_handle_exception, + &d0, + 0, + 0); +#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS + bsp_install_dbg_handler((bsp_handler_t)__handle_exception); + __install_traps(); +#else + bsp_install_dbg_handler(unhandled_exception); +#endif +} + +#define FAIL() diag_printf("fail: %s\n", __FUNCTION__); while (1) ; + +struct BSP_IO { + char *name; + cyg_io_handle_t chan; +}; + +static void +uart_putchar(void *base, char c) +{ + char buf; + int len; + struct BSP_IO *io = (struct BSP_IO *)base; + if (io->chan) { + len = 1; + buf = c; + cyg_io_write(io->chan, &buf, &len); + } +} + +// This function is mostly used by the 'write()' system call +static void +uart_write(void *base, const char *buf, int len) +{ + struct BSP_IO *io = (struct BSP_IO *)base; + if (io->chan) { + if (stub_is_active) { + // We are running in 'GDB' mode + __output_gdb_string(buf, len); + } else { + cyg_io_write(io->chan, buf, &len); + } + } +} + +static int +uart_read(void *base, char *buf, int len) +{ + struct BSP_IO *io = (struct BSP_IO *)base; + if (io->chan) { + cyg_io_read(io->chan, buf, &len); + return len; + } + return 0; +} + +static int +uart_getchar(void *base) +{ + char buf = '\0'; + int len; + struct BSP_IO *io = (struct BSP_IO *)base; + if (io->chan) { + len = 1; + cyg_io_read(io->chan, &buf, &len); + } + return buf; +} + +static int +uart_control(void *base, int func, ...) +{ + // FIXME - need to fill this in! +} + +/* + * Setup the bsp_comm_channel data structure + */ +struct BSP_IO bsp_comm_io[] = { + {CYGDAT_CYGMON_CONSOLE_DEV, 0}, // Console device +}; + +struct bsp_comm_channel _bsp_comm_list[] = +{ + { + { "UART 0", + BSP_COMM_SERIAL, + BSP_PROTO_NONE }, + { (void*)&bsp_comm_io[0], + uart_write, + uart_read, + uart_putchar, + uart_getchar, + uart_control } + }, +}; +int _bsp_num_comms = sizeof(_bsp_comm_list)/sizeof(_bsp_comm_list[0]); + +void +_bsp_init_board_comm(void) +{ + int i; + for (i = 0; i < _bsp_num_comms; i++) { + Cyg_ErrNo err; + struct BSP_IO *io; + io = (struct BSP_IO *)_bsp_comm_list[i].procs.ch_data; + if ((err = cyg_io_lookup(io->name, &io->chan)) != ENOERR) { + diag_printf("Can't open '%s'\n", io->name); + } + } +} + +/* + * Array of memory region descriptors. We just list RAM. + */ +#ifdef CYGMEM_REGION_ram +#define RAM_VIRTUAL_BASE CYGMEM_REGION_ram +#define RAM_TOTAL_SIZE CYGMEM_REGION_ram_SIZE +#else +#define RAM_VIRTUAL_BASE 0x00008000 +#define RAM_TOTAL_SIZE 0x00FF8000 +#endif + +struct bsp_mem_info _bsp_memory_list[] = +{ + { (void *)RAM_VIRTUAL_BASE, + (void *)RAM_VIRTUAL_BASE, + 0, + RAM_TOTAL_SIZE, + BSP_MEM_RAM + }, +}; + +/* + * Number of memory region descriptors. + */ +int _bsp_num_mem_regions = sizeof(_bsp_memory_list)/sizeof(_bsp_memory_list[0]); + +void +_bsp_install_cpu_irq_controllers(void) +{ +} + +void +_bsp_install_board_irq_controllers(void) +{ +} + +void +__init_irq_controllers(void) +{ +} + +void +_bsp_board_init(void) +{ + /* + * Define platform info. + */ +#ifdef HAL_PLATFORM_CPU + _bsp_platform_info.cpu = HAL_PLATFORM_CPU; +#else + _bsp_platform_info.cpu = "Unknown CPU"; +#endif +#ifdef HAL_PLATFORM_BOARD + _bsp_platform_info.board = HAL_PLATFORM_BOARD; +#else + _bsp_platform_info.board = "Unknown board"; +#endif +#ifdef HAL_PLATFORM_EXTRA + _bsp_platform_info.extra = HAL_PLATFORM_EXTRA; +#else + _bsp_platform_info.extra = ""; +#endif +} + +extern char *strchr(char *, char); +char * +index(char *string, char key) +{ + return strchr(string, key); +} + +void +flush_i_cache(void) +{ + HAL_ICACHE_SYNC(); +} + +void +ecos_bsp_console_putc(char c) +{ + if (bsp_shared_data) { + bsp_console_putc(c); + } +} + +char +ecos_bsp_console_getc(void) +{ + if (bsp_shared_data) { + return bsp_console_getc(); + } else { + return '?'; + } +}
