From ff05007a6eb2daee7cb98e513dfd541cd531d922 Mon Sep 17 00:00:00 2001 From: Joakim Gebart <joakim.gebart@eistec.se> Date: Wed, 22 Jul 2015 14:13:30 +0200 Subject: [PATCH] boards/mulle: cleanup Remove old syscalls implementation from before cortexm_common unification and sys/newlib introduction. --- boards/mulle/Makefile.dep | 3 + boards/mulle/board.c | 34 +- boards/mulle/include/devicemap.h | 63 ---- cpu/k60/syscalls.c | 608 ------------------------------- 4 files changed, 21 insertions(+), 687 deletions(-) delete mode 100644 boards/mulle/include/devicemap.h delete mode 100644 cpu/k60/syscalls.c diff --git a/boards/mulle/Makefile.dep b/boards/mulle/Makefile.dep index 7adfff1029..b4bf5b9a74 100644 --- a/boards/mulle/Makefile.dep +++ b/boards/mulle/Makefile.dep @@ -3,6 +3,9 @@ ifneq (,$(filter ng_netif_default,$(USEMODULE))) USEMODULE += ng_nomac endif +# The RTT clock drives the core clock in the default configuration +FEATURES_REQUIRED += periph_rtt + # The Mulle uses NVRAM to store persistent variables, such as boot count. #~ USEMODULE += nvram_spi # Uncomment above when #2353 is merged. diff --git a/boards/mulle/board.c b/boards/mulle/board.c index bec2290ff8..ed4b78e4ab 100644 --- a/boards/mulle/board.c +++ b/boards/mulle/board.c @@ -25,8 +25,7 @@ #include "mcg.h" #include "periph/gpio.h" #include "periph/uart.h" -#include "periph/rtc.h" -#include "devicemap.h" +#include "periph/rtt.h" /** * @brief Initialize the boards on-board LEDs @@ -57,6 +56,15 @@ void board_init(void) /* initialize the boards LEDs, this is done first for debugging purposes */ leds_init(); + /* Initialize power control pins */ + power_pins_init(); + + /* Turn on Vperiph for peripherals */ + gpio_set(MULLE_POWER_VPERIPH); + + /* Turn on AVDD for reading voltages */ + gpio_set(MULLE_POWER_AVDD); + LED_RED_ON; /* Initialize RTC oscillator as early as possible since we are using it as a @@ -66,7 +74,7 @@ void board_init(void) * stuff is initializing. */ /* If the clock is not stable then the UART will have the wrong baud rate * for debug prints as well */ - rtc_init(); + rtt_init(); /* Set up clocks */ set_safe_clock_dividers(); @@ -90,21 +98,15 @@ void board_init(void) /* initialize the CPU */ cpu_init(); - - LED_YELLOW_ON; - - LED_GREEN_ON; - - /* Initialize power control pins */ - power_pins_init(); - - /* Turn on Vperiph for peripherals */ - gpio_set(MULLE_POWER_VPERIPH); - - /* Turn on AVDD for reading voltages */ - gpio_set(MULLE_POWER_AVDD); } +/** + * @brief Initialize the boards on-board LEDs + * + * The LEDs are initialized here in order to be able to use them in the early + * boot for diagnostics. + * + */ static inline void leds_init(void) { /* The pin configuration can be found in board.h and periph_conf.h */ diff --git a/boards/mulle/include/devicemap.h b/boards/mulle/include/devicemap.h deleted file mode 100644 index 9a6b3d8880..0000000000 --- a/boards/mulle/include/devicemap.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2014-2015 Eistec AB - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License v2.1. See the file LICENSE in the top level directory for more - * details. - */ - -#ifndef DEVICEMAP_H_ -#define DEVICEMAP_H_ - -/** - * @ingroup board_mulle - * @{ - * - * @file - * @brief Device I/O mappings for the Mulle platform. - * - * @author Joakim Gebart <joakim.gebart@eistec.se> - * - */ - -#include "devopttab.h" - -/** Maximum number of file descriptors allocated to hardware devices. All fd's - * above this number will be remapped to CFS accesses. */ -#define MAX_OPEN_DEVICES 16 /* Arbitrarily chosen */ - -/** Number of IO devices in this platform implementation */ -#define NUM_IO_DEVICES 16 /* Arbitrarily chosen */ - -#ifdef __cplusplus -extern "C" { -#endif - -/* This table maps the standard streams to device operations table entries. */ -extern const devoptab_t *devoptab_list[MAX_OPEN_DEVICES]; - -/* This table maps filenames to devices */ -/** @brief Mappings between file name and device handle */ -typedef struct { - const char *name; /**< Device file name */ - const devoptab_t *devoptab; /**< Pointer to device operations table entry */ -} devoptab_name_t; - -/** @brief Table of device files */ -typedef struct { - unsigned int len; /**< number of entries */ - const devoptab_name_t *data; /**< Pointer to first table entry */ -} devoptab_name_list_t; - -extern const devoptab_name_list_t devoptab_name_list; - -/** @brief Initialize the device map */ -void devicemap_init(void); - -#ifdef __cplusplus -} -#endif - -/** @} */ - -#endif /* !defined(DEVICEMAP_H_) */ diff --git a/cpu/k60/syscalls.c b/cpu/k60/syscalls.c deleted file mode 100644 index b7ab93f48c..0000000000 --- a/cpu/k60/syscalls.c +++ /dev/null @@ -1,608 +0,0 @@ -/* - * Copyright (C) 2015 Eistec AB - * - * This file is subject to the terms and conditions of the GNU Lesser General - * Public License v2.1. See the file LICENSE in the top level directory for more - * details. - */ - - -#include <unistd.h> -#include <sys/reent.h> -#include <sys/times.h> -#include <string.h> -#include <stdio.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> - -#include "cpu.h" -#include "board.h" -#include "devopttab.h" -#include "devicemap.h" -#include "thread.h" -#if CFS_ENABLED -#include "cfs.h" -#endif /* CFS_ENABLED */ -#include "mutex.h" -#include "ringbuffer.h" -#include "periph/uart.h" -#ifdef MODULE_UART0 -#include "board_uart0.h" -#endif - -/** - * @ingroup cpu_k60 - * @{ - * - * @file - * @brief Syscall implementations for K60 CPU. - * - * @author Joakim Gebart <joakim.gebart@eistec.se> - */ - - -/* Empty environment definition */ -char *__env[1] = { 0 }; -char **environ = __env; - -/* Lock variable used to protect sbrk_r from clobbering the break variable when - * called simultaneously from more than one thread. */ -static mutex_t sbrk_mutex = MUTEX_INIT; - -/* Align all sbrk arguments to this many bytes */ -#define DYNAMIC_MEMORY_ALIGN 4 - -#ifndef MODULE_UART0 -/** - * @brief use mutex for waiting on incoming UART chars - */ -static mutex_t uart_rx_mutex; -static char rx_buf_mem[STDIO_RX_BUFSIZE]; -static ringbuffer_t rx_buf; -#endif - -/** - * @brief Receive a new character from the UART and put it into the receive buffer - */ -static void stdio_rx_cb(void *arg, char data) -{ - (void)arg; - -#ifdef MODULE_UART0 - if (uart0_handler_pid) { - uart0_handle_incoming(data); - - uart0_notify_thread(); - } -#else - ringbuffer_add_one(&rx_buf, data); - mutex_unlock(&uart_rx_mutex); -#endif -} - -/** - * @brief Initialize NewLib, called by __libc_init_array() from the startup script - */ -void _init(void) -{ -#ifndef MODULE_UART0 - mutex_init(&uart_rx_mutex); - ringbuffer_init(&rx_buf, rx_buf_mem, STDIO_RX_BUFSIZE); -#endif - uart_init(STDIO, STDIO_BAUDRATE, stdio_rx_cb, 0, 0); -} - -/** - * @brief Free resources on NewLib de-initialization, not used for RIOT - */ -void _fini(void) -{ - /* nothing to do here */ -} - - -/* ************************ */ -/* Process control syscalls */ -/* ************************ */ - -void -_exit(int code) -{ -#if DEVELHELP - volatile int status; /* volatile to prevent optimizations to remove the variable from memory */ - status = code; - (void)status; /* Suppress compiler warnings about unused variable */ - - /* See local variable `status` during debugger break. */ - asm volatile ("bkpt #0"); -#else - (void) code; - NVIC_SystemReset(); -#endif - - while (1); -} - -int -_fork_r(struct _reent *r) -{ - /* return "not supported" */ - r->_errno = ENOTSUP; - return -1; -} - -int -_execve_r(struct _reent *r, const char *name, char *const *argv, char *const *env) -{ - /* Not supported */ - (void)name; /* Suppress compiler warnings about unused parameters */ - (void)argv; - (void)env; - - r->_errno = ENOMEM; - return -1; -} - -int -_kill_r(struct _reent *r, int pid, int sig) -{ - /* Not supported */ - (void)pid; /* Suppress compiler warnings about unused parameters */ - (void)sig; - - r->_errno = EINVAL; - return -1; -} - -pid_t -_getpid(void) -{ - return sched_active_pid; -} - -pid_t -_getpid_r(struct _reent *ptr) -{ - (void) ptr; - return sched_active_pid; -} - -clock_t -_times_r(struct _reent *r, struct tms *buf) -{ - /* Not supported, yet */ - (void)buf; /* Suppress compiler warnings about unused parameters */ - - r->_errno = EACCES; - return -1; -} - -int -_wait_r(struct _reent *r, int *status) -{ - /* Not supported, yet */ - (void)status; /* Suppress compiler warnings about unused parameters */ - - r->_errno = ECHILD; - return -1; -} - -/* ******************************** */ -/* File descriptor related syscalls */ -/* ******************************** */ - -/** - * @brief Internal helper for generating FDs - * - * @return An unallocated file descriptor, -1 if no free FD can be found. - */ -static int get_next_dev_fd(void); - -static int get_next_dev_fd(void) -{ - int fd; - - for (fd = 0; fd < MAX_OPEN_DEVICES; ++fd) { - if (devoptab_list[fd] == NULL) { - return fd; - } - } - - return -1; -} - -int -_open_r(struct _reent *r, const char *name, int flags, int mode) -{ - unsigned int i; - int fd; -#if CFS_ENABLED - int cfs_flags = 0; -#endif - - /* Search for devices */ - for (i = 0; i < devoptab_name_list.len; ++i) { - if (strcmp(devoptab_name_list.data[i].name, name) == 0) { - /* Device found */ - fd = get_next_dev_fd(); - - if (fd < 0) { - /* No free FDs. */ - /* ENFILE means too many file descriptors open, system-wide. */ - r->_errno = ENFILE; - return -1; - } - - /* Set up device operations table and call open method */ - devoptab_list[fd] = devoptab_name_list.data[i].devoptab; - /* open_r method is mandatory */ - devoptab_list[fd]->open_r(r, name, flags, mode); - return fd; - } - } - -#if CFS_ENABLED - - /* Not a device name, try searching for files. */ - /* Translate POSIX O_* flags to CFS */ - if (flags & O_APPEND) { - cfs_flags |= CFS_APPEND; - } - - if (flags & O_RDWR) { - cfs_flags |= CFS_READ | CFS_WRITE; - } - - if (flags & O_RDONLY) { - cfs_flags |= CFS_READ; - } - - if (flags & O_WRONLY) { - cfs_flags |= CFS_WRITE; - } - - fd = cfs_open(name, cfs_flags); - - if (fd < 0) { - /* Not found or whatever, CFS doesn't tell us why it failed. */ - r->_errno = ENOENT; - return -1; - } - - fd += MAX_OPEN_DEVICES; /* Remap from CFS FD number */ - return fd; -#else - r->_errno = ENOENT; - return -1; -#endif - -} - -int -_close_r(struct _reent *r, int fd) -{ - int ret; - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { -#if CFS_ENABLED - /* CFS file */ - fd -= MAX_OPEN_DEVICES; /* Remap to CFS FD number */ - cfs_close(fd); -#endif - return 0; /* cfs_close does not indicate failures */ - } - - if (devoptab_list[fd] == NULL) { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } - - if (devoptab_list[fd]->close_r == NULL) { - /* Function not implemented */ - r->_errno = ENOSYS; - return -1; - } - - /* Call method from device operations table */ - ret = devoptab_list[fd]->close_r(r, fd); - - if (ret == 0) { - /* Successfully closed, clear out device operations table entry to free up - * the file descriptor. */ - devoptab_list[fd] = NULL; - } - - return ret; -} - -ssize_t -_read_r(struct _reent *r, int fd, void *ptr, size_t len) -{ - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { -#if CFS_ENABLED - int ret; - /* CFS file */ - fd -= MAX_OPEN_DEVICES; /* Remap to CFS FD number */ - /* this is not really reentrant */ - ret = cfs_read(fd, ptr, len); - - if (ret < 0) { - r->_errno = EBADF; - } - - return ret; -#else - r->_errno = EBADF; - return -1; -#endif - } - - if (devoptab_list[fd] == NULL) { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } - - if (devoptab_list[fd]->read_r == NULL) { - /* Function not implemented */ - r->_errno = ENOSYS; - return -1; - } - - /* Call method from device operations table */ - return devoptab_list[fd]->read_r(r, fd, ptr, len); -} - -ssize_t -_write_r(struct _reent *r, int fd, const void *ptr, size_t len) -{ - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { -#if CFS_ENABLED - int ret; - /* CFS file */ - fd -= MAX_OPEN_DEVICES; /* Remap to CFS FD number */ - /* this is not really reentrant */ - ret = cfs_write(fd, (const char *)ptr, len); - - if (ret < 0) { - r->_errno = EBADF; - } - - return ret; -#else - r->_errno = EBADF; - return -1; -#endif - } - - if (devoptab_list[fd] == NULL) { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } - - if (devoptab_list[fd]->write_r == NULL) { - /* Function not implemented */ - r->_errno = ENOSYS; - return -1; - } - - /* Call method from device operations table */ - return devoptab_list[fd]->write_r(r, fd, ptr, len); -} - -off_t -_lseek_r(struct _reent *r, int fd, off_t offset, int whence) -{ - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { -#if CFS_ENABLED - int ret; - /* CFS file */ - fd -= MAX_OPEN_DEVICES; /* Remap to CFS FD number */ - /* CFS_SEEK_* macros used by the CFS whence parameter is assumed to - * correspond with POSIX constants */ - /* this is not really reentrant */ - ret = cfs_seek(fd, offset, whence); - - if (ret < 0) { - r->_errno = EBADF; - } - - return ret; -#else - r->_errno = EBADF; - return -1; -#endif - } - - if (devoptab_list[fd] == NULL) { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } - - if (devoptab_list[fd]->lseek_r == NULL) { - /* Function not implemented */ - r->_errno = ENOSYS; - return -1; - } - - /* Call method from device operations table */ - return devoptab_list[fd]->lseek_r(r, fd, offset, whence); -} - -int -_fstat_r(struct _reent *r, int fd, struct stat *st) -{ - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { - /* CFS file */ - st->st_mode = S_IFREG | S_IRWXU | S_IRWXG | S_IRWXO; /* regular file, 0777 perms (-rwxrwxrwx) */ - /** \todo Handle file size with fstat */ - /* st->st_uid = 0; */ - /* st->st_gid = 0; */ - /* st->st_size = 0; */ - return 0; - } - - if (devoptab_list[fd] != NULL) { - /* Check device operations table to determine mode */ - st->st_mode = devoptab_list[fd]->st_mode; - return 0; - } - else { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } -} - -int -_isatty_r(struct _reent *r, int fd) -{ - - if (fd < 0) { - /* invalid file descriptor */ - r->_errno = EBADF; - return -1; - } - - if (fd >= MAX_OPEN_DEVICES) { - /* CFS file, not a TTY */ - r->_errno = ENOTTY; - return 0; - } - - if (devoptab_list[fd] != NULL) { - /* Check device operations table to determine if it is considered a TTY */ - if (devoptab_list[fd]->isatty == 0) { - r->_errno = ENOTTY; - } - - return devoptab_list[fd]->isatty; - } - else { - /* nothing mapped on that FD */ - r->_errno = EBADF; - return -1; - } -} - -/* Compatibility define for newlib built without REENTRANT_SYSCALLS_PROVIDED */ -int -_isatty(int fd) -{ - /* _REENT is an internal newlib macro, this may cause issues in some situations. */ - return _isatty_r(_REENT, fd); -} - -/* **************************** */ -/* File system related syscalls */ -/* **************************** */ - -int -_stat_r(struct _reent *r, const char *file, struct stat *st) -{ - /* not supported, yet */ - (void)file; /* Suppress compiler warnings about unused parameters */ - (void)st; - r->_errno = ENOENT; - return -1; -} - -int -_link_r(struct _reent *r, const char *old, const char *new) -{ - /* not supported, yet */ - (void)old; /* Suppress compiler warnings about unused parameters */ - (void)new; - r->_errno = EMLINK; - return -1; -} - -int -_unlink_r(struct _reent *r, const char *name) -{ - /* not supported, yet */ - (void)name; /* Suppress compiler warnings about unused parameters */ - r->_errno = ENOENT; - return -1; -} - -/* ********************************** */ -/* Memory management related syscalls */ -/* ********************************** */ - -/* Beginning of unallocated RAM, defined by the linker script */ -extern int _heap_start; -/* End of RAM area available for allocation */ -extern int _heap_end; -/* Current edge of dynamically allocated space */ -static void *current_break = (void *)(&_heap_start); - -/** - * Move the program break. - * - * This function can increase the size of the allocated memory. - * - * NEVER call this from ISRs (or anything that may call this function, e.g. malloc, free). - */ -void *_sbrk_r(struct _reent *r, ptrdiff_t increment) -{ - void *ret; - /* Make sure we have exclusive access to the system break variable. */ - mutex_lock(&sbrk_mutex); - - /* Align memory increment to nearest DYNAMIC_MEMORY_ALIGN bytes upward */ - if (increment % DYNAMIC_MEMORY_ALIGN) { - increment += DYNAMIC_MEMORY_ALIGN - (increment % DYNAMIC_MEMORY_ALIGN); - } - - if (((uint8_t *)current_break + increment) < ((uint8_t *)(&_heap_end))) { - ret = current_break; - current_break = (void *)(((uint8_t *)current_break) + increment); - } - else { - r->_errno = ENOMEM; - ret = (void *) - 1; - } - - mutex_unlock(&sbrk_mutex); - return ret; -} -/** @} */ -- GitLab