bsp: add ATSAMD21-XPRO eval board
This commit is contained in:
		
							
								
								
									
										142
									
								
								hw/bsp/atsamd21_xpro/atsamd21_xpro.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								hw/bsp/atsamd21_xpro/atsamd21_xpro.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | |||||||
|  | /*  | ||||||
|  |  * The MIT License (MIT) | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2019 Ha Thach (tinyusb.org) | ||||||
|  |  * | ||||||
|  |  * 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 part of the TinyUSB stack. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "bsp/board.h" | ||||||
|  |  | ||||||
|  | #undef LITTLE_ENDIAN /* workaround for buggy SAMD submodule: compile error for ATSAMD21J18 (J, not G) */ | ||||||
|  | #include "sam.h" | ||||||
|  |  | ||||||
|  | #include "hal/include/hal_gpio.h" | ||||||
|  | #include "hal/include/hal_init.h" | ||||||
|  | #include "hri/hri_nvmctrl_d21.h" | ||||||
|  |  | ||||||
|  | #include "hpl/gclk/hpl_gclk_base.h" | ||||||
|  | #include "hpl_pm_config.h" | ||||||
|  | #include "hpl/pm/hpl_pm_base.h" | ||||||
|  |  | ||||||
|  | //--------------------------------------------------------------------+ | ||||||
|  | // MACRO TYPEDEF CONSTANT ENUM DECLARATION | ||||||
|  | //--------------------------------------------------------------------+ | ||||||
|  | #define LED_PIN      (32+30) // pin PB30 | ||||||
|  | #define BUTTON_PIN   (0+15) // pin PA15 | ||||||
|  |  | ||||||
|  | /* Referenced GCLKs, should be initialized firstly */ | ||||||
|  | #define _GCLK_INIT_1ST (1 << 0 | 1 << 1) | ||||||
|  |  | ||||||
|  | /* Not referenced GCLKs, initialized last */ | ||||||
|  | #define _GCLK_INIT_LAST (~_GCLK_INIT_1ST) | ||||||
|  |  | ||||||
|  | void board_init(void) | ||||||
|  | { | ||||||
|  |   // Clock init ( follow hpl_init.c ) | ||||||
|  |   hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2); | ||||||
|  |  | ||||||
|  |   _pm_init(); | ||||||
|  |   _sysctrl_init_sources(); | ||||||
|  | #if _GCLK_INIT_1ST | ||||||
|  |   _gclk_init_generators_by_fref(_GCLK_INIT_1ST); | ||||||
|  | #endif | ||||||
|  |   _sysctrl_init_referenced_generators(); | ||||||
|  |   _gclk_init_generators_by_fref(_GCLK_INIT_LAST); | ||||||
|  |  | ||||||
|  |   // Led init | ||||||
|  |   gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT); | ||||||
|  |   gpio_set_pin_level(LED_PIN, 1); | ||||||
|  |  | ||||||
|  |   // Button init | ||||||
|  |   gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN); | ||||||
|  |   gpio_set_pin_pull_mode(BUTTON_PIN, GPIO_PULL_UP); | ||||||
|  |  | ||||||
|  | #if CFG_TUSB_OS  == OPT_OS_NONE | ||||||
|  |   // 1ms tick timer (samd SystemCoreClock may not correct) | ||||||
|  |   SysTick_Config(CONF_CPU_FREQUENCY / 1000); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   /* USB Clock init | ||||||
|  |    * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock | ||||||
|  |    * for low speed and full speed operation. */ | ||||||
|  |   _pm_enable_bus_clock(PM_BUS_APBB, USB); | ||||||
|  |   _pm_enable_bus_clock(PM_BUS_AHB, USB); | ||||||
|  |   _gclk_enable_channel(USB_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val); | ||||||
|  |  | ||||||
|  |   // USB Pin Init | ||||||
|  |   gpio_set_pin_direction(PIN_PA24, GPIO_DIRECTION_OUT); | ||||||
|  |   gpio_set_pin_level(PIN_PA24, false); | ||||||
|  |   gpio_set_pin_pull_mode(PIN_PA24, GPIO_PULL_OFF); | ||||||
|  |   gpio_set_pin_direction(PIN_PA25, GPIO_DIRECTION_OUT); | ||||||
|  |   gpio_set_pin_level(PIN_PA25, false); | ||||||
|  |   gpio_set_pin_pull_mode(PIN_PA25, GPIO_PULL_OFF); | ||||||
|  |  | ||||||
|  |   gpio_set_pin_function(PIN_PA24, PINMUX_PA24G_USB_DM); | ||||||
|  |   gpio_set_pin_function(PIN_PA25, PINMUX_PA25G_USB_DP); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //--------------------------------------------------------------------+ | ||||||
|  | // Board porting API | ||||||
|  | //--------------------------------------------------------------------+ | ||||||
|  |  | ||||||
|  | void board_led_write(bool state) | ||||||
|  | { | ||||||
|  |   gpio_set_pin_level(LED_PIN, !state); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint32_t board_button_read(void) | ||||||
|  | { | ||||||
|  |   // button is active low | ||||||
|  |   return gpio_get_pin_level(BUTTON_PIN) ? 0 : 1; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int board_uart_read(uint8_t* buf, int len) | ||||||
|  | { | ||||||
|  |   (void) buf; (void) len; | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int board_uart_write(void const * buf, int len) | ||||||
|  | { | ||||||
|  |   (void) buf; (void) len; | ||||||
|  |   return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #if CFG_TUSB_OS  == OPT_OS_NONE | ||||||
|  | volatile uint32_t system_ticks = 0; | ||||||
|  | void SysTick_Handler (void) | ||||||
|  | { | ||||||
|  |   system_ticks++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | uint32_t board_millis(void) | ||||||
|  | { | ||||||
|  |   return system_ticks; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | //void asf_assert(const bool condition, const char *const file, const int line) {} | ||||||
|  |  | ||||||
|  | void USB_Handler(void) | ||||||
|  | { | ||||||
|  |   tud_int_handler(0); | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								hw/bsp/atsamd21_xpro/board.mk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								hw/bsp/atsamd21_xpro/board.mk
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | CFLAGS += \ | ||||||
|  |   -flto \ | ||||||
|  |   -mthumb \ | ||||||
|  |   -mabi=aapcs-linux \ | ||||||
|  |   -mcpu=cortex-m0plus \ | ||||||
|  |   -nostdlib -nostartfiles \ | ||||||
|  |   -D__SAMD21J18A__ \ | ||||||
|  |   -DCONF_DFLL_OVERWRITE_CALIBRATION=0 \ | ||||||
|  |   -DCFG_TUSB_MCU=OPT_MCU_SAMD21 | ||||||
|  |  | ||||||
|  | # All source paths should be relative to the top level. | ||||||
|  | LD_FILE = hw/bsp/atsamd21_xpro/samd21j18a_flash.ld | ||||||
|  |  | ||||||
|  | SRC_C += \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/gcc/gcc/startup_samd21.c \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/gcc/system_samd21.c \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/hpl/gclk/hpl_gclk.c \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/hpl/pm/hpl_pm.c \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/hpl/sysctrl/hpl_sysctrl.c \ | ||||||
|  |   hw/mcu/microchip/samd/asf4/samd21/hal/src/hal_atomic.c | ||||||
|  |  | ||||||
|  | INC += \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/ \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/config \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/include \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/hal/include \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/hal/utils/include \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/hpl/pm/ \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/hpl/port \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/hri \ | ||||||
|  |   $(TOP)/hw/mcu/microchip/samd/asf4/samd21/CMSIS/Include | ||||||
|  |  | ||||||
|  | # For TinyUSB port source  | ||||||
|  | VENDOR = microchip | ||||||
|  | CHIP_FAMILY = samd | ||||||
|  |  | ||||||
|  | # For freeRTOS port source | ||||||
|  | FREERTOS_PORT = ARM_CM0 | ||||||
|  |  | ||||||
|  | # For flash-jlink target | ||||||
|  | JLINK_DEVICE = ATSAMD21J18 | ||||||
|  | JLINK_IF = swd | ||||||
|  |  | ||||||
|  | # flash using jlink | ||||||
|  | flash: flash-jlink | ||||||
							
								
								
									
										144
									
								
								hw/bsp/atsamd21_xpro/samd21j18a_flash.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								hw/bsp/atsamd21_xpro/samd21j18a_flash.ld
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | |||||||
|  | /** | ||||||
|  |  * \file | ||||||
|  |  * | ||||||
|  |  * \brief Linker script for running in internal FLASH on the SAMD21J18A | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2017 Microchip Technology Inc. | ||||||
|  |  * | ||||||
|  |  * \asf_license_start | ||||||
|  |  * | ||||||
|  |  * \page License | ||||||
|  |  * | ||||||
|  |  * SPDX-License-Identifier: Apache-2.0 | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||||
|  |  * not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the Licence at | ||||||
|  |  * | ||||||
|  |  * http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an AS IS BASIS, WITHOUT | ||||||
|  |  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  * | ||||||
|  |  * \asf_license_stop | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") | ||||||
|  | OUTPUT_ARCH(arm) | ||||||
|  | SEARCH_DIR(.) | ||||||
|  |  | ||||||
|  | /* Memory Spaces Definitions */ | ||||||
|  | MEMORY | ||||||
|  | { | ||||||
|  |   rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000 | ||||||
|  |   ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* The stack size used by the application. NOTE: you need to adjust according to your application. */ | ||||||
|  | STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x2000; | ||||||
|  |  | ||||||
|  | /* Section Definitions */ | ||||||
|  | SECTIONS | ||||||
|  | { | ||||||
|  |     .text : | ||||||
|  |     { | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _sfixed = .; | ||||||
|  |         KEEP(*(.vectors .vectors.*)) | ||||||
|  |         *(.text .text.* .gnu.linkonce.t.*) | ||||||
|  |         *(.glue_7t) *(.glue_7) | ||||||
|  |         *(.rodata .rodata* .gnu.linkonce.r.*) | ||||||
|  |         *(.ARM.extab* .gnu.linkonce.armextab.*) | ||||||
|  |  | ||||||
|  |         /* Support C constructors, and C destructors in both user code | ||||||
|  |            and the C library. This also provides support for C++ code. */ | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         KEEP(*(.init)) | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         __preinit_array_start = .; | ||||||
|  |         KEEP (*(.preinit_array)) | ||||||
|  |         __preinit_array_end = .; | ||||||
|  |  | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         __init_array_start = .; | ||||||
|  |         KEEP (*(SORT(.init_array.*))) | ||||||
|  |         KEEP (*(.init_array)) | ||||||
|  |         __init_array_end = .; | ||||||
|  |  | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         KEEP (*crtbegin.o(.ctors)) | ||||||
|  |         KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) | ||||||
|  |         KEEP (*(SORT(.ctors.*))) | ||||||
|  |         KEEP (*crtend.o(.ctors)) | ||||||
|  |  | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         KEEP(*(.fini)) | ||||||
|  |  | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         __fini_array_start = .; | ||||||
|  |         KEEP (*(.fini_array)) | ||||||
|  |         KEEP (*(SORT(.fini_array.*))) | ||||||
|  |         __fini_array_end = .; | ||||||
|  |  | ||||||
|  |         KEEP (*crtbegin.o(.dtors)) | ||||||
|  |         KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) | ||||||
|  |         KEEP (*(SORT(.dtors.*))) | ||||||
|  |         KEEP (*crtend.o(.dtors)) | ||||||
|  |  | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _efixed = .;            /* End of text section */ | ||||||
|  |     } > rom | ||||||
|  |  | ||||||
|  |     /* .ARM.exidx is sorted, so has to go in its own output section.  */ | ||||||
|  |     PROVIDE_HIDDEN (__exidx_start = .); | ||||||
|  |     .ARM.exidx : | ||||||
|  |     { | ||||||
|  |       *(.ARM.exidx* .gnu.linkonce.armexidx.*) | ||||||
|  |     } > rom | ||||||
|  |     PROVIDE_HIDDEN (__exidx_end = .); | ||||||
|  |  | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _etext = .; | ||||||
|  |  | ||||||
|  |     .relocate : AT (_etext) | ||||||
|  |     { | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _srelocate = .; | ||||||
|  |         *(.ramfunc .ramfunc.*); | ||||||
|  |         *(.data .data.*); | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _erelocate = .; | ||||||
|  |     } > ram | ||||||
|  |  | ||||||
|  |     /* .bss section which is used for uninitialized data */ | ||||||
|  |     .bss (NOLOAD) : | ||||||
|  |     { | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _sbss = . ; | ||||||
|  |         _szero = .; | ||||||
|  |         *(.bss .bss.*) | ||||||
|  |         *(COMMON) | ||||||
|  |         . = ALIGN(4); | ||||||
|  |         _ebss = . ; | ||||||
|  |         _ezero = .; | ||||||
|  |         end = .; | ||||||
|  |     } > ram | ||||||
|  |  | ||||||
|  |     /* stack section */ | ||||||
|  |     .stack (NOLOAD): | ||||||
|  |     { | ||||||
|  |         . = ALIGN(8); | ||||||
|  |         _sstack = .; | ||||||
|  |         . = . + STACK_SIZE; | ||||||
|  |         . = ALIGN(8); | ||||||
|  |         _estack = .; | ||||||
|  |     } > ram | ||||||
|  |  | ||||||
|  |     . = ALIGN(4); | ||||||
|  |     _end = . ; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Peter Lawrence
					Peter Lawrence