671 lines
24 KiB
C
671 lines
24 KiB
C
/*
|
|
* Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc.
|
|
* Copyright 2016 - 2017,2019 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
/*${standard_header_anchor}*/
|
|
#include "usb_device_config.h"
|
|
#include "usb.h"
|
|
#include "usb_device.h"
|
|
|
|
#include "usb_device_hid.h"
|
|
|
|
#include "usb_device_ch9.h"
|
|
#include "usb_device_descriptor.h"
|
|
|
|
#include "mouse.h"
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
|
|
#include "usb_hsdcd.h"
|
|
#elif (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
#include "usb_phydcd.h"
|
|
#endif
|
|
#include "fsl_device_registers.h"
|
|
#include "fsl_debug_console.h"
|
|
#include "pin_mux.h"
|
|
#include "clock_config.h"
|
|
#include "board.h"
|
|
|
|
#if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U))
|
|
#include "fsl_sysmpu.h"
|
|
#endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */
|
|
|
|
#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))
|
|
#include "usb_phy.h"
|
|
#endif
|
|
|
|
#include "fsl_adapter_timer.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
void BOARD_InitHardware(void);
|
|
void USB_DeviceClockInit(void);
|
|
void USB_DeviceIsrEnable(void);
|
|
#if USB_DEVICE_CONFIG_USE_TASK
|
|
void USB_DeviceTaskFn(void *deviceHandle);
|
|
#endif
|
|
|
|
static usb_status_t USB_DeviceHidMouseAction(void);
|
|
static usb_status_t USB_DeviceHidInterruptIn(usb_device_handle deviceHandle,
|
|
usb_device_endpoint_callback_message_struct_t *event,
|
|
void *arg);
|
|
static void USB_DeviceApplicationInit(void);
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
|
|
|
|
#elif (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
extern void HW_TimerControl(uint8_t enable);
|
|
#endif
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
#define TIMER_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_OscClk)
|
|
uint32_t g_halTimerHandle[(HAL_TIMER_HANDLE_SIZE + 3) / 4];
|
|
|
|
USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_SetupOutBuffer[8];
|
|
USB_DMA_NONINIT_DATA_ALIGN(USB_DATA_ALIGN_SIZE) static uint8_t s_MouseBuffer[USB_HID_MOUSE_REPORT_LENGTH];
|
|
usb_hid_mouse_struct_t g_UsbDeviceHidMouse;
|
|
|
|
extern uint8_t g_UsbDeviceCurrentConfigure;
|
|
extern uint8_t g_UsbDeviceInterface[USB_HID_MOUSE_INTERFACE_COUNT];
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
void HW_TimerCallback(void *param)
|
|
{
|
|
g_UsbDeviceHidMouse.hwTick++;
|
|
USB_DeviceUpdateHwTick(g_UsbDeviceHidMouse.deviceHandle, g_UsbDeviceHidMouse.hwTick);
|
|
}
|
|
|
|
void HW_TimerInit(void)
|
|
{
|
|
hal_timer_config_t halTimerConfig;
|
|
halTimerConfig.timeout = 1000;
|
|
halTimerConfig.srcClock_Hz = TIMER_SOURCE_CLOCK;
|
|
halTimerConfig.instance = 0U;
|
|
hal_timer_handle_t halTimerHandle = &g_halTimerHandle[0];
|
|
HAL_TimerInit(halTimerHandle, &halTimerConfig);
|
|
HAL_TimerInstallCallback(halTimerHandle, HW_TimerCallback, NULL);
|
|
}
|
|
void HW_TimerControl(uint8_t enable)
|
|
{
|
|
if (enable)
|
|
{
|
|
HAL_TimerEnable(g_halTimerHandle);
|
|
}
|
|
else
|
|
{
|
|
HAL_TimerDisable(g_halTimerHandle);
|
|
}
|
|
}
|
|
#endif
|
|
void USB_OTG1_IRQHandler(void)
|
|
{
|
|
USB_DeviceEhciIsrFunction(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
|
|
void USB_OTG2_IRQHandler(void)
|
|
{
|
|
USB_DeviceEhciIsrFunction(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
|
|
void USB_DeviceClockInit(void)
|
|
{
|
|
usb_phy_config_struct_t phyConfig = {
|
|
BOARD_USB_PHY_D_CAL,
|
|
BOARD_USB_PHY_TXCAL45DP,
|
|
BOARD_USB_PHY_TXCAL45DM,
|
|
};
|
|
|
|
if (CONTROLLER_ID == kUSB_ControllerEhci0)
|
|
{
|
|
CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_Usbphy480M, 480000000U);
|
|
CLOCK_EnableUsbhs0Clock(kCLOCK_Usb480M, 480000000U);
|
|
}
|
|
else
|
|
{
|
|
CLOCK_EnableUsbhs1PhyPllClock(kCLOCK_Usbphy480M, 480000000U);
|
|
CLOCK_EnableUsbhs1Clock(kCLOCK_Usb480M, 480000000U);
|
|
}
|
|
USB_EhciPhyInit(CONTROLLER_ID, BOARD_XTAL0_CLK_HZ, &phyConfig);
|
|
}
|
|
void USB_DeviceIsrEnable(void)
|
|
{
|
|
uint8_t irqNumber;
|
|
|
|
uint8_t usbDeviceEhciIrq[] = USBHS_IRQS;
|
|
irqNumber = usbDeviceEhciIrq[CONTROLLER_ID - kUSB_ControllerEhci0];
|
|
|
|
/* Install isr, set priority, and enable IRQ. */
|
|
NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY);
|
|
EnableIRQ((IRQn_Type)irqNumber);
|
|
}
|
|
#if USB_DEVICE_CONFIG_USE_TASK
|
|
void USB_DeviceTaskFn(void *deviceHandle)
|
|
{
|
|
USB_DeviceEhciTaskFunction(deviceHandle);
|
|
}
|
|
#endif
|
|
|
|
/* Update mouse pointer location. Draw a rectangular rotation*/
|
|
static usb_status_t USB_DeviceHidMouseAction(void)
|
|
{
|
|
static uint8_t x = 0U;
|
|
static uint8_t y = 0U;
|
|
enum
|
|
{
|
|
RIGHT,
|
|
DOWN,
|
|
LEFT,
|
|
UP
|
|
};
|
|
static uint8_t dir = RIGHT;
|
|
|
|
switch (dir)
|
|
{
|
|
case RIGHT:
|
|
/* Move right. Increase X value. */
|
|
g_UsbDeviceHidMouse.buffer[1] = 2U;
|
|
g_UsbDeviceHidMouse.buffer[2] = 0U;
|
|
x++;
|
|
if (x > 99U)
|
|
{
|
|
dir++;
|
|
}
|
|
break;
|
|
case DOWN:
|
|
/* Move down. Increase Y value. */
|
|
g_UsbDeviceHidMouse.buffer[1] = 0U;
|
|
g_UsbDeviceHidMouse.buffer[2] = 2U;
|
|
y++;
|
|
if (y > 99U)
|
|
{
|
|
dir++;
|
|
}
|
|
break;
|
|
case LEFT:
|
|
/* Move left. Discrease X value. */
|
|
g_UsbDeviceHidMouse.buffer[1] = (uint8_t)(-2);
|
|
g_UsbDeviceHidMouse.buffer[2] = 0U;
|
|
x--;
|
|
if (x < 2U)
|
|
{
|
|
dir++;
|
|
}
|
|
break;
|
|
case UP:
|
|
/* Move up. Discrease Y value. */
|
|
g_UsbDeviceHidMouse.buffer[1] = 0U;
|
|
g_UsbDeviceHidMouse.buffer[2] = (uint8_t)(-2);
|
|
y--;
|
|
if (y < 2U)
|
|
{
|
|
dir = RIGHT;
|
|
}
|
|
break;
|
|
default:
|
|
/*no action*/
|
|
break;
|
|
}
|
|
/* Send mouse report to the host */
|
|
return USB_DeviceSendRequest(g_UsbDeviceHidMouse.deviceHandle, USB_HID_MOUSE_ENDPOINT_IN,
|
|
g_UsbDeviceHidMouse.buffer, USB_HID_MOUSE_REPORT_LENGTH);
|
|
}
|
|
|
|
/* HID mouse interrupt IN pipe callback */
|
|
static usb_status_t USB_DeviceHidInterruptIn(usb_device_handle deviceHandle,
|
|
usb_device_endpoint_callback_message_struct_t *event,
|
|
void *arg)
|
|
{
|
|
/* Resport sent */
|
|
if (0U != g_UsbDeviceHidMouse.attach)
|
|
{
|
|
/* endpoint callback length is USB_CANCELLED_TRANSFER_LENGTH (0xFFFFFFFFU) when transfer is canceled */
|
|
if ((NULL != event) && (event->length == USB_CANCELLED_TRANSFER_LENGTH))
|
|
{
|
|
return kStatus_USB_Error;
|
|
}
|
|
return USB_DeviceHidMouseAction();
|
|
}
|
|
|
|
return kStatus_USB_Error;
|
|
}
|
|
|
|
usb_status_t USB_DeviceCallback(usb_device_handle handle, uint32_t event, void *param)
|
|
{
|
|
usb_status_t error = kStatus_USB_InvalidRequest;
|
|
uint8_t *temp8 = (uint8_t *)param;
|
|
|
|
switch (event)
|
|
{
|
|
case kUSB_DeviceEventBusReset:
|
|
{
|
|
/* USB bus reset signal detected */
|
|
/* Initialize the control IN and OUT pipes */
|
|
USB_DeviceControlPipeInit(g_UsbDeviceHidMouse.deviceHandle);
|
|
g_UsbDeviceHidMouse.attach = 0U;
|
|
error = kStatus_USB_Success;
|
|
#if (defined(USB_DEVICE_CONFIG_EHCI) && (USB_DEVICE_CONFIG_EHCI > 0U)) || \
|
|
(defined(USB_DEVICE_CONFIG_LPCIP3511HS) && (USB_DEVICE_CONFIG_LPCIP3511HS > 0U))
|
|
/* Get USB speed to configure the device, including max packet size and interval of the endpoints. */
|
|
if (kStatus_USB_Success == USB_DeviceGetStatus(g_UsbDeviceHidMouse.deviceHandle, kUSB_DeviceStatusSpeed,
|
|
&g_UsbDeviceHidMouse.speed))
|
|
{
|
|
USB_DeviceSetSpeed(g_UsbDeviceHidMouse.speed);
|
|
}
|
|
#endif
|
|
}
|
|
break;
|
|
#if (defined(USB_DEVICE_CONFIG_DETACH_ENABLE) && (USB_DEVICE_CONFIG_DETACH_ENABLE > 0U))
|
|
case kUSB_DeviceEventAttach:
|
|
{
|
|
g_UsbDeviceHidMouse.connectStateChanged = 1U;
|
|
g_UsbDeviceHidMouse.connectState = 1U;
|
|
error = kStatus_USB_Success;
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionInit;
|
|
#else
|
|
|
|
#if (defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U))
|
|
#else
|
|
/*Add one delay here to make the DP pull down long enough to allow host to detect the previous
|
|
* disconnection.*/
|
|
SDK_DelayAtLeastUs(5000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
#endif
|
|
}
|
|
break;
|
|
case kUSB_DeviceEventDetach:
|
|
{
|
|
g_UsbDeviceHidMouse.connectStateChanged = 1U;
|
|
g_UsbDeviceHidMouse.connectState = 0U;
|
|
g_UsbDeviceHidMouse.attach = 0U;
|
|
error = kStatus_USB_Success;
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionInit;
|
|
#else
|
|
|
|
#if (defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U))
|
|
#else
|
|
USB_DeviceStop(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
|
|
#endif
|
|
}
|
|
break;
|
|
#endif
|
|
case kUSB_DeviceEventSetConfiguration:
|
|
if (USB_HID_MOUSE_CONFIGURE_INDEX == (*temp8))
|
|
{
|
|
/* If the confguration is valid, initliaze the HID mouse interrupt IN pipe */
|
|
usb_device_endpoint_init_struct_t epInitStruct;
|
|
usb_device_endpoint_callback_struct_t epCallback;
|
|
|
|
epCallback.callbackFn = USB_DeviceHidInterruptIn;
|
|
epCallback.callbackParam = handle;
|
|
|
|
epInitStruct.zlt = 0U;
|
|
epInitStruct.transferType = USB_ENDPOINT_INTERRUPT;
|
|
epInitStruct.endpointAddress =
|
|
USB_HID_MOUSE_ENDPOINT_IN | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT);
|
|
if (USB_SPEED_HIGH == g_UsbDeviceHidMouse.speed)
|
|
{
|
|
epInitStruct.maxPacketSize = HS_HID_MOUSE_INTERRUPT_IN_PACKET_SIZE;
|
|
epInitStruct.interval = HS_HID_MOUSE_INTERRUPT_IN_INTERVAL;
|
|
}
|
|
else
|
|
{
|
|
epInitStruct.maxPacketSize = FS_HID_MOUSE_INTERRUPT_IN_PACKET_SIZE;
|
|
epInitStruct.interval = FS_HID_MOUSE_INTERRUPT_IN_INTERVAL;
|
|
}
|
|
|
|
USB_DeviceInitEndpoint(g_UsbDeviceHidMouse.deviceHandle, &epInitStruct, &epCallback);
|
|
|
|
g_UsbDeviceHidMouse.attach = 1U;
|
|
error = USB_DeviceHidMouseAction(); /* run the cursor movement code */
|
|
}
|
|
break;
|
|
|
|
case kUSB_DeviceEventSetInterface:
|
|
error = kStatus_USB_Success;
|
|
break;
|
|
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
case kUSB_DeviceEventDcdDetectionfinished:
|
|
/*temp pointer point to detection result*/
|
|
if (NULL != param)
|
|
{
|
|
error = kStatus_USB_Success;
|
|
if (kUSB_DcdSDP == *temp8)
|
|
{
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionSDP;
|
|
}
|
|
else if (kUSB_DcdCDP == *temp8)
|
|
{
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionCDP;
|
|
}
|
|
else if (kUSB_DcdDCP == *temp8)
|
|
{
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionDCP;
|
|
}
|
|
else if (kUSB_DcdTimeOut == *temp8)
|
|
{
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionTimeOut;
|
|
}
|
|
else if (kUSB_DcdError == *temp8)
|
|
{
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionError;
|
|
}
|
|
else
|
|
{
|
|
error = kStatus_USB_InvalidRequest;
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
default:
|
|
/* no action required, the default return value is kStatus_USB_InvalidRequest. */
|
|
break;
|
|
}
|
|
|
|
return error;
|
|
}
|
|
|
|
/* Get setup buffer */
|
|
usb_status_t USB_DeviceGetSetupBuffer(usb_device_handle handle, usb_setup_struct_t **setupBuffer)
|
|
{
|
|
/* Keep the setup is 4-byte aligned */
|
|
static uint32_t hid_mouse_setup[2];
|
|
if (NULL == setupBuffer)
|
|
{
|
|
return kStatus_USB_InvalidParameter;
|
|
}
|
|
*setupBuffer = (usb_setup_struct_t *)&hid_mouse_setup;
|
|
return kStatus_USB_Success;
|
|
}
|
|
|
|
/* Configure device remote wakeup */
|
|
usb_status_t USB_DeviceConfigureRemoteWakeup(usb_device_handle handle, uint8_t enable)
|
|
{
|
|
return kStatus_USB_InvalidRequest;
|
|
}
|
|
|
|
/* Configure the endpoint status (idle or stall) */
|
|
usb_status_t USB_DeviceConfigureEndpointStatus(usb_device_handle handle, uint8_t ep, uint8_t status)
|
|
{
|
|
if (status)
|
|
{
|
|
if ((USB_HID_MOUSE_ENDPOINT_IN == (ep & USB_ENDPOINT_NUMBER_MASK)) &&
|
|
(ep & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK))
|
|
{
|
|
return USB_DeviceStallEndpoint(handle, ep);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((USB_HID_MOUSE_ENDPOINT_IN == (ep & USB_ENDPOINT_NUMBER_MASK)) &&
|
|
(ep & USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_MASK))
|
|
{
|
|
return USB_DeviceUnstallEndpoint(handle, ep);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
return kStatus_USB_InvalidRequest;
|
|
}
|
|
|
|
/* Get class-specific request buffer */
|
|
usb_status_t USB_DeviceGetClassReceiveBuffer(usb_device_handle handle,
|
|
usb_setup_struct_t *setup,
|
|
uint32_t *length,
|
|
uint8_t **buffer)
|
|
{
|
|
if ((NULL == buffer) || ((*length) > sizeof(s_SetupOutBuffer)))
|
|
{
|
|
return kStatus_USB_InvalidRequest;
|
|
}
|
|
*buffer = s_SetupOutBuffer;
|
|
return kStatus_USB_Success;
|
|
}
|
|
|
|
/* Handle class-specific request */
|
|
usb_status_t USB_DeviceProcessClassRequest(usb_device_handle handle,
|
|
usb_setup_struct_t *setup,
|
|
uint32_t *length,
|
|
uint8_t **buffer)
|
|
{
|
|
usb_status_t error = kStatus_USB_InvalidRequest;
|
|
|
|
if (setup->wIndex != USB_HID_MOUSE_INTERFACE_INDEX)
|
|
{
|
|
return error;
|
|
}
|
|
|
|
switch (setup->bRequest)
|
|
{
|
|
case USB_DEVICE_HID_REQUEST_GET_REPORT:
|
|
break;
|
|
case USB_DEVICE_HID_REQUEST_GET_IDLE:
|
|
break;
|
|
case USB_DEVICE_HID_REQUEST_GET_PROTOCOL:
|
|
break;
|
|
case USB_DEVICE_HID_REQUEST_SET_REPORT:
|
|
break;
|
|
case USB_DEVICE_HID_REQUEST_SET_IDLE:
|
|
break;
|
|
case USB_DEVICE_HID_REQUEST_SET_PROTOCOL:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return error;
|
|
}
|
|
|
|
static void USB_DeviceApplicationInit(void)
|
|
{
|
|
USB_DeviceClockInit();
|
|
#if (defined(FSL_FEATURE_SOC_SYSMPU_COUNT) && (FSL_FEATURE_SOC_SYSMPU_COUNT > 0U))
|
|
SYSMPU_Enable(SYSMPU, 0);
|
|
#endif /* FSL_FEATURE_SOC_SYSMPU_COUNT */
|
|
|
|
/* Set HID mouse to default state */
|
|
g_UsbDeviceHidMouse.speed = USB_SPEED_FULL;
|
|
g_UsbDeviceHidMouse.attach = 0U;
|
|
g_UsbDeviceHidMouse.deviceHandle = NULL;
|
|
g_UsbDeviceHidMouse.buffer = s_MouseBuffer;
|
|
|
|
/* Initialize the usb stack and class drivers */
|
|
if (kStatus_USB_Success != USB_DeviceInit(CONTROLLER_ID, USB_DeviceCallback, &g_UsbDeviceHidMouse.deviceHandle))
|
|
{
|
|
usb_echo("USB device mouse failed\r\n");
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
usb_echo("USB device DCD + HID mouse demo\r\n");
|
|
#else
|
|
usb_echo("USB device HID mouse demo\r\n");
|
|
#endif
|
|
}
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
g_UsbDeviceHidMouse.dcdDectionStatus = kUSB_DeviceDCDDectionInit;
|
|
#endif
|
|
USB_DeviceIsrEnable();
|
|
|
|
#if (defined(USB_DEVICE_CONFIG_DETACH_ENABLE) && (USB_DEVICE_CONFIG_DETACH_ENABLE > 0U))
|
|
/*USB_DeviceRun could not be called here to avoid DP/DM confliction between DCD function and USB function in case
|
|
DCD is enabled. Instead, USB_DeviceRun should be called after the DCD is finished immediately*/
|
|
#if ((defined(USB_DEVICE_CONFIG_LPCIP3511FS) && (USB_DEVICE_CONFIG_LPCIP3511FS > 0U)) || \
|
|
(defined(USB_DEVICE_CONFIG_KHCI) && (USB_DEVICE_CONFIG_KHCI > 0U)))
|
|
/* Start USB device HID mouse */
|
|
/*Add one delay here to make the DP pull down long enough to allow host to detect the previous disconnection.*/
|
|
SDK_DelayAtLeastUs(5000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
#else
|
|
/* Start USB device HID mouse */
|
|
/*Add one delay here to make the DP pull down long enough to allow host to detect the previous disconnection.*/
|
|
SDK_DelayAtLeastUs(5000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
* @brief Application task function.
|
|
*
|
|
* This function runs the task for application.
|
|
*
|
|
* @return None.
|
|
*/
|
|
#if (defined(USB_DEVICE_CONFIG_DETACH_ENABLE) && (USB_DEVICE_CONFIG_DETACH_ENABLE > 0U))
|
|
void USB_DeviceAppTask(void *parameter)
|
|
{
|
|
usb_hid_mouse_struct_t *usbDeviceHid = (usb_hid_mouse_struct_t *)parameter;
|
|
|
|
if (0U != usbDeviceHid->connectStateChanged)
|
|
{
|
|
usbDeviceHid->connectStateChanged = 0;
|
|
if (0U != g_UsbDeviceHidMouse.connectState)
|
|
{
|
|
/*user need call USB_DeviceRun here to usb function run if dcd function is disabled*/
|
|
/*USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);*/
|
|
usb_echo("USB device attached.\r\n");
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
|
|
|
|
#elif (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
HW_TimerControl(1U);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U))
|
|
/*USB_DeviceStop should be called here to avoid DP/DM confliction between DCD function and USB function in
|
|
* case next time DCD dection. */
|
|
USB_DeviceStop(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))
|
|
|
|
#elif (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
HW_TimerControl(0U);
|
|
#endif
|
|
usb_echo("USB device detached.\r\n");
|
|
}
|
|
}
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(((defined(FSL_FEATURE_SOC_USBHSDCD_COUNT) && (FSL_FEATURE_SOC_USBHSDCD_COUNT > 0U))) || \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U)))
|
|
if ((kUSB_DeviceDCDDectionInit != usbDeviceHid->dcdDectionStatus) &&
|
|
(kUSB_DeviceDCDDectionFinished != usbDeviceHid->dcdDectionStatus))
|
|
{
|
|
switch (usbDeviceHid->dcdDectionStatus)
|
|
{
|
|
case kUSB_DeviceDCDDectionSDP:
|
|
{
|
|
usb_echo("SDP(standard downstream port) is detected.\r\n");
|
|
/* Start USB device HID mouse */
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
break;
|
|
case kUSB_DeviceDCDDectionDCP:
|
|
{
|
|
usb_echo("DCP (dedicated charging port) is detected.\r\n");
|
|
#if (defined(FSL_FEATURE_USBPHY_HAS_DCD_ANALOG) && (FSL_FEATURE_USBPHY_HAS_DCD_ANALOG > 0U))
|
|
/*
|
|
* This is a work-around to fix the DCP device detach event missing issue.
|
|
* The device (IP3511HS controller) VBUSDEBOUNCED bit is not updated on time before softeware read this
|
|
* bit, so when DCP is detached from usb port, softeware can't detect DCP disconnection.
|
|
*/
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
}
|
|
break;
|
|
case kUSB_DeviceDCDDectionCDP:
|
|
{
|
|
usb_echo("CDP(charging downstream port) is detected.\r\n");
|
|
/* Start USB device HID mouse */
|
|
USB_DeviceRun(g_UsbDeviceHidMouse.deviceHandle);
|
|
}
|
|
break;
|
|
case kUSB_DeviceDCDDectionTimeOut:
|
|
{
|
|
usb_echo("Timeout error.\r\n");
|
|
}
|
|
break;
|
|
case kUSB_DeviceDCDDectionError:
|
|
{
|
|
usb_echo("Detect error.\r\n");
|
|
}
|
|
break;
|
|
default:
|
|
/*no action*/
|
|
break;
|
|
}
|
|
usbDeviceHid->dcdDectionStatus = kUSB_DeviceDCDDectionFinished;
|
|
}
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION)) || defined(__GNUC__)
|
|
int main(void)
|
|
#else
|
|
void main(void)
|
|
#endif
|
|
{
|
|
BOARD_ConfigMPU();
|
|
|
|
BOARD_InitBootPins();
|
|
BOARD_InitBootClocks();
|
|
BOARD_InitDebugConsole();
|
|
#if (defined(USB_DEVICE_CONFIG_CHARGER_DETECT) && (USB_DEVICE_CONFIG_CHARGER_DETECT > 0U)) && \
|
|
(defined(FSL_FEATURE_SOC_USB_ANALOG_COUNT) && (FSL_FEATURE_SOC_USB_ANALOG_COUNT > 0U))
|
|
HW_TimerInit();
|
|
#endif
|
|
|
|
USB_DeviceApplicationInit();
|
|
|
|
while (1U)
|
|
{
|
|
#if USB_DEVICE_CONFIG_USE_TASK
|
|
USB_DeviceTaskFn(g_UsbDeviceHidMouse.deviceHandle);
|
|
#endif
|
|
#if (defined(USB_DEVICE_CONFIG_DETACH_ENABLE) && (USB_DEVICE_CONFIG_DETACH_ENABLE > 0U))
|
|
USB_DeviceAppTask(&g_UsbDeviceHidMouse);
|
|
#endif
|
|
}
|
|
}
|