| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |  @file    board_metro_m4_express.c | 
					
						
							|  |  |  |  @author  hathach (tinyusb.org) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  @section LICENSE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  Software License Agreement (BSD License) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  Copyright (c) 2018, hathach (tinyusb.org) | 
					
						
							|  |  |  |  All rights reserved. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |  notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |  notice, this list of conditions and the following disclaimer in the | 
					
						
							|  |  |  |  documentation and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  3. Neither the name of the copyright holders nor the | 
					
						
							|  |  |  |  names of its contributors may be used to endorse or promote products | 
					
						
							|  |  |  |  derived from this software without specific prior written permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY | 
					
						
							|  |  |  |  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
					
						
							|  |  |  |  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
					
						
							|  |  |  |  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY | 
					
						
							|  |  |  |  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
					
						
							|  |  |  |  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
					
						
							|  |  |  |  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
					
						
							|  |  |  |  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							|  |  |  |  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
					
						
							|  |  |  |  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  This file is part of the tinyusb stack. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | #include "bsp/board.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "sam.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | #include "hal/include/hal_gpio.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  | #include "hal/include/hal_init.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  | #include "hpl/gclk/hpl_gclk_base.h"
 | 
					
						
							|  |  |  | #include "hpl_mclk_config.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // MACRO TYPEDEF CONSTANT ENUM DECLARATION
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | #define LED_STATE_ON  1
 | 
					
						
							| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  | /* Referenced GCLKs, should be initialized firstly */ | 
					
						
							|  |  |  | #define _GCLK_INIT_1ST 0xFFFFFFFF
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Not referenced GCLKs, initialized last */ | 
					
						
							|  |  |  | #define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | void board_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  |   // Clock init ( follow hpl_init.c )
 | 
					
						
							| 
									
										
										
										
											2018-11-21 13:11:19 +07:00
										 |  |  |   hri_nvmctrl_set_CTRLA_RWS_bf(NVMCTRL, 0); | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   _osc32kctrl_init_sources(); | 
					
						
							|  |  |  |   _oscctrl_init_sources(); | 
					
						
							|  |  |  |   _mclk_init(); | 
					
						
							|  |  |  | #if _GCLK_INIT_1ST
 | 
					
						
							|  |  |  |   _gclk_init_generators_by_fref(_GCLK_INIT_1ST); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |   _oscctrl_init_referenced_generators(); | 
					
						
							|  |  |  |   _gclk_init_generators_by_fref(_GCLK_INIT_LAST); | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  |   // Led init
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  |   gpio_set_pin_direction(BOARD_LED0, GPIO_DIRECTION_OUT); | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  |   gpio_set_pin_level(BOARD_LED0, 1 - LED_STATE_ON); | 
					
						
							| 
									
										
										
										
											2018-11-14 15:25:58 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  |   // Systick init
 | 
					
						
							| 
									
										
										
										
											2018-11-14 15:25:58 +07:00
										 |  |  | #if CFG_TUSB_OS  == OPT_OS_NONE
 | 
					
						
							|  |  |  |   // Tick init
 | 
					
						
							| 
									
										
										
										
											2018-11-21 00:12:11 +07:00
										 |  |  |   SysTick_Config(SystemCoreClock / 1000); | 
					
						
							| 
									
										
										
										
											2018-11-14 15:25:58 +07:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* USB Clock init
 | 
					
						
							|  |  |  |    * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock | 
					
						
							|  |  |  |    * for low speed and full speed operation. */ | 
					
						
							| 
									
										
										
										
											2018-11-21 13:11:19 +07:00
										 |  |  |   hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN); | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  |   hri_mclk_set_AHBMASK_USB_bit(MCLK); | 
					
						
							|  |  |  |   hri_mclk_set_APBBMASK_USB_bit(MCLK); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // 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_PA24H_USB_DM); | 
					
						
							|  |  |  |   gpio_set_pin_function(PIN_PA25, PINMUX_PA25H_USB_DP); | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | void board_led_control(uint32_t led_id, bool state) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   gpio_set_pin_level(led_id, state ? LED_STATE_ON : (1-LED_STATE_ON)); | 
					
						
							| 
									
										
										
										
											2018-11-13 17:26:17 +07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-14 13:28:39 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-14 15:25:58 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*------------------------------------------------------------------*/ | 
					
						
							|  |  |  | /* TUSB HAL MILLISECOND
 | 
					
						
							|  |  |  |  *------------------------------------------------------------------*/ | 
					
						
							|  |  |  | #if CFG_TUSB_OS  == OPT_OS_NONE
 | 
					
						
							|  |  |  | volatile uint32_t system_ticks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SysTick_Handler (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   system_ticks++; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint32_t tusb_hal_millis(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return board_tick2ms(system_ticks); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-11-20 01:21:54 +07:00
										 |  |  | #endif
 |