SAMA5: Add logic to control VBUS power for OHCI
This commit is contained in:
parent
0983828ff3
commit
e47dba5d22
@ -75,6 +75,7 @@ Contents
|
|||||||
- Serial Consoles
|
- Serial Consoles
|
||||||
- Serial FLASH
|
- Serial FLASH
|
||||||
- HSMCI Card Slots
|
- HSMCI Card Slots
|
||||||
|
- USB Ports
|
||||||
- SAMA5D3x-EK Configuration Options
|
- SAMA5D3x-EK Configuration Options
|
||||||
- Configurations
|
- Configurations
|
||||||
|
|
||||||
@ -564,6 +565,59 @@ HSMCI Card Slots
|
|||||||
PB24 MCI1_CK
|
PB24 MCI1_CK
|
||||||
PB19 MCI1_CDA
|
PB19 MCI1_CDA
|
||||||
|
|
||||||
|
USB Ports
|
||||||
|
=========
|
||||||
|
|
||||||
|
The SAMA5D3 series-MB features three USB communication ports:
|
||||||
|
|
||||||
|
* Port A Host High Speed (EHCI) and Full Speed (OHCI) multiplexed with
|
||||||
|
USB Device High Speed Micro AB connector, J20
|
||||||
|
|
||||||
|
* Port B Host High Speed (EHCI) and Full Speed (OHCI) standard type A
|
||||||
|
connector, J19 upper port
|
||||||
|
|
||||||
|
* Port C Host Full Speed (OHCI) only standard type A connector, J19
|
||||||
|
lower port
|
||||||
|
|
||||||
|
All three USB host ports are equipped with 500 mA high-side power switch
|
||||||
|
for self-powered and buspowered applications. The USB device port feature
|
||||||
|
VBUS inserts detection function.
|
||||||
|
|
||||||
|
Port A
|
||||||
|
------
|
||||||
|
|
||||||
|
PIO Signal Name Function
|
||||||
|
---- ----------- -------------------------------------------------------
|
||||||
|
PD29 VBUS_SENSE VBus detection
|
||||||
|
PD25 EN5V_USBA VBus power enable (via MN15 AIC1526 Dual USB High-Side
|
||||||
|
Power Switch. The other channel of the switch is for
|
||||||
|
the LCD)
|
||||||
|
|
||||||
|
Port B
|
||||||
|
------
|
||||||
|
|
||||||
|
PIO Signal Name Function
|
||||||
|
---- ----------- -------------------------------------------------------
|
||||||
|
PD26 EN5V_USBB VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
Power Switch). To the A1 pin of J19 Dual USB A
|
||||||
|
connector
|
||||||
|
|
||||||
|
Port C
|
||||||
|
------
|
||||||
|
|
||||||
|
PIO Signal Name Function
|
||||||
|
---- ----------- -------------------------------------------------------
|
||||||
|
PD27 EN5V_USBC VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
Power Switch). To the B1 pin of J19 Dual USB A
|
||||||
|
connector
|
||||||
|
|
||||||
|
Both Ports B and C
|
||||||
|
------------------
|
||||||
|
|
||||||
|
PIO Signal Name Function
|
||||||
|
---- ----------- -------------------------------------------------------
|
||||||
|
PD28 OVCUR_USB Combined overrcurrent indication from port A and B
|
||||||
|
|
||||||
SAMA5D3x-EK Configuration Options
|
SAMA5D3x-EK Configuration Options
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
@ -1131,6 +1185,9 @@ Configurations
|
|||||||
Library Routines
|
Library Routines
|
||||||
CONFIG_SCHED_WORKQUEUE : Worker thread support is required
|
CONFIG_SCHED_WORKQUEUE : Worker thread support is required
|
||||||
|
|
||||||
|
Application Configuration -> NSH Library
|
||||||
|
CONFIG_NSH_ARCHINIT=y : NSH board-initialization
|
||||||
|
|
||||||
STATUS:
|
STATUS:
|
||||||
2013-7-19: This configuration (as do the others) run at 396MHz.
|
2013-7-19: This configuration (as do the others) run at 396MHz.
|
||||||
The SAMA5D3 can run at 536MHz. I still need to figure out the
|
The SAMA5D3 can run at 536MHz. I still need to figure out the
|
||||||
|
@ -88,6 +88,22 @@
|
|||||||
# define AT25_MINOR CONFIG_NSH_MMCSDMINOR
|
# define AT25_MINOR CONFIG_NSH_MMCSDMINOR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Debug ********************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPP_HAVE_VARARGS
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message(...) syslog(__VA_ARGS__)
|
||||||
|
# else
|
||||||
|
# define message(...) printf(__VA_ARGS__)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifdef CONFIG_DEBUG
|
||||||
|
# define message syslog
|
||||||
|
# else
|
||||||
|
# define message printf
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -102,7 +118,7 @@
|
|||||||
|
|
||||||
int nsh_archinitialize(void)
|
int nsh_archinitialize(void)
|
||||||
{
|
{
|
||||||
#if defined(HAVE_AT25_MTD) || defined(HAVE_HSMCI_MTD)
|
#if defined(HAVE_AT25_MTD) || defined(HAVE_HSMCI_MTD) || defined(HAVE_USBHOST)
|
||||||
int ret;
|
int ret;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -112,7 +128,7 @@ int nsh_archinitialize(void)
|
|||||||
ret = sam_at25_initialize(AT25_MINOR);
|
ret = sam_at25_initialize(AT25_MINOR);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
dbg("ERROR: sam_at25_initialize failed: %d\n", ret);
|
message("ERROR: sam_at25_initialize failed: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -122,7 +138,7 @@ int nsh_archinitialize(void)
|
|||||||
ret = sam_hsmci_initialize(HSMCI0_SLOTNO, HSMCI0_MINOR);
|
ret = sam_hsmci_initialize(HSMCI0_SLOTNO, HSMCI0_MINOR);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
dbg("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n",
|
message("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n",
|
||||||
HSMCI0_SLOTNO, HSMCI0_MINOR, ret);
|
HSMCI0_SLOTNO, HSMCI0_MINOR, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -132,14 +148,14 @@ int nsh_archinitialize(void)
|
|||||||
ret = sam_hsmci_initialize(HSMCI1_SLOTNO, HSMCI1_MINOR);
|
ret = sam_hsmci_initialize(HSMCI1_SLOTNO, HSMCI1_MINOR);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
dbg("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n",
|
message("ERROR: sam_hsmci_initialize(%d,%d) failed: %d\n",
|
||||||
HSMCI1_SLOTNO, HSMCI1_MINOR, ret);
|
HSMCI1_SLOTNO, HSMCI1_MINOR, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#ifdef HAVE_USBHOST
|
||||||
/* Initialize USB host operation. sam_usbhost_initialize() starts a thread
|
/* Initialize USB host operation. sam_usbhost_initialize() starts a thread
|
||||||
* will monitor for USB connection and disconnection events.
|
* will monitor for USB connection and disconnection events.
|
||||||
*/
|
*/
|
||||||
@ -147,7 +163,7 @@ int nsh_archinitialize(void)
|
|||||||
ret = sam_usbhost_initialize();
|
ret = sam_usbhost_initialize();
|
||||||
if (ret != OK)
|
if (ret != OK)
|
||||||
{
|
{
|
||||||
dbg("ERROR: Failed to initialize USB host: %d\n", ret);
|
message("ERROR: Failed to initialize USB host: %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* configs/sama5d3x-ek/src/up_usbdev.c
|
* configs/sama5d3x-ek/src/up_usb.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2013 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
@ -52,7 +52,8 @@
|
|||||||
#include <nuttx/usb/usbdev_trace.h>
|
#include <nuttx/usb/usbdev_trace.h>
|
||||||
|
|
||||||
#include "up_arch.h"
|
#include "up_arch.h"
|
||||||
#include "sam_ohci.h"
|
#include "sam_pio.h"
|
||||||
|
#include "sam_usbhost.h"
|
||||||
#include "sama5d3x-ek.h"
|
#include "sama5d3x-ek.h"
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_UHPHS) || defined(CONFIG_SAMA5_UDPHS)
|
#if defined(CONFIG_SAMA5_UHPHS) || defined(CONFIG_SAMA5_UDPHS)
|
||||||
@ -72,9 +73,13 @@
|
|||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Private Data
|
* Private Data
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
/* Retained device driver handles */
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#ifdef CONFIG_SAMA5_OHCI
|
||||||
static struct usbhost_driver_s *g_drvr;
|
static struct usbhost_driver_s *g_ohci;
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SAMA5_EHCI
|
||||||
|
static struct usbhost_driver_s *g_ehci;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
@ -85,12 +90,12 @@ static struct usbhost_driver_s *g_drvr;
|
|||||||
* Name: usbhost_waiter
|
* Name: usbhost_waiter
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Wait for USB devices to be connected.
|
* Wait for USB devices to be connected to either the OHCI or EHCI hub.
|
||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_USBHOST
|
#if HAVE_USBHOST
|
||||||
static int usbhost_waiter(int argc, char *argv[])
|
static int usbhost_waiter(struct usbhost_driver_s *dev)
|
||||||
{
|
{
|
||||||
bool connected = false;
|
bool connected = false;
|
||||||
|
|
||||||
@ -99,7 +104,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
/* Wait for the device to change state */
|
/* Wait for the device to change state */
|
||||||
|
|
||||||
DEBUGVERIFY(DRVR_WAIT(g_drvr, connected) == OK);
|
DEBUGVERIFY(DRVR_WAIT(dev, connected) == OK);
|
||||||
|
|
||||||
connected = !connected;
|
connected = !connected;
|
||||||
uvdbg("%s\n", connected ? "connected" : "disconnected");
|
uvdbg("%s\n", connected ? "connected" : "disconnected");
|
||||||
@ -110,7 +115,7 @@ static int usbhost_waiter(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
/* Yes.. enumerate the newly connected device */
|
/* Yes.. enumerate the newly connected device */
|
||||||
|
|
||||||
(void)DRVR_ENUMERATE(g_drvr);
|
(void)DRVR_ENUMERATE(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,6 +125,36 @@ static int usbhost_waiter(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: ohci_waiter
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Wait for USB devices to be connected to the OHCI hub.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_OHCI
|
||||||
|
static int ohci_waiter(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return usbhost_waiter(g_ohci);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************************
|
||||||
|
* Name: ehci_waiter
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Wait for USB devices to be connected to the EHCI hub.
|
||||||
|
*
|
||||||
|
************************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_EHCI
|
||||||
|
static int ehci_waiter(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return usbhost_waiter(g_ehci);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/************************************************************************************
|
/************************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
@ -129,15 +164,93 @@ static int usbhost_waiter(int argc, char *argv[])
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Called from sam_usbinitialize very early in inialization to setup USB-related
|
* Called from sam_usbinitialize very early in inialization to setup USB-related
|
||||||
* GPIO pins for the STM32F4Discovery board.
|
* GPIO pins for the SAMA5D3x-EK board.
|
||||||
|
*
|
||||||
|
* USB Ports
|
||||||
|
* The SAMA5D3 series-MB features three USB communication ports:
|
||||||
|
*
|
||||||
|
* 1. Port A Host High Speed (EHCI) and Full Speed (OHCI) multiplexed with
|
||||||
|
* USB Device High Speed Micro AB connector, J20
|
||||||
|
*
|
||||||
|
* 2. Port B Host High Speed (EHCI) and Full Speed (OHCI) standard type A
|
||||||
|
* connector, J19 upper port
|
||||||
|
*
|
||||||
|
* 3. Port C Host Full Speed (OHCI) only standard type A connector, J19
|
||||||
|
* lower port
|
||||||
|
*
|
||||||
|
* All three USB host ports are equipped with 500 mA high-side power switch
|
||||||
|
* for self-powered and buspowered applications. The USB device port feature
|
||||||
|
* VBUS inserts detection function.
|
||||||
|
*
|
||||||
|
* Port A
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD29 VBUS_SENSE VBus detection
|
||||||
|
* PD25 EN5V_USBA VBus power enable (via MN15 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch. The other channel of the switch is for
|
||||||
|
* the LCD)
|
||||||
|
*
|
||||||
|
* Port B
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD26 EN5V_USBB VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch). To the A1 pin of J19 Dual USB A
|
||||||
|
* connector
|
||||||
|
*
|
||||||
|
* Port C
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD27 EN5V_USBC VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch). To the B1 pin of J19 Dual USB A
|
||||||
|
* connector
|
||||||
|
*
|
||||||
|
* Both Ports B and C
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD28 OVCUR_USB Combined overrcurrent indication from port A and B
|
||||||
|
*
|
||||||
|
* That offers a lot of flexibility. However, here we enable the ports only
|
||||||
|
* as follows:
|
||||||
|
*
|
||||||
|
* Port A -- USB device
|
||||||
|
* Port B -- EHCI host
|
||||||
|
* Port C -- OHCI host
|
||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
void weak_function sam_usbinitialize(void)
|
void weak_function sam_usbinitialize(void)
|
||||||
{
|
{
|
||||||
/* Configure pull-ups */
|
#if 0
|
||||||
|
/* Configure Port A to support the USB device function */
|
||||||
|
|
||||||
/* Configure the OTG FS VBUS sensing GPIO, Power On, and Overcurrent PIOs */
|
sam_configpio(PIO_USBA_VBUS_SENSE); /* VBUS sense */
|
||||||
|
|
||||||
|
/* TODO: Configure an interrupt on VBUS sense */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_OHCI
|
||||||
|
/* Configure Port C to support the USB OHCI function */
|
||||||
|
|
||||||
|
sam_configpio(PIO_USBC_VBUS_ENABLE); /* VBUS enable, initially OFF */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_EHCI
|
||||||
|
/* Configure Port B to support the USB OHCI function */
|
||||||
|
|
||||||
|
sam_configpio(PIO_USBB_VBUS_ENABLE); /* VBUS enable, initially OFF */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
||||||
|
/* Configure Port B/C VBUS overrcurrent detection */
|
||||||
|
|
||||||
|
sam_configpio(PIO_USBBC_VBUS_OVERCURRENT); /* VBUS overcurrent */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************************
|
/***********************************************************************************
|
||||||
@ -150,7 +263,7 @@ void weak_function sam_usbinitialize(void)
|
|||||||
*
|
*
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#if HAVE_USBHOST
|
||||||
int sam_usbhost_initialize(void)
|
int sam_usbhost_initialize(void)
|
||||||
{
|
{
|
||||||
int pid;
|
int pid;
|
||||||
@ -160,30 +273,55 @@ int sam_usbhost_initialize(void)
|
|||||||
* that we care about:
|
* that we care about:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uvdbg("Register class drivers\n");
|
|
||||||
ret = usbhost_storageinit();
|
ret = usbhost_storageinit();
|
||||||
if (ret != OK)
|
if (ret != OK)
|
||||||
{
|
{
|
||||||
udbg("Failed to register the mass storage class\n");
|
udbg("ERROR: Failed to register the mass storage class: %d\n", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then get an instance of the USB host interface */
|
#ifdef CONFIG_SAMA5_OHCI
|
||||||
|
/* Get an instance of the USB OHCI interface */
|
||||||
|
|
||||||
uvdbg("Initialize USB host\n");
|
g_ohci = sam_ohci_initialize(0);
|
||||||
g_drvr = sam_ohci_initialize(0);
|
if (!g_ohci)
|
||||||
if (g_drvr)
|
|
||||||
{
|
{
|
||||||
|
udbg("ERROR: sam_ohci_initialize failed\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
/* Start a thread to handle device connection. */
|
/* Start a thread to handle device connection. */
|
||||||
|
|
||||||
uvdbg("Start usbhost_waiter\n");
|
pid = TASK_CREATE("usbhost", CONFIG_USBHOST_DEFPRIO, CONFIG_USBHOST_STACKSIZE,
|
||||||
|
(main_t)ohci_waiter, (FAR char * const *)NULL);
|
||||||
|
if (pid < 0)
|
||||||
|
{
|
||||||
|
udbg("ERROR: Failed to create ohci_waiter task: %d\n", ret);
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
pid = TASK_CREATE("usbhost", CONFIG_USBHOST_DEFPRIO,
|
#ifdef CONFIG_SAMA5_EHCI
|
||||||
CONFIG_USBHOST_STACKSIZE,
|
/* Get an instance of the USB EHCI interface */
|
||||||
(main_t)usbhost_waiter, (FAR char * const *)NULL);
|
|
||||||
return pid < 0 ? -ENOEXEC : OK;
|
g_ehci = sam_ehci_initialize(0);
|
||||||
|
if (!g_ehci)
|
||||||
|
{
|
||||||
|
udbg("ERROR: sam_ehci_initialize failed\n");
|
||||||
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Start a thread to handle device connection. */
|
||||||
|
|
||||||
|
pid = TASK_CREATE("usbhost", CONFIG_USBHOST_DEFPRIO, CONFIG_USBHOST_STACKSIZE,
|
||||||
|
(main_t)ehci_waiter, (FAR char * const *)NULL);
|
||||||
|
if (pid < 0)
|
||||||
|
{
|
||||||
|
udbg("ERROR: Failed to create ehci_waiter task: %d\n", ret);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -191,21 +329,13 @@ int sam_usbhost_initialize(void)
|
|||||||
* Name: sam_usbhost_vbusdrive
|
* Name: sam_usbhost_vbusdrive
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Enable/disable driving of VBUS 5V output. This function must be provided be
|
* Enable/disable driving of VBUS 5V output. This function must be provided by
|
||||||
* each platform that implements the STM32 OTG FS host interface
|
* each platform that implements the OHCI or EHCI host interface
|
||||||
*
|
|
||||||
* "On-chip 5 V VBUS generation is not supported. For this reason, a charge pump
|
|
||||||
* or, if 5 V are available on the application board, a basic power switch, must
|
|
||||||
* be added externally to drive the 5 V VBUS line. The external charge pump can
|
|
||||||
* be driven by any GPIO output. When the application decides to power on VBUS
|
|
||||||
* using the chosen GPIO, it must also set the port power bit in the host port
|
|
||||||
* control and status register (PPWR bit in OTG_FS_HPRT).
|
|
||||||
*
|
|
||||||
* "The application uses this field to control power to this port, and the core
|
|
||||||
* clears this bit on an overcurrent condition."
|
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* iface - For future growth to handle multiple USB host interface. Should be zero.
|
* iface - Selects USB host interface:
|
||||||
|
* 0 = EHCI (Port B)
|
||||||
|
* 1 = OHCI (Port C)
|
||||||
* enable - true: enable VBUS power; false: disable VBUS power
|
* enable - true: enable VBUS power; false: disable VBUS power
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
@ -213,18 +343,49 @@ int sam_usbhost_initialize(void)
|
|||||||
*
|
*
|
||||||
***********************************************************************************/
|
***********************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#if HAVE_USBHOST
|
||||||
void sam_usbhost_vbusdrive(int iface, bool enable)
|
void sam_usbhost_vbusdrive(int iface, bool enable)
|
||||||
{
|
{
|
||||||
DEBUGASSERT(iface == 0);
|
pio_pinset_t pinset;
|
||||||
|
|
||||||
|
/* Pick the PIO associated with the OHCI or EHCI interface */
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_OHCI
|
||||||
|
if (iface == SAM_OHCI_IFACE)
|
||||||
|
{
|
||||||
|
uvdbg("OHCI: iface %d enable %d\n", iface, enable);
|
||||||
|
pinset = PIO_USBC_VBUS_ENABLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SAMA5_EHCI
|
||||||
|
if (iface == SAM_EHCI_IFACE)
|
||||||
|
{
|
||||||
|
uvdbg("EHCI: iface %d enable %d\n", iface, enable);
|
||||||
|
pinset = PIO_USBB_VBUS_ENABLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
udbg("ERROR: Unsupported iface %d\n", iface);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Then enable or disable VBUS power */
|
||||||
|
|
||||||
if (enable)
|
if (enable)
|
||||||
{
|
{
|
||||||
/* Enable the Power Switch by driving the enable pin low */
|
/* Enable the Power Switch by driving the enable pin low */
|
||||||
|
|
||||||
|
sam_piowrite(pinset, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Disable the Power Switch by driving the enable pin high */
|
/* Disable the Power Switch by driving the enable pin high */
|
||||||
|
|
||||||
|
sam_piowrite(pinset, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -244,9 +405,14 @@ void sam_usbhost_vbusdrive(int iface, bool enable)
|
|||||||
*
|
*
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#if HAVE_USBHOST
|
||||||
xcpt_t sam_setup_overcurrent(xcpt_t handler)
|
xcpt_t sam_setup_overcurrent(xcpt_t handler)
|
||||||
{
|
{
|
||||||
|
/* Since this is a common signal, we will need to come up with some way to inform
|
||||||
|
* both EHCI and OHCI drivers when this error occurs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
# warning Missing logic
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -57,6 +57,7 @@
|
|||||||
|
|
||||||
#define HAVE_HSMCI_MTD 1
|
#define HAVE_HSMCI_MTD 1
|
||||||
#define HAVE_AT25_MTD 1
|
#define HAVE_AT25_MTD 1
|
||||||
|
#define HAVE_USBHOST 1
|
||||||
|
|
||||||
/* HSMCI */
|
/* HSMCI */
|
||||||
/* Can't support MMC/SD if the card interface(s) are not enable */
|
/* Can't support MMC/SD if the card interface(s) are not enable */
|
||||||
@ -141,6 +142,10 @@
|
|||||||
# undef CONFIG_SAMA5_EHCI
|
# undef CONFIG_SAMA5_EHCI
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_SAMA5_OHCI) && !defined(CONFIG_SAMA5_EHCI)
|
||||||
|
# undef HAVE_USBHOST
|
||||||
|
#endif
|
||||||
|
|
||||||
/* LEDs *****************************************************************************/
|
/* LEDs *****************************************************************************/
|
||||||
/* There are two LEDs on the SAMA5D3 series-CM board that can be controlled
|
/* There are two LEDs on the SAMA5D3 series-CM board that can be controlled
|
||||||
* by software. A blue LED is controlled via PIO pins. A red LED normally
|
* by software. A blue LED is controlled via PIO pins. A red LED normally
|
||||||
@ -225,6 +230,81 @@
|
|||||||
PIO_INT_BOTHEDGES | PIO_PORT_PIOD | PIO_PIN18)
|
PIO_INT_BOTHEDGES | PIO_PORT_PIOD | PIO_PIN18)
|
||||||
#define IRQ_MCI1_CD SAM_IRQ_PD18
|
#define IRQ_MCI1_CD SAM_IRQ_PD18
|
||||||
|
|
||||||
|
/* USB Ports ************************************************************************/
|
||||||
|
/* The SAMA5D3 series-MB features three USB communication ports:
|
||||||
|
*
|
||||||
|
* 1. Port A Host High Speed (EHCI) and Full Speed (OHCI) multiplexed with
|
||||||
|
* USB Device High Speed Micro AB connector, J20
|
||||||
|
*
|
||||||
|
* 2. Port B Host High Speed (EHCI) and Full Speed (OHCI) standard type A
|
||||||
|
* connector, J19 upper port
|
||||||
|
*
|
||||||
|
* 3. Port C Host Full Speed (OHCI) only standard type A connector, J19
|
||||||
|
* lower port
|
||||||
|
*
|
||||||
|
* All three USB host ports are equipped with 500 mA high-side power switch
|
||||||
|
* for self-powered and buspowered applications. The USB device port feature
|
||||||
|
* VBUS inserts detection function.
|
||||||
|
*
|
||||||
|
* Port A
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD29 VBUS_SENSE VBus detection
|
||||||
|
* PD25 EN5V_USBA VBus power enable (via MN15 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch. The other channel of the switch is for
|
||||||
|
* the LCD)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIO_USBA_VBUS_SENSE \
|
||||||
|
(PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \
|
||||||
|
PIO_INT_BOTHEDGES | PIO_PORT_PIOD | PIO_PIN29)
|
||||||
|
#define IRQ_USBA_VBUS_SENSE \
|
||||||
|
SAM_IRQ_PD29
|
||||||
|
|
||||||
|
#define PIO_USBA_VBUS_ENABLE \
|
||||||
|
(PIO_OUTPUT | PIO_CFG_DEFAULT | PIO_OUTPUT_CLEAR | \
|
||||||
|
PIO_PORT_PIOD | PIO_PIN25)
|
||||||
|
|
||||||
|
/* Port B
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD26 EN5V_USBB VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch). To the A1 pin of J19 Dual USB A
|
||||||
|
* connector
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIO_USBB_VBUS_ENABLE \
|
||||||
|
(PIO_OUTPUT | PIO_CFG_DEFAULT | PIO_OUTPUT_CLEAR | \
|
||||||
|
PIO_PORT_PIOD | PIO_PIN26)
|
||||||
|
|
||||||
|
/* Port C
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD27 EN5V_USBC VBus power enable (via MN14 AIC1526 Dual USB High-Side
|
||||||
|
* Power Switch). To the B1 pin of J19 Dual USB A
|
||||||
|
* connector
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIO_USBC_VBUS_ENABLE \
|
||||||
|
(PIO_OUTPUT | PIO_CFG_DEFAULT | PIO_OUTPUT_CLEAR | \
|
||||||
|
PIO_PORT_PIOD | PIO_PIN27)
|
||||||
|
|
||||||
|
/* Both Ports B and C
|
||||||
|
*
|
||||||
|
* PIO Signal Name Function
|
||||||
|
* ---- ----------- -------------------------------------------------------
|
||||||
|
* PD28 OVCUR_USB Combined overrcurrent indication from port A and B
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define PIO_USBBC_VBUS_OVERCURRENT \
|
||||||
|
(PIO_INPUT | PIO_CFG_PULLUP | PIO_CFG_DEGLITCH | \
|
||||||
|
PIO_INT_BOTHEDGES | PIO_PORT_PIOD | PIO_PIN28)
|
||||||
|
#define IRQ_USBBC_VBUS_OVERCURRENT \
|
||||||
|
SAM_IRQ_PD28
|
||||||
|
|
||||||
/* SPI Chip Selects *****************************************************************/
|
/* SPI Chip Selects *****************************************************************/
|
||||||
/* Both the Ronetix and Embest versions of the SAMAD3x CPU modules include an
|
/* Both the Ronetix and Embest versions of the SAMAD3x CPU modules include an
|
||||||
* Atmel AT25DF321A, 32-megabit, 2.7-volt SPI serial flash. The SPI
|
* Atmel AT25DF321A, 32-megabit, 2.7-volt SPI serial flash. The SPI
|
||||||
@ -379,7 +459,7 @@ void weak_function sam_usbinitialize(void);
|
|||||||
*
|
*
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
|
|
||||||
#if defined(CONFIG_SAMA5_OHCI) || defined(CONFIG_SAMA5_EHCI)
|
#ifdef HAVE_USBHOST
|
||||||
int sam_usbhost_initialize(void);
|
int sam_usbhost_initialize(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user