2019-03-20 16:11:42 +07:00
/*
* The MIT License ( MIT )
*
2019-05-14 11:48:05 +07:00
* Copyright ( c ) 2019 Ha Thach ( tinyusb . org )
2019-03-20 16:11:42 +07:00
*
* 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 .
*/
2018-12-05 20:39:52 +07:00
# include "tusb_option.h"
2021-02-22 18:02:52 +07:00
// NXP Trans-Dimension USB IP implement EHCI for host functionality
2018-12-05 20:39:52 +07:00
2021-02-22 18:02:52 +07:00
# if TUSB_OPT_HOST_ENABLED && \
( CFG_TUSB_MCU = = OPT_MCU_LPC18XX | | CFG_TUSB_MCU = = OPT_MCU_LPC43XX | | CFG_TUSB_MCU = = OPT_MCU_MIMXRT10XX )
2021-12-01 12:14:44 +07:00
# warning "transdimenion is renamed to chipidea (portable / chipidea / ci_hs) to match other opensource naming convention such as linux. This file will be removed in the future, please update your makefile accordingly"
2021-02-23 01:27:52 +07:00
//--------------------------------------------------------------------+
// INCLUDE
//--------------------------------------------------------------------+
2021-02-22 18:02:52 +07:00
# if CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX
# include "fsl_device_registers.h"
# else
// LPCOpen for 18xx & 43xx
# include "chip.h"
# endif
2021-02-23 01:27:52 +07:00
# include "common/tusb_common.h"
# include "common_transdimension.h"
2021-08-23 12:37:54 +07:00
# include "portable/ehci/ehci_api.h"
2021-02-23 01:27:52 +07:00
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
// TODO can be merged with dcd_controller_t
2021-02-22 18:02:52 +07:00
typedef struct
{
2021-02-23 01:27:52 +07:00
uint32_t regs_base ; // registers base
2021-02-22 18:02:52 +07:00
const IRQn_Type irqnum ; // IRQ number
} hcd_controller_t ;
# if CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX
static const hcd_controller_t _hcd_controller [ ] =
{
// RT1010 and RT1020 only has 1 USB controller
# if FSL_FEATURE_SOC_USBHS_COUNT == 1
2021-02-23 01:27:52 +07:00
{ . regs_base = USB_BASE , . irqnum = USB_OTG1_IRQn }
2021-02-22 18:02:52 +07:00
# else
2021-02-23 01:27:52 +07:00
{ . regs_base = USB1_BASE , . irqnum = USB_OTG1_IRQn } ,
{ . regs_base = USB2_BASE , . irqnum = USB_OTG2_IRQn }
2021-02-22 18:02:52 +07:00
# endif
} ;
# else
static const hcd_controller_t _hcd_controller [ ] =
{
2021-02-23 01:27:52 +07:00
{ . regs_base = LPC_USB0_BASE , . irqnum = USB0_IRQn } ,
{ . regs_base = LPC_USB1_BASE , . irqnum = USB1_IRQn }
2021-02-22 18:02:52 +07:00
} ;
# endif
2018-12-05 20:39:52 +07:00
2021-02-23 01:27:52 +07:00
//--------------------------------------------------------------------+
// Controller API
//--------------------------------------------------------------------+
2021-02-22 22:40:51 +07:00
bool hcd_init ( uint8_t rhport )
{
2021-08-23 12:37:54 +07:00
hcd_registers_t * hcd_reg = ( hcd_registers_t * ) _hcd_controller [ rhport ] . regs_base ;
2021-02-23 01:27:52 +07:00
// Reset controller
2021-08-23 12:37:54 +07:00
hcd_reg - > USBCMD | = USBCMD_RESET ;
while ( hcd_reg - > USBCMD & USBCMD_RESET ) { }
2021-02-23 01:27:52 +07:00
// Set mode to device, must be set immediately after reset
# if CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX
// LPC18XX/43XX need to set VBUS Power Select to HIGH
// RHPORT1 is fullspeed only (need external PHY for Highspeed)
2021-08-23 12:37:54 +07:00
hcd_reg - > USBMODE = USBMODE_CM_HOST | USBMODE_VBUS_POWER_SELECT ;
if ( rhport = = 1 ) hcd_reg - > PORTSC1 | = PORTSC1_FORCE_FULL_SPEED ;
2021-02-23 01:27:52 +07:00
# else
2021-08-23 12:37:54 +07:00
hcd_reg - > USBMODE = USBMODE_CM_HOST ;
2021-02-23 01:27:52 +07:00
# endif
// FIXME force full speed, still have issue with Highspeed enumeration
2021-08-23 12:37:54 +07:00
hcd_reg - > PORTSC1 | = PORTSC1_FORCE_FULL_SPEED ;
2021-02-23 01:27:52 +07:00
2021-08-23 12:37:54 +07:00
return ehci_init ( rhport , ( uint32_t ) & hcd_reg - > CAPLENGTH , ( uint32_t ) & hcd_reg - > USBCMD ) ;
2021-02-22 22:40:51 +07:00
}
2018-12-05 20:39:52 +07:00
void hcd_int_enable ( uint8_t rhport )
{
2021-02-22 18:02:52 +07:00
NVIC_EnableIRQ ( _hcd_controller [ rhport ] . irqnum ) ;
2018-12-05 20:39:52 +07:00
}
void hcd_int_disable ( uint8_t rhport )
{
2021-02-22 18:02:52 +07:00
NVIC_DisableIRQ ( _hcd_controller [ rhport ] . irqnum ) ;
2018-12-05 20:39:52 +07:00
}
2018-12-12 11:32:46 +07:00
2018-12-05 20:39:52 +07:00
# endif