From c84c7d32223976fb93e18fb5fb7dad26289ddf90 Mon Sep 17 00:00:00 2001 From: Kelvin Lawson Date: Fri, 21 Sep 2012 02:45:06 +0100 Subject: [PATCH] modules.c: Line ending changes. syscalls.c: Add _sbrk and friends, as well as a basic c startup. --- platforms/qemu_integratorcp/modules.c | 230 ++++++++++++------------- platforms/qemu_integratorcp/syscalls.c | 91 ++++++++++ 2 files changed, 206 insertions(+), 115 deletions(-) create mode 100644 platforms/qemu_integratorcp/syscalls.c diff --git a/platforms/qemu_integratorcp/modules.c b/platforms/qemu_integratorcp/modules.c index c611d68..861e874 100644 --- a/platforms/qemu_integratorcp/modules.c +++ b/platforms/qemu_integratorcp/modules.c @@ -1,115 +1,115 @@ -/* - * Copyright (c) 2012, Natie van Rooyen. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. No personal names or organizations' names associated with the - * Atomthreads project may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include "modules.h" -#include -#include -#include "atomport_private.h" -#include "atom.h" -#include "atomport.h" -#include "types.h" - -ICP_TIMER_T* const board_timer_0 = (ICP_TIMER_T*) BOARD_BASE_ADDRESS_TIMER_0 ; -ICP_PIC_T * const board_pic = (ICP_PIC_T*) BOARD_BASE_ADDRESS_PIC ; - -/** - * \b dbg_format_msg - * - * Same as printf. - * - */ -void -dbg_format_msg (char *format, ...) -{ - va_list args; - static char msg[256] ; - CRITICAL_STORE ; - - va_start (args, format) ; - CRITICAL_START() ; - vsnprintf ((char*)msg, 256, (char*)format, args) ; - CRITICAL_END() ; - - printf (msg) ; -} - -/** - * \b low_level_init - * - * Initializes the PIC and start the system timer tick intrerupt. - * - */ -int -low_level_init (void) -{ - - board_pic->IRQ_ENABLECLR = ICP_PIC_IRQ_TIMERINT0 ; - board_timer_0->INTCLR = 1 ; - board_pic->IRQ_ENABLESET |= ICP_PIC_IRQ_TIMERINT0 ; - - board_timer_0->LOAD = 0x2000 ; - board_timer_0->BGLOAD = 0x2000 ; - board_timer_0->CONTROL = ICP_TIMER_CONTROL_ENABLE | - ICP_TIMER_CONTROL_MODE | - ICP_TIMER_CONTROL_IE | - /*ICP_TIMER_CONTROL_PRESCALE_256 |*/ - ICP_TIMER_CONTROL_TIMER_SIZE ; - - return 0 ; -} - - -/** - * \b __context_preempt_handler - * - * System timer tic interupt handler. - * - */ -void -__context_preempt_handler (void) -{ - unsigned int status = board_pic->IRQ_STATUS ; - - if (status | ICP_PIC_IRQ_TIMERINT0) { - - atomIntEnter(); - - /* Call the OS system tick handler */ - atomTimerTick(); - - /* ack the interrupt */ - board_timer_0->INTCLR = 0x1 ; - - /* Call the interrupt exit routine */ - atomIntExit(TRUE); - - } - - -} - +/* + * Copyright (c) 2012, Natie van Rooyen. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "modules.h" +#include +#include +#include "atomport_private.h" +#include "atom.h" +#include "atomport.h" +#include "types.h" + +ICP_TIMER_T* const board_timer_0 = (ICP_TIMER_T*) BOARD_BASE_ADDRESS_TIMER_0 ; +ICP_PIC_T * const board_pic = (ICP_PIC_T*) BOARD_BASE_ADDRESS_PIC ; + +/** + * \b dbg_format_msg + * + * Same as printf. + * + */ +void +dbg_format_msg (char *format, ...) +{ + va_list args; + static char msg[256] ; + CRITICAL_STORE ; + + va_start (args, format) ; + CRITICAL_START() ; + vsnprintf ((char*)msg, 256, (char*)format, args) ; + CRITICAL_END() ; + + printf (msg) ; +} + +/** + * \b low_level_init + * + * Initializes the PIC and start the system timer tick intrerupt. + * + */ +int +low_level_init (void) +{ + + board_pic->IRQ_ENABLECLR = ICP_PIC_IRQ_TIMERINT0 ; + board_timer_0->INTCLR = 1 ; + board_pic->IRQ_ENABLESET |= ICP_PIC_IRQ_TIMERINT0 ; + + board_timer_0->LOAD = 0x2000 ; + board_timer_0->BGLOAD = 0x2000 ; + board_timer_0->CONTROL = ICP_TIMER_CONTROL_ENABLE | + ICP_TIMER_CONTROL_MODE | + ICP_TIMER_CONTROL_IE | + /*ICP_TIMER_CONTROL_PRESCALE_256 |*/ + ICP_TIMER_CONTROL_TIMER_SIZE ; + + return 0 ; +} + + +/** + * \b __context_preempt_handler + * + * System timer tic interupt handler. + * + */ +void +__context_preempt_handler (void) +{ + unsigned int status = board_pic->IRQ_STATUS ; + + if (status | ICP_PIC_IRQ_TIMERINT0) { + + atomIntEnter(); + + /* Call the OS system tick handler */ + atomTimerTick(); + + /* ack the interrupt */ + board_timer_0->INTCLR = 0x1 ; + + /* Call the interrupt exit routine */ + atomIntExit(TRUE); + + } + + +} + diff --git a/platforms/qemu_integratorcp/syscalls.c b/platforms/qemu_integratorcp/syscalls.c new file mode 100644 index 0000000..f3d89d9 --- /dev/null +++ b/platforms/qemu_integratorcp/syscalls.c @@ -0,0 +1,91 @@ +/* Mostly based on code from http://balau82.wordpress.com */ + +#include + +enum { + UART_FR_RXFE = 0x10, + UART_FR_TXFF = 0x20, + UART0_ADDR = 0x16000000, +}; + +#define UART_DR(baseaddr) (*(unsigned int *)(baseaddr)) +#define UART_FR(baseaddr) (*(((unsigned int *)(baseaddr))+6)) + +int _close(int file) { return -1; } + +int _fstat(int file, struct stat *st) { + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) { return 1; } + +int _lseek(int file, int ptr, int dir) { return 0; } + +int _open(const char *name, int flags, int mode) { return -1; } + +int _read(int file, char *ptr, int len) { + int todo; + if(len == 0) + return 0; + while(UART_FR(UART0_ADDR) & UART_FR_RXFE) + ; + *ptr++ = UART_DR(UART0_ADDR); + for(todo = 1; todo < len; todo++) { + if(UART_FR(UART0_ADDR) & UART_FR_RXFE) { + break; + } + *ptr++ = UART_DR(UART0_ADDR); + } + return todo; +} + +char *heap_end = 0; +caddr_t _sbrk(int incr) { + extern char heap_low; /* Defined by the linker */ + extern char heap_top; /* Defined by the linker */ + char *prev_heap_end; + + if (heap_end == 0) { + heap_end = &heap_low; + } + prev_heap_end = heap_end; + + if (heap_end + incr > &heap_top) { + /* Heap and stack collision */ + return (caddr_t)0; + } + + heap_end += incr; + return (caddr_t) prev_heap_end; + } + +int _write(int file, char *ptr, int len) { + int todo; + + for (todo = 0; todo < len; todo++) { + while(UART_FR(UART0_ADDR) & UART_FR_TXFF) + ; + UART_DR(UART0_ADDR) = *ptr++; + } + return len; + } + +/* C Startup code */ +extern unsigned long _end_text, _start_data, _end_data, _start_bss, _end_bss; +extern int main(void); +void c_startup(void) +{ + unsigned long *src, *dst; + + src = &_end_text; + dst = &_start_data; + while(dst < &_end_data) + *(dst++) = *(src++); + + src = &_start_bss; + while(src < &_end_bss) + *(src++) = 0; + + main(); +}