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