first commit
This commit is contained in:
commit
8c39952965
1956 changed files with 1460685 additions and 0 deletions
|
@ -0,0 +1,225 @@
|
|||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 Perry Hung.
|
||||
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
* @file wirish/boards.cpp
|
||||
* @brief init() and board routines.
|
||||
*
|
||||
* This file is mostly interesting for the init() function, which
|
||||
* configures Flash, the core clocks, and a variety of other available
|
||||
* peripherals on the board so the rest of Wirish doesn't have to turn
|
||||
* things on before using them.
|
||||
*
|
||||
* Prior to returning, init() calls boardInit(), which allows boards
|
||||
* to perform any initialization they need to. This file includes a
|
||||
* weak no-op definition of boardInit(), so boards that don't need any
|
||||
* special initialization don't have to define their own.
|
||||
*
|
||||
* How init() works is chip-specific. See the boards_setup.cpp files
|
||||
* under e.g. wirish/stm32f1/, wirish/stmf32f2 for the details, but be
|
||||
* advised: their contents are unstable, and can/will change without
|
||||
* notice.
|
||||
*/
|
||||
|
||||
#include <boards.h>
|
||||
#include <libmaple/libmaple_types.h>
|
||||
#include <libmaple/flash.h>
|
||||
#include <libmaple/nvic.h>
|
||||
#include <libmaple/systick.h>
|
||||
#include "boards_private.h"
|
||||
|
||||
static void setup_flash(void);
|
||||
static void setup_clocks(void);
|
||||
static void setup_nvic(void);
|
||||
static void setup_adcs(void);
|
||||
static void setup_timers(void);
|
||||
|
||||
/*
|
||||
* Exported functions
|
||||
*/
|
||||
|
||||
void init(void) {
|
||||
setup_flash();
|
||||
setup_clocks();
|
||||
setup_nvic();
|
||||
systick_init(SYSTICK_RELOAD_VAL);
|
||||
wirish::priv::board_setup_gpio();
|
||||
setup_adcs();
|
||||
setup_timers();
|
||||
wirish::priv::board_setup_usb();
|
||||
wirish::priv::series_init();
|
||||
boardInit();
|
||||
}
|
||||
|
||||
/* Provide a default no-op boardInit(). */
|
||||
__weak void boardInit(void) {
|
||||
}
|
||||
|
||||
/* You could farm this out to the files in boards/ if e.g. it takes
|
||||
* too long to test on boards with lots of pins. */
|
||||
bool boardUsesPin(uint8 pin) {
|
||||
for (int i = 0; i < BOARD_NR_USED_PINS; i++) {
|
||||
if (pin == boardUsedPins[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Auxiliary routines
|
||||
*/
|
||||
|
||||
static void setup_flash(void) {
|
||||
// Turn on as many Flash "go faster" features as
|
||||
// possible. flash_enable_features() just ignores any flags it
|
||||
// can't support.
|
||||
flash_enable_features(FLASH_PREFETCH | FLASH_ICACHE | FLASH_DCACHE);
|
||||
// Configure the wait states, assuming we're operating at "close
|
||||
// enough" to 3.3V.
|
||||
flash_set_latency(FLASH_SAFE_WAIT_STATES);
|
||||
}
|
||||
|
||||
static void setup_clocks(void) {
|
||||
// Turn on HSI. We'll switch to and run off of this while we're
|
||||
// setting up the main PLL.
|
||||
rcc_turn_on_clk(RCC_CLK_HSI);
|
||||
|
||||
// Turn off and reset the clock subsystems we'll be using, as well
|
||||
// as the clock security subsystem (CSS). Note that resetting CFGR
|
||||
// to its default value of 0 implies a switch to HSI for SYSCLK.
|
||||
RCC_BASE->CFGR = 0x00000000;
|
||||
rcc_disable_css();
|
||||
rcc_turn_off_clk(RCC_CLK_PLL);
|
||||
rcc_turn_off_clk(RCC_CLK_HSE);
|
||||
wirish::priv::board_reset_pll();
|
||||
// Clear clock readiness interrupt flags and turn off clock
|
||||
// readiness interrupts.
|
||||
RCC_BASE->CIR = 0x00000000;
|
||||
#if !USE_HSI_CLOCK
|
||||
// Enable HSE, and wait until it's ready.
|
||||
rcc_turn_on_clk(RCC_CLK_HSE);
|
||||
while(!rcc_is_clk_ready(RCC_CLK_HSE))
|
||||
;
|
||||
#endif
|
||||
// Configure AHBx, APBx, etc. prescalers and the main PLL.
|
||||
wirish::priv::board_setup_clock_prescalers();
|
||||
rcc_configure_pll(&wirish::priv::w_board_pll_cfg);
|
||||
|
||||
// Enable the PLL, and wait until it's ready.
|
||||
rcc_turn_on_clk(RCC_CLK_PLL);
|
||||
while(!rcc_is_clk_ready(RCC_CLK_PLL))
|
||||
;
|
||||
|
||||
// Finally, switch to the now-ready PLL as the main clock source.
|
||||
rcc_switch_sysclk(RCC_CLKSRC_PLL);
|
||||
}
|
||||
|
||||
/*
|
||||
* These addresses are where usercode starts when a bootloader is
|
||||
* present. If no bootloader is present, the user NVIC usually starts
|
||||
* at the Flash base address, 0x08000000.
|
||||
*/
|
||||
#if defined(BOOTLOADER_maple)
|
||||
#define USER_ADDR_ROM 0x08005000
|
||||
#else
|
||||
#define USER_ADDR_ROM 0x08000000
|
||||
#endif
|
||||
#define USER_ADDR_RAM 0x20000C00
|
||||
extern char __text_start__;
|
||||
|
||||
static void setup_nvic(void) {
|
||||
|
||||
nvic_init((uint32)VECT_TAB_ADDR, 0);
|
||||
|
||||
/* Roger Clark. We now control nvic vector table in boards.txt using the build.vect paramater
|
||||
#ifdef VECT_TAB_FLASH
|
||||
nvic_init(USER_ADDR_ROM, 0);
|
||||
#elif defined VECT_TAB_RAM
|
||||
nvic_init(USER_ADDR_RAM, 0);
|
||||
#elif defined VECT_TAB_BASE
|
||||
nvic_init((uint32)0x08000000, 0);
|
||||
#elif defined VECT_TAB_ADDR
|
||||
// A numerically supplied value
|
||||
nvic_init((uint32)VECT_TAB_ADDR, 0);
|
||||
#else
|
||||
// Use the __text_start__ value from the linker script; this
|
||||
// should be the start of the vector table.
|
||||
nvic_init((uint32)&__text_start__, 0);
|
||||
#endif
|
||||
|
||||
*/
|
||||
}
|
||||
|
||||
static void adc_default_config(adc_dev *dev) {
|
||||
adc_enable_single_swstart(dev);
|
||||
adc_set_sample_rate(dev, wirish::priv::w_adc_smp);
|
||||
}
|
||||
|
||||
static void setup_adcs(void) {
|
||||
adc_set_prescaler(wirish::priv::w_adc_pre);
|
||||
adc_foreach(adc_default_config);
|
||||
}
|
||||
|
||||
static void timer_default_config(timer_dev *dev) {
|
||||
timer_adv_reg_map *regs = (dev->regs).adv;
|
||||
const uint16 full_overflow = 0xFFFF;
|
||||
const uint16 half_duty = 0x8FFF;
|
||||
|
||||
timer_init(dev);
|
||||
timer_pause(dev);
|
||||
|
||||
regs->CR1 = TIMER_CR1_ARPE;
|
||||
regs->PSC = 1;
|
||||
regs->SR = 0;
|
||||
regs->DIER = 0;
|
||||
regs->EGR = TIMER_EGR_UG;
|
||||
switch (dev->type) {
|
||||
case TIMER_ADVANCED:
|
||||
regs->BDTR = TIMER_BDTR_MOE | TIMER_BDTR_LOCK_OFF;
|
||||
// fall-through
|
||||
case TIMER_GENERAL:
|
||||
timer_set_reload(dev, full_overflow);
|
||||
for (uint8 channel = 1; channel <= 4; channel++) {
|
||||
if (timer_has_cc_channel(dev, channel)) {
|
||||
timer_set_compare(dev, channel, half_duty);
|
||||
timer_oc_set_mode(dev, channel, TIMER_OC_MODE_PWM_1,
|
||||
TIMER_OC_PE);
|
||||
}
|
||||
}
|
||||
// fall-through
|
||||
case TIMER_BASIC:
|
||||
break;
|
||||
}
|
||||
|
||||
timer_generate_update(dev);
|
||||
timer_resume(dev);
|
||||
}
|
||||
|
||||
static void setup_timers(void) {
|
||||
timer_foreach(timer_default_config);
|
||||
}
|
|
@ -0,0 +1,128 @@
|
|||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2012 LeafLabs, LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
* @file wirish/stm32f1/boards_setup.cpp
|
||||
* @author Marti Bolivar <mbolivar@leaflabs.com>
|
||||
* @brief STM32F1 chip setup.
|
||||
*
|
||||
* This file controls how init() behaves on the STM32F1. Be very
|
||||
* careful when changing anything here. Many of these values depend
|
||||
* upon each other.
|
||||
*/
|
||||
|
||||
#include "boards_private.h"
|
||||
|
||||
#include <libmaple/gpio.h>
|
||||
#include <libmaple/timer.h>
|
||||
|
||||
#include <boards.h>
|
||||
#include <usb_serial.h>
|
||||
|
||||
// Allow boards to provide a PLL multiplier. This is useful for
|
||||
// e.g. STM32F100 value line MCUs, which use slower multipliers.
|
||||
// (We're leaving the default to RCC_PLLMUL_9 for now, since that
|
||||
// works for F103 performance line MCUs, which is all that LeafLabs
|
||||
// currently officially supports).
|
||||
#ifndef BOARD_RCC_PLLMUL
|
||||
#if !USE_HSI_CLOCK
|
||||
#if F_CPU==128000000
|
||||
#define BOARD_RCC_PLLMUL RCC_PLLMUL_16
|
||||
#elif F_CPU==72000000
|
||||
#define BOARD_RCC_PLLMUL RCC_PLLMUL_9
|
||||
#elif F_CPU==48000000
|
||||
#define BOARD_RCC_PLLMUL RCC_PLLMUL_6
|
||||
#elif F_CPU==16000000
|
||||
#define BOARD_RCC_PLLMUL RCC_PLLMUL_2
|
||||
#endif
|
||||
#else
|
||||
#define BOARD_RCC_PLLMUL RCC_PLLMUL_16
|
||||
#endif
|
||||
#endif
|
||||
|
||||
namespace wirish {
|
||||
namespace priv {
|
||||
|
||||
static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL};
|
||||
#if !USE_HSI_CLOCK
|
||||
__weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data};
|
||||
#else
|
||||
__weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data};
|
||||
#endif
|
||||
__weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6;
|
||||
__weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5;
|
||||
|
||||
__weak void board_reset_pll(void) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
__weak void board_setup_clock_prescalers(void) {
|
||||
rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1);
|
||||
rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2);
|
||||
rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1);
|
||||
rcc_clk_disable(RCC_USB);
|
||||
#if F_CPU == 72000000
|
||||
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5);
|
||||
#elif F_CPU == 48000000
|
||||
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1);
|
||||
#endif
|
||||
}
|
||||
|
||||
__weak void board_setup_gpio(void) {
|
||||
/**
|
||||
* PA14 is a pull up pin. But, some V5 boards it start with LOW state! And just behave properly when the Z- PROBE is actived at least once.
|
||||
* So, if the sensor isnt actived, the PA14 pin will be forever in LOW state, telling Marlin the probe IS ALWAYS ACTIVE, that isnt the case!
|
||||
* Chitu original firmware seems to start with every pullup PIN with HIGH to workaround this.
|
||||
* So we are doing the same here.
|
||||
* This hack only works if applied *before* the GPIO Init, it's the reason I did it here.
|
||||
*/
|
||||
#ifdef CHITU_V5_Z_MIN_BUGFIX
|
||||
GPIOA->regs->BSRR = (1U << PA14);
|
||||
#endif
|
||||
gpio_init_all();
|
||||
}
|
||||
|
||||
__weak void board_setup_usb(void) {
|
||||
#ifdef SERIAL_USB
|
||||
#ifdef GENERIC_BOOTLOADER
|
||||
// Reset the USB interface on generic boards - developed by Victor PV
|
||||
gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP);
|
||||
gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0);
|
||||
|
||||
for (volatile unsigned int i = 0; i < 512; i++); // Only small delay seems to be needed, and USB pins will get configured in Serial.begin
|
||||
gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING);
|
||||
#endif
|
||||
Serial.begin(); // Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility
|
||||
#endif
|
||||
}
|
||||
|
||||
__weak void series_init(void) {
|
||||
// Initialize AFIO here, too, so peripheral remaps and external
|
||||
// interrupts work out of the box.
|
||||
afio_init();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2011 LeafLabs, LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* This file is a modified version of a file obtained from
|
||||
* CodeSourcery Inc. (now part of Mentor Graphics Corp.), in which the
|
||||
* following text appeared:
|
||||
*
|
||||
* Copyright (c) 2006, 2007 CodeSourcery Inc
|
||||
*
|
||||
* The authors hereby grant permission to use, copy, modify, distribute,
|
||||
* and license this software and its documentation for any purpose, provided
|
||||
* that existing copyright notices are retained in all copies and that this
|
||||
* notice is included verbatim in any distributions. No written agreement,
|
||||
* license, or royalty fee is required for any of the authorized uses.
|
||||
* Modifications to this software may be copyrighted by their authors
|
||||
* and need not follow the licensing terms described here, provided that
|
||||
* the new terms are clearly indicated on the first page of each file where
|
||||
* they apply.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <libmaple/rcc.h>
|
||||
#include <libmaple/libmaple.h>
|
||||
#include <libmaple/bitband.h>
|
||||
|
||||
#include "rcc_private.h"
|
||||
|
||||
#include <libmaple/usart.h>
|
||||
#include <libmaple/gpio.h>
|
||||
#include "usart_private.h"
|
||||
|
||||
#include <libmaple/sdio.h>
|
||||
#include <string.h>
|
||||
|
||||
extern void __libc_init_array(void);
|
||||
|
||||
extern int main(int, char**, char**);
|
||||
|
||||
extern void exit(int) __attribute__((noreturn, weak));
|
||||
|
||||
/* The linker must ensure that these are at least 4-byte aligned. */
|
||||
extern char __data_start__, __data_end__;
|
||||
extern char __bss_start__, __bss_end__;
|
||||
|
||||
struct rom_img_cfg {
|
||||
int *img_start;
|
||||
};
|
||||
|
||||
extern char _lm_rom_img_cfgp;
|
||||
extern void __lm_error();
|
||||
extern void timer_disable_all();
|
||||
|
||||
/* Turn off ADC */
|
||||
extern void adc_disable_all();
|
||||
|
||||
/* Turn off all USARTs */
|
||||
extern void usart_disable_all();
|
||||
extern void DisableEverything();
|
||||
|
||||
void __attribute__((noreturn)) start_c(void) {
|
||||
struct rom_img_cfg *img_cfg = (struct rom_img_cfg*)&_lm_rom_img_cfgp;
|
||||
int *src = img_cfg->img_start;
|
||||
int *dst = (int*)&__data_start__;
|
||||
int exit_code;
|
||||
|
||||
asm("CPSID I");
|
||||
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
|
||||
/* Set HSION bit */
|
||||
RCC_BASE->CR |= 0x00000001U;
|
||||
|
||||
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
|
||||
RCC_BASE->CFGR &= 0xF0FF0000U;
|
||||
|
||||
/* Reset HSEON, CSSON and PLLON bits */
|
||||
RCC_BASE->CR &= 0xFEF6FFFFU;
|
||||
|
||||
/* Reset HSEBYP bit */
|
||||
RCC_BASE->CR &= 0xFFFBFFFFU;
|
||||
|
||||
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
|
||||
RCC_BASE->CFGR &= 0xFF80FFFFU;
|
||||
|
||||
/* Disable all interrupts and clear pending bits */
|
||||
RCC_BASE->CIR = 0x009F0000U;
|
||||
|
||||
USART1_BASE->CR1 = 0;
|
||||
USART1_BASE->CR2 = 0;
|
||||
USART1_BASE->CR3 = 0;
|
||||
|
||||
memset(SDIO_BASE, 0, sizeof(sdio_reg_map));
|
||||
asm("CPSIE I");
|
||||
|
||||
/* Initialize .data, if necessary. */
|
||||
if (src != dst) {
|
||||
int *end = (int*)&__data_end__;
|
||||
while (dst < end) {
|
||||
*dst++ = *src++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Zero .bss. */
|
||||
dst = (int*)&__bss_start__;
|
||||
while (dst < (int*)&__bss_end__) {
|
||||
*dst++ = 0;
|
||||
}
|
||||
|
||||
/* Run initializers. */
|
||||
__libc_init_array();
|
||||
|
||||
/* Jump to main. */
|
||||
exit_code = main(0, 0, 0);
|
||||
if (exit) {
|
||||
exit(exit_code);
|
||||
}
|
||||
|
||||
/* If exit is NULL, make sure we don't return. */
|
||||
for (;;)
|
||||
continue;
|
||||
}
|
|
@ -0,0 +1,176 @@
|
|||
/******************************************************************************
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2010 Perry Hung.
|
||||
* Copyright (c) 2011, 2012 LeafLabs, LLC.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use, copy,
|
||||
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
* of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*****************************************************************************/
|
||||
|
||||
/**
|
||||
* @file wirish/syscalls.c
|
||||
* @brief newlib stubs
|
||||
*
|
||||
* Low level system routines used by newlib for basic I/O and memory
|
||||
* allocation. You can override most of these.
|
||||
*/
|
||||
|
||||
#include <libmaple/libmaple.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* If CONFIG_HEAP_START (or CONFIG_HEAP_END) isn't defined, then
|
||||
* assume _lm_heap_start (resp. _lm_heap_end) is appropriately set by
|
||||
* the linker */
|
||||
#ifndef CONFIG_HEAP_START
|
||||
extern char _lm_heap_start;
|
||||
#define CONFIG_HEAP_START ((void *)&_lm_heap_start)
|
||||
#endif
|
||||
#ifndef CONFIG_HEAP_END
|
||||
extern char _lm_heap_end;
|
||||
#define CONFIG_HEAP_END ((void *)&_lm_heap_end)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* _sbrk -- Increment the program break.
|
||||
*
|
||||
* Get incr bytes more RAM (for use by the heap). malloc() and
|
||||
* friends call this function behind the scenes.
|
||||
*/
|
||||
void *_sbrk(int incr) {
|
||||
static void * pbreak = NULL; /* current program break */
|
||||
void * ret;
|
||||
|
||||
if (pbreak == NULL) {
|
||||
pbreak = CONFIG_HEAP_START;
|
||||
}
|
||||
|
||||
if ((CONFIG_HEAP_END - pbreak < incr) ||
|
||||
(pbreak - CONFIG_HEAP_START < -incr)) {
|
||||
errno = ENOMEM;
|
||||
return (void *)-1;
|
||||
}
|
||||
|
||||
ret = pbreak;
|
||||
pbreak += incr;
|
||||
return ret;
|
||||
}
|
||||
|
||||
__weak int _open(const char *path __attribute__((unused)), int flags __attribute__((unused)), ...) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
__weak int _close(int fd __attribute__((unused))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int _fstat(int fd __attribute__((unused)), struct stat *st) {
|
||||
st->st_mode = S_IFCHR;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__weak int _isatty(int fd __attribute__((unused))) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
__weak int isatty(int fd __attribute__((unused))) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
__weak int _lseek(int fd __attribute__((unused)), off_t pos __attribute__((unused)), int whence __attribute__((unused))) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
__weak unsigned char getch(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
__weak int _read(int fd __attribute__((unused)), char *buf, size_t cnt __attribute__((unused))) {
|
||||
*buf = getch();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__weak void putch(unsigned char c __attribute__((unused))) {
|
||||
}
|
||||
|
||||
__weak void cgets(char *s, int bufsize) {
|
||||
char *p;
|
||||
int c;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < bufsize; i++) {
|
||||
*(s+i) = 0;
|
||||
}
|
||||
// memset(s, 0, bufsize);
|
||||
|
||||
p = s;
|
||||
|
||||
for (p = s; p < s + bufsize-1;) {
|
||||
c = getch();
|
||||
switch (c) {
|
||||
case '\r' :
|
||||
case '\n' :
|
||||
putch('\r');
|
||||
putch('\n');
|
||||
*p = '\n';
|
||||
return;
|
||||
|
||||
case '\b' :
|
||||
if (p > s) {
|
||||
*p-- = 0;
|
||||
putch('\b');
|
||||
putch(' ');
|
||||
putch('\b');
|
||||
}
|
||||
break;
|
||||
|
||||
default :
|
||||
putch(c);
|
||||
*p++ = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
__weak int _write(int fd __attribute__((unused)), const char *buf, size_t cnt) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < cnt; i++)
|
||||
putch(buf[i]);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
/* Override fgets() in newlib with a version that does line editing */
|
||||
__weak char *fgets(char *s, int bufsize, void *f __attribute__((unused))) {
|
||||
cgets(s, bufsize);
|
||||
return s;
|
||||
}
|
||||
|
||||
__weak void _exit(int exitcode __attribute__((unused))) {
|
||||
while (1)
|
||||
;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue