Chitu variant for disk-based update (#18264)
This commit is contained in:
		
							
								
								
									
										225
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										225
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -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); | ||||
| } | ||||
							
								
								
									
										123
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										123
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/boards_setup.cpp
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,123 @@ | ||||
| /****************************************************************************** | ||||
|  * 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) { | ||||
|             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(); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										57
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										57
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start.S
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| /****************************************************************************** | ||||
|  * 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: | ||||
|  * | ||||
|  * 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. | ||||
|  */ | ||||
|  | ||||
|         .text | ||||
|         .code 16 | ||||
|         .thumb_func | ||||
|  | ||||
|         .globl __start__ | ||||
|         .type __start__, %function | ||||
| __start__: | ||||
|         .fnstart | ||||
|         ldr r1,=__msp_init | ||||
|         mov sp,r1 | ||||
|         ldr r1,=start_c | ||||
|         bx r1 | ||||
|         .pool | ||||
|         .cantunwind | ||||
|         .fnend | ||||
							
								
								
									
										144
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										144
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/start_c.c
									
									
									
									
									
										Executable file
									
								
							| @@ -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; | ||||
| } | ||||
							
								
								
									
										176
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										176
									
								
								buildroot/share/PlatformIO/variants/CHITU_F103/wirish/syscalls.c
									
									
									
									
									
										Executable file
									
								
							| @@ -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) | ||||
|         ; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user