| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*!
 | 
					
						
							|  |  |  |     @file     hal_lpc43xx.c | 
					
						
							|  |  |  |     @author   hathach (tinyusb.org) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @section LICENSE | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Software License Agreement (BSD License) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Copyright (c) 2013, 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-03-02 18:43:00 +07:00
										 |  |  | #include "tusb.h"
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-25 12:48:27 +07:00
										 |  |  | #if TUSB_CFG_MCU == MCU_LPC43XX
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 23:04:53 +07:00
										 |  |  | #include "LPC43xx.h"
 | 
					
						
							|  |  |  | #include "lpc43xx_cgu.h"
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |   LPC43XX_USBMODE_DEVICE = 2, | 
					
						
							|  |  |  |   LPC43XX_USBMODE_HOST   = 3 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |   LPC43XX_USBMODE_VBUS_LOW  = 0, | 
					
						
							|  |  |  |   LPC43XX_USBMODE_VBUS_HIGH = 1 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 16:30:53 +07:00
										 |  |  | #if TUSB_CFG_OS == TUSB_OS_NONE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | volatile uint32_t system_ticks = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SysTick_Handler (void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   system_ticks++; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint32_t tusb_hal_tick_get(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return system_ticks; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-11 13:01:57 +07:00
										 |  |  | void tusb_hal_dbg_breakpoint(void) | 
					
						
							| 
									
										
										
										
											2018-03-09 23:04:53 +07:00
										 |  |  | { | 
					
						
							|  |  |  |   // M0 cannot check if debugger is attached or not
 | 
					
						
							|  |  |  | #if defined(__CORTEX_M) && (__CORTEX_M > 0)
 | 
					
						
							|  |  |  |   // check if debugger is attached
 | 
					
						
							|  |  |  |   if ( (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) == CoreDebug_DHCSR_C_DEBUGEN_Msk) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     __asm("BKPT #0\n"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  | void tusb_hal_int_enable(uint8_t rhport) | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  |   NVIC_EnableIRQ(rhport ? USB1_IRQn : USB0_IRQn); | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  | void tusb_hal_int_disable(uint8_t rhport) | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  |   NVIC_DisableIRQ(rhport ? USB1_IRQn : USB0_IRQn); | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  | static void hal_controller_reset(uint8_t rhport) | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  | { // TODO timeout expired to prevent trap
 | 
					
						
							|  |  |  |   volatile uint32_t * p_reg_usbcmd; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  |   p_reg_usbcmd = (rhport ? &LPC_USB1->USBCMD_D : &LPC_USB0->USBCMD_D); | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  | // NXP chip powered with non-host mode --> sts bit is not correctly reflected
 | 
					
						
							|  |  |  |   (*p_reg_usbcmd) |= BIT_(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  timeout_timer_t timeout;
 | 
					
						
							|  |  |  | //  timeout_set(&timeout, 2); // should not take longer the time to stop controller
 | 
					
						
							|  |  |  |   while( ((*p_reg_usbcmd) & BIT_(1)) /*&& !timeout_expired(&timeout)*/) {} | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //  return timeout_expired(&timeout) ? TUSB_ERROR_OSAL_TIMEOUT : TUSB_ERROR_NONE;
 | 
					
						
							| 
									
										
										
										
											2018-03-02 15:20:55 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-11 13:01:57 +07:00
										 |  |  | bool tusb_hal_init(void) | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-08 12:03:32 +07:00
										 |  |  |   LPC_CREG->CREG0 &= ~(1<<5); /* Turn on the phy */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  |   //------------- USB0 -------------//
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | #if TUSB_CFG_CONTROLLER_0_MODE
 | 
					
						
							|  |  |  |   CGU_EnableEntity(CGU_CLKSRC_PLL0, DISABLE); /* Disable PLL first */ | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  |   VERIFY( CGU_ERROR_SUCCESS == CGU_SetPLL0()); /* the usb core require output clock = 480MHz */ | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   CGU_EntityConnect(CGU_CLKSRC_XTAL_OSC, CGU_CLKSRC_PLL0); | 
					
						
							|  |  |  |   CGU_EnableEntity(CGU_CLKSRC_PLL0, ENABLE);   /* Enable PLL after all setting is done */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // reset controller & set role
 | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  |   hal_controller_reset(0); | 
					
						
							| 
									
										
										
										
											2013-11-06 14:20:45 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   #if TUSB_CFG_CONTROLLER_0_MODE & TUSB_MODE_HOST
 | 
					
						
							|  |  |  |     LPC_USB0->USBMODE_H = LPC43XX_USBMODE_HOST | (LPC43XX_USBMODE_VBUS_HIGH << 5); | 
					
						
							|  |  |  |   #else // TODO OTG
 | 
					
						
							| 
									
										
										
										
											2013-10-29 11:27:25 +07:00
										 |  |  |     LPC_USB0->USBMODE_D = LPC43XX_USBMODE_DEVICE; | 
					
						
							|  |  |  |     LPC_USB0->OTGSC = (1<<3) | (1<<0) /*| (1<<16)| (1<<24)| (1<<25)| (1<<26)| (1<<27)| (1<<28)| (1<<29)| (1<<30)*/; | 
					
						
							| 
									
										
										
										
											2013-11-01 12:11:26 +07:00
										 |  |  |     #if TUSB_CFG_DEVICE_FULLSPEED // TODO for easy testing
 | 
					
						
							|  |  |  |       LPC_USB0->PORTSC1_D |= (1<<24); // force full speed
 | 
					
						
							|  |  |  |     #endif
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  |   //------------- USB1 -------------//
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | #if TUSB_CFG_CONTROLLER_1_MODE
 | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  |   // Host require to config P2_5, TODO confirm whether device mode require P2_5 or not
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   scu_pinmux(0x2, 5, MD_PLN | MD_EZI | MD_ZI, FUNC2);	// USB1_VBUS monitor presence, must be high for bus reset occur
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* connect CLK_USB1 to 60 MHz clock */ | 
					
						
							|  |  |  |   CGU_EntityConnect(CGU_CLKSRC_PLL1, CGU_BASE_USB1); /* FIXME Run base BASE_USB1_CLK clock from PLL1 (assume PLL1 is 60 MHz, no division required) */ | 
					
						
							|  |  |  |   LPC_SCU->SFSUSB = (TUSB_CFG_CONTROLLER_1_MODE & TUSB_MODE_HOST) ? 0x16 : 0x12; // enable USB1 with on-chip FS PHY
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  |   hal_controller_reset(1); | 
					
						
							| 
									
										
										
										
											2013-11-06 12:15:11 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   #if TUSB_CFG_CONTROLLER_1_MODE & TUSB_MODE_HOST
 | 
					
						
							|  |  |  |     LPC_USB1->USBMODE_H = LPC43XX_USBMODE_HOST | (LPC43XX_USBMODE_VBUS_HIGH << 5); | 
					
						
							|  |  |  |   #else // TODO OTG
 | 
					
						
							| 
									
										
										
										
											2013-11-06 14:53:18 +07:00
										 |  |  |     LPC_USB1->USBMODE_D = LPC43XX_USBMODE_DEVICE; | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  |   LPC_USB1->PORTSC1_D |= (1<<24); // TODO abstract, force rhport to fullspeed
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 15:39:49 +07:00
										 |  |  |   return true; | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-23 12:17:47 +07:00
										 |  |  | void hal_dcd_isr(uint8_t rhport); | 
					
						
							| 
									
										
										
										
											2018-03-06 17:38:35 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | #if TUSB_CFG_CONTROLLER_0_MODE
 | 
					
						
							|  |  |  | void USB0_IRQHandler(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-06 17:38:35 +07:00
										 |  |  |   #if MODE_HOST_SUPPORTED
 | 
					
						
							|  |  |  |     hal_hcd_isr(0); | 
					
						
							|  |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   #if MODE_DEVICE_SUPPORTED
 | 
					
						
							|  |  |  |     hal_dcd_isr(0); | 
					
						
							|  |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if TUSB_CFG_CONTROLLER_1_MODE
 | 
					
						
							|  |  |  | void USB1_IRQHandler(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-03-06 17:38:35 +07:00
										 |  |  |   #if MODE_HOST_SUPPORTED
 | 
					
						
							|  |  |  |     hal_hcd_isr(1); | 
					
						
							|  |  |  |   #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   #if MODE_DEVICE_SUPPORTED
 | 
					
						
							|  |  |  |     hal_dcd_isr(1); | 
					
						
							|  |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-13 16:30:53 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  | void check_failed(uint8_t *file, uint32_t line) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   (void) file; | 
					
						
							|  |  |  |   (void) line; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-24 15:32:54 +07:00
										 |  |  | #endif
 |