summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Sliwa <dominik.sliwa@toradex.com>2016-06-28 12:52:53 +0200
committerDominik Sliwa <dominik.sliwa@toradex.com>2016-06-28 12:52:53 +0200
commitfa209ec01431327fcd0ea9684e35b15f0e755d0e (patch)
treec4053d5feaa9fdc7f319270226120cad6d3b07ab
parenta28b2bc566d93e4ce4f8bac6b1b1d6a526e4e92e (diff)
usb: Code for USB device detection
-rw-r--r--board/clock_config.c55
-rw-r--r--board/clock_config.h2
-rw-r--r--source/main.c135
-rw-r--r--usb_1.1.0/host/usb_host_khci.c2
4 files changed, 183 insertions, 11 deletions
diff --git a/board/clock_config.c b/board/clock_config.c
index 41f6eb5..12b04db 100644
--- a/board/clock_config.c
+++ b/board/clock_config.c
@@ -30,6 +30,10 @@
/* This is a template for clock configuration created by New Kinetis SDK 2.x Project Wizard. Enjoy! */
+#include "fsl_device_registers.h"
+#include "fsl_common.h"
+#include "fsl_clock.h"
+#include "clock_config.h"
/*******************************************************************************
* Definitions
@@ -43,10 +47,51 @@
* Code
******************************************************************************/
-/*!
- * @brief configure clock after reset for this demo/example
- */
-void BOARD_BootClockRUN(void) {
- /* The user configuration should be placed here */
+void BOARD_InitOsc0(void)
+{
+ const osc_config_t oscConfig = {.freq = BOARD_XTAL0_CLK_HZ,
+ .capLoad = 0,
+ .workMode = kOSC_ModeOscLowPower,
+ .oscerConfig = {
+ .enableMode = kOSC_ErClkEnable,
+#if (defined(FSL_FEATURE_OSC_HAS_EXT_REF_CLOCK_DIVIDER) && FSL_FEATURE_OSC_HAS_EXT_REF_CLOCK_DIVIDER)
+ .erclkDiv = 0U,
+#endif
+ }};
+
+ CLOCK_InitOsc0(&oscConfig);
+
+ /* Passing the XTAL0 frequency to clock driver. */
+ CLOCK_SetXtal0Freq(BOARD_XTAL0_CLK_HZ);
+ /* Use RTC_CLKIN input clock directly. */
+ //CLOCK_SetXtal32Freq(BOARD_XTAL32K_CLK_HZ);
+}
+
+void BOARD_BootClockRUN(void)
+{
+ /*
+ * Core clock: 96MHz
+ * Bus clock: 48MHz
+ */
+ mcg_pll_config_t pll0Config = {
+ .enableMode = 0U, .prdiv = 0x3U, .vdiv = 0x18U,
+ };
+ const sim_clock_config_t simConfig = {
+ .pllFllSel = 1U, /* PLLFLLSEL select PLL. */
+ .er32kSrc = 2U, /* ERCLK32K selection, use RTC. */
+ .clkdiv1 = 0x01130000U, /* SIM_CLKDIV1. */
+ };
+
+ CLOCK_SetSimSafeDivs();
+ BOARD_InitOsc0();
+
+ CLOCK_CalcPllDiv(BOARD_XTAL0_CLK_HZ, 96000000U, &pll0Config.prdiv, &pll0Config.vdiv);
+ CLOCK_BootToPeeMode(kMCG_OscselOsc, kMCG_PllClkSelPll0, &pll0Config);
+
+ CLOCK_SetInternalRefClkConfig(kMCG_IrclkEnable, kMCG_IrcSlow, 0);
+ CLOCK_SetSimConfig(&simConfig);
+
+ SystemCoreClock = 96000000U;
}
+
diff --git a/board/clock_config.h b/board/clock_config.h
index e39811f..f9c2406 100644
--- a/board/clock_config.h
+++ b/board/clock_config.h
@@ -36,7 +36,7 @@
/*******************************************************************************
* DEFINITION
******************************************************************************/
-
+#define BOARD_XTAL0_CLK_HZ 8000000U
/*******************************************************************************
* API
******************************************************************************/
diff --git a/source/main.c b/source/main.c
index ec2c101..64f5bcc 100644
--- a/source/main.c
+++ b/source/main.c
@@ -38,6 +38,12 @@
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_debug_console.h"
+#include "fsl_mpu.h"
+#include "usb_host_config.h"
+#include "usb.h"
+#include "usb_host.h"
+#include "usb_host_hci.h"
+#include "usb_host_devices.h"
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
@@ -46,20 +52,131 @@
#include "timers.h"
+#if ((defined USB_HOST_CONFIG_KHCI) && (USB_HOST_CONFIG_KHCI))
+#define CONTROLLER_ID kUSB_ControllerKhci0
+#endif
+#if ((defined USB_HOST_CONFIG_EHCI) && (USB_HOST_CONFIG_EHCI))
+#define CONTROLLER_ID kUSB_ControllerEhci0
+#endif
+
/* Task priorities. */
#define hello_task_PRIORITY (configMAX_PRIORITIES - 1)
+#define USB_HOST_INTERRUPT_PRIORITY (5U)
/*!
* @brief Task responsible for printing of "Hello world." message.
*/
static void hello_task(void *pvParameters) {
for (;;) {
- /*PRINTF("Hello world.\r\n");*/
+ PRINTF("Hello world.\r\n");
/* Add your code here */
- vTaskSuspend(NULL);
+ vTaskDelay(5000);
}
}
+usb_host_handle g_HostHandle;
+
+static usb_status_t USB_HostEvent(usb_device_handle deviceHandle,
+ usb_host_configuration_handle configurationHandle,
+ uint32_t eventCode)
+{
+ usb_status_t status = kStatus_USB_Success;
+ uint32_t infoValue;
+
+ switch (eventCode)
+ {
+ case kUSB_HostEventAttach:
+ usb_echo("device attached.\r\n");
+ // status = USB_HostMsdEvent(deviceHandle, configurationHandle, eventCode);
+ break;
+
+ case kUSB_HostEventNotSupported:
+ usb_echo("device not supported.\r\n");
+ break;
+
+ case kUSB_HostEventEnumerationDone:
+ usb_echo("device enumerated.\r\n");
+ USB_HostHelperGetPeripheralInformation(deviceHandle, kUSB_HostGetDevicePID, &infoValue);
+ usb_echo("PID = 0x%x ", infoValue);
+ USB_HostHelperGetPeripheralInformation(deviceHandle, kUSB_HostGetDeviceVID, &infoValue);
+ usb_echo("VID = 0x%x \r\n", infoValue);
+ // status = USB_HostMsdEvent(deviceHandle, configurationHandle, eventCode);
+ break;
+
+ case kUSB_HostEventDetach:
+ usb_echo("device removed.\r\n");
+ USB_HostCloseDeviceInterface(deviceHandle, NULL);
+ // status = USB_HostMsdEvent(deviceHandle, configurationHandle, eventCode);
+ break;
+
+ default:
+ break;
+ }
+ return status;
+}
+
+/*!
+ * @brief USB isr function.
+ */
+#if ((defined USB_HOST_CONFIG_KHCI) && (USB_HOST_CONFIG_KHCI))
+void USB0_IRQHandler(void)
+{
+ USB_HostKhciIsrFunction(g_HostHandle);
+}
+#endif /* USB_HOST_CONFIG_KHCI */
+#if ((defined USB_HOST_CONFIG_EHCI) && (USB_HOST_CONFIG_EHCI))
+void USBHS_IRQHandler(void)
+{
+ USB_HostEhciIsrFunction(g_HostHandle);
+}
+#endif /* USB_HOST_CONFIG_EHCI */
+
+static void USB_HostApplicationInit(void)
+{
+ usb_status_t status = kStatus_USB_Success;
+
+#if ((defined USB_HOST_CONFIG_KHCI) && (USB_HOST_CONFIG_KHCI))
+ #if (defined(FSL_FEATURE_SOC_SCG_COUNT) && (FSL_FEATURE_SOC_SCG_COUNT > 0U))
+ CLOCK_EnableUsbfs0Clock(kCLOCK_IpSrcFircAsync, CLOCK_GetFreq(kCLOCK_ScgFircAsyncDiv1Clk));
+ #else
+ CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcPll0, CLOCK_GetFreq(kCLOCK_PllFllSelClk));
+ #endif
+#endif /* USB_HOST_CONFIG_KHCI */
+#if ((defined USB_HOST_CONFIG_EHCI) && (USB_HOST_CONFIG_EHCI))
+ IRQn_Type usbHsIrqs[] = USBHS_IRQS;
+ usbIrq = usbHsIrqs[CONTROLLER_ID - kUSB_ControllerEhci0];
+ CLOCK_EnableUsbhs0Clock(kCLOCK_UsbSrcPll0, CLOCK_GetFreq(kCLOCK_PllFllSelClk));
+ USB_EhciPhyInit(CONTROLLER_ID, BOARD_XTAL0_CLK_HZ);
+#endif /* USB_HOST_CONFIG_EHCI */
+#if ((defined FSL_FEATURE_SOC_MPU_COUNT) && (FSL_FEATURE_SOC_MPU_COUNT))
+ MPU_Enable(MPU, 0);
+#endif /* FSL_FEATURE_SOC_MPU_COUNT */
+
+ status = USB_HostInit(CONTROLLER_ID, &g_HostHandle, USB_HostEvent);
+ if (status != kStatus_USB_Success)
+ {
+ usb_echo("host init error\r\n");
+ return;
+ }
+ NVIC_SetPriority(USB0_IRQn, USB_HOST_INTERRUPT_PRIORITY);
+ NVIC_EnableIRQ(USB0_IRQn);
+
+ usb_echo("host init done\r\n");
+}
+
+static void USB_HostTask(void *param)
+{
+ while (1)
+ {
+#if ((defined USB_HOST_CONFIG_KHCI) && (USB_HOST_CONFIG_KHCI))
+ USB_HostKhciTaskFunction(param);
+#endif /* USB_HOST_CONFIG_KHCI */
+#if ((defined USB_HOST_CONFIG_EHCI) && (USB_HOST_CONFIG_EHCI))
+ USB_HostEhciTaskFunction(param);
+#endif /* USB_HOST_CONFIG_EHCI */
+ }
+}
+
/*!
* @brief Application entry point.
*/
@@ -68,10 +185,20 @@ int main(void) {
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
- /* Add your code here */
PRINTF("Hello!\r\n");
+ USB_HostApplicationInit();
+
+ /* Add your code here */
+
/* Create RTOS task */
- xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE, NULL, hello_task_PRIORITY, NULL);
+ if (xTaskCreate(USB_HostTask, "usb host task", 2000L / sizeof(portSTACK_TYPE), g_HostHandle, 4, NULL) != pdPASS)
+ {
+ usb_echo("create host task error\r\n");
+ }
+ if(xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE, NULL, hello_task_PRIORITY, NULL) != pdPASS)
+ {
+ usb_echo("create hello task error\r\n");
+ }
vTaskStartScheduler();
for(;;) { /* Infinite loop to avoid leaving the main function */
diff --git a/usb_1.1.0/host/usb_host_khci.c b/usb_1.1.0/host/usb_host_khci.c
index adc6a9d..57af624 100644
--- a/usb_1.1.0/host/usb_host_khci.c
+++ b/usb_1.1.0/host/usb_host_khci.c
@@ -1433,7 +1433,7 @@ usb_status_t USB_HostKhciCreate(uint8_t controllerId,
usbHostPointer->usbRegBase->CTL = USB_CTL_HOSTMODEEN_MASK;
/* Wait for attach interrupt */
- usbHostPointer->usbRegBase->INTEN |= (USB_INTEN_ATTACHEN_MASK | USB_INTEN_SOFTOKEN_MASK);
+ usbHostPointer->usbRegBase->INTEN |= (USB_INTEN_ATTACHEN_MASK);// | USB_INTEN_SOFTOKEN_MASK);
#if defined(FSL_FEATURE_USB_KHCI_DYNAMIC_SOF_THRESHOLD_COMPARE_ENABLED) && \
(FSL_FEATURE_USB_KHCI_DYNAMIC_SOF_THRESHOLD_COMPARE_ENABLED == 1U)
usbHostPointer->usbRegBase->MISCCTRL |= USB_MISCCTRL_SOFDYNTHLD_MASK;